
【1024活动】写一手好“Bug”的程序员们!Hello world $ k, U& {% Z" W2 X& |& j7 |: j
![]() : d, J! ?, T5 H* v 程序员们!这么重要的节日怎么少得了整活,活动来了! ![]() 活动内容: 就是写日常开发过程中你遇到的BUG!在下方评论! (不会写BUG的程序员不是好厨子) ![]() # k2 L7 e) `8 X ![]() 活动时间: 10月24日-10月26日 ![]() : m& G" B5 s0 R; ~8 e. u7 {, _) m ![]() 活动奖励: 抽取5位送出:小米背包、STM32开发板、笔记本支架、保温杯等! ![]() 下午三点大转盘搞起来 转盘入口 转前须知:必须按照需求恢复本帖才可以抽奖,否则中奖无效。 ) @+ b9 M$ T% ^- R; B9 i/ ?( L ![]() |
【技术之约】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]写入数据,然后读出。调试过程中读写正常,但只要断电,再上电后读出的数据就不是断电前写入的数据了。
分析:
STM32F051C6T6的Flash长度为32KB,每页长为0x400,地址从0x08002000到0x080027FF。
查阅STM32F0xx的eeprom.h,其中有:
#define PAGE_SIZE ((uint32_t)0x0400) $ @% E+ R; ^6 I3 n& v# {/ }* d) V E
#define EEPROM_START_ADDRESS ((uint32_t)0x08002000)4 X2 T1 D4 E, K& g; d
这里定义:#defineEEPROM_START_ADDRESS ((uint32_t)0x08002000)
7 W8 N5 Q9 ^$ C# `) ]
再查阅STM32F0xx的 eeprom.c:. ` S+ ^1 F2 P& J& I* k
uint16_t EE_ReadVariable(uint16_t VirtAddress, uint16_t* Data); H5 c) i+ z: Q( @" e' y, Y
{ uint16_t ValidPage = PAGE0;
uint16_t AddressValue = 0x7777, ReadStatus = 1;
uint32_t Address = 0x08001000, PageStartAddress = 0x08001000;* w7 K( f4 T1 G( z, d
}
$ U9 r8 |5 }" r6 r4 d( [2 @8 y6 L! g
$ a* F' |! D/ U0 M* O. _
这里地址的分配是这样安排的:
uint32_t Address= 0x08001000, PageStartAddress = 0x08001000;
这个EEPROM emulation in STM32F0xx是从EEPROM emulation in STM32F10xx移植过来的。于是查阅F1系列相关的文件,
2 B7 B; C( m/ v; p6 q3 Y
* P: L9 y! K9 v& W( w, i* k8 O6 e) w
STM32F10xx 的eeprom.h是这样的:2 g& I, v$ D% K; @
#define EEPROM_START_ADDRESS ((uint32_t)0x08010000) . r; w8 ^, D9 B# _
STM32F10xx的 eeprom.c是这样的:3 P$ Q Q3 k. v: m0 q9 |5 E
uint16_t EE_ReadVariable(uint16_t VirtAddress, uint16_t* Data)
{ uint16_t ValidPage = PAGE0;$ d7 D; U R8 R* N
uint16_t AddressValue = 0x5555, ReadStatus = 1;" t. Z' ~6 [( r, ^/ u& g; b
uint32_t Address =0x08010000, PageStartAddress =0x08010000;
}4 M2 s$ m* s8 q' o- i4 I l3 K
ST工程师在移植F1仿真EEPROM到F0仿真EEPROM时,忘记把F0的eeprom.h和eeprom.c文件里关于仿真Flash页的地址修改一致:3 @' A8 \4 Q8 M; ?% e E
在F051写入的首地址是0x08002000,而读出的首地址则在0x08001000。从而导致读数据的地址不是写入数据的地址——读出错。' z. k, ?: o; N3 x- g0 {* {( N' p: @
修改eeprom.c代码:* Q( S3 M4 {! d K4 ^
uint32_t Address= 0x08002000, PageStartAddress = 0x08002000;# _8 q- ~* a% N5 R+ O
故障排除。
问题:IIC调试无法得到数据(写后立即读出是0x00),当前SDA输入配置位浮空输入
解决:SDA输出配置为推挽,SDA输入配置为内部上拉输入% Z# e" [( C9 h: l3 T
* y$ L& y! N) @4 j
问题:指针当参数取值必定改变传参的值?
解决:是,查看下数组的位有没有搞错- b$ k+ H5 s; [ |
- T0 s: Y* E L W% o
问题:引脚控制有问题
解决:查看配置和宏定义是否有问题
4 h+ D5 _* j: T) W- | v2 w0 A
问题:F103ADC+DMA采集数组数据始终为0,ADC-DR有数据! [2 L5 Y0 u5 Z _
解决:ADC_DMACmd(ADC1, ENABLE);不应放在DMA的初始化函数里/ M( Y( ^" q+ g9 \7 M4 b
解决2:F030的CUBEMX11.0包有问题
问题:F103SDIO+DMA+FATS无法通信、卡在死循环里" v9 R L, Q! ~
解决:F103SDIO+DMA需要GPIO全部上拉和DMAtx、rx都要单独初始化、加4B初始化0 ]: a0 O% c" t0 u' d
, B4 F' c" G& M* t0 y `
问题:FATFS读操作返回FA_NO_READY ' Y8 ^ J8 X8 [; w9 G, x* _; `! r
解决:查看SDIO这个配置SDIO_CLOCK_BYPASS_DISABLE,使能就会出现上述问题3 E' N: ]; W9 S! g! b
问题:FATFS出现CMD_TIMEOUT现象
解决:BSP_SD_GetCardState这个函数需要1MS延时) Z& G- `# r1 ?% T8 i% {( g
问题: RTT系统出现HADRWARE_FALUT
解决:定时任务不允许使用延时
现象: 数据高低位翻转: L. N. f1 W/ B4 L$ h
解决:左移改右移 memcpy固定小端拷贝 第一位拷到低8位
问题:HAL硬件IIC返回BUSY(STM32F1)
解决:需要改动RCC的I2C1的使能位置(在配置引脚之前使能)!8 V9 s7 B0 e6 y% k
问题:IIC无法读取数据
解决:IIC设备地址是需要'<<1'才能使用5 k9 m- v) j8 |( i& x& U
问题:DEBUG中突然失败+ I8 ^" x1 m, o0 y& P) V
解决:断点错乱会导致调试中途失败
问题:空闲中断有触发,但DMA缓冲区没有任何数据& ^% @9 O6 T% L" V0 k0 U2 C
解决: 检查DMA外设时钟
: E/ D- T0 i, q3 N5 I6 K
问题:CJSON print_out返回空
解决: 增加堆空间1 k" R* @ c' D; Z; }1 r6 v
% {8 R% Y* v' ~/ Y9 D z$ g
问题:ADC速率会影响输出电流 越快电流越大" K+ F _' f& [' R2 G2 ?
解决: 根据需求增减
问题:内联函数编译时出现未定义报错
解决: 一个文件只能调一次 重复调会报错
" S3 X5 D0 o* Q# `& t% Q' M6 Y
解决:需要改动RCC的I2C1的使能位置(在配置引脚之前使能)!
问题:IIC无法读取数据
解决:IIC设备地址是需要'<<1'才能使用
' W" l7 Z: g, P2 Y8 P5 C
问题:DEBUG中突然失败
解决:断点错乱会导致调试中途失败
问题:空闲中断有触发,但DMA缓冲区没有任何数据
解决: 检查DMA外设时钟$ E" f* |! x; W
! s2 i' ^0 w7 ?) r; @# q: G7 b* |3 P
问题:CJSON print_out返回空/ @0 g5 T. W4 j/ W' g* f
解决: 增加堆空间
2 r7 f; e$ e! u3 b
问题:ADC速率会影响输出电流 越快电流越大! D) @' J1 v/ z6 |! [
解决: 根据需求增减