导致STM32芯片指令速度变化的问题分析过程

合集下载

STM32常见问题解析(论文资料)

STM32常见问题解析(论文资料)

STM32常见问题解析1、时钟安全系统(CSS)时钟安全系统被激活后,时钟监控器将实时监控外部高速振荡器;如果HSE时钟发生故障,外部振荡器自动被关闭,产生时钟安全中断,该中断被连接到Cortex‐M3的NMI的中断;同时CSS将内部RC振荡器切换为STM32的系统时钟源(对于STM32F103,时钟失效事件还将被送到高级定时器TIM1的刹车输入端,用以实现电机保护控制)。

操作流程:1)、启动时钟安全系统CSS: RCC_ClockSecuritySystemCmd(ENABLE); (NMI中断是不可屏蔽的!)2)外部振荡器失效时,产生NMI中断,对应的中断程序:void NMIException(void){if (RCC_GetITStatus(RCC_IT_CSS) != RESET){ // HSE、PLL已被禁止(但是PLL设置未变)…… // 客户添加相应的系统保护代码处// 下面为HSE恢复后的预设置代码RCC_HSEConfig(RCC_HSE_ON); // 使能HSERCC_ITConfig(RCC_IT_HSERDY, ENABLE); // 使能HSE就绪中断RCC_ITConfig(RCC_IT_PLLRDY, ENABLE); // 使能PLL就绪中断RCC_ClearITPendingBit(RCC_IT_CSS); // 清除时钟安全系统中断的挂起位// 至此,一旦HSE时钟恢复,将发生HSERDY中断,在RCC中断处理程序里, 系统时钟可以设置到以前的状态}}3)、在RCC的中断处理程序中,再对HSE和PLL进行相应的处理。

注意:一旦CSS被激活,当HSE时钟出现故障时将产生CSS中断,同时自动产生 NMI。

NMI 将被不断执行,直到CSS中断挂起位被清除。

因此,在NMI的处理程序中 必须通过设置时钟中断寄存器(RCC_CIR)里的CSSC位来清除CSS中断。

STM32单片机常见的工作异常现象分析及解决方案

STM32单片机常见的工作异常现象分析及解决方案

STM32 单片机常见的工作异常现象分析及解决方案贴了两块样板,烧写同样的固件。

其中一块工作正常,但是另外一块出现了很奇怪的现象:在线调试正常;每次烧写完后工作正常;重新上电有时候工作正常,有时候工作不正常;工作不正常时,按下复位按键,恢复正常。

工作异常现象:main 函数中的系统运行指示灯不闪烁,但是初始化过程中点的一个灯是亮的!说明程序运行一段时间后,不工作了。

由于在线调试模式,板子工作正常,无法通过在线调试的方式判断程序运行的异常状态。

分析可能的原因:1、初始化过程中,程序陷入死循环。

但程序初始化过程中,没有while (1)死循环的代码。

2、板子上电后不断复位,导致无法进入main 函数中的while(1)循环。

问题查找:硬件:1、确认BOOT0 管脚接10kΩ欧电阻下拉到地;2、RC 上电延时复位电路中,R 为10kΩ,C 由0.1uF 改为10uF,现象依旧;3、MCU 3.3V 电源纹波很小,排除电源问题。

好像从硬件上查不出什幺问题。

只能从板子上唯一点亮的灯下手了。

软件:1、好像跟硬件复位没什幺关系,为了确认板子是不是在不停复位,在点亮的那个灯前加了100ms 延时,如果是在复位,那灯就应该不停闪烁。

但那个灯还一直是亮的,说明是程序运行出错,不运行了。

2.不断修改led 灯在初始化代码中的位置,最终定位到导致运行出错的代码:配置一个GPIO 为外部中断,跳变沿触发,上拉。

把上拉改为NOPULL,工作一切正常。

问题定位:配置为外部中断的GPIO 悬空导致。

之前工作正常的样板是一直有连接到那个IO 脚的外接模块,这个工作不正常的没有接,导致IO 管脚电平不确定。

由于电平的不确定,在初始化的瞬间有一个跳变沿,导致程序进入外部中断服务函数。

在中断服务函数中,要读取一个定时器的寄存器的值,但是要读取的定时器可能还没有完成初始化,导致读取失败,程序运行异常。

解决办法:1、PULL 模式有PULLRISING 改为NOPULL;2、timer 在这个外部中断之前进行初始化。

stm32串口时序误差

stm32串口时序误差

stm32串口时序误差
串口通信时序误差是指在STM32微控制器中使用串口通信时,由于时钟偏差、波特率误差、数据传输延迟等原因导致的通信时序不准确的情况。

串口通信时序误差可能会导致数据传输错误、丢失或者干扰,严重影响通信的稳定性和可靠性。

造成串口通信时序误差的原因可能包括:
1. 时钟偏差,由于晶振精度、温度变化等因素导致的系统时钟频率偏差,会影响串口通信的波特率准确性。

2. 波特率误差,设备之间的波特率设置不一致或者波特率发生漂移,导致通信时序不匹配。

3. 数据传输延迟,串口硬件或者软件处理数据的延迟会对通信时序产生影响。

4. 环境干扰,外部环境的电磁干扰、电源干扰等因素也可能对串口通信时序造成影响。

解决串口通信时序误差的方法包括:
1. 确保系统时钟稳定,使用高精度的晶振,并对时钟进行校准
和补偿,以减小时钟偏差。

2. 波特率校准,定期对设备之间的波特率进行校准,确保波特
率的一致性。

3. 优化数据传输,减小串口数据传输的延迟,可以通过硬件加速、DMA传输等方式来提高数据传输效率。

4. 抗干扰措施,在系统设计中考虑到外部干扰因素,采取屏蔽、滤波等措施减小环境干扰对串口通信的影响。

总之,串口通信时序误差对系统稳定性和可靠性有着重要影响,需要在系统设计和调试过程中充分考虑,并采取相应的措施进行优
化和改进。

电源控制板设计中的问题与分析(STM32主芯片)

电源控制板设计中的问题与分析(STM32主芯片)

电源控制板设计中的问题与分析(STM32主芯片)一、问题现象功能:电源控制板可以单独控制5V/12V/24V三路电压的输出,并测量其电流和电压。

电源控制板所选CPU为STM32F103C8T6@72Mhz.电源控制板所选继电器为:24V@12mA.电源控制板所有电解电容均为2200uF.电源控制板2.0PCB如下图所示:图1下面是地线回路:图2打样焊接后,测试时发现如下问题:1,stm32控制K3导通(K3控制12V的输出。

),导致STM32异常重启。

重启2~3次之后,可以正常控制K3导通。

2,K3导通后,在VCC12处人为短路,导致STM32重启,但是电流显著增加(之前为20ma,之后为350ma),同时STM32发热严重。

但是STM32运行正常(持续观察数分钟无异常)。

二,原因分析先看问题2.根据现象我进行了如下检测:1,STM32正常工作,在电源输入口直接短路12v,现象不能重复。

2,STM32正常工作,将K3强行导通,在12V输出口短路,现象被重复。

3,STM32进B00TLOADER模式,将K3强行导通,,在12V输出口短路,现象被重复。

仔细检查PCB后,发现问题可能是出在地线回路,如图3所示:图3我这样设计的本意是VSSA的地和STM32的其他地是分开的,为了ADC准确,我特地把VSSA和模拟部分的地连在一起,而STM32的其他地则连到另外一个地线网络,如图3所示。

采取措施如下,如图4所示:图4在A处,将底层的地线割开,在B处,用焊锡连接两个地线网络。

在做同样测试,未重现问题2,而问题1依旧。

问题2得到解决。

再看问题1.根据问题2的解决方法,问题1的问题,也有可能出在地线。

在解决问题2之后,地线网络分为上下两层。

没有连接在一起(没有形成地线环)。

我认为干扰可能来自ULN2003,于是把ULN2003的地线割开,直接连接到电源输入点的地。

如图5所示:图5在C处割开,断开ULN2003与下方地网的连接,直接连接在地线输入端。

STM32F0多路ADC采样中的BUG和解决方案

STM32F0多路ADC采样中的BUG和解决方案

STM32F0多路ADC采样中的BUG和解决方案在STM32F0系列中,多路ADC采样时可能会出现一些问题,下面是一些常见的BUG以及对应的解决方案:1.ADC转换结果误差较大:-原因:ADC的转换精度受到参考电压和时钟精度的影响,以及输入信号的干扰等。

-解决方案:-确保参考电压稳定,可以使用稳压器等电压源。

-降低输入信号的干扰,可以使用滤波电路。

-选择合适的采样率和分辨率,根据实际需求调整。

-使用校准功能对ADC进行校准,可以提高转换精度。

2.ADC采样速度不稳定:-原因:在多通道ADC采样时,切换通道可能会引入额外的时间延迟,导致采样速度不稳定。

-解决方案:-配置ADC转换模式为扫描模式,使得ADC可以按照一定的顺序进行多通道采样。

-调整通道切换速度,可以通过增加延时或者降低采样速率来解决。

3.ADC采样结果不准确或者不稳定:-原因:在多路ADC采样时,可能存在模拟输入信号的串扰或者共模干扰,导致采样结果不准确或者不稳定。

-解决方案:-选择合适的参考电压和可靠的电源地,以减少参考电压的波动或者输入信号的干扰。

-适当延长采样时间,可以通过增加采样周期来提高稳定性。

-使用信号调制技术,如差分信号采样、抗共模干扰技术等。

4.ADC采样中断丢失:-原因:在多通道ADC采样时,如果不及时处理中断,可能会导致中断丢失。

-解决方案:-配置合适的优先级分组和中断优先级,以确保ADC中断能够得到及时处理。

-在中断处理函数中尽量减少处理时间,避免长时间占用CPU。

5.ADC采样时CPU占用率过高:-原因:在ADC连续转换模式中,如果没有合适的采样间隔,可能会导致CPU占用率过高。

-解决方案:-合理配置ADC的采样频率和采样间隔,根据实际需求进行调整。

-使用DMA传输数据,减少CPU的负载,提高系统的稳定性和响应速度。

以上是一些常见的STM32F0多路ADC采样中可能出现的BUG以及对应的解决方案,根据实际情况进行调试和优化,可以提高ADC的准确性和稳定性。

STM32片内FLASH被异常改写的问题分享

STM32片内FLASH被异常改写的问题分享

STM32 片内FLASH 被异常改写的问题分享
某STM32 客户反馈,当STM32F407V 芯片频繁的正常通断电的时候,FLASH 会被非法改写,出现各种各样的异常(整片被擦除、中断向量表被改写、写保护被清除等等)。

经过与跟客户沟通了解到:
1、他们是延续之前的项目,进行的一些软硬件简单修改。

之前的项目没有出现过类似的问题。

2、确认通断电的时间是足够,即断电后所有的VDD 都回到0;上电的时序也正常。

3、原理图参考了ST 相关开发板的参考设计。

4、测量工作电压,除了发觉上电时会有些许抖动外,其它一切正常。

尝试让他们改善上电电路,去掉这一抖动。

再次实验,仍然出现类似的问题。

单片机程序运行时的参数发生变化的原因

单片机程序运行时的参数发生变化的原因

单片机程序运行时的参数发生变化的原因单片机是一种集成电路,由中央处理器(CPU)、存储器、输入输出(I/O)接口以及一些外部设备组成,用于执行特定的任务。

程序运行时的参数发生变化的原因有很多,下面将详细介绍几种常见的原因。

1.外部环境因素:环境温度、湿度、供电电压、电磁干扰等外部因素都可能导致单片机程序参数发生变化。

例如,温度升高可能导致晶体管内部传导电阻增加,从而影响电路的工作频率;电磁波的干扰可能导致数据传输错误或丢失。

2.内部环境因素:单片机内部环境的变化也可能导致程序参数的变化。

例如,存储器的寿命有限,频繁的写入操作可能导致存储器擦除次数增加,影响数据的保存可靠性;集成电路中的功耗会产生热量,长时间高负载运行可能导致芯片温升,进而影响电路的工作性能。

3.软件演进:随着单片机技术的不断发展,软件的更新和演进也是导致参数变化的原因之一、更新的软件版本可能引入新的特性、功能或修复已知的问题,这些变化可能会影响原有程序的运行参数。

例如,一些软件更新可能增加了一些指令的执行时间,从而导致原先的程序执行时间变长。

4.电路老化:长时间使用会导致电子元件老化,如电容的值会变化等。

这些老化现象可能导致电路参数的变化,进而影响单片机程序的运行参数。

例如,原本稳定的电压可能发生漂移,从而影响ADC(模数转换器)的输入电压范围,导致采样数据不准确。

5.外界输入变化:单片机是通过输入输出口与外界进行信息的交互,当外界输入发生变化时,相应的参数也会发生变化。

例如,外部传感器的测量数据可能发生变化,需要通过单片机程序及时更新相应的参数。

6.硬件故障:电路元件的损坏或接触不良可能导致程序参数的变化。

例如,电阻值变化可能导致电压分压比例不准确,从而影响程序参数的计算结果。

在开发单片机程序时,需要考虑以上因素的影响,合理预估和处理可能发生的变化。

例如,可以使用温度补偿方法来解决温度变化引起的电路性能变化问题;使用错误检测和纠正算法来解决数据传输错误问题;定期检查硬件设备,确保其正常运行。

stm32学习之错误汇总(仅仅就我学习过程中所遇到的)

stm32学习之错误汇总(仅仅就我学习过程中所遇到的)

stm32学习之错误汇总(仅仅就我学习过程中所遇到的)1.Error:Flash Download Failed-"Cortex-M3"出现这处问题通常是MDK中的Flash的编程算法没有配置或没有配置正确,通俗的讲,就是我们没有配置好下载的环境,导致程序⽆法下载在这⾥,主要指的是没有添加cpu⽀持的flash错误点击mdk中的对进⾏配置,点击flashdownload,点击add 添加cpu⽀持的flash,根据⾃⼰的stm32来配对,我的是stm32f10x high-density flash 512k,此条错误解决2.程序编译成功,下载成功,但是开发板不显⽰效果mdk没有对j-link进⾏匹配点击mdk中的,点击debug,选择j-link/j-trace cortex,程序下载成功,效果实现3.Error:target dll has been cancelled.debugger aborted表⾯意思⽬标DLL已经cancelled.debugger中⽌可能是硬件仿真未匹配,解决1. 7⽉28⽇,不过奇怪的是昨天我把这⼀栏改了的,但今天重新开程序,它⼜变成了4.7.29学习LCD -FSMC彩屏显⽰的时候出现passing 'char[16]' to parameter of type 'const u8*' (aka 'const unsigned char*') converts between pointers to interger types with different signs 相关的类似报错的原因就是输⼊显⽰屏的字符串变量⼀定要是char,不能是u8,unsigned char我把所有相关的函数变量参数的类型改成char就解决对了问题.5.8.3学习定时APP\瀹氭椂鍣╘time.h(4): warning: #1295-D: Deprecated declaration time_init - give arg types使⽤函数前⼀定要声明APP\瀹氭椂鍣╘time.c(23): warning: #1-D: last line of file ends without a newlineAPP \瀹氭椂鍣╘time.c(23):警告:#⼀维:⽂件的最后⼀⾏没有换⾏符结束。

关于STM32开发板晶振相关的问题汇总

关于STM32开发板晶振相关的问题汇总

关于STM32开发板晶振相关的问题汇总由于开发板上晶振稍多,买的板子还配有几个额外的晶振,搞不明白,就在论坛上查了一些资料。

看了相关帖子将近30篇,基本上搞定了。

现将相关问题汇总如下,分项给大家。

1、自己做了个STM32 的板子,,但是手里没有8M的晶振,所以就用了,12M的,,但是不正常,上电之后PA15和PA14接的是两个led,PA15接的led常亮,PA14接的的led不亮,,而且芯片下载程序又能下载,应该不是芯片坏的问题吧,,而且不管我些什么程序进去,两个脚的状态都不变,,我怀疑是电路有问题,,可是我仔细检查了电路和板子,都没问题,,JTAG正常使用。

我用的是12M的晶振,这会有影响吗?感觉不管下什么程序进去感觉芯片好像没有运行。

答:如果使用12M的晶振,那么要修改启动文档中的关于RCC的语句。

因为如果你使用库文件的话,ST的库,默认外部晶振是8M,所以如果你不修改RCC 部分的语句,会造成CPU不启动,或者启动不成功。

现象是,在MDK环境下,能够通过JTAG识别到芯片,但是无法下载或者debug。

会提示 can not attach CPU。

2、突然想到这个问题,外部无源晶振选择大小的区别是什么?对STM32芯片它都要先分频,再倍频。

我在想,假设,如果它分频都要降到2M,再倍频上去那我直接2M的晶振1分频再倍频,跟24M先12分频再倍频他们的区别是什么?还是说本身就是任意的,根据自己需要选择?答:方便各种应用场景。

3、自己做的STM32F103RBT6板子,外接8M晶振,现在程序下载正常,运行正常,在程序初始化时用到Stm32_Clock_Init(9)这条语句,我想问下是不是外部晶振如果没起振在执行这条语句时会停止?也就是说我的程序下载和运行都正常说明外部晶振肯定起振了,而且已经倍频到72M了。

答:默认是用内部8M RC震荡的,你切换为PLL之后,才是使用8M倍频的,如果你注释掉Stm32_Clock_Init(9),那么代码也会跑,但是是用内部8M RC震荡。

单片机指令编程的常见错误与解决方法

单片机指令编程的常见错误与解决方法

单片机指令编程的常见错误与解决方法在单片机指令编程过程中,往往会遇到各种问题和错误。

这些问题可能导致程序无法正常运行或者出现意料之外的结果。

本文将介绍一些常见的错误,以及相应的解决方法,帮助程序员更好地进行单片机指令编程。

一、编码错误编码错误是指在编写指令时出现的错误,包括语法错误和逻辑错误。

语法错误是最基本的错误,常见的有拼写错误、缺少分号等。

逻辑错误则是指程序的逻辑不正确,导致程序无法按照预期的方式执行。

解决方法:1. 仔细检查代码,查找并修复语法错误。

2. 使用调试工具,逐步执行代码,观察程序的执行过程,找出逻辑错误的根源。

3. 采用模块化编程方法,将程序划分为多个相对独立的模块,降低程序的复杂性,便于调试和维护。

二、寄存器配置错误单片机中的寄存器是非常重要的,它们用来存储程序的运行状态和数据。

配置寄存器时,如果设置不正确,可能导致程序无法正常运行。

解决方法:1. 仔细查阅单片机的手册或者数据手册,确保对寄存器的配置有充分的了解。

2. 逐个检查寄存器的配置,确保每个寄存器的值都正确设置。

3. 使用调试工具,观察寄存器的状态,排除配置错误的可能性。

三、时钟设置错误单片机的时钟是程序运行的基础,对于某些需要实时操作的程序尤为重要。

时钟设置错误可能导致程序时序不正确,无法正常执行。

解决方法:1. 确保时钟源的选择正确,并选择合适的分频系数。

2. 配置好时钟控制寄存器,确保时钟的频率满足程序运行的要求。

3. 使用专业的时钟分析工具,对时钟信号进行分析和调试,确保时钟信号的准确性和稳定性。

四、中断处理错误中断是单片机的重要功能,可以实现对外部事件的响应。

如果中断处理错误,可能导致程序的执行流程混乱,无法正常处理中断事件。

解决方法:1. 确保中断向量表的设置正确,每个中断向量都与对应的中断服务程序相对应。

2. 配置中断控制器,使能或禁止某些中断,确保中断的优先级设置正确。

3. 定期检查中断服务程序的正确性,确保程序在中断发生时能够正确响应。

stm32数学debug计算无结果

stm32数学debug计算无结果

stm32数学debug计算无结果(最新版)目录1.STM32 简介2.数学调试的意义3.无结果的原因分析4.解决无结果问题的方法5.总结正文【1.STM32 简介】STM32 是一种基于 ARM Cortex-M 内核的微控制器,广泛应用于嵌入式系统中。

它具有高性能、低功耗、多功能、易扩展等特点,因此深受工程师们喜爱。

【2.数学调试的意义】数学调试,顾名思义,就是在程序开发过程中,对涉及到的数学运算进行检查和调试。

在 STM32 中进行数学调试,可以有效地发现和解决程序中的计算错误,保证程序的正确运行。

【3.无结果的原因分析】在进行 STM32 数学调试时,可能会遇到无结果的情况。

这种情况通常有以下几种可能的原因:(1)算法错误:程序中的数学算法可能出现了逻辑错误,导致计算结果不正确。

(2)数据错误:参与计算的数据可能出现了错误,导致计算结果不准确。

(3)代码实现错误:程序中的代码可能存在语法错误或者运行时错误,导致计算结果无法得出。

(4)硬件故障:STM32 微控制器可能出现了硬件故障,导致计算结果无法正常输出。

【4.解决无结果问题的方法】针对无结果的问题,可以采取以下几种解决方法:(1)检查算法:仔细检查程序中的数学算法,确保其逻辑正确。

(2)检查数据:核对参与计算的数据,确保数据的准确性。

(3)检查代码:审查程序代码,查找可能存在的语法错误或运行时错误,并进行修复。

(4)检查硬件:如果以上方法都无法解决问题,可以考虑是否是硬件故障,需要对 STM32 微控制器进行检查或更换。

【5.总结】在 STM32 数学调试过程中,遇到无结果的情况,需要通过分析原因并采取相应的解决方法,以保证程序的正确运行。

stm32 io速度寄存器调节原理

stm32 io速度寄存器调节原理

一、STM32 IO速度寄存器调节原理1.1 STM32 IO口的速度控制在STM32单片机中,IO口的速度可以通过设置速度寄存器来进行调节,这个寄存器就是GPIOx_OSPEEDR,其中GPIOx代表GPIO的端口号。

每个IO口都有一个相对应的速度寄存器来控制其输出速度。

1.2 寄存器的结构GPIOx_OSPEEDR寄存器的结构如下:```Bit 1:0 MODE0[1:0]: port x mode bits (y = 0..15)These bits are written by software to configure the I/O driving capability.00: Low speed01: Medium speed10: High speed11: Very high speed```可以看到,这个寄存器有16位,每两位用来控制一个IO口的速度,可以选择低速、中速、高速和超高速四种速度之一。

1.3 寄存器的设置方法在使用STM32单片机时,可以通过设置这个寄存器来控制每个IO口的输出速度。

如果需要配置GPIOA的第5个引脚为高速输出,可以按照下面的方法来设置:```GPIOA->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR5; //设置为高速输出```1.4 寄存器的作用速度寄存器的主要作用是为了调节IO口的输出速度,通过设置不同的速度模式,可以满足不同的外设对IO口输出速度的要求。

在实际应用中,可以根据外设的要求来调节IO口的速度,以达到最佳的性能和稳定性。

1.5 寄存器的注意事项在使用速度寄存器时,需要注意以下几点:- 不同的外设对IO口的速度要求不同,需要根据具体外设的要求来设置速度寄存器。

- 不同的引脚设置可能影响整个外设的工作速度,需要综合考虑整个外设的速度要求来设置速度寄存器。

二、总结通过设置速度寄存器,可以灵活地控制STM32单片机的IO口输出速度,满足不同外设对IO口速度的要求,提高系统的稳定性和性能。

STM32片内FLASH被异常改写的问题分享

STM32片内FLASH被异常改写的问题分享

STM32片内FLASH被异常改写的问题分享某STM32客户反馈,当STM32F407V芯片频繁的正常通断电的时候,FLASH 会被非法改写,出现各种各样的异常(整片被擦除、中断向量表被改写、写保护被清除等等)。

经过与跟客户沟通了解到:1、他们是延续之前的项目,进行的一些软硬件简单修改。

之前的项目没有出现过类似的问题。

2、确认通断电的时间是足够,即断电后所有的VDD都回到0;上电的时序也正常。

3、原理图参考了ST相关开发板的参考设计。

4、测量工作电压,除了发觉上电时会有些许抖动外,其它一切正常。

尝试让他们改善上电电路,去掉这一抖动。

再次实验,仍然出现类似的问题。

根据现象初步判断,异常似乎跟硬件没关联了,接着对客户代码进行删减又做了如下实验:1,去掉APP 部分代码,仅仅留下IAP代码。

做相同的实验,问题再现。

2,进一步删减程序,去掉程序中所有跟flash以及OPTION BYTE 相关的部分,做相同的实验,问题依旧。

3,没招,再删代码,或者屏蔽代码。

做基于不同STM32库的代码替换。

问题始终依旧。

到此问题毫无进展,只好求助ST芯片设计人员做进一步确认,看看芯片是否真的坏了。

同时,又请客户的硬件工程师再次确认他们的硬件线路和原理图的一致性,我们怀疑他们的硬件是否有装错的元器件,特别是MCU周边。

后来客户工程师反馈,STM32F407的PDR_ON脚,板子上装的元件跟原理图不一致。

他们把R47和R48都装了【如下图】,那么相当于在PDR_ON上是一个0.6v的电压,也就是关断了MCU内部复位。

可谓山穷水尽疑无路,柳暗花明又一村,看来问题应该跟内部复位有关。

STM32串口IAP中的关键问题分析

STM32串口IAP中的关键问题分析

在STM32中,为了实现串口IAP 升级APP 程序,必须将单片机的内部Flash 至少分成两个部分。

第一部分用于存放IAP ,即BootLoader 程序;其余的部分用于存放APP ,即用户程序[1]。

一般情况下,STM32的内部Flash 空间比RAM 要大得多,如果考虑将要升级的APP 一次接收下来存放于RAM 再写入到Flash ,这种方法仅适用于APP 大小不超过RAM 空间的情形,存在一定的局限性,为解决该问题本文使用边接收边烧写的方法;另一方面,STM32在将APP 写入Flash 时,不能从Flash 取指令,导致了无法通过串口中断的方式来接收APP 程序,为解决该问题,本系统将IAP 程序搬运到RAM 中运行。

1STM32串口IAP 的实现所谓串口IAP ,就是STM32在运行IAP 程序时,通过串口(中断)的方式来接收新的APP 程序。

STM32的Flash 地址从0x08000000开始,它的IAP 实现原理非常简单,通常的做法是从Flash 的起始地址开始保留一段空间用于存放IAP 程序,其他空间则用于存放APP 程序,如图1所示。

当单片机上电后,首先运行IAP 程序检查是否需要更新APP ,如果需要更新APP 则进行更新操作,然后运行新的APP ,否则直接跳转到原有的APP 运行[2]。

因此,在APP 程序中,要设置中断向量表偏移量,保证其能可靠运行。

2串口IAP 关键问题分析2.1建立循环缓冲区当APP 程序的大小达到RAM 可用空间的极限时,边接收边烧写是必然要考虑的一个问题。

为了实现更大APP 程序的升级,就需要在RAM 中建立循环缓冲队列,利用这种数据结构,可以高效地完成边收边写,APP 的接收和烧写几乎是同时完成的。

通过循环缓冲区接收数据并写入Flash 的流程如图2所示。

尽管从目前的分析来看该方法是可行的,但STM32在写Flash 时不能读取Flash ,所以本文考虑将程序搬到RAM 中运行。

STM32新手常见的一个错误并给出解决方法

STM32新手常见的一个错误并给出解决方法

STM32新手常见的一个错误并给出解决方法在使用STM32微控制器进行开发时,新手常常会遇到一些常见的错误。

以下是一些常见错误以及对应的解决方法,帮助新手更好地克服这些问题。

1.芯片未正确连接:通常情况下,STM32芯片应与开发板正确连接。

新手可能会出现错误的连接方式,例如将芯片倒置或错位连接。

解决这个问题的方法是仔细查看芯片的引脚图并确保正确地连接所有的引脚。

2.引脚配置错误:STM32微控制器具有多功能引脚,可以根据需要进行不同功能的配置。

新手可能会错误地配置引脚,导致功能无法正常工作。

解决这个问题的方法是仔细阅读芯片的数据手册,以确定正确的引脚功能和配置设置。

3.时钟配置错误:STM32微控制器依赖于准确的时钟源以确保正常运行。

新手可能会忽视时钟配置,导致系统无法启动或无法正常工作。

解决这个问题的方法是仔细配置时钟源,并确保时钟频率与所需的系统时钟频率相匹配。

4.软件驱动错误:在使用STM32微控制器进行开发时,需要正确的软件驱动程序来控制硬件功能。

新手可能会遗漏或错误地使用关键的驱动程序,导致无法实现预期的功能。

解决这个问题的方法是仔细阅读相关的软件库文档,并确保正确使用所有必需的软件驱动程序。

5.中断配置错误:STM32微控制器支持多种中断,并需要正确配置以实现正确的中断处理。

新手可能会忽略或错误地配置中断,导致系统无法正确响应中断事件。

解决这个问题的方法是仔细阅读关于中断配置和处理的文档,并确保正确配置所有中断。

6.电源和电源管理问题:STM32微控制器需要稳定和适当的电源供应以确保正常运行。

新手可能会遇到电源不稳定或不足的问题,导致系统无法正常工作。

解决这个问题的方法是确保提供稳定的电源,并使用适当的电源管理技术,例如使用电容和稳压器等来提供稳定和适当的电源。

7.调试问题:在使用STM32微控制器进行开发时,调试是非常重要的。

新手可能会遇到调试问题,例如无法正确读取或显示调试信息。

stm32 编码器计数误差

stm32 编码器计数误差

stm32 编码器计数误差:
stm32的编码器计数误差可能是由于多种原因引起的,例如电源电压波动、信号干扰、硬件设计问题等。

如果发现编码器计数误差较大,可以尝试以下几种方法解决:
1.确保电源电压稳定,避免因电压波动导致计数误差。

2.检查信号线是否受到干扰,例如电磁场、高频信号等。

可以尝试使用屏蔽电缆或添
加磁环来降低干扰影响。

3.检查硬件设计是否合理,例如驱动电阻的阻值和电感的感量是否匹配,线路布局是
否合理等。

4.如果使用的是增量式编码器,可以尝试在程序中添加滤波算法来降低噪声和抖动的
影响,例如使用中值滤波、平均滤波等算法。

5.如果以上方法都无法解决问题,可以尝试更换编码器或读取芯片,因为也有可能是
编码器或读取芯片本身存在质量问题。

关于STM32 ADC_速度问题

关于STM32 ADC_速度问题

关于STM32 ADC_速度问题
STM32F103xx 系列称为增强型产品,增强型产品的最高时钟频率可以达到72MHz。

增强型产品的英文名称为Performance Line。

STM32F101xx 系列称为基本型产品,基本型产品的最高时钟频率可以达到36MHz。

基本型产品的英文
名称为Access Line。

根据设计,当ADC 模块的频率为14MHz 时,可以达到ADC 的最快采样转
换速度。

要得到14MHz 的ADC 频率,就要求SYSCLK 的频率是14MHz 的倍数,即14MHz、28MHz、42MHz、56MHz、70MHz、84MHz 等;对于基本型产品
14MHz 和28MHz 处于它的最大允许频率范围内;对于增强型产品,
14MHz、28MHz、42MHz、56MHz 和70MHz 几种频率都在它的最大允许频率范围内,但因为ADC 预分频器的分频系数只有2、4、6、8 这几个,使用
70MHz 不能得到最大的14MHz,所以要想得到最快的ADC 转换速度,在增强
型产品上能用的最快SYSCLK 频率是56MHz。

ADC 的速度由2 个参数决定,它是采样时间和转换时间之和:
即:TCONV= 采样时间+ 12.5 个ADC 时钟周期
在STM32 中,ADC 的采样时间是由用户程序在一组预定的数值中选择,按
照ADC 的时钟周期计算,共有8 种选择:
1.5、7.5、13.5、28.5、41.5、55.5、71.5 和239.5
按最小的1.5 个时钟周期的采样时间计算,最短的TCONV 等于14 个时钟周期,如果ADC 的时钟频率是14MHz,则ADC 的速度为每秒100 万次。

STM32的调试方式更新程序仿真以及补救措施

STM32的调试方式更新程序仿真以及补救措施

STM32的调试方式更新程序仿真以及补救措施STM32是一款常见的嵌入式微控制器系列,具有强大的性能和丰富的外设接口。

在使用STM32进行开发时,常常需要进行调试、更新程序和仿真操作,并且可能会遇到一些问题。

下面将介绍STM32的调试方式、更新程序、仿真以及补救措施。

一、调试方式:1. JTAG/SWD调试:STM32微控制器通常配备了JTAG/SWD接口,可以通过调试器连接到计算机上,通过调试器与IDE(如Keil、IAR)或开源工具(如OpenOCD)进行连调,实现程序的调试、单步执行等功能。

常见的调试器有ST-LINK、JLINK等,可以通过USB接口与计算机连接。

这种调试方式可以方便地查看寄存器的值、查看和修改内存中的数据等,非常适合对程序进行低层次的调试和优化。

2. printf输出调试:在没有调试器的情况下,我们可以通过串口打印调试信息。

STM32通常具有多个串口,可以通过配置串口参数,并使用库函数printf将调试信息发送到串口进行观察。

这种调试方式适用于获取程序中一些阶段的状态信息,但并不能进行实时的断点调试和单步执行。

二、更新程序:1.串口更新程序:将更新程序(一般是BIN或HEX格式)通过串口发送到STM32,然后利用STM32的串口接收中断或DMA功能,将接收到的数据存储到内存中,再执行程序更新的过程。

这种方式操作简单,适用于在现有系统中更新程序,但更新速度相对较慢。

2. USB DFU更新程序:STM32支持通过USB接口进行固件升级(DFU)。

通过配置USB接口参数,将更新程序发送到STM32中的内存。

然后通过执行Firmware Upgrade(固件升级)的指令,将更新程序写入到FLASH中并执行更新。

使用USBDFU更新程序可以快速方便地进行程序的更新,适用于大批量的固件升级。

三、仿真:在进行STM32程序开发的过程中,常常需要进行仿真操作,以验证程序的正确性和功能的实现。

关于STM32F103硬件IIC程序异常的问题的一个解决方法

关于STM32F103硬件IIC程序异常的问题的一个解决方法
void I2C_Configuration(void)
{
I2C_InitTypeDef I2C_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1,ENABLE);
uint8_t I2C_WriteOneByte(I2C_TypeDef *I2Cx,uint8_t I2C_Addr,uint8_t addr,uint8_t value)
{
int cnt = 0;
MY_IIC_START_LABLE:
I2C_GenerateSTART(I2Cx, ENABLE);
while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));
/*
#else
I2C_Send7bitAddress(I2Cx, addr<<1, I2C_Direction_Receiver);
while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));
* Input : I2C_TypeDef * , uint8_t
* Output : None
* Return : None
* Attention: None
*******************************************************************************/
I2C_SendData(I2Cx, addr);
uint8_t I2C_Read(I2C_TypeDef *I2Cx,uint8_t I2C_Addr,uint8_t addr,uint8_t *buf,uint16_t num)

stm32cpu的执行流程

stm32cpu的执行流程

stm32cpu的执行流程STM32是一款由STMicroelectronics公司生产的32位微控制器系列,广泛应用于嵌入式系统中。

在了解STM32的执行流程之前,我们需要先了解一些基本概念。

STM32芯片的核心是一颗ARM Cortex-M系列处理器。

这些处理器采用了精简指令集(RISC)架构,具有高性能和低功耗的特点,非常适合嵌入式应用。

在STM32系列中,常见的处理器型号有Cortex-M0、Cortex-M3和Cortex-M4等。

STM32的执行流程可以分为启动阶段和运行阶段两个部分。

在启动阶段,芯片的各个模块和外设会被初始化配置,以便在后续的运行阶段正常工作。

在运行阶段,芯片会按照程序的逻辑顺序执行指令,完成各种功能和任务。

在启动阶段,首先会进行复位操作。

当芯片上电或者复位信号触发时,处理器会从复位向量表中读取复位向量,并跳转到相应的复位处理函数进行一些必要的初始化配置。

复位向量表是一个存储着各种中断处理函数地址的表格,用于处理不同类型的中断事件。

接下来,处理器会对系统时钟进行配置。

时钟是芯片工作的基础,用于驱动各个模块和外设的运行。

在STM32中,时钟源可以来自内部和外部,可以通过配置寄存器设置时钟源的选择、分频和倍频等参数。

然后,处理器会进行外设的初始化配置。

STM32芯片集成了丰富的外设,包括通用输入输出(GPIO)、通用串行总线(USART/SPI/I2C)、模拟数字转换器(ADC/DAC)、定时器(TIM)等。

这些外设可以通过配置寄存器进行初始化设置,以满足具体应用的需求。

在运行阶段,处理器会按照程序的逻辑顺序执行指令。

程序通常由汇编语言或高级语言编写,并通过编译器转换为机器码。

处理器从存储器中读取指令,并按照指令的操作码和操作数执行相应的操作。

常见的指令包括算术运算、逻辑运算、数据传输、控制转移等。

在执行指令的过程中,处理器会使用寄存器来存储临时数据和中间结果。

STM32的处理器具有多个通用寄存器和特殊功能寄存器,用于存储不同类型的数据和控制信息。

相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
当 DEV_DelayMs 函数被编译到 8 字节对齐(0b1000 结尾)的地址,运行时间就是错误 的,当被编译到 4 字节对齐(0b100 结尾)的地址,运行时间就是正确的!
原文定位到这里就结束了,至于为什么会产生这个问题,我也不清楚,原以为是芯片的 bug。后来在论坛上有网友提出是 FLASH 读取速度不均衡造成的,我觉得有可能,但如果 是这样的话那只能说这个芯片做的不是很好,因为这个现象是与地址相关的,而且表现出来 的速度差异太大了,达到了 1:0.8,并且在 TI 的 cortex 内核上没有发现这个问题。因此我 查了一下 ST 的 FLASH 手册,发现有如下这段话:“预取缓冲器包含两个数据块,每个数据 块有 8 个字节;预取指令(数据)块直接映像到闪存中,因为数据块的大小与闪存的宽度相同, 所以读取预取指令块可以在一个读周期完成。设置预取缓冲器可以使 CPU 更快地执行,CPU 读取一个字的同时下一个字已经在预取缓冲器中等候,即当代码跳转的边界为 8 字节的倍 数时,闪存的加速比例为 2。”从中可以看到其中提到了“跳转”,提到了“8 字节对齐”, 从上面的 2 段反汇编代码可以看到,区别就在于跳转的地址不同,并且我验证的结论也是有 关 8 字节对齐的,因此这段话与我上面所得出的结论是一致的。至于上面 2 段反汇编后的代
DEV_DelayMs 函 数 位 于 unoptimize.c 文 件 中 , 当 我 改 动 其 它 c 文 件 而 没 有 改 动 unoptimize.c 文件做增量编译时,这个问题也会概率性出现。这说明什么?这说明这个问题 与 DEV_DelayMs 函数无关,是其它函数导致的。但这个问题又确实是在 DEV_DelayMs 函 数上表现出来的,而 DEV_DelayMs 函数又与其它函数没有任何耦合,这似乎是不可能的事 情。问题定位到这里已经走不下去了。
LR_IROM2 0x08019004 0x00000FFC { ER_IROM2 0x08019004 0x00000FFC { unoptimize.o }
}
; load region size_region ; load address = execution address
上面这段代码的含义是,将 unoptimize.o 文件链接到 0x08019004 这个地址空间,这就 是 一个 4 字 节对 齐 的地 址 空间 , 而 unoptimize.o 是 由 unoptimize.c 文 件编 译 成的 , 而 unoptimize.c 文件中只有 DEV_DelayMs 这一个函数,这样就将 DEV_DelayMs 函数链接到了 4 字节对齐的 0x08019004 地址空间了。
异常的代码:
movw r3, #5998 ; 0x176e mul.w r2, r0, r3 mov.w r3, #0 mov r1, r3 nop cmp r1, r2 bne.n 801901a <DEV_DelayMs+0x16> b.n 8019022 <DEV_DelayMs+0x1e> add.w r3, r1, #1 mov r1, r3 b.n 8019014 <DEV_DelayMs+0x10> nop bx lr
其中 DEV_DelayMs 函数用来在任务中产生延迟,模拟任务的业务,其中 mindows 拥有 tick 定时器,操作系统打印出的 tick 时间会反应出 DEV_DelayMs 函数的执行时间。
LM3S8962 芯片与 STM32F103VB 芯片指令速度不一样,因此在移植这 2 个操作系统时 对 DEV_DelayMs 函数内的 i、j 数值做了精确的调整,并使用了 O0(哦零,不优化)优化 选项,使之能产生精确的延迟。DEV_DelayMs 函数在 LM3S8962 芯片上工作正常,但在 STM32F103VB 芯片上却有时正常,有时异常。
mindows 在运行 DEV_DelayMs 函数的同时还会产生 tick 中断,会不会是 tick 中断对 DEV_DelayMs 函数产生了影响?为了验证这个问题,只需要在 wanlix 上运行 DEV_DelayMs
函数就可以了,因为 wanlix 是主动切换任务的系统,如果没有调用任务切换函数,那么 DEV_DelayMs 函数就会一直运行,与没有使用操作系统的情况是一样的。在 wanlix 上运行 DEV_DelayMs 函数情况一模一样,依然 存在,说明也不是 tick 中断的问题。
经过反复试验,终于又发现一个重要的线索:增量编译其它函数时也会触发这个问题概 率性出现。增量编译的意思是只编译其中一部分文件,然后一起连接成目标程序。比如说有 a.c 和 b.c 这两个文件,先将这两个文件编译成 a.o 和 b.o,然后再将 a.o 和 b.o 链接成目标文 件。当只有 a.c 文件做了改动时,那么我们可以只编译 a.c,使用新生成的 a.o 与原来的 b.o 一起链接成新的目标文件,这就是增量编译。
原因分析
mindows 操作系统的打印带有 tick 时间(每个 tick 是 10ms),这个问题最先是在 mindows 上发现的。程序中有一段 2000ms 的延迟,正常时,串口打印出这段延迟时间是 2000ms,
如下所示:
Task Test1 ---> Task Test2! Tick is: 200 Task2 is running! Tick is: 200
void DEV_DelayMs(U32 uiMs) {
unsigned int i; unsigned int j;
j = 5998 * uiMs;
for(i = 0; ; i++) {
if(i == j) {
break; } } }
背景知识介绍
我写了 2 个具有任务切换功能的小型操作系统,其中一个我称之为 wanlix,需要函数主 动调用任务切换函数才能发生任务切换,只有这一个功能,功能虽少,但也非常小巧,编译 后只有几百字节,适合程序空间只有几十 K 的小系统使用。另一个我称之为 mindows,是 实时抢占式的内核,高优先级的任务会自动抢占低优先级的任务,支持信号量、队列等功能。 更多信息,请访问我的新浪博客 /ifreecoding
8019000: 8019004: 8019008: 801900c: 801900e: 8019010: 8019012: 8019014: 8019016: 801901a: 801901c: 801901e: 8019020:
f241 736e fb00 f203 f04f 0300 4619 bf00 4291 d100 e003 f101 0301 4619 e7f8 bf00 4770
既然是修改其它文件里的函数对 DEV_DelayMs 函数有影响,那么只能试着改其它文件 中的函数来找出其中规律了。在试验中又发现,在不相关的文件中随便加入几条无用的指令 都有可能随机触发这个问题,这似乎又是不可能的事情。
问题说到这里,我已经把当时定位时所获得的全部信息都介绍全了,现在,你是否能猜 到这个问题的原因?下面就是见证奇迹的时刻!
movw r3, #5998 ; 0x176e mul.w r2, r0, r3 mov.w r3, #0 mov r1, r3 nop cmp r1, r2 bne.n 8019016 <DEV_DelayMs+0x16> b.n 801901e <DEV_DelayMs+0x1e> add.w r3, r1, #1 mov r1, r3 b.n 8019010 <DEV_DelayMs+0x10> nop bx lr
导致 STM32 芯片指令速度变化的问题分析过程
过年那几天将一份代码从 TI 的 LM3S8962 芯片移植到 ST 的 STM32F103VB 芯片上, 结果发现了 STM32 芯片指令速度会发生变化,本文将讲述这个问题的定位过程,从中你可 以看到作者根据问题的现象结合已有的知识,2 次否定了出问题的地方,但随着逐步缩小定 位范围,认真分析现象,最终还是找回到了出问题的地方,并与网友讨论后,查找芯片手册 找到了问题的原因。本文的重点不在于介绍这个问题,而是在于介绍定位这个问题的思路以 及过程,很多问题通过仔细分析是可以找到原因的。
现象描述
下 面这 段 延迟 时 间的 函 数在 LM3S8962 芯 片上 可 以产 生 正确 的 延迟 时 间, 但 在 STM32F103VB 芯片上却表现出不确定性,有时候可以延迟正确的时间,而有时候则变为正 确时间的 1.25 倍。比如,输入 200,正常的延迟时间是 2000ms,而出现异常时这段代码则 运行了 2500ms。
既然是 DEV_DelayMs 函数不准,那么很可能是 DEV_DelayMs 函数在编译时生成的汇 编指令不一样,导致 DEV_DelayMs 函数执行时间的长短不一样,而且,这个异常还伴随着 一个特点——异常与编译是相关的,也就是说编译后一旦出现异常,那么无论复位多少次, 异常一直出现,编译后一旦正常,那么无论复位多少次,均不会出现异常。这一点使我更加 坚信了是编译器编译出了不同的代码导致了问题。为了证明这一点,将正常和异常时 的 DEV_DelayMs 函数进行反汇编,对比汇编代码,结果让我很失望,汇编代码完全一样(除 了函数跳转的绝对地址,但相对地址是一样的),这说明不是 DEV_DelayMs 函数的问题, 反汇编的代码如下:
但异常时打印却变成了 2500ms,如下所示:
Task Test1 ---> Task Test2! Tick is: 250 Task2 is running! Tick is: 250
出现这个问题,有可能是 tick 时间不准,也有可能是 DEV_DelayMs 函数时间不准。在 运行时对比钟表的时间,发现 tick 时间是准的,那么说明是 DEV_DelayMs 函数时间不准。
相关文档
最新文档