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

STM32编程入门之编译器KEIL MDK的数据类型及两个重要关键词v...  

[复制链接]
alan_bach 发布时间:2014-4-1 15:28

$ m/ y8 S! b' x4 ^# X3 r: L" ~带你学STM32之中断入门理解——中断优先级NVIC理解* O2 x/ j! P1 N. M5 x

) ?/ I# y5 a6 p, D: ^% L* I; Z
( i$ `: R. N/ l3 u  u( E本文适合刚刚入门的ST新手阅读,高手就不需要看了。哈哈
* I) ^7 ?" I1 R; n# z  u首先说一下编程过程中几个步骤吧
2 X9 B# u2 k7 Q4 C( T8 q
$ c1 s1 C+ q" t, d+ ^( g第一,选择一门语言,C语言或汇编语言,嵌入式编程一般目前流行还是C,这个需要基础与时间: ]+ C/ y1 O. w3 g" {
0 T0 B. w8 s1 @7 l/ R0 [
第二读懂了解 MCU的寄存器各寄存器的功能,尤其是一些IO口设置,各模块时钟设置比如定时器,I2C,同步异步串口,PWM等等,以前的话51的话没有这样设置。而现在MCU基本上各模块时钟都分开了。这个可以看官方数据说明书就可以了。1 A( ]+ m: U' ^# w
其实程的目的就是设置一系列寄存器.并根据你设计程序流程去执行它,期间可能加入了你设计好的一些算法,和数学公式。进行计算,或执行。- L8 y  e# e8 m  @/ E

; {" i9 V: E- f. A第三,你有一块你的实验板就如这次STM32推的F429,你还需要下载程序的编程器。就是把编译器编译好的代码下载到你的目标实验板上,不过ST推的多数实验班都是自带USB串口的程序下载器。比如STM32F429就自带了
% X" w' K+ l2 y+ I( ]+ N, \( \1 E+ y! k
第四,你还需要了解的是编译器,编译器的数据类型一些定义,及有些编译器的可能自带内建函数,这个不必须了解。否则无法编程。! x, n$ j  A- _
本文主要就介绍STM32的数据类型的基础知识。以及一些关键词的意义。' q4 Z! |3 p" K7 S! f( U, y

7 j+ @0 N4 G: Z% ~* U, _7 `( \( T( J. R5 }* g& {% n
▲在KELI MDK数据类型中进了如下定义1 p3 h. G% _! c' S) Q
char占用1个字节

) i+ S. ^4 [0 X) c
short int占用2字节
# K: h2 W& i7 v$ t2 y: ?2 K
int占用4字节

* k, V& T3 T% |" l* n4 a- K5 y+ i
long占用4字节
  R- U9 ^( t  }. T. r
long int占用4字节
' e( a  I2 R" a6 v1 L% A
float占用4字节
* @; S: I! y' ^$ h2 I
double占用8字节
5 q6 w! m3 W+ t- W+ W
即有如下宏定义

- z: `# z- m: |% a6 E
typedef unsigned char    uint8;      // 无符号8位字符型变量

: D2 u5 w( ]6 B- r+ v; O# C4 d4 _
typedef signed   char    int8;       // 有符号8位字符型变量
  w/ W% x) n. f. G+ f% E8 Mtypedef unsigned short   uint16;     // 无符号16位短整型变量
: n* c( E6 U$ x7 w& Z! ~' vtypedef signed   short   int16;      // 有符号16位短整型变量
% D# H. z) M, m' [1 b: {# |typedef unsigned int     uint32;     // 无符号32位整型变量" }/ W, v' w; `( `
typedef signed   int     int32;      // 有符号32位整型变量
. X$ j6 Z, F. q/ O) w% a9 w
typedef float            fp32;       // 单精度浮点数(32位长度)
1 a# D9 e, z. S' K6 H) ]
typedef double           fp64;       // 双精度浮点数(64位长度)

1 V0 E# z9 w2 X; F2 \# m. s# Y# E* U8 Z0 K; D7 W; b" P% o

, i3 O8 n+ R3 G0 L9 N6 C' U0 [+ A4 |9 F

: |$ \2 }6 V+ W) D$ c
注:C语言中的种类数据:整型:int short long 实型:float, double 。
3 B# I  a  z5 q7 t- l: l+ t
其中,Unsigned 为无符号, signed  有符号。

$ N! z) O/ G  Z; Z3 x4 n) ?
▲STM32的数据类型的宏定义
) ?" W/ N% z7 r0 x  m$ e* {+ t
STM32采用了大量的固件库,其中在2.0库中有24个数据类型如下/ L0 S2 C9 C8 a3 I9 D% b
typedef unsigned char u8;/*无符号8位变量**/0~255一字节

$ R4 Y& B' q6 Q" E
typedef signed char s8;/**有符号8位变量*/-128~127

" b8 y- M4 `2 m: @) @8 V: X
typedef volatile unsigned char vu8;/* 易变的8位无符号变量**/
% b2 k* }1 z& h: |( t
typedef volatile signed char vs8;/* 易变的8位有符号变量*/
, ^: r9 o8 f6 N, R: S# _
typedef unsigned char const uc8; /* 只读的8位无符号变量 */

& O: E4 C& B; w  M2 t0 ]3 M( {
typedef signed char const sc8; /* 只读的8位有符号变量 */

) x8 y& {- d; c1 L0 Z( u6 F" T
typedef volatile unsigned char const vuc8; /* 易变只读的8位无符变量*/

$ x5 a: ?" j( H. K  i
typedef volatile signed char const vsc8; /* 易变只读8位有符号变量 */

& J' p2 [0 p5 [* X0 R1 o8 @4 a
typedef unsigned short u16; /*16位短整型无符号变量**/0~65535两字节
& u; G& R3 s" }3 D7 T
typedef signed short s16; /*16位短整型有符号变量**/-32768~32767两字节

  n2 T% {# }3 U! Q! G3 e
typedef volatile unsigned short vu16;
# f& N! T6 k' _, ^$ p7 @
typedef volatile signed short vs16;

1 Q& [/ D3 w8 V# s. n2 h
typedef unsigned short const uc16; /* Read Only */
, \: v! z9 D- d+ l9 l; g2 e
typedef signed short const sc16; /* Read Only */

; w/ f, X! l/ x
typedef signed short const sc16; /* Read Only */

$ y& I: e" d  Q& _/ o# B8 s
typedef volatile unsigned short const vuc16; /* Read Only */
( A+ U  W% Z% N. _) m$ c
typedef volatile signed short const vsc16; /* Read Only */

9 \% O: t4 K* A% f9 O) o
typedef unsigned long u32; /*32位长整型无符号变量**/0~(2^32-1)四字节

$ ?* k) F" ?6 |4 C4 O, N6 H+ k
typedef signed long s32; /*[(-2^32)/2]~ [(-2^32)/2-1]四字节
. N& k  Z% a* w% |* @- Y5 o
typedef volatile unsigned long vu32;

$ h0 l1 f6 s7 a1 A
typedef volatile signed long vs32;

9 _) g) u/ L; H$ x! y2 f
typedef unsigned long const uc32; /* Read Only */
- K% X8 C6 [! H& a7 Y3 n. A9 l
typedef signed long const sc32; /* Read Only */
; P7 R  V6 f; j/ H5 n
typedef volatile unsigned long const vuc32; /* Read Only */

, Z; T2 ~% ]1 j" a
typedef volatile signed long const vsc32; /* Read Only */

7 U9 H# c/ x8 V5 R
对部分数据类型后面作了注释,其它类型类推。

' d% e/ X  q! {" \9 i# h- J
- p! X, W4 `( B6 q3 Q! q  P$ Y$ m( B  n* y0 W$ @8 g  j* U2 Y
▲ 关于两个关键词说明 volatile& const

5 B. i5 }& j/ ]6 t3 U
(1)volatile :这个关键字,很多人只知道用,不知道其含义,有介绍解释是不易被编译器优

6 O( t$ H$ r( ~! K+ Q- h0 h
                  化的。在STM32资料中解释加了易挥发的变量。这些解释都是含糊不清的。
9 C1 H7 a4 {) b5 `# B0 Z$ t# @' v
                  为此笔者专门查了下这个修饰关键字含义

* |6 |3 |! v4 b
通俗的解释:    随时会改变,并被多函数调用可以加volatile修饰。

2 B" |( N% c$ l+ G: E: M; l
                  简称易变变量或易挥发变量。
. k! _6 f8 c2 H7 n5 t
                  表示这个变量的真的很容易变。

0 U- ?% _- c! d
进阶解释:  加了这个volatile意义就是在每次取这个变量值的时候,要求不是取它上次在某个 时候取的临时缓存变量(比如说暂存在某个寄存器中),而是直接到内存中取。
* L8 P1 a% p2 x
个人经验: 告诉编译器,volatile定义的变量必须RAM变量.不能是寄存器变量.

0 }7 f7 h2 d. I& C4 x, K3 j8 p- {
              尤其是中断中用   全局变量一定要加volatile。

7 Q; T( y( ]4 S; Y5 @% m
(2)const: 在定义变量时候,如果加上关键词const,则变量的值在程序运行期间不能改变,当然不能再赋值了。这种变量称为常变量(constant variable)或是只读变量(read-only-variable,这样觉得更恰当)。

% R3 S' c5 F. y. n
▲  STM32F10x_StdPeriph_Driver 3.0以后的版本中使用了CMSIS数据类型

+ ^5 h, ^* w- q& w# b
3.0以后版本与之前版本变量的定义有所不同,但是出于兼容旧版本的目的,以上的数据类型仍然兼容。CMSIS的IO类型限定词如表 3所示,CMSIS和STM32固件库的数据类型对比如表 5所示。这些数据类型可以在
' L+ @) }  B1 r2 g1 n
    STM32F10x_StdPeriph_Lib_V3.4.0\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x

6 J4 z) l& \! k% ~! X6 V% {6 U
\stm32f10x.h中找到具体的定义。

. j3 ^; D' T6 e9 U5 r; A4 N$ ~' D▲ 数据类型和IO类型限定词. C/ K1 M* z6 O6 H& R) b' P( d
   Cortex-Mx HAL使用标准ANSI C头文件定义的标准类型。特别用类型限定词IO来访问外设的变量。         表3 数据类型限定词IO。
2 t$ ]" j; t7 ^7 `. @  Y4 r6 F
            
IO类型限定词
9 a* |/ ~) ~' ^
            
            
#define

! A5 ^" R6 N0 @- v5 ]/ l% f9 U            
            
描述

" L8 P, h$ O+ e            
            __I % z0 v8 t7 J' e- e  e7 v: K
            volatile const / U, c. o+ p, \
            只读访问9 ]  D( u2 `6 [5 U6 W! A
            __O
, w$ ]3 {1 P9 E8 z6 I$ n& p  j5 b
            volatile
) o0 {5 ?2 x: u: z  d# B" w" K
            只写访问
7 Z7 b9 @7 f# @! K
            __IO . T5 ^3 L2 Q% U: n8 {0 r" |3 n; }$ d
            volatile
; b$ e! o9 @; l  {( O* d# `5 M2 i
            读和写访问
% q) z4 c2 d3 g7 q1 _. m* B' L
: P6 v# D$ V  Q# C2 I0 u: ]
% o/ N0 ?, R/ ^2 |
▲ ST从库包中移除了文件”stm32f10x_type.h”,新的库使用CMSIS和定义的数据类型。- Z$ k) ?) n' J9 h: Q' U3 }
表5展示了STM32F10xxx和之间数据类型的一一对应关系。
( |1 `$ b. Y2 x4 U1 n+ q1 u     表5  STM32F10xxx固件库V2.0.3与CMSIS数据类型对比  }/ c2 u: O3 H! [8 h# h
            
STM32F10xxx固件库类型

/ P: b  y. |; J$ _+ {            
            
CMSIS类型

8 ]. c  }5 P7 P. J            
            
描述
2 ?5 }6 t; W( |" k1 t6 c, E
            
            s32 0 D6 y4 I. u2 s: b) ]  `7 p
            int32_t
6 v% ?# K# `# b; z
            有符号32位数据0 F8 }& @7 k( Y% D/ o* v+ E/ J
            s16 # V; u" y: P' X" @2 S# e9 ^, v2 h
            int16_t
2 f/ ]$ I, X1 }9 J
            有符号16位数据
