基于STM32的自动重装载auto-reload preload以及影子寄存器

STM32定时器配置避坑指南:auto-reload preload与影子寄存器详解 本文详细解析了STM32定时器配置中的auto-reload preload与影子寄存器机制,帮助开发者避免常见配置错误。通过对比51单片机与STM32定时器的差异,深入讲解影子寄存器的工作原理及实战配置技巧,提升定时器应用的稳定性和精确性。 阅读详情
AI摘要

本文围绕STM32开发中定时器的使用展开,对比51开发,介绍了auto - reload preload相关配置。阐述了影子寄存器在预装载时的缓冲作用,以及使能和不使能auto - reload preload的不同效果,还说明了更新事件允许位等设置,最后总结了其应用场景。

目录

写在前面

正文

总结


写在前面

        在使用cubeMX开发stm32,会经常用到定时器,并通过定时器产生中断计数来定期地执行某些任务。在配置时会遇到auto-reload preload 。这让熟悉51开发时解触到的定时器产生中断后自动重装载计数值让其产生下一次中断名字有点相似但实际并不是一回事。于是便有了这篇文章。

箭头所指的寄存器有影子即代表有它们有影子寄存器。

 

正文

在51开发时,自动重装载定时器的值是为了保证下一次计数值溢出时重新装载计数值产生定时器中断。

而本文所说的影子寄存器是在预装载时真正地起了缓冲作用,

STM32F429第十九篇之基本定时器实验详解 前言 本次博客更新了HAL库的版本。以后的博客都会采用此HAL库版本。 HAL库版本: STM32Cube_FW_F4_V1.25.0 本篇博客主要介绍基本定时器中的源码解析,会涉及以下三个部分: 以整点原子定时器中断实验的程序为蓝本的程序解析 重点的结构体介绍 个人根据解析结果,最后分享自己的写的源代码 需要注意的是:本文介绍的源代码使用的并非基本定时器TIM6或者TIM7,而是通用定时器TIM3。但是,他们程序上是兼容的,只需将TIM3当做基本定时器即可。在最后的自我分享代码中,会严格的使用TI 阅读详情

相关推荐

STM32定时器配置避坑指南:auto-reload preload与影子寄存器详解(附CubeMX实操)

本文深入解析STM32定时器配置中的auto-reload preload机制与影子寄存器工作原理,帮助开发者避开常见误区。通过CubeMX实操指南,详细讲解如何正确配置定时器参数,确保系统时序精度和稳定性,特别适用于PWM生成和电机控制等场景。

weixin_28396629的博客 303

STM32再复习(五)7.24下午

文章目录定时器(完)PWM 输出 定时器(完) 通过定时器中断配置,每500ms中断一次,然后中断服务函数中控制LED实现LED1状态取反(闪烁)。 Tout(溢出时间)=(ARR+1)(PSC+1)/Tclk。PSC就是分频系数,ARR就是计数值(自动重装载值),PSC+1为分频系数,因为不为1,所以通用定时器频率为APB1*2=84M,达到这个计数就会发生溢出中断,Tclk就是我上述分析的时钟源频率的倒数。而时钟频率为通用定时器时钟频率,为84M.溢出时间为一次中断事件內计数定时器计数的次数乘频率。 P

weixin_45802947的博客 2081

深入解析STM32定时器中的影子寄存器与自动重装载机制

本文深入解析了STM32定时器中影子寄存器与自动重装载机制的核心原理。通过对比51单片机,详细阐述了预装载寄存器与影子寄存器的“双缓冲”结构,以及ARPE配置如何控制参数更新时机,从而确保定时器在PWM输出、精确计时等应用中的周期稳定性和时序精度。

weixin_29219539的博客 628

手把手教你玩转STM32定时器:从auto-reload preload到PWM模式实战

本文深入解析STM32定时器的核心机制,重点阐述Auto-Reload Preload(自动重装载预装载)与影子寄存器的协同工作原理。通过对比立即更新与同步更新两种模式,并结合PWM输出、动态调整频率/占空比以及定时器中断等实战案例,指导开发者如何配置CubeMX以生成稳定、无毛刺的时序信号,确保嵌入式代码的可靠性与可预测性。

weixin_29271053的博客 140

STM32定时器核心:PSC与ARR寄存器原理与配置实战

