开发者学堂课程【嵌入式之 RFID 开发与应用2020版:LED 的 GPIO 配置流程】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/665/detail/11150
LED 的 GPIO 配置流程
对于 STM32,它有很多的 IO 口,对 IO 口的管理是把所有的 IO 口都进行了分组,每一组用字母来表示,比如 GPIOA 组、B 组 C 组依次往后…最终芯片到底是哪个组,它取决于芯片的型号,本身拥有多少个 IO 口。
然后每一组里面包含 16 个广角,比如 GPIOA, 就有 GPIOA0 到 GPIOA15 一共有 16 个引脚,每一个组里面有 16 个引脚,每一个引脚都可以进行独立的配置,配置的寄存器有模式选择的输入输出,还有在不影响其他位直接进行位操作的这种计算器,以及带锁定的 IO 操作的计算器,最终都是通过计算器来通过的函数接口来进行操作。
不管是通过什么方式去操作,每一个计算器都有自己的内存空间对应的地址,操作这些计算器本质上就是操作内存。而且每一个硬件还有各自的总线时钟,总线时钟不一样,它的频率也不一样。
理论上 STM32 分为两种时钟,一个是高速时钟,一个是外围低速时钟。高速时钟跟主 CPU 的运行频率通常是一样的,比如 AHB 就是 72 兆,AHB 它又被调节出两个总线,分别是 APB1 和 APB2。
APB1 和 APB2 默认的情况下,APB1 是 36 兆, APB2 是 72 兆。但是也可以对它进行修改,把它修改成 72 兆,甚至是把 APB2 修改成 36 兆,这个都可以设置的,并不是绝对的,只是建议这样去做一个高速时钟,一个低速时钟。而且知道了这两个总线它所对应的时钟之后,以及这两个总线在使用过程当中要去使用它,挂在总线上面的模块才能正常工作。
所以一般情况得知道总线时钟是多少,而且 APB2 它怎么样才能使能这个时钟,包括后面的定时器挂在哪个总线上。所以知道属于哪条总线之后,才能够去使能总线的时钟才能让它工作。
所有的这些寄存器,所有的计算器都有一个唯一的内存地址和它对应,
也就是操作计算器的本质其实就是操作这些内存地址。所以如果要去使用 IO 口,首先第一步使能时钟, CPU、 MCU 是一个纯数字器件,也存在大量的模拟电路,这些模拟电路归根结底也是为这个数字系统服务的,这个数字系统就是 0 和 1 的概念。
0 和 1 的产生:脉冲的高电平代表 1,低电平代表 0。0 和 1 是一个脉冲,这个脉冲就是时钟,所以要想处理逻辑事件,数字事件始终是面临的第一个问题,它必须率先被启动起来,才能够去配置那些计算器。因为涉及到一个节能功耗的问题,不把这些所有的时钟都统一使能。
所以每一个模块,每个模块都有各自的时钟,不使用的模块就把它时钟关掉,这个时候就不会产生频率,就不会去消耗更多的能源,更好的去节省了系统功耗。
建一个工程,乱码问题修改成 UTF-8,打开书写好的程序,从 main 函数开始去写程序,main 函数进来,操作 LED 通过 gpl 要用这个 LED-init:
Void led-int(void)
{
GPIO-InitTypeDef GPIO-InitStructure;
RCC-APB2PeriphclockCmd(RCC-XXX-LED, ENABLE);
GPIO-InitStructure,GPIO-Pin=GPIO-XXX-LED;
GPIO-InitStructure,GPIO-Mode=GPIO-Mode-Out-PP;
GPIO-InitStructure,GPIO-Speed=GPIO-Speed-10MHZ;
GPIO-Init(GPIO-XXX-LED-PORT,& GPIO-InitStructure);
GPIO-XXX-LED-OFF():
}
在初始化 gpl 的第一步,rcc-APB2 是它的外围时钟的命令,在这个工程里面,无论使用哪个模块不要包含 rcc,因为它里面的接口就是定义在 rcc 里面。打开这个时钟,它用的是 APB2 而不是 APB1,因为总线、IO 口都是在 APB2 里面,当然如果打一个窗口,很有可能就到 APB1 里面去了。
它需要的参数是 rcc-APB2 外围的一个具体的模块,这个模块叫 gpicc,使能 C 口,C 这一组 IO 口的时钟就这样被使能了。
第二步是配置它的 IO,先定一个 GPIO-Inittypedef 结构体,这个结构体包含了 IO口的速度和模式,主要是把配置过程给简化了。IO 口是 C 口的第十三个引脚,如原理图所示:
引脚确定后确定模式,各种模式:模拟输入、悬空输出,输入推广输出,这里选择推挽输出。记住模式到底是输入还是输出就行了。这里选择什么输出。频率为 10兆,就是 IO 口的高低电平的变化,最多有 10 兆。
接下来要把这堆结构体通过 GPIO-init 填充到 c 口相关寄存器。写进去之后,接下来还把这个灯给熄灭,开关一个灯,LED-XXX-OFF。有一个接口叫做 GPIO-setbits,就是给指定的 IO 设计成指定的值,指定 IO 是 C 口,有 13 个引脚。setbits 就是至 1,resetbits 就是至 0。1 就表示灯熄灭,亮灯则是在 while 循环里。
While(1){
LED_XXX_ON();
delay_ms(300);
LED_XXX_OFF();
delay_ms(300);
}
ON,OFF 每隔 300 毫秒,
时间也是用了一个软件在如下代码位置不断的去延时
Volatile unsigned int i = 6*1000*len;
While(i--);
是不准确的,学习完定时器后就可以做出准确的延时函数,以上为整个代码的结构,就是 LED 的 GPIO 的程序。