0 k6 d$ G- T7 B  G5 z; B) e& o
            s8
8 g" V. f: z/ ?5 x2 }
            int8_t
& V# M2 s% }2 S( G9 c1 Q; k8 V
            有符号8位数据
- X+ G. h8 {/ ?: z3 M( W- D6 E% M
            sc32
* Q/ |' z. k, Q: P7 u( n
            const int32_t
' ]  `7 A; Z8 T( t+ U% h
            只读有符号32位数据
+ ]+ m% ?% @7 l
            sc16               const int16_t
# j: {/ r+ }% @9 a! ]! U4 M3 ?
            只读有符号16位数据  C) w: P& X. t
            sc8   O+ m$ H% `7 h$ H- M. [5 {
            const int8_t 9 p$ p& n  t# Q# L1 a
            只读有符号8位数据
, t0 {+ K  ^: M1 C2 l7 Z3 A; P
            vs32
6 c5 E; P2 x. M
            __IO int32_t - I8 D( h* F3 k0 X' h( K
易挥发读写访问有符号32位数据
& Y; i, \6 T' f2 q7 n3 j4 [5 V
            vs16
3 r: X5 h& X- U1 ^2 H; I
            __IO int16_t 5 E3 e  O. q9 ]/ A4 O
易挥发读写访问有符号16位数据
7 z+ D1 o3 j$ S" v% Y7 q
            vs8   O1 O* C  h$ T7 ?
            __IO int8_t
3 w4 K9 D' ]) x6 Z/ |( c. c
易挥发读写访问有符号8位数据   
            vsc32 ! G; u" f0 B7 b6 r
            __I int32_t
2 g# C- z: I' T
易挥发只读有符号32位数据" `; g+ k) F) q
            vsc16
