STM32采用普通的IO口来测量PWM的频率

2023-11-16

STM32测量外部输入信号的频率的方法有很多:
  • 采用内部定时器输入捕获功能。
  • 采用普通的IO口设置外部中断+定时器的当时测量PWM信号的频率。

    这两种方式比较推荐使用第一种,比较使用内部的资源可以节省CPU资源的利用,
    当然当内部资源不够使用的时候,或者是说,硬件电路设计的时候没有连接相应的应引脚只能使用第二种方式了。

    本次由于硬件电路设计的不足,导致需要测量PWM输入信号的引脚没有接到相应的通道上,对此使用了第二种方式:
    注意:这里定时器中断的优先级要高于外部中断的优先级

思路如下:

  • 设置PWM输入信号的引脚为外部中断的方式,并且触发方式为GPIO_MODE_IT_RISING_FALLING 上升,下降沿均可触发。
  • 其次使能一个定时器TIM4,定时中断时间看自己需要测量频率来设置。(本次设置为2us –> 最大可测量的频率为50KHz)
  • 外部中断中,上升沿到来,清空计数器TIM4->CNT=0,置一个上升沿的标志位为1,代表计算PWM时间的开始tim4_PWM_cnt++。
  • 下降沿到来,置一个下降沿的标志为1.
  • 下一次上升沿到来,判断上一次是否为下降沿的标志,如果是,则代表PWM一个周期的时间已经到达。读取时间。PWM_Cycle = timer4_PWM_cnt*2. 并且把计数变量清零tim4_PWM_cnt = 0
  • 接着下一次下降沿到来,判断上一次是否为上升沿的标志,如果是,则代表一个周期高电平结束,读取时间,即为脉宽 PWM_Duty = timer4_PWM_cnt*2。

    具体c语言实现代码如下:
if(__HAL_GPIO_EXTI_GET_IT(GPIO_PIN_11) != RESET)
{                           
    HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_11);//调用中断处理公用函数  
    if(PWM_EN()==1)     //上升沿触发
    {
        TIM4->CNT=0;//这里清空TIM4计数。重新开始计数
        if((PWM_FLAG_DOWM==1)&&(PWM_FLAG_UP==2))//判断上一次是否为下降沿
        {
            PWM_Cycle = timer4_PWM_cnt*2;
            timer4_PWM_cnt=0;
        }
        PWM_FLAG_CNT = 1;

        PWM_FLAG_UP = 1;//上升沿标志
        PWM_FLAG_DOWM = 2;//上升沿标志
    }
    else//下降沿触发
    {
      if((PWM_FLAG_DOWM==2)&&(PWM_FLAG_UP == 1))//下降沿判断上一个状态是否为上升沿
      {
        PWM_Duty = timer4_PWM_cnt*2;
      }
     PWM_FLAG_DOWM=1;//下降沿标志
     PWM_FLAG_UP=2;//下降沿标志
}
void TIM4_Init(u16 arr,u16 psc)
{  
    TIM4_Handler.Instance=TIM4;                                 //通用定时器4
    TIM4_Handler.Init.Prescaler=psc;                            //分频系数
    TIM4_Handler.Init.CounterMode=TIM_COUNTERMODE_UP;           //向上计数器
    TIM4_Handler.Init.Period=arr;                               //自动装载值
    TIM4_Handler.Init.ClockDivision=TIM_CLOCKDIVISION_DIV1; //时钟分频因子
    HAL_TIM_Base_Init(&TIM4_Handler);
    HAL_TIM_Base_Start_IT(&TIM4_Handler);//使能定时器4和定时器4更新中断:TIM_IT_UPDATE   
}

