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

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

[复制链接]
STMCU-管管 发布时间:2022-10-24 11:11
【1024活动】写一手好“Bug”的程序员们!Hello world
7 x* c# e9 \. l0 R+ ]: D

2 }$ z& d8 }  Q9 U1 R3 L
) f$ o4 l( t( L3 O
11.png
+ u& y# X( j+ I; n! T$ Y! y0 _用键盘,敲出灵动的字符;用鼠标,点出幸福的人生;用智慧,推敲缜密的逻辑;用灵感,推开想象的大门;用语言,谱出鲜活的程序;用自信,编出明天的精彩。你把抽象符号变成快乐笑容,你把简单代码变出复杂意义,你演绎枯燥变情趣的游戏,你把辛苦留下捧出生活的神奇。程序员节,愿你成就精彩,乐享人生!

4 q3 B" n0 z& y  h' @: N: `
, P: }  f9 y" |+ o
; g) G% I  f/ t8 v* E" w
12.png
7 g% `+ a/ ^: R2 t" q, }: _
" z2 _7 a: ^9 o" N
程序员们!这么重要的节日怎么少得了整活,活动来了!
& f* B* Z5 @1 W) m

* j3 @( q# y1 d! U1 [
) v1 N; q4 F, p4 l6 Z3 |+ b
活动内容:
就是写日常开发过程中你遇到的BUG!在下方评论!
(不会写BUG的程序员不是好厨子
6 N9 b$ y' ~& H# W" y
9 r+ r( d* }/ r7 d7 L0 |1 T  M+ `

5 N- e5 R  ]; a4 o4 r
: K6 E/ |/ P9 u6 r  w) `0 b9 l
: U, b. a5 |9 H" x3 q
活动时间:
10月24日-10月26日

8 j! b6 o! Y0 [8 K8 y( }3 _0 q) U% W$ Q& v
* ]9 V: L) n! O+ y

/ E" G/ K# U, T' r/ m( v! W6 E活动奖励:
抽取5位送出:小米背包、STM32开发板、笔记本支架、保温杯等!

7 j8 V0 h! W/ [2 N# y' Z下午三点大转盘搞起来
转盘入口

8 F" l$ L' D2 }  B) S) o) [- y& F/ c. F
转前须知:必须按照需求恢复本帖才可以抽奖,否则中奖无效。
3 O2 }/ I# \2 z4 X' k4 B

' s( z6 N; f. Y0 T: O5 P: Z! c 13.png

. x# _8 |5 C/ h) m: j" i9 Y# X8 E7 |$ m5 d1 _3 J6 ]! V0 {
: W0 s3 Z9 C- ?) U$ \- Y
, j" S+ n2 c$ }1 s, N
收藏 评论80 发布时间:2022-10-24 11:11

举报

80个回答
wenyangzeng 回答时间:2022-10-24 15:33:12
STM32F051 EEPROM emulation一个BUG的修正
' d. O% y: p! q+ q; @# y2 x    开发时需要在STM32F051断电前保存少量变量数据,在ST官网下载了“STSW_STM32117_STM32F0xx微控制器中的EEPROM仿真”固件包。这个固件包演示了在仿真EEPROM的页里对VarData[0]、VarData[1]、VarData[2]写入数据,然后读出。调试过程中读写正常,但只要断电,再上电后读出的数据就不是断电前写入的数据了。
; |7 |4 Y! r: @' P% {6 N' K; H  }分析:+ C" V5 l/ p" d1 J$ g( m( _1 R6 f
  STM32F051C6T6的Flash长度为32KB,每页长为0x400,地址从0x08002000到0x080027FF。1 ~/ ?/ X; J* O" }5 N4 V
查阅STM32F0xx的eeprom.h,其中有:
1 W- X+ {) i& P/ x. y% H#define PAGE_SIZE             ((uint32_t)0x0400)  9 e2 d# X" T: w' k4 L9 q; l1 [' D
#define EEPROM_START_ADDRESS ((uint32_t)0x08002000)8 E1 r+ X  ~$ ]% a7 C
这里定义:#defineEEPROM_START_ADDRESS ((uint32_t)0x08002000), j5 g4 u' P# X
6 k' ~4 Z% q+ z' |, s6 L

# ]: }" Z, ?$ e4 h. ~1 K; P( @再查阅STM32F0xx的 eeprom.c:
- _# Q( K  ~/ {. n; Luint16_t EE_ReadVariable(uint16_t VirtAddress, uint16_t* Data)
# v0 _: }* H* r2 M: D{  uint16_t ValidPage = PAGE0;
3 N& Y9 m! ^- z) W4 `  uint16_t AddressValue = 0x7777, ReadStatus = 1;5 g7 E/ _+ h1 N8 N
  uint32_t Address = 0x08001000, PageStartAddress = 0x08001000;
