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

【春节福利】每日一 “芯” 意,ST 论坛邀你 “马上” 翻好礼!  

[复制链接]
STMCU-管管 发布时间:2026-2-10 08:56
阅读主题, 点击返回1楼
赞 收藏 1 评论355 发布时间:2026-2-10 08:56
355个回答
A峰A 回答时间:2026-2-14 22:17:43

Day 5 (2.14) 翻出【撒狗粮牌】:这块表是12年左右第一次去香港时给老婆买的,当时花了3000+

微信图片_20260214221537_385_357.jpg

meiyao 回答时间:2026-2-14 22:44:21

Day 5 (2.14) 翻出【撒狗粮牌】:技术人的浪漫。 o        示例:秀一下给对象写的单片机爱心流水灯,或者收到的最硬核的礼物。

image.png

615830c463c229a05fdaf64a1d846476.jpg

zwjiang 回答时间:2026-2-14 22:57:26

【撒狗粮牌】:单片机爱心流水灯程序

include <reg52.h>

include <intrins.h> // 包含循环左移函数crol

define uint unsigned int

define uchar unsigned char

void delay(uint ms) { // 延时函数,晶振12MHz时约1ms uint i, j; for(i=0; i<ms; i++) for(j=0; j<120; j++); }

void main() { uchar i; while(1) { // 先让P1口LED依次点亮 P1 = 0x01; // 第一个LED亮 for(i=0; i<8; i++) { delay(200); P1 = crol(P1, 1); // 左移一位,点亮下一个 } // 再让P2口LED依次点亮 P2 = 0x01; for(i=0; i<8; i++) { delay(200); P2 = crol(P2, 1); } // 也可同时控制P1和P2实现更复杂效果 } }

flyingstar 回答时间:2026-2-14 23:12:04
2.14情人节。再多礼物也不如这个转账实在。
5 {% ?( G+ h: |9 Q
5 N/ F+ i- L$ Q9 M: ]- |: s7 W) X4 b
+ B1 [0 @% P" @4 o 微信图片_20260214232659_128_725.jpg # y% D) O3 G) S, y
! h- ~! X8 N! _% Q& t
无极考拉 回答时间:2026-2-14 23:13:49

Day 5 (2.14) 翻出【撒狗粮牌】:技术人的浪漫。

我老婆送我一个电烙铁

CM_STM32 回答时间:2026-2-15 00:28:45

【干货牌】STMCubeIDE中需要按Ctrl + Space才能自动补全代码,可以加快效率

A0dy 回答时间:2026-2-15 00:30:39

【干货牌】: 在使用STMCubeIDE开发时候,一般都会打开多个.c / .h标签页,每次都用鼠标去点的话就会很浪费时间,而且也低效;

因此我会使用 Alt + ←/→:前一个 / 后一个页面; 这个快捷键方式!!!

这个快捷键可以在不同的页面之间快速切换,在查看多个文件代码时非常有用!

北方 回答时间:2026-2-15 05:23:35

【干货牌】

分享一下小技巧。新款的st系列芯片都可以不用stlink下载程序。

这里用到bootloader功能,先查pin定义找到boot0引脚,接地同时加电,就可以在usb口显示为usb bootloader接口。这样可以用cube programmer这样的工具直接下载bin可执行文件。

省一个stlink 不香吗

wenyangzeng 回答时间:2026-2-15 08:04:06
Day 6 (2.15)【干货牌】
* n. _: u% {3 ?# H" b# b
' A$ }9 {2 @3 Z《EEPROM emulation in STM32F0xx microcontrolles》一个BUG的修正
0 h0 X6 {  u, M# c7 M5 f/ J% zSTM32中文官网有一篇《EEPROM emulation in STM32F0xx microcontrolles》应用笔记。它为每一个要保存的数据预先设置一个16位虚拟地址,紧跟一个16位变量数据。当写入一个新数据时,只需重新写一次该数据的虚拟地址,接着写入新的数据即可。旧的数据作废,直到本页写满。读数据时搜索最后一次写入的地址,就能读出最新的数据。无需整页Flash都删除再写入,大大提高了Flash的读写寿命。! N' h4 p" H- w7 s! y: `
有一个“STSW_STM32117_STM32F0xx微控制器中的EEPROM仿真”固件包可供评估。6 V6 j, {0 T/ \$ |6 p5 o
这个固件包演示了在仿真EEPROM的页里对VarData[0]、VarData[1]、VarData[2]写入数据,然后读出。
4 M' ~- h7 S: c" Z! J4 d+ j' L% `9 c# Q9 U4 J( M& {
在NUCLEO开发板上运行演示代码进行评估验证,仿真EEPROM的数据写入读出都正确,放心移植到目标板了。! ]' G4 X( @7 X6 E+ o
0 K  q( m$ y. s
不料,目标板调试过程中发现,只要断电,再上电后读出的数据就不是断电前写入的数据了。排除硬件故障的可能性后,接下来是判断是写出错还是读出错。这片STM32F051C6T6的Flash长度为32KB,我照抄演示文件中的代码,将第8和第9扇区设置用来仿真EEPROM,它的每页长为0x400,地址从0x08002000到0x080027FF。使用STM32 ST-LINK Utility工具读该扇区,Flash已经正确写入。判断故障在读操作。
! z0 S& i) i& K$ v( v/ P先查阅STM32F0xx的eeprom.h,其中有:
% S1 p0 k4 [+ @9 q- p
+ R( D5 F8 a  v
  1. #define PAGE_SIZE             ((uint32_t)0x0400): [% K, r' n8 I5 _/ N! [, c: {
  2. #define EEPROM_START_ADDRESS ((uint32_t)0x08002000)
复制代码
$ [+ D: \! \  k$ {9 {

  U/ R6 a6 F5 m2 K7 F' d" q+ a$ g4 b  r1 I3 y

/ j  n1 y) }' H6 {* |! ]/ n3 |这里定义:
1 Z  G$ [  `2 n1 c
  1. #defineEEPROM_START_ADDRESS ((uint32_t)0x08002000)
复制代码
再查阅STM32F0xx的 eeprom.c:  a; H) v- f" N2 Q- A
  1. uint16_t EE_ReadVariable(uint16_t VirtAddress, uint16_t* Data)
    + k0 \" S. Z- z
  2. {  uint16_t ValidPage = PAGE0;! @) M8 Q+ z5 F0 A) G
  3. uint16_t AddressValue = 0x7777, ReadStatus = 1;
    ( o5 Z% M: t: @! s6 A5 G3 I5 E1 t
  4. uint32_t Address = 0x08001000, PageStartAddress = 0x08001000;
    1 E2 H" `; ]- I& }- l( ^
  5. }
复制代码
$ g1 f- r; ]7 g: v1 d; M9 g) w' a
) p5 o) T! w/ m) B
& {8 {# M  ^# Z, R2 m* N
: W7 l: R1 o5 e8 \. d5 n
这里地址的分配是这样安排的:
3 \+ \( T) a* ~1 S8 r! W: j% tuint32_t Address= 0x08001000, PageStartAddress = 0x08001000;
& t- ?# G3 j; L3 A1 e& V这个EEPROM emulation in STM32F0xx是从EEPROM emulation in STM32F10xx移植过来的。于是查阅F1系列相关的文件,
' U; `; K  F% O/ R% oSTM32F10xx 的eeprom.h是这样的:
* n3 D" b% {7 w
  1. #define EEPROM_START_ADDRESS    ((uint32_t)0x08010000)
复制代码
* ~, }+ x. r( U: t4 |( |5 t

1 T' [' o9 @/ `, f
7 a# |8 O2 J8 a& c- C0 J9 W
& I& S. d; S+ b5 `! P* e- U; K( k4 b$ K6 b3 e  n/ G
STM32F10xx的 eeprom.c是这样的:
  u7 [" L9 F+ T0 L
  1. uint16_t EE_ReadVariable(uint16_t VirtAddress, uint16_t* Data)7 L9 S. j0 I3 y+ N
  2. {  uint16_t ValidPage = PAGE0;
    " f4 r+ {! F( a
  3. uint16_t AddressValue = 0x5555, ReadStatus = 1;# V) _4 T( r& x( N
  4. uint32_t Address =0x08010000, PageStartAddress =0x08010000;
    6 ~# P" K" P3 s3 \0 r. s
  5. }
复制代码

+ \/ x0 f4 K9 J/ B) f+ J5 p* A' k  v0 j* X
ST工程师在移植F1仿真EEPROM到F0仿真EEPROM时,忘记把F0的eeprom.h和eeprom.c文件里关于仿真Flash页的地址修改一致:
7 X; ~. ]7 `' I. n在F051写入的首地址是0x08002000,而读出的首地址则在0x08001000。从而导致读数据的地址不是写入数据的地址——读出错。" {) l9 w; z* k- E; M
修改eeprom.c代码:
) P; ^( u5 u% C; a; U, ~
  1. uint32_t Address= 0x08002000, PageStartAddress = 0x08002000;
复制代码
5 l6 Y6 q/ h: c" A) e0 V

3 r9 `2 |' Z0 y8 ^8 J5 g
8 X8 U5 I2 e; t2 B8 l) @+ ]- _
故障排除。. }$ B; P! s0 J4 v/ `
那为何在用nucleo进行评估验证时却读写正常呢?下载有BUG的原代码进行跟踪调试可知:由于读地址与写地址不符,进入读函数后当判断地址不符,就执行return了。根本就没有读数据。而恰好在演示代码中写完Flash后数组变量没有清空,在读出错return后,数组变量里保留着写操作留下的残余,让你误以为读写正常。
! z# K' p! _/ e) _2 l: |
背影101 回答时间:2026-2-15 08:09:52
翻出【干货牌】:分享一个 ST 实用小技巧。
+ T1 ^1 O* g+ G* x# x, M( E来分享分享,STMCubeIDE 的快捷键,在你鼠标突然失灵或者没电时候,还是很有用的哦) Z- v& h) r6 F) s
Ctrl + S        保存
6 `- B4 \" L/ Q) Y+ _4 VCtrl + C        复制
# m& y# k" x& u* J7 \7 kCtrl + V        粘贴- |2 q2 l2 a0 s' W9 K) E  M
Ctrl + X        剪切
3 s2 D3 b" R+ M" V- c: T; y2 MCtrl + 7        快速注释行
) V3 T: P# K0 h! i0 {* R8 `8 [Alt + /        补全代码
' M. r, w) J$ j$ m. Z1 |Shift + Tab        代码对齐8 g/ }5 H( j% i$ g) Y& V4 M" L* k
Ctrl + D        删除整行
( a; V2 d0 _( F7 eCtrl + “-”        缩小字体
5 n' W9 H! q& c. g6 cCtrl + Shift + “+”        放大字体
5 y& J; |2 g) D6 }! ?Ctrl + 鼠标左键        跳转到定义处* k3 L7 Z& c# z( \  x& `
Ctrl + L        跳转至某行
8 p$ Q# H8 q! B5 c8 F( ~' rShift + Enter        在下一行新增空行
4 {3 o1 J5 u9 |1 L: g, ?& ]4 eCtrl + Tab        源文件/头文件切换8 `2 m( u8 d% C  G, G
Ctrl + E        快速选择已打开文件3 Z8 S9 b7 k( r2 @, z  K
Ctrl + Q        跳回最新编辑点) M  [9 W4 L+ A  O" b
Ctrl + 鼠标滚轮        快速滑动7 @2 k" n) s9 {0 y' i
Ctrl + F        文件内内搜索& Z" Z* A' _; s. R" b! h: T
Ctrl +↑/↓        快速滑动. v; C+ B! T3 }' G1 z, C' L7 H
Ctrl + H        项目内搜索/ Y9 i! V2 Z! ?/ |% \
Ctrl + M        最大化/默认当前窗口# k* H7 ?  F! d% \0 T
Ctrl + O        显示大纲(方便跳转)! }1 n6 m/ {7 J% s" p; W: Z( m
Ctrl + W        关闭当前窗口( U( A: M- \8 e& H; ?
Ctrl + B        编译工程. c# ^+ R6 ~& w% S" `' p( R! h$ M
Ctrl + F2        终止运行  Q7 g8 G2 i& t0 h% x- s
Ctrl + Z        向后撤回3 m7 [; l+ n/ h2 c
Ctrl + Y        向前撤回
8 }$ ~, M# i1 R+ z2 j" o9 iF2        展开详细信息5 [& z* _2 Y$ v9 H/ m+ _
F3        跳转到声明处
# B3 r2 L; Y- V4 RF5        跳进函数(调试时)
" T  j, E$ m5 ]( d6 Q0 O0 D$ q, E  JF6        单步运行(调试时)! U- K/ Q. L" d3 e$ m/ W
F7        跳出函数(调试时)9 `1 n  V* [" s4 F7 a
F8        全速运行(调试时)( {7 x/ ^/ |& O9 V0 W" d
F11  启动调试
行色匆匆 回答时间:2026-2-15 08:53:58

Day 6 (2.15) 翻出【干货牌】:

善用STM32CubeMX生成初始化代码,再结合HAL库进行功能开发,既能大幅提升效率,又能避免手动配置时钟树和引脚时的低级错误‌。

A峰A 回答时间:2026-2-15 11:02:32

Day 6 (2.15) 翻出【干货牌】:

image.png

linghz 回答时间:2026-2-15 11:10:08

Day 6 (2.15) 翻出【干货牌】:

STMCubeIDE里有个超好用的快捷键 Ctrl+Alt+H,能直接跳转到光标所在函数的定义处。 比如你看到别人调用了HALUARTTransmit(),但不确定参数怎么填,按一下就能秒查源码。

lxl666 回答时间:2026-2-15 11:10:11

Day 6 (2.15) 翻出【干货牌】:

HAL库有几个隐藏的“宝藏”功能,比如它的回调机制,可以让你用事件驱动的方式编程,比传统轮询高效多了。还有低功耗优化,比如HALPWREnterSTOPMode(),配合CubeMX能轻松实现微安级待机。另外,外设复用功能也很强,比如一个GPIO可以同时用作UART和定时器,通过CubeMX配置就行,代码自动生成。

lospring 回答时间:2026-2-15 11:24:51

场景:读代码时看到一个函数 HAL_GPIO_WritePin,想看看它到底是怎么实现的,或者想知道 LED_PIN 这个宏定义的值是多少。

操作: 按住 Ctrl 键,然后用鼠标单击那个函数名或变量名。

结果: IDE 会自动跳转到该函数或变量的定义位置(比如 .c 或 .h 文件里)

所属标签

ST中文论坛活动

即日起开启活动话题入口,之后的活动统一都放在此处,欢迎大家的加入!


最新内容

相似技术帖

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版