void TIM4_IRQHandler(void)
{
    HAL_TIM_IRQHandler(&TIM4_Handler);
    if(PWM_FLAG_CNT == 1)//PWM上升沿到来标志
    {
        timer4_PWM_cnt++;
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

STM32采用普通的IO口来测量PWM的频率 的相关文章

  • 51单片机 数码管中断操作

    实践目的 1 掌握中断的概念和思想 2 掌握51单片机中断系统和相关软硬件设计 实践内容 1 利用单片机的P0口接数码管的字段脚 P1 0脚接共阴极 P3 2 P3 3引脚接独立按键产生外部中断信号 编写程序 当程序正常运行时数码管显示H字
  • c项目makefile多重定义错误

    这个问题是一个对应于创建的repexthis问题 在我的嵌入式 C 项目中 我有两个独立的板 我想为每个板创建两个 c 文件 master c 和 Slave c 其中包含自己的特定main 功能 我使用 stm32cumbemx 生成带有
  • 如何让printf在STM32F103上工作?

    我是 STM32F103 世界的新手 我有一个STM32F103的演示代码 我正在使用arm none eabi来编译它 我尝试了在谷歌上可以找到的内容 但到目前为止没有任何效果 我已经花了三天时间来解决这个问题 任何人都可以给我一个运行良
  • 134-基于stm32单片机矿井瓦斯天然气浓度温湿度检测自动通风系统Proteus仿真+源程序...

    资料编号 134 一 功能介绍 1 采用stm32单片机 LCD1602显示屏 独立按键 ds1302时钟 DHT11温湿度 电机 蜂鸣器 制作一个基于stm32单片机矿井瓦斯天然气浓度温湿度检测自动通风系统Proteus仿真 2 通过DH
  • 140-基于stm32单片机智能晾衣杆控制系统Proteus仿真+源程序

    资料编号 140 一 功能介绍 1 采用stm32单片机 LCD1602显示屏 独立按键 DHT11传感器 ds1302时钟 光敏传感器 蜂鸣器 LED灯 制作一个基于stm32单片机智能晾衣杆控制系统Proteus仿真 2 通过光敏传感器
  • 136-基于stm32单片机家庭温湿度防漏水系统设计Proteus仿真+源程序

    资料编号 136 一 功能介绍 1 采用stm32单片机 LCD1602显示屏 独立按键 DHT11传感器 蜂鸣器 制作一个基于stm32单片机家庭温湿度防漏水系统设计Proteus仿真 2 通过DHT11传感器检测当前温湿度 并且显示到L
  • 匹配 STM32F0 和 zlib 中的 CRC32

    我正在研究运行 Linux 的计算机和 STM32F0 之间的通信链路 我想对我的数据包使用某种错误检测 并且由于 STM32F0 有 CRC32 硬件 并且我在 Linux 上有带有 CRC32 的 zlib 所以我认为在我的项目中使用
  • [屏驱相关]【SWM166-SPI-Y1.28C1测评】+ 有点惊艳的开箱

    耳闻华芯微特许久了 看到论坛得评测活动赶紧上了末班车 毕竟对有屏幕得板子也是很喜欢得 京东快递小哥客客气气 微笑着把快递给了我 好评 直接拆了包 在此之前没看过视频号 所以这个圆盘盘得模具还是有点惊喜的 正面照如下 开机有灯光秀 还有动画
  • VS Code 有没有办法导入 Makefile 项目?

    正如标题所说 我可以从现有的 Makefile 自动填充 c cpp properties json 吗 Edit 对于其他尝试导入 makefile 的人 我找到了一组脚本 它们完全可以实现我想要实现的目标 即通过 VS Code 管理
  • 跟着野火学FreeRTOS:第一段(任务定义,切换以及临界段)

    在裸机系统中 系统的主体就是 C P U CPU CP U 按照预先设定的程序逻辑在 m a i n
  • STM32F207 I2C 测试失败

    我正在使用 STM32F207 微控制器在 STM3220G EVAL 板上学习嵌入式开发 我尝试通过连接同一芯片上的两个 I2C2 和 I2C3 模块并发送 接收字符来测试 I2C 接口 这是我当前编写的代码 使用 mdk arm 5 i
  • 无法使用 OpenOCD 找到脚本文件

    我正在尝试按照本教程将 OpenOCD 与我的 ST 发现板一起使用 https japaric github io discovery README html https japaric github io discovery READM
  • STM32F4XX的12位ADC采集数值超过4096&右对齐模式设置失败

    文章目录 一 前言 二 问题1 数值超过4096 三 问题1的排错过程 四 问题2 右对齐模式设置失败 五 问题2的解决方法 5 1 将ADC ExternalTrigConv设置为0 5 2 使用ADC StructInit 函数 一 前
  • for循环延时时间计算

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 前言 一 pandas是什么 二 使用步骤 1 引入库 2 读入数据 总结 前言 之前做led点亮的实验 好像是被delay函数影响了 因为delay参数设置的不对
  • 特殊寄存器

    特殊寄存器 文章目录 前言 一 背景 二 2 1 2 2 总结 前言 前期疑问 STM32特殊寄存器到底是什么 特殊寄存器怎么查看和调试代码 本文目标 记录和理解特殊寄存器 一 背景 最近在看ucosIII文章是 里面提到特殊寄存器 这就进
  • systick定时器

    systick定时器 文章目录 前言 一 前期疑惑 二 解答 1 关于systick是阻塞的吗 2 非阻塞 三 软件编写 总结 前言 这边记录systick相关知识点 一 前期疑惑 在学习systick志气啊 其实对于systick还是一脸
  • STM32 上的 ADC 单次转换

    我正在研究 STM32 F103x 上的 ADC 编程 并从最简单的情况 单次转换开始 测量内部温度传感器 连接到 ADC1 的值 并使用 USART 将其发送到 COM 端口 目标似乎很明确 但是当我尝试将源代码下载到闪存时 它不会向 C
  • STM32内部时钟

    我对 STM32F7 设备 意法半导体的 Cortex M7 微控制器 上的时钟系统感到困惑 参考手册没有充分阐明这些时钟之间的差异 SYSCLK HCLK FCLK 参考手册中阅读章节 gt RCC 为 Cortex 系统定时器 SysT
  • 在 Contiki 程序中使用 malloc

    考虑以下 Contiki 程序 include
  • HAL_Delay() 陷入无限循环

    我被 HAL Delay 函数困住了 当我调用此函数 HAL Delay 时 控制陷入无限循环 在寻找问题的过程中 我发现了这个 http www openstm32 org forumthread2145 threadId2146 htt

随机推荐

  • 怎么制作睡袋rust_怎么不花钱自己在野外制作吊床—户外手工技能(吊床露营的好处)...

    当你想到露营的时候 你会想到什么形象 可能是帐篷 几十年来 帐篷和露营旅行确实已经密不可分 但最近这种感觉已经开始发生变化 因为出现了另一种露营方式 吊床 这样的吊床在中美洲和南美洲已经很常见了 但现在在设计和材料上经历了许多进步 越来越受
  • C#开发---Aspose.Word操作Word文档(一)

    目录 1 书签赋值 2 新起一行添加文本 3 查找文档内标题 4 往pdf中插入目录 1 书签赋值 提前创建好word文档 插入书签 在程序中给书签赋值
  • linux编程获取本机IP地址

    getifaddrs 和struct ifaddrs的使用 获取本机IP 博客分类 Linux C编程 ifaddrs结构体定义如下 C代码 struct ifaddrs struct ifaddrs ifa next Next item
  • VMware Ubuntu安装详细过程(详细图解)

    说明 该篇博客是博主一字一码编写的 实属不易 请尊重原创 谢谢大家 一 下载Ubuntu镜像文件 下载地址 http mirrors aliyun com ubuntu releases 16 04 进入下载页面 如下图选择版本点击即可下载
  • Android NDK 编译时出现make (e=2): 系统找不到指定的文

    今天编译一个so文件时出现如下错误 C Users xxj Desktop test OpenCamera gt ndk build armeabi v7a Compile SeetafaceSo lt face detection cpp
  • java中访问修_Java中常见的访问/非访问修饰符

    Java中常见的访问 非访问修饰符 Java中常见的访问 非访问修饰符 1 Java中有下列常见访问修饰符 private 私有变量和方法 非外部类 只能被声明它们的类的实例所使用 default 类中的数据 方法和它本身能够被声明为默认d
  • 如何新建Quartus工程—FPGA入门教程

    这一章我们来实现第一个FPGA工程 LED流水灯 我们将通过流水灯例程向大家介绍一次完整的FPGA开发流程 从新建工程 代码设计 综合实现 管脚约束 下载FPGA程序 掌握本章内容 大家就算正式的开始入门FPGA开发了 1 1 2 新建工程
  • 老Java程序员花两天做了个消消乐(天天爱消除)

    老Java程序员花两天做了个消消乐 天天爱消除 引言 一直就想做一个消消乐 这次正好找到了素材 就自己琢磨写了一个 我觉得这个游戏难点就在消除 以及消除后的下落 其他的地方也就还好 这次做完了写个文章大家唠一波 效果图 实现思路 1 绘制窗
  • PostgreSQL

    PostgreSQL 是一个免费的对象 关系数据库服务器 ORDBMS 在灵活的BSD许可证下发行 PostgreSQL 开发者把它念作 post gress Q L PostgreSQL 的 Slogan 是 世界上最先进的 开源关系型数
  • VMware16虚拟机安装及配置(保姆级教程),这一篇就够了

    1 虚拟机VMware的下载官网地址 https www vmware com cn html VMware 安装 1 打开下载好的 exe 文件 即可开始安装 2 点击下一步 3先勾选我接受许可协议中的条款 然后点击下一步 4 自定义安装
  • 05-----撤销add,commit,push的方法(包括如何删除已经push到远程库的单个文件或者文件夹)

    1 撤销add添加的多余文件 git reset filename 撤销add到缓冲区的部分文件 2 撤销commit的多余文件 git log 先使用查看已经提交的commitId节点 git reset commit id 回退到上一个
  • 为什么我选用了springcloud而不是dubbo

    写好的代码越来越满足不了需求 因为需求总是在不断的变化 在技术选型时 实在是心有余而力不足 思来想去 就考虑了使用微服务架构来实现 功能模块化 今天主要讲讲为什么需要微服务架构 还是以故事的形式呈现 一 认识微服务 阶段一 单体服务 话说小
  • C语言密码破译

    请用C语言编程序将 China 译成密码 密码规律是 用原来的字母后面第4个字母代替原来的字母 例如 字母 A 后面第4个字母是 E 用 E 代替 A 因此 China 应译为 Glmre 请编一程序 用赋初值的方法使 cl c2 c3 c
  • IntelliJ IDEA(编码篇):集成Junit4插件,快速生成测试类

    目录 安装JUnitGenerator V2 0 修改JUnitGenerator V2 0的配置 生成JUnit4测试用例 注意 安装JUnitGenerator V2 0 1 通过网络安装 如下 2 手动下载插件安装 插件下载 http
  • 全网最简单解决方式1045-Access denied for user root@localhost(using password:YES)

    最近 Javaweb小学期 和 数据库小学期 答辩 极限赶大作业 唉 1045 Access denied for user root localhost using password YES 连接数据库时出现了这个问题 网上大概有3种解决
  • React Hooks:Effect无限回调踩坑

    场景 我的目的是通过Effect来模拟组件的componentDidMount 在渲染完成之后 通过setTimeout来处理操作 向keyIndex中push一个新的元素 并更新keyIndex 但是这个操作我确定只会执行一次 错误代码如
  • a和ajax跳转页面,ajax 页面跳转

    ajax 页面跳转 内容精选 换一换 面包屑组件 是项目中常用的一种组件 结构大致是 首页 菜单1 菜单2 菜单3 接入配置完成后 伙伴可以在能力开放页面配置伙伴平台回跳地址 以便于客户在完成订单支付后能返回到伙伴销售平台或者客户支付订单需
  • 适合下班后的副业,4个比较实际的副业兼职

    每一个上班族 都有一个发财的梦想 希望可以通过自己的努力 让领导看到自身价值 得到赏识 快速升职加薪 赚得盆满钵满 这样是不错 而且不少上班族单纯依靠工作就实现了这样的梦想 但是对于绝大部分普通人来说 还只存在于 想 如果现有的工作暂时没有
  • pdf注释上锁_如何在iPad上突出显示和注释PDF

    pdf注释上锁 Khamosh Pathak Khamosh Pathak The iPad is a great way to read PDFs but what if you want to highlight parts of it
  • STM32采用普通的IO口来测量PWM的频率

    STM32测量外部输入信号的频率的方法有很多 采用内部定时器输入捕获功能 采用普通的IO口设置外部中断 定时器的当时测量PWM信号的频率 这两种方式比较推荐使用第一种 比较使用内部的资源可以节省CPU资源的利用 当然当内部资源不够使用的时候