找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1212|回复: 1
打印 上一主题 下一主题
收起左侧

单片机下降沿脉冲计数,下降沿进不去,不知道哪里配置出问题,求大佬指点

[复制链接]
跳转到指定楼层
楼主
本人小白一个
由于PIN44对应的引脚PC4没有定时器,于是将PIN44和43连接起来了。使用43对应的引脚PA7,配置为上拉输入,使用TIM8_CH1下降沿捕获计数,求指点了哪里出问题了计数进不去timer.c文件


TIM_ICInitTypeDef  TIM8_ICInitStructure;

void TIM8_Int_Init(u32 arr, u16 psc)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
    NVIC_InitTypeDef NVIC_InitStructure;

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM8, ENABLE);        //使能TIM8时钟
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE);  //使能GPIOC时钟

    GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_4;  //PC4 清除之前设置
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;//复用功能
//        GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
        GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
    GPIO_Init(GPIOC, &GPIO_InitStructure);


        
//        GPIO_PinAFConfig(GPIOC,GPIO_PinSource4,GPIO_AF_TIM8);
        
    //初始化定时器8 TIM8
    TIM_TimeBaseStructure.TIM_Period = arr; //设定计数器自动重装值
    TIM_TimeBaseStructure.TIM_Prescaler = psc;         //预分频器
    TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim
//        TIM_TimeBaseStructure.TIM_RepetitionCounter = 0; //为0,溢出一次就进中断一次,高级定时器必须设置
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
    TIM_TimeBaseInit(TIM8, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位

//        TIM_ClearITPendingBit(TIM8,TIM_IT_Update); //清除中断标志位,避免第一次自动进入中断一次
//        TIM_TIxExternalClockConfig( TIM8, TIM_TIxExternalCLK1Source_TI1,TIM_ICPolarity_Rising, 0xF );
        
    //初始化TIM8输入捕获参数
    TIM8_ICInitStructure.TIM_Channel = TIM_Channel_1; //CC1S=01         选择输入端 IC1映射到TI1上
    TIM8_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Falling;        //下降沿捕获
    TIM8_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; //映射到TI1上
    TIM8_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;         //配置输入分频,不分频
    TIM8_ICInitStructure.TIM_ICFilter = 0x00;//IC1F=0000 配置输入滤波器 不滤波
    TIM_ICInit(TIM8, &TIM8_ICInitStructure);
        
        


    //中断分组初始化
    NVIC_InitStructure.NVIC_IRQChannel = TIM8_UP_TIM13_IRQn;  //TIM8中断

    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;  //先占优先级2级
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;  //从优先级0级
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
    NVIC_Init(&NVIC_InitStructure);  //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器

    TIM_ITConfig(TIM8, TIM_IT_Update | TIM_IT_CC1, ENABLE); //允许更新中断 ,允许CC1IE捕获中断

    TIM_Cmd(TIM8, ENABLE );         //使能定时器2

}


u8  TIM8CH1_CAPTURE_STA = 0;        //输入捕获状态
u32        TIM8CH1_CAPTURE_VAL;        //输入捕获值
u32  TIM8CH1_CAPTURE_STB = 0;        //计数
//捕获状态
//[7]:0,没有成功的捕获;1,成功捕获到一次.
//[6]:0,还没捕获到低电平;1,已经捕获到低电平了.
//[5:0]:捕获低电平后溢出的次数(对于 32 位定时器来说,1us 计数器加 1,溢出时间:4294 秒)
//定时器2中断服务程序

void TIM8_UP_TIM13_IRQHandler(void)
{

    if((TIM8CH1_CAPTURE_STA & 0X40) == 0) //还未成功捕获
    {
        if (TIM_GetITStatus(TIM8, TIM_IT_Update) != RESET)

        {
            if(TIM8CH1_CAPTURE_STA & 0X80) //已经捕获到低电平了
            {
                if((TIM8CH1_CAPTURE_STA & 0X3F) == 0X3F) //高电平太长了
                {
                    TIM8CH1_CAPTURE_STA |= 0X40; //标记成功捕获了一次
                    TIM8CH1_CAPTURE_VAL = 0XFFFFFFFF;
                }
                else TIM8CH1_CAPTURE_STA++;
            }
        }

        if (TIM_GetITStatus(TIM8, TIM_IT_CC1) != RESET)//捕获1发生捕获事件
        {
            if(TIM8CH1_CAPTURE_STA & 0X80)                //捕获到一个上升沿
            {
                TIM8CH1_CAPTURE_STA |= 0X40;                //标记成功捕获到一次下降沿
                TIM8CH1_CAPTURE_VAL = TIM_GetCapture1(TIM8); //获取当前的捕获值
                TIM8CH1_CAPTURE_STB++;
                TIM_OC1PolarityConfig(TIM8, TIM_ICPolarity_Falling); //CC1P=0 设置为下降沿捕获
            }
            else                                                                  //还未开始,第一次捕获上升沿
            {
                TIM8CH1_CAPTURE_STA = 0;                        //清空
                TIM8CH1_CAPTURE_VAL = 0;
                TIM8CH1_CAPTURE_STA |= 0X80;                //标记捕获到了下降沿
                TIM_Cmd(TIM8, DISABLE);
                TIM_SetCounter(TIM8, 0);
                TIM_OC1PolarityConfig(TIM8, TIM_ICPolarity_Rising);                //CC1P=1 设置为上升沿捕获
                TIM_Cmd(TIM8, ENABLE);
            }
        }
    }

    TIM_ClearITPendingBit(TIM8, TIM_IT_CC1 | TIM_IT_Update); //清除中断标志位

}




main

TIM8_Int_Init(10000-1,8400-1);
while(1){
        if(TIM8CH1_CAPTURE_STA&0X40)//成功捕获到了一次低电平
                {
                        printf("count:%d \r\n",TIM8CH1_CAPTURE_STB);
                         TIM8CH1_CAPTURE_STA=0;                        //开启下一次捕获
                 }
                delay_ms(1000);

}

捕获.PNG (9.01 KB, 下载次数: 55)

捕获.PNG
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:123289 发表于 2022-3-26 15:51 | 只看该作者
走单步、设断点试试就知道了,注意如下:
1、引脚中断有无打开。
2、引脚中断有无被允许。
3、有无更高级的中断一直占用着CPU的时间。
4、引脚是否配制成输入。
5、用表测量一下引脚,是否真的输入了负脉冲。
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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