: b+ P2 `' U. f6 R5 c% J# S! x" ~5 U
            __I int16_t + W2 X' ?/ e8 Q% N& a
易挥发只读有符号16位数据
            vsc8             __I int8_t
1 j  H/ P3 y. j! Q  P; d
易挥发只读有符号8位数据
            u32             uint32_t             无符号32位数据
            u16             uint16_t             无符号16位数据
            u8            uint8_t             无符号8位数据
            uc32             const uint32_t            只读无符号32位数据
            uc16             const uint16_t             只读无符号16位数据
            uc8             const uint8_t             只读无符号8位数据
            vu32             __IO uint32_t 易挥发读写访问无符号32位数据
            vu16             __IO uint16_t 易挥发读写访问无符号16位数据
            vu8             __IO uint8_t 易挥发读写访问无符号8位数据
            vuc32            __I uint32_t 易挥发只读无符号32位数据     
            vuc16            __I uint16_t 易挥发只读无符号16位数据     
            vuc8             __I uint8_t易挥发只读无符号8位数据  

- C4 `3 ^0 w7 z! _# i
- _( L* v5 w) V/ f
▲注意出于兼容旧版本的目的文件”stm32f10x.h”中仍然定义了STM32F10xxx固件库原有数据类型。

# O: d8 H1 {* K0 h% C" B: y. c
  文件”stm32f10x.h”中也定义了STM32F10xxx固件库专用类型.
