自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(59)
  • 收藏
  • 关注

原创 为何实现不了定时器DMA Burst传输?

有人使用STM32F4系列开发产品,程序运行过程中需要不时地对外输出一串驱动脉冲,并要求这几串脉冲的频率可变、占空比固定。他想到使用基于STM32定时器的DMA BURST传输。具体点说,他期望不时地通过TIM3的CH1输出一串频率可变、占空比固定的脉冲然后停下来。这个思路在原理上是没问题的,可是他在测试过程中发现怎么也折腾不出预期的效果。他目前使用的芯片是STM32F401,虽有点老旧,但我查看...

2023-05-02 10:04:44 464

原创 利用非对称PWM模式体验编码器功能

通常在STM32芯片的通用TIMER或高级TIMER都带编码器功能,支持基于1路或2路输入的编码脉冲计数。我们一般外接正交编码器,使用2路输入。TIMER硬件基于2路输入的相差特征来确定计数方向并依据方向对计数器做递增或递减操作。正交编码器一般使用5根线连接,分别为A、B、 Z信号线及VCC和GND电源线。其中,A、B两路是存在相差的同频信号。Z信号即零点信号,当编码器旋转到某位置时,它会发出一个...

2023-04-29 17:12:39 502

原创 巧用外设复位修改只读寄存器

有STM32开发者用到STM32F429芯片开发产品,并用到其中的CAN外设。在CAN应用过程中有个专门针对收发出错情况进行次数统计的两个计数器,其值通过错误状态寄存器CAN_ESR中的REC[7:0]和TEC[7:0]两个字段来体现,CAN硬件会根据错误数据大小做适当响应或处理。根据寄存器描述得知,TEC[7:0]和REC[7:0]的值在这个寄存器里面是只读的。而此时的STM32用户有个强烈的需...

2023-04-26 07:46:33 255

原创 为何修改BASEPRI寄存器无效?

有STM32用户发现在操作BASEPRI特殊功能寄存器时,根本不起作用。比方,它目前配置了几个中断,优先级各不相同,按照STM32CubeMx里的配置分别为2、3、4不等,当他在BASEPRI寄存器里写这几个数字中的任意一个时,发现BASEPRI的数字始终是0,没有任何效果。我们知道,通过配置 BASEPRI寄存器非0值来给系统中的中断响应设置门槛,当中断优先级低于某个级别时将不会得到CPU的响应...

2023-04-23 08:08:09 337

原创 巧用STM32片内RTC亚秒特性之应用示例

绝大多数STM32系列里的RTC都具有亚秒【或称子秒】计数单元。为了了解亚秒特性及功能,不妨先看RTC的功能框图。本文中的有关截图若无特别说明均来自STM32L4系列参考手册。RTC的时钟源【RTCCLK】可以是LSE、LSI或者HSE/32,由RTCCLK最终变成日历的秒脉冲驱动信号经过了2次分频。先经过上图中A处的异步分频单元,默认分频系数是128,形成ck_apre时钟,默认情况下该时钟频率...

2023-04-15 11:23:39 923

原创 关于SYSTICK的COUNTFLAG标志的小疑惑

前不久在研究SYSTICK有关问题阅读相关技术资料时,无意间产生了个小疑惑。问题是这样的,我们知道SYSTICK定时器是个24位向下计数器,每当发生从1记到0时会让一个名为COUNTFLAG的标志位置1,如果此时SYSTICK的滴答中断请求使能了的话,可以对CPU发起中断请求。根据我们平常STM32的开发经验,通常各种外设事件发起中断请求时,往往有相应的事件标志跟中断响应关联,在中断服务程序里并将...

2023-03-26 09:33:17 502 1

原创 聊聊一个STM32中断处理问题

先看一段代码:while(1) {if(EXTI_Sign==1) {HAL_Delay(Period);HAL_NVIC_EnableIRQ(EXTI2_3_IRQn);HAL_NVIC_EnableIRQ(EXTI2_3_IRQn);EXTI_Sign=0;。。。。。。} }有人使用STM32G0系列的芯片开发产品,有段功能测试验证代码如上所示,相同的函数...

2023-03-22 07:54:54 380

原创 为何延时函数不起作用?

