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

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

[复制链接]
STMCU-管管 发布时间:2022-10-24 11:11
【1024活动】写一手好“Bug”的程序员们!Hello world
+ K" W* G& z) D. z1 f
- R$ }/ d5 _* R9 k2 u' j. f( f- X
( `$ _( l" u) O& H$ x" k- |
11.png # r3 I( T1 t: v- n5 `# _
用键盘,敲出灵动的字符;用鼠标,点出幸福的人生;用智慧,推敲缜密的逻辑;用灵感,推开想象的大门;用语言,谱出鲜活的程序;用自信,编出明天的精彩。你把抽象符号变成快乐笑容,你把简单代码变出复杂意义,你演绎枯燥变情趣的游戏,你把辛苦留下捧出生活的神奇。程序员节,愿你成就精彩,乐享人生!

3 B+ N$ a9 Z( m3 j& i5 F

4 i) F% u6 D1 N8 Q: d
8 {4 I* m8 N9 K0 I8 |% l* H' A
12.png

& o& Y# q+ K  Q9 V7 [! n, `" _. _; q4 h
程序员们!这么重要的节日怎么少得了整活,活动来了!

7 B( W6 A  ?% X: @

* ]7 U% O0 D) l& Y/ E! [- i- @4 j+ V( s' W
活动内容:
就是写日常开发过程中你遇到的BUG!在下方评论!
(不会写BUG的程序员不是好厨子

4 r( a8 r; ~2 u( ^
1 d: M( t+ z* V/ o& D* F
3 Y8 Q; R$ t' j# D5 o; k$ v
5 \0 V0 }# T5 W8 Y  w( y) f
% F6 ~' Y# W' W6 D' N3 _
活动时间:
10月24日-10月26日
3 L! g" s' z9 K) _9 e

; t9 S& Q* h, y* g+ U

  G0 L7 l. \# {' G9 k$ i4 K1 B5 u0 |
活动奖励:
抽取5位送出:小米背包、STM32开发板、笔记本支架、保温杯等!

: G2 C, x2 C2 b& ^下午三点大转盘搞起来
转盘入口
$ [0 W# f( `4 @. J6 [

; V# D: A8 u, }$ n; z+ t7 N/ B9 u
转前须知:必须按照需求恢复本帖才可以抽奖,否则中奖无效。

4 l7 }; {* I# L

, Y& L# J1 O# T 13.png
+ S# s% a7 O0 Z0 \" u; G' y0 ?

6 E) B0 c" ~, x. W, y; o+ ]
2 l, {. L: u. [0 U4 D
# a/ r1 s7 x9 w. t
收藏 评论80 发布时间:2022-10-24 11:11

举报

80个回答
wenyangzeng 回答时间:2022-10-24 15:33:12
STM32F051 EEPROM emulation一个BUG的修正7 H0 d, Z/ o- y0 R. G  g
    开发时需要在STM32F051断电前保存少量变量数据,在ST官网下载了“STSW_STM32117_STM32F0xx微控制器中的EEPROM仿真”固件包。这个固件包演示了在仿真EEPROM的页里对VarData[0]、VarData[1]、VarData[2]写入数据,然后读出。调试过程中读写正常,但只要断电,再上电后读出的数据就不是断电前写入的数据了。
/ S8 u, l- r5 ^分析:' M& S* o3 x8 I+ ]6 e5 D
  STM32F051C6T6的Flash长度为32KB,每页长为0x400,地址从0x08002000到0x080027FF。
0 ?9 P" W$ u+ U  ?: h2 g* k; `# P查阅STM32F0xx的eeprom.h,其中有:
& C& h; u) R) M0 E3 N( O. h#define PAGE_SIZE             ((uint32_t)0x0400)  8 j+ ?# V& B0 Z2 k8 ?
#define EEPROM_START_ADDRESS ((uint32_t)0x08002000)
, t' x, u2 h2 i这里定义:#defineEEPROM_START_ADDRESS ((uint32_t)0x08002000)( W: D' E' h7 U2 i: p9 A
( U& O' O) Y+ S3 G3 C) {& D) E

* S$ ~! p. l4 |2 ~, |再查阅STM32F0xx的 eeprom.c:
* @0 h: P) h4 |7 M. g) g' ]- j" g1 Kuint16_t EE_ReadVariable(uint16_t VirtAddress, uint16_t* Data)" p, j% L) L% {2 M% Y( n
{  uint16_t ValidPage = PAGE0;3 }$ n/ t. v  h$ n
  uint16_t AddressValue = 0x7777, ReadStatus = 1;
- u. L. T& p" Y* `0 U  e  uint32_t Address = 0x08001000, PageStartAddress = 0x08001000;9 U. n& `( j# F! n& J; l6 p
}
$ y2 i7 i% |% Q* E8 T- a7 R- Y+ C; h1 _% o: N% C

3 ]; J) P2 V2 s% }' z8 W    这里地址的分配是这样安排的:
7 `  k! ]$ q  S3 O, }8 u, Muint32_t Address= 0x08001000, PageStartAddress = 0x08001000;6 V0 K' |0 B- T
这个EEPROM emulation in STM32F0xx是从EEPROM emulation in STM32F10xx移植过来的。于是查阅F1系列相关的文件,
  J7 ^0 L6 O. t8 I9 m
, r' A# G8 R  ^6 m. |" L
9 [1 `* @1 N5 z" H; Q/ ^
STM32F10xx 的eeprom.h是这样的:/ W5 m$ O3 v  c3 T4 {& D) Y
#define EEPROM_START_ADDRESS    ((uint32_t)0x08010000)
, m6 s: \: ~) P4 l: VSTM32F10xx的 eeprom.c是这样的:
, O! {) S. a. Y& huint16_t EE_ReadVariable(uint16_t VirtAddress, uint16_t* Data)3 P) q: i& m3 R0 ]9 G
{  uint16_t ValidPage = PAGE0;; I- V4 P3 [, f! m4 h2 \, J4 B" r
  uint16_t AddressValue = 0x5555, ReadStatus = 1;
: A- [+ U7 A1 J0 P. x  uint32_t Address =0x08010000, PageStartAddress =0x08010000;% o8 m/ z; @) w
}7 j/ _) E8 a. v* Y" ?5 t
      ST工程师在移植F1仿真EEPROM到F0仿真EEPROM时,忘记把F0的eeprom.h和eeprom.c文件里关于仿真Flash页的地址修改一致:: e9 Q% Z3 X' c& T7 p
