【1024活动】写一手好“Bug”的程序员们!Hello world 6 U7 P/ n9 v) |$ p# t; Z3 }! ] 8 Z8 z$ K( o* B( g6 C6 t, e
4 U; W: _6 h [7 k* ? 程序员们!这么重要的节日怎么少得了整活,活动来了! 活动内容: 就是写日常开发过程中你遇到的BUG!在下方评论! (不会写BUG的程序员不是好厨子) " @4 N, h" d0 @; _$ i8 j ! z: j, v, S( @' t8 l( K 7 X% ^8 ^& s6 Y; V/ D( J 活动时间: 10月24日-10月26日 ]) W% V2 z5 E6 ]' L0 V8 u! q l; i. _# F1 j/ w: M( t( |, } # N) m6 z( R/ O8 c' W; { J/ J 活动奖励: 抽取5位送出:小米背包、STM32开发板、笔记本支架、保温杯等! 8 D8 F7 Y: d; M9 R& S+ {8 E( X 下午三点大转盘搞起来 转盘入口 ) K+ Z9 e/ R' H F 转前须知:必须按照需求恢复本帖才可以抽奖,否则中奖无效。 / v" _2 P/ A: v! z) Q" i- y* y# z: h) A; U& k6 s , B' o; I9 c2 A: x0 `8 u6 p, }2 u6 B Y9 f$ v9 d" i- \% Z |
收到新年礼物开发板
兔哥的初代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]写入数据,然后读出。调试过程中读写正常,但只要断电,再上电后读出的数据就不是断电前写入的数据了。
分析:0 O( ~+ U* N# ^) j. D' e
STM32F051C6T6的Flash长度为32KB,每页长为0x400,地址从0x08002000到0x080027FF。
查阅STM32F0xx的eeprom.h,其中有:
#define PAGE_SIZE ((uint32_t)0x0400) 6 C! z( _& F5 x% d# c) Z/ g8 X$ k! M
#define EEPROM_START_ADDRESS ((uint32_t)0x08002000)
这里定义:#defineEEPROM_START_ADDRESS ((uint32_t)0x08002000)
' `; c$ M) L& P* i( }
再查阅STM32F0xx的 eeprom.c:7 p9 V+ i, M7 X/ k. ^ Y4 Z
uint16_t EE_ReadVariable(uint16_t VirtAddress, uint16_t* Data)9 u4 v- A( k. I
{ uint16_t ValidPage = PAGE0;$ T- J( ^ ]9 ?) ~0 O
uint16_t AddressValue = 0x7777, ReadStatus = 1;: T1 q% i; Q& D1 i
uint32_t Address = 0x08001000, PageStartAddress = 0x08001000;
}
3 R4 ~2 R: I7 j( T# ^8 R# l
这里地址的分配是这样安排的:
uint32_t Address= 0x08001000, PageStartAddress = 0x08001000;3 |, f. J! |1 y' u# F
这个EEPROM emulation in STM32F0xx是从EEPROM emulation in STM32F10xx移植过来的。于是查阅F1系列相关的文件, v, j7 z" f' V
& B v7 j* v7 b- U8 d y$ u
STM32F10xx 的eeprom.h是这样的:
#define EEPROM_START_ADDRESS ((uint32_t)0x08010000) # v% K: u" X( f7 y1 Q$ o8 z
STM32F10xx的 eeprom.c是这样的:
uint16_t EE_ReadVariable(uint16_t VirtAddress, uint16_t* Data)
{ uint16_t ValidPage = PAGE0;
uint16_t AddressValue = 0x5555, ReadStatus = 1;
uint32_t Address =0x08010000, PageStartAddress =0x08010000;( O. P" S" t. B' G
}
ST工程师在移植F1仿真EEPROM到F0仿真EEPROM时,忘记把F0的eeprom.h和eeprom.c文件里关于仿真Flash页的地址修改一致:- e( I+ h0 F {% [ J% {5 e
在F051写入的首地址是0x08002000,而读出的首地址则在0x08001000。从而导致读数据的地址不是写入数据的地址——读出错。 V$ h! v# w* @# f3 r' X% u' e7 o3 H
修改eeprom.c代码: Y2 @- \, n$ i
uint32_t Address= 0x08002000, PageStartAddress = 0x08002000;6 L: F9 x3 `# p, O( S
故障排除。
问题:IIC调试无法得到数据(写后立即读出是0x00),当前SDA输入配置位浮空输入
解决:SDA输出配置为推挽,SDA输入配置为内部上拉输入0 Y+ Y. m/ z) R* U$ T! R
6 Z! o& N, o$ q% h) B
问题:指针当参数取值必定改变传参的值?8 j6 R% G9 F/ G6 K
解决:是,查看下数组的位有没有搞错# p1 n. k, x+ X% P, p( E
问题:引脚控制有问题, n& a2 t8 J- T% l0 E$ Z; f
解决:查看配置和宏定义是否有问题
/ w0 [3 l9 \. }
问题:F103ADC+DMA采集数组数据始终为0,ADC-DR有数据
解决:ADC_DMACmd(ADC1, ENABLE);不应放在DMA的初始化函数里$ h5 |$ `% w: T/ L
解决2:F030的CUBEMX11.0包有问题
7 M1 V1 w2 P) K+ b! ^, i
问题:F103SDIO+DMA+FATS无法通信、卡在死循环里
解决:F103SDIO+DMA需要GPIO全部上拉和DMAtx、rx都要单独初始化、加4B初始化
问题:FATFS读操作返回FA_NO_READY + ~6 a0 q h8 V3 R9 M5 K
解决:查看SDIO这个配置SDIO_CLOCK_BYPASS_DISABLE,使能就会出现上述问题! F5 D$ _) w/ l
问题:FATFS出现CMD_TIMEOUT现象
解决:BSP_SD_GetCardState这个函数需要1MS延时
7 I0 b! x, Z2 u
问题: RTT系统出现HADRWARE_FALUT" } Y# X3 l4 B, |' Y. |& I) Y( S
解决:定时任务不允许使用延时
3 `- J1 I$ }' ^( d
现象: 数据高低位翻转7 i) }4 }! `1 |- M
解决:左移改右移 memcpy固定小端拷贝 第一位拷到低8位
- F8 S7 y9 Z3 n& g8 `5 z, ~
问题:HAL硬件IIC返回BUSY(STM32F1)& S* m8 Q8 Q$ z! D
解决:需要改动RCC的I2C1的使能位置(在配置引脚之前使能)!+ `3 m- H' s& p% c3 [: m
问题:IIC无法读取数据
解决:IIC设备地址是需要'<<1'才能使用& ?; z# l' e4 u* w5 s
0 p/ T M1 n! ^ d
问题:DEBUG中突然失败
解决:断点错乱会导致调试中途失败
问题:空闲中断有触发,但DMA缓冲区没有任何数据& F X$ N( @" e% ]" m( S$ b
解决: 检查DMA外设时钟
问题:CJSON print_out返回空; w* G, I6 ?. V. { V
解决: 增加堆空间
+ N2 D, ]* u2 g( {2 e
问题:ADC速率会影响输出电流 越快电流越大, y& n+ L0 _4 I6 H* F8 C; U2 i
解决: 根据需求增减
问题:内联函数编译时出现未定义报错
解决: 一个文件只能调一次 重复调会报错7 N. o1 X4 [5 Y% U' e; l" ^8 H
1 \1 P# [) u4 z6 C9 G
解决:需要改动RCC的I2C1的使能位置(在配置引脚之前使能)!" e+ `% D) C5 {5 k2 |; b! S. E$ ^
问题:IIC无法读取数据- J5 V6 v- _2 f7 y
解决:IIC设备地址是需要'<<1'才能使用! p" b' }" B8 z0 R5 ~# p* G$ ?9 G0 b
问题:DEBUG中突然失败
解决:断点错乱会导致调试中途失败; V; p x5 C2 H$ W2 V8 P
问题:空闲中断有触发,但DMA缓冲区没有任何数据3 O$ o* |, y# C$ d
解决: 检查DMA外设时钟$ c& @/ y- E( g3 b7 s e
7 G3 J' Y l: v* k) Y9 b( L
问题:CJSON print_out返回空
解决: 增加堆空间( i f( `7 D5 u, `$ E$ ]
问题:ADC速率会影响输出电流 越快电流越大
解决: 根据需求增减9 F h, T& t' N$ \- m `