STM32复习

嵌入式定义

以应用为中心,计算机技术为基础,软硬件可剪裁,以适应应用系统对功能、可靠性、成本、体积、功耗有严格要求的专用计算机系统

嵌入式特点:专用性强、软硬件结合、设计高效、程序固化、独立开发系统、生命周期长



GPIO 工作模式

浮空输入模式:

仅接入 TTL 触发器 默认端口电平不确定 外部按键输入/USART RX 引脚

上拉输入模式:

增加接入上拉电阻 默认端口电平为高电平 需要 IO 内部上拉电阻输入、外部中断触发条件为下降沿触发/低电平触发

下拉输入模式

增加接入上拉电阻 默认端口电平为低电平 需要 IO 内部下拉电阻输入、外部中断触发条件为上升沿触发/高电平触发

模拟输入模式:

直接输入 MCU 内部的处理单元 ADC 模拟输入/低功耗省电

推挽输出

输出具有驱动能力 CPU 输入 0-低电平 1-高电平 驱动 LED、数码管 输出某个控制信号

复用推挽输出

GPIO 作为内置外设引脚 常见片内外设(USART TX 引脚 SPI PWM)

开漏输出

适合作电流型驱动 ,吸引电流能力强 CPU 输入 0-低电平 1-引脚处于开露,高阻态(浮空),输出高电平须接入上拉电阻,外部电路改变状态,I/O 端口的双向功能(I2C/QSMBus)

复用开漏输出

引脚选用复用功能 (I2C、QSMBus)



复用

GPIO 端口作为内置外设使用

端口复用初始化过程

  1. 使能 GPIO 端口时钟
  2. 使能复用的外设时钟
  3. 端口模式配置
  4. 端口重映射
  5. 外设引脚可以通过设定重映寄存器的方式映射到其他端口
  6. 端口重映射初始化过程
  7. 1.使能 GPIO 端口时钟
  8. 2.使能复用的外设时钟
  9. 3.使能 AFIO 时钟
  10. 4.开启重映射

相关函数:

​void HAL_GPIO_WritePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState)​

电平输出函数,向指定的 GPIO 引脚写入特定的值(高/低电平)

​GPIOx ​ 指定操作的 GPIO 端口

​GPIO_Pin​ 指定操作的 GPIO 引脚

​PinState​ 指定写入的值(高/低电平)

​GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin)​

电平输入函数 返回值是 0/1

​GPIOx ​指定操作的 GPIO 的端口

​GPIO_Pin​ 指定的 GPIO 的引脚

​void HAL_GPIO_TogglePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin)​

电平翻转函数 使指定的 GPIO 引脚的电平值翻转

​Pin​ 指定配置的 GPIO 引脚

​Mode​ 指定配置的 GPIO 工作模式

//GPIO_MODE_INPUT​:输入模式

// - GPIO_MODE_OUTPUT_PP​:推挽输出模式

// - GPIO_MODE_OUTPUT_OD​:开漏输出模式

// - GPIO_MODE_AF_PP​:复用推挽输出模式

// - GPIO_MODE_AF_OD​:复用开漏输出模式

// - GPIO_MODE_ANALOG​:模拟模式

​Pull​ 指定引脚的上拉/下拉激活状态

// - GPIO_NOPULL​:无上拉或下拉

// - GPIO_PULLUP​:上拉

// - GPIO_PULLDOWN​:下拉

​Speed​ 指定配置的引脚速度

// - GPIO_SPEED_FREQ_LOW​:低速

// - GPIO_SPEED_FREQ_MEDIUM​:中速

// - GPIO_SPEED_FREQ_HIGH​:高速

// - GPIO_SPEED_FREQ_VERY_HIGH​:非常高速

​OutputType​ 指定配置的引脚输出操作类型

​Alternate​指定引脚复用功能的选择(如果引脚配置为复用模式)

矩阵键盘扫描原理(两种)

  1. (逐)行列扫描:

采用对矩阵键盘逐行输入高电平的方法,每输入一行的高电平后均检查是否有列输出高电平,如有则同时确定行列值,进而确定按键值。

