#申请原创# @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);
 
 - }
 
  运行效果 
 
 
 
 
 
 
  |