系列文章目录-认识ARM开发
/ARM开发初学目录:/
第2章:#STM32 2.寄存器位操作方法及GPIO点亮一颗LED
第1章:#STM32 1.从C51驱动一颗LED到认识ARM_GPIO(最浅显入门)
Lip: &= ~ 清0 ; |= 赋值
文章目录
一.场景
上手一个ARM工程,结合“寄存器思想”,初步了解GPIO设定,“51”与“ARM”牵线搭桥
二.工程文件结构简介
1. 启动文件.s
芯片上电后会先执行“.s启动文件”,创建好c语言环境,随后才会进入所写代码区
官网提供的库:startup_stm32f10x_hd.s
Ctrl+F 找到复位后的执行语句:
; Reset handler
Reset_Handler PROC
EXPORT Reset_Handler [WEAK]
IMPORT __main
IMPORT SystemInit
LDR R0, =SystemInit
BLX R0
LDR R0, =__main
BX R0
ENDP
简单了解:
Sec.1. ;相当于C语言的注释//
Sec.2. PROC伪指令,相当于定义一个函数,函数名叫Reset_Handler
Sec.3. EXPOT 表明函数可供其它模块调用,声明函数
Sec.4. IMPORT 表明函数SystemInit和_main在其它文件,需要编译器链接时自己去找
Sec.5. LDR跳转 BLX加载命令
Sec.6. BX R0说明执行完_main库函数后,进入工程文件下C语言环境的main()
说明,芯片上电后会先执行启动文件,而且会执行SystemInit()函数,这个函数在我么工程文件下,也就是官方库,如果没有就会报错。所以自己创建工程时,在main()下定义一个SystemInit(),主要是创建系统时钟、总线时钟等等
void SystemInit() //未写会报错,创建于main()函数下
{
}
2. 库函数.h文件
上一章介绍的寄存器封装,已经由芯片厂家封装好了
#define GPIOB (GPIO_InitTypeDef *) GPIOB_BASE
3.main.c
存放主函数main()、以及SystemInit()函数
三.GPIO端口配置方法
3.1 RCC时钟配置
STM32所有外设都有对应的时钟(降低功耗目的),芯片上电后时钟默认是关闭的,需要人为配置打开。根据官网手册芯片系统框图,可以发现外设GPIO挂载于总线APB2,由RCC控制时钟
//打开GPIOB 控制时钟
RCC -> APB2ENR |= (1 << 3); //该寄存器已在库函数中定义
3.2 端口模式配置
CRL配置GPIOx 低8位PIN0~P7模式设定:输入/输出
CRH配置GPIOx 高8位PIN8~P15
//配置PB7输出模式,推挽输出
GPIO_InitTypeDef GPIOB;
GPIOB.CRL &= ~(0x0F << (4 * 7)); //清CNF7 MODE7
GPIOB.CRL |= (1 << (4 * 7)); //通用推挽输出模式、最大速度10MHz
3.3 端口位设置/清除寄存器
//PB7输出0
GPIO.BSRR |= (1 << 16 + 7);
//PB7输出1
GPIO.BSRR |= (1 << 7);
根据官方手册可以看出,最终作用的寄存器是ODR,ODR 1输出高,ODR 0输出低
那么简化点直接操作寄存器ODR也是可以的
//PB7输出0
GPIO.ODR &= ~(1 << 7);
//PB7输出1
GPIO.ODR |= (1 << 7);
四.代码验证
实测demo板 LED1亮,实验中未配置时钟源,默认是内部时钟
void main()
{
//1. 打开GPIOB 控制时钟
RCC -> APB2ENR |= (1 << 3); //该寄存器已在库函数中定义
//2.配置PB7输出模式,推挽输出
GPIO_InitTypeDef GPIOB;
GPIOB.CRL &= ~(0x0F << (4 * 7)); //清CNF7 MODE7
GPIOB.CRL |= (1 << (4 * 7)); //通用推挽输出模式、最大速度10MHz
//3.PB7输出1
GPIO.ODR |= (1 << 7);
while(1);
}
总结
- 根据芯片系统框图可以发现,要想控制GPIO,优先打开RCC对应的时钟,随后进行相应寄存器配置:CRL /CRH 、BSRR/ODR
- 按bit清0 : &= ~(1 << bitx);
- 连续bit清0: &= ~(3 << 2 * sec); //0x11
- bit置1 : |= (1 << bitx);
- 连续bit置1: |= (3 << 2 * sec);
- bit取反: ^= (1 << bitx); //异或操作