【蓝桥杯】嵌入式编程_TIM6模块

目录

定时器的分类

TIM模块基本定时器创建

1.cubeMx配置

2.keil5配置

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);
}

猜你喜欢

转载自blog.csdn.net/shelter1234567/article/details/129287761