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

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

[复制链接]
STMCU-管管 发布时间:2022-10-24 11:11
【1024活动】写一手好“Bug”的程序员们!Hello world
  y! I) h, [1 v6 R& K
  T! s- }7 W- j5 l
7 g8 s* e, _9 J$ l  {3 O. \
11.png
* Y; }: q) J# P( ?0 l0 o# n  S用键盘,敲出灵动的字符;用鼠标,点出幸福的人生;用智慧,推敲缜密的逻辑;用灵感,推开想象的大门;用语言,谱出鲜活的程序;用自信,编出明天的精彩。你把抽象符号变成快乐笑容,你把简单代码变出复杂意义,你演绎枯燥变情趣的游戏,你把辛苦留下捧出生活的神奇。程序员节,愿你成就精彩,乐享人生!

$ K4 u$ j3 e& a0 |$ o
; g- H1 C% X: d/ o

% e" n2 H* F( R8 H: k' O  Z
12.png

9 {' G6 p& ]/ P- `2 ?6 l6 l1 T1 s, A) f; J# A. Y1 i, q3 C
程序员们!这么重要的节日怎么少得了整活,活动来了!

" d5 j9 Y0 }! `* \5 S6 p- `$ q

3 {0 Z4 o6 ]1 y& [- |8 P5 G# B8 |5 q5 X
活动内容:
就是写日常开发过程中你遇到的BUG!在下方评论!
(不会写BUG的程序员不是好厨子

1 i8 x1 I' ?# s- s3 `: u. }$ m0 n9 U; S9 }' ^. u4 _: f1 r! b0 ]( a" T
  |8 V2 d+ p( Z6 w$ I/ I

2 q/ G  f4 n! a0 q2 B) Q' s: D' s& e/ M( M( f/ a7 X
活动时间:
10月24日-10月26日
& I# s& K, ?5 ?6 {) k

; d$ ]9 Z7 }, B' ~2 s2 A

- C* Y) F# D+ c; `& r7 y# w- Y
. u! z; @( ]: k活动奖励:
抽取5位送出:小米背包、STM32开发板、笔记本支架、保温杯等!

# C! o& a: v. S( e: x8 @下午三点大转盘搞起来
转盘入口

4 Y9 K) a& V, J2 S7 U
) U* B' {9 j& k9 C, N8 X
转前须知:必须按照需求恢复本帖才可以抽奖,否则中奖无效。

) y, s% R, Y6 X9 Z( n9 s) Z% Y& W

& L) m" M# O" v9 k$ d+ E+ r 13.png

' M3 J1 Q9 ^0 |8 R  T2 A: ]4 ]  y  E

- d% a  Q5 ]- A$ G* R5 o6 \
7 N: \; ^5 ?! |: ~
收藏 评论80 发布时间:2022-10-24 11:11

举报