置第1行为低电平,其余N-1行和N列为高电平,

读取列线数据,列线有低电平表示此行有按键按下,比如按下的是1行三列(1x3),那么第三列的列线IO口就为低电平。

置第2行为低电平,其余N-1行和N列为高电平,,读取列线数据,列线有低电平表示此行有按键按下。

以此类推,进行逐行扫描,根据行线列线的电平不同可以识别是否有按键按下,哪一个按键按下,获取按键号

  1. 反转法:

先对矩阵键盘行输出高电平,检查是否有列输入高电平,如有则记录列号。并进入下一步,对矩阵键盘列输出高电平,检查是否有行输入高电平,如有则记录行号。根据所记录的列号与行号,确定按键值

将行线设置为低电平,列线设置为高电平,读取列线的值以确定按下的列号。然后,将行线设置为高电平,列线设置为低电平,读取行线的值以确定按下的行号。最后,将行号和列号进行或运算,得到按键的键码

多位数码管动态显示原理:

通过共用段选显示数字,通过选位线控制显示数位,利用余晖效应和人眼视觉残留效应,切换位选位状态,快速显示每一位数码管的数字

通过选位线控制显示数位,通过段选线控制显示数字。多位数码管显示时,每一时刻只能显示一位数字,显示后保持一段时间将其关闭,并切换到下一位进行显示。由于数码管显示的数字有一定保持效果,所以会呈现出多位数字共同显示的效果。

共阴极

PA0-PA7 接 a-h 段

Abcdefh

H g f e d c b a

0 0 1 1 1 1 1 1 0x3F

0 0 0 0 0 1 1 0 0x06

0 1 0 1 1 0 1 1 0x5B

0 1 0 0 1 1 1 1 0x4F

0 1 1 0 0 1 1 0 0x66

0 1 1 0 1 1 0 1 0x6D

0 1 1 1 1 1 0 1 0x7D

0 0 0 0 0 1 1 1 0x07

0 1 1 1 1 1 1 1 0x7F

0 1 1 0 1 1 1 1 0x6F

抢占优先级:优先级高的能打断优先级低 响应优先级:当抢占优先级相同时,响应优先级高的先执行

注意:优先级的值越小,优先级越高(越先执行)

总结:抢占优先级高的可以中断嵌套,响应优先级高的可以优先排队,抢占优先级和响应优先级均相同的按中断号排队

中断和事件的区别:事件不需要CPU干预

中断的作用和意义

1.实时控制:在确定时间内对相应事件作出响应

2.故障处理:检测故障,及时处理

3.数据传输:串口数据接收

意义:高效处理紧急程序,不会一直占用CPU资源

NVIC(嵌套向量中断控制器):支持256个优先级,允许裁剪 256个中断(16个内核 + 240个外部)

中断向量表:一块固定内存,以4字节对齐,存放各中断服务函数程序的首地址

定义在启动文件,发生中断自动执行

中断:正在执行的程序,被中断源打断执行中断服务程序,之后返回断点继续执行

中断信号->中断控制器->硬件中断服务函数->HAL全局中断服务函数->对应信号的回调函数

外部中断方式

电平触发

保持触发条件会重复触发

边沿触发

us 级别,只触发一次

串口函数中使用 HAL_Delay 函数:避免长时间阻塞、确保 SysTick 定时器的中断优先级设置得当,以避免因优先级问题导致的程序卡死

​Instace​:UART 寄存器基地址

​Init​:UART 通信参数

​pTxBuffPtr​:指向发送传输缓冲区的指针

​TxferSize​:发送传输大小

​TxtferCount​:发送传输计数

​ReceptionType​:正在进行的接收类型

​hdmatx​:发送 DMA 句柄参数

​hdmarx​:接收 DMA 句柄参数

​Lock​:锁定对象

​gState,RxState​:记录 UART 状态

​ErrorCode​:记录发生错误类型

​BAudRate​:配置通信波特率

计算公式:

​WordLength​:指定帧中发送或接收的数据位数

​StopBitsL​:传输的停止位数

