yuyy1989 发表于 2024-4-26 21:49

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

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();
}运行效果


页: [1]
查看完整版本: 【AT-START-F405测评】3.按键中断检测与PWM输出