RISC-V_GD32VF103-TIMER2 IC 输入捕获

使用为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-

个人见解,感谢阅读。

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值