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