OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4432|回复: 1

高级定时8 输入捕获,读取脉冲宽度相差很大,请帮忙看下问题在哪?

[复制链接]

3

主题

13

帖子

0

精华

新手上路

积分
43
金钱
43
注册时间
2020-8-3
在线时间
7 小时
发表于 2022-9-21 21:34:12 | 显示全部楼层 |阅读模式
1金钱
void TIM8_Cap_Init(u16 arr,u16 psc)
{                 
        RCC->APB2ENR|=1<<13;           //TIM8 时钟使能
        RCC->APB2ENR|=1<<4;            //使能PORTC时钟  
         
        GPIOC->CRL&=0XF0FFFFFF;        //PC6 清除之前设置  
        GPIOC->CRL|=0X08000000;        //PC6 输入   
        GPIOC->ODR|=0<<6;                //PC6 下拉
          
        TIM8->ARR=arr;                  //设定计数器自动重装值   
        TIM8->PSC=psc;                  //预分频器

        TIM8->CCMR1|=1<<0;                //CC1S=01         选择输入端 IC1映射到TI1上
        TIM8->CCMR1|=0<<4;                 //IC1F=0000 配置输入滤波器 不滤波
        TIM8->CCMR1|=0<<10;         //IC2PS=00         配置输入分频,不分频
  //TIM8->CCMR1|=1<<2;
       
        TIM8->CCER|=0<<1;                 //CC1P=0        上升沿捕获
        TIM8->CCER|=1<<0;                 //CC1E=1         允许捕获计数器的值到捕获寄存器中

        TIM8->DIER|=1<<1;           //允许捕获中断                               
        TIM8->DIER|=1<<0;           //允许更新中断       
        TIM8->CR1|=0x01;            //使能定时器2
        MY_NVIC_Init(2,0,TIM8_CC_IRQn,2);//抢占2,子优先级0,组2          
}

//捕获状态
//[7]:0,没有成功的捕获;1,成功捕获到一次.
//[6]:0,还没捕获到高电平;1,已经捕获到高电平了.
//[5:0]:捕获高电平后溢出的次数
u8  TIM8CH1_CAPTURE_STA=0;        //输入捕获状态                                                   
u16        TIM8CH1_CAPTURE_VAL;        //输入捕获值
//定时器5中断服务程序         
void TIM8_CC_IRQHandler(void)
{                     
        u16 tsr;
        tsr=TIM8->SR;
        if((TIM8CH1_CAPTURE_STA&0X80)==0)//还未成功捕获       
        {
                if(tsr&0X01)//溢出
                {            
                        if(TIM8CH1_CAPTURE_STA&0X40)//已经捕获到高电平了
                        {
                                if((TIM8CH1_CAPTURE_STA&0X3F)==0X3F)//高电平太长了
                                {
                                        TIM8CH1_CAPTURE_STA|=0X80;//标记成功捕获了一次
                                        TIM8CH1_CAPTURE_VAL=0XFFFF;
                                }else TIM8CH1_CAPTURE_STA++;
                        }         
                }
                if(tsr&0x02)//捕获1发生捕获事件
                {       
                        if(TIM8CH1_CAPTURE_STA&0X40)                //捕获到一个下降沿                
                        {                                 
                                TIM8CH1_CAPTURE_STA|=0X80;                //标记成功捕获到一次高电平脉宽
                            TIM8CH1_CAPTURE_VAL=TIM8->CCR1;        //获取当前的捕获值.
                                 TIM8->CCER&=~(1<<1);                        //CC1P=0 设置为上升沿捕获
                        }else                                                                  //还未开始,第一次捕获上升沿
                        {
                                TIM8CH1_CAPTURE_STA=0;                        //清空
                                TIM8CH1_CAPTURE_VAL=0;
                                TIM8CH1_CAPTURE_STA|=0X40;                //标记捕获到了上升沿
                                 TIM8->CNT=0;                                        //计数器清空
                                 TIM8->CCER|=1<<1;                                 //CC1P=1 设置为下降沿捕获
                        }                    
                }                                                                                   
        }
        TIM8->SR=0;//清除中断标志位             
}


extern u8  TIM8CH1_CAPTURE_STA;                //输入捕获状态                                                   
extern u16        TIM8CH1_CAPTURE_VAL;        //输入捕获值
int main(void)
{                                          
        u32 temp=0;         
        float cap;
        Stm32_Clock_Init(9);        //系统时钟设置
        uart_init(72,115200);        //串口初始化为115200
        delay_init(72);                            //延时初始化
        //LED_Init();                                  //初始化与LED连接的硬件接口
        TIM5_Cap_Init(0XFFFF,72-1);        //以1Mhz的频率计数
           while(1)
        {
               
                delay_ms(1000);
printf("%d\r\n",TIM8CH1_CAPTURE_STA&0X80);               
                if(TIM8CH1_CAPTURE_STA&0X80)//成功捕获到了一次高电平
                {
                        temp=TIM8CH1_CAPTURE_STA&0X3F;
                        printf("%d\r\n",temp);
                        temp*=65536;                                        //溢出时间总和
                        printf("%d\r\n",TIM8CH1_CAPTURE_VAL);
                        temp+=TIM8CH1_CAPTURE_VAL;                //得到总的高电平时间
                       
                        cap=(temp/706.86)*0.976;
                       
                        printf("HIGH:%.2fnF\r\n",cap);        //打印总的高点平时间
                        delay_ms(1000);
                        TIM8CH1_CAPTURE_STA=0;                        //开启下一次捕获
                }
        }
}


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2022-9-23 01:27:14 | 显示全部楼层
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-26 03:39

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表