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

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

[复制链接]
STMCU-管管 发布时间:2022-10-24 11:11
【1024活动】写一手好“Bug”的程序员们!Hello world
! K) G3 \' W7 n) S4 E% x3 X
+ l( U9 d7 ^! ?/ z. \

4 j! Y, ?7 I8 j; ]
11.png 9 U" U# }+ y* ]3 c# Y
用键盘,敲出灵动的字符;用鼠标,点出幸福的人生;用智慧,推敲缜密的逻辑;用灵感,推开想象的大门;用语言,谱出鲜活的程序;用自信,编出明天的精彩。你把抽象符号变成快乐笑容,你把简单代码变出复杂意义,你演绎枯燥变情趣的游戏,你把辛苦留下捧出生活的神奇。程序员节,愿你成就精彩,乐享人生!

+ S. d. [2 p! b( C1 ?
9 s6 v3 d7 z, |: K

5 M1 I' D: k8 S# k! ^) v3 [1 [
12.png

. E2 _" o( ~- V' [9 B8 V5 ?! s, W9 w1 u8 h) n+ e, T
程序员们!这么重要的节日怎么少得了整活,活动来了!

0 n! r) x8 a- m8 \

; N9 I- g& Y; |- c9 f- O
  K) w4 U! k: H* u) S
