西安电子科技大学微原实验2 GPIO输入输出实验

本文详细介绍了STM32的GPIO模块应用,包括LED灯控制和独立按键处理,通过汇编语言编程实现LED的全亮、按键触发显示学号后四位的功能,同时涉及JTAG调试技术的学习与实践。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

实验二:GPIO输入输出实验
一.实验目的

​ 1.掌握stm32的I/O模块使用

​ 2.理解LED硬件原理,掌握其编程方法

​ 3.熟悉JTAG调试工具和调试技术

二.实验原理
1.通用IO口

​ 常用GPIO寄存器:

​ GPIOx_CRL (偏移量0x00)

​ GPIOx_CRH (偏移量0x04)

​ GPIOx_IDR (偏移量0x08)

​ GPIOx_ODR (偏移量0x0C)

2.I/O接口连接——LED灯

​ 端口输出1时,LED亮

​ 端口输出0时,LED灭

image-20231204192335466
3.I/O接口连接——独立按键
image-20231204192445484
三.实验要求
1.实验任务

​ 编写程序完成以下任务(汇编语言):

​ 1.实验箱上电后,首先全部点亮8个LED:

​ 2.按下不同按键,依次显示学号后4位(每次显示两位)

  例如学号:1234
  按SW0显示12,按SW1,显示34

​ 3.合理设置每次显示时间

				实际学号后四位:0336
		0x03————0000 0011    0x36————0011 0110
2.流程图
image-20231204203806797
四.实验过程
1.实验源程序及其注释
	AREA RESET,CODE
	EXPORT __Vectors
	EXPORT Reset_Handler
__Vectors
	DCD __initial_sp
	DCD Reset_Handler
	
BIT5		EQU 0X0000019C
IOPCEN	EQU BIT5

GPIOC		EQU	0x40011000
GPIOC_CRL	EQU	GPIOC
GPIOC_CRH	EQU	GPIOC + 0x04
GPIOC_IDR	EQU	GPIOC + 0x08
GPIOC_ODR	EQU	GPIOC + 0x0C

GPIOA		EQU	0x40010800
GPIOA_CRL	EQU	GPIOA
GPIOA_CRH	EQU	GPIOA + 0x04
GPIOA_IDR	EQU	GPIOA + 0x08
GPIOA_ODR	EQU	GPIOA + 0x0C

GPIOB		EQU	0x40010C00
GPIOB_CRL	EQU	GPIOB
GPIOB_CRH	EQU	GPIOB + 0x04
GPIOB_IDR	EQU	GPIOB + 0x08
GPIOB_ODR	EQU	GPIOB + 0x0C

GPIOF		EQU	0x40011C00
GPIOF_CRL	EQU	GPIOF
GPIOF_CRH	EQU	GPIOF + 0x04
GPIOF_IDR	EQU	GPIOF + 0x08
GPIOF_ODR	EQU	GPIOF + 0x0C

GPIOG		EQU	0x40012000
GPIOG_CRL	EQU	GPIOG
GPIOG_CRH	EQU	GPIOG + 0x04
GPIOG_IDR	EQU	GPIOG + 0x08
GPIOG_ODR	EQU	GPIOG + 0x0C

RCC_APB2ENR	EQU 0x40021018	


Reset_Handler PROC	
	; 使能 GPIOC/B/G/A/F 时钟
	LDR 	R1, =RCC_APB2ENR
	LDR 	R0, [R1]
	LDR 	R2, =IOPCEN
	ORR 	R0, R2
	STR 	R0, [R1]
	
