实验二: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灭

3.I/O接口连接——独立按键

三.实验要求
1.实验任务
编写程序完成以下任务(汇编语言):
1.实验箱上电后,首先全部点亮8个LED:
2.按下不同按键,依次显示学号后4位(每次显示两位)
例如学号:1234
按SW0显示12,按SW1,显示34
3.合理设置每次显示时间
实际学号后四位:0336
0x03————0000 0011 0x36————0011 0110
2.流程图

四.实验过程
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调试工具和调试技术