【蓝桥杯】嵌入式编程_TIM6模块
目录
定时器的分类
STM32G431x芯片 提供三种类型的定时器 分别为基本定时器 通用定时器 高级定时器
图来源STM32G431RB数据手册.pdf
从原理理解它们 实在是太复杂了 ,故我们从实际出发 从功能上 从配置上尝试理解掌握它们。
TIM模块基本定时器创建
基本定时器的原理与内部的滴答定时器很相似 也是实现计数定时,
本次模块的创建 我们用基本定时器6 实现1s计一次数的功能
有关定时器6 时钟
图来源STM32G431RB数据手册.pdf
1.cubeMx配置
1)开启TIM6
80MHz 多少秒进入一次中断?
80 000 000 / 8000 = 10 000 分完频之后 10K
1 000/10 000 = 1/10s=0.1s
10 000/10 000 =1 s
也就说当Counter period(自动重装载器)设置为9999 定时器可以l s进入一次中断
2)开启TIM6中断
2.keil5配置
1)添加已生成的tim.c模块 以及头文件tim.h
2)增加相关库
3)main.h增加 有关模块的头定义
4)tim6中断配置
进入stm32g4xx_it.c
extern TIM_HandleTypeDef htim6;
/**
* @brief This function handles TIM6 global interrupt, DAC1 and DAC3 channel underrun error interrupts.
*/
void TIM6_DAC_IRQHandler(void)
{
/* USER CODE BEGIN TIM6_DAC_IRQn 0 */
/* USER CODE END TIM6_DAC_IRQn 0 */
HAL_TIM_IRQHandler(&htim6);
/* USER CODE BEGIN TIM6_DAC_IRQn 1 */
/* USER CODE END TIM6_DAC_IRQn 1 */
}
5)主函数配置
MX_TIM6_Init();
HAL_TIM_Base_Start_IT(&htim6);
6)添加中断回调函数
推荐在tim.c中添加
unsigned int tim6_i
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
tim6_i++;
HAL_TIM_Base_Start_IT(&htim6);
}
在头文件tim.h 把tim6_i扩展出去
7)lcd测试
void tim6_proc(void)
{
//tim6 0.1s 产生一次中断
sprintf(&LCD_string[0], "Tim6_0.1s_:%d",tim6_i);//DA display
LCD_DisplayStringLine(Line7, (uint8_t *)LCD_string);
}
tim6定时器练习
B1按下led1点亮 tim6开始定时
B1再次按下led1灭 tim6结束定时 B1再按下重新定时
unsigned char key_down = key_down_fun();
if(key_down == B1){
ucLed ^= 0x01;
}
if (ucLed==0x01 && tim6_i ==0){
HAL_TIM_Base_Start_IT(&htim6);
}
if (ucLed==0x00&&tim6_i !=0){
HAL_TIM_Base_Stop_IT(&htim6);
tim6_i=0;
}
Led_Input_Disp(ucLed);
sprintf(&LCD_string[0], "Tim6_0.1s_:%.4u",tim6_i);//DA display
LCD_DisplayStringLine(Line7, (uint8_t *)LCD_string);
认真对比之下的代码做了那些改进!
unsigned char key_down = key_down_fun();
if(key_down == B1){
ucLed ^= 0x01;
}
if ((ucLed&0x01)==0x01 && tim6_i ==0){
HAL_TIM_Base_Start_IT(&htim6);
}
if ((ucLed&0x01)==0x00&&tim6_i !=0){
HAL_TIM_Base_Stop_IT(&htim6);
tim6_end=tim6_i;
tim6_i=0;
}
Led_Input_Disp(ucLed);
if(tim6_i==0)
{
sprintf(&LCD_string[0], "Tim6_0.1s_:%.4u",tim6_end);//DA display
LCD_DisplayStringLine(Line7, (uint8_t *)LCD_string);
}else{
sprintf(&LCD_string[0], "Tim6_0.1s_:%.4u",tim6_i);//DA display
LCD_DisplayStringLine(Line7, (uint8_t *)LCD_string);
}
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步