;初始化管脚	
	;初始化 GPIOC 管脚
	LDR 	R0, =0x33000000			;初始化PC6,PC7为通用推挽输出模式,最大速度50MHz
	LDR 	R1, =GPIOC_CRL
	STR 	R0, [R1]
	
	LDR 	R0, =0x33				;初始化PC8,PC9为通用推挽输出模式,最大速度50MHz
	LDR 	R1, =GPIOC_CRH
	STR 	R0, [R1]
	
	;初始化 GPIOA 管脚
	LDR 	R0, =0x3				;初始化PA8为通用推挽输出模式,最大速度50MHz
	LDR 	R1, =GPIOA_CRH
	STR 	R0, [R1]
	
	;初始化 GPIOG 管脚
	LDR 	R0, =0x33000000			;初始化PG6,PG7为通用推挽输出模式,最大速度50MHz
	LDR 	R1, =GPIOG_CRL
	STR 	R0, [R1]
	
	;初始化 GPIOB 管脚
	LDR 	R0, =0x3 				;初始化PB0为通用推挽输出模式,最大速度50MHz
	LDR 	R1, =GPIOB_CRL
	STR 	R0, [R1]
	
	;初始化 GPIOF 管脚
	LDR 	R0, =0x44				;初始化PF8,PF9为通用开漏输出模式,复位后为输入模式
	LDR 	R1, =GPIOF_CRH
	STR 	R0, [R1]
	
;给管脚赋初值	
	;给 GPIOC 管脚赋初值
	LDR 	R0, =0xFF0				;给PC6,PC7,PC8,PC9赋初值为1
	LDR 	R1, =GPIOC_ODR
	STR 	R0, [R1]
	
	;给 GPIOA 管脚赋初值
	LDR 	R0, =0x100				;给PA8赋初值为1
	LDR 	R1, =GPIOA_ODR			
	STR 	R0, [R1]
	
	;给 GPIOG 管脚赋初值
	LDR 	R0, =0xC0				;给PG6,PG7赋初值为1
	LDR 	R1, =GPIOG_ODR
	STR 	R0, [R1]
	
	;给 GPIOB 管脚赋初值
	LDR 	R0, =0x1				;给PB0赋初值为1
	LDR 	R1, =GPIOB_ODR
	STR 	R0, [R1]
;以上赋初值使板子刚上电时八个灯都是亮的

;判断按键状态
key_in	
	LDR 	R1, =GPIOF_IDR
	
	LDR 	R3, [R1]	
	AND		R3, 0x100
	CMP		R3, 0x0
	BEQ 	test1					;如果检测到按键SW0(F8)按下,就跳转到test1
	
	LDR 	R3, [R1]	
	AND		R3, 0x200
	CMP		R3, 0x0
	BEQ 	test2					;如果检测到按键SW1(F9)按下,就跳转到test2
	
	B		key_in					;返回key_in
	
test1
	BL 		led_off
	LDR 	R1, =GPIOG_IDR
	LDR 	R0, =0x40				;点亮PG6对应的灯
	STR 	R0, [R1]
	LDR 	R1, =GPIOB_IDR
	LDR 	R0, =0x1				;点亮PB0对应的灯
	STR 	R0, [R1]
	B		key_in					;返回key_in
	
test2
	BL 		led_off
	LDR 	R1, =GPIOC_IDR
	LDR 	R0, =0x180				;点亮PC7,PC8对应的灯
	STR 	R0, [R1]
	LDR 	R1, =GPIOG_IDR
	LDR 	R0, =0xC0				;点亮PG6,PG7对应的灯
	STR 	R0, [R1]
	B		key_in					;返回key_in

;关闭所有的八盏灯
led_off
	LDR 	R0, =0x0
	LDR 	R1, =GPIOC_ODR
	STR 	R0, [R1]
	LDR 	R1, =GPIOA_ODR
	STR 	R0, [R1]
	LDR 	R1, =GPIOB_ODR
	STR 	R0, [R1]
	LDR 	R1, =GPIOG_ODR
	STR 	R0, [R1]	
	MOV 	PC, LR	
	
delay
	LDR		R2, =0x2FFFF
	MOV		R3, #0x0	
	
loop
	SUB 	R2, R2, #1
	CMP		R2, R3
	BNE		loop
	MOV 	PC, LR	
	
	ENDP	
	
		
	AREA STACK,DATA
	SPACE 0x100
__initial_sp

	END
	
五.心得体会

​ 掌握了stm32的I/O模块使用,理解了LED硬件原理,掌握了其编程方法,熟悉了JTAG调试工具和调试技术

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值