本帖最后由 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,用完清零。
|