STM32 外部时钟脉冲计数实验

这篇具有很好参考价值的文章主要介绍了STM32 外部时钟脉冲计数实验。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

STM32 外部时钟脉冲计数实验



前言

最近在学正点原子的HAL库视频,通用定时器脉冲计数功能的实现,以前都习惯用标准库了,所以现在尝试参考HAL库的原理用标准库的思想来实现这个功能。


1、实验原理

本实验使用外部时钟模式1,外部输入引脚作为定时器的时钟来源。
使用开发板的 WK_UP 按键按下产生高电平脉冲作为定时器的计数器时钟来源,计数器工作在递增计数模式,那么每来一个上升沿信号,计数器就加一。即每按下一次按键产生一次高电平脉冲,计数器加一,一直计数到ARR的值溢出从新计数。

2、开发板原理图

stm32 脉冲计数,嵌入式单片机,stm32,单片机

2、定时器工作原理框图

stm32 脉冲计数,嵌入式单片机,stm32,单片机

外部时钟源信号通过通道 1 输入后,TI1 分别要经过滤波器、边沿检测器后来到 TI1FP1,被触发输入选择器选择为触发源,接着来到从模式控制器,从模式选择为外部时钟模式 1,这时候外部时钟源信号就会到达时基单元的预分频器,最后,经过分频后就可作为计数器的计数时钟了。外部时钟源信号的边沿计数个数会保存到计数器寄存器中,需要时直接读取 CNT 的值即可。

2、主要源码

示例代码如下:

void tim2_Init(u8 arr)
{
    GPIO_InitTypeDef GPIO_InitStructure = {0};
    TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure = {0};

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);       /* 使能TIM2时钟 */
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);      /* 使能GPIOA时钟 */

    GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_0;                 /* PA0 */
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;              /* 下拉输入 */
    GPIO_Init(GPIOA, &GPIO_InitStructure);                     /* 初始化GPIOA */
    GPIO_ResetBits(GPIOA, GPIO_Pin_0);                         /* IO初始化为低电平 */

    TIM_TimeBaseStructure.TIM_Period = arr;                    /* 设置重装载值 */
    TIM_TimeBaseStructure.TIM_Prescaler = 0;                   /* 预分频器为0 */
    TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;    /* 不分频 */
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;/* 向上计数模式 */
    TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);            /* 初始化TIM2时基单元 */

    TIM_ITRxExternalClockConfig(TIM2, TIM_TS_ETRF);            /* 配置定时器2外部触发 */
    TIM_ETRClockMode2Config(TIM2, TIM_ExtTRGPSC_OFF, TIM_ExtTRGPolarity_NonInverted, 0);/* 外部时钟模式2的配置 */
    TIM_Cmd(TIM2, ENABLE);                                     /* 使能定时器2 */
}

相关成员解析:

成员 说明
TIM_ExtTRGPSC_OFF TIM ETRP 关闭预分频
TIM_TS_ETRF TIM 外部触发输入
TIM_ExtTRGPolarity_Inverted TIM 外部触发极性翻转:低电平或下降沿有效
TIM_ExtTRGPolarity_NonInverted TIM 外部触发极性非翻转:高电平或上升沿有效
int main(void)
{
    u8 key ,count; 
    u8 oldcnt = 0;
    
    delay_init();           //延时函数初始化
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组为组2:2位抢占优先级,2位响应优先级
    uart_init(115200);      //串口初始化为 115200
    LED_Init();             //初始化与LED连接的硬件接口
    KEY_Init();
    tim2_Init(10);//计数值为10次
    while(1)
    {
        key = KEY_Scan(0);
        if(key == KEY1_PRES)
        {
            TIM_SetCounter(TIM2, 0);//清空计数值
        }
        
        count = TIM_GetCounter(TIM2);//获取计数值
        if(oldcnt != count)
        {
            oldcnt = count;
            printf("CNT:%d\r\n", oldcnt);
        }
    }
}

理想的实验结果:

stm32 脉冲计数,嵌入式单片机,stm32,单片机

不理想的实验结果:

stm32 脉冲计数,嵌入式单片机,stm32,单片机


3、总结

通用定时器的频率计数学习起来还是比较好理解的,只要把定时器的工作模式和工作原理框图弄明白就比较好理解了。
测试时有时候结果很不理想,数值跳的很明显,不确定是不是按键抖动引起的,还是我程序设计逻辑上不够严谨导致的。文章来源地址https://www.toymoban.com/news/detail-754769.html

