【1024活动】写一手好“Bug”的程序员们!Hello world y! I) h, [1 v6 R& KT! s- }7 W- j5 l 7 g8 s* e, _9 J$ l {3 O. \
2 ?6 l6 l1 T1 s, A) f; J# A. Y1 i, q3 C 程序员们!这么重要的节日怎么少得了整活,活动来了! - |8 P5 G# B8 |5 q5 X 活动内容: 就是写日常开发过程中你遇到的BUG!在下方评论! (不会写BUG的程序员不是好厨子) $ m0 n9 U; S9 }' ^. u4 _: f1 r! b0 ]( a" T ) Q' s: D' s& e/ M( M( f/ a7 X 活动时间: 10月24日-10月26日 & I# s& K, ?5 ?6 {) k活动奖励: 抽取5位送出:小米背包、STM32开发板、笔记本支架、保温杯等! 下午三点大转盘搞起来 转盘入口 转前须知:必须按照需求恢复本帖才可以抽奖,否则中奖无效。 2 A: ]4 ] y E 7 N: \; ^5 ?! |: ~ |
【有奖报名】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]写入数据,然后读出。调试过程中读写正常,但只要断电,再上电后读出的数据就不是断电前写入的数据了。
分析:7 ?% t( d% a4 J8 a; }! j3 s
STM32F051C6T6的Flash长度为32KB,每页长为0x400,地址从0x08002000到0x080027FF。* X+ c9 m, O- ?9 w6 H
查阅STM32F0xx的eeprom.h,其中有:
#define PAGE_SIZE ((uint32_t)0x0400)
#define EEPROM_START_ADDRESS ((uint32_t)0x08002000)
这里定义:#defineEEPROM_START_ADDRESS ((uint32_t)0x08002000)
2 `& E/ f, |; `( v: z
" r' k: i8 V6 a a+ N. f
再查阅STM32F0xx的 eeprom.c:. y1 y' V) t" w) R
uint16_t EE_ReadVariable(uint16_t VirtAddress, uint16_t* Data)
{ uint16_t ValidPage = PAGE0;' `9 D1 m, G/ U# n! ?
uint16_t AddressValue = 0x7777, ReadStatus = 1;8 `" X5 u0 M7 f/ r$ K# q
uint32_t Address = 0x08001000, PageStartAddress = 0x08001000;+ Z/ R' l+ B' I
} L! e! N+ u: s% u t
* n" d5 Q8 }) c: V
这里地址的分配是这样安排的:8 `& b3 U) ]9 A! e8 b: {
uint32_t Address= 0x08001000, PageStartAddress = 0x08001000;
这个EEPROM emulation in STM32F0xx是从EEPROM emulation in STM32F10xx移植过来的。于是查阅F1系列相关的文件,9 _7 H. U5 W# d/ O" [
* r' \+ R7 d) e" Y; F
STM32F10xx 的eeprom.h是这样的:
#define EEPROM_START_ADDRESS ((uint32_t)0x08010000)
STM32F10xx的 eeprom.c是这样的:" t5 u' e, z9 o
uint16_t EE_ReadVariable(uint16_t VirtAddress, uint16_t* Data) n: @- P: X: P5 L# S+ `/ E) r( j4 B
{ uint16_t ValidPage = PAGE0;
uint16_t AddressValue = 0x5555, ReadStatus = 1;+ \4 l2 f3 [+ O6 [9 |
uint32_t Address =0x08010000, PageStartAddress =0x08010000;8 @7 g V( C/ G+ u7 q- S: Y+ b' Z" R
}
ST工程师在移植F1仿真EEPROM到F0仿真EEPROM时,忘记把F0的eeprom.h和eeprom.c文件里关于仿真Flash页的地址修改一致:8 {2 t* o2 Y' |! @4 o2 G' h$ @
在F051写入的首地址是0x08002000,而读出的首地址则在0x08001000。从而导致读数据的地址不是写入数据的地址——读出错。
修改eeprom.c代码:2 p3 Z' i3 p, L+ D% j$ Z
uint32_t Address= 0x08002000, PageStartAddress = 0x08002000;
故障排除。, \: I( G; M2 L9 k3 f- F. r
问题:IIC调试无法得到数据(写后立即读出是0x00),当前SDA输入配置位浮空输入
解决:SDA输出配置为推挽,SDA输入配置为内部上拉输入
问题:指针当参数取值必定改变传参的值?3 r( S4 H$ A' V; [2 y! k6 N V% ?. e
解决:是,查看下数组的位有没有搞错
问题:引脚控制有问题0 P0 @' H. @- @1 T! q$ H
解决:查看配置和宏定义是否有问题+ M$ `# K8 n# h6 b7 k6 g/ A
- l k- q/ X8 d
问题:F103ADC+DMA采集数组数据始终为0,ADC-DR有数据
解决:ADC_DMACmd(ADC1, ENABLE);不应放在DMA的初始化函数里" E% q6 I- ]# A9 D S7 @
解决2:F030的CUBEMX11.0包有问题2 j5 D+ F2 |) @* x
6 Y- `$ C8 V; F1 |. W
问题:F103SDIO+DMA+FATS无法通信、卡在死循环里
解决:F103SDIO+DMA需要GPIO全部上拉和DMAtx、rx都要单独初始化、加4B初始化2 d: I3 L( S' E) Y
问题:FATFS读操作返回FA_NO_READY 2 J3 V2 `( b2 F/ o; M8 D
解决:查看SDIO这个配置SDIO_CLOCK_BYPASS_DISABLE,使能就会出现上述问题
问题:FATFS出现CMD_TIMEOUT现象4 f4 s7 |8 j+ b7 f) ]! |
解决:BSP_SD_GetCardState这个函数需要1MS延时
$ D$ f9 {+ B+ n3 d C- T5 i
问题: RTT系统出现HADRWARE_FALUT
解决:定时任务不允许使用延时$ h3 |! ?1 c/ h2 G- u3 O: O6 ]8 a
现象: 数据高低位翻转
解决:左移改右移 memcpy固定小端拷贝 第一位拷到低8位
$ T L! Q. b% |6 v' S. m/ |. g
问题:HAL硬件IIC返回BUSY(STM32F1)0 @) h2 i1 l7 x" x
解决:需要改动RCC的I2C1的使能位置(在配置引脚之前使能)!
问题:IIC无法读取数据! P) P, j; e/ I% @3 H
解决:IIC设备地址是需要'<<1'才能使用
+ E1 D. l: y2 l. _% w; \; i) W% h
问题:DEBUG中突然失败
解决:断点错乱会导致调试中途失败
! A. k- j6 w% J! m1 U: p. U+ P
问题:空闲中断有触发,但DMA缓冲区没有任何数据. m+ Y4 D. h/ F& h: r% w
解决: 检查DMA外设时钟. @1 C# S' { y7 U" G. q! v2 w @# Q
问题:CJSON print_out返回空( J7 b' F. }1 j+ }+ }. I
解决: 增加堆空间
问题:ADC速率会影响输出电流 越快电流越大& ~: ~# j, `2 K( o" U4 a. ~. `
解决: 根据需求增减$ ~- u$ S, v! J8 |
问题:内联函数编译时出现未定义报错
解决: 一个文件只能调一次 重复调会报错0 a' b" D4 U; }6 H
. |- Y! h- d+ \ a3 A
解决:需要改动RCC的I2C1的使能位置(在配置引脚之前使能)!3 f7 G8 j' E! w% }. E$ c" Z
问题:IIC无法读取数据5 C" v9 i% d6 R8 K+ _
解决:IIC设备地址是需要'<<1'才能使用
问题:DEBUG中突然失败, |; I$ V# D; A5 N4 n, a
解决:断点错乱会导致调试中途失败
" d- t( ^1 `$ T7 t- N& Q) O& |$ s
问题:空闲中断有触发,但DMA缓冲区没有任何数据
解决: 检查DMA外设时钟
* Q: d3 A- H% u
问题:CJSON print_out返回空
解决: 增加堆空间& l9 O( g0 k0 D+ A
问题:ADC速率会影响输出电流 越快电流越大
解决: 根据需求增减 z2 y4 X1 B7 t- u