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

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

[复制链接]
STMCU小助手 发布时间:2022-11-20 16:28
主要内容:- i( I- U2 }/ t4 l, b2 P
1)常用C语言讲解;
# I  y$ }( D( D" c8 k6 h2)寄存器地址名称映射解读。
. `4 J  p3 @. l( K; h* F/ T( [( |6 n" _; J; h1 d) E1 g/ b- g
1.常用C语言+ c# k7 L5 M( ]3 r; g
1.1 位操作:6种位操作运算符
0 A- A/ ^# {: @+ j, i1 p/ j1) 按位与:&. {2 g' Y- q! N. k! T
例:1011&0010=0010
8 F9 {( ^# G/ m! ^( P2) 按位或:|
; @) L  d* ^7 `# }+ R例:1011|0010=1011% e" v% }3 y! j; N: J. u
3) 按位异或:^
7 ]; G, t9 f& S例:1011^0010=10014 a7 q' b2 V. g1 r# L
4) 取反:~7 e0 z% d  j. b2 v1 z  G
例:~1011=0100
$ I& ~# p0 y3 i5 q5) 左移:<<
) H* ?& z6 ?6 e5 n5 c) B0 `% ^例:0110<<1=1100
  K! A' ]4 w) Y6) 右移:>>
3 U) C4 R* K8 k+ E1 a$ @例:0110>>1=0011+ p# M- G: p' ?0 I
7) 组合:按位与后赋值:&=' D/ ?; @% }$ r
, c' M( l0 C* L2 n. x
  1. GPIOA->CRL&=0XFFFFFF0F;      //将第4-7位清0
    . E/ X( m0 h  k! |. w! l( f2 V
  2. GPIOA->CRL|=0X00000040;  //设置相应位的值,不改变其他位的值
复制代码

; L; P7 b( _3 F' M1 v1.2 define宏定义关键词  M% |* Y; E* e9 L  p& [
define是C语言中的预处理命令,用于宏定义,可提高源代码的可读性,为编程提供方便。, W5 D1 n) [+ j, f# t1 t2 e
常见格式:
, K4 k! _. O- \* ^: v* g0 S#define 标识符 字符串
/ Y, }- s/ L' ^2 }: R3 w: V/ v标识符为所定义的宏名。字符串可以是常数、表达式、格式串等。! [6 K5 [& W, D% W6 l9 F
例:
) c# p5 w1 _) L$ m, n  l  ~3 {
  1. #define SYSCLK_FREQ_72MHz 72000000
复制代码
7 m- A7 \: ?$ _
定义标识符SYSCLK_FREQ_72MHz的值为72000000。& _2 g5 w$ z- a( Z7 s! u
1.3 ifdef条件编译
" @& H; e* P1 }1 V( _- G1 Z单片机程序开发过程中,经常会遇到一种情况,当满足某条件时对一组语句进行编译,而当条件不满足时则编译另一组语句。条件编译命令最常见的形式为:: @, C8 B" g: r5 v! S
#ifdef 标识符0 R2 H- a$ E# E  l6 j
程序段1
. x( h% O9 N  D* r#else
- c+ b7 N3 T& [7 B程序段25 s- c4 F( O, ]& C6 }* M3 x
#endif/ x+ ^, [5 G" d$ j& n  M6 p3 ?9 T
例:' y8 Q; M, d3 f
  1. #ifdef STM32F10X_HD
    $ s- P. u' ^% }3 J6 s
  2. //大容量芯片需要的一些变量定义
    4 ~9 n1 l9 O4 `* Z( e3 q  y* T
  3. #end
复制代码
3 ^1 t2 V& q' v$ A  R" k9 T8 f
1.4 extern变量申明/ G8 g5 j! \3 P. |+ z
C语言中extern可以置于变量或函数前,以表示变量或函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找定义。对于extern申明变量可以多次,但定义只有一次。5 K( {( m& |6 m4 f0 }
. F9 U3 J2 o7 f4 T$ b$ k& ^' P
1.5 typedef类型别名
, a$ k6 _/ w$ O9 ^定义一种类型的别名,而不是简单的宏替换。可以用作同时声明指针型的多个对象。
3 I9 S, h1 S' z4 o8 Ktypedef unsigned char uint8_t;& R! k3 M) d  T$ f
typedef unsigned short int uint16_t;
$ u/ `% w, _# Z; _3 j: _typedef unsigned int uint32_t;
7 P/ @0 ^0 j! v  ]3 D/ o1 @9 ^; Ltypedef unsigned __int64 uint64_t;
: c# T/ P1 v, k( p
2 U& `# b" g5 _1.6 结构体:构造类型
# s/ L6 n& ^  u. vStruct结构体名{4 `( a9 P' l- s, Y) D9 A# i: ?
成员列表1;
, d( g' O& r: |5 Q* W9 M6 i成员变量2;% Q1 \1 E5 U0 r+ I( @; L! D
。。。
7 n7 T- F0 C+ x}变量名列表;
# H, E5 M7 h0 v$ Q' _& Q在结构体申明的时候可以定义变量,也可以申明之后定义,方法是:2 u# X: m$ A6 f0 p. X* s
Struct 结构体名字 结构体变量列表;: X) J) K5 T- u
作用:同一类型可以用数组,不同类型可以用结构体组织。
0 d3 M: M! ?3 S结构体可扩展性强。
& M% M$ |1 m: G2 Z; V例:7 p4 a2 r8 f/ H' m) w9 l

0 \( Z  e$ b2 a7 _0 T0 L: j
  1. void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct)
复制代码

) U; d9 e/ y8 D# e9 g5 B# p! o1.7 static
% X* t% X% g. [. S2 z7 n! \0 lstatic申明的局部变量,存储在静态存储区。. m3 Y6 q9 E: s2 W; r+ w) h1 O4 A
它在函数调用结束后,不会被释放,值会一直保留下来。
/ T& O2 L6 \1 h9 Y所以说static申明的局部变量,具有记忆功能。
* I1 z  J' O. N- U  U2. MDK中寄存器地址名称映射分析  t7 C4 w" X* L( B9 r
概念:对MCU,一切底层配置,最终都是配置寄存器。
0 |/ O# Y9 Q  P; O: iSTM32中操作:/ F/ \( x1 f( U9 \' q  ~
GPIOA->ODR=0x00000000;" v! H- j2 F" {0 ?$ }2 |9 L
问题:值0x00000000是怎么赋值给GPIOA的ODR寄存器地址的?即GPIOA->ODR这种写法,是怎么与GPIOA的ODR寄存器地址映射起来的?理解了下面这张图就能明白。
7 p6 t3 c  |9 J+ H5 l8 L) A/ r, [6 r! B3 D; `7 M/ C; u, l
20200328090752708.png
2 d5 q  v1 x" O; @
8 J* Y$ s( O: J1 }- a4 k* I9 K  \————————————————
0 f- }4 I8 o' r+ b版权声明:天亮继续睡
( Y7 p) l: C" S4 H# ?
- i% P1 _$ t8 e8 J5 k1 _* l- b" \) z) R& N3 E* Y+ }
赞 收藏 评论0 发布时间:2022-11-20 16:28

举报

0个回答

所属标签

相似技术帖

官网相关资源

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