嵌入式蓝桥杯学习5 定时中断实现按键
Cubemx配置
打开cubemx。
前面的配置与前文一样,这里主要配置基本定时器的定时功能。
1.在Timer中点击TIM6,勾选activated。配置Parameter Settings中的预分频器(PSC)和计数器(auto-reload Register)
补充:
定时器工作频率=内部总线频率/(PSC+1)
定时频率=定时器工作频率/(Period+1) =内部总线频率/((PSC+1)*(Period+1 ))
示例:总线频率80MHz,预分频80-1,重装载1000-1
定时频率= 80M/(80*1000)=1khz 即周期为1ms
2.配置PSC为80-1,计数器为1000-1。
3.将自动重装载(auto-reload )设置为使能(Enable)。
4.点击NVIC Settings,勾选中断使能。
点击GENERATE CODE.
配置keli
将main.c中的tim.h添加到my_main.h文件中。
1.使能TIM6中断
HAL_TIM_Base_Start_IT(&htim6)
用于启动定时器基本功能并且开启定时器中断的函数。其主要目的是让指定的定时器开始按照预先配置好的参数(比如计数模式、预分频值、自动重装载值等)进行计数工作,并且当定时器计数达到相应条件(例如溢出等情况)时,会触发对应的定时器中断,进而可以在中断服务函数中执行相应的处理代码。
2.编写中断回调函数
点击stm32g4××_hal_tim.h,在大概2529行的位置找到中断回调函数进行复制。
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim);
粘贴到my_main.c,用于配置定时器中断。
示例:利用按键函数测试定时中断是否有效。
点开cubemx,在上面配置的基础上,点击System Core中的NVIC,将Time Base优先级设置为4,TIM6 global interrupt优先级设置为5。点击GENERATE CODE.
my_main.c
#include "my_main.h"
uint8_t led_sta=0x10;
char text[30];
void LED_Disp(uint8_t dsLED)
{HAL_GPIO_WritePin(GPIOC,GPIO_PIN_All,GPIO_PIN_SET);//所有LED熄灭(l小写)HAL_GPIO_WritePin(GPIOC,dsLED<<8,GPIO_PIN_RESET);//左移8位:控制C8-15引脚,值为1的点亮HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);//开锁存器HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET);//关锁存器
}
void setup()
{HAL_TIM_Base_Start_IT(&htim6);LED_Disp(0x00);//关掉所有LEDLCD_Init();//LCD初始化LCD_Clear(Black);LCD_SetBackColor(Black);LCD_SetTextColor(White);
}void loop()
{/* LCD演示 */sprintf(text," number:%x ",led_sta);LCD_DisplayStringLine(Line8,(uint8_t *)text);//局部刷新LCD_SetBackColor(Yellow);sprintf(text," T:%d ",30);LCD_DisplayStringLine(Line5,(uint8_t *)text);//局部刷新LCD_SetBackColor(Black);sprintf(text," X:A01 ");LCD_DisplayStringLine(Line6,(uint8_t *)text);//局部刷新
}
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{/* 按键操作演示 */if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0)==GPIO_PIN_RESET){HAL_Delay(10);if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0)==GPIO_PIN_RESET){led_sta=(led_sta&0xfe)|0x01;led_sta=(led_sta&0xfd)|0x00;LED_Disp(led_sta); }}if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1)==GPIO_PIN_RESET){HAL_Delay(10);if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1)==GPIO_PIN_RESET){led_sta=(led_sta&0xfd)|0x02;led_sta=(led_sta&0xfe)|0x00;LED_Disp(led_sta); //180°翻转屏幕LCD_Clear(Black);REG_932X_Init1();}}
}