有人利用STM32做开发,基于片内SYSTICK定时器做延时,即利用SYSTICK的周期性溢出中断来实现指定延时。可是他发现自己编写的延时函数似乎不起作用。代码也很简单,颇为奇怪。我这里基于他的功能模拟一段测试代码,如下截图所示:上面代码在主循环里,每一轮循环就是先让LED闪烁5次,然后熄灭一会。就这样循环进行。其中,有个全局变量Delay,决定每次延时长短。uint32_t Delay; /...

2023-03-17 08:07:35 1579

原创 如何开关Systick定时器的中断使能?

我们知道,STM32芯片里的ARM处理器都集成了1个24位向下计数的具备自动重装功能的SYSTICK定时器,功能比较单纯,就是计数定时。它常用来作为OS的滴答时钟,或者作为基本的计数时基。比方在各个RTOS系统里往往把SYSTICK作为滴答时钟,对于OS来讲,用它做时基可以提高代码移植方面的便利性,反正只要使用Arm核的芯片都有这个SYSTICK定时器。再比方,ST公司的HAL库一般默认将SYST...

2023-03-12 11:40:36 2984

原创 本来同步的信号为何有相差了?

有人使用STM32H7系列芯片开发产品,其中用到TIM1/TIM8两个定时器做PWM输出,并且TIM1/TIM8建立起主从关系同时启动,使用完全相同的时间参数和PWM配置,各自输出3路同频同相的PWM驱动信号。不过,在使用过程中,可能时不时地需要暂停两个定时器的输出,等到适当时机再启动全部通道PWM输出。可他发现,2个定时器的PWM输出刚开始还同步得好...

2023-03-03 08:24:05 224

原创 为何主程序运行不下去?

有人使用STM32F446做产品开发,用到TIM1的4个通道做PWM输出。具体使用是这样的,选择CHI1采样PMW模式做PMW输出。CH2、CH3、CH4采用比较切换模式结合DMA输出PWM波形,其中各通道的CCR值通过DMA基于比较事件周期性循环修改。客户使用CubeMx做图形化配置后生成基于HAL库的工程,然后添加相关用户代码。组织完用户代码后,不论代码顺序如何调整,发现总是最多只能启动2路使...

2023-02-28 07:30:04 128

原创 为何空闲事件中断多进了一次?

有人在使用STM32的UART收发并开启空闲中断时,有时会发现空闲中断相比预期多进一次的情况。比方,本来以为只会进3次空闲中断的结果进了4次;或者说根本没开启接收,一使能空闲中断就立即进一次中断服务程序;有时即使在使能空闲中断之前还特意做了空闲事件标志的清零也会发生类似情况。下面我找了块STM32开发板,选择USART1做自发自收的测试。也的确可以重现问题。下面是我的测试代码的main程序:#de...

2023-02-26 16:10:45 669 2

原创 又能闻花香了

前不久,几乎举国上下在同一时间段内整齐划一地被感染了新冠。很多人感染后都不同程度地出现味觉、嗅觉失灵的情形。本人也有相同经历。这几天,味觉恢复,嗅觉也在慢慢恢复中。既能闻到诱人的煎饼香,也能闻到清新的花香了。今天在此分享两个STM32应用中的实战案例,权作提醒,以免重蹈覆辙。案例1:系统联机工作时,Flash编程偶发性失败有人使用STM32F4系列芯片做开发,代码里涉及到FLASH编程。他发现FL...

2023-01-10 19:30:11 117

原创 STM32 DMA编程时的一个应用小提醒

有人使用STM32H7芯片做些事情,发现基于ST公司的HAL库开发UART1的DMA收发时可以轻松实现,而当使用ST的LL库组织代码时,却没法实现UART的DMA传输。感觉上就是使用HAL库编写代码功能正常而基于LL库则不行。真是这样吗?使用STM32CubeMx进行图形化配置,并生成基于HAL库的初始代码,要实现UART收发功能的DMA传输的话,除了安排好的收发缓冲内存外,再就只需调用下面两个H...

2023-01-06 20:30:44 1278

原创 STM32G4系列存储访问的两个小话题

一、有关CCM访问地址的话题有用过STM32F4系列部分芯片或STM32F334芯片的人,可能知道片内有个CCM【Core Coupled Memory】区域,从芯片系统框图结合文字说明,可以清晰知道这个区域仅能被CPU访问,常用来存放些对执行效率敏感的关键性的代码或数据。也就是说对于这两个系列的CCM区域,DMA是访问不了的。下面截图分别来自STM32F42X/STM32F43X器件和STM3...

