打印
[活动专区]

【AT-START-F405测评】3.按键中断检测与PWM输出

[复制链接]
1327|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
1.按键中断检测

打开AT32 Work Bench,将PA0功能选择为EXINT

查看原理图,按键是下拉的

配置成上升沿中断

开启中断

生成代码,在中断函数中加入处理代码
void EXINT0_IRQHandler(void)
{
  /* add user code begin EXINT0_IRQ 0 */
    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 */
}
按键需要进行去抖处理
uint8_t key_down_flag = 0;
void userkey_int(void)
{
    key_down_flag = 20;
}
void AppMsTick(void)
{
    if(key_down_flag > 0)
    {
        key_down_flag -= 1;
        if(key_down_flag == 0 && gpio_input_data_bit_read(GPIOA,GPIO_PINS_0))
        {
            gpio_bits_toggle(LED2_GPIO_PORT,LED2_PIN);
            gpio_bits_toggle(LED3_GPIO_PORT,LED3_PIN);
            gpio_bits_toggle(LED4_GPIO_PORT,LED4_PIN);
        }
    }
}
运行效果

2.PWM输出
开启定时器2的通道1、2、3,配置定时器频率为1000Hz


自动分配的IO

要外接的是这个LED模块

模块是共阳极的,这里将PWM极性设置为低

实现颜色渐变效果代码

uint8_t ledstep = 0;
uint16_t pwm = 0;
void LedChangeColor(void)
{
    uint8_t ch1 = TMR_SELECT_CHANNEL_1;
    uint8_t ch2 = TMR_SELECT_CHANNEL_2;
    if(ledstep >1)
    {
        ch1 = TMR_SELECT_CHANNEL_3;
        ch2 = TMR_SELECT_CHANNEL_1;
    }
    else if(ledstep >0)
    {
        ch1 = TMR_SELECT_CHANNEL_2;
        ch2 = TMR_SELECT_CHANNEL_3;
    }
    tmr_channel_value_set(TMR2,ch1,1000 - pwm);
    tmr_channel_value_set(TMR2,ch2,pwm);
    pwm += 1;
    if(pwm > 1000)
    {
        ledstep += 1;
        pwm = 0;
    }
    if(ledstep == 3)
        ledstep = 0;
}
void AppMsTick(void)
{
    LedChangeColor();
}
运行效果


使用特权

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

本版积分规则

146

主题

698

帖子

6

粉丝