【1024活动】写一手好“Bug”的程序员们!Hello world 5 m2 s* S7 w6 \* L/ C5 i: K4 Z
5 d: l: s8 k$ v* p) k8 Q' u 程序员们!这么重要的节日怎么少得了整活,活动来了! * H, E. S& e4 q活动内容: 就是写日常开发过程中你遇到的BUG!在下方评论! (不会写BUG的程序员不是好厨子) / Z {% g5 ~6 b9 A7 ^+ \) P . S( y3 @( J1 x& H1 Y9 F( I% ^ 活动时间: 10月24日-10月26日 5 X5 i/ o( ~1 h: ]9 r! ~" ]# `6 H( O _0 N/ h 活动奖励: 抽取5位送出:小米背包、STM32开发板、笔记本支架、保温杯等! 5 F ?5 M5 j7 @7 | 下午三点大转盘搞起来 转盘入口 转前须知:必须按照需求恢复本帖才可以抽奖,否则中奖无效。 ; @; i8 u! `8 E 4 K8 J7 F9 [( t2 z! F) T# E$ |, Y1 ]$ A7 J g$ { |
收到新年礼物开发板
兔哥的初代M33【001】-L5DK亮屏
【Free】新品STM32H503免费申请!高性能!高安全性!尽显锋芒!
【玩转AI,尽在N6】板卡试用 | STM32N6一款加速你AI设计的新品
【宠粉福利】2024 ST中文论坛年终粉丝狂欢节
我是刘氓兔,我的2024年总结
我是星海灿烂,我的2024年总结
我是聪聪哥哥,我的2024年总结
【2024 ST中文论坛年终粉丝狂欢节】——lugl的2024年总结
【2024年末收尾竞拍】消耗金币即可获奖
开发时需要在STM32F051断电前保存少量变量数据,在ST官网下载了“STSW_STM32117_STM32F0xx微控制器中的EEPROM仿真”固件包。这个固件包演示了在仿真EEPROM的页里对VarData[0]、VarData[1]、VarData[2]写入数据,然后读出。调试过程中读写正常,但只要断电,再上电后读出的数据就不是断电前写入的数据了。
分析:
STM32F051C6T6的Flash长度为32KB,每页长为0x400,地址从0x08002000到0x080027FF。
查阅STM32F0xx的eeprom.h,其中有:
#define PAGE_SIZE ((uint32_t)0x0400)
#define EEPROM_START_ADDRESS ((uint32_t)0x08002000)
这里定义:#defineEEPROM_START_ADDRESS ((uint32_t)0x08002000)
& K: [% y& l2 `1 ], o
$ ~7 A/ n9 O) `" W
再查阅STM32F0xx的 eeprom.c:
uint16_t EE_ReadVariable(uint16_t VirtAddress, uint16_t* Data)
{ uint16_t ValidPage = PAGE0;: v) k% \5 P' X. g6 S. r8 Y
uint16_t AddressValue = 0x7777, ReadStatus = 1;
uint32_t Address = 0x08001000, PageStartAddress = 0x08001000;" h" W9 ]" i& R7 u3 D, f/ h
}, l% G" A; `" Q( [ O& z! V9 Y
, D/ i: O' F& Q" e4 W. b* M
1 Z% ^( {* Y5 W" r% F
这里地址的分配是这样安排的:( L9 U9 u3 }' b1 q! k3 z7 @
uint32_t Address= 0x08001000, PageStartAddress = 0x08001000;! J) B# k1 ~2 _: x& |" A) w$ t
这个EEPROM emulation in STM32F0xx是从EEPROM emulation in STM32F10xx移植过来的。于是查阅F1系列相关的文件,1 p, L# r- I* v1 P
STM32F10xx 的eeprom.h是这样的:& P% n/ m& u$ D0 d; K! Q! x& w8 K
#define EEPROM_START_ADDRESS ((uint32_t)0x08010000) ! L8 k# k$ d. u4 o
STM32F10xx的 eeprom.c是这样的:$ A Y" _6 I* ?) E: o& R; u
uint16_t EE_ReadVariable(uint16_t VirtAddress, uint16_t* Data)+ A$ ` D/ V; H! _, h4 ^; |
{ uint16_t ValidPage = PAGE0;
uint16_t AddressValue = 0x5555, ReadStatus = 1;/ W0 t, }9 }7 k4 g9 B& o6 `2 P/ J% r$ x
uint32_t Address =0x08010000, PageStartAddress =0x08010000;" c5 M8 s6 k( R$ U3 f
}
ST工程师在移植F1仿真EEPROM到F0仿真EEPROM时,忘记把F0的eeprom.h和eeprom.c文件里关于仿真Flash页的地址修改一致:
在F051写入的首地址是0x08002000,而读出的首地址则在0x08001000。从而导致读数据的地址不是写入数据的地址——读出错。1 L* A7 o9 V* ` ?4 S1 _8 \/ M
修改eeprom.c代码:
uint32_t Address= 0x08002000, PageStartAddress = 0x08002000;
故障排除。
问题:IIC调试无法得到数据(写后立即读出是0x00),当前SDA输入配置位浮空输入
解决:SDA输出配置为推挽,SDA输入配置为内部上拉输入
' n" |' u) e) M" }' D& G3 [+ g
问题:指针当参数取值必定改变传参的值?$ V5 C: F! e# n$ ^; L
解决:是,查看下数组的位有没有搞错* o3 N: W% V s6 @
- Y- a" m: Z5 S6 F. [( I( c
问题:引脚控制有问题
解决:查看配置和宏定义是否有问题/ } |6 c& Z$ H" R! w# h& E3 m+ p
3 ^, U2 Y- [, M1 a6 U' z
问题:F103ADC+DMA采集数组数据始终为0,ADC-DR有数据
解决:ADC_DMACmd(ADC1, ENABLE);不应放在DMA的初始化函数里
解决2:F030的CUBEMX11.0包有问题0 D3 f( J8 C; m* u
问题:F103SDIO+DMA+FATS无法通信、卡在死循环里$ q) Y: ~, J+ i- ]% j
解决:F103SDIO+DMA需要GPIO全部上拉和DMAtx、rx都要单独初始化、加4B初始化/ z) c! {" b7 i D5 |6 a
问题:FATFS读操作返回FA_NO_READY
解决:查看SDIO这个配置SDIO_CLOCK_BYPASS_DISABLE,使能就会出现上述问题& ?) l3 F0 e; D6 |
3 M: |! X' j3 l. n5 e4 K
问题:FATFS出现CMD_TIMEOUT现象
解决:BSP_SD_GetCardState这个函数需要1MS延时* b" B, \& ^; Y
' P( G* {% x. j2 w
问题: RTT系统出现HADRWARE_FALUT, b) l# m1 c1 y' s2 F4 v
解决:定时任务不允许使用延时
现象: 数据高低位翻转
解决:左移改右移 memcpy固定小端拷贝 第一位拷到低8位; v) g. q8 H( p9 \1 ~
- [4 P+ ^) |& X
问题:HAL硬件IIC返回BUSY(STM32F1)
解决:需要改动RCC的I2C1的使能位置(在配置引脚之前使能)!/ \2 p) p! O* R. R: m2 E& V
- `# S6 R) [7 u/ t' l6 g
问题:IIC无法读取数据
解决:IIC设备地址是需要'<<1'才能使用
问题:DEBUG中突然失败
解决:断点错乱会导致调试中途失败
问题:空闲中断有触发,但DMA缓冲区没有任何数据3 ^3 S" ^7 a2 F8 u8 J
解决: 检查DMA外设时钟
问题:CJSON print_out返回空
解决: 增加堆空间
问题:ADC速率会影响输出电流 越快电流越大8 Y+ U* @2 J8 a& W# |+ _; X
解决: 根据需求增减
问题:内联函数编译时出现未定义报错8 a( S9 a$ H/ M! a- e4 n( l
解决: 一个文件只能调一次 重复调会报错
解决:需要改动RCC的I2C1的使能位置(在配置引脚之前使能)!
) E9 R) _2 V+ ~7 K" {5 ~) s' r
问题:IIC无法读取数据
解决:IIC设备地址是需要'<<1'才能使用" t7 B+ F' l" E& Y5 @; a/ Y5 N
3 l8 v, m7 g) Q+ X# C; v
问题:DEBUG中突然失败
解决:断点错乱会导致调试中途失败) n6 S5 H5 V: Z' x' I! ~
; Q8 t* U' p1 N9 w' u" E* S- k
问题:空闲中断有触发,但DMA缓冲区没有任何数据
解决: 检查DMA外设时钟
问题:CJSON print_out返回空
解决: 增加堆空间
9 I/ N7 p$ t+ r$ h! r
问题:ADC速率会影响输出电流 越快电流越大+ @6 Z( k/ W4 K5 b
解决: 根据需求增减* y, c7 ~& e1 H) ]* H/ a