LED 的 GPIO 配置流程 | 学习笔记

简介: 快速学习 LED 的 GPIO 配置流程

开发者学堂课程【嵌入式之 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 它怎么样才能使能这个时钟,包括后面的定时器挂在哪个总线上。所以知道属于哪条总线之后,才能够去使能总线的时钟才能让它工作。

所有的这些寄存器,所有的计算器都有一个唯一的内存地址和它对应,

image.png

也就是操作计算器的本质其实就是操作这些内存地址。所以如果要去使用 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 口的第十三个引脚,如原理图所示:

image.png

引脚确定后确定模式,各种模式:模拟输入、悬空输出,输入推广输出,这里选择推挽输出。记住模式到底是输入还是输出就行了。这里选择什么输出。频率为 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 的程序。

相关文章
|
3月前
|
传感器 机器人 芯片
实例4:树莓派GPIO控制舵机转动
本文是关于使用树莓派GPIO控制舵机转动的实验教程,涵盖了舵机的基本概念、结构、工作原理以及PWM信号控制方法。实验目的是通过Python编程,实现树莓派控制舵机在0°~180°范围内周期性转动。文中提供了详细的实验步骤、代码示例以及舵机调零和校准的方法。
161 1
实例4:树莓派GPIO控制舵机转动
|
4月前
STM32Cubemx PWM驱动SG90舵机
STM32Cubemx PWM驱动SG90舵机
148 13
|
6月前
|
Linux 芯片
Linux驱动入门 —— 利用寄存器操作GPIO进行LED点灯-1
Linux驱动入门 —— 利用寄存器操作GPIO进行LED点灯
Linux驱动入门 —— 利用寄存器操作GPIO进行LED点灯-1
|
6月前
|
Ubuntu Linux
Linux驱动入门 —— 利用寄存器操作GPIO进行LED点灯-2
Linux驱动入门 —— 利用寄存器操作GPIO进行LED点灯
Linux驱动入门 —— 利用寄存器操作GPIO进行LED点灯-2
|
4月前
|
传感器 编解码 API
【STM32开发入门】温湿度监测系统实战:SPI LCD显示、HAL库应用、GPIO配置、UART中断接收、ADC采集与串口通信全解析
SPI(Serial Peripheral Interface)是一种同步串行通信接口,常用于微控制器与外围设备间的数据传输。SPI LCD是指使用SPI接口与微控制器通信的液晶显示屏。这类LCD通常具有较少的引脚(通常4个:MISO、MOSI、SCK和SS),因此在引脚资源有限的系统中非常有用。通过SPI协议,微控制器可以向LCD发送命令和数据,控制显示内容和模式。
151 0
|
6月前
|
Linux 芯片 Ubuntu
Linux驱动入门 —— 利用引脚号操作GPIO进行LED点灯
Linux驱动入门 —— 利用引脚号操作GPIO进行LED点灯
|
计算机视觉
树莓派开发笔记(五):GPIO引脚介绍和GPIO的输入输出使用(驱动LED灯、检测按键)
树莓派开发笔记(五):GPIO引脚介绍和GPIO的输入输出使用(驱动LED灯、检测按键)
树莓派开发笔记(五):GPIO引脚介绍和GPIO的输入输出使用(驱动LED灯、检测按键)
|
6月前
|
Linux API
常见的GPIO口框架分析
常见的GPIO口框架分析
135 0
STM32F0单片机快速入门五 GPIO中断
STM32F0单片机快速入门五 GPIO中断