活动内容:
就是写日常开发过程中你遇到的BUG!在下方评论!
(不会写BUG的程序员不是好厨子

6 O5 O/ u- W) v2 l% `, Q" q8 A5 B3 a' s  s
3 b" z( ^, o/ r4 y7 j$ v
% A( H3 C& [8 K9 |9 h
4 E! ]0 }8 I2 b1 W% t* L
活动时间:
10月24日-10月26日
& k; _; c4 n9 b
! `+ }4 I* x5 ]3 |* o
. v( q) D8 [( X* f7 I
# _  q/ n! t8 r; L( Z& Y
活动奖励:
抽取5位送出:小米背包、STM32开发板、笔记本支架、保温杯等!

6 O) R# @1 K) m3 {- {7 T8 S下午三点大转盘搞起来
转盘入口
$ a' W; Q) ?( Y# V

9 v+ o9 [* M) I: u8 k1 z9 G
转前须知:必须按照需求恢复本帖才可以抽奖,否则中奖无效。

; n; {1 g- b! ^4 V! j
4 O5 `# r8 f; I; y0 @3 s$ u3 y
13.png
2 ^, o+ M+ d4 v! e1 F- j, }

6 Q% Q4 W& w4 \4 R6 Y. ^" t7 j) V) ?7 T( o
  [0 S1 w, @6 N$ N- D
收藏 评论80 发布时间:2022-10-24 11:11

举报

80个回答
wenyangzeng 回答时间:2022-10-24 15:33:12
STM32F051 EEPROM emulation一个BUG的修正
& U- [1 J  f" Y8 u    开发时需要在STM32F051断电前保存少量变量数据,在ST官网下载了“STSW_STM32117_STM32F0xx微控制器中的EEPROM仿真”固件包。这个固件包演示了在仿真EEPROM的页里对VarData[0]、VarData[1]、VarData[2]写入数据,然后读出。调试过程中读写正常,但只要断电,再上电后读出的数据就不是断电前写入的数据了。0 q% e4 Y  o, j
分析:
5 {. Y6 ?! u1 ~  STM32F051C6T6的Flash长度为32KB,每页长为0x400,地址从0x08002000到0x080027FF。
, w* x1 ]) f) P$ b+ e9 t/ g2 H. r查阅STM32F0xx的eeprom.h,其中有:
( P/ ?, P4 a: {  a3 ^#define PAGE_SIZE             ((uint32_t)0x0400)  1 x' f% f& H1 Y) ~" H0 O0 I
#define EEPROM_START_ADDRESS ((uint32_t)0x08002000)
7 O  G+ i4 [* {( e; _8 r" |这里定义:#defineEEPROM_START_ADDRESS ((uint32_t)0x08002000)3 S. B- y+ W0 v) V# s0 d

  x7 q* M: I9 \6 s
- S9 Z7 m7 J' ]
再查阅STM32F0xx的 eeprom.c:& I1 i1 v4 V; H1 @
uint16_t EE_ReadVariable(uint16_t VirtAddress, uint16_t* Data)
8 H! t/ `' I* H0 H& [  ^+ U{  uint16_t ValidPage = PAGE0;$ }6 R, l0 \; _2 a
  uint16_t AddressValue = 0x7777, ReadStatus = 1;. f6 h) ]. O6 {1 P7 f, b, c
  uint32_t Address = 0x08001000, PageStartAddress = 0x08001000;
2 D9 L! E4 N4 P+ h9 S  i6 p7 ~}
2 _$ |) w1 S8 a4 O. J% x3 _% T0 i9 f" J& z
) u1 n9 ~; @' e( X0 m
    这里地址的分配是这样安排的:) b1 a% Z/ [  T7 y9 I
uint32_t Address= 0x08001000, PageStartAddress = 0x08001000;
0 B) B# Y$ t  E4 b这个EEPROM emulation in STM32F0xx是从EEPROM emulation in STM32F10xx移植过来的。于是查阅F1系列相关的文件,
$ e2 n1 j6 k! E- T4 E. a' B5 t2 @2 v# ~% e& }
1 e5 P" }; N( u6 q! U! E$ |8 X
STM32F10xx 的eeprom.h是这样的:9 B: R* T0 W- {; V
#define EEPROM_START_ADDRESS    ((uint32_t)0x08010000)
4 m! t  N  z) {( ]$ Z* @  x3 zSTM32F10xx的 eeprom.c是这样的:0 d, _; X; x6 l7 w7 M' Z
uint16_t EE_ReadVariable(uint16_t VirtAddress, uint16_t* Data)
+ y4 i2 F9 w1 R8 z, Y{  uint16_t ValidPage = PAGE0;
3 E. {) i$ j1 B; r( _* x  uint16_t AddressValue = 0x5555, ReadStatus = 1;
2 l' \6 Y( z+ P7 Y# M( w5 W, y' Z  uint32_t Address =0x08010000, PageStartAddress =0x08010000;
( v' g3 l# I/ V5 |}
8 D1 A7 {0 d' V0 ]9 J      ST工程师在移植F1仿真EEPROM到F0仿真EEPROM时,忘记把F0的eeprom.h和eeprom.c文件里关于仿真Flash页的地址修改一致:1 _) W. c- e9 F- n
在F051写入的首地址是0x08002000,而读出的首地址则在0x08001000。从而导致读数据的地址不是写入数据的地址——读出错。
7 P( @2 W; l, N- ]修改eeprom.c代码:9 ]" P0 d6 i/ G" I
uint32_t Address= 0x08002000, PageStartAddress = 0x08002000;
+ N- G8 n) Y5 C% x9 B故障排除。# f( \4 j3 w, \# [7 U
: u- Y( Y6 S; n& O" k5 o/ E' i
silver 回答时间:2022-10-24 15:37:18
把我很久之前的BUG记录发上来。。。。7 ^  V) M9 |" J! _- u. k+ m
问题:IIC调试无法得到数据(写后立即读出是0x00),当前SDA输入配置位浮空输入
# ?8 i' [6 Z: A$ {6 ]. c& t解决:SDA输出配置为推挽,SDA输入配置为内部上拉输入
2 R( T' u& q* n4 \/ e+ b! z
4 j# t+ D9 R' L/ f8 @$ s0 Z% b: ?问题:指针当参数取值必定改变传参的值?' k1 r; C7 L7 e6 v! w
解决:是,查看下数组的位有没有搞错5 L" I& n) K6 v8 a

; r7 v* y; l: e0 Q2 C9 J: D问题:引脚控制有问题
; r' u4 `* V( M4 u解决:查看配置和宏定义是否有问题
# Q5 p) h- }5 K/ x; U0 c2 J, \0 ~) ^, w, |( X8 L
问题:F103ADC+DMA采集数组数据始终为0,ADC-DR有数据3 l9 T" b, q% U/ K8 `3 J, V
解决:ADC_DMACmd(ADC1, ENABLE);不应放在DMA的初始化函数里; J/ u/ Z. f8 I3 R
解决2:F030的CUBEMX11.0包有问题
1 R% t: f) @& Q! S4 g0 d) T' x" J2 M; c
问题:F103SDIO+DMA+FATS无法通信、卡在死循环里
6 E5 M3 M. ~8 I5 y7 n! T; c0 {# ]解决:F103SDIO+DMA需要GPIO全部上拉和DMAtx、rx都要单独初始化、加4B初始化
. J6 Y; z" r' }# z/ V8 o4 R) t, B8 G5 x$ R7 ]9 x5 ^6 j  d
问题:FATFS读操作返回FA_NO_READY 9 q& O& o/ _' f) a9 b' p
解决:查看SDIO这个配置SDIO_CLOCK_BYPASS_DISABLE,使能就会出现上述问题  Q  ^- {) a0 b+ T7 H- q2 A; Y

5 a) {( B0 r4 B! Z问题:FATFS出现CMD_TIMEOUT现象
4 ?% J5 N5 a5 S3 e! J4 o( |& `$ L解决:BSP_SD_GetCardState这个函数需要1MS延时) T9 t. j. a) e$ ?- W& j9 H
3 }7 o% ~4 V; ?* A2 D& a
问题: RTT系统出现HADRWARE_FALUT3 \5 K: O3 C# P6 o7 a
解决:定时任务不允许使用延时
5 `, H5 O, I! `/ d" i9 Z3 ]* F, z& U$ p/ U
现象: 数据高低位翻转
. X8 A( b" R' W解决:左移改右移 memcpy固定小端拷贝 第一位拷到低8位  \- h7 L/ i4 y
5 }: C# i$ U* N9 k4 _1 y! O7 m% _
问题:HAL硬件IIC返回BUSY(STM32F1)
' t4 O0 ^; y2 u解决:需要改动RCC的I2C1的使能位置(在配置引脚之前使能)!/ ^2 @5 b% N6 Z

- a# D' M* ^# E0 h0 ^; |问题:IIC无法读取数据
; d2 \' R* e2 `( H. s解决:IIC设备地址是需要'<<1'才能使用
; }- R7 V- t4 ^8 B* V* u4 Z% o3 s0 b& T
问题:DEBUG中突然失败/ j* K6 z; s& L. X- @# B: K
解决:断点错乱会导致调试中途失败
9 k! }6 m4 u; O% i% @& S' ^4 `! F
# q0 ^4 Q$ i* {; K  l& M" o9 ?9 J问题:空闲中断有触发,但DMA缓冲区没有任何数据; _+ S9 m7 V9 G4 ]3 D. \' [% N5 V2 U
解决: 检查DMA外设时钟% i5 {# X  k% z& e4 |
& {' v/ J9 a7 Y& v  e
问题:CJSON print_out返回空4 G5 u+ H5 e3 @  ^/ B
解决: 增加堆空间5 n8 o- k  I1 j7 @& `

) i4 Q, c: N5 m! i# E问题:ADC速率会影响输出电流 越快电流越大) R4 o3 M$ M. T
解决: 根据需求增减
" V" |1 U3 s' W; v: G
- D6 J' ?& {: D2 n9 n" I问题:内联函数编译时出现未定义报错
& n( S+ W+ H7 N& o7 L解决:        一个文件只能调一次  重复调会报错7 s" b* g2 i7 v! k, I  k* \
9 M% E) L. @, N/ U1 ~6 q% a
orima 回答时间:2022-10-27 20:10:13
问题:HAL硬件IIC返回BUSY(STM32F1)
& S5 t9 R6 M  S$ J解决:需要改动RCC的I2C1的使能位置(在配置引脚之前使能)!6 i, s' Q& F7 G7 Q/ A
/ s2 l3 w& r) g0 n
问题:IIC无法读取数据# j- j* J: p+ ^" N
解决:IIC设备地址是需要'<<1'才能使用0 \/ N9 }: [1 `" G3 N* O/ {

  j  A$ E, L/ o( I  c1 o问题:DEBUG中突然失败: l8 `7 F; f( Q" e; w
解决:断点错乱会导致调试中途失败' ]' `- L6 ^6 v/ S; [

5 R& H8 `+ F' c问题:空闲中断有触发,但DMA缓冲区没有任何数据
8 p' S1 }( I6 n' @" O解决: 检查DMA外设时钟
" ?% J" k+ @+ f: y( D: Q( n5 J- X( s# ?! y7 i
问题:CJSON print_out返回空* J% l) |: P! f( p5 }# R5 q3 d
解决: 增加堆空间
  u8 j1 s& E% g/ P, H2 e
4 u0 A! D8 m1 |) Q" a7 q6 o# Z$ {问题:ADC速率会影响输出电流 越快电流越大
& Y! ]9 t, q7 U% N解决: 根据需求增减
6 i8 J, c( E! O2 J! g8 |
CC4 回答时间:2022-10-24 11:17:46
for 语句的 break条件判定失败,导致系统卡死。。。。
一个脑子不够用 回答时间:2022-10-24 11:24:04
使用FreeRTOS任务切换的时候,数组太大了,越界导致程序卡死硬件异常,一直卡在HardFault_Handler的while里面,查了一天错误' M4 F% a/ B& s2 D
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对应的屏幕编码才能正确..' S; y# l6 x! f- _
STMWoodData 回答时间:2022-10-24 15:34:13
写了一个Bug,然后就Bug了
* p* G/ A" m% H8 e
wudianjun2001 回答时间:2022-10-24 15:35:44
12313213
. P8 G% Z, K$ u- n$ h) B8 c* }7 \
杨小杨 回答时间:2022-10-24 15:36:10
学习7 s( K. X( _1 Q+ u; h
daming32 回答时间:2022-10-24 15:36:25
签到签到1 K8 X* |  t( }) [" }
廖向涵 回答时间:2022-10-24 15:36:27
启动启动
. v% Z: Q+ e5 b4 M# y8 ?
meiyao 回答时间:2022-10-24 15:37:17
666转起来$ Z9 H  ^. m  g6 w9 R
EricCheng 回答时间:2022-10-24 15:37:33
签到签到
" O- b- m$ V% r8 m9 S2 J
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版