到了这里,关于STM32 外部时钟脉冲计数实验的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 嵌入式学习笔记——STM32的时钟树

    在之前的所有代码编程的过程中,似乎每次都绕不开一个叫做时钟使能的东西,当时我们是在数据手册上直接看其挂接在那条时钟线上的,那么STM32内部的时钟到底是怎么一个构型呢,本文来对此做一个介绍。 老规矩,一个新的名词出现,首先需要搞清楚它是个啥,下图中对

    2024年02月02日
    浏览(53)
  • 嵌入式-stm32-江科大-EXTI外部中断

    1.1 STM32 中断系统 中断 是指在主程序运行过程中,出现了特定的中断触发条件(中断源),使得CPU暂停当前的程序,转而去处理中断程序,处理完成后又返回原来被暂停的位置继续执行, 当中断发生时是由硬件自动调用中断函数执行的,期间编译器会保护现场最后还原现场

    2024年01月25日
    浏览(51)
  • stm32嵌入式实验考核

    STM32 实验考核题目 1. 利用 STM32 小板实现:控制外接 LED 灯每隔 3 秒钟亮暗变换,同 时在 PC 机上显示 MCU 的计时时间,MCU 的初始时间由 PC 机 方设置。 2. 利用 STM32 小板实现:利用导线外接 GPIO 口模拟 2 个按键输入, 根据输入组合的四种情况,分别控制三色灯四种流水灯效果

    2024年02月03日
    浏览(49)
  • 嵌入式-Stm32-江科大基于标准库的GPIO4个小实验

    核心:本文共4个小实验: 第一个:LED灯闪烁 第二个:LED流水灯 第三个:按键控制LED 第四个:光敏传感器控制蜂鸣器 1.1 LED、蜂鸣器、面包板 LED:发光二极管,正向通电点亮,反向通电不亮。 有源蜂鸣器(本实验):内部自带振荡源,将正负极接上直流电压即可持续发声,频

    2024年01月21日
    浏览(61)
  • 嵌入式开发:使用STM32CubeMX 和 Keil uVision5实现两位数码管循环显示实验

    一、STM32CubeMx实现数码管 1、双击打开STM32CubeMX。 2、点击File选项,在File列表下选择New Project选项新建工程。 3、在图中所示位置的方框中输入我们使用的芯片型号来搜索芯片 4、与我们的搜索相关的芯片型号会在这里呈现,我们只需要选择我们需要的即可,这里我们双击第一个

    2024年02月08日
    浏览(49)
  • STM32 hal库使用笔记(三)定时器—输入捕获和计数脉冲

    目录 一、简介 1.定时器简介 2.输入捕获简介 3.原理介绍 二、HAL库配置 1.时钟树的设置 2.定时器时钟源选择 2.1 计数脉冲(代码对应3.1) 2.2 输入捕获(对应代码3.2)  三、代码编写 实验目的:利用定时器输入捕获实现LED翻转;按键充当外部时钟源,实现LED翻转 实验平台:正

    2024年02月04日
    浏览(58)
  • STM32自学☞定时器外部时钟案例

    本案例主要是通过外部时钟实现对射式红外传感器的计次,在oled显示屏上显示CNT的次数 #include \\\"stm32f10x.h\\\" #include \\\"stm32f10x_tim.h\\\" #include \\\"timer_interrupt.h\\\" #include \\\"stdint.h\\\" //初始化函数 void Timer_Init(void) {  /*开启时钟*/  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //开启TIM2的时钟  RCC_A

    2024年02月22日
    浏览(45)
  • 【STM32】STM32学习笔记-定时器定时中断 定时器外部时钟(14)

    1.1 TIM_InternalClockConfig 1.2 TIM_TimeBaseInit 1.3 TIM_TimeBaseInitTypeDef 1.4 TIM_ClearFlag 1.5 TIM_ITConfig 1.6 TIM_Cmd 1.7 中断服务函数 参考程序 1.8 TIM_ETRClockMode2Config timer.h timer.c main.c timer.h timer.c main.c 09-定时器定时中断.rar 10-定时器外部时钟.rar 参考: 【STM32】江科大STM32学习笔记汇总

    2024年02月03日
    浏览(53)
  • STM32初学-外部RTC时钟芯片DS3231

             RTC(Real_Time Clock) 即实时时钟,它是电子产品中不可或缺的东西。其最直接的作用就是时钟功能。细心的朋友可以发现,当我们的电脑或者手机没联网时,仍然可以正常显示日期与时钟,这就是RTC的功劳。         RTC的运行无需网络连接,只需一个频率固定的振

    2024年02月09日
    浏览(41)
  • STM32 学习笔记(六)定时器中断:内部时钟模式,外部时钟模式

    定时器是功能最强大,内容最复杂的32结构。 之前51用过的功能,定时产生中断。 输出比较,常用于产生 PWM 波形,驱动电机等。 输入捕获,测量方波频率。 编码器,读取正交编码器的波形。 最大定时时间:72M/65536/65536=中断频率,中断频率取倒数是最大定时时间。 定时器可

    2024年02月08日
    浏览(53)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包