2024蓝桥杯嵌入式复习笔记–基础知识-模块使用-近四届题目代码实现
芯片基础知识(比赛的话不需要太了解)
外设(需要重点关注)
GPIO
输入输出模式
复用
这一个表是数据手册里面的4.11
引脚的复用, 比如使用PA9作为USART_TX的时候, 把他配置为AF7
这一个是参考手册里面的9.4
使用这一个寄存器配置实际的复用功能
通用定时器
G4的通用定时器有好几种模式, 主要的区别是可以使用的通道的数量
定时功能
使用定时器的时候使用HAL_TIM_Base_Start();HAL_TIM_Base_Start_IT();HAL_TIM_Base_Start_DMA();进行开启
可以使用函数HAL_TIM_Base_GetState();获取时钟的状态
使用__HAL_TIM_GET_COUNTER()
获取计数器的值, __HAL_TIM_SET_COUNTER()
进行设置
使用__HAL_TIM_GET_AUTORELOAD()
获取这一个时钟的自动重装载值, 使用这一个时候最好打开影子寄存器
__HAL_TIM_SET_PRESCALER()
处理预分频值
PWM
使用这一个模式的时候, 先在对应的引脚选择一个定时器的通道
代码使用的时候需要打开PWM, 使用函数HAL_TIM_PWM_Start();
输入捕获
实际捕获的时候使用HAL_TIM_IC_Start_IT()开启这一个捕获
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim){
if(htim->Instance == TIM17){
curr_val = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_1);
__HAL_TIM_SET_COUNTER(htim, 0);
frq = (80000000 / 80) / curr_val;
HAL_TIM_IC_Start_IT(htim, TIM_CHANNEL_1);
}
}
使用这一个计算PWM的频率
如果要捕获占空比, 可以使用一个定时器的两个通道, 这两个通道捕获不同的边沿, 之后通过捕获时间的比例获取这一个PWM的占空比
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim){
if(htim->Instance == TIM17){
curr_val = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_1);
__HAL_TIM_SET_COUNTER(htim, 0);
frq = (80000000 / 80) / curr_val;
HAL_TIM_IC_Start_IT(htim, TIM_CHANNEL_1);
}
if(htim->Instance == TIM8){
if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1){
rise = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_1);
fall = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_2);
__HAL_TIM_SET_COUNTER(htim, 0);
duty = 100 * fall / rise;
HAL_TIM_IC_Start_IT(htim, TIM_CHANNEL_1);
HAL_TIM_IC_Start_IT(htim, TIM_CHANNEL_2);
}
}
}
ADC
扫描模式: 使用STM32CUBEMX配置了多通道后,这一项默认开启且无法设置成关闭。这个模式就是自动扫描你开启的所有通道进行转换,直至转换完。例如你开启了CH0、CH1、CH2、CH3这四个通道,启动转换后ADC会自动将这4个通道全部转换完,但是这种连续性是可以被打断的,所以就引出了间断模式。
连续模式: 在CUBE中选中ENABLE就是连续模式,DISABLE就是单次模式。开启连续模式后,ADC的转换不由其他控制。例如将ADC设置为了定时器的TGRO触发采样,如果开启连续模式,ADC将忽略定时器的触发采样。(连续转换模式开启后其实就是满频率的采样)。
间断模式: 可以将多个通道进行分组采集,例如你开启了CH0~3这4个通道,假如你设置了间断次数为4,就相当于将4个通道分成了4组,每组1个通道,那么要想采集完这4个通道就需要手动触发4次ADC采集;如果设置了间断次数为2,那么采集完4个通道就需要手动触发2次ADC采集。
单通道
double get_adc(