【1024活动】写一手好“Bug”的程序员们!Hello world ! K) G3 \' W7 n) S4 E% x3 X+ l( U9 d7 ^! ?/ z. \
5 ?! s, W9 w1 u8 h) n+ e, T 程序员们!这么重要的节日怎么少得了整活,活动来了! 活动内容: 就是写日常开发过程中你遇到的BUG!在下方评论! (不会写BUG的程序员不是好厨子) , Q" q8 A5 B3 a' s s % A( H3 C& [8 K9 |9 h 4 E! ]0 }8 I2 b1 W% t* L 活动时间: 10月24日-10月26日 & k; _; c4 n9 b! `+ }4 I* x5 ]3 |* o . v( q) D8 [( X* f7 I # _ q/ n! t8 r; L( Z& Y 活动奖励: 抽取5位送出:小米背包、STM32开发板、笔记本支架、保温杯等! 下午三点大转盘搞起来 转盘入口 $ a' W; Q) ?( Y# V转前须知:必须按照需求恢复本帖才可以抽奖,否则中奖无效。 4 O5 `# r8 f; I; y0 @3 s$ u3 y 2 ^, o+ M+ d4 v! e1 F- j, }. ^" t7 j) V) ?7 T( o [0 S1 w, @6 N$ N- D |
【有奖报名】STM32线上技术日,探索2024重磅新品
【学习有礼】GUI专场:TouchGFX GUI开发实践小课堂
【Free】新品STM32H503免费申请!高性能!高安全性!尽显锋芒!
倒计时6活动之有奖学习打卡
【中奖公布】2023年度粉丝节活动开奖了~
【爆料提前看】新品STM32U545要来尝鲜了,你准备好了吗?
开启2024年新篇章!感谢STM32社区的新年礼物~
【金币攻略】一问再一答,你的金币就送达
【NUCLEO-C031C6】初始化 FOC
【NUCLEO-C031C6】环境搭建 FOC初始化配置
开发时需要在STM32F051断电前保存少量变量数据,在ST官网下载了“STSW_STM32117_STM32F0xx微控制器中的EEPROM仿真”固件包。这个固件包演示了在仿真EEPROM的页里对VarData[0]、VarData[1]、VarData[2]写入数据,然后读出。调试过程中读写正常,但只要断电,再上电后读出的数据就不是断电前写入的数据了。0 q% e4 Y o, j
分析:
STM32F051C6T6的Flash长度为32KB,每页长为0x400,地址从0x08002000到0x080027FF。
查阅STM32F0xx的eeprom.h,其中有:
#define PAGE_SIZE ((uint32_t)0x0400) 1 x' f% f& H1 Y) ~" H0 O0 I
#define EEPROM_START_ADDRESS ((uint32_t)0x08002000)
这里定义:#defineEEPROM_START_ADDRESS ((uint32_t)0x08002000)3 S. B- y+ W0 v) V# s0 d
- S9 Z7 m7 J' ]
再查阅STM32F0xx的 eeprom.c:& I1 i1 v4 V; H1 @
uint16_t EE_ReadVariable(uint16_t VirtAddress, uint16_t* Data)
{ uint16_t ValidPage = PAGE0;$ }6 R, l0 \; _2 a
uint16_t AddressValue = 0x7777, ReadStatus = 1;. f6 h) ]. O6 {1 P7 f, b, c
uint32_t Address = 0x08001000, PageStartAddress = 0x08001000;
}
. J% x3 _% T0 i9 f" J& z
) u1 n9 ~; @' e( X0 m
这里地址的分配是这样安排的:) b1 a% Z/ [ T7 y9 I
uint32_t Address= 0x08001000, PageStartAddress = 0x08001000;
这个EEPROM emulation in STM32F0xx是从EEPROM emulation in STM32F10xx移植过来的。于是查阅F1系列相关的文件,
' B5 t2 @2 v# ~% e& }
1 e5 P" }; N( u6 q! U! E$ |8 X
STM32F10xx 的eeprom.h是这样的:9 B: R* T0 W- {; V
#define EEPROM_START_ADDRESS ((uint32_t)0x08010000)
STM32F10xx的 eeprom.c是这样的:0 d, _; X; x6 l7 w7 M' Z
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;
}
ST工程师在移植F1仿真EEPROM到F0仿真EEPROM时,忘记把F0的eeprom.h和eeprom.c文件里关于仿真Flash页的地址修改一致:1 _) W. c- e9 F- n
在F051写入的首地址是0x08002000,而读出的首地址则在0x08001000。从而导致读数据的地址不是写入数据的地址——读出错。
修改eeprom.c代码:9 ]" P0 d6 i/ G" I
uint32_t Address= 0x08002000, PageStartAddress = 0x08002000;
故障排除。# f( \4 j3 w, \# [7 U
: u- Y( Y6 S; n& O" k5 o/ E' i
问题:IIC调试无法得到数据(写后立即读出是0x00),当前SDA输入配置位浮空输入
解决:SDA输出配置为推挽,SDA输入配置为内部上拉输入
问题:指针当参数取值必定改变传参的值?' k1 r; C7 L7 e6 v! w
解决:是,查看下数组的位有没有搞错5 L" I& n) K6 v8 a
问题:引脚控制有问题
解决:查看配置和宏定义是否有问题
2 J, \0 ~) ^, w, |( X8 L
问题:F103ADC+DMA采集数组数据始终为0,ADC-DR有数据3 l9 T" b, q% U/ K8 `3 J, V
解决:ADC_DMACmd(ADC1, ENABLE);不应放在DMA的初始化函数里; J/ u/ Z. f8 I3 R
解决2:F030的CUBEMX11.0包有问题
4 g0 d) T' x" J2 M; c
问题:F103SDIO+DMA+FATS无法通信、卡在死循环里
解决:F103SDIO+DMA需要GPIO全部上拉和DMAtx、rx都要单独初始化、加4B初始化
4 R) t, B8 G5 x$ R7 ]9 x5 ^6 j d
问题:FATFS读操作返回FA_NO_READY 9 q& O& o/ _' f) a9 b' p
解决:查看SDIO这个配置SDIO_CLOCK_BYPASS_DISABLE,使能就会出现上述问题 Q ^- {) a0 b+ T7 H- q2 A; Y
问题:FATFS出现CMD_TIMEOUT现象
解决:BSP_SD_GetCardState这个函数需要1MS延时) T9 t. j. a) e$ ?- W& j9 H
3 }7 o% ~4 V; ?* A2 D& a
问题: RTT系统出现HADRWARE_FALUT3 \5 K: O3 C# P6 o7 a
解决:定时任务不允许使用延时
* F, z& U$ p/ U
现象: 数据高低位翻转
解决:左移改右移 memcpy固定小端拷贝 第一位拷到低8位 \- h7 L/ i4 y
5 }: C# i$ U* N9 k4 _1 y! O7 m% _
问题:HAL硬件IIC返回BUSY(STM32F1)
解决:需要改动RCC的I2C1的使能位置(在配置引脚之前使能)!/ ^2 @5 b% N6 Z
问题:IIC无法读取数据
解决:IIC设备地址是需要'<<1'才能使用
* V* u4 Z% o3 s0 b& T
问题:DEBUG中突然失败/ j* K6 z; s& L. X- @# B: K
解决:断点错乱会导致调试中途失败
问题:空闲中断有触发,但DMA缓冲区没有任何数据; _+ S9 m7 V9 G4 ]3 D. \' [% N5 V2 U
解决: 检查DMA外设时钟% i5 {# X k% z& e4 |
& {' v/ J9 a7 Y& v e
问题:CJSON print_out返回空4 G5 u+ H5 e3 @ ^/ B
解决: 增加堆空间5 n8 o- k I1 j7 @& `
问题:ADC速率会影响输出电流 越快电流越大) R4 o3 M$ M. T
解决: 根据需求增减
问题:内联函数编译时出现未定义报错
解决: 一个文件只能调一次 重复调会报错7 s" b* g2 i7 v! k, I k* \
9 M% E) L. @, N/ U1 ~6 q% a
解决:需要改动RCC的I2C1的使能位置(在配置引脚之前使能)!6 i, s' Q& F7 G7 Q/ A
/ s2 l3 w& r) g0 n
问题:IIC无法读取数据# j- j* J: p+ ^" N
解决:IIC设备地址是需要'<<1'才能使用0 \/ N9 }: [1 `" G3 N* O/ {
问题:DEBUG中突然失败: l8 `7 F; f( Q" e; w
解决:断点错乱会导致调试中途失败' ]' `- L6 ^6 v/ S; [
问题:空闲中断有触发,但DMA缓冲区没有任何数据
解决: 检查DMA外设时钟
: Q( n5 J- X( s# ?! y7 i
问题:CJSON print_out返回空* J% l) |: P! f( p5 }# R5 q3 d
解决: 增加堆空间
问题:ADC速率会影响输出电流 越快电流越大
解决: 根据需求增减