历史上的今天
返回首页

历史上的今天

今天是:2024年08月22日(星期四)

正在发生

2019年08月22日 | STM32F103_通用定时器“输入捕获”测量输入脉冲宽度

2019-08-22 来源:eefocus

一、硬件设计

        选用通用定时器TIM5的CH1,其输入管脚为PA0,在开发板上PA0连接按键,当按键按下输入高电平,按键松开输入低电平,实验测量高电平的脉冲宽度。


二、软件设计

    1. 配置中断向量表的优先级


        因只使用一个中断 TIM5_IRQn,抢占优先级与子优先级可随意配置。


        代码如下:


static void  General_NVIC_Config(void)

{

    NVIC_InitTypeDef NVIC_InitStructure;

    

    NVIC_PriorityGroupConfig (NVIC_PriorityGroup_0);

    

    NVIC_InitStructure.NVIC_IRQChannel = GENERAL_TIM_IRQn;

    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;

    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;

    

    NVIC_Init(&NVIC_InitStructure);

}

    2. GPIO配置


        PA0配置为浮空输入模式。


static void General_GPIO_Gonfig(void)

{

    GPIO_InitTypeDef GPIO_InitStructure;

    

    RCC_APB2PeriphClockCmd(GENERAL_TIM_CH1_GPIO_CLK , ENABLE);

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;

    GPIO_InitStructure.GPIO_Pin = GENERAL_TIM_CH1_PIN;

    

    GPIO_Init(GENERAL_TIM_CH1_PORT, &GPIO_InitStructure);    

}

    3. 定时器模式配置,其中包含时基结构体、输入捕获结构体的初始化以及中断的开启。

static void GeneralTim_Config(void)

{

  // 开启定时器时钟,即内部时钟CK_INT=72M

    GENERAL_TIM_APBxClock_FUN(GENERAL_TIM_CLK,ENABLE);

 

/*--------------------时基结构体初始化-------------------------*/    

  TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;

    // 自动重装载寄存器的值,累计TIM_Period+1个频率后产生一个更新或者中断

    TIM_TimeBaseStructure.TIM_Period=GENERAL_TIM_PERIOD;    

    // 驱动CNT计数器的时钟 = Fck_int/(psc+1)

    TIM_TimeBaseStructure.TIM_Prescaler= GENERAL_TIM_PSC;    

    // 时钟分频因子 ,配置死区时间时需要用到

    TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;        

    // 计数器计数模式,设置为向上计数

    TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;        

    // 重复计数器的值,没用到不用管

    TIM_TimeBaseStructure.TIM_RepetitionCounter=0;    

    // 初始化定时器

    TIM_TimeBaseInit(GENERAL_TIM, &TIM_TimeBaseStructure);

 

    /*--------------------输入捕获结构体初始化-------------------*/    

    TIM_ICInitTypeDef TIM_ICInitStructure;

    // 配置输入捕获的通道,需要根据具体的GPIO来配置

    TIM_ICInitStructure.TIM_Channel = GENERAL_TIM_CHANNEL_x;

    // 输入捕获信号的极性配置

    TIM_ICInitStructure.TIM_ICPolarity = GENERAL_TIM_STRAT_ICPolarity;

    // 输入通道和捕获通道的映射关系,有直连和非直连两种

    TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;

    // 输入的需要被捕获的信号的分频系数

    TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;

    // 输入的需要被捕获的信号的滤波系数

    TIM_ICInitStructure.TIM_ICFilter = 0;

    // 定时器输入捕获初始化

    TIM_ICInit(GENERAL_TIM, &TIM_ICInitStructure);

    

    // 清除更新和捕获中断标志位

  TIM_ClearFlag(GENERAL_TIM, TIM_FLAG_Update|GENERAL_TIM_IT_CCx);    

  // 开启更新和捕获中断  

    TIM_ITConfig (GENERAL_TIM, TIM_IT_Update | GENERAL_TIM_IT_CCx, ENABLE );

    

    // 使能计数器

    TIM_Cmd(GENERAL_TIM, ENABLE);

}

    4. 输入捕获初始化函数

void GeneralTim_Init(void)

{

    General_NVIC_Config();

    

    General_GPIO_Gonfig();

        

    GeneralTim_Config();

}

    5. 中断函数

        首先判断定时器是否溢出定时周期,并做处理。然后上升沿捕获时将计数器寄存器的值清零,中断改为下降沿触发。下降沿捕获中断时,读取计数值,改为上升沿触发,开始捕获标识清零,结束捕获置1,。。。。。。。。


void GENERAL_TIM_INT_FUN(void)