在嵌入式系统开发中,定时器是控制时序和生成精确时间基准的核心外设。其工作原理基于时钟分频与计数机制,通过预分频器降低输入时钟频率,再配合自动重装载值设定计数周期,共同决定定时器的溢出时间。这项技术对于实现精准延时、PWM波形生成和输入捕获等功能具有关键工程价值,广泛应用于电机控制、通信协议和传感器数据采集等场景。本文以STM32为例,深入解析PSC(预分频器)和ARR(自动重装载寄存器)的协同工作机制,特别是影子寄存器机制对动态调整频率的保障作用,并通过PWM生成和长周期定时等实战案例,帮助开发者掌握定时器

weixin_34248705的博客 505

STM32定时器核心:ARR与PSC寄存器原理、配置与高级应用

在嵌入式系统与微控制器开发中,定时器是核心外设,用于实现精准时序控制、PWM生成和事件触发。其工作原理基于时钟分频与计数机制,通过预分频器和自动重装载寄存器协同设定时间基准。理解寄存器直接操作能提升对硬件底层的掌控力,优化实时性、精度与资源效率。在工程实践中,这尤其适用于电机控制、电源管理和通信协议等场景,其中PWM分辨率与频率的权衡是关键设计考量。本文聚焦STM32的ARR与PSC寄存器,深入解析其配置逻辑、动态调整方法及常见调试技巧,帮助开发者从寄存器层面掌握定时器的核心调速机制。

weixin_30732487的博客 321

STM32定时器PSC/ARR/时钟源计算避坑指南:从寄存器到实战

定时器是STM32开发中最基础也最容易出错的外设之一。很多工程师在配置PSC、ARR或时钟源时,会遇到定时时间不准确、PWM频率偏差、修改参数不生效等看似诡异的问题。这些问题的根源往往在于寄存器的“减1”规则、影子寄存器的预装载机制,以及时钟树中APB分频与定时器时钟倍频的关系。理解定时器的工作原理,掌握分频和计数周期的计算逻辑,是精准控制时序、实现稳定PWM输出和输入捕获的关键。本指南从定时器的基础概念出发,结合工程实践中的高频错误场景,系统梳理PSC、ARR和时钟源的配置要点,帮助开发者快速定位并解决定

weixin_34174322的博客 455

STM32 PWM原理与实战:从定时器寄存器到稳定波形

PWM(脉宽调制)是嵌入式系统中控制模拟量的核心技术,其本质是通过定时器计数器与比较寄存器的协同工作,实现高精度占空比输出。理解其底层原理需掌握预分频器(PSC)、自动重装载值(ARR)和捕获比较寄存器(CCR)三者间的数学关系,以及向上计数模式下电平翻转的触发机制。该技术广泛应用于LED调光、电机调速、舵机控制等场景,尤其在STM32平台中,不同定时器(如TIM2/TIM1)的硬件能力差异(如是否支持死区、MOE使能、影子寄存器)直接决定工程可行性。本文以STM32F103C8T6为例,结合CubeMX配

weixin_30735745的博客 417

STM32定时器PWM:ARR与Pulse关系详解与动态调整实战

在嵌入式系统与电机控制领域,脉宽调制(PWM)是一种基础且关键的信号生成技术,其核心在于通过调节脉冲宽度来控制能量输出。PWM的实现原理依赖于定时器的周期与占空比设定,其中自动重装载寄存器(ARR)定义了信号的周期,而捕获/比较寄存器(CCRx)中的Pulse值则决定了有效电平的宽度,两者共同决定了占空比。理解ARR与Pulse的协同工作机制,对于实现稳定、无毛刺的波形输出具有重要技术价值,尤其是在需要动态调整频率或占空比的场景,如电机调速、LED调光等。本文聚焦于STM32定时器的PWM模式,深入剖析影子

weixin_33829657的博客 423

STM32定时器ARR缓冲模式与溢出时间计算原理

定时器是嵌入式系统中实现精确延时、PWM生成和事件调度的核心外设。其工作原理围绕计数器、预分频器(PSC)和自动重装载寄存器(ARR)的协同展开,关键在于理解‘硬件计数从0开始’这一本质,从而准确推导溢出时间公式 Tout (ARR+1)×(PSC+1)/Fck_psc。ARR缓冲模式(ARPE位控制)通过解耦寄存器写入与计数过程,显著提升动态定时精度,避免中断服务函数内临界区操作引入的时序误差。该机制在LED呼吸灯、电机FOC控制、多定时器同步等典型嵌入式应用场景中具有不可替代的技术价值,是STM32通

weixin_33193177的博客 359

STM32高级定时器时基核心:ARR预装载与RCR周期倍增原理