80个回答
wenyangzeng 回答时间:2022-10-24 15:33:12
STM32F051 EEPROM emulation一个BUG的修正
; Y8 P8 H. s( ^, T3 {: s% P, Y    开发时需要在STM32F051断电前保存少量变量数据,在ST官网下载了“STSW_STM32117_STM32F0xx微控制器中的EEPROM仿真”固件包。这个固件包演示了在仿真EEPROM的页里对VarData[0]、VarData[1]、VarData[2]写入数据,然后读出。调试过程中读写正常,但只要断电,再上电后读出的数据就不是断电前写入的数据了。
! |, T' m9 }3 `分析:7 ?% t( d% a4 J8 a; }! j3 s
  STM32F051C6T6的Flash长度为32KB,每页长为0x400,地址从0x08002000到0x080027FF。* X+ c9 m, O- ?9 w6 H
查阅STM32F0xx的eeprom.h,其中有:
7 r, m  O( y* }& K5 G#define PAGE_SIZE             ((uint32_t)0x0400)  
3 p9 ^& ?! J" [% f* m, q, U#define EEPROM_START_ADDRESS ((uint32_t)0x08002000)
1 T- S) D" b7 F6 f! ?" c: g/ v- p这里定义:#defineEEPROM_START_ADDRESS ((uint32_t)0x08002000)
) I* ?  O% k8 ~% E2 \" r; ?' t2 `& 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)
, L+ \& X5 [! q0 Z# H{  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

2 j% q4 P8 x1 q) m3 s/ q- x' ?4 t- y
* n" d5 Q8 }) c: V
    这里地址的分配是这样安排的:8 `& b3 U) ]9 A! e8 b: {
uint32_t Address= 0x08001000, PageStartAddress = 0x08001000;
8 N- L9 x  n6 O这个EEPROM emulation in STM32F0xx是从EEPROM emulation in STM32F10xx移植过来的。于是查阅F1系列相关的文件,9 _7 H. U5 W# d/ O" [

0 [9 d% B0 X- c2 O7 q+ T
* r' \+ R7 d) e" Y; F
STM32F10xx 的eeprom.h是这样的:
& ]0 ^3 ], G5 Q- |+ y#define EEPROM_START_ADDRESS    ((uint32_t)0x08010000)
, k: l8 X+ I3 r1 `6 o1 O  lSTM32F10xx的 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;
% s  K% f; S4 _* E  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
}
/ d' I- x* J  {( K. a" t1 M      ST工程师在移植F1仿真EEPROM到F0仿真EEPROM时,忘记把F0的eeprom.h和eeprom.c文件里关于仿真Flash页的地址修改一致:8 {2 t* o2 Y' |! @4 o2 G' h$ @
在F051写入的首地址是0x08002000,而读出的首地址则在0x08001000。从而导致读数据的地址不是写入数据的地址——读出错。
! H# H* W, R: f1 u& W3 m" @5 f修改eeprom.c代码:2 p3 Z' i3 p, L+ D% j$ Z
uint32_t Address= 0x08002000, PageStartAddress = 0x08002000;
- \5 h1 o% N. e" r' ]) t5 r故障排除。, \: I( G; M2 L9 k3 f- F. r

4 v* u* {4 c0 r" m
silver 回答时间:2022-10-24 15:37:18
把我很久之前的BUG记录发上来。。。。! A- M5 Y, G5 r1 ^; J, g
问题:IIC调试无法得到数据(写后立即读出是0x00),当前SDA输入配置位浮空输入
# p$ C6 r0 s* A1 e; K解决:SDA输出配置为推挽,SDA输入配置为内部上拉输入
2 z8 c# j+ H. h3 U5 I% c$ r1 q
. Q9 \1 D1 T' r1 R# ]+ ]' [) x问题:指针当参数取值必定改变传参的值?3 r( S4 H$ A' V; [2 y! k6 N  V% ?. e
解决:是,查看下数组的位有没有搞错
+ b0 r8 }. S( ?7 @: }& @& J2 f" W+ J4 `
) T& C% l% v) k7 T问题:引脚控制有问题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有数据
! ]- U/ v4 p- @% ]$ e1 A/ x# h解决: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无法通信、卡在死循环里
5 q/ ?# m8 t! f' j' a解决:F103SDIO+DMA需要GPIO全部上拉和DMAtx、rx都要单独初始化、加4B初始化2 d: I3 L( S' E) Y

! `: R) a- V* S. I问题:FATFS读操作返回FA_NO_READY 2 J3 V2 `( b2 F/ o; M8 D
解决:查看SDIO这个配置SDIO_CLOCK_BYPASS_DISABLE,使能就会出现上述问题
" @. J& s( |6 Q( W
0 B# c: u5 i2 w- |1 t* P问题:FATFS出现CMD_TIMEOUT现象4 f4 s7 |8 j+ b7 f) ]! |
解决:BSP_SD_GetCardState这个函数需要1MS延时
5 b& K& j0 Z5 P0 }$ W' Y$ D$ f9 {+ B+ n3 d  C- T5 i
问题: RTT系统出现HADRWARE_FALUT
' u' f' N( S3 L3 N: R; P解决:定时任务不允许使用延时$ h3 |! ?1 c/ h2 G- u3 O: O6 ]8 a

