
【1024活动】写一手好“Bug”的程序员们!Hello world + K" W* G& z) D. z1 f- R$ }/ d5 _* R9 k2 u' j. f( f- X ( `$ _( l" u) O& H$ x" k- |
8 {4 I* m8 N9 K0 I8 |% l* H' A ![]() ! n, `" _. _; q4 h 程序员们!这么重要的节日怎么少得了整活,活动来了! ![]() 活动内容: 就是写日常开发过程中你遇到的BUG!在下方评论! (不会写BUG的程序员不是好厨子) ![]() 5 \0 V0 }# T5 W8 Y w( y) f ![]() 活动时间: 10月24日-10月26日 ![]() ![]() 活动奖励: 抽取5位送出:小米背包、STM32开发板、笔记本支架、保温杯等! ![]() 下午三点大转盘搞起来 转盘入口 $ [0 W# f( `4 @. J6 [转前须知:必须按照需求恢复本帖才可以抽奖,否则中奖无效。 ![]() # a/ r1 s7 x9 w. t |
【技术之约】2025 STM32峰会邀您共赴技术盛宴!
【STM32F769I-DISC1】测评04:使用ADC通道制作的位移采集模块,上传数据到PC端
【STM32F769I-DISC1】测评03:使用板载的串口6制作生物体监测
【STM32F769I-DISC1】测评02:调试串口1与PC通讯功能
【名单公布】GUI Demo板申请活动出名单了!
我是星海灿烂,我的2024年总结
【粉丝福利】“意”起来!2025新年倒计时活动,7天7活动,冲!
收到新年礼物开发板
【板卡试用】ST25R100 – ST新一代高性价比NFC读写器芯片:轻松打造智能交互体验
【Free】新品STM32H503免费申请!高性能!高安全性!尽显锋芒!
开发时需要在STM32F051断电前保存少量变量数据,在ST官网下载了“STSW_STM32117_STM32F0xx微控制器中的EEPROM仿真”固件包。这个固件包演示了在仿真EEPROM的页里对VarData[0]、VarData[1]、VarData[2]写入数据,然后读出。调试过程中读写正常,但只要断电,再上电后读出的数据就不是断电前写入的数据了。
分析:' M& S* o3 x8 I+ ]6 e5 D
STM32F051C6T6的Flash长度为32KB,每页长为0x400,地址从0x08002000到0x080027FF。
查阅STM32F0xx的eeprom.h,其中有:
#define PAGE_SIZE ((uint32_t)0x0400) 8 j+ ?# V& B0 Z2 k8 ?
#define EEPROM_START_ADDRESS ((uint32_t)0x08002000)
这里定义:#defineEEPROM_START_ADDRESS ((uint32_t)0x08002000)( W: D' E' h7 U2 i: p9 A
( U& O' O) Y+ S3 G3 C) {& D) E
再查阅STM32F0xx的 eeprom.c:
uint16_t EE_ReadVariable(uint16_t VirtAddress, uint16_t* Data)" p, j% L) L% {2 M% Y( n
{ uint16_t ValidPage = PAGE0;3 }$ n/ t. v h$ n
uint16_t AddressValue = 0x7777, ReadStatus = 1;
uint32_t Address = 0x08001000, PageStartAddress = 0x08001000;9 U. n& `( j# F! n& J; l6 p
}
; h1 _% o: N% C
这里地址的分配是这样安排的:
uint32_t Address= 0x08001000, PageStartAddress = 0x08001000;6 V0 K' |0 B- T
这个EEPROM emulation in STM32F0xx是从EEPROM emulation in STM32F10xx移植过来的。于是查阅F1系列相关的文件,
9 [1 `* @1 N5 z" H; Q/ ^
STM32F10xx 的eeprom.h是这样的:/ W5 m$ O3 v c3 T4 {& D) Y
#define EEPROM_START_ADDRESS ((uint32_t)0x08010000)
STM32F10xx的 eeprom.c是这样的:
uint16_t EE_ReadVariable(uint16_t VirtAddress, uint16_t* Data)3 P) q: i& m3 R0 ]9 G
{ uint16_t ValidPage = PAGE0;; I- V4 P3 [, f! m4 h2 \, J4 B" r
uint16_t AddressValue = 0x5555, ReadStatus = 1;
uint32_t Address =0x08010000, PageStartAddress =0x08010000;% o8 m/ z; @) w
}7 j/ _) E8 a. v* Y" ?5 t
ST工程师在移植F1仿真EEPROM到F0仿真EEPROM时,忘记把F0的eeprom.h和eeprom.c文件里关于仿真Flash页的地址修改一致:: e9 Q% Z3 X' c& T7 p
在F051写入的首地址是0x08002000,而读出的首地址则在0x08001000。从而导致读数据的地址不是写入数据的地址——读出错。
修改eeprom.c代码:
uint32_t Address= 0x08002000, PageStartAddress = 0x08002000;9 u1 I6 o8 [2 A% ~" v7 d; \0 i
故障排除。
问题:IIC调试无法得到数据(写后立即读出是0x00),当前SDA输入配置位浮空输入1 P9 K) P% u; ]3 ^ d1 Y
解决:SDA输出配置为推挽,SDA输入配置为内部上拉输入# t+ P+ z; h% I V+ d
问题:指针当参数取值必定改变传参的值?/ {" ?( \9 @# W$ m- s* ]& L: ^0 ~
解决:是,查看下数组的位有没有搞错- F1 ?1 K( @, b& k( ]
1 M9 c& u7 D( s
问题:引脚控制有问题7 R5 t' r9 d- t2 a: n0 ~
解决:查看配置和宏定义是否有问题
L. V c/ t/ F$ _
问题:F103ADC+DMA采集数组数据始终为0,ADC-DR有数据4 T/ E( e& i- X/ d7 m! [; d
解决:ADC_DMACmd(ADC1, ENABLE);不应放在DMA的初始化函数里" p) G" c3 s- A
解决2:F030的CUBEMX11.0包有问题! Z. O: R9 j& Q$ M6 E: D
问题:F103SDIO+DMA+FATS无法通信、卡在死循环里
解决:F103SDIO+DMA需要GPIO全部上拉和DMAtx、rx都要单独初始化、加4B初始化( o8 v) \. h6 E' ~
问题:FATFS读操作返回FA_NO_READY - f7 g: s: I7 L6 l; e
解决:查看SDIO这个配置SDIO_CLOCK_BYPASS_DISABLE,使能就会出现上述问题$ ^- O2 }) @- n4 h
e# m5 k/ }; r F
问题:FATFS出现CMD_TIMEOUT现象
解决:BSP_SD_GetCardState这个函数需要1MS延时: r$ z9 s. w/ K3 A: _ U
问题: RTT系统出现HADRWARE_FALUT
解决:定时任务不允许使用延时3 {! y1 ~/ x2 w! R
现象: 数据高低位翻转
解决:左移改右移 memcpy固定小端拷贝 第一位拷到低8位- {. |( k5 i2 [5 s" k) [( K/ [
问题:HAL硬件IIC返回BUSY(STM32F1)
解决:需要改动RCC的I2C1的使能位置(在配置引脚之前使能)!
问题:IIC无法读取数据
解决:IIC设备地址是需要'<<1'才能使用1 C8 m7 y6 }1 x. T8 p
; L4 u' g5 G8 Y
问题:DEBUG中突然失败: T" B0 w# ~8 u0 {
解决:断点错乱会导致调试中途失败; Y l7 H5 G# O4 |% K# |+ y$ R
; v& {! S0 p2 l. z8 g: ?$ s
问题:空闲中断有触发,但DMA缓冲区没有任何数据
解决: 检查DMA外设时钟* C$ Z h4 ~1 i7 `( N. t/ D
3 d$ |8 c6 t, {1 d# m$ }( a% N
问题:CJSON print_out返回空7 E# L$ Q6 v% y
解决: 增加堆空间& Y5 n/ u3 L, Y$ v
问题:ADC速率会影响输出电流 越快电流越大
解决: 根据需求增减
; ~1 L& K% f) B% P8 I
问题:内联函数编译时出现未定义报错
解决: 一个文件只能调一次 重复调会报错
5 V! _% u4 [/ N
解决:需要改动RCC的I2C1的使能位置(在配置引脚之前使能)!
问题:IIC无法读取数据
解决:IIC设备地址是需要'<<1'才能使用& P1 M2 z1 P, n
问题:DEBUG中突然失败* ~. o5 V! O! X" x
解决:断点错乱会导致调试中途失败
问题:空闲中断有触发,但DMA缓冲区没有任何数据
解决: 检查DMA外设时钟7 V) j& T2 Y& ]7 K( U
问题:CJSON print_out返回空; S& r* q; ?; M+ S# @
解决: 增加堆空间- Y. R! T1 h8 l+ p$ O' b2 a
问题:ADC速率会影响输出电流 越快电流越大
解决: 根据需求增减/ b* n' l, f# B6 }: W& g' q' z