6 K. i0 h; {2 I/ @+ ^
它们是:typedef enum {FALSE = 0, TRUE = !FALSE} bool;
; x0 N; V. Z0 E9 _+ ^4 h
typedef enum {RESET = 0, SET = !RESET} FlagStatus, ITStatus; - }" e2 E3 g# w& {1 q% S3 K2 T) G* Q
typedef enum {DISABLE = 0, ENABLE = !DISABLE} FunctionalState; , @7 G' q, p& {& `0 n" d1 P
#define IS_FUNCTIONAL_STATE(STATE) (((STATE) == DISABLE) || ((STATE) == ENABLE)) ! s3 e* m. q! p$ w
typedef enum {ERROR = 0, SUCCESS = !ERROR} ErrorStatus;

, ~6 \8 L" `6 ^- ~+ t, S" ~' w8 Q, `- O5 U( r/ P6 G

& B" L' k& A% ?6 u" Y1 y. V+ G

KEIL MDK和STM32的数据类型 之入门篇 .pdf

下载

171.61 KB, 下载次数: 390

赞 收藏 6 评论24 发布时间:2014-4-1 15:28

举报

24个回答
党国特派员 回答时间:2015-2-12 09:21:35
谢谢!!! blank.png blank.png blank.png blank.png blank.png blank.png blank.png blank.png blank.png blank.png
qianfan 回答时间:2014-12-6 19:58:20
在keil中,软件延时不加volatile可以,但是在gcc编译器中,不加volatile是不行的,在gcc中,不加volatile的软件也是是被优化掉的。在这方面吃过亏。之前支持到外设的定义要加volatile,没注意到这里。
kds-371533 回答时间:2016-6-14 10:06:04
再次对STM32底层驱动库有了一个清晰的认识! 谢谢楼主
alan_bach 回答时间:2014-4-3 16:12:44