2022-12-10 19:40:06 569

原创 一段有关MPU配置代码的几个小疑问

当我们阅读一些STM32F7或STM32H7系列芯片例程,或者基于这两类芯片通过cubeMx进行配置并用到MPU功能时,往往会在代码里看到下面这段MPU配置。对这段代码可能有人有些疑问,这里重点一起聊聊其中的3个,供参考。第一个疑问,那行做赋值0x87的代码是什么意思?第二个疑问,这段代码的注释【绿色】是说将未定义的区域配置为StronglyOrdered存储属性,这个未定义到底如何理解?从代码...

2022-12-04 18:30:27 363

原创 开启Cache后UART无法发送新数据

【注:手机模式下图片可点击放大查看】有人使用STM32H743做产品开发, DMA 传输待发送的数据到 UART 发送寄存器做后续UART通信。在开启D-Cache的情况下,发现UART没法发送更新过的数据。具体应用场景是这样的,源数据放在STM32H743片内D1域的AXI-SRAM区,数据会不定期地被CPU修改,然后让DMA将数据传输到U...

2022-11-23 08:14:49 192

原创 STM32定时器更新事件可以暂停否?

有人使用STM32的定时器的输出比较功能,具体就是输出4个通道的PWM信号。不过 他需要不定时地调整4个通道的占空比,即调整他们的CCR值。但现在有个小问题,那就是新的CCR值的获得往往会能跨越多个目前定时器的计数周期,这样的话,即使开启各个通道CCR值的预装功能,似乎也很保证做到一次性修改。因为它希望新的CCR值被同时更新。换句话说,他担心不同通道新的CCR值分散在不同计...

2022-11-14 20:55:14 848

原创 为何STM32H7的ADC数据不变?

有人使用STM32H7系列的ADC模块,定时器触发ADC,数据通过DMA传输到内存。对某通道连续转换几次后求个平均值。他却发现ADC结果虽没有什么问题,但一批数据出来后就纹丝不动了。DMA传输本来设计成的Circular模式,感觉好像工作在Normal模式,结果显然有点不合理。鉴于这个现象和所用芯片,估计是因为Cache使用方面的原因,客户也的确使能了Cache。具体怎么回事呢?我们一起来看看。我...

2022-11-12 20:49:00 1738

原创 STM32H7 BDMA应用示例

有人利用STM32H743系列芯片做开发,他想使用片内BDMA将GPIO的数据读到内存,并通过LPTIM触发DMA传输时却遇到点麻烦,发现总是实现不了。这里我简单介绍下实现过程,并做些提醒。STM32H7系列的时钟系统以及内部总线、功能框架相比其它M3/M4内核的STM32芯片要负责不少。整个芯片根据运行时钟高低及总线架构大致分为3个区域,其中BDMA位于区域3即D3域。在STM32H7系列参考手...

2022-11-05 16:05:49 610

原创 如何让CDC类USB设备批量接收64字节以上数据

很多STM32开发者在实现CDC类虚拟串口与PC主机通信过程中,有时会遇到点麻烦而不得其解。那就是当主机端单次发送的数据不超过64字节时,接收正常。一旦发送数据量大于64字节时就接收失败,总是出现丢包现象,似乎只能接收64字节以内的数据。网上有人干脆建议主机每次发送不要超过64字节,当然,也有人提及要作分包处理但没具体实现代码可以参考。作为CDC类的USB设备,到底能不能正确接收来自主机64字节以...

2022-10-29 09:47:08 2809 1

原创 STM32CubeMx的初始配置顺序与DMA传输异常之提醒

‍经常有STM32开发者基于STM32CubeMx进行配置并生成基于HAL库的初始化代码,当涉及到DMA功能时,发现DMA功能无效,但从配置操作及代码本身又似乎找不出原因来的情况。此情此景 往往挺令人抓狂的。比方曾有人反馈,他使用STM32F4系列芯片进行产品开发,通过STM32CubeMx配置并生成初始化代码,使用了UART的DMA传输。但他发现DMA根本不工作。后来他无意中发现,是因为他在用户...

2022-10-12 19:43:21 1279

原创 关于除以0异常捕获的配置话题

