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

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

[复制链接]
alan_bach 发布时间:2014-4-1 15:28
. }$ U) g. {# b9 c. ^
带你学STM32之中断入门理解——中断优先级NVIC理解
" W2 g* A# c  ?  {+ O: j
! {! Q4 e! T5 X/ U7 ^5 c$ f0 K& i/ [8 l/ ^- E: D
本文适合刚刚入门的ST新手阅读,高手就不需要看了。哈哈
; |" g- z4 j3 P" k( ^首先说一下编程过程中几个步骤吧7 Y; `/ }: `4 L  S2 h

; F8 c# i: m9 b$ ?; z0 I' [+ Z, J) F第一,选择一门语言,C语言或汇编语言,嵌入式编程一般目前流行还是C,这个需要基础与时间
$ r  N& U) f9 W$ g  K% E. A
" Z; F5 M& X; {* t* [4 x第二读懂了解 MCU的寄存器各寄存器的功能,尤其是一些IO口设置,各模块时钟设置比如定时器,I2C,同步异步串口,PWM等等,以前的话51的话没有这样设置。而现在MCU基本上各模块时钟都分开了。这个可以看官方数据说明书就可以了。
+ k$ {. U0 j, b2 W其实程的目的就是设置一系列寄存器.并根据你设计程序流程去执行它,期间可能加入了你设计好的一些算法,和数学公式。进行计算,或执行。
, X' h! A8 L$ e1 ^6 z) R8 M  v. r. o
第三,你有一块你的实验板就如这次STM32推的F429,你还需要下载程序的编程器。就是把编译器编译好的代码下载到你的目标实验板上,不过ST推的多数实验班都是自带USB串口的程序下载器。比如STM32F429就自带了
/ d& a: M0 [; u* }! l
8 b, g+ D2 z/ S7 {4 s5 |7 n第四,你还需要了解的是编译器,编译器的数据类型一些定义,及有些编译器的可能自带内建函数,这个不必须了解。否则无法编程。
4 j! r6 ~9 L9 c本文主要就介绍STM32的数据类型的基础知识。以及一些关键词的意义。
% ~, ^5 z7 K: O7 E; p5 Z7 Y- Z; X
- y) n+ U, G3 |% v; E+ r  Z5 K
! T2 H* h2 J) G  {- Z ▲在KELI MDK数据类型中进了如下定义' V/ ]3 T6 f9 ^4 x; M
char占用1个字节

2 R; P6 R9 w7 p  J! }7 }( p0 R+ B
short int占用2字节
8 I; F+ C% R5 W7 @$ Q5 N5 }8 r
int占用4字节
+ n- V- Z0 p0 N
long占用4字节
& a2 s; K& T+ \
long int占用4字节
" g6 [. f. T" r
float占用4字节
5 p& Z' `& A* \* N) E! o4 z
double占用8字节
4 j$ ?1 I$ S% R3 B6 h2 _$ C7 [3 C
即有如下宏定义
1 f) Z! u# ^0 b
typedef unsigned char    uint8;      // 无符号8位字符型变量
$ i* V1 ~, X+ W  m  h
typedef signed   char    int8;       // 有符号8位字符型变量( H& t# f9 R4 X* F
typedef unsigned short   uint16;     // 无符号16位短整型变量; f9 D% ]9 I- y- o' j, m6 i" ^& B
typedef signed   short   int16;      // 有符号16位短整型变量
/ m8 E1 h0 r( X! F- a$ k$ Atypedef unsigned int     uint32;     // 无符号32位整型变量% V/ u2 a5 h' p; S% {$ h! G
typedef signed   int     int32;      // 有符号32位整型变量

3 Y' b+ ~# p6 O% D
typedef float            fp32;       // 单精度浮点数(32位长度)

# B4 E4 Y. L# M% }' E9 V3 x1 O
typedef double           fp64;       // 双精度浮点数(64位长度)
6 D& v1 x" l: R1 R+ X" U; O

, S2 [, n' ^( r" s: q) Q0 r# b1 e' t% r+ e3 b  ]
" L8 \6 @. H! V8 ]" O+ \
# i- {4 Z9 }5 S' f4 \/ Y4 @
注:C语言中的种类数据:整型:int short long 实型:float, double 。

, G9 w& T. p* \/ w& }
其中,Unsigned 为无符号, signed  有符号。

$ M6 a2 Z6 d7 J
▲STM32的数据类型的宏定义
" \& n% f# p0 N+ [
STM32采用了大量的固件库,其中在2.0库中有24个数据类型如下8 k4 C' ^7 t) O/ K; c2 f
typedef unsigned char u8;/*无符号8位变量**/0~255一字节
& s; N3 t& I$ Y: ?0 c! t1 n- i3 ~% a
typedef signed char s8;/**有符号8位变量*/-128~127
/ K! J7 i  M9 J
typedef volatile unsigned char vu8;/* 易变的8位无符号变量**/
- F: Y5 x! S4 w% W0 Z) C+ U
typedef volatile signed char vs8;/* 易变的8位有符号变量*/

7 \: P' k0 S" v4 j' w
typedef unsigned char const uc8; /* 只读的8位无符号变量 */
8 S# Z/ h% Q; _  @, P
typedef signed char const sc8; /* 只读的8位有符号变量 */

  W! q8 r1 G- `! W5 j5 J
typedef volatile unsigned char const vuc8; /* 易变只读的8位无符变量*/

" b$ J4 q1 s- Q( ]/ ~
typedef volatile signed char const vsc8; /* 易变只读8位有符号变量 */
5 T8 J- y1 `1 o: l
typedef unsigned short u16; /*16位短整型无符号变量**/0~65535两字节

1 u0 O- |* d" l+ N) S/ m( D" q- i' z
typedef signed short s16; /*16位短整型有符号变量**/-32768~32767两字节

# m% w6 I, U! H# q" D, X
typedef volatile unsigned short vu16;
0 M& V% R2 v+ Q. b$ w  Q( I
typedef volatile signed short vs16;
3 o9 v- p. x3 l) C% l+ V. h
typedef unsigned short const uc16; /* Read Only */

0 }/ j& |) E5 r, d$ H4 f, D
typedef signed short const sc16; /* Read Only */