​Parity​:指定奇偶校验模式

​Mode​:是否启用发送或接收模式

​HwFlowCtl​:启用/禁用硬件控流模式

​OverSampling​:是否启用 8 倍过采样

SR:USART 状态寄存器

DR:USART 数据寄存器

BRR:USART 波特率寄存器

CR1:USART 控制寄存器 1

CR2:USART 控制寄存器 2

CR3:USART 控制寄存器 3

GTPR:保护时间和预分频寄存器

串口配置过程

  1. 配置 GPIO 引脚时钟
  2. 配置 USART 时钟
  3. 配置 USART 发送和接收引脚
  4. 通过 NVIC 配置中断
  5. 初始化 USART
  6. 清除 TC(发送完成)和 RXHE(接收寄存器非空)标志,使能接受中断
  • USART和GPIO的时钟。例如,对于USART1,可以使用RCC_APB2PeriphClockCmd函数启用USART1和GPIOA的时钟。
  • GPIO引脚:将GPIO引脚配置为复用功能,用于串口通信。具体可以使用GPIO_Init函数设置引脚的模式(如复用推挽输出)、速度等参数。对于发送(TX)引脚,通常设置为复用推挽输出;对于接收(RX)引脚,通常设置为浮空输入或上拉输入。
  • USART_Init函数设置串口的波特率、数据位、停止位、校验位等参数。这些参数的设置决定了串口通信的具体格式。
  • USART_Cmd函数使能串口,使其开始工作
  • TDR)是否为空。这可以通过读取USART_FLAG_TXE标志位来判断。如果TXE标志位为1,表示发送数据寄存器为空,可以发送数据;如果为0,则表示发送数据寄存器仍在使用中,需要等待。
  • USART_SendData函数将数据写入发送数据寄存器。此时,数据会被加载到发送移位寄存器中,并准备通过硬件自动发送。
  • USART_FLAG_TC(传输完成)标志位来实现。当TC标志位为1时,表示数据已经发送完成。

TX 引脚是推挽复用输出模式

RX 引脚是浮空输入或上拉输入

UART:通用异步接发器

UASRT:通用同步异步接发器

串口发送一个字节的过程:根据波特率确定一个比特数据持续时间。发送方拉低TX信号线作为起始信号,根据发送移位寄存器转移数据依次发送,低位优先。数据发送完成后释放信号线(恢复高电平),根据停止位确定持续时长。

轮询:必须等待接收或发送串口操作完成,只能接收定长数据

中断:使CPU空闲,数据寄存器空时才调用CPU

DMA:将数据从内存搬到接收/发送数据寄存器中

​HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)​:通过 UART 发送数据

​huart​:指向 handletype 结构体指针

​pData​:指向要发送数据的指针

​Size​:发送数据大小

​Timeout​:发送操作的超时时间

​HAL_StatusTypeDef HAL_UARTEx_ReceiveToIdle_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)​:用以中断方式接收 UART 数据,接收不定长数据,直到接收空闲线条件为止

​huart​:指向 handletype 的指针

​pData​:指向接收缓冲区的指针

​Size​:接收缓冲区的大小

​HAL_StatusTypeDef HAL_UART_Receive_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)​:用于通过 DMA 方式接收 UART 数据

​pData​:接收缓冲区指针

​Size​:接收数据大小

​HAL_StatusTypeDef HAL_UART_Transmit_DMA(UART_HandleTypeDef *huart, const uint8_t *pData, uint16_t Size)​:通过 DMA 方式发送数据

​pData​:发送数据的缓冲区指针

​Size​:发送数据大小

时基单元:

定时器计数方式

向上计数模式

计数器从 0 计数到自动加载值,然后重新从 0 开始计数并产生一个计数器溢出事件

向下计数模式

计数器从自动装入的值(TIMx_ARR)开始向下计数到 0,然后从自动装入的值重新开始,并产生一个计数器向下溢出事件

中央对齐模式

计数器从 0 开始计数到自动装入的值-1,产生一个计数器溢出事件,然后向下计数到 1 并且产生一个计数器溢出事件;然后再从 0 开始重新计数

PWM 频率的寄存器:

自动重装载寄存器(ARR):决定 PWM 信号周期

频率计算公式:Fpwm = 主频 / ((ARR+1)*(PSC+1))

PWM 占空比的寄存器:

捕获/比较寄存器(CCR):决定 PWM 信号的高电平时间

占空比计算公式:Duty Cycle = CCRx / ARR

Prescaler:预分频器值,用于将定时器的时钟频率分频

CounterMode:计数器模式

Period:自动重装载寄存器的值,决定 PWM 信号的周期

ClockDivision:时钟分频,用于指定定时器时钟的分频比例

RepetitionCounter:重复计数器值,用于产生更高频率的 PWM 信号

AutoReloadPreload:自动重装载预装载使能,用于在更新事件发生时,是否允许预装载寄存器的内容立即转移到影子寄存器

​HAL_StatusTypeDef HAL_TIM_Base_Start_IT(TIM_HandleTypeDef *htim):​启动定时器基本模式并启用中断,让指定的定时器开始计数,并在发生更新事件时产生中断

htim:指向定时器句柄的指针

​HAL_StatusTypeDef HAL_TIM_PWM_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel)​:用于启动 PWM 输出并启用相应通道中断的函数

Channel:启动的 PWM 通道

​__HAL_TIM_SET_COMPARE(__HANDLE__, __CHANNEL__, __COMPARE__)​:用于直接设置定时器中的指定通道的捕获/比较寄存器值

_HANDLE_:指向句柄的指针

_COMPARE_:设置捕获/比较寄存器的新值

RTC计数器:32位

ADC 规则组:16 个 32 位(独立模式下只用到低 16 位)数据寄存器

ADC 注入组:4 个 16 位数据寄存器

ADC 输入 GPIO 引脚设为模拟输入模式

T CONV = 采样时间+ 12.5个周期

测量值到电压的转换公式:电压值=测量值/(参考电压(3.3V)/4095)

VolVal = ((MeasureVal / ADC的最大值) * ADC的参考电压) + ADC的过低电压阈值

RTC

计数频率 32.768kHz秒中断

每当 RTC 计数器增加到一个新的秒值就会产生一个秒中断 用于实现周期任务,时间更新、状态检查

溢出中断

RTC 计数达到计数最大值,会产生一个溢出中断 用于处理长时间段的计时任务需要重新初始化的情况

闹钟中断

当 RTC 计数器达到预设的闹钟时间会产生一个闹钟中断用于触发定时任务 唤醒系统

HAL_StatusTypeDef HAL_RTC_SetAlarm_IT(RTC_HandleTypeDef *hrtc, RTC_AlarmTypeDef *sAlarm, uint32_t Format):用于设置 RTC 闹钟,并配置为中断模式

hrtc:指向 RTC 句柄的指针

sAlarm:指向 RTC 闹钟配置结构体的指针

Format:指定闹钟时间格式

static HAL_StatusTypeDef RTC_WriteTimeCounter(RTC_HandleTypeDef *hrtc, uint32_t TimeCounter):设置 RTC 时间的计数器

HAL_StatusTypeDef HAL_ADC_ConfigChannel(ADC_HandleTypeDef* hadc, ADC_ChannelConfTypeDef* sConfig):用于配置 ADC 的通道

hadc:指向 ADC 句柄的指针

sConfig:指向 ADC 通道配置结构体的指针

uint32_t HAL_ADC_GetValue(ADC_HandleTypeDef* hadc):用于获取 ADC 转换后的值

​HAL_ADC_PollForConversion(&hadc1, 10):​轮询检查是否转换完成

​HAL_ADCEx_Calibration_Start(&hadc1):​校准函数

Logo

openvela 操作系统专为 AIoT 领域量身定制,以轻量化、标准兼容、安全性和高度可扩展性为核心特点。openvela 以其卓越的技术优势,已成为众多物联网设备和 AI 硬件的技术首选,涵盖了智能手表、运动手环、智能音箱、耳机、智能家居设备以及机器人等多个领域。

更多推荐