APM32E030的定时器有三类,不同定时器支持的功能互有差异,部分定时器支持输入捕获功能;
驱动代码如下:
- #define TIM_INS (TMR3)
- /* 定时器捕获数据获取函数 */
- static tim_capture_data_func_f tim_capture_data_func_1;
- static tim_capture_data_func_f tim_capture_data_func_2;
- /* 捕获精度us */
- #define CAPTURE_PRECISION (100)
- /* 最大周期 */
- static uint32_t period_max;
- /*
- * [url=/u/brief]@brief[/url] 捕获引脚初始化
- *
- * @param None
- *
- * @retval None
- *
- */
- static void bsp_tim_capture_gpio_init(void)
- {
- GPIO_Config_T gpioConfig;
-
- /* PC6 -> TMR3_CH1
- * PC8 -> TMR3_CH3
- */
- RCM_EnableAHBPeriphClock(RCM_AHB_PERIPH_GPIOC);
- GPIO_ConfigStructInit(&gpioConfig);
- gpioConfig.pin = GPIO_PIN_6 | GPIO_PIN_8;
- gpioConfig.mode = GPIO_MODE_AF;
- gpioConfig.outtype = GPIO_OUT_TYPE_PP;
- gpioConfig.speed = GPIO_SPEED_50MHz;
- gpioConfig.pupd = GPIO_PUPD_NO;
- GPIO_Config(GPIOC, &gpioConfig);
-
- GPIO_ConfigPinAF(GPIOC, GPIO_PIN_SOURCE_6, GPIO_AF_PIN0);
- GPIO_ConfigPinAF(GPIOC, GPIO_PIN_SOURCE_8, GPIO_AF_PIN0);
- }
- /*
- * @brief 定时器初始化
- *
- * @param None
- *
- * @retval None
- *
- */
- void bsp_tim_capture_init(void)
- {
- TMR_TimeBase_T timeBaseConfig;
- TMR_ICConfig_T ICconfigstruct;
-
- bsp_tim_capture_gpio_init();
-
- RCM_EnableAPB1PeriphClock(RCM_APB1_PERIPH_TMR3);
- TMR_Reset(TIM_INS);
- TMR_ConfigTimeBaseStruct(&timeBaseConfig);
- /* CK_CNT=fCK_PSC/(PSC+1) */
- /* 10KHz,捕获精度是100us */
- timeBaseConfig.div = 7200 - 1;
- /* 最大捕获PWM周期为6s
- * 因AUTORLD寄存器为16位,所以period最大为65535
- * 同时AUTORLD寄存器限制,提高捕获精度,需同时缩短最大捕获PWM周期
- */
- timeBaseConfig.period = 60000 - 1;
- timeBaseConfig.clockDivision = TMR_CKD_DIV1;
- timeBaseConfig.counterMode = TMR_COUNTER_MODE_UP;
- timeBaseConfig.repetitionCounter = 0;
- TMR_ConfigTimeBase(TIM_INS, &timeBaseConfig);
- period_max = timeBaseConfig.period + 1;
- /* 捕获PWM1:
- * 捕获通道1: 输入来源为TMR3_CH1
- * 捕获通道2: 输入来源为TMR3_CH1
- */
- TMR_ICConfigStructInit(&ICconfigstruct);
- ICconfigstruct.channel = TMR_CHANNEL_1;
- /* 捕获上升沿 */
- ICconfigstruct.ICpolarity = TMR_IC_POLARITY_RISING;
- ICconfigstruct.ICselection = TMR_IC_SELECTION_DIRECT_TI; /* TMR3_CH1 */
- ICconfigstruct.ICprescaler = TMR_ICPSC_DIV1;
- ICconfigstruct.ICfilter = 0x00;
- TMR_ICConfig(TIM_INS, &ICconfigstruct);
- ICconfigstruct.channel = TMR_CHANNEL_2;
- /* 捕获下降沿 */
- ICconfigstruct.ICpolarity = TMR_IC_POLARITY_FALLING;
- ICconfigstruct.ICselection = TMR_IC_SELECTION_INDIRECT_TI; /* TMR3_CH1 */
- TMR_ICConfig(TIM_INS, &ICconfigstruct);
- /* 捕获PWM2:
- * 捕获通道3: 输入来源为TMR3_CH3
- * 捕获通道4: 输入来源为TMR3_CH3
- */
- TMR_ICConfigStructInit(&ICconfigstruct);
- ICconfigstruct.channel = TMR_CHANNEL_3;
- /* 捕获上升沿 */
- ICconfigstruct.ICpolarity = TMR_IC_POLARITY_RISING;
- ICconfigstruct.ICselection = TMR_IC_SELECTION_DIRECT_TI; /* TMR3_CH3 */
- ICconfigstruct.ICprescaler = TMR_ICPSC_DIV1;
- ICconfigstruct.ICfilter = 0x00;
- TMR_ICConfig(TIM_INS, &ICconfigstruct);
- ICconfigstruct.channel = TMR_CHANNEL_4;
- /* 捕获下降沿 */
- ICconfigstruct.ICpolarity = TMR_IC_POLARITY_FALLING;
- ICconfigstruct.ICselection = TMR_IC_SELECTION_INDIRECT_TI; /* TMR3_CH3 */
- TMR_ICConfig(TIM_INS, &ICconfigstruct);
-
- /* 使能捕获中断 */
- TMR_EnableInterrupt(TIM_INS, TMR_INT_CH1);
- TMR_EnableInterrupt(TIM_INS, TMR_INT_CH2);
- TMR_EnableInterrupt(TIM_INS, TMR_INT_CH3);
- TMR_EnableInterrupt(TIM_INS, TMR_INT_CH4);
- /* 使能中断 */
- NVIC_SetPriority(TMR3_IRQn, 0);
- NVIC_EnableIRQ(TMR3_IRQn);
- /* 使能定时器 */
- TMR_Enable(TIM_INS);
- }
- /*
- * @brief 定时器捕获数据获取函数注册
- *
- * @param func: 定时器捕获数据获取函数
- *
- * @retval None
- *
- */
- void bsp_tim_capture_capture_data_func_register(uint8_t index, tim_capture_data_func_f func)
- {
- if (index == 1) {
- tim_capture_data_func_1 = func;
- } if (index == 2) {
- tim_capture_data_func_2 = func;
- }
- }
测试代码如下:
- /* PWM输出 */
- uint8_t pwm1_output_duty = 20;
- uint8_t pwm2_output_duty = 35;
- /* PWM捕获 */
- uint16_t pwm1_capture_duty;
- uint32_t pwm1_capture_hz;
- uint16_t pwm2_capture_duty;
- uint32_t pwm2_capture_hz;
- void test_gpio_init(void)
- {
- GPIO_Config_T gpioConfig;
- RCM_EnableAHBPeriphClock(RCM_AHB_PERIPH_GPIOA);
- GPIO_ConfigStructInit(&gpioConfig);
- gpioConfig.pin = GPIO_PIN_5;
- gpioConfig.mode = GPIO_MODE_OUT;
- gpioConfig.outtype = GPIO_OUT_TYPE_PP;
- gpioConfig.speed = GPIO_SPEED_50MHz;
- gpioConfig.pupd = GPIO_PUPD_NO;
- GPIO_Config(GPIOA, &gpioConfig);
- }
- void test_gpio_toggle(void)
- {
- (GPIO_ReadOutputBit(GPIOA, GPIO_PIN_5) == BIT_SET) ? \
- GPIO_ClearBit(GPIOA, GPIO_PIN_5) : \
- GPIO_SetBit(GPIOA, GPIO_PIN_5);
- }
- void pwm1_capture_data(uint16_t duty, uint32_t pwm_hz)
- {
- pwm1_capture_duty = duty;
- pwm1_capture_hz = pwm_hz;
- }
- void pwm2_capture_data(uint16_t duty, uint32_t pwm_hz)
- {
- pwm2_capture_duty = duty;
- pwm2_capture_hz = pwm_hz;
- }
- // 应用初始化
- void app_init(void)
- {
- test_gpio_init();
- /* PWM输出 */
- bsp_tim_pwm_update_deal_func_register(test_gpio_toggle);
- bsp_tim_pwm_init(1);
- /* PWM捕获 */
- bsp_tim_capture_capture_data_func_register(1, pwm1_capture_data);
- bsp_tim_capture_capture_data_func_register(2, pwm2_capture_data);
- bsp_tim_capture_init();
- }
- // 应用任务
- void app_task(void)
- {
- /* PWM输出 */
- bsp_tim_pwm_duty_set(pwm1_output_duty, pwm2_output_duty);
- }
详细代码,请查看附件!
Capture.zip
(2.28 MB, 下载次数: 0)
|