GPIO
什么是GPIO?如何配置GPIO?
GPIO是 通用输入输出端口(General Purpose Input/Output) 的缩写,是一种可以通过程序灵活配置为输入或输出模式的数字信号引脚。
GPIO有哪些常用寄存器?
-
端口配置寄存器(GPIOx_CRL 和 GPIOx_CRH)
对于stm32f1系列的单片机,输出的上下拉是通过设置ODR寄存器来配置的,1为上拉,0为下拉。而f4等更高级别的不一样,由GPIOx_PUPDR配置。 -
端口数据寄存器(IDR 和 ODR)
下面是ODR的说明,IDR类似。
-
端口置位/复位寄存器(BSRR)
为什么有了 ODR 寄存器,还要这个 BSRR 寄存器呢?我们先看看 BSRR 的寄存器描述,首先 BSRR 是只写权限,而 ODR 是可读可写权限。BSRR 寄存器 32 位有效,对于低 16 位(0-15),我们往相应的位写 1(BSy=1),那么对应的 IO 口会输出高电平,往相应的位写 0(BSy=0),对 IO 口没有任何影响,高 16 位(16-31)作用刚好相反,对相应的位写 1(BRy=1)会输出低电平,写 0(BRy=0)没有任何影响,y=0~15。
也就是说,对于 BSRR 寄存器,你写 0 的话,对 IO 口电平是没有任何影响的。我们要设置某个 IO 口电平,只需要相关位设置为 1 即可。而 ODR 寄存器,我们要设置某个 IO 口电平,我们首先需要读出来 ODR 寄存器的值,然后对整个 ODR 寄存器重新赋值来达到设置某个或者某些 IO 口的目的,而 BSRR 寄存器直接设置即可,这在多任务实时操作系统中作用很大。BSRR寄存器还有一个好处,就是 BSRR 寄存器改变引脚状态的时候,不会被中断打断,而 ODR 寄存器有被中断打断的风险。
GPIO有哪些工作模式?
- 输入浮空
- 输入上拉
- 输入下拉
- 模拟输入
- 开漏输出
- 推挽输出
- 开漏式复用功能
- 推挽式复用功能
具体见寄存器说明。
如何使用GPIO点亮一个LED灯?
#include "main.h"
#include "stm32f1xx_hal.h"
int main(void) {
HAL_Init(); // 初始化HAL库
SystemClock_Config(); // 配置系统时钟(由CubeMX生成)
// 初始化GPIO(由CubeMX生成的MX_GPIO_Init函数)
MX_GPIO_Init();
while (1) {
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET); // 点亮LED
HAL_Delay(500); // 延时500ms
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET); // 熄灭LED
HAL_Delay(500);
}
}
什么是GPIO的复用功能?在STM32中如何配置GPIO复用功能?
GPIO复用功能的概念
GPIO(General Purpose Input/Output)是单片机用于输入/输出信号的通用引脚。但在实际应用中,GPIO引脚不仅仅用作普通的输入/输出引脚,很多引脚具有复用功能,即可以通过配置将其用作特定的外设功能,例如串口(USART)、定时器(TIM)、I2C、SPI等。这样可以最大化地利用有限的引脚资源。
STM32中GPIO复用功能的配置方法
对于stm32f1系列的单片机,根据外设的需要将GPIO配置为复用推挽输出、复用开漏输出或者其他的输入模式,然后开启外设的时钟并初始化即可。
如何配置GPIO中断?
- 开启 GPIO 时钟(使能 GPIO 端口的时钟)。
- 配置 GPIO 为输入模式,并选择中断触发方式(上升沿、下降沿或双边沿)。
- 使能并配置外部中断(EXTI),将 GPIO 连接到中断控制器。
- 配置 NVIC(嵌套向量中断控制器),设置中断优先级并使能中断。
- 编写中断服务函数(ISR),在中断发生时执行所需的操作。
什么是GPIO的输出速度?有哪些选项?如何选择合适的速度?
GPIO(通用输入输出)输出速度指的是 GPIO 引脚的开关速率,即它们从高电平切换到低电平或从低电平切换到高电平的速率。输出速度通常影响信号的上升时间、下降时间以及驱动能力,主要用于匹配不同外设或负载的需求。
对于stm32来说,有低速、中速和高速三种模式,对不同的外设选择不同的速度。如控制LED的亮灭就可以选择低速,I2C通信可以选择中速,SDIO、ETH可以选择高速。速度越快功耗越高。
如何处理GPIO引脚复用资源冲突的问题?
- 查看手册,看看是否有其他相同外设可以使用,比如如果USART1冲突了,看看USART2能不能用。
- 重映射冲突的外设。
定时器
STM32定时器有哪些类型?它们的主要区别是什么?
除此之外,高级定时器还有重复计数器寄存器 RCR,通过设置这个寄存器为N可以在定时器发生N次溢出之后才触发中断,利用这个寄存器可以输出指定个数的PWM。
重复计数器寄存器用于设置重复计数器值,因为它具有影子寄存器,所以它本身只是起缓冲作用。当更新事件发生时,该寄存器的值会转移到其影子寄存器中,从而真正起作用。TIMx_ RCR 寄存器描述如图所示:
STM32定时器的基本作用是什么?
对于基本定时器,其主要功能是产生定时的中断或事件。
对于通用定时器和高级定时器,其主要功能除了定时中断或事件之外,还有产生PWM、测量脉冲宽度等功能。
什么是定时器的预分频器(Prescaler)?
定时器的预分频器(Prescaler, PSC) 是 STM32 定时器中的一个重要参数,它的作用是对定时器输入时钟进行分频,从而控制计数器(CNT)的计数速率。
什么是定时器的自动重装载寄存器(ARR)?它如何影响定时器的周期?
自动重装载寄存器(ARR) 是 STM32 定时器中的一个关键参数,它决定了 定时器计数的最大值,并影响定时中断、PWM 频率等功能。对于递增计数模式,当计数寄存器的值与自动重装载寄存器相等的时候,在下一个时钟到来时会变成0;对于递减计数模式,当计数寄存器的值与0相等的时候,在下一个时钟到来时会变成自动重装载寄存器的值。
T=(ARR+1)×(PSC+1)×1fclkT = (ARR + 1) \times (PSC + 1) \times \frac{1}{f_{\text{clk}}}T=(ARR+1)×(PSC+1)×fclk1
ARR可以由 控制寄存器的APRE位设置是否进行缓冲。如果ARPE为1,设置的ARR值不会立刻刷新到它的影子寄存器中,也就是说不会立刻起作用,而是要等到定时器发生溢出才会刷新到影子寄存器中。
自动重装载寄存器:
计数寄存器:
什么是定时器的计数模式?有哪些常用模式?
见STM32定时器有哪些类型?它们的主要区别是什么?
这一问题。
如何启用和关闭STM32定时器?
控制寄存器TIMx_CR1的CEN位置1开启,0关闭。
如何使用STM32定时器生成PWM?
想要用定时器输出PWM,需要用到通用计时器或者高级计时器的比较输出功能。
该寄存器的模式设置位OC2M[2:0]就是对应着通道2的模式设置,此部分由3位组成。总共可以配置成8种模式,我们使用的是 PWM模式,所以这 3 位必须设置为 110 或者 111,分别对应 PWM 模式1和 PWM 模式2。这两种 PWM模式的区别就是输出有效电平的极性相反。位OC2PE控制输出比较通道2的预装载使能,实际就是控制CCR2寄存器是否进行缓冲。因为CCR2寄存器也是有影子寄存器的,影子寄存器才是真正起作用的寄存器。CC2S[1:0]用于设置通道2的方向(输入/输出)默认设置为0,就是设置通道作为输出使用。
CCxE使能相对应的通道,CCxP设置相应通道的极性。CCxP与OC2M[2:0]所选择的PWM1或者PWM2模式共同决定了PWM的输出极性,具体查看下面的图示。
当CCxP=0(有效电平为1)且OCxM[2:0]=110(PWM1)的时候,计数寄存器CNT小于CCRx输出高电平,大于等于CCRx的时候输出低电平,因此占空比为
D=CCRARR+1×100%D = \frac{CCR}{ARR + 1} \times 100\%D=ARR+1CCR×100%
PWM频率为
fPWM=fclk(PSC+1)×(ARR+1)f_{PWM} = \frac{f_{clk}}{(PSC + 1) \times (ARR + 1)}fPWM=(PSC+1)×(ARR+1)fclk
因此,使用定时器输出PWM需要下面几步:
- 确定需要的PWM频率和占空比,计算相应的PSC、ARR、CCR的值。
- 选择某个定时器的某个通道作为输出端口,进行相应配置,包括开启对应端口的GPIO时钟和复用模式,开启定时器时钟,设置通道的模式为比较输出模式,选择PWM1模式,设置CCxP为0(为了占空比公式正确,如果相反则需要用1减去计算结果)。开启通道对应的TIMx_CCER的使能位,使能通道。
- 将计算好的值设置到相应的寄存器中去。
- 将TIMx_CR1的CEN位置1,使能定时器。
STM32定时器捕获/比较功能的典型应用是什么?
- 产生PWM输出。
- 测量脉冲宽度
什么是定时器重载中断?
就是定时器溢出中断。
如何配置STM32的定时器从模式(Slave Mode)和主模式(Master Mode)?
通过TIMx_CR2的MMS选择主模式,设置为010在定时器溢出的时候产生触发信号。通过TIMx_SMCR的SMS选择从模式,设置为111使用触发输入的上升沿驱动计数器。通过设置TIMx_SMCR的TS可以选择触发源,具体设置什么数值对应什么触发源不同的定时器有不同的结果,可通过查表得知。TS的改变必须在SMS为000或者定时器未运行的情况下进行。
DMA
什么是DMA?在STM32中DMA的作用是什么?
DMA是一种计算机系统中的数据传输技术,它允许外设或存储设备在不经过CPU干预的情况下,直接在存储器和外设之间或在存储器之间传输数据。DMA的主要特点是高效地进行大批量数据传输,减少CPU的负担,提高系统性能。
DMA的传输方向:
- 存储器到存储器(如复制大块数据)
- 存储器到外设(如从内存发送数据到UART、SPI等)
- 外设到存储器(如从ADC采集数据存入内存)
DMA传输的主要配置项有哪些?
- 传输方向(Direction)
- 源地址(Peripheral Address)
- 目标地址(Memory Address)
- 数据传输长度(Number of Data)
- 数据宽度(Data Width)
- 地址自增模式(Increment Mode)
- DMA模式(Mode)
- 普通模式:传输完成后DMA停止,需要重新启动
- 循环模式:数据传输完成后自动重启(适用于持续数据采集,如ADC)
- 传输优先级(Priority Level)
- DMA中断(Interrupts)
什么是DMA的循环模式(Circular Mode)?它的典型应用是什么?
DMA 循环模式(Circular Mode) 是指 DMA 传输完成后不会自动停止,而是自动从头开始重新执行传输,无需 CPU 重新配置 DMA 传输参数。这样,数据可以持续不断地进行传输,非常适合需要连续数据采集或流式数据处理的应用。
典型应用如ADC采集等。
如何启用STM32 DMA?需要配置哪些寄存器?
当DMA方向是外设到内存或内存到外设的时候,按照寄存器的说明填写地址;当内存到内存的时候外设地址寄存器存储源地址,存储器地址寄存器存储目标地址。
SDIO
什么是SDIO?STM32中SDIO的主要用途是什么?
SDIO支持哪些类型的卡?
SDIO在STM32中使用哪些引脚?
SDIO的时钟频率是多少?如何调整?
SDIO通信协议的基本步骤是什么?
如何使用STM32的HAL库初始化SDIO接口?
SDIO中单块传输和多块传输的区别是什么?
如何检测SD卡的插入和拔出?
如何区分SDIO的命令传输和数据传输?
如何通过SPI连接SD卡?
RTC
什么是RTC?
STM32F103的实时时钟(RTC)是一个独立的定时器。STM32的RTC模块拥有一组连续计数的计数器,在相对应的软件配置下,可提供时钟日历的功能。修改计数器的值可以重新设置系统的当前时间和日期。
STM32的RTC模块需要哪些外部硬件支持?
- 外部晶振(LSE - 低速外部晶振)
- 备用电池(VBAT引脚)
STM32中RTC的主要寄存器有哪些?它们的作用是什么?
RTC_CRL:
RTC 预分频装载寄存器(RTC_PRLH/RTC_PRLL):
如果输入时钟是32.768kHz,这个预分频寄存器中写入7FFFF可获得周期1秒钟的信号。
还有一个与RTC预分频装载寄存器类似的RTC预分频余数寄存器(RTC_DIVH/RTC_DIVL),也是20个有效位,用来获得比秒钟更加准确的时钟,比如可以得到0.1秒,甚至0.01秒等,该寄存器的值自减的,用于保存还需要多少时钟周期获得一个秒信号。在一次秒钟更新后,由硬件重新装载。
stm32f103zet6复位之后想要修改RTC寄存器的值,需要以下步骤:
- 使能电源和备份接口时钟: 设置寄存器
RCC_APB1ENR
的PWREN
和BKPEN
位,以使能电源控制器(PWR)和备份接口(BKP)的时钟。 - 解除备份域写保护: 设置寄存器
PWR_CR
的DBP
位,允许对备份寄存器和RTC的访问。 - 等待RTC寄存器同步: 在使能RTC时钟后,需要等待RTC寄存器与APB1总线的同步完成,也就是等待
RTC_CRL
的RSF
由硬件置1。 - 进入RTC配置模式: 设置
RTC_CRL
寄存器的CNF
位,使RTC进入配置模式。 - **等待RTC寄存器操作完成:**在每次对RTC寄存器进行写操作后,需要等待操作完成。可以通过检查
RTC_CRL
寄存器的RTOFF
位来确认。
如何在STM32中初始化RTC并设置时间和日期?
先按照上面的复位之后修改RTC寄存器需要的步骤配置好,然后通过修改备份域控制寄存器 (RCC_BDCR)的RTCSEL[1:0]选择时钟源,再按照时钟源频率配置RTC预分频装载寄存器,使得分频后的时钟频率为1秒,最后修改RTC计数器寄存器,设置时间。
在配置之前,可以判断备份数据寄存器BKP_DR的标志位(自己选择和设置)来确定是不是第一次配置,如果配置过就不再次配置;如果首次配置,在完成之后就将备份数据寄存器的相应位置1。
如何读取STM32 RTC当前的时间和日期?
直接读取RTC计数寄存器即可,根据公式换算成时间和日期。
什么是RTC的备用域?备用域有什么作用?
在STM32微控制器中,备份域(Backup Domain) 是一个特殊的区域,主要用于在主电源(VDD)断电的情况下,仍能保持关键数据的完整性。该区域由备用电源(VBAT)供电,确保其中的数据在掉电或系统复位后不丢失。
如何在STM32中实现RTC的闹钟功能?
先按照上面的复位之后修改RTC寄存器需要的步骤配置好,然后将需要闹钟的日期换算成秒,写入RTC闹钟寄存器。使能闹钟中断并配置相应的优先级,编写中断处理函数。