你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【1024活动】写一手好“Bug”的程序员们!Hello world  

[复制链接]
STMCU-管管 发布时间:2022-10-24 11:11
【1024活动】写一手好“Bug”的程序员们!Hello world

( F; n! P4 Q8 L9 I  E/ u5 m2 s* S7 w6 \* L/ C5 i: K4 Z

6 c2 m7 p$ ]2 P+ ?
11.png * O2 p  T/ d+ D/ X, D. h6 s7 {
用键盘,敲出灵动的字符;用鼠标,点出幸福的人生;用智慧,推敲缜密的逻辑;用灵感,推开想象的大门;用语言,谱出鲜活的程序;用自信,编出明天的精彩。你把抽象符号变成快乐笑容,你把简单代码变出复杂意义,你演绎枯燥变情趣的游戏,你把辛苦留下捧出生活的神奇。程序员节,愿你成就精彩,乐享人生!

' g; y+ |' t) g! Q$ R/ p' h& U- Z
2 {4 |* Z6 z( b" C$ ^: L* P# S

9 f1 E8 M- c5 e# M: v
12.png

9 t. h  w0 h/ k$ \# G5 d: l: s8 k$ v* p) k8 Q' u
程序员们!这么重要的节日怎么少得了整活,活动来了!
* H, E. S& e4 q

3 ^6 ?+ G6 {5 B" D* ?  b1 r+ w& i
6 w: a1 Z0 q' a0 e) z8 y' U
活动内容:
就是写日常开发过程中你遇到的BUG!在下方评论!
(不会写BUG的程序员不是好厨子

0 j6 M0 T  Y, F/ Z  {% g5 ~6 b9 A7 ^+ \) P

* Q0 `/ ]: N- d" O$ O

+ ^# k  d$ z  U; Q  l. S( y3 @( J1 x& H1 Y9 F( I% ^
活动时间:
10月24日-10月26日
5 X5 i/ o( ~1 h: ]

4 t/ T5 `3 G. U& G
9 r! ~" ]# `6 H( O  _0 N/ h

1 A& w7 I- ~; v# }, z- T活动奖励:
抽取5位送出:小米背包、STM32开发板、笔记本支架、保温杯等!
5 F  ?5 M5 j7 @7 |
下午三点大转盘搞起来
转盘入口

6 C+ K2 [+ ~5 K$ Q8 m
) p, n1 v( X$ o) Y8 u
转前须知:必须按照需求恢复本帖才可以抽奖,否则中奖无效。

8 Q/ A2 c2 t0 w" M+ q1 X/ [1 q
; @; i8 u! `8 E
13.png
4 K8 J7 F9 [( t2 z! F) T

6 S. U' q5 t$ @9 ~1 E* `7 i% ~) O# E$ |, Y1 ]$ A7 J  g$ {

  ^2 x" Z( Q; u& E/ `: p" k
收藏 评论80 发布时间:2022-10-24 11:11

举报

80个回答
wenyangzeng 回答时间:2022-10-24 15:33:12
STM32F051 EEPROM emulation一个BUG的修正
9 B3 w9 r: [: v/ e    开发时需要在STM32F051断电前保存少量变量数据,在ST官网下载了“STSW_STM32117_STM32F0xx微控制器中的EEPROM仿真”固件包。这个固件包演示了在仿真EEPROM的页里对VarData[0]、VarData[1]、VarData[2]写入数据,然后读出。调试过程中读写正常,但只要断电,再上电后读出的数据就不是断电前写入的数据了。
* ^( f: P5 @9 \" R+ W4 u) t分析:
- c- D0 c5 P3 e. Q2 @8 i' f  STM32F051C6T6的Flash长度为32KB,每页长为0x400,地址从0x08002000到0x080027FF。
; ?  V) E- j0 i查阅STM32F0xx的eeprom.h,其中有:
# L3 A' Q$ ?1 Z#define PAGE_SIZE             ((uint32_t)0x0400)  
$ w- F& [* O: e#define EEPROM_START_ADDRESS ((uint32_t)0x08002000)
9 E+ F, N1 \) q, v3 i. \0 s; @这里定义:#defineEEPROM_START_ADDRESS ((uint32_t)0x08002000)
$ s* Y7 Y6 T6 u! Y- t! v& K: [% y& l2 `1 ], o
$ ~7 A/ n9 O) `" W
再查阅STM32F0xx的 eeprom.c:
% K9 F6 X8 p" L% Zuint16_t EE_ReadVariable(uint16_t VirtAddress, uint16_t* Data)
$ }* I* c$ h6 {  `. m9 A{  uint16_t ValidPage = PAGE0;: v) k% \5 P' X. g6 S. r8 Y
  uint16_t AddressValue = 0x7777, ReadStatus = 1;
3 ?- a. M3 d# W4 ~  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

" l! t% M# ]! [( Q1 E1 ?

* r& h; f* L) a/ y  ^1 a! V! ?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;
9 n! e) N$ v% {' A  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
}
; g! Q4 V8 H2 a9 V1 b      ST工程师在移植F1仿真EEPROM到F0仿真EEPROM时,忘记把F0的eeprom.h和eeprom.c文件里关于仿真Flash页的地址修改一致:
7 r# G6 u/ k+ p( x% l2 _在F051写入的首地址是0x08002000,而读出的首地址则在0x08001000。从而导致读数据的地址不是写入数据的地址——读出错。1 L* A7 o9 V* `  ?4 S1 _8 \/ M
修改eeprom.c代码:
3 c% w4 I! U+ {% puint32_t Address= 0x08002000, PageStartAddress = 0x08002000;
$ L1 D: _( q9 U! \) ^; L" v9 b故障排除。
; I' s" N/ G  ]' o; Q! w$ p
# b' ^- _/ Z+ I$ T; ?' ?& w2 ]
silver 回答时间:2022-10-24 15:37:18
把我很久之前的BUG记录发上来。。。。
8 [0 j* m8 C) {" _9 ~0 R  g问题:IIC调试无法得到数据(写后立即读出是0x00),当前SDA输入配置位浮空输入
4 o  }* m8 k: ?& s- x0 ?解决:SDA输出配置为推挽,SDA输入配置为内部上拉输入
6 k9 N! i7 A! d! d+ n% v' 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
问题:引脚控制有问题
- n1 Y8 p  c$ i: {3 i8 i7 Q( W& L解决:查看配置和宏定义是否有问题/ }  |6 c& Z$ H" R! w# h& E3 m+ p
3 ^, U2 Y- [, M1 a6 U' z
问题:F103ADC+DMA采集数组数据始终为0,ADC-DR有数据
/ u+ z/ w; p" Z# E& g解决:ADC_DMACmd(ADC1, ENABLE);不应放在DMA的初始化函数里
# G1 W' z) B- h' C9 ?! W, K解决2:F030的CUBEMX11.0包有问题0 D3 f( J8 C; m* u

# s1 h: u' w# \问题:F103SDIO+DMA+FATS无法通信、卡在死循环里$ q) Y: ~, J+ i- ]% j
解决:F103SDIO+DMA需要GPIO全部上拉和DMAtx、rx都要单独初始化、加4B初始化/ z) c! {" b7 i  D5 |6 a

2 |$ ~; y! Q0 U& J/ n问题:FATFS读操作返回FA_NO_READY
" J1 F4 W9 {& M/ g, Q解决:查看SDIO这个配置SDIO_CLOCK_BYPASS_DISABLE,使能就会出现上述问题& ?) l3 F0 e; D6 |
3 M: |! X' j3 l. n5 e4 K
问题:FATFS出现CMD_TIMEOUT现象
4 _) P" w4 f, C5 u/ G% e' H解决:BSP_SD_GetCardState这个函数需要1MS延时* b" B, \& ^; Y
' P( G* {% x. j2 w
问题: RTT系统出现HADRWARE_FALUT, b) l# m1 c1 y' s2 F4 v
解决:定时任务不允许使用延时
9 U- e8 j/ ^9 V1 W' y  ^/ S
, ^: n" i: a( K% S* L4 W' W1 A& M2 ~现象: 数据高低位翻转
7 g$ Y- K1 e2 h解决:左移改右移 memcpy固定小端拷贝 第一位拷到低8位; v) g. q8 H( p9 \1 ~
- [4 P+ ^) |& X
问题:HAL硬件IIC返回BUSY(STM32F1)
1 d! Z9 K7 r- h解决:需要改动RCC的I2C1的使能位置(在配置引脚之前使能)!/ \2 p) p! O* R. R: m2 E& V
- `# S6 R) [7 u/ t' l6 g
问题:IIC无法读取数据
7 a9 T4 r$ p( u# |' V3 g1 v解决:IIC设备地址是需要'<<1'才能使用
$ |( E+ s# U2 s% B2 p# a% V& H4 j
, C- R; Z0 T( A% R& `' F, N0 y问题:DEBUG中突然失败
, s! X3 K$ b' P# J( b  ?- |解决:断点错乱会导致调试中途失败
; I' y( b6 G" w) E3 |7 T
+ s: o! v' c2 h1 {% e( @( ]问题:空闲中断有触发,但DMA缓冲区没有任何数据3 ^3 S" ^7 a2 F8 u8 J
解决: 检查DMA外设时钟
% q  T) g! \8 ]4 }  R& C5 q# o
5 I& z+ Q! F& Y问题:CJSON print_out返回空
. |4 y; q! p4 z# O5 b# a: i$ s解决: 增加堆空间
/ q9 j, }) |' j" J% b5 k: \/ c
5 s& P" b% @3 x1 q3 d4 Q问题:ADC速率会影响输出电流 越快电流越大8 Y+ U* @2 J8 a& W# |+ _; X
解决: 根据需求增减
9 C& W7 q$ g% q6 o
& K2 }: b" o# G- o/ ~问题:内联函数编译时出现未定义报错8 a( S9 a$ H/ M! a- e4 n( l
解决:        一个文件只能调一次  重复调会报错
, k" q; J; t+ c+ g$ y
, y: p+ L/ S- w
orima 回答时间:2022-10-27 20:10:13
问题:HAL硬件IIC返回BUSY(STM32F1); }  z2 k! n( A3 x, G4 E, f, Z6 W
解决:需要改动RCC的I2C1的使能位置(在配置引脚之前使能)!
& U1 ?! A& R* d2 t- a2 @) E9 R) _2 V+ ~7 K" {5 ~) s' r
问题:IIC无法读取数据
  z" F# @- b. _$ w解决:IIC设备地址是需要'<<1'才能使用" t7 B+ F' l" E& Y5 @; a/ Y5 N
