使用为TIMER2的通道0,PA6。
固件库函数介绍和之前的TIMER0 的是一致的。
输入捕获结构体如下。
timer.c
#include "timer.h"
#include "gd32vf103.h"
#include "gd32vf103_libopt.h"
#include "led.h"
// ************************************************************************************************************** //
//TIMER2 输入捕获初始化
void TIMER2_Input_Init()
{
timer_parameter_struct timer_initpara; //TIMER0初始化结构体
timer_ic_parameter_struct timer_icinitpara; //TIMER0输入捕获结构体
rcu_periph_clock_enable(RCU_TIMER2); //使能TIMER0时钟
rcu_periph_clock_enable(RCU_GPIOA); //使能GPIA时钟,CH0 = PA6
rcu_periph_clock_enable(RCU_AF); //使能复用时钟
gpio_init(GPIOA, GPIO_MODE_IPU, GPIO_OSPEED_50MHZ, GPIO_PIN_6); //使能 PA6
timer_deinit(TIMER2);
timer_struct_para_init(&timer_initpara); //将初始化结构体参数变为初始值
timer_initpara.prescaler = 107; //预分频
timer_initpara.alignedmode = TIMER_COUNTER_EDGE; //对齐模式
timer_initpara.counterdirection = TIMER_COUNTER_UP; //计数方向
timer_initpara.period = 65535; //周期
timer_initpara.clockdivision = TIMER_CKDIV_DIV1; //时钟分频
timer_initpara.repetitioncounter = 0; //重复计数器
timer_init(TIMER2, &timer_initpara);
timer_channel_input_struct_para_init(&timer_icinitpara); // //将输入捕获结构体参数变为初始值
timer_icinitpara.icpolarity = TIMER_IC_POLARITY_RISING; //通道输入极性
timer_icinitpara.icselection = TIMER_IC_SELECTION_DIRECTTI; //通道输入模式选择
timer_icinitpara.icprescaler = TIMER_IC_PSC_DIV1; //通道输入预分频器
timer_icinitpara.icfilter = 0x0; //通道输入捕获滤波
timer_input_capture_config(TIMER2,TIMER_CH_0,&timer_icinitpara);
timer_auto_reload_shadow_enable(TIMER2); //自动重装载使能
timer_interrupt_flag_clear(TIMER2,TIMER_INT_FLAG_CH0); //清除CH0 的中断标志位
timer_interrupt_enable(TIMER2,TIMER_INT_FLAG_CH0); //CH0 通道中断使能
eclic_irq_enable(TIMER2_IRQn,1,0); //使能中断线
timer_enable(TIMER2);
}
// ************************************************************************************************************** //
//TIMER2 中断服务函数
uint8_t TIMER2_i = 0;
void TIMER2_IRQHandler(void)
{
if(timer_interrupt_flag_get(TIMER2,TIMER_INT_FLAG_CH0) != RESET)
{
timer_interrupt_flag_clear(TIMER2,TIMER_INT_FLAG_CH0);
TIMER2_i++;
printf("TIMER2 输入捕获触发-->> %d \n\r",TIMER2_i);
}
}
timer.h
#ifndef __TIMER_H__
#define __TIMER_H__
#include "gd32vf103.h"
#include "systick.h"
#include "stdio.h"
#include "string.h"
// ************************************************************************************************************** //
//函数体声明
void TIMER2_Input_Init(void);
void TIMER2_IRQHandler(void);
#endif
main.c
#include "gd32vf103.h"
#include "gd32vf103c_start.h"
#include "systick.h"
#include <stdio.h>
#include <string.h>
#include "led.h"
#include "key.h"
#include "usart0.h"
#include "timer.h"
// ************************************************************************************************************* //
//主函数
int main(void)
{
uint8_t key = 0;
eclic_global_interrupt_enable();
eclic_priority_group_set(ECLIC_PRIGROUP_LEVEL3_PRIO1);
LED_Init(); //LED灯初始化
KEY_Init(); //KEY按键初始化
USART0_Init(); //USART0初始化
TIMER0_Init(); //TIMER0初始化
TIMER2_Input_Init(); //TIMER2 输入捕获使能
printf("串口测试 USART TEST 0123456789 \n\r");
while(1)
{
key = KEY_Scan();
if(key == 1) {printf("按键按下 LED 反转 \n\r");}
}
}
在输入捕获的时候,使能同定时器更新中断,可能 大概 会导致printf无法使用,只有中断中断的printf打印才会正常。-x_x-
个人见解,感谢阅读。