OpenEdv-开源电子网

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

求助各位大神和原子哥! 我参照教学视频的思路 自己写了一个定时器输入捕获的程序 但是不能用 还请各位大神指导一二

[复制链接]

1

主题

4

帖子

0

精华

新手上路

积分
21
金钱
21
注册时间
2021-3-8
在线时间
5 小时
发表于 2021-5-18 11:41:13 | 显示全部楼层 |阅读模式
5金钱
软件 mdk5  芯片是stm3f103zet6  
板子是精英开发板  实验10输入捕获实验(按压key_up键 在串口输出PA0高电平时间)
下面是我的代码,这个代码写入到单片机之后,灯都不会亮注释写的不好还请大神见谅

led.c


led.h


timer.c




extern u8 TIM5CH1_CAPTURE_STA;        //输入捕获状态       
extern u16 TIM5CH1_CAPTURE_VAL;        //输入捕获值



main.c



下面是标准例程 库函数版本
timer.c



main.c

最佳答案

查看完整内容[请看2#楼]

问题已经解决了
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

4

帖子

0

精华

新手上路

积分
21
金钱
21
注册时间
2021-3-8
在线时间
5 小时
 楼主| 发表于 2021-5-18 11:41:14 | 显示全部楼层
回复

使用道具 举报

1

主题

4

帖子

0

精华

新手上路

积分
21
金钱
21
注册时间
2021-3-8
在线时间
5 小时
 楼主| 发表于 2021-5-18 12:20:44 | 显示全部楼层
上面的图片好像没发出来,再以文字发一下我的错误版本
timer.c

#include "timer.h"
#include "delay.h"
#include "led.h"
//通用定时器3中断初始化
//这里时钟选择为APB1的2倍,而APB1为36M
//arr:自动重装值。
//psc:时钟预分频数
//这里使用的是定时器5 通道1
void TIM5_CAP_init(u16 arr, u16 psc)
{
        TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
        GPIO_InitTypeDef  GPIO_InitStructure;
        NVIC_InitTypeDef NVIC_InitStructure;
        TIM_ICInitTypeDef TIM_ICInitStruct;
       
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5, ENABLE);
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
       
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;                          //下拉输入
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                 //IO口速度为50MHz
        GPIO_Init(GPIOA, &GPIO_InitStructure);                                         //根据设定参数初始化GPIOA.0
        GPIO_SetBits(GPIOA, GPIO_Pin_0);               
       
        TIM_TimeBaseInitStruct.TIM_ClockDivision=TIM_CKD_DIV1;//时钟分割,Tdts
        TIM_TimeBaseInitStruct.TIM_CounterMode=TIM_CounterMode_Up;
        TIM_TimeBaseInitStruct.TIM_Period=arr;
        TIM_TimeBaseInitStruct.TIM_Prescaler=psc;
        TIM_TimeBaseInit(TIM5, &TIM_TimeBaseInitStruct);
       
        TIM_ICInitStruct.TIM_Channel = TIM_Channel_1;
        TIM_ICInitStruct.TIM_ICPolarity = TIM_ICPolarity_Rising;
        TIM_ICInitStruct.TIM_ICPrescaler = TIM_ICPSC_DIV1;        //设置分频,即几个上升沿触发一个捕获
        TIM_ICInitStruct.TIM_ICFilter=0X00;                //配置滤波器为不滤波
        TIM_ICInitStruct.TIM_ICSelection = TIM_ICSelection_DirectTI;
        TIM_ICInit(TIM5, &TIM_ICInitStruct);
       
        NVIC_InitStructure.NVIC_IRQChannel = TIM5_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
        NVIC_Init(&NVIC_InitStructure);
       
        TIM_ITConfig(TIM5, TIM_IT_Update|TIM_IT_CC1, ENABLE);//允许更新/溢出中断,允许CC1IE捕获中断
       
        TIM_Cmd(TIM5, ENABLE);
}

extern u8 TIM5CH1_CAPTURE_STA;        //输入捕获状态       
extern u16 TIM5CH1_CAPTURE_VAL;        //输入捕获值


//定时器5中断服务程序
void TIM5_IRQHandler(void)   //TIM3中断
{
        if ((TIM5CH1_CAPTURE_STA&0X80)==0) //未捕获成功
        {
               
                if (TIM_GetITStatus(TIM5, TIM_IT_CC1) != RESET)//检查指定的TIM捕获中断发生与否
                {
                       
                        TIM5CH1_CAPTURE_STA|=0X40;        //标志已经捕获到高电位
                        TIM5->CNT=0;
                        LED0=0;
                        TIM_ClearITPendingBit(TIM5,TIM_IT_CC1);
                        TIM_OC1PolarityConfig(TIM5,TIM_ICPolarity_Falling); //设置CCER寄存器 开始捕获下降沿
                }
                       
               
                if(TIM5CH1_CAPTURE_STA&0x40)        //检查是否已经捕获了上升沿
                {
                        if (TIM_GetITStatus(TIM5, TIM_IT_CC1) != RESET)//检查指定的TIM下降沿捕获中断发生与否
                        {
                                TIM5CH1_CAPTURE_STA|=0X80;
                                TIM5CH1_CAPTURE_STA&=0XBF;
                                TIM5CH1_CAPTURE_VAL=TIM5->CNT;
                                LED0=1;
                                TIM_ClearITPendingBit(TIM5,TIM_IT_CC1);
                                TIM_OC1PolarityConfig(TIM5,TIM_ICPolarity_Rising); //设置CCER寄存器
                        }
                       
                       
                        if (TIM_GetITStatus(TIM5, TIM_IT_Update) != RESET) //检查指定的TIM更新中断发生与否
                        {
                                TIM_ClearITPendingBit(TIM5, TIM_IT_Update  );  //清除TIMx的中断待处理位
                                if((TIM5CH1_CAPTURE_STA&0x3F)!= 0x3F)        //如果没有到达最大值
                                        TIM5CH1_CAPTURE_STA++;
                        }
                }
       
        }

}




main.c
#include "stm32f10x.h"
#include "delay.h"
#include "sys.h"
#include "led.h"
#include "usart.h"
#include "timer.h"

u8 TIM5CH1_CAPTURE_STA=0;        //输入捕获状态       
u16        TIM5CH1_CAPTURE_VAL=0;        //输入捕获值

int main()
{
        int t;

        delay_init();
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
        uart_init(115200);         //串口初始化为115200
        LED_init();

        TIM5_CAP_init(0xFFFF, 72-1); //以1Mhz的频率计数
        LED0=0;
        LED1=0;
       
        while(1)
        {
                delay_ms(10);//防抖
               
                if(TIM5CH1_CAPTURE_STA&0x80)
                {
                        t=TIM5CH1_CAPTURE_STA&0x3F;
                        t*=65536;
                        t+=TIM5CH1_CAPTURE_VAL;
                        t/=1e6;
                        printf("HIGH:%d us\r\n",t);//打印总的高电平时间
                        TIM5CH1_CAPTURE_STA=0;//开启下一次捕获
                }
               
        }
       
}



回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-23 19:13

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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