3 `1 Y) f7 I/ R% k" @现象: 数据高低位翻转
+ z7 o3 ]' X8 }. x' Q# r6 Y3 ]2 z2 m解决:左移改右移 memcpy固定小端拷贝 第一位拷到低8位
1 \1 n. z7 e5 c' D1 A$ T  L! Q. b% |6 v' S. m/ |. g
问题:HAL硬件IIC返回BUSY(STM32F1)0 @) h2 i1 l7 x" x
解决:需要改动RCC的I2C1的使能位置(在配置引脚之前使能)!
. f) z6 ^! U/ a$ N+ Q
, v0 s" s$ _8 t( G9 a( t问题:IIC无法读取数据! P) P, j; e/ I% @3 H
解决:IIC设备地址是需要'<<1'才能使用
; I9 w( l; v# H  j: k% l5 z+ E1 D. l: y2 l. _% w; \; i) W% h
问题:DEBUG中突然失败
9 S* w7 g# }& i& U8 z6 o+ f解决:断点错乱会导致调试中途失败
) ]8 w) u' Z6 e" x9 Y2 l6 D" V5 f1 ~! 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

5 `' @& J' s* G; c3 v问题:CJSON print_out返回空( J7 b' F. }1 j+ }+ }. I
解决: 增加堆空间
8 K/ h7 g' q7 t, D
, w9 p; Q& J( u' v8 B* `问题:ADC速率会影响输出电流 越快电流越大& ~: ~# j, `2 K( o" U4 a. ~. `
解决: 根据需求增减$ ~- u$ S, v! J8 |

5 D3 h$ J! A! r7 b5 T问题:内联函数编译时出现未定义报错
/ p  U% J/ P# `8 {# R解决:        一个文件只能调一次  重复调会报错0 a' b" D4 U; }6 H
. |- Y! h- d+ \  a3 A
orima 回答时间:2022-10-27 20:10:13
问题:HAL硬件IIC返回BUSY(STM32F1)
* f  X; E6 R# h; w解决:需要改动RCC的I2C1的使能位置(在配置引脚之前使能)!3 f7 G8 j' E! w% }. E$ c" Z

2 u( z# T/ T4 u+ A1 C, x0 j问题:IIC无法读取数据5 C" v9 i% d6 R8 K+ _
解决:IIC设备地址是需要'<<1'才能使用
6 |9 I/ e' J3 a+ M/ N
1 Q6 O  @. e. O' j问题:DEBUG中突然失败, |; I$ V# D; A5 N4 n, a
解决:断点错乱会导致调试中途失败
' c+ ~7 I- }! a! E" d- t( ^1 `$ T7 t- N& Q) O& |$ s
问题:空闲中断有触发,但DMA缓冲区没有任何数据
* v- i5 z* ^8 [解决: 检查DMA外设时钟
8 s6 k7 e+ `4 L' `* Q: d3 A- H% u
问题:CJSON print_out返回空
3 j/ j( V! A9 x- t9 J9 M' y解决: 增加堆空间& l9 O( g0 k0 D+ A

1 b* F. _& I8 J+ X( s4 D9 L问题:ADC速率会影响输出电流 越快电流越大
1 E4 ]% D$ A  W! C- _6 Q  Y解决: 根据需求增减  z2 y4 X1 B7 t- u
CC4 回答时间:2022-10-24 11:17:46
for 语句的 break条件判定失败,导致系统卡死。。。。
一个脑子不够用 回答时间:2022-10-24 11:24:04
使用FreeRTOS任务切换的时候,数组太大了,越界导致程序卡死硬件异常,一直卡在HardFault_Handler的while里面,查了一天错误  m- X7 o7 ^2 ?
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对应的屏幕编码才能正确..
1 `7 T& {& W9 }: r
STMWoodData 回答时间:2022-10-24 15:34:13
写了一个Bug,然后就Bug了
6 R9 A4 K  d/ J
wudianjun2001 回答时间:2022-10-24 15:35:44
12313213
- v" k# y# W7 w: n6 B
杨小杨 回答时间:2022-10-24 15:36:10
学习) Q, Q% t9 O, E* A% {0 ~) A
daming32 回答时间:2022-10-24 15:36:25
签到签到
* B- n8 ]5 v% g8 O! r+ f
廖向涵 回答时间:2022-10-24 15:36:27
启动启动
! y! R3 P: e' f6 ?5 a: v
meiyao 回答时间:2022-10-24 15:37:17
666转起来
" w6 J9 l& W3 @$ N& u
EricCheng 回答时间:2022-10-24 15:37:33
签到签到
% u% N+ e; T( t: u4 C
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版