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

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

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

2 c8 K8 ~1 s/ I  @& T6 U7 P/ n9 v) |$ p# t; Z3 }! ]
8 Z8 z$ K( o* B( g6 C6 t, e
11.png 0 ~# _& J& r3 D( N! Q
用键盘,敲出灵动的字符;用鼠标,点出幸福的人生;用智慧,推敲缜密的逻辑;用灵感,推开想象的大门;用语言,谱出鲜活的程序;用自信,编出明天的精彩。你把抽象符号变成快乐笑容,你把简单代码变出复杂意义,你演绎枯燥变情趣的游戏,你把辛苦留下捧出生活的神奇。程序员节,愿你成就精彩,乐享人生!
; D# a$ t$ l0 `8 }! v5 Z3 h# c
3 ?" Y4 e. i2 U: h
4 U; W: _6 h  [7 k* ?
12.png

0 o7 c6 D5 t5 {: u) D" d+ m
. ]& X/ q) v7 h1 a/ X
程序员们!这么重要的节日怎么少得了整活,活动来了!

* G% C9 @. E+ Z5 v# a) \) X* l* ^1 W

; _5 }/ [1 f$ V: s1 d+ ?
& \. [. P( b' k0 E5 T0 O& ^: I
活动内容:
就是写日常开发过程中你遇到的BUG!在下方评论!
(不会写BUG的程序员不是好厨子

/ G* N9 @  h1 c4 E0 W" @4 N, h" d0 @; _$ i8 j
' h. N+ }7 e$ U) N" G& T0 j
! z: j, v, S( @' t8 l( K
7 X% ^8 ^& s6 Y; V/ D( J
活动时间:
10月24日-10月26日
  ]) W% V2 z5 E6 ]' L0 V8 u
! q  l; i. _# F1 j/ w: M( t( |, }

' i, n. t6 \/ f6 g. [# N) m6 z( R/ O8 c' W; {  J/ J
活动奖励:
抽取5位送出:小米背包、STM32开发板、笔记本支架、保温杯等!
8 D8 F7 Y: d; M9 R& S+ {8 E( X
下午三点大转盘搞起来
转盘入口

5 X- l8 m7 T3 \1 [) K+ Z9 e/ R' H  F
转前须知:必须按照需求恢复本帖才可以抽奖,否则中奖无效。
/ v" _2 P/ A: v! z) Q" i- y
* y# z: h) A; U& k6 s
13.png
, B' o; I9 c2 A: x0 `

$ d3 e4 i1 e) e3 I3 Q8 u6 p, }2 u6 B
  Y9 f$ v9 d" i- \% Z
收藏 评论80 发布时间:2022-10-24 11:11

举报

80个回答
wenyangzeng 回答时间:2022-10-24 15:33:12
STM32F051 EEPROM emulation一个BUG的修正. d' Q$ [. M5 g% v  X; O
    开发时需要在STM32F051断电前保存少量变量数据,在ST官网下载了“STSW_STM32117_STM32F0xx微控制器中的EEPROM仿真”固件包。这个固件包演示了在仿真EEPROM的页里对VarData[0]、VarData[1]、VarData[2]写入数据,然后读出。调试过程中读写正常,但只要断电,再上电后读出的数据就不是断电前写入的数据了。
# v5 g  }% P% D  |分析:0 O( ~+ U* N# ^) j. D' e
  STM32F051C6T6的Flash长度为32KB,每页长为0x400,地址从0x08002000到0x080027FF。
; v$ x1 s7 O0 R$ P$ _) i5 s! V查阅STM32F0xx的eeprom.h,其中有:
/ i( G/ \. n3 u#define PAGE_SIZE             ((uint32_t)0x0400)  6 C! z( _& F5 x% d# c) Z/ g8 X$ k! M
#define EEPROM_START_ADDRESS ((uint32_t)0x08002000)
  \" E$ g% V+ y: T, j这里定义:#defineEEPROM_START_ADDRESS ((uint32_t)0x08002000)
1 {! M" R: i7 B% y& N! M1 G
' `( A: y, d% ~5 P6 o2 c
' `; c$ M) L& P* i( }
再查阅STM32F0xx的 eeprom.c:7 p9 V+ i, M7 X/ k. ^  Y4 Z
uint16_t EE_ReadVariable(uint16_t VirtAddress, uint16_t* Data)9 u4 v- A( k. I
{  uint16_t ValidPage = PAGE0;$ T- J( ^  ]9 ?) ~0 O
  uint16_t AddressValue = 0x7777, ReadStatus = 1;: T1 q% i; Q& D1 i
  uint32_t Address = 0x08001000, PageStartAddress = 0x08001000;
7 V- {  B( G* q2 E}
1 O& l2 l$ \( x: g' D3 R4 ~2 R: I7 j( T# ^8 R# l

- e4 {6 U+ b: D- T$ T$ e    这里地址的分配是这样安排的:
( C0 m) E, W7 C# F1 M. Uuint32_t Address= 0x08001000, PageStartAddress = 0x08001000;3 |, f. J! |1 y' u# F
这个EEPROM emulation in STM32F0xx是从EEPROM emulation in STM32F10xx移植过来的。于是查阅F1系列相关的文件,  v, j7 z" f' V
& B  v7 j* v7 b- U8 d  y$ u

- B) x+ Q; s8 L1 H) I1 |STM32F10xx 的eeprom.h是这样的:
, T3 O" Q7 t9 A6 ]% B#define EEPROM_START_ADDRESS    ((uint32_t)0x08010000) # v% K: u" X( f7 y1 Q$ o8 z
STM32F10xx的 eeprom.c是这样的:
% s( Q0 W2 @7 R) F/ }5 P( Auint16_t EE_ReadVariable(uint16_t VirtAddress, uint16_t* Data)
) f% @: k7 u3 r- n{  uint16_t ValidPage = PAGE0;
, J# f  \' k6 k' b5 x8 E! `  uint16_t AddressValue = 0x5555, ReadStatus = 1;
0 V( ]4 ^5 G1 X( S8 n( |9 W% P  uint32_t Address =0x08010000, PageStartAddress =0x08010000;( O. P" S" t. B' G
}
7 M9 j" Y$ M. L/ @* c      ST工程师在移植F1仿真EEPROM到F0仿真EEPROM时,忘记把F0的eeprom.h和eeprom.c文件里关于仿真Flash页的地址修改一致:- e( I+ h0 F  {% [  J% {5 e
在F051写入的首地址是0x08002000,而读出的首地址则在0x08001000。从而导致读数据的地址不是写入数据的地址——读出错。  V$ h! v# w* @# f3 r' X% u' e7 o3 H
修改eeprom.c代码:  Y2 @- \, n$ i
uint32_t Address= 0x08002000, PageStartAddress = 0x08002000;6 L: F9 x3 `# p, O( S
故障排除。
, \7 m+ {+ H$ H' n' k% \* S  ?0 E( O  N
7 v  Y' `0 e% [8 A2 [" ^
silver 回答时间:2022-10-24 15:37:18
把我很久之前的BUG记录发上来。。。。
. q, c# U& R( ~! j* Y$ D问题:IIC调试无法得到数据(写后立即读出是0x00),当前SDA输入配置位浮空输入
3 t3 k! `' U( o( C8 ~/ P3 t$ B解决:SDA输出配置为推挽,SDA输入配置为内部上拉输入0 Y+ Y. m/ z) R* U$ T! R
6 Z! o& N, o$ q% h) B
问题:指针当参数取值必定改变传参的值?8 j6 R% G9 F/ G6 K
解决:是,查看下数组的位有没有搞错# p1 n. k, x+ X% P, p( E

6 ^! v7 f/ R( z, W0 `3 d. X2 J问题:引脚控制有问题, n& a2 t8 J- T% l0 E$ Z; f
解决:查看配置和宏定义是否有问题
0 Y+ k. V& h) J! _( b/ w0 [3 l9 \. }
问题:F103ADC+DMA采集数组数据始终为0,ADC-DR有数据
. H" Z& E! |: G& n% v- ~: P解决:ADC_DMACmd(ADC1, ENABLE);不应放在DMA的初始化函数里$ h5 |$ `% w: T/ L
解决2:F030的CUBEMX11.0包有问题
. j6 ^3 I: d* v2 W/ p7 q- H* A7 M1 V1 w2 P) K+ b! ^, i
问题:F103SDIO+DMA+FATS无法通信、卡在死循环里
$ k* {5 a) W5 l解决:F103SDIO+DMA需要GPIO全部上拉和DMAtx、rx都要单独初始化、加4B初始化
3 a/ @# m# I% o, A3 D, W1 `8 A8 F' g
& u3 T; {$ z1 B0 i问题:FATFS读操作返回FA_NO_READY + ~6 a0 q  h8 V3 R9 M5 K
解决:查看SDIO这个配置SDIO_CLOCK_BYPASS_DISABLE,使能就会出现上述问题! F5 D$ _) w/ l

4 j) H; {5 {# L- M/ F8 }! j问题:FATFS出现CMD_TIMEOUT现象
9 S0 x7 s$ \8 c/ L/ K6 O解决:BSP_SD_GetCardState这个函数需要1MS延时
5 o- l' e% v! Z8 f; h7 I0 b! x, Z2 u
问题: RTT系统出现HADRWARE_FALUT" }  Y# X3 l4 B, |' Y. |& I) Y( S
解决:定时任务不允许使用延时
- F( Z8 n' C+ U+ z( n. F: t) c3 `- J1 I$ }' ^( d
现象: 数据高低位翻转7 i) }4 }! `1 |- M
解决:左移改右移 memcpy固定小端拷贝 第一位拷到低8位
; W0 c! b! E6 G- F8 S7 y9 Z3 n& g8 `5 z, ~
问题:HAL硬件IIC返回BUSY(STM32F1)& S* m8 Q8 Q$ z! D
解决:需要改动RCC的I2C1的使能位置(在配置引脚之前使能)!+ `3 m- H' s& p% c3 [: m

7 |; s6 E9 W4 C+ w/ z问题:IIC无法读取数据
+ t1 `6 A. Y/ G, G5 S解决:IIC设备地址是需要'<<1'才能使用& ?; z# l' e4 u* w5 s
0 p/ T  M1 n! ^  d
问题:DEBUG中突然失败
( v) ]. l' \0 s; I& Z0 c$ U解决:断点错乱会导致调试中途失败
7 w1 Z3 d- D3 U5 z+ S
  r5 H- P  J1 Y! m; h问题:空闲中断有触发,但DMA缓冲区没有任何数据& F  X$ N( @" e% ]" m( S$ b
解决: 检查DMA外设时钟
" m2 |( d- ]" M/ T& i/ c" L
! {% G2 X- p9 H, i' v; u; ?* E' I问题:CJSON print_out返回空; w* G, I6 ?. V. {  V
解决: 增加堆空间
% N, F  N9 |9 H* v$ M7 `+ N2 D, ]* u2 g( {2 e
问题:ADC速率会影响输出电流 越快电流越大, y& n+ L0 _4 I6 H* F8 C; U2 i
解决: 根据需求增减
& l* k: n' q+ S" q3 X* u
4 m5 i  O. @- M" d% ]8 ?) T9 l问题:内联函数编译时出现未定义报错
/ E" l) p4 }1 j4 Z5 |  k1 H解决:        一个文件只能调一次  重复调会报错7 N. o1 X4 [5 Y% U' e; l" ^8 H
1 \1 P# [) u4 z6 C9 G
orima 回答时间:2022-10-27 20:10:13
问题:HAL硬件IIC返回BUSY(STM32F1)) F9 `$ ]; ]8 z+ b0 E
解决:需要改动RCC的I2C1的使能位置(在配置引脚之前使能)!" e+ `% D) C5 {5 k2 |; b! S. E$ ^

) ^% l: j9 D, [% ^$ a问题:IIC无法读取数据- J5 V6 v- _2 f7 y
解决:IIC设备地址是需要'<<1'才能使用! p" b' }" B8 z0 R5 ~# p* G$ ?9 G0 b

5 q0 X9 I7 A4 v, R- `1 d问题:DEBUG中突然失败
, L( U9 D* k6 {' W解决:断点错乱会导致调试中途失败; V; p  x5 C2 H$ W2 V8 P

* ^- z" j5 Q7 k5 O$ T) e问题:空闲中断有触发,但DMA缓冲区没有任何数据3 O$ o* |, y# C$ d
解决: 检查DMA外设时钟$ c& @/ y- E( g3 b7 s  e
7 G3 J' Y  l: v* k) Y9 b( L
问题:CJSON print_out返回空
: }) T% U; g9 Q# O$ n解决: 增加堆空间( i  f( `7 D5 u, `$ E$ ]

: M0 x2 n+ |. l, b* i问题:ADC速率会影响输出电流 越快电流越大
& b8 V$ Z9 S% M0 J解决: 根据需求增减9 F  h, T& t' N$ \- m  `
CC4 回答时间:2022-10-24 11:17:46
for 语句的 break条件判定失败,导致系统卡死。。。。
一个脑子不够用 回答时间:2022-10-24 11:24:04
使用FreeRTOS任务切换的时候,数组太大了,越界导致程序卡死硬件异常,一直卡在HardFault_Handler的while里面,查了一天错误
0 Q; M2 h' r) |. q: X
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对应的屏幕编码才能正确.." r& C( q% |2 H! [- Y# w
STMWoodData 回答时间:2022-10-24 15:34:13
写了一个Bug,然后就Bug了+ Z$ `" N4 T9 U& k' }
wudianjun2001 回答时间:2022-10-24 15:35:44
12313213
; N+ `& `, [, e) T
杨小杨 回答时间:2022-10-24 15:36:10
学习7 _# O! `1 e9 Q0 a5 f% y  n0 e
daming32 回答时间:2022-10-24 15:36:25
签到签到
9 Y2 Z7 |$ }. o: x/ X: f2 S7 N
廖向涵 回答时间:2022-10-24 15:36:27
启动启动
9 n. \9 ~- o! Q/ L1 Z4 I
meiyao 回答时间:2022-10-24 15:37:17
666转起来
0 Y3 n+ Q  t& V8 ?9 b
EricCheng 回答时间:2022-10-24 15:37:33
签到签到
* c# f2 j, Y/ l; ^' x
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版