自动重装载寄存器(ARR)和重复计数器(RCR)是嵌入式系统中实现高精度、确定性时序控制的基础硬件机制。ARR通过预装载机制(ARPE)分离软件写入与硬件生效时机,保障计数周期一致性;RCR则在高级控制定时器中引入可编程的更新事件节拍,将基础计数周期扩展为(ARR+1)×(RCR+1)倍,显著提升事件触发的时序确定性与CPU效率。这类机制广泛应用于电机驱动SVPWM同步、数字电源多相交错、高保真音频PWM调制等对实时性与相位精度要求严苛的工业场景。本文深入解析STM32高级定时器中ARR与RCR的协同工作原

weixin_29155599的博客 64

Ubuntu 24.04 LTS与Windows 11远程桌面连接:从xrdp闪退到xfce4桌面环境的实战排障

本文详细解决了在Ubuntu 24.04 LTS上使用xrdp连接Windows 11远程桌面时遇到的登录后闪退问题。通过分析日志,定位到默认GNOME桌面环境与xrdp的兼容性冲突,并提供了将桌面环境更换为轻量且兼容性更佳的XFCE4的完整实战解决方案,包括安装、关键配置修改及服务重启步骤,确保远程连接稳定可靠。

mango的博客 807

对比实验系列:Efficientdet环境配置及训练个人数据集

可以通过下方链接下载Efficientdet源码。

Yayisheng的博客 4586

高等数学/概率论/数理统计/线性代数/离散数学面试-核心概念-问题理解

特征值与特征向量是线性代数中的概念,它们与线性变换有关。在线性变换中,如果存在非零向量 v ,使得当该向量通过变换后,其方向不变,只是长度发生了变化,那么这个向量 v 就是特征向量。而这个长度变化的比例因子,即变换前后向量长度的比值,称为特征值。数学公式表示:通俗易懂的解释:想象一下,你有一个可以伸缩的橡皮筋,这个橡皮筋可以代表一个向量。现在,你有一个特殊的机器,它可以改变橡皮筋的形状,但不会改变它延伸的方向。当你把橡皮筋放入机器中,机器会拉伸或压缩橡皮筋,但橡皮筋的方向保持不变。

m0_64198455的博客 2292

投第一篇SCIE英文期刊(详细步骤)

一个投稿SCIE英文期刊的过程

weixin_48849679的博客 1万+

数据包络分析(超效率-SBM模型)附python代码

超效率-SBM模型超效率SBMpython代码(部分) 这段时间差不多忙完了,终于有时间可以来经营我的博客了。 上阵子挺多人私信我,原谅我记性不好,可能没有回复全。 这篇文章是超效率的扩展。 超效率SBM SBM本身就是非径向模型(non-radial model),想要了解径向超效率的请自行去前面翻阅。 上篇文章说到super-SBM的一个模型,公式为: 这个模型是分式模型,我们可以通过charnes cooper变换,将其转变成为: python代码(部分) 在编程过程中,本来我以为第一个模型是无

weixin_43217288的博客 3万+

Pycharm环境配置完整教程

本文主要介绍python解释器安装、Pycharm环境配置以及运行第一个程序的零基础的教程,即使是python小白也能正确配置相应的python学习环境哦!

悠眠小虫的博客 2万+

用Keil5给CH552G编程:手把手配置8051开发环境+LED闪烁实战

本文详细介绍了如何使用Keil5为CH552G单片机配置8051开发环境,并完成LED闪烁实战。从获取必要软件、安装WCH器件库到创建工程、编写程序及烧录,手把手指导开发者避开常见陷阱,特别适合从STC转向CH552G的开发者。

weixin_30733003的博客 539

卸载python弹框报错:Could not set file security for file ‘D:\Config.Msi\abd5.rbf‘. Error: 5. Verify...如何解决?

🏆本文收录于 《全栈 Bug 调优(实战版)》 专栏。专栏聚焦真实项目中的各类疑难 Bug,从成因剖析 → 排查路径 → 解决方案 → 预防优化全链路拆解,形成一套可复用、可沉淀的实战知识体系。无论你是初入职场的开发者,还是负责复杂项目的资深工程师,都可以在这里构建一套属于自己的「问题诊断与性能调优」方法论,助你稳步进阶、放大技术价值 。

**My Coding Family** 6487

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

上一篇: 关于Java开发Idea中编码,解码以及解决中文乱码的实践经验
下一篇: ESP32使用AT MQTT 固件发布主题信息返回ERROR解决
昊月光华
博客等级 码龄6年 340粉丝 158原创
评论 7
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值