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