提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
原理
GPIO相关寄存器 两个32位的配置寄存器:GPIOx_CRL、GPIOx_CRH
两个32位数据寄存器:GPIOx_IDR、GPIOx_ODR
一个32位的置位/复位寄存器:GPIOx_BSRR
一个16位复位寄存器:GPIOx_BRR
一个32位锁定寄存器:GPIOx_LCKR x为配置使用的端口 GPIO口有八种模式:
1.输入浮空 2.输入上拉 3.输入下拉 4.模拟输入 5.开漏输出 6.推挽式输出 7.推挽式复用功能 8.开漏复用功能
这里点亮LED灯使用推挽输出。
端口1-7为低,端口8-15为高。每个引脚由四个位控制。 本此使用a4,b5,c14端口输出信号对led灯进行控制
一、C语言使用hal库实现流水灯
首先,在stm32cubemx 中选择创建新项目,芯片选择自己使用的芯片。在可视界面中右键选择所需使用的引脚,选择设置为GPIO_OUT,如下图 在project manager中,设置项目名称和项目放置文件夹,tool_chain/ide和版本选择自己使用的版本,点击generate code,生成后选择打开项目。 在项目内main.c中while循环内输入以下代码:
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, 1);
HAL_Delay(100);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, 0);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5, 1);
HAL_Delay(100);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5, 0);
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_14, 1);
HAL_Delay(100);
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_14, 0);
二、汇编代码实现
代码如下:
AREA MYDATA, DATA
AREA MYCODE, CODE
ENTRY
EXPORT __main
__main
;GPIOA,B,C使能
ldr r0, =0x40021018
ldr r1, =0x0000001c
str r1, [r0]
;配置A4
ldr r0, =0x40010800
ldr r1, [r0]
bic r1, r1, #0x000f0000
orr r1, r1, #0x00010000
str r1, [r0]
;配置B5
ldr r0, =0x40010c00
ldr r1, [r0]
bic r1, r1, #0x00f00000
orr r1, r1, #0x00100000
str r1, [r0]
;配置C14
ldr r0, =0x40011004
ldr r1, [r0]
bic r1, r1, #0x0f000000
orr r1, r1, #0x01000000
str r1, [r0]
ldr r0, =0x4001080c
ldr r1, =0x00000010
str r1, [r0]
ldr r0, =5000000;延时
ldr r1, =0
;灯循环
blink
add r1, r1, #1
cmp r1, r0
blt blink
ldr r1, =0x4001080c
ldr r2, [r1]
eor r2, r2, #0x00000010
str r2, [r1]
ldr r1, =0x40010c0c
ldr r2, [r1]
eor r2, r2, #0x00000020
str r2, [r1]
ldr r1, =0
blink1
add r1, r1, #1
cmp r1, r0
blt blink1
ldr r1, =0x40010c0c
ldr r2, [r1]
eor r2, r2, #0x00000020
str r2, [r1]
ldr r1, =0x4001100c
ldr r2, [r1]
eor r2, r2, #0x00004000
str r2, [r1]
ldr r1, =0
blink2
add r1, r1, #1
cmp r1, r0
blt blink2
ldr r1, =0x4001100c
ldr r2, [r1]
eor r2, r2, #0x00004000
str r2, [r1]
ldr r1, =0x4001080c
ldr r2, [r1]
eor r2, r2, #0x00000010
str r2, [r1]
ldr r1, =0
b blink
END
三.效果
效果如下
总结
通过本次实验了解到了关于GPIO寄存器的相关操作以及部分hal库的使用方法,相信本次实验会对接下来的实验奠定的基础。。
|