3 L5 ?" p$ H7 Z2 ^! S& ~
typedef signed short const sc16; /* Read Only */
0 F8 r# J) @8 I, m+ w
typedef volatile unsigned short const vuc16; /* Read Only */

. S  a2 E' j- E, X4 o
typedef volatile signed short const vsc16; /* Read Only */

' D3 N2 H: ~& w+ X/ t/ [. H! c
typedef unsigned long u32; /*32位长整型无符号变量**/0~(2^32-1)四字节
% N( Q; w# U* @# }
typedef signed long s32; /*[(-2^32)/2]~ [(-2^32)/2-1]四字节
  h/ M3 X+ Z6 N% J
typedef volatile unsigned long vu32;

  d. s( \5 D. U/ a  i1 W
typedef volatile signed long vs32;
; ]9 ^# O# d, D( [1 Q
typedef unsigned long const uc32; /* Read Only */

4 R/ x% u: f" u
typedef signed long const sc32; /* Read Only */

% R/ j2 T# k) e2 U+ ]( b
typedef volatile unsigned long const vuc32; /* Read Only */

5 i5 v( \; O9 P# {2 A
typedef volatile signed long const vsc32; /* Read Only */
1 e7 B  s+ j3 R( Z! N" |* P
对部分数据类型后面作了注释,其它类型类推。
/ M/ z8 W8 Z* h
  w1 l' u' n! O! a( O% T
  M/ \3 @& I+ Q
▲ 关于两个关键词说明 volatile& const
3 z( B2 x9 Y8 F" b! d6 L
(1)volatile :这个关键字,很多人只知道用,不知道其含义,有介绍解释是不易被编译器优

; W3 N, y" r$ A( H* P
                  化的。在STM32资料中解释加了易挥发的变量。这些解释都是含糊不清的。
, b7 O& v6 g2 x' w. m- H
                  为此笔者专门查了下这个修饰关键字含义

$ X5 j' M& t+ H7 ?: d* t
通俗的解释:    随时会改变,并被多函数调用可以加volatile修饰。

8 c) |+ B- E' |/ P, V: ~+ i, I' b
                  简称易变变量或易挥发变量。

4 c/ r+ O' D& q: R! `# R
                  表示这个变量的真的很容易变。

$ J% M+ W+ L; p% M  \
进阶解释:  加了这个volatile意义就是在每次取这个变量值的时候,要求不是取它上次在某个 时候取的临时缓存变量(比如说暂存在某个寄存器中),而是直接到内存中取。
2 ^0 X, [: k) T+ o: A
个人经验: 告诉编译器,volatile定义的变量必须RAM变量.不能是寄存器变量.

) n/ e. s" K; R4 N! B
              尤其是中断中用   全局变量一定要加volatile。

" v7 L) B; g1 G5 j: b9 U5 g- K
(2)const: 在定义变量时候,如果加上关键词const,则变量的值在程序运行期间不能改变,当然不能再赋值了。这种变量称为常变量(constant variable)或是只读变量(read-only-variable,这样觉得更恰当)。
2 S& e* Z. A; _4 D9 @
▲  STM32F10x_StdPeriph_Driver 3.0以后的版本中使用了CMSIS数据类型

1 v$ d* h, x+ O7 L9 {' N
3.0以后版本与之前版本变量的定义有所不同,但是出于兼容旧版本的目的,以上的数据类型仍然兼容。CMSIS的IO类型限定词如表 3所示,CMSIS和STM32固件库的数据类型对比如表 5所示。这些数据类型可以在
# M/ O3 r/ |) V: o) C
    STM32F10x_StdPeriph_Lib_V3.4.0\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x

  E- l) K9 j2 M! m7 q7 c
\stm32f10x.h中找到具体的定义。

$ [7 C2 s2 B' ?6 F* @$ g) [  c* v▲ 数据类型和IO类型限定词/ q2 f$ v/ B: [9 g9 b
   Cortex-Mx HAL使用标准ANSI C头文件定义的标准类型。特别用类型限定词IO来访问外设的变量。         表3 数据类型限定词IO。& Y3 m) Q2 y- S
            
IO类型限定词
# b7 K8 u8 W7 `1 a# M
            
            
#define
1 c6 c; I; r6 d. v; N: ^& U
            
            
描述

/ G$ Z: A! {, t/ @. {' o            
            __I
. P6 }& m& v2 Z) Z9 L4 U# b- y4 J
            volatile const ( N& X# Z6 p- t7 H
            只读访问/ a& R+ d4 X; |) {. y; X
            __O
) T; ~% S* c5 S2 Q6 V% S/ }  w
            volatile . Y" W0 f9 A: J& E# c
            只写访问! I& ?+ I" b4 l, x* ?( N
            __IO
3 U2 U! q! h/ C( a; B* I# r- }8 l
            volatile
" _7 J% [; |4 T/ c6 D0 N# K
            读和写访问5 E' b- s4 K. f/ d0 h

7 K& F7 r( V' g4 M. x2 |( H) F& q
2 `/ t' B" O5 Y0 S▲ ST从库包中移除了文件”stm32f10x_type.h”,新的库使用CMSIS和定义的数据类型。/ D7 O8 h. G% D( W7 r2 [
表5展示了STM32F10xxx和之间数据类型的一一对应关系。
) _' w- i, \. S1 r: i; Y1 Q     表5  STM32F10xxx固件库V2.0.3与CMSIS数据类型对比
& E# K1 U5 }( C  h9 T
            
STM32F10xxx固件库类型

+ k0 {+ |% }  J) r/ \            
            
CMSIS类型
* N- K$ |, R# ?( _* B7 G
            
            
描述
* _/ U7 a  a3 z+ h- ?5 i
            
            s32 0 ]/ p6 v; z* m/ @2 ~/ P" f4 O
            int32_t ' Z( [. z3 h* m' b( T. ?" t
            有符号32位数据
! z% ~6 \% @& ]4 k7 G
            s16
7 p" N) x. [1 n% u" S/ |
            int16_t ' x1 F# v, P1 x/ v9 Y$ s3 k$ w) W: c$ f
            有符号16位数据! H0 M! Y3 f5 D- p
            s8
, S8 C' P9 t- s$ P$ U, O9 Z' }3 I: r
            int8_t ; e* J4 O% e# d* A* h- _1 {# N7 V+ _
            有符号8位数据
( _6 g. r) o. k5 `8 ?  v; j
            sc32
5 {% q, d5 c  v$ P9 G) W* V
            const int32_t ( O# L" ]& Y) ~! z. q
            只读有符号32位数据' s: A; J7 c: A! C9 m
            sc16               const int16_t ; C/ h4 A5 D8 a. M: j; G' O
            只读有符号16位数据; e) R6 J3 H9 G' [2 h% X: a# }
            sc8 8 r" _, W: l) _: b( w
            const int8_t
* ]- B' k  x% W; _9 j3 H
            只读有符号8位数据8 ?2 b! Z6 o/ O, ]
            vs32 : N9 q& d% K! R  C3 x
            __IO int32_t
" I5 d7 e  l* }( @; g# R9 d  r8 I* G
易挥发读写访问有符号32位数据
; Z* B4 Q, V: i1 y6 Z" _4 a
            vs16 1 U6 T, S* |5 u: w
            __IO int16_t 9 P1 `# u& F9 K
易挥发读写访问有符号16位数据
, P" u% n0 ~$ m' `- s7 B, z
            vs8 1 `# H! L, y( P
            __IO int8_t
5 H- L' k  y% I( e7 f6 a
易挥发读写访问有符号8位数据   
            vsc32
- M6 G; Q9 |! k, d
            __I int32_t
- \! @; _' E2 l( c9 A  D% P0 k, ]
易挥发只读有符号32位数据1 Z" E# {* l% Z% }2 N0 E' W
            vsc16 2 x9 w9 c( A( H$ I0 s
            __I int16_t
( L$ \3 t% a8 P( Z
易挥发只读有符号16位数据
            vsc8             __I int8_t
8 Z; H6 H! Y) S' A
易挥发只读有符号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位数据  

6 G$ |9 {- Z, M1 O
7 Q1 _% v& F( }1 _  w8 c  L
▲注意出于兼容旧版本的目的文件”stm32f10x.h”中仍然定义了STM32F10xxx固件库原有数据类型。
: u2 \+ H; Q) \7 S
  文件”stm32f10x.h”中也定义了STM32F10xxx固件库专用类型.

9 r/ L. @- ]- e9 f9 J1 e
它们是:typedef enum {FALSE = 0, TRUE = !FALSE} bool;
0 j1 P  ]7 {5 w4 K* {; {$ p
typedef enum {RESET = 0, SET = !RESET} FlagStatus, ITStatus; ' X& j% [. Y% x4 n6 v9 l
typedef enum {DISABLE = 0, ENABLE = !DISABLE} FunctionalState; 2 }+ p) N* ~7 b
#define IS_FUNCTIONAL_STATE(STATE) (((STATE) == DISABLE) || ((STATE) == ENABLE))
6 A+ Q* T. a9 r5 ]* N
typedef enum {ERROR = 0, SUCCESS = !ERROR} ErrorStatus;
0 G' b, d. T( O' {. `5 v
: X8 \4 m' ]) N# g
- h% E4 N9 T4 ~$ L

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
看一下
" E* n3 b7 P$ E  w, x
星辰一方 回答时间: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
2 a6 E9 z- E: @
12下一页

所属标签

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