RE:STM32编程入门之编译器KEIL MDK的数据类型及两个重要关键词volatile& const

不顶不行啊
微电子 回答时间:2014-4-15 20:54:33

回复:STM32编程入门之编译器KEIL MDK的数据类型及两个重要关键词volatile& const

  原有数据类型
yanxu-335875 回答时间:2014-4-18 11:30:14

RE:STM32编程入门之编译器KEIL MDK的数据类型及两个重要关键词volatile& const

再次对STM32底层驱动库有了一个清晰的认识! 谢谢楼主
ysdx06010302 回答时间:2014-4-19 07:39:23

回复:STM32编程入门之编译器KEIL MDK的数据类型及两个重要关键词volatile& const

 必须顶啊。
yoona-367072 回答时间:2014-6-11 14:51:41

RE:STM32编程入门之编译器KEIL MDK的数据类型及两个重要关键词volatile& const

谢谢!!!!必须顶啊。
zclwzj08 回答时间:2014-12-4 15:32:19
谢谢!!!
wyxy163@126.com 回答时间:2014-12-7 19:16:25
提示: 作者被禁止或删除 内容自动屏蔽
梦想家的秘密 回答时间:2015-2-10 13:43:39
看一下
. B3 L% M- G- y2 Z0 N
星辰一方 回答时间:2015-2-12 06:16:44
好详细的解释!顶一下!
默罕默德.ST 回答时间:2015-2-12 09:01:11
stm32.jpg
asian-381523 回答时间:2015-6-13 23:14:45
正是自己希望理解的内容,讲的不错
风子 回答时间:2015-6-16 14:09:10
谢谢分享.png
$ ?; t0 Q, C4 A- _  T; ~( n. _
12下一页

所属标签

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