嵌入式蓝桥杯学习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);//关掉所有LED
LCD_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();
}
}
}
原文地址:https://blog.csdn.net/m0_74246768/article/details/144278444
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!