有人使用STM32芯片从事产品开发,代码中有涉及到除以0操作。他们发现基于相同的代码,使用不同IDE会出现不同结果。在IAR或ARM MDK环境下除以0操作所得结果为0,而在STM32CubeIDE环境下的运行时则产生HardFault异常。他们对这个结果感觉很奇怪,甚至怀疑是不是CubeIDE环境有bug。根据ARM内核相关手册描述,关于除以0事件或非对齐访问事件是否进行捕捉并触发异常是可以配置...

2022-10-07 14:25:50 488

原创 远程修改STM32 TIMER占空比的方案续1

现在有人有这样一个需求,他使用STM32F429芯片做开发,其中用到32位的TIM2实现3路PWM输出。另外有上位机跟STM32的UART接口相连,上位机可能不定期地需要通过UART接口给STM32发送新的占空比参数,而且每次都发送3个比较输出通道的参数【12个字节】。如何快捷地实现这个功能呢?要求收到数据后尽快修改3个比较通道的参数。前一篇重点介绍了利用DMAFIFO和UART接收事件触发DM...

2022-09-29 21:24:15 1417

原创 关于SYSTICK延时函数的两个小疑问

我们知道,STM32库函数里通常使用来自内核的系统定时器SYSTICK作为时基,实现计数延时。一般来讲,ST公司提供的库函数里将SYSTICK定时器配置为1ms的定时器中断,每产生1ms中断则相关中断事件计数变量加一。具体应用中我们经常会调用那个Delay()函数以实现计数定时,做延时或超时管理。有人在阅读ST提供的LL库里的这个延时函数时,发现代码里对延时参数总是做了个加1操作,代码如下:上图中...

2022-09-10 18:19:59 710

原创 如何在CubeIDE环境下查看或生成汇编文件

有人使用ST免费提供的集成开发环境STM32CubeIDE,想知道如何查看汇编代码,这里简单介绍下相关配置操作。在调试状态,按照下图所示操作即可:【window/show view/Disassembly】有人可能觉得在调试状态下这样查看汇编代码还不够过瘾,能否为各个c文件生成对应的汇编文件呢?这样不受调试状态的限制。可以的。我们可以这样操作。在CubeIDE菜单下,选择[Project]>...

2022-08-31 22:22:57 1205

原创 两份基于STM32做FDCAN开发的资料

ST公司推出的部分STM32系列芯片,内置了FDCAN外设,如下图所提到的这些系列。当我们选择内置FDCAN外设的STM32芯片做FDCAN开发时,这里推荐2份资料给大家,或许对开发有所帮助。第一份资料,就是ST公司编写的应用技术笔记AN5348,你可以去www.st.com/stm32搜索下载。该资料对FDCAN协议做了整体性介绍;描述了FDCAN相对传统CAN2.0的优势或提升的地方;介绍了F...

2022-08-28 15:00:06 734

原创 既生瑜,何生亮?

我们知道在STM32MCU片内的常规定时器【基本定时器、通用定时器、高级定时器】里面,有个ARR寄存器,它负责配置定时器的计数时钟个数,进而决定每个计数周期的时长。【下图是计数器三种计数方式及溢出点的示意图,绿色圆圈表示溢出位置。】对于基本定时器和通用定时器,每次溢出时都可以产生更新事件,该事件可以用来触发中断、触发DMA请求、触发其它外设【ADC/DAC等】或与其它定...

2022-08-11 08:04:59 721

原创 为何ADC采样点在飘?

有人使用STM32F103系列想实现如下需求,碰到些许配置困难。【因没说完整型号,这里假定为STMF103R8来聊。其实,对于下面话题,它是什么型号已经不重要了,后面话题重点跟芯片型号基本无关。】现在欲配置一个ADC采样,配置Timer1通道1,2,3输出三路PWM,同时想用Timer3的TRGO通道触发ADC,要求ADC在三路PWM输出高电平中间点采样【即下图红色箭头所...

2022-07-31 19:50:50 1541 2

原创 基于STM32U5片内GPDMA Burst传输应用示例

【温馨提醒:手机模式下,图片可点击放大查看】有人想使用STM32U5系列的GPDMA的burst【分组、节拍、突发】传输功能,似乎遇到了点阻碍。我这里尝试下,稍作演示,仅供参考。我用TIMER1更新事件触发DMA, DMA工作在非循环模式,DMA将数据从源内存区传输到目的内存区。我先准备下面两个数组。当两端访问数据宽度设置一样,burst大小始终为1时,传输是很顺畅的,不...

