搜索

GD32捕获脉冲计数(捕获NST1001温度传感器脉冲)

[复制链接]
38|3
 楼主 | 2020-11-17 15:21 | 显示全部楼层 |阅读模式
如题,使用stm32固件库写了捕获脉冲的例程,但是本人用的单片机是gd32,程序执行后发现只能进入中断一次捕获一个脉冲,但是理论上应该对每个脉冲进行中断计数,有没有做过类似例程的小伙伴啊,不知道问题出在哪里。

使用特权

评论回复
 楼主 | 2020-11-17 15:22 | 显示全部楼层
//定时器2通道2输入捕获配置

TIM_ICInitTypeDef  TIM2_ICInitStructure;

void TIM2_Cap_Init(u16 arr,u16 psc)
{         
        GPIO_InitTypeDef GPIO_InitStructure;
        TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
        NVIC_InitTypeDef NVIC_InitStructure;
        TIM_DeInit(TIM2);

        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);        //使能TIM2时钟
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);  //使能GPIOB时钟
       
        GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_0;  //PB0 清除之前设置  
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //PB0 输入  
        GPIO_Init(GPIOB, &GPIO_InitStructure);
        GPIO_ResetBits(GPIOB,GPIO_Pin_0);                                                 //PB0 下拉
       
        //初始化定时器2 TIM2         
        TIM_TimeBaseStructure.TIM_Period = arr; //设定计数器自动重装值
        TIM_TimeBaseStructure.TIM_Prescaler =psc;         //预分频器   
        TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
        TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
  
        //初始化TIM2输入捕获参数
        TIM2_ICInitStructure.TIM_Channel = TIM_Channel_2; //CC1S=01         选择输入端 IC1映射到TI1上
  TIM2_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;        //上升沿捕获
  TIM2_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; //映射到TI1上
  TIM2_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;         //配置输入分频,不分频
  TIM2_ICInitStructure.TIM_ICFilter = 0x00;//IC1F=0000 配置输入滤波器 不滤波
  TIM_ICInit(TIM2, &TIM2_ICInitStructure);
       
        //中断分组初始化
        NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;  //TIM2中断
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  //先占优先级2级
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;  //从优先级0级
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
        NVIC_Init(&NVIC_InitStructure);  //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器
       
       
//        TIM_ARRPreloadConfig(TIM2, ENABLE);  
//        TIM_ClearITPendingBit(TIM2, TIM_IT_CC2); //清除中断标志位
//        TIM_ITConfig(TIM2,TIM_IT_CC2,ENABLE); //使能CC1IE捕获中断               
       
//  TIM_Cmd(TIM2,ENABLE );         //使能定时器2

}


//u8  TIM2CH2_CAPTURE_STA=0;        //输入捕获状态                                                   
//u16        TIM2CH2_CAPTURE_VAL;        //输入捕获值
u16 COUNT;
u16 C_FLAG;

//定时器2中断服务程序         
void TIM2_IRQHandler(void)
{
   u16 IC2Value;
        if (TIM_GetITStatus(TIM2, TIM_IT_CC2) != RESET)//捕获1发生捕获事件
        {
                COUNT++;
    TIM_ClearITPendingBit(TIM2, TIM_IT_CC2); //清除中断标志位
                TIM2->SR &= ~0x0404;  //软件清除CC2IF和CC2OF标志
                IC2Value = TIM_GetCapture2(TIM2);
                printf("IC2Value:%d摄氏度\n",IC2Value);
                C_FLAG=1;
          
        }

}

使用特权

评论回复
 楼主 | 2020-11-17 15:23 | 显示全部楼层
#include "led.h"
#include "delay.h"
#include "sys.h"
#include "timer.h"
#include "usart.h"
//ALIENTEK Mini STM32开发板范例代码9
//输入捕获实验   
//技术支持:www.openedv.com
//广州市星翼电子科技有限公司



extern u16 COUNT;
extern u16 C_FLAG;
float temp;

int main(void)
{       
  int16_t num=0;
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);// 设置中断优先级分组2
        delay_init();                     //延时函数初始化       
        TIM2_Cap_Init(0xffff,0);                //以1Mhz的频率计数
    while(1)
        {
                GPIO_SetBits(GPIOB,GPIO_Pin_0); //NST1001置高,芯片上电工作
                C_FLAG=0;
                delay_ms(1);
//                TIM_ARRPreloadConfig(TIM2, ENABLE);  
//                TIM_ClearITPendingBit(TIM2, TIM_IT_CC2); //清除中断标志位
                TIM_ITConfig(TIM2,TIM_IT_CC2,ENABLE); //使能CC1IE捕获中断       
                TIM_Cmd(TIM2,ENABLE );         //使能定时器2
                if(C_FLAG==1)
                {
                        C_FLAG=0;
                        delay_ms(26);
                        if(C_FLAG==0)
                        {
                          TIM_ITConfig(TIM2,TIM_IT_CC2,DISABLE);//关闭捕获中断
                                num=COUNT;
                                temp=num*0.0625-50.0625; //实际温度
                                printf("电源温度为:%f摄氏度\n",temp);  //打印温度值
                                COUNT=0;
//                                TIM_ARRPreloadConfig(TIM2, ENABLE);  
//                                TIM_ClearITPendingBit(TIM2, TIM_IT_CC2); //清除中断标志位
                                TIM_ITConfig(TIM2,TIM_IT_CC2,ENABLE); //开启捕获中断
                       
                        }
                       
                }
        }
               
}

使用特权

评论回复
 楼主 | 2020-11-17 15:24 | 显示全部楼层
以上是我的timer配置代码和主程序,麻烦有经验的小伙伴解答一下问题在哪里呢

使用特权

评论回复
扫描二维码,随时随地手机跟帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则

我要发帖 我要提问 投诉建议 申请版主

快速回复

您需要登录后才可以回帖
登录 | 注册
高级模式

论坛热帖

在线客服 快速回复 返回顶部 返回列表