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

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

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

  t( c: C3 P$ D/ M# K
7 K7 z, @( Z8 I- u' {; a, z0 t
$ k, U& {% Z" W2 X& |& j7 |: j
11.png
0 y9 x7 V9 g' Z, Z0 @) J! A用键盘,敲出灵动的字符;用鼠标,点出幸福的人生;用智慧,推敲缜密的逻辑;用灵感,推开想象的大门;用语言,谱出鲜活的程序;用自信,编出明天的精彩。你把抽象符号变成快乐笑容,你把简单代码变出复杂意义,你演绎枯燥变情趣的游戏,你把辛苦留下捧出生活的神奇。程序员节,愿你成就精彩,乐享人生!

. ?2 M( m6 J( K+ M

" q, P% P3 a# q' A- y" i0 ?- u$ S' @

4 P  y. m  K$ j$ f- K7 p
12.png
1 _' R( h. K5 v# `* [
: d, J! ?, T5 H* v
程序员们!这么重要的节日怎么少得了整活,活动来了!

3 Q4 H) @0 }) _6 S

$ z) V* h- G6 B$ f! ~% t: v4 [1 u1 S' `1 J( e  h  J+ @
活动内容:
就是写日常开发过程中你遇到的BUG!在下方评论!
(不会写BUG的程序员不是好厨子

; F( m1 [, I# i+ r
2 ~6 F/ j: N! X) O' @
2 e( d# d+ U! D9 _7 M
# k2 L7 e) `8 X
/ L: ~' D1 f; |+ M, F# e
活动时间:
10月24日-10月26日
5 d# o( c. X& H
: m& G" B5 s0 R; ~8 e. u7 {, _) m

! X$ E/ W; [& Z& C( z
' V/ j3 h# p2 t; `6 K, f7 L活动奖励:
抽取5位送出:小米背包、STM32开发板、笔记本支架、保温杯等!
2 Z) Z, B+ ?1 |) X! i, A: m
下午三点大转盘搞起来
转盘入口

1 M  y* F) A) [" z, {
; {1 W4 J7 W& O1 Z$ N" v7 P
转前须知:必须按照需求恢复本帖才可以抽奖,否则中奖无效。
) @+ b9 M$ T% ^
- R; B9 i/ ?( L
13.png

9 T6 n" u9 K0 N% c- P* ?# b4 s
8 j; [! P7 [, g+ n3 H3 J, h! I
& P8 A  O2 B4 ~

4 v# D9 X$ }8 y, ]2 u
收藏 评论80 发布时间:2022-10-24 11:11

举报

80个回答
wenyangzeng 回答时间:2022-10-24 15:33:12
STM32F051 EEPROM emulation一个BUG的修正$ Q$ u& R% r% `) i7 P
    开发时需要在STM32F051断电前保存少量变量数据,在ST官网下载了“STSW_STM32117_STM32F0xx微控制器中的EEPROM仿真”固件包。这个固件包演示了在仿真EEPROM的页里对VarData[0]、VarData[1]、VarData[2]写入数据,然后读出。调试过程中读写正常,但只要断电,再上电后读出的数据就不是断电前写入的数据了。
% T1 A' K) Y! n& ~1 ]* K- h分析:
. u  Q5 W+ ~1 f' ^  STM32F051C6T6的Flash长度为32KB,每页长为0x400,地址从0x08002000到0x080027FF。
- I. i2 }; t; Q+ J3 \  x查阅STM32F0xx的eeprom.h,其中有:
& P6 D3 S- ]" K#define PAGE_SIZE             ((uint32_t)0x0400)  $ @% E+ R; ^6 I3 n& v# {/ }* d) V  E
#define EEPROM_START_ADDRESS ((uint32_t)0x08002000)4 X2 T1 D4 E, K& g; d
这里定义:#defineEEPROM_START_ADDRESS ((uint32_t)0x08002000)
' @/ [0 w" q2 c6 ?1 P) X% f7 W8 N5 Q9 ^$ C# `) ]

' ]6 ~/ u& j% N. R再查阅STM32F0xx的 eeprom.c:. `  S+ ^1 F2 P& J& I* k
uint16_t EE_ReadVariable(uint16_t VirtAddress, uint16_t* Data); H5 c) i+ z: Q( @" e' y, Y
{  uint16_t ValidPage = PAGE0;
; h4 K2 }% b2 w+ e  uint16_t AddressValue = 0x7777, ReadStatus = 1;
, e9 {( ]) L) T3 ^" l+ H  uint32_t Address = 0x08001000, PageStartAddress = 0x08001000;* w7 K( f4 T1 G( z, d
}
% q/ t& p7 x& D' S) Z$ U9 r8 |5 }" r6 r4 d( [2 @8 y6 L! g
$ a* F' |! D/ U0 M* O. _
    这里地址的分配是这样安排的:
2 Y+ o7 Z& u+ fuint32_t Address= 0x08001000, PageStartAddress = 0x08001000;
4 K0 n8 Y$ W5 a1 \6 p" p这个EEPROM emulation in STM32F0xx是从EEPROM emulation in STM32F10xx移植过来的。于是查阅F1系列相关的文件,
: ^( \) W9 w" T. G5 l2 B7 B; C( m/ v; p6 q3 Y
* P: L9 y! K9 v& W( w, i* k8 O6 e) w
STM32F10xx 的eeprom.h是这样的:2 g& I, v$ D% K; @
#define EEPROM_START_ADDRESS    ((uint32_t)0x08010000) . r; w8 ^, D9 B# _
STM32F10xx的 eeprom.c是这样的:3 P$ Q  Q3 k. v: m0 q9 |5 E
uint16_t EE_ReadVariable(uint16_t VirtAddress, uint16_t* Data)
. r5 y9 Z, y+ G0 e{  uint16_t ValidPage = PAGE0;$ d7 D; U  R8 R* N
  uint16_t AddressValue = 0x5555, ReadStatus = 1;" t. Z' ~6 [( r, ^/ u& g; b
  uint32_t Address =0x08010000, PageStartAddress =0x08010000;
" n3 J5 g" B( R  L% {/ B+ f}4 M2 s$ m* s8 q' o- i4 I  l3 K
      ST工程师在移植F1仿真EEPROM到F0仿真EEPROM时,忘记把F0的eeprom.h和eeprom.c文件里关于仿真Flash页的地址修改一致:3 @' A8 \4 Q8 M; ?% e  E
在F051写入的首地址是0x08002000,而读出的首地址则在0x08001000。从而导致读数据的地址不是写入数据的地址——读出错。' z. k, ?: o; N3 x- g0 {* {( N' p: @
修改eeprom.c代码:* Q( S3 M4 {! d  K4 ^
uint32_t Address= 0x08002000, PageStartAddress = 0x08002000;# _8 q- ~* a% N5 R+ O
故障排除。
* @: F: E7 p4 j; g, I, M
: f& N' x, y1 V, K- k: f8 S
silver 回答时间:2022-10-24 15:37:18
把我很久之前的BUG记录发上来。。。。, N  b+ t* ~" d- {6 z
问题:IIC调试无法得到数据(写后立即读出是0x00),当前SDA输入配置位浮空输入
8 v" `1 c3 [; a) `4 G. d$ Y解决:SDA输出配置为推挽,SDA输入配置为内部上拉输入% Z# e" [( C9 h: l3 T
* y$ L& y! N) @4 j
问题:指针当参数取值必定改变传参的值?
. n; W) k* n2 v/ k5 T6 K解决:是,查看下数组的位有没有搞错- b$ k+ H5 s; [  |
- T0 s: Y* E  L  W% o
问题:引脚控制有问题
; f+ O7 g# c- Z解决:查看配置和宏定义是否有问题
, \% O1 N% @* b' l# P  I4 h+ D5 _* j: T) W- |  v2 w0 A
问题:F103ADC+DMA采集数组数据始终为0,ADC-DR有数据! [2 L5 Y0 u5 Z  _
解决:ADC_DMACmd(ADC1, ENABLE);不应放在DMA的初始化函数里/ M( Y( ^" q+ g9 \7 M4 b
解决2:F030的CUBEMX11.0包有问题
4 L' [, h5 M  y  V1 F# C8 X; p
) z, J0 Y$ G  p' e' ~. g问题:F103SDIO+DMA+FATS无法通信、卡在死循环里" v9 R  L, Q! ~
解决:F103SDIO+DMA需要GPIO全部上拉和DMAtx、rx都要单独初始化、加4B初始化0 ]: a0 O% c" t0 u' d
, B4 F' c" G& M* t0 y  `
问题:FATFS读操作返回FA_NO_READY ' Y8 ^  J8 X8 [; w9 G, x* _; `! r
解决:查看SDIO这个配置SDIO_CLOCK_BYPASS_DISABLE,使能就会出现上述问题3 E' N: ]; W9 S! g! b

9 k. O. n) ?8 G0 t问题:FATFS出现CMD_TIMEOUT现象
  ?6 o/ r2 N1 X0 h! x, t, K9 S# l解决:BSP_SD_GetCardState这个函数需要1MS延时) Z& G- `# r1 ?% T8 i% {( g

- v4 }5 s: f" _7 `3 G6 m' @6 D6 z问题: RTT系统出现HADRWARE_FALUT
& y# ^2 W4 k  m* o1 \解决:定时任务不允许使用延时
8 _* Q% C) F/ p7 _( @" \
+ |) J( [& g9 S现象: 数据高低位翻转: L. N. f1 W/ B4 L$ h
解决:左移改右移 memcpy固定小端拷贝 第一位拷到低8位
2 b# p% ?1 P  i; M( V& G
0 b7 V9 I& h& C: h  W7 G7 m; I问题:HAL硬件IIC返回BUSY(STM32F1)
* k+ j0 n) D+ l& E解决:需要改动RCC的I2C1的使能位置(在配置引脚之前使能)!8 V9 s7 B0 e6 y% k

, K* Z8 o+ G; e问题:IIC无法读取数据
/ V2 Z1 T8 V2 p; \解决:IIC设备地址是需要'<<1'才能使用5 k9 m- v) j8 |( i& x& U

( ^0 D8 g- {$ n5 `3 ]: k5 y- y问题:DEBUG中突然失败+ I8 ^" x1 m, o0 y& P) V
解决:断点错乱会导致调试中途失败
! z  }# h* f' M
) q- t, x! T8 N) S& w问题:空闲中断有触发,但DMA缓冲区没有任何数据& ^% @9 O6 T% L" V0 k0 U2 C
解决: 检查DMA外设时钟
$ z4 g/ v/ l7 ^" a# D2 X; {: E/ D- T0 i, q3 N5 I6 K
问题:CJSON print_out返回空
7 y# u# B7 N3 v1 ?. b; q解决: 增加堆空间1 k" R* @  c' D; Z; }1 r6 v
% {8 R% Y* v' ~/ Y9 D  z$ g
问题:ADC速率会影响输出电流 越快电流越大" K+ F  _' f& [' R2 G2 ?
解决: 根据需求增减
% ~) u" w( n/ q" `( s+ w
( C7 ~7 |6 T5 a9 _6 X问题:内联函数编译时出现未定义报错
7 z1 B5 n, p. O0 E解决:        一个文件只能调一次  重复调会报错
* P; B3 H4 _: Z" `3 `' s7 H" S" S3 X5 D0 o* Q# `& t% Q' M6 Y
orima 回答时间:2022-10-27 20:10:13
问题:HAL硬件IIC返回BUSY(STM32F1)0 x: G% P+ ^) u% `' S
解决:需要改动RCC的I2C1的使能位置(在配置引脚之前使能)!
1 [$ L( b, M6 C
# z- f  v) O, i3 \问题:IIC无法读取数据
: \4 E9 f% f# R0 D% l! B解决:IIC设备地址是需要'<<1'才能使用
( ?: M+ M8 }# n4 V& q, V" D4 P' W" l7 Z: g, P2 Y8 P5 C
问题:DEBUG中突然失败
* {5 N% D, @' l" {解决:断点错乱会导致调试中途失败
$ A$ \/ `9 ~, S1 p1 F5 O
0 f* E0 Y: U  W3 A# E  o问题:空闲中断有触发,但DMA缓冲区没有任何数据
+ a0 j1 M# ^! ?" a解决: 检查DMA外设时钟$ E" f* |! x; W
! s2 i' ^0 w7 ?) r; @# q: G7 b* |3 P
问题:CJSON print_out返回空/ @0 g5 T. W4 j/ W' g* f
解决: 增加堆空间
1 `. h, L* g5 @( B, H2 r7 f; e$ e! u3 b
问题:ADC速率会影响输出电流 越快电流越大! D) @' J1 v/ z6 |! [
解决: 根据需求增减
: m8 ^$ _' C4 D! M6 w2 G8 s) n/ X4 W
CC4 回答时间:2022-10-24 11:17:46
for 语句的 break条件判定失败,导致系统卡死。。。。
一个脑子不够用 回答时间:2022-10-24 11:24:04
使用FreeRTOS任务切换的时候,数组太大了,越界导致程序卡死硬件异常,一直卡在HardFault_Handler的while里面,查了一天错误9 ?8 p6 A- A0 l( P) a6 @3 J
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对应的屏幕编码才能正确..
7 I1 p8 y$ Z  m* d6 m6 d
STMWoodData 回答时间:2022-10-24 15:34:13
写了一个Bug,然后就Bug了4 |$ D) |, }5 C" H8 |3 C# }
wudianjun2001 回答时间:2022-10-24 15:35:44
123132133 ?, U" q) q) c5 j7 H+ j
杨小杨 回答时间:2022-10-24 15:36:10
学习
9 j5 O! ~  f9 q' w
daming32 回答时间:2022-10-24 15:36:25
签到签到
- ?. t  t. I" [# x7 B% n
廖向涵 回答时间:2022-10-24 15:36:27
启动启动2 X" R: a0 m  e, }
meiyao 回答时间:2022-10-24 15:37:17
666转起来2 ~7 ~/ N$ ~$ X
EricCheng 回答时间:2022-10-24 15:37:33
签到签到
7 v. S0 R1 {0 P  q
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版