搜索
查看
编辑修改
首页
UNITY
NODEJS
PYTHON
AI
GIT
PHP
GO
CEF3
JAVA
HTML
CSS
搜索
盐析白兔
这个屌丝很懒,什么也没留下!
关注作者
热门标签
jquery
HTML
CSS
PHP
ASP
PYTHON
GO
AI
C
C++
C#
PHOTOSHOP
UNITY
iOS
android
vue
xml
爬虫
SEO
LINUX
WINDOWS
JAVA
MFC
CEF3
CAD
NODEJS
GIT
Pyppeteer
article
热门文章
1
安卓开发设置软件媒体声音_futter实现设置手机扬声器
2
Unity 3D游戏编程自学#2——C#面向对象_unity c# 面向对象游戏开发案例
3
python opencv 三维重建_SFM三维重建(Python+OpenCV)
4
AIGC绘画基础——Midjourney关键词大全+万能公式_meiging生成图标精准词
5
Agent AI智能体,塑造智能新纪元_ai智能体的工具调用能力
6
基于Zookeeper实现分布式锁
7
开源项目Cesium for Unity Samples安装与使用指南
8
MySQL使用Mycat实现分库分表-读写分离_mycat 分库分表
9
告别龟速,从GitHub快速下载项目的技巧分享,简单又高效!_github项目下载
10
推荐 7 个牛哄哄 Spring Cloud 实战项目_piggymetrics
当前位置:
article
> 正文
利用stm32来产生1M,1K,1Hz的3个方波(转)_stm32f411发方波
作者:盐析白兔 | 2024-08-05 03:31:51
赞
踩
stm32f411发方波
http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=3762261&bbs_page_no=1&bbs_id=3020
下面把问题具体化:
1。利用微控制器来产生1M、1K、1Hz的3个方波
2。3个方波都必须非常精准(假定系统使用的晶体是非常准确的)
3。效率要高,包括代码短,占用CPU的时间少,因为STM32不能产生了3个方波后,其他的事情就做不了。
4。最后考虑如何实现3个方波的同步问题
二、问题的讨论与分析
产生方波,当然是使用T/C了。那么为什么说“T/C溢出中断+中断服务,在中断服务中将某个I/O输出取反......”是“愚蠢的”?大多数的书上不都是这样介绍和举例的吗(尤其是那些只会51的朋友,可能也就认为这是唯一的方法了)。
先说说“枪毙”上面方法的原因。如果是产生1K的方波,或许还能马马乎乎说的过去。可是1M的方波就有问题了。要产生频率为1M的方 波,那么周期是1us,T/C的定时中断间隔为0.5us(取反输出,2次为一个方波周期)。在看STM32的系统时钟,最高为72M。那么在0.5us 内,STM32能执行几条指令?大约36条(按1MPS/1M算)指令执行的时间。如果考虑中断的响应需要的时间,中断现场保护和中断现场恢复,中断退出 的时间,在中断服务中你能做多少事情?
就算你水平高,使用汇编,在中断中能完成1M方波的以及另外2个方波的产生,你的STM32还能做什么事情?已经被这3个方波吊死了!
因此,正确的方法,应该采用定时器配备的比较匹配输出功能,或PWM波的产生功能(50%的PWM)。由于这2个定时器的增强功能在 51中是没有的,所以很多人不会想到这点。但是新的微控制器中配备定时器都具备这样的功能,10几年前推出的AVR就已经有了,何况是STM32?
当然用STM32,就要认真学习STM32的手册(至少看2份:STM32 103器件手册和硬件参考声明书)。我是要用STM32通用的几个T/C来做这件事,所以重点看TIMx的部分。
天呀,STM32的通用T/C功能如此的强大和复杂,不得不仔细学习。
经过分析和研究,决定采用TIM2产生1M方波,采用TIM3产生1K方波,具体的思路、方法和具体计算与主要的配置如下:
1。系统采用8M外部晶体产生的时钟,(不使用PLL)
2。AHB和APB1的分频系数都是1,时钟为8M。APB1可以提供TIM2、TIM3、TIM4作为计数时钟,本例中只将APB1作为TIM2的计数时钟:8M
3。TIM2使用8M的APB1作为计数时钟,TIM2的预分频器为1分频,采用通道4比较匹配,触发取反输出TIM2_OC4(在PA3脚)。
4。TIM2的重载寄存器为3(4分频),C4通道比较寄存器为3
5。TIM2设置为主定时器,比较相等事件产生触发时钟(2M),作为TIM3的计数时钟
6。TIM3使用TIM2比较相等事件产生的触发时钟2M作为计数时钟,TIM3的预分频器为1分频,采用通道1比较匹配,PWM方式1工作,输出TIM3_OC1(在PA6脚)。
7。TIM3的重载寄存器为1999(2000分频),C1通道比较寄存器为1000
8。TIM3设置为副定时器,采用TIM2比较相等事件产生触发时钟(2M)作为计数时钟(由于TIM2、TIM3都是硬件计数,保证TIM2的产生1M方波和的TIM3产生的1K方波完全同步)
简单说明一下:
TIM2采用比较匹配后自动触发取反输出的工作方式,TIM2从0计数到3后与比较寄存器的值相等了,当第4个计数脉冲到后,自动将 PA3的引脚电平取反,同时由于TIM2的重载值也为3,因此第4个计数脉冲到后TIM2返回0开始计数,所以8个计数脉冲,PA3输出一个方波,相当与 8M/8,产生1M方波。
TIM2同时为主定时器,产生1M方波,就有2M的比较相等事件发生,该2M事件作为TIM3的计数时钟,由TIM3分频后产生1K方波(参考:STM32F10xxx硬件参考手册的使用一个定时器作为另一个的预分频器部分)。
TIM3采用PWM工作方式产生1K的方波。计数值到1000,与比较寄存器的值相等,会自动把PA6取反,当计数值到达1999后, 与重载寄存器相同,第2000个计数脉冲到达,TIM3自动回0,并再次把PA6取反。这样在PA6脚上产生与PA3上1M方波同步的1K方波。
以上产生1M和1K的方波方法,只要做完TIM的初始化后,在PA3和PA6上自动产生了,不需要使用任何中断,以后程序也不需要做任何的控制和管理(相当硬件产生的方波),CPU可以完全让出做其他的事情。效率极高!
下面是具体工程代码,更具体的配置请参考代码配置和器件手册学习体会吧。我还是使用STM32_Init.c进行初始化配置的,比使用库简单方便,而且易懂。点击此处下载
ourdev_513426.rar(文件大小:303K)
(原文件名:stm32_demo_4.rar)
例程中只是产生1M、1K方波。利用TIM4,采用相同的方法,再产生1个1Hz的方波应该是没有问题的。赶兴趣的自己试试吧。
三、注意点:
1。如果TIMx采用内部系统时钟作为计数时钟的话,还需要经过几关:系统时钟----》AHB时钟(带分频器)----》APB1(带分频器)。APB1的最高频率为36M。
2。TIMx本身的分频器,0为1分频,1为2分频,2为3分频......
3。TIMx的重载寄存器中的值,就是计数器的上限值,当计数器工作在单程UP方式时,到达重载寄存器中的值,再下一个脉冲就是溢出,
4。自动比较匹配输出或PWM的输出引脚通常为2个,可以通过软件配置选择其中的一个。本例中采用确省的输出脚,没有重新配置。
STM32的TIMx功能非常强大,能提供了多种不同的方式来实现本题3个方波的产生。当然,功能越强,使用也越复杂。希望本应用笔记能起到抛砖引玉的作用。
声明:
本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:
https://www.wpsshop.cn/w/盐析白兔/article/detail/930628
推荐阅读
article
STM32
PWM
设置
TIM
_
OCMODE
_
PWM
1与
TIM
_
OCMODE
_
PWM
2的电平区别_ti...
当
PWM
设置为
TIM
_
OCMODE
_
PWM
1时,定时器周期溢出时,OC输出为高电平,最后拉低是因为调用了库函数HAL_T...
赞
踩
article
5
.
STM32
TIM
PWM
库函数
(基于正点原子
STM32
板)
_
timepwm
库函数
...
TIM
通用计时器介绍
TIM
配置void
TIM
_
Config(uint16
_
t Channel2Pulse, uint1...
赞
踩
article
STM32
库函数学习
TIM
篇_
htim
->
instance
=
=
tim3
...
1、HAL_StatusTypeDef HAL_
TIM
_Base_Init (
TIM
_HandleTypeDef * h...
赞
踩
article
stm32
TIM
定时器
中断
函数
学习笔记(一)
_
中断
函数
计时器
怎么用...
函数
意义: 第一个参数为需要选择哪个
定时器
,
TIM
1-8;第二个参数为时基单元的参数结构体。(在使用该
函数
前,需要定义时...
赞
踩
article
STM32
配置
TIM
定时
中断常用库
函数
_
stm32
定时
器
中断
函数
...
单片机学习!_
stm32
定时
器
中断
函数
stm32
定时
器
中断
函数
单片机学习! 目录 ...
赞
踩
article
STM32
(四):
Systick
(标准
库函数
)_
stm32
标准
库函数
配置
systick
...
本文详细介绍了如何使用
STM32
单片机的
Systick
定时器实现LED灯的交替闪烁,包括
Systick
的工作原理、寄存器...
赞
踩
article
STM32
HAL
库
定时
中断
和编码输入_
htim
->
instance
...
这些基础的东西看视频很费时间而且有过基础的在学习只是库不太清楚,希望我总结的库使用的一些使用能节约一点大家的时间。voi...
赞
踩
article
STM32
HAL
库函数——
HAL
_
TIM
_
Base
_
Start
_IT()详解_hal-
tim
-ba...
以
STM32
G030C8T6中的
HAL
_
TIM
_
Base
_
Start
_IT()函数为例,进行解释;_hal-
tim
-ba...
赞
踩
article
STM32
--
定时器
中断
TIM
_回调
函数
中关闭
中断
...
定时器
中断
TIM
_回调
函数
中关闭
中断
回调
函数
中关闭
中断
...
赞
踩
article
【
>
STM
>
3>2>】(
>
3>)
>
串口>通信实验
>
_>
>
huart>-
>
>
instance>...
>
串口>通信实验( 1 )定义函数uart
>
_>init用来调用HAL
>
_>UART
>
_>Init初始化
>
串口>参数配置:UART
>
_>Hand...
赞
踩
article
STM32
-
HAL
库03-
TIM
定时器
实现
LED
闪烁_
tim3
hal
库配置...
STM32
HAL
库
TIM
定时器
实现
LED
闪烁_
tim3
hal
库配置
tim3
hal
库配置 ...
赞
踩
article
【
STM32
】基于
蓝桥
杯
嵌入式
开发板实现
按
键
单击
、双击、长
按
(通用模板)_
蓝桥
杯
按
键
长
按
...
基于
蓝桥
杯
嵌入式
开发板实现
按
键
的
单击
,双击,长
按
检测与处理,使用定时器后台检测,防止占用前台资源,可以随便移植到任何单片...
赞
踩
article
【
STM32
】
FPU
的启用和基于
ARM
-
DSP
库函数的实时
信号
RMS
计算_
stm32f4
开启fpu...
最近,由于项目需要,学习了一下F4的
FPU
浮点数运算单元的使用方法和
DSP
库函数的建立使用,在此简单总结记录。_stm3...
赞
踩
article
STM32
——
中断
篇_
stm32
中断
...
本文详细介绍了
STM32
中的
中断
机制,包括
中断
的概念、
中断
优先级、NVIC的作用、EXTI的外部
中断
功能、AFIO的复用...
赞
踩
article
视觉
巡线
小车——
STM32
+
OpenMV
_
csdn
巡线
小车...
该系列文章主要介绍,如何使用来实现一个基于视觉处理的自主
巡线
小车。主要包括,减速电机的驱动,速度采集,PID速度闭环控制...
赞
踩
article
视觉
巡线
小车
——
STM32
+
OpenMV
(一)_
stm32
openmv
循迹
小车
...
通过本文,就可以对减速电机进行简单的控制,以及速度的采集了。同时可以自行加入OLED等显示屏,显示所采集的速度,也可以通...
赞
踩
article
视觉
巡线
小车
——
STM32
+
OpenMV
(二)_
stm32
巡线
小车
...
通过本文,使减速电机实现了速度闭环控制,利用野火PID调试助手进行PID参数的整定,得到满意的参数。_
stm32
巡线
小车
...
赞
踩
article
物
联网
毕设
--
智能
天气
时钟
(
STM32
+
WIFI
+
时钟
+知心
天气
)_南邮电装实习创新
项目
天气
时钟
...
这个智能设备通过硬件端和APP端协同工作,实现了多方面的功能。硬件端包括
STM32
F103C8T6微控制器进行程序中控和...
赞
踩
article
FFT
STM32
+
ap
FFT
程序源代码_
fftstm32
...
适用于
STM32
F103平台,使用AD7606同步采集两路正弦信号,内置1024点全相位快速傅里叶变换(
ap
FFT
)算法...
赞
踩
article
基于
STM32
F407
的
LVGL
工程模板(
MSP3526
屏幕),包含
FreeRTOS
版和裸机版,ST...
LVGL
(轻量级和通用图形库)是一个免费和开源的图形库,它提供了创建嵌入式GUI所需的一切,具有易于使用的图形元素,美丽...
赞
踩
相关标签
stm32
单片机
嵌入式硬件
c#
定时中断
pwm
编码器输入
STM32
串口通信
蓝桥杯
驱动开发