[活动专区] 【AT-START-F423测评】2.按键与定时器的使用

[复制链接]
 楼主| yuyy1989 发表于 2023-10-23 20:54 | 显示全部楼层 |阅读模式
#申请原创# @21小跑堂  

开发板板载一个按键用于测试用,连接的是PA0
QQ截图20231022205320.png
用AT32 Work Bench打开之前新建的工程
QQ截图20231022205516.png
把PA0设置为输入
QQ截图20231022210555.png
在程序中使用轮询的方式判断按键状态
  1. if(gpio_input_data_bit_read(USER_BTN_GPIO_PORT, USER_BTN_PIN) != RESET)
  2. {
  3.         delay_ms(20);
  4.         if(gpio_input_data_bit_read(USER_BTN_GPIO_PORT, USER_BTN_PIN) != RESET)
  5.         {
  6.                 while(gpio_input_data_bit_read(USER_BTN_GPIO_PORT, USER_BTN_PIN) != RESET);
  7.                 gpio_bits_toggle(LED2_GPIO_PORT,LED2_PIN);
  8.                 gpio_bits_toggle(LED3_GPIO_PORT,LED3_PIN);
  9.                 gpio_bits_toggle(LED4_GPIO_PORT,LED4_PIN);
  10.         }
  11. }
复制代码
运行效果
WeChat_20231023204609 00_00_00-00_00_30.gif
接下来再试试用中断的方式检测按键,在AT32 Work Bench将PA0配置成EXINT
QQ截图20231022213117.png
选择上升沿中断
QQ截图20231022213217.png
开启中断
QQ截图20231022213500.png
在at32f423_int.c中会生成中断函数,在里面写自己的中断处理方法就行了
  1. void EXINT0_IRQHandler(void)
  2. {
  3.   /* add user code begin EXINT0_IRQ 0 */
  4.     extern void userkey_int();
  5.     if(exint_flag_get(EXINT_LINE_0) != RESET)
  6.     {
  7.         userkey_int();
  8.         exint_flag_clear(EXINT_LINE_0);
  9.     }
  10.   /* add user code end EXINT0_IRQ 0 */
  11.   /* add user code begin EXINT0_IRQ 1 */

  12.   /* add user code end EXINT0_IRQ 1 */
  13. }
复制代码
AT32F423的定时器资源很丰富
QQ截图20231023192223.png QQ截图20231023192538.png
接下来用基本定时器timer6实现一个1ms的定时器,AT32 Work Bench配置定时器时可就太方便了,能直接看到定时器的频率
QQ截图20231023192924.png
需要注意的是生成的代码并没有开启溢出中断,需要自己写上开启溢出中断的代码
QQ截图20231023195631.png
在at32f423_int.c中写入自己的中断处理
  1. uint16_t timer6count = 0;
  2. void timer6_ov()
  3. {
  4.     timer6count += 1;
  5.     if(timer6count == 500)
  6.         gpio_bits_toggle(LED2_GPIO_PORT,LED2_PIN);
  7.     else if(timer6count == 1000)
  8.         gpio_bits_toggle(LED3_GPIO_PORT,LED3_PIN);
  9.     else if(timer6count == 1500)
  10.     {
  11.         timer6count = 0;
  12.         gpio_bits_toggle(LED4_GPIO_PORT,LED4_PIN);
  13.     }
  14. }
  15. void TMR6_DAC_GLOBAL_IRQHandler(void)
  16. {
  17.   /* add user code begin TMR6_DAC_GLOBAL_IRQ 0 */
  18.     extern void timer6_ov();
  19.     if(tmr_flag_get(TMR6, TMR_OVF_FLAG) != RESET)
  20.     {
  21.         tmr_flag_clear(TMR6, TMR_OVF_FLAG);
  22.         timer6_ov();
  23.     }

  24.   /* add user code end TMR6_DAC_GLOBAL_IRQ 0 */
  25.   /* add user code begin TMR6_DAC_GLOBAL_IRQ 1 */

  26.   /* add user code end TMR6_DAC_GLOBAL_IRQ 1 */
  27. }
复制代码
运行效果
WeChat_20231023204615 00_00_00-00_00_30.gif
从原理图上看这三个LED的IO是TIMER4的3个输出通道,可以用TIMER4的PWM输出做个呼吸灯
QQ截图20231023200135.png
在AT32 Work Bench中将这几个引脚设置为定时器输出通道,并在TMR4中开启通道输出
QQ截图20231023205235.png
写上代码
  1. uint16_t pwm1 = 0;
  2. uint16_t pwm2 = 300;
  3. uint16_t pwm3 = 600;
  4. void setbreathpwm(tmr_channel_select_type ch,uint16_t *pwm)
  5. {
  6.     *pwm += 1;
  7.     if(*pwm > 1999)
  8.         *pwm = 0;
  9.     if(*pwm < 1000)
  10.     {
  11.         tmr_channel_value_set(TMR4,ch,*pwm);
  12.     }
  13.     else
  14.     {
  15.         tmr_channel_value_set(TMR4,ch,2000-*pwm);
  16.     }
  17. }
  18. void timer6_ov()
  19. {
  20.    
  21.     setbreathpwm(TMR_SELECT_CHANNEL_2,&pwm1);
  22.     setbreathpwm(TMR_SELECT_CHANNEL_3,&pwm2);
  23.     setbreathpwm(TMR_SELECT_CHANNEL_4,&pwm3);
  24. }
复制代码
运行效果
WeChat_20231023204621 00_00_00-00_00_30.gif

HeTui 发表于 2024-8-22 11:41 | 显示全部楼层
详细
您需要登录后才可以回帖 登录 | 注册

本版积分规则

认证:同飞软件研发工程师
简介:制冷系统单片机软件开发,使用PID控制温度

161

主题

815

帖子

10

粉丝
快速回复 在线客服 返回列表 返回顶部