打印
[活动专区]

【AT-START-F423测评】2.按键与定时器的使用

[复制链接]
569|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
yuyy1989|  楼主 | 2023-10-23 20:54 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
#申请原创# @21小跑堂  

开发板板载一个按键用于测试用,连接的是PA0

用AT32 Work Bench打开之前新建的工程

把PA0设置为输入

在程序中使用轮询的方式判断按键状态
if(gpio_input_data_bit_read(USER_BTN_GPIO_PORT, USER_BTN_PIN) != RESET)
{
        delay_ms(20);
        if(gpio_input_data_bit_read(USER_BTN_GPIO_PORT, USER_BTN_PIN) != RESET)
        {
                while(gpio_input_data_bit_read(USER_BTN_GPIO_PORT, USER_BTN_PIN) != RESET);
                gpio_bits_toggle(LED2_GPIO_PORT,LED2_PIN);
                gpio_bits_toggle(LED3_GPIO_PORT,LED3_PIN);
                gpio_bits_toggle(LED4_GPIO_PORT,LED4_PIN);
        }
}
运行效果

接下来再试试用中断的方式检测按键,在AT32 Work Bench将PA0配置成EXINT

选择上升沿中断

开启中断

在at32f423_int.c中会生成中断函数,在里面写自己的中断处理方法就行了
void EXINT0_IRQHandler(void)
{
  /* add user code begin EXINT0_IRQ 0 */
    extern void userkey_int();
    if(exint_flag_get(EXINT_LINE_0) != RESET)
    {
        userkey_int();
        exint_flag_clear(EXINT_LINE_0);
    }
  /* add user code end EXINT0_IRQ 0 */
  /* add user code begin EXINT0_IRQ 1 */

  /* add user code end EXINT0_IRQ 1 */
}
AT32F423的定时器资源很丰富

接下来用基本定时器timer6实现一个1ms的定时器,AT32 Work Bench配置定时器时可就太方便了,能直接看到定时器的频率

需要注意的是生成的代码并没有开启溢出中断,需要自己写上开启溢出中断的代码

在at32f423_int.c中写入自己的中断处理
uint16_t timer6count = 0;
void timer6_ov()
{
    timer6count += 1;
    if(timer6count == 500)
        gpio_bits_toggle(LED2_GPIO_PORT,LED2_PIN);
    else if(timer6count == 1000)
        gpio_bits_toggle(LED3_GPIO_PORT,LED3_PIN);
    else if(timer6count == 1500)
    {
        timer6count = 0;
        gpio_bits_toggle(LED4_GPIO_PORT,LED4_PIN);
    }
}
void TMR6_DAC_GLOBAL_IRQHandler(void)
{
  /* add user code begin TMR6_DAC_GLOBAL_IRQ 0 */
    extern void timer6_ov();
    if(tmr_flag_get(TMR6, TMR_OVF_FLAG) != RESET)
    {
        tmr_flag_clear(TMR6, TMR_OVF_FLAG);
        timer6_ov();
    }

  /* add user code end TMR6_DAC_GLOBAL_IRQ 0 */
  /* add user code begin TMR6_DAC_GLOBAL_IRQ 1 */

  /* add user code end TMR6_DAC_GLOBAL_IRQ 1 */
}
运行效果

从原理图上看这三个LED的IO是TIMER4的3个输出通道,可以用TIMER4的PWM输出做个呼吸灯

在AT32 Work Bench中将这几个引脚设置为定时器输出通道,并在TMR4中开启通道输出

写上代码
uint16_t pwm1 = 0;
uint16_t pwm2 = 300;
uint16_t pwm3 = 600;
void setbreathpwm(tmr_channel_select_type ch,uint16_t *pwm)
{
    *pwm += 1;
    if(*pwm > 1999)
        *pwm = 0;
    if(*pwm < 1000)
    {
        tmr_channel_value_set(TMR4,ch,*pwm);
    }
    else
    {
        tmr_channel_value_set(TMR4,ch,2000-*pwm);
    }
}
void timer6_ov()
{
   
    setbreathpwm(TMR_SELECT_CHANNEL_2,&pwm1);
    setbreathpwm(TMR_SELECT_CHANNEL_3,&pwm2);
    setbreathpwm(TMR_SELECT_CHANNEL_4,&pwm3);
}
运行效果


使用特权

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

本版积分规则

85

主题

450

帖子

4

粉丝