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

STM32心得:相关C语言学习及寄存器地址名称映射解读

[复制链接]
STMCU小助手 发布时间:2022-11-20 16:28
主要内容:
" o! T0 W' @9 J  W8 N$ g+ j1)常用C语言讲解;
9 a6 S4 m0 I  `; X! {2)寄存器地址名称映射解读。# ~8 [" K6 L# y1 M( }- m
) \7 X6 [8 g3 z0 g3 ]
1.常用C语言
1 }4 T/ B" A: _$ S/ \1.1 位操作:6种位操作运算符. ~$ b/ f) p: c; ^
1) 按位与:&
6 C" Q! X4 {2 C* F" X  G例:1011&0010=0010
& ~7 Y( x8 ]/ h5 X2) 按位或:|8 ~) P! i1 Q% D4 d
例:1011|0010=1011
; P$ |1 I" |" T" D6 l& G8 z3) 按位异或:^
# @5 W$ }: E9 ], R/ ?例:1011^0010=1001
1 C! T* {% n: U' U: ~3 @+ `  w4) 取反:~
) d9 K7 |" e5 z例:~1011=0100
- p1 V! h. L8 ^9 A+ R4 Y5) 左移:<<
, h- j0 T) K8 y" \# v# r例:0110<<1=1100/ Y/ R: l* y+ I* n
6) 右移:>>4 }. B1 R1 Z) H6 m0 M" a& S
例:0110>>1=0011
  u4 ]/ g5 ]( {2 |7) 组合:按位与后赋值:&=
5 c' b8 x& y& ?$ j# r# Y% g7 h: I; N( Q2 k* G% p! j( T
  1. GPIOA->CRL&=0XFFFFFF0F;      //将第4-7位清0
    5 L7 [2 V/ |! C' z; T, o8 y
  2. GPIOA->CRL|=0X00000040;  //设置相应位的值,不改变其他位的值
复制代码

: T, b' {* ^$ I- \0 }  Y1.2 define宏定义关键词9 d1 s8 p$ ]+ f* y# W5 n
define是C语言中的预处理命令,用于宏定义,可提高源代码的可读性,为编程提供方便。
2 j( O% V+ \& e) _  |常见格式:
5 f# g% w) h! [. c2 c#define 标识符 字符串
% Q6 H( K+ x! ?9 K标识符为所定义的宏名。字符串可以是常数、表达式、格式串等。2 |) e1 ]$ I+ z7 i6 y, g6 k
例:
9 \! R- r- `6 z9 e: v
  1. #define SYSCLK_FREQ_72MHz 72000000
复制代码
3 X2 c/ b2 s' C+ f
定义标识符SYSCLK_FREQ_72MHz的值为72000000。
/ b9 A9 K) u, d) `: z1.3 ifdef条件编译
5 O  Q3 e5 d* C/ y, V, F单片机程序开发过程中,经常会遇到一种情况,当满足某条件时对一组语句进行编译,而当条件不满足时则编译另一组语句。条件编译命令最常见的形式为:
4 z6 G. B- G5 R( }) O#ifdef 标识符
4 d# W6 K8 j: I7 a+ Y程序段1
5 s1 ~( M7 Q8 S1 c#else
4 p( Z, A, R# K  E" A" I' k程序段2& ^; a7 t" k: `8 d- r4 A
#endif
5 A: N' U0 S8 F. o例:
2 A: y- [4 ?. j3 }
  1. #ifdef STM32F10X_HD. E6 R  e& G1 s5 i" q
  2. //大容量芯片需要的一些变量定义  n  b4 `! D8 w. r. N' j
  3. #end
复制代码

, o; z8 H2 g* a( A1.4 extern变量申明
1 ~; g  p* t) R5 X5 @- QC语言中extern可以置于变量或函数前,以表示变量或函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找定义。对于extern申明变量可以多次,但定义只有一次。) G6 Z2 `2 l2 j4 x1 r9 h7 C. C0 n( @
4 D/ q) \! [/ \' W. Q, u% I
1.5 typedef类型别名
! b; A3 q: r9 K0 K' ~  A定义一种类型的别名,而不是简单的宏替换。可以用作同时声明指针型的多个对象。- c. K" |) k: B, }* H, @2 l
typedef unsigned char uint8_t;7 b! D$ G1 t' K! |( D2 Q' |
typedef unsigned short int uint16_t;
% R# n% D. ]( e) @6 mtypedef unsigned int uint32_t;7 N( P$ a0 x( ~" |0 F2 a
typedef unsigned __int64 uint64_t;: B8 G2 f+ V6 A# v; R3 `3 c4 \! ~
6 _, S! I) F2 N2 Z! o' H
1.6 结构体:构造类型
! W# S$ D7 [9 k6 s5 \Struct结构体名{) O3 f+ k6 g9 I% h6 }9 m& S7 T
成员列表1;! w! m1 C9 l) q2 Y, K5 B
成员变量2;, `" m6 S! |: A: ]4 w
。。。* U% @# B- D- i' ], u, Z4 K" y: d
}变量名列表;
/ j& N. T' K0 q5 u, U6 V0 m3 h在结构体申明的时候可以定义变量,也可以申明之后定义,方法是:2 f% l  W, B/ S/ u
Struct 结构体名字 结构体变量列表;/ g5 r+ Y$ m- v2 ?4 m4 f
作用:同一类型可以用数组,不同类型可以用结构体组织。; q9 \2 {/ D5 \: M! Z* a, @
结构体可扩展性强。
8 ~* c' z/ |5 d2 O2 s例:) i$ [3 s. K2 o+ o$ G

* d: r# r  L( k9 H, _
  1. void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct)
复制代码

7 B( b( f2 S) z' s; q, s1.7 static
* B3 _& r- w. O2 ^1 qstatic申明的局部变量,存储在静态存储区。4 m( m5 Z5 ~) s& ^
它在函数调用结束后,不会被释放,值会一直保留下来。
0 ]! l* M; B; u) |/ u$ S所以说static申明的局部变量,具有记忆功能。9 C  H7 b. y) V4 F& _. y; B$ T: }
2. MDK中寄存器地址名称映射分析
/ P: w* g' {: U+ o2 B! b. Q$ X, Z概念:对MCU,一切底层配置,最终都是配置寄存器。
4 {: `" D& e' w" Q3 S& t( ASTM32中操作:
( U; ^* R. a, c) RGPIOA->ODR=0x00000000;
- e8 ^1 ?- V; L: ?& H问题:值0x00000000是怎么赋值给GPIOA的ODR寄存器地址的?即GPIOA->ODR这种写法,是怎么与GPIOA的ODR寄存器地址映射起来的?理解了下面这张图就能明白。$ z0 U  X0 }1 Z" f# {" T

6 S8 K, L$ J* u5 R 20200328090752708.png
) q2 R* c- b1 L5 F( `9 B) ]/ b! m6 ~2 E# J+ \5 W2 T
————————————————
) R) {1 s9 t6 ]; R版权声明:天亮继续睡/ v- A# |1 V- ?4 K. y" x! ^

) K3 i- @  [; B. I3 s, \
* e% q0 B# w2 L' M$ y% X  s5 O
收藏 评论0 发布时间:2022-11-20 16:28

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版