{

    // 当要被捕获的信号的周期大于定时器的最长定时时,定时器就会溢出,产生更新中断

    // 这个时候我们需要把这个最长的定时周期加到捕获信号的时间里面去

    if ( TIM_GetITStatus ( GENERAL_TIM, TIM_IT_Update) != RESET )               

    {    

        TIM_ICUserValueStructure.Capture_Period ++;        

        TIM_ClearITPendingBit ( GENERAL_TIM, TIM_FLAG_Update );         

    }

 

    // 上升沿捕获中断

    if ( TIM_GetITStatus (GENERAL_TIM, GENERAL_TIM_IT_CCx ) != RESET)

    {

        // 第一次捕获

        if ( TIM_ICUserValueStructure.Capture_StartFlag == 0 )

        {

            // 计数器清0

            TIM_SetCounter ( GENERAL_TIM, 0 );

            // 自动重装载寄存器更新标志清0

            TIM_ICUserValueStructure.Capture_Period = 0;

      // 存捕获比较寄存器的值的变量的值清0            

            TIM_ICUserValueStructure.Capture_CcrValue = 0;

 

            // 当第一次捕获到上升沿之后,就把捕获边沿配置为下降沿

            GENERAL_TIM_OCxPolarityConfig_FUN(GENERAL_TIM, TIM_ICPolarity_Falling);

      // 开始捕获标准置1            

            TIM_ICUserValueStructure.Capture_StartFlag = 1;            

        }

        // 下降沿捕获中断

        else // 第二次捕获

        {

            // 获取捕获比较寄存器的值,这个值就是捕获到的高电平的时间的值

            TIM_ICUserValueStructure.Capture_CcrValue = 

            GENERAL_TIM_GetCapturex_FUN (GENERAL_TIM);

 

            // 当第二次捕获到下降沿之后,就把捕获边沿配置为上升沿,好开启新的一轮捕获

            GENERAL_TIM_OCxPolarityConfig_FUN(GENERAL_TIM, TIM_ICPolarity_Rising);

      // 开始捕获标志清0        

            TIM_ICUserValueStructure.Capture_StartFlag = 0;

      // 捕获完成标志置1            

            TIM_ICUserValueStructure.Capture_FinishFlag = 1;        

        }

 

        TIM_ClearITPendingBit (GENERAL_TIM,GENERAL_TIM_IT_CCx);        

    }        

}

     6. 主函数,计算脉冲宽度利用串口输出

         int main()

{

        uint32_t time;

    

    // TIM 计数器的驱动时钟

    float TIM_PscCLK = 72000000.0 / (GENERAL_TIM_PSC+1);

    

    USART_Config();

    GeneralTim_Init();

        

    printf("rn ----输入捕获测量脉宽实验----rn");

    while(1)

    {

        if(TIM_ICUserValueStructure.Capture_FinishFlag == 1)

        {

            time = (TIM_ICUserValueStructure.Capture_Period * (GENERAL_TIM_PERIOD + 1)

            + TIM_ICUserValueStructure.Capture_CcrValue + 1);

            

            printf("t=%fn",time/TIM_PscCLK);

            TIM_ICUserValueStructure.Capture_FinishFlag = 0;

            

        }

        

    }

}

 

   

  7. 相关宏定义      

#define            GENERAL_TIM                   TIM5

#define            GENERAL_TIM_APBxClock_FUN     RCC_APB1PeriphClockCmd

#define            GENERAL_TIM_CLK               RCC_APB1Periph_TIM5

#define            GENERAL_TIM_PERIOD            0XFFFF

#define            GENERAL_TIM_PSC              (72-1)

 

// TIM 输入捕获通道GPIO相关宏定义

#define            GENERAL_TIM_CH1_GPIO_CLK      RCC_APB2Periph_GPIOA

#define            GENERAL_TIM_CH1_PORT          GPIOA

#define            GENERAL_TIM_CH1_PIN           GPIO_Pin_0

#define            GENERAL_TIM_CHANNEL_x         TIM_Channel_1

 

// 中断相关宏定义

#define            GENERAL_TIM_IT_CCx            TIM_IT_CC1

#define            GENERAL_TIM_IRQ               TIM5_IRQn

#define            GENERAL_TIM_INT_FUN           TIM5_IRQHandler

 

// 获取捕获寄存器值函数宏定义

#define            GENERAL_TIM_GetCapturex_FUN                 TIM_GetCapture1

// 捕获信号极性函数宏定义

#define            GENERAL_TIM_OCxPolarityConfig_FUN           TIM_OC1PolarityConfig

 

// 测量的起始边沿

#define            GENERAL_TIM_STRAT_ICPolarity                TIM_ICPolarity_Rising

// 测量的结束边沿

#define            GENERAL_TIM_END_ICPolarity                  TIM_ICPolarity_Falling

 

 

// 定时器输入捕获用户自定义变量结构体声明

typedef struct