3 l8 v, m7 g) Q+ X# C; v
问题:DEBUG中突然失败
' e  j- ?, K% m解决:断点错乱会导致调试中途失败) n6 S5 H5 V: Z' x' I! ~
; Q8 t* U' p1 N9 w' u" E* S- k
问题:空闲中断有触发,但DMA缓冲区没有任何数据
1 Q; n# k0 n: U8 N  l解决: 检查DMA外设时钟
6 F- D& n1 l; h' K; n
  k6 O4 f5 e: k! `$ Q1 v9 b问题:CJSON print_out返回空
  N/ G9 r. {) L7 b6 U7 u1 D解决: 增加堆空间
8 f7 b9 {) S7 D' t9 I/ N7 p$ t+ r$ h! r
问题:ADC速率会影响输出电流 越快电流越大+ @6 Z( k/ W4 K5 b
解决: 根据需求增减* y, c7 ~& e1 H) ]* H/ a
CC4 回答时间:2022-10-24 11:17:46
for 语句的 break条件判定失败,导致系统卡死。。。。
一个脑子不够用 回答时间:2022-10-24 11:24:04
使用FreeRTOS任务切换的时候,数组太大了,越界导致程序卡死硬件异常,一直卡在HardFault_Handler的while里面,查了一天错误) U2 L" c9 }! W+ G9 p
ShunUSB 回答时间:2022-10-24 12:17:51
使用|=前,忘记置0。== 写成=。uart波特率忘记修改一致。eventrecorder 忘记初始化。spi 速度提高,没把io速度调整为高。USB时钟没有设置成48。
jundao721 回答时间:2022-10-24 15:29:31
Bug有很多,有时候改完就忘了总结了。
silver 回答时间:2022-10-24 15:29:59
FOR用了u8的类型超出范围变成无限循环,还有文本编码用了汉字要用GB2312对应的屏幕编码才能正确..2 G& y7 L$ D( W6 b& [) G7 r* C
STMWoodData 回答时间:2022-10-24 15:34:13
写了一个Bug,然后就Bug了; c' C9 P5 a% U# W
wudianjun2001 回答时间:2022-10-24 15:35:44
12313213* k/ s2 |4 T/ w0 p( D* b9 {4 Z: E
杨小杨 回答时间:2022-10-24 15:36:10
学习. ^! Z' C, J/ n* m& x; z
daming32 回答时间:2022-10-24 15:36:25
签到签到5 [' u  \; ?+ s# a! _- Y! I# K
廖向涵 回答时间:2022-10-24 15:36:27
启动启动
4 H# {* R/ V8 |
meiyao 回答时间:2022-10-24 15:37:17
666转起来
' G4 S: Z( a6 S/ O. f* I
EricCheng 回答时间:2022-10-24 15:37:33
签到签到3 O( J  [3 A& c) ^
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版