AT32定时器——外部脉冲计数功能实现
一、任务
芯片:AT32F403VGT7
引脚:PB5、PE5
功能:对输入的低频方波信号进行计数。
参考链接:
雅特力官网资料: https://www.arterytek.com/cn/product/AT32F403A.jsp#Resource
雅特力技术论坛: https://bbs.21ic.com/iclist-1004-1.html
二、实现思路
方案一 利用引脚中断进行计数
由于PE5、PB5共用一个中断线,没办法同时响应中断信号,故此方案不行。
方案二 利用定时器对外部脉冲进行计数
由上图可知
引脚 | 定时器 | 通道 | 是否重映射 |
---|---|---|---|
PE5 | TMR9 | CH1 | 是 |
PB5 | TMR3 | CH2 | 是 |
1.初始化时钟
void clock_init(void)
{
/* 使能TMR3、GPIOB时钟 */
crm_periph_clock_enable(CRM_TMR3_PERIPH_CLOCK, TRUE);
crm_periph_clock_enable(CRM_GPIOB_PERIPH_CLOCK, TRUE);
/* 使能TMR9、GPIOE时钟 */
crm_periph_clock_enable(CRM_TMR9_PERIPH_CLOCK, TRUE);
crm_periph_clock_enable(CRM_GPIOE_PERIPH_CLOCK, TRUE);
/* 由于PE5、PB5对应的定时器都需要重映射,故在此需要使能重映射时钟 */
crm_periph_clock_enable(CRM_IOMUX_PERIPH_CLOCK,TRUE);
}
2.初始化GPIO
void gpio_init(void)
{
gpio_init_type gpio_init_struct = {0};
/* gpio configuration */
gpio_pin_remap_config(TMR3_MUX_10,TRUE);
gpio_pin_remap_config(TMR9_MUX,TRUE);
gpio_init_struct.gpio_pins = GPIO_PINS_5;
gpio_init_struct.gpio_pull = GPIO_PULL_NONE;
gpio_init_struct.gpio_mode = GPIO_MODE_INPUT;
gpio_init_struct.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;
gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
gpio_init(GPIOB, &gpio_init_struct);
gpio_init(GPIOE, &gpio_init_struct);
}
3.配置定时器
void timer_init(void)
{
tmr_base_init(TMR9, 0xFFFF, 0);
tmr_cnt_dir_set(TMR9, TMR_COUNT_UP);
tmr_sub_mode_select(TMR9, TMR_SUB_EXTERNAL_CLOCK_MODE_A);
tmr_trigger_input_select(TMR9, TMR_SUB_INPUT_SEL_C1DF1);
tmr_base_init(TMR3, 0xFFFF, 0);
tmr_cnt_dir_set(TMR3, TMR_COUNT_UP);
tmr_sub_mode_select(TMR3, TMR_SUB_EXTERNAL_CLOCK_MODE_A);
tmr_trigger_input_select(TMR3, TMR_SUB_INPUT_SEL_C2DF2);
tmr_counter_enable(TMR3, TRUE);
tmr_counter_enable(TMR9, TRUE);
}
4. 获取定时器的计数值
uint32_t value1 = tmr_counter_value_get(TMR3);
uint32_t value2 = tmr_counter_value_get(TMR9);
5.设置定时器计数值
tmr_counter_value_set(TMR3, 0);
tmr_counter_value_set(TMR9, 0);
三、官方例程
官方例程对编码器模式,外部脉冲捕获、PWM捕获都有例程介绍,是个不错的参考资料,就是没有外部脉冲计数的例程。
四、小结
通过以上配置,即可实现了AT32F403AVGT7定时器的外部模式对外部脉冲信号进行计数的功能 。