本帖最后由 dami 于 2023-7-22 23:14 编辑
【NUCLEO-H563ZI测评】2.定时器实现按键的处理和led定时闪动【NUCLEO-H563ZI测评】1.开箱+点灯测试 之后继续...
上次点亮了几个灯,成就不小,这次玩一下定时器。
目标:定时器1实现绿灯1秒闪烁,提示板子在工作,定时器3实现扫描用户按键,因为板子就引出了一个。拿就玩这一个。
1,配置定时器1和3,实现10毫秒定时中断.因为定时时钟是250Mhz 如下图:
所以10毫秒可以这么配置:
生成项目:
修改代码 1:led初始化输出为不亮
static void MX_GPIO_Init(void)
{
...
/* USER CODE BEGIN MX_GPIO_Init_2 */
HAL_GPIO_WritePin(LED1_GREEN_GPIO_Port, LED1_GREEN_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(LED2_YELLOW_GPIO_Port, LED2_YELLOW_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(LED3_RED_GPIO_Port, LED3_RED_Pin, GPIO_PIN_RESET);
/* USER CODE END MX_GPIO_Init_2 */
}
修改代码 2:启动定时器1和3
static void MX_TIM1_Init(void)
{
...
/* USER CODE BEGIN TIM1_Init 2 */
HAL_TIM_Base_Start_IT(&htim1);
/* USER CODE END TIM1_Init 2 */
}
static void MX_TIM3_Init(void)
{
...
/* USER CODE BEGIN TIM3_Init 2 */
HAL_TIM_Base_Start_IT(&htim3);
/* USER CODE END TIM3_Init 2 */
}
修改代码 3:加入回调函数。处理定时器1让1秒闪亮绿灯 处理定时器3,10毫秒检测一次按键,如果连续10按下视为有按键按下,如果小于10次弹起次数清零。
有按键按下发送标记bt1_down_flag =1并且红灯亮灭变化一次。
/* USER CODE BEGIN 4 */
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if(htim->Instance==TIM1)
{
static uint8_t times1=0;
times1++;
if(times1 >100)
{
HAL_GPIO_TogglePin(LED1_GREEN_GPIO_Port, LED1_GREEN_Pin);
times1 =0;
}
}
if(htim->Instance==TIM3)
{
//static uint8_t times3=0;
static uint8_t bt1_set_times3=0;
//times3++;
//if(times3 >100)
{
GPIO_PinState bt1status=HAL_GPIO_ReadPin(USER_BUTTON_GPIO_Port,USER_BUTTON_Pin);
if(bt1status == GPIO_PIN_SET)
{
if(bt1_set_times3 <100)
bt1_set_times3++;
}
if(bt1status == GPIO_PIN_RESET)
{
if(bt1_set_times3 >10)
{
bt1_set_times3=0;
bt1_down_flag =1;
HAL_GPIO_TogglePin(LED3_RED_GPIO_Port, LED3_RED_Pin);
}
}
//times3 =0;
}
}
}
/* USER CODE END 4 */
修改代码 4:在主程序的前面while(1)的上面定义bt1_down_flag
/* USER CODE BEGIN 0 */
uint8_t bt1_down_flag =0;
/* USER CODE END 0 */
编译运行,看结果:绿灯每秒闪动,按下按键红灯闪动变化一次。 如果要使用bt1_down_flag按键按下标记,判断它是否为1,用完清零。
|