在F051写入的首地址是0x08002000,而读出的首地址则在0x08001000。从而导致读数据的地址不是写入数据的地址——读出错。
6 Q4 z: x' H, }修改eeprom.c代码:
6 K3 R0 X, i: o0 A& l4 v! q3 `uint32_t Address= 0x08002000, PageStartAddress = 0x08002000;9 u1 I6 o8 [2 A% ~" v7 d; \0 i
故障排除。
; h4 o+ e  c3 ^1 p3 ~3 S
/ R4 O' ?& m! F, @; o
silver 回答时间:2022-10-24 15:37:18
把我很久之前的BUG记录发上来。。。。
9 c+ z0 B+ y. m" q问题:IIC调试无法得到数据(写后立即读出是0x00),当前SDA输入配置位浮空输入1 P9 K) P% u; ]3 ^  d1 Y
解决:SDA输出配置为推挽,SDA输入配置为内部上拉输入# t+ P+ z; h% I  V+ d

. M/ `; S# J5 q; I. z问题:指针当参数取值必定改变传参的值?/ {" ?( \9 @# W$ m- s* ]& L: ^0 ~
解决:是,查看下数组的位有没有搞错- F1 ?1 K( @, b& k( ]
1 M9 c& u7 D( s
问题:引脚控制有问题7 R5 t' r9 d- t2 a: n0 ~
解决:查看配置和宏定义是否有问题
4 x5 F; k( Y0 a! n8 K  L. V  c/ t/ F$ _
问题:F103ADC+DMA采集数组数据始终为0,ADC-DR有数据4 T/ E( e& i- X/ d7 m! [; d
解决:ADC_DMACmd(ADC1, ENABLE);不应放在DMA的初始化函数里" p) G" c3 s- A
解决2:F030的CUBEMX11.0包有问题! Z. O: R9 j& Q$ M6 E: D

6 @! l6 ^' J- n" S问题:F103SDIO+DMA+FATS无法通信、卡在死循环里
: l8 a, x+ I  ]$ C( W3 l解决:F103SDIO+DMA需要GPIO全部上拉和DMAtx、rx都要单独初始化、加4B初始化( o8 v) \. h6 E' ~

* Z. ]% G2 U# V8 _$ y问题:FATFS读操作返回FA_NO_READY - f7 g: s: I7 L6 l; e
解决:查看SDIO这个配置SDIO_CLOCK_BYPASS_DISABLE,使能就会出现上述问题$ ^- O2 }) @- n4 h
  e# m5 k/ }; r  F
问题:FATFS出现CMD_TIMEOUT现象
+ l# n, S8 @$ O5 {解决:BSP_SD_GetCardState这个函数需要1MS延时: r$ z9 s. w/ K3 A: _  U

" v. @4 R$ T+ U0 Q, @6 X) }问题: RTT系统出现HADRWARE_FALUT
0 @; z. N2 \8 q解决:定时任务不允许使用延时3 {! y1 ~/ x2 w! R

! J7 p, e6 X, t( h现象: 数据高低位翻转
  D& s( J4 B6 ~解决:左移改右移 memcpy固定小端拷贝 第一位拷到低8位- {. |( k5 i2 [5 s" k) [( K/ [

- h! l0 H# z' r) @$ V; A! \6 p问题:HAL硬件IIC返回BUSY(STM32F1)
# G/ I7 C7 I: T解决:需要改动RCC的I2C1的使能位置(在配置引脚之前使能)!
! @1 n4 g" g3 T
! n: u( Q9 \" m" |; t问题:IIC无法读取数据
; \! f& b5 q. i) H& `  F, q! Q3 p解决:IIC设备地址是需要'<<1'才能使用1 C8 m7 y6 }1 x. T8 p
; L4 u' g5 G8 Y
问题:DEBUG中突然失败: T" B0 w# ~8 u0 {
解决:断点错乱会导致调试中途失败; Y  l7 H5 G# O4 |% K# |+ y$ R
; v& {! S0 p2 l. z8 g: ?$ s
问题:空闲中断有触发,但DMA缓冲区没有任何数据
1 j1 N/ A/ \$ _- v; h) A& m9 I1 v解决: 检查DMA外设时钟* C$ Z  h4 ~1 i7 `( N. t/ D
3 d$ |8 c6 t, {1 d# m$ }( a% N
问题:CJSON print_out返回空7 E# L$ Q6 v% y
解决: 增加堆空间& Y5 n/ u3 L, Y$ v

/ H. p; y3 m1 O0 B- l问题:ADC速率会影响输出电流 越快电流越大
1 T, q% ^" U: d2 @1 x3 w. I+ S解决: 根据需求增减
1 E4 ]+ I' ^# B+ [/ l) m0 U; ~1 L& K% f) B% P8 I
问题:内联函数编译时出现未定义报错
+ |4 l' T5 O5 h- q% J" C解决:        一个文件只能调一次  重复调会报错
7 v9 {  b5 ?6 {3 A# `- Y5 V! _% u4 [/ N
orima 回答时间:2022-10-27 20:10:13
问题:HAL硬件IIC返回BUSY(STM32F1)
! {# d! o+ N  S4 R8 U解决:需要改动RCC的I2C1的使能位置(在配置引脚之前使能)!
5 R6 c1 T/ Z7 R- A. }  j6 a
, a- B1 G* o4 r, f# @9 f1 B. y2 Y问题:IIC无法读取数据
1 D& r1 e; @5 {9 a/ N" q解决:IIC设备地址是需要'<<1'才能使用& P1 M2 z1 P, n

1 o% }# j) B* ^# ^- Z问题:DEBUG中突然失败* ~. o5 V! O! X" x
解决:断点错乱会导致调试中途失败
; y3 P7 @# L  I3 E
  f5 m' t. w4 Y' c6 i+ n0 J问题:空闲中断有触发,但DMA缓冲区没有任何数据
3 a) d9 \" p  ?# u: {4 ~* |# @解决: 检查DMA外设时钟7 V) j& T2 Y& ]7 K( U

7 j8 a4 n2 Z) l7 d9 f" |问题:CJSON print_out返回空; S& r* q; ?; M+ S# @
解决: 增加堆空间- Y. R! T1 h8 l+ p$ O' b2 a

" K1 C8 Y, O! m( `" W问题:ADC速率会影响输出电流 越快电流越大
& D, R( M  g0 B! w' [4 d/ K! g0 j解决: 根据需求增减/ b* n' l, f# B6 }: W& g' q' z
CC4 回答时间:2022-10-24 11:17:46
for 语句的 break条件判定失败,导致系统卡死。。。。
一个脑子不够用 回答时间:2022-10-24 11:24:04
使用FreeRTOS任务切换的时候,数组太大了,越界导致程序卡死硬件异常,一直卡在HardFault_Handler的while里面,查了一天错误
+ ^, }0 r2 x  `2 J. w: U$ W, r
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对应的屏幕编码才能正确..5 B1 B2 b! ?; V( o0 k- e
STMWoodData 回答时间:2022-10-24 15:34:13
写了一个Bug,然后就Bug了
. |: R3 Q: J" O7 b, U9 }. {
wudianjun2001 回答时间:2022-10-24 15:35:44
12313213
2 L! O4 n/ W- k
杨小杨 回答时间:2022-10-24 15:36:10
学习
/ {% K& j5 Z9 Q! s( T; k
daming32 回答时间:2022-10-24 15:36:25
签到签到
; Z/ P# n. ^, J- [# O5 @# C8 _7 g; Y3 z4 i
廖向涵 回答时间:2022-10-24 15:36:27
启动启动6 q6 _+ l& q- @$ L- {: B" P! q
meiyao 回答时间:2022-10-24 15:37:17
666转起来
) i6 z$ ^; X! }, L
EricCheng 回答时间:2022-10-24 15:37:33
签到签到: n! y9 v( j0 I- q6 \% u% r
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版