2022-07-30 16:35:49 807 3

原创 一使能定时器中断就立即进入中断程序?

我们在基于ST的标准库或基于CubeMx建立工程,当用到定时器并启用其更新中断时,可能会遇到一使能定时器中断且计算器还未开始计数就立即进入更新中断服务程序的情况。可能出现该现象的场合大概像下面样子,即先使能定时器更新中断,然后才去启动计数器。我们会发现,刚一使能更新中断还未启动计数器,结果就跑到更新中断服务程序里。看看下面截图,右边TIMER控制寄存器CEN还未置1,SR...

2022-07-27 08:18:56 1109

原创 使用定时器输出指定个数脉冲的几种方式

在实际产品开发中有时可能需要实现一些指定个数脉冲的输出,这里介绍几种基于STM32定时器的实现方式。1、 利用RCR寄存器结合单脉冲模式;2、 利用DMA实时修改CCR寄存器的模式;3、 利用定时器主从模式;4、 利用中断对脉冲实现计数模式;一、利用RCR结合单脉冲模式这种方式仅限于带RCR寄存器的高级定时器,配合单脉冲模式,实现起来非常方便。基本原理:计数器发生RCR+...

2022-07-24 17:37:33 3200

原创 STM32CubeIDE几个调试工具使用演示

意法半导体ST公司为广大STM32用户免费提供了基于GCC的功能强大集成调试工具STM32CubeIDE。这里简单演示下STM32CubeIDE所支持的几个调试小工具及功能。1、利用Live Expression 实时显示变量数据;2、利用SWV的SWO功能实现printf打印输出;3、利用SWV实现数据实时跟踪动态图形显示;4、利用CubeIDE集成的串口终端软件实现p...

2022-07-10 12:27:04 3021

原创 关于STM32内部温度传感器的算式话题

STM32片内往往都集成了一个内部温度传感器,其中很多系列【但不是所有,具体参见技术手册】并给出了出厂时基于特定温度及参考电压下的校准值以供使用。温度传感器的输出电压可以被连接到特定ADC...

2022-03-10 22:39:53 1493

原创 定时器触发STM32 ADC的采样转换示例

开发板:STM32F446Nucleo开发板IDE: keil MDK初始化配置工具:stm32cubeMx例程内容:通过定时器触发ADC规则通道及注入通道的模数转换工作。下面基于ST...

2021-12-30 12:52:09 4891

原创 单次事件触发DMA读取多字节SPI数据

有人想使用定时器事件触发DMA读取SPI数据,希望每一次更新事件仅触发一轮DMA传输,借助DMA实现N字节的SPI数据收发。要完成这个功能,这里推荐两种做法供参考。第一种,先做好SPI的D...

2021-12-12 10:41:53 4564

原创 STM32定时器可重触发单脉冲模式

ST公司后期推出的STM32系列【比方L4、G0、G4、F7、H7等】的定时器功能都做了诸多拓展,其中可重触发单脉冲模式就是新拓展的功能之一。它跟常规单脉冲模式类似,但在实现方式及输出结果...

2021-12-11 08:15:59 3348

原创 基于STM32的除以0运算话题

有人使用STM32G4系列芯片开发产品。他发现程序中如果遇到除以0的操作时,会跑进出错异常中断而影响程序运行。他想知道能否通过设置,即使发生除以0操作也不让程序跑进异常中断,并期望此时的除...

2021-11-10 20:08:00 933

原创 基于STM32G4芯片的DAC应用示例

有人使用STM32G431芯片做DAC应用,具体来说就是通过DMA将数据从指定内存传送给DAC数据寄存器,并由定时器触发DAC转换。他发现总是没法实现该功能。这里简单介绍下相关实现过程,并...

2021-09-11 10:43:35 2612

原创 STM32G4芯片内不同空间运行代码的速率比较

最近有人问起程序在STM32G4片内不同存储空间运行的速度差异。说实在的,这个很难说死或说出个绝对的数据,毕竟结果除了跟执行代码的存放空间有关外,还跟代码本身的内容、程序逻辑、编译工具及优...

2021-09-08 20:29:35 831

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除