2 }6 |4 i4 s: G5 K+ U7 m% g}
& z! D8 E' Z( f; Y$ _5 P. D1 e4 J! F3 n$ }; W( h/ I' ~8 U
; s- |7 c$ n. t" x3 v2 r
    这里地址的分配是这样安排的:
/ [2 r5 v, {( e& h2 Duint32_t Address= 0x08001000, PageStartAddress = 0x08001000;% q* f3 u& Z! S& Z! ?7 N: a( ^" }
这个EEPROM emulation in STM32F0xx是从EEPROM emulation in STM32F10xx移植过来的。于是查阅F1系列相关的文件,
. E9 k3 Z, a% v3 i
' A2 _! J0 M! U  C. A: g" A
9 L/ v# v+ O4 q, \3 f2 }0 W
STM32F10xx 的eeprom.h是这样的:" S$ @# l6 K5 n3 P
#define EEPROM_START_ADDRESS    ((uint32_t)0x08010000) 1 @: [* d; K' _
STM32F10xx的 eeprom.c是这样的:
$ @& f* b' K& Muint16_t EE_ReadVariable(uint16_t VirtAddress, uint16_t* Data)) a7 M$ U. @! d0 F: O, ~
{  uint16_t ValidPage = PAGE0;
9 @& w" m- ^& C& X# f7 Q  uint16_t AddressValue = 0x5555, ReadStatus = 1;5 o$ i5 l1 e3 Q7 [! `4 p  n
  uint32_t Address =0x08010000, PageStartAddress =0x08010000;
0 ~* X* f! G; |+ Z7 c, U% a$ |}, e' s9 ?/ @8 y4 U% W. _
      ST工程师在移植F1仿真EEPROM到F0仿真EEPROM时,忘记把F0的eeprom.h和eeprom.c文件里关于仿真Flash页的地址修改一致:3 A5 p' M! a- o) V3 U( N
在F051写入的首地址是0x08002000,而读出的首地址则在0x08001000。从而导致读数据的地址不是写入数据的地址——读出错。' j$ U  @& w% a2 r" m& ?6 o& O7 ~
修改eeprom.c代码:4 Z1 o) b# D  ?' C
uint32_t Address= 0x08002000, PageStartAddress = 0x08002000;# y8 w, I  i) A8 r9 c
故障排除。8 p9 |5 Y' s4 C
; v1 j6 B: w% A! O
silver 回答时间:2022-10-24 15:37:18
把我很久之前的BUG记录发上来。。。。5 M$ x0 T& {/ q8 J
问题:IIC调试无法得到数据(写后立即读出是0x00),当前SDA输入配置位浮空输入
  l. E9 o8 a& Y' g% M解决:SDA输出配置为推挽,SDA输入配置为内部上拉输入
$ e+ c; f3 q, _0 B+ H' N* K- r4 p: b6 V& N" C/ f+ F/ C
问题:指针当参数取值必定改变传参的值?
2 |/ _! H0 |% r5 z1 W7 ^6 w解决:是,查看下数组的位有没有搞错
* P3 h, o* J( d3 Q0 ]3 _  [: X# n- i: w3 a1 ?/ Y3 C9 L
问题:引脚控制有问题+ G" L, a1 m+ c* h, x! n$ U
解决:查看配置和宏定义是否有问题6 n% `0 t0 ]' u/ r/ ^
; _7 M- p# Q3 Y1 t" s( p
问题:F103ADC+DMA采集数组数据始终为0,ADC-DR有数据3 _3 D4 s: @3 G7 ?% ^$ F  H
解决:ADC_DMACmd(ADC1, ENABLE);不应放在DMA的初始化函数里: X  j- i& g! i7 |  M" M! U
解决2:F030的CUBEMX11.0包有问题
) J1 X+ S$ Q' E
# W$ n* {; J2 j2 a! }& b4 R- B  ^问题:F103SDIO+DMA+FATS无法通信、卡在死循环里7 A+ H: |6 |6 x
解决:F103SDIO+DMA需要GPIO全部上拉和DMAtx、rx都要单独初始化、加4B初始化' ?; {& k6 ~" ]+ D' c8 P
1 v2 K, ~/ H. a8 Z
问题:FATFS读操作返回FA_NO_READY 3 m* {: h& V, Y! D
解决:查看SDIO这个配置SDIO_CLOCK_BYPASS_DISABLE,使能就会出现上述问题  i1 z$ v- D* A& ^  X# {; ~6 f

" \. f3 k; S7 M" h/ C" m# `9 K( N问题:FATFS出现CMD_TIMEOUT现象& E5 q0 i5 P9 n) i& S
解决:BSP_SD_GetCardState这个函数需要1MS延时1 t$ X9 v  ?; p: s2 B% M8 V8 N$ B. B
7 f: D% o2 C# Q4 y! M
问题: RTT系统出现HADRWARE_FALUT
$ J! J  T- z& r' \1 Q( V解决:定时任务不允许使用延时* m8 X" C8 W( a, D
" v) J4 _+ P7 m5 R
现象: 数据高低位翻转* ]3 Z+ J) D# @" O# O
解决:左移改右移 memcpy固定小端拷贝 第一位拷到低8位
- x( O& @9 f1 Q, T: {6 [; x0 h9 s* [2 k. J
问题:HAL硬件IIC返回BUSY(STM32F1)
& z8 _$ r: p8 O& A0 ~解决:需要改动RCC的I2C1的使能位置(在配置引脚之前使能)!) h' G1 q$ P& q: E3 a  R

/ d7 M/ @$ g. h+ [- O问题:IIC无法读取数据
! Y- h/ Q" A; K5 M/ v1 Y! Q解决:IIC设备地址是需要'<<1'才能使用
/ J0 ^/ x& A8 r4 Y! Z0 b3 {1 J
1 X% t+ V+ t0 m0 y5 z问题:DEBUG中突然失败
7 @2 q% i9 H: _( Y- p, Z: _解决:断点错乱会导致调试中途失败5 `: u$ v& f% e! Z& E2 N+ }

4 {- T+ v7 A8 S; M1 c问题:空闲中断有触发,但DMA缓冲区没有任何数据- W" L; k" O7 M5 i' r  m- c/ E; Y( C
解决: 检查DMA外设时钟1 u0 {0 F4 d5 M; ~/ l: |, V: T

2 Z. G: G7 H  z8 R. e, G问题:CJSON print_out返回空
% |; z- d4 }. q1 r解决: 增加堆空间
0 U. @2 O3 m% R! L2 y0 o, p% F# Z8 }) d8 l& w% [0 d3 x
问题:ADC速率会影响输出电流 越快电流越大
3 f. T) v* J0 U* J. |3 F解决: 根据需求增减
& w. U- F/ t- m7 ]4 Z
/ c+ X; C, `6 e& F0 g$ V; b6 z: M问题:内联函数编译时出现未定义报错
' X+ Z' R: i' ]5 c" s4 N解决:        一个文件只能调一次  重复调会报错
8 }/ ~' e4 ?4 b4 k$ w* g& M+ g* a) s2 y6 K: b1 ]4 `0 I
orima 回答时间:2022-10-27 20:10:13
问题:HAL硬件IIC返回BUSY(STM32F1)0 z3 k! B) n2 C$ y
解决:需要改动RCC的I2C1的使能位置(在配置引脚之前使能)!
" z8 g/ W! E' q/ h+ b, j3 L9 b0 ?8 v9 a3 H7 ^: T8 a
问题:IIC无法读取数据( r. K* u# e, `2 s; \
解决:IIC设备地址是需要'<<1'才能使用
% _: m0 ]( C4 O* R" k: ?6 H- m" q" R1 c  C
问题:DEBUG中突然失败) Y* W0 M' a( `& J6 m* Q+ E( B
解决:断点错乱会导致调试中途失败
5 `: L$ ]+ F& ^6 v7 \4 ]" Z% U" B; m( }
问题:空闲中断有触发,但DMA缓冲区没有任何数据
4 ^; u# l% k2 [) w8 f$ c& ]$ u解决: 检查DMA外设时钟
' H8 r- Z0 ~/ a/ |- Y, Z+ J0 \' D* @' y: T+ S# E$ G
问题:CJSON print_out返回空9 i" P1 j% g* Q- T/ ]
解决: 增加堆空间% E( T* E2 f  o7 A/ l2 c

& B6 U4 c( w  _( M+ M( L: D% ]' L+ G问题:ADC速率会影响输出电流 越快电流越大
1 X3 X( h7 Y: k/ V+ j+ x, \# _解决: 根据需求增减" U( u9 A% ?8 m0 T8 `  j
CC4 回答时间:2022-10-24 11:17:46
for 语句的 break条件判定失败,导致系统卡死。。。。
一个脑子不够用 回答时间:2022-10-24 11:24:04
使用FreeRTOS任务切换的时候,数组太大了,越界导致程序卡死硬件异常,一直卡在HardFault_Handler的while里面,查了一天错误- Z/ X2 n* h( `! B
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对应的屏幕编码才能正确.." n  ~/ ~7 A. c1 h& A
STMWoodData 回答时间:2022-10-24 15:34:13
写了一个Bug,然后就Bug了) N4 e2 @4 Q( z0 }2 ?9 ~# w
wudianjun2001 回答时间:2022-10-24 15:35:44
12313213! `9 \4 f; l! l, e
杨小杨 回答时间:2022-10-24 15:36:10
学习1 f' M% w* J; \2 p4 U7 j4 S( N
daming32 回答时间:2022-10-24 15:36:25
签到签到" h( M4 M0 {! D& ^( ~- K
廖向涵 回答时间:2022-10-24 15:36:27
启动启动) q2 n- A8 ?# i6 r
meiyao 回答时间:2022-10-24 15:37:17
666转起来: A9 }8 a, R1 s
EricCheng 回答时间:2022-10-24 15:37:33
签到签到
/ T' q2 n# _0 ?
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版