打印
[STM32H5]

【NUCLEO-H563ZI测评】2.定时器实现按键的处理和led定时闪动

[复制链接]
441|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
dami|  楼主 | 2023-7-22 23:11 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 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,用完清零。





17.jpg (243.79 KB )

17.jpg

18.jpg (182.71 KB )

18.jpg

使用特权

评论回复
沙发
AloneKaven| | 2023-8-18 11:07 | 只看该作者
重装值和分频系数是怎么确定的啊?

使用特权

评论回复
板凳
dami|  楼主 | 2023-8-20 18:27 | 只看该作者
看第一图可知:选择Tim时钟为250Mhz  分频选249  就是250分频  那就是1mhz
1mhz 自动重装是9999  那就是10000      
1mhz      那  1000 000   对应1秒
                      10 000   对应就是百分之一秒   10毫秒

使用特权

评论回复
地板
中国龙芯CDX| | 2023-8-21 10:17 | 只看该作者
ST的HAL库配置还是挺方便的,大大节省开发时间

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

61

主题

1050

帖子

6

粉丝