{   

    uint8_t   Capture_FinishFlag;   // 捕获结束标志位

推荐阅读

史海拾趣

CalAmp公司的发展小趣事

随着物联网技术的快速发展,车队管理成为了一个重要的应用领域。CalAmp公司凭借其深厚的技术积累和市场洞察力,成功推出了一款车队管理新解决方案。该方案通过直观的用户界面(UI)设计,为企业、政府和建筑机构提供了更为便捷、高效的车队管理工具。用户可以通过该界面轻松获取关键业务数据,如资产位置、驾驶行为和车辆状态等,从而加快智能决策,提高车队运营效率,降低成本并增强安全性。这一创新解决方案的推出,进一步巩固了CalAmp在车队管理领域的领先地位。

Galaxy ( Bel )公司的发展小趣事

在某年第一季度,CalAmp公司发布了其财报数据。根据财报,该季度公司实现营收7089.1万美元,虽然比市场预期的7566万美元略低6.30%,但仍然展现了稳健的增长态势。同时,公司的每股收益为-0.11美元,低于预期的0.04美元,这可能与公司在研发和市场拓展方面的持续投入有关。尽管如此,CalAmp公司在无线通信解决方案应用领域的广泛布局和深厚的客户基础,使得其整体业绩依然保持稳健。

锋鸣电子(Fengming)公司的发展小趣事

在稳固光伏胶膜市场的同时,福斯特并未停止前进的步伐。公司积极拓展产品品类,进入电子新材料领域。2014年,公司开始开发PCB用感光干膜,进军电子信息产业。感光干膜作为PCB产业最核心的工艺材料之一,对电子信息产业的发展具有重要意义。福斯特凭借其技术实力和市场洞察力,迅速在该领域取得突破,成为行业内的佼佼者。至2020年,公司感光干膜销量大幅增长,为公司带来了新的增长点。

芯力微(CHI Power)公司的发展小趣事

在电子行业的快速发展中,芯力微公司始终保持着敏锐的市场洞察力。2010年,随着智能手机市场的崛起,公司迅速识别到电源管理芯片的巨大潜力。通过持续的技术研发,芯力微成功推出了具有低压低功耗特点的电源管理芯片,赢得了市场的广泛认可。这一技术突破不仅帮助公司进入了新的市场领域,也为后续的发展奠定了坚实的基础。

CCS[Custom Computer Services]公司的发展小趣事

在电子行业中,产品质量和客户服务是企业生存和发展的关键。CCS公司始终坚持质量第一的原则,建立了严格的质量管理体系和客户服务体系。公司从原材料采购到产品生产、销售等各个环节都进行严格的质量控制,确保产品的质量和性能达到客户的期望。同时,CCS公司还提供了全方位的客户服务,包括售前咨询、售后服务和技术支持等,为客户提供了全方位的支持和帮助。

AVX公司的发展小趣事

随着业务的不断发展,AVX开始在美国本土进行大规模扩张。它在多个州设立了生产基地和销售网络,进一步提升了公司的产能和市场覆盖率。同时,AVX还积极开拓国际市场,与全球各地的客户建立了紧密的合作关系。这种全球化布局使AVX能够更好地满足客户需求,提升公司的竞争力。

问答坊 | AI 解惑

TI芯片选型指南

相信很多工程师都在用TI的产品 本人在此分享一下官网公布的选型指南 希望对面临选型困惑的工程师有帮助 http://focus.ti.com.cn/cn/analog/docs/selectionguides.tsp…

查看全部问答>

【藏书阁】数字信号处理课件

第00章 数字信号处理 绪论 27页 0.5M PDF格式.pdf 第01章 离散时间信号与离散时间系统基础 71页 1.7M PDF格式 .pdf 第02章 Z变换及离散系统分析 43页 1.1M PDF格式.pdf 第03章 离散傅立叶变换 65页 1.4M PDF格式.pdf 第04章 附:关于图象压缩 4 ...…

查看全部问答>

如何在WM5.0上安装sqlite?

如题:如何在WM5.0上安装sqlite?    wce上又该怎么装?…

查看全部问答>

printk奇怪问题,请高手指点!

小弟我在调试网卡驱动的时候写了下面语句:             static   long   long   count   =   0;           stati ...…

查看全部问答>

电路板打样超级便宜

最近发现一个做电路板便宜的地方  www.sz-jlc.com/o   5*5cm以内50元 10*10以内100元 到现在为止最便宜的了 分享一下哈哈…

查看全部问答>

ST10技术资料

有关ST10的技术资料介绍,请参考:http://mcu.st.com/mcu/inchtml.php?fdir=pages&fnam=st10http://mcu.st.com/mcu/modules.php?name=mcu&file=familiesdocs&FAM=17ST10的中文手册书籍(类似ST7一样)不久也会面世了!!…

查看全部问答>

CC3000 wifi模块有木有

soso姐,帮我问一下TI办事处,CC3000什么时候搞一个活动哈,我看了TI 官网的宣传片了,我想要学习一下wifi的实时性能,我看他的DEMO 的是实时性还可以呀…

查看全部问答>

纽扣电池请教

关于纽扣电池,使用万用表测试其两端电阻,发现只有几欧姆的样子,这个是正常的吗?此外,想请教一下,如果我将纽扣电池串接在5V的电压源上放电,当串联电压降低后可以认为其电流都出自纽扣电池内吗?…

查看全部问答>