记录一些stm32调试过程中:不易被理解、存在使用误区、不清不楚、是坑、使用常识等方面的一些记录。本记录只包含stm32的内核以及外设等寄存器的调试,不包含业务方面。
低功耗管理
使用低功耗功能前是否需要打开PWR时钟?
是需要先打开PWR时钟的,否则无法唤醒。
-
睡眠模式、停机模式和待机模式的区别?
引用地址
这两个模式与睡眠模式相比,属于深度睡眠模式。
睡眠模式
停机模式
待机模式
NVIC(内嵌的中断向量控制器)
NVIC是什么东西?是内嵌的中断向量控制器?翻译的被不明不白,无法理解。说简单一点就是,来管理全部的中断的控制器,哪个中断来了,谁先来的,谁后来的,应该先运行哪个?能不能被抢占,还是按照顺序执行等。
如何理解中断、挂起?
国内单片机学习者一开始都是学习别人翻译过来的中文手册,我也不例外。但是翻译过来的有些就十分的晦涩难懂,更甚者还会有错误出现(例如,EXTI的中断\事件控制框图)。所以建议去看看英文手册,即使借助翻译软件慢慢看也没有关系。
对于理解中断、挂起,十分有帮助的地方是M3权威指南手册的124页,看完如果没有帮助你来找我。
NVIC中的Pending(中断挂起)位会自动清除吗?
当触发了某个中断,并进入了该中断服务函数的话,该位是会被硬件自动清除的。
但是触发这个中断的外设中的中断标志位的话,并不一定会自动清除,需要查看手册,看是否需要自己手动清除。
EXTI(外部中断/事件)
将PortA0连接到EXTI0,触发外部中断,总是进入两次中断服务函数,并且没有外部干扰存在。
void EXTI0_IRQHandler(void)
{
// 中断执行的业务代码...
ExtiClearIntStatus(0u); //清除LINE0上的中断标志位
}
解释:
① 该现象十分有规律,可以考虑是因为没有清除掉EXTI的挂起寄存器,导致该中断一直被挂起,即使退出了中断服务函数,还是会一直进入该中断。
② 但是,每次只进入两次,上述还是解释不通,并且代码中已经将挂起寄存器中的中断标志清除掉了。
③ 最终原因是因为,清除中断标志的函数写在了最后一句,导致中断服务函数返回后,硬件上仍旧没有来得及将挂起寄存器的标志位清零(硬件执行是有延迟的)。所以导致又一次进入了中断服务函数。并且在仿真调试中,我也发现,第一次进入中断服务函数时,EXTI的PR挂起寄存器中的中断标志位为置位状态,第二次进入中断服务函数时,发现该位已经被清除。
④ 所以,最要是一进入中断服务函数,就将挂起的标志位清除掉,再执行业务逻辑代码,给硬件一定的执行事件。
DMA(直接内存访问)
下面的代码对dma进行寄存器操作总是写入失败?
RCC->AHBENR |= RCC_AHB_DMA1; // 开启DMA1时钟
DMA_CHx->CPAR = uiPeriAddr; // 外设地址
DMA_CHx->CMAR = uiMemoryAddr; // 内存地址
解释:
如果这样操作,dma的这两个寄存器总是写入不成功。
因为刚开启了DMA时钟,还并未稳定(电路的运行也需要时间),所以写入失败,需要在时钟开始后,加入延迟。
应该加入至少大于等于两个时钟周期【__nop();】。文章来源:https://www.toymoban.com/news/detail-801987.html
使用Dma进行发送时,有什么注意事项?
① 最好是使用Dma正常模式(即非循环模式)进行发送。也就是数据转移(发送)到全满就停止Dma发送。
② 在Dma配置发送初始化时,因为这个时候还没有数据要进行发送,所以CNDTR寄存器的值请写入0,否则当你使能Dma时,它会自动发送数据。最好是等想要发送数据时:先失能Dma,写入想要发送的数据长度,再使能Dma,启动发送。文章来源地址https://www.toymoban.com/news/detail-801987.html
到了这里,关于【STM32调试】寄存器调试不良问题记录持续版的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!