嵌入式(STM32)知识点
stm32相关知识点,期末复习自用
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 端口作为内置外设使用
端口复用初始化过程
- 使能 GPIO 端口时钟
- 使能复用的外设时钟
- 端口模式配置
- 端口重映射
- 外设引脚可以通过设定重映寄存器的方式映射到其他端口
- 端口重映射初始化过程
- 1.使能 GPIO 端口时钟
- 2.使能复用的外设时钟
- 3.使能 AFIO 时钟
- 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行为低电平,其余N-1行和N列为高电平,
读取列线数据,列线有低电平表示此行有按键按下,比如按下的是1行三列(1x3),那么第三列的列线IO口就为低电平。
置第2行为低电平,其余N-1行和N列为高电平,,读取列线数据,列线有低电平表示此行有按键按下。
以此类推,进行逐行扫描,根据行线列线的电平不同可以识别是否有按键按下,哪一个按键按下,获取按键号
- 反转法:
先对矩阵键盘行输出高电平,检查是否有列输入高电平,如有则记录列号。并进入下一步,对矩阵键盘列输出高电平,检查是否有行输入高电平,如有则记录行号。根据所记录的列号与行号,确定按键值
将行线设置为低电平,列线设置为高电平,读取列线的值以确定按下的列号。然后,将行线设置为高电平,列线设置为低电平,读取行线的值以确定按下的行号。最后,将行号和列号进行或运算,得到按键的键码
多位数码管动态显示原理:
通过共用段选显示数字,通过选位线控制显示数位,利用余晖效应和人眼视觉残留效应,切换位选位状态,快速显示每一位数码管的数字
通过选位线控制显示数位,通过段选线控制显示数字。多位数码管显示时,每一时刻只能显示一位数字,显示后保持一段时间将其关闭,并切换到下一位进行显示。由于数码管显示的数字有一定保持效果,所以会呈现出多位数字共同显示的效果。
共阴极
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:保护时间和预分频寄存器
串口配置过程
- 配置 GPIO 引脚时钟
- 配置 USART 时钟
- 配置 USART 发送和接收引脚
- 通过 NVIC 配置中断
- 初始化 USART
- 清除 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):校准函数
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐


所有评论(0)