1、栈溢出
调试时发现有个调节PWM占空比的参数会莫名其妙的乱跳。观察代码,求这个系数的函数只在系统初始化的时候求过一次,之后就再也没有调用过。
单步执行代码,发现初始化时第一次运行时求出的系数是对的,但是全速运行后,这里面的系数就变了。
既然我没有调用函数来修改这个值,那肯定是被别的区域的值覆盖了。
打开map文件,看一下Trans_1_BaseStructre这个结构体周围都有哪些数据
ModbusSend这数组是用来发送串口数据的,空运行的时候里面全是0,那只可能是__initial_sp影响了。而__initial_sp是栈底地址,所以应该是栈溢出了。
想起来之前因为某种原因把栈空间改成512字节,所以才导致溢出。把栈大小改为1024字节后就都正常了。
2、串口不正常。用上位机软件发送一串数字,单片机收到的全是乱码,都不知道是啥。
首先检查了一下串口初始化的各个参数,并和以前正常的代码对比了一下,发现参数都正确。
一番对比后,发现是串口的波特率不对
我明明想初始化成4800bps,但是出来的是6635这个鬼东西。
心想莫非是系统时钟出问题了?可是仿真界面的时钟也是对的:
在定时器里面写了个IO口翻转的测试代码,发现IO口翻转的频率和设想的一致,所以系统的时钟应该没问题。
单步跟踪USART_Init(USART1, &USART_InitStructure)串口初始化函数,发现里面的RCC_GetClocksFreq(&RCC_ClocksStatus)这个函数得出的系统时钟竟然是24M。。
再单步运行进去,最终发现是HSE_VALUE这个宏定义没有修改
把这个宏定义修改成正确值后就都正常了。
这个宏定义也可以在keil的魔术棒里预定义,这样就不用改头文件了。截图如下:
关键字:STM32 BUG 栈溢出 串口调试
引用地址:
STM32--今天下午遇到了两个BUG
推荐阅读最新更新时间:2024-11-16 22:48
STM32串口操作相关事项
放了一段时间,对stm32似乎有点陌生,总结一下! (基于3.0固件库,芯片stm32f103rbt6) 1、配置串口的管脚和时钟 由于串口1、2是在GPIOA上: 所以要是能串口GPIOA、AFIO和1或者2的串口时钟,代码如下: RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO | RCC_APB2Periph_USART1 , ENABLE); 2、对串口的具体物理管脚进行相应的配置: /* A9 USART1_Tx */ GPIO_InitStructure.GPIO_Pin = GPIO_Pi
[单片机]
STM32F103标准库开发:Keil5新建STM32工程
新建STM32工程 步骤一:创建工程模板文件 新建一个文件夹 template 在文件夹template里面新建四个文件 (1)CMSIS: 存放内核驱动程序和启动引导文件 (2)FWLIB:存放库函数文件 (3)Project:存放工程文件 (4)User: 存放用户程序(主函数) 具体效果图如下: 步骤二:导入stm32固件库 STM32固件库的下载链接 1. 打开STM32F10x固件库文件 其中需要用到的两个文件:Libraries和Project。 2. 导入文件到 CMSIS 文件 (1)导入内核驱动程序 STM32F10x_StdPeriph_Lib_V3.6.0LibrariesCMSISCM3
[单片机]
STM32定时器产生不同频率的PWM
STM32产生PWM是非常的方便的,要需要简单的设置定时器,即刻产生! (1)使能定时器时钟:RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); (2)定义相应的GPIO: /* PA2,3,4,5,6输出- Key_Up,Key_Down,Key_Left,Key_Right,Key_Ctrl */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU
[单片机]
STM32 PWM输出控制步进电机-3000转每分钟串口显示+电位器调速
用电位器控制步进电机转速,可以控制正反转,在电位器中点停止;越往左翻转越快,越往右正转越快。速度均匀,包含滤波。付完整代码。全部测试正常。 单片机源程序: #include led.h #include delay.h #include key.h #include sys.h #include usart.h #include timer.h #include adc.h int main(void) { u16 adcx; float temp; int a=3999; //int b=0 u16 led0pwmval=200; u8
[单片机]
基于STM32实现MQTT
1、MQTT协议 MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议),是一种基于发布/订阅(publish/subscribe)模式的 轻量级 通讯协议,该协议构建于TCP/IP协议上,由IBM在1999年发布。MQTT最大优点在于,可以以极少的代码和有限的带宽,为连接远程设备提供实时可靠的消息服务。作为一种低开销、低带宽占用的即时通讯协议,使其在物联网、小型设备、移动应用等方面有较广泛的应用。 协议详情: MQTT Version 3.1.1(英文版) (中文版) 2、STM32实现的自我理解 既然是一个协议,所以有一个基本的物理网络
[单片机]
STM32 启动代码汇编指令详解
● EQU 伪指令EQU用来为一个数字常量或一个和内核寄存器相关的数值或一个和程序计数器相关的数值定义的一个符号名称,类似于C语言中的 #define 。 语法格式:name EQU expr{ , type} 注意:语法格式中的{ }不属于语法格式的部分,并且{ }中的内容是可选的; name:数值(expr)的符号名称; expr:一个与内核寄存器相关的地址,或一个绝对地址,或一个与PC相关的地址,或一个32位整型常量; type:可选项,它可以是ARM、THUMB、CODE16、CODE32或DATA中的任何一个。 举个例子: fiq EQU 0x1C,CODE32 ● AREA 伪指
[单片机]
STM32汇编指令(一)WFI 和 WFE
ARM汇编的调用 嵌入式开发,尤其是编写BSP的时候,非常接近底层,这个时候有可能用一些汇编指令来保证程序的简洁和高效,但是平常编写代码用到的都是C/C++,那么如何使用汇编指令呢? 其实这个问题也很简单,在C/C++中提供了关键字asm或者ASM来内嵌汇编,使用如下: asm( WFI ); 但是这种方法问题比较大,在Cortex-M平台上,这个语句有很大几率编译不通过,因为各家编译器又实现了自己的宏,具体可以在core_cmx.h中看到,如果我们的项目要在不同的编译器上通过,可以考虑使用条件编译来达标,不过这样付出的成本就很大。 另外一种简单的方法是使用intrinsic.h这个头文件,这个头文件把所有的汇编
[单片机]
AMD巴塞罗纳四核CPU延期至9月 样品有Bug
5月18日消息,据中国台湾媒体报道,被给予厚望的AMD巴塞罗纳(Barcelona)四核处理器将延迟到今年9月上市。 该消息称,AMD原计划于今年6月推出基于K10架构的巴塞罗纳处理器,但AMD日前通知服务器厂商,该款处理器将被延迟到8月或9月推出。 AMD同时还表示,如果发生某些变化,该日期可能再次推迟。尽管AMD并未说明延迟上市的具体原因,但有消息称,在产品样品中仍有“Bug”存在。 AMD巴塞罗纳处理器是对英特尔Clovertown四核至强处理器的反击。与两个双核的Clovertown四核处理器相比,AMD的巴塞罗纳是一款真正的四核处理器。 AMD此前曾表示,英特尔今年将没有一款产品可以超越巴塞罗纳。此外,业内专家D
[焦点新闻]