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

STM32编程时常见问题及常用技巧

[复制链接]
STMCU小助手 发布时间:2022-11-29 16:00
常见问题STM32主函数执行三次

在编写STM32程序时发现,主函数中没有循环,但是程序自动运行了3次,查找资料,最后得以解决。


2 G2 b! j$ |5 }/ N

原因

嵌入式软件不同于PC机下编程,PC下写C语言从main函数返回的话,是会返回操作系统的,所以不会出错。而对于裸机不应该退出MAIN函数,不然会出现错误,这种错误叫with no expectation of returning。

1 `. O8 U9 k; q. ^! N

解决方法

如果不需要循环,也要在最后加上

  1. while(1)
    : y9 z" n, H( T; ?- [0 n9 @
  2. {;}
复制代码

! I- `  B2 v5 Z( P* S烧录进STM32,STM32就自动运行: I$ T+ Y1 ^6 w1 p7 |) k8 D
原因

在设置中,选择了自动运行。


1 U8 }3 F6 A% ?( E

解决方法

点击魔法棒 - >点击Debug - >点击右上角的Settings->选择Flash Download->取消Reset and …

, W. ~+ [. {* n% L, g

640 (2).png


# m" ~% d! n: C

640 (1).png

+ d. k; o' N; U1 m

程序不运行, a5 m) p# E5 B4 l
原因

可能是不小心更改了Flash 起始地址


! w' _9 @5 h7 }; d: L

解决方法

点击魔法棒 - >Target->更改IROM1后面地址为0x08000000


& v3 e% r+ H2 G* s5 M( I

640.png

1 p+ m' Q; I5 }! f, s
无法使用strncmp与strcmp
. N; l/ |' O) M1 W' d原因

没有引用对应头文件


. x1 v# e5 |( q6 V: u# {& z

解决方法

添加
7 F! O3 [" |. G7 g#include <string.h>


  M3 M1 i/ z$ J* \2 S. ~

常用技巧9 L% x* ]) y2 b4 s
对比两个字符数组的 前n位是否一样

我们在开发中肯定使用过strcmp(s1,s2),用来对比字符串s1和s2是否一致。但有时候,我们并不需要对比整个数组,而只需要对比前n位是否一致,这时候我们可以使用:strncmp(s1,s2,n)函数。
- i5 J! B" o2 C% S+ wstrcmp(s1,s2)是两个字符串从左到右逐个字符比较大小,当出现第一个不相同的字符时就比较出大小了,按ASCII比较,如果两个字符串相等,则结果为0;如果前一个字符串大于第二个,则结果为正整数;如果前一个字符串小于第二个,则结果为负整数;

strncmp(s1,s2,n)函数是两个函数比较前n个字符的大小,在前n个字符中比较规则与strcmp函数相同,如果两个字符串相等,结果为0;如果前一个字符串大于第二个,结果为正整数;如果前一个小于第二个,结果为负整数;

strncmp函数是指定比较size个字符,strcmp函数比较整个字符,直到出现不同的字符或遇"\0"为止,最后一个’\0‘也要比较。

" H" ~  ~; r9 S! H/ w$ x

16进制、8进制和整形的相互转换

我们在开发中,经常会使用到uint32_t( u32)、 uint16_t( u16)、uint8_t( u8)的相互转换。( L( [# \7 Z" k, u9 Z
在开发中往往采用如下方式。0 n+ i, s2 h4 A5 G4 r, x  f' r2 U
a=(要转换成的类型)b;: i, |3 L& |* |
如下程序为将u16类型的a转换成int赋值给b

  1. u16 a=0x10;* f' S1 j. N- d0 v
  2. int b;# v. m$ w5 L: V- T
  3. b=(int)a;0 m5 f7 U  v) n- N1 ~  j$ _( d' Q1 l
  4. printf(" b=%d\r\n",b);
复制代码

+ B9 Q* v$ h8 G) o0 m( a$ T2 ?软件复位

有时,我们在编写程序时,遇到一些特殊情况需要复位,但是并不是任何时候我们都可以手动复位,这时候我们可以在程序里设定个软件复位。

  1. <i>/*******************复位************************/</i>
    + m" Z! R* `% m7 D! l8 K
  2.                 __set_FAULTMASK(1);
    ! v7 |( p; D) Y* g- Z3 f( }" s4 n' a
  3.         NVIC_SystemReset();
      i2 ]8 z% ?' D! i4 f
  4. <i>/**********************************************/</i>
复制代码
9 R/ d2 b% x' e5 a
uint32_t( u32)、 uint16_t( u16)、uint8_t( u8)分别占几个字节

uint32_t(u32) :四个字节
9 W" g% f7 x3 j4 ^" duint16_t(u16) :两个字节- Q0 Q" L( G2 R  `( s& z( O1 L) }  I
uint8_t ( u8 ) :一个字节

  [. k0 j+ J1 T

转载自: 跋扈洋


. `# S8 i) C- E. N: p( e' E# V8 {0 \! d' }
赞 收藏 评论0 发布时间:2022-11-29 16:00

举报

0个回答

所属标签

相似技术帖

官网相关资源

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