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

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

[复制链接]
alan_bach 发布时间:2014-4-1 15:28
! h6 c0 r& R( X) s  g$ I. Y9 j
带你学STM32之中断入门理解——中断优先级NVIC理解
; x* R, S: W0 o5 m0 J( N4 \
6 W  M! E7 _, p' j! u# e% A7 z# m& U7 }* L, r$ c! ^- q; U" d8 C
本文适合刚刚入门的ST新手阅读,高手就不需要看了。哈哈
) J# Q2 ~( V* r4 l) y$ w首先说一下编程过程中几个步骤吧
- n$ ]) U, L' z6 a& h
6 I, o3 s( S! D0 {) g第一,选择一门语言,C语言或汇编语言,嵌入式编程一般目前流行还是C,这个需要基础与时间
' R& q  l- {3 R/ W; _& z. |/ l, w$ o6 ^+ c/ p
第二读懂了解 MCU的寄存器各寄存器的功能,尤其是一些IO口设置,各模块时钟设置比如定时器,I2C,同步异步串口,PWM等等,以前的话51的话没有这样设置。而现在MCU基本上各模块时钟都分开了。这个可以看官方数据说明书就可以了。" K. E3 [( q$ o4 [7 N1 t! W" m, @* g! v
其实程的目的就是设置一系列寄存器.并根据你设计程序流程去执行它,期间可能加入了你设计好的一些算法,和数学公式。进行计算,或执行。6 X/ D1 g4 p! Y& B
, s+ H3 c. C* P! }; ^+ {
第三,你有一块你的实验板就如这次STM32推的F429,你还需要下载程序的编程器。就是把编译器编译好的代码下载到你的目标实验板上,不过ST推的多数实验班都是自带USB串口的程序下载器。比如STM32F429就自带了; L7 W" K# g9 ?1 D9 x( G7 D; o2 D
! A' d% }# F" z3 [2 p
第四,你还需要了解的是编译器,编译器的数据类型一些定义,及有些编译器的可能自带内建函数,这个不必须了解。否则无法编程。
& H) g! J4 E) G  \+ k4 q本文主要就介绍STM32的数据类型的基础知识。以及一些关键词的意义。
: O- h" o! }$ ~
. K9 R* I, _* H0 q! [* n) D, z) r
3 U" n0 M3 E$ ~1 J; T3 y 在KELI MDK数据类型中进了如下定义
$ H3 m2 E, i& J
char占用1个字节

! O0 H$ i5 Y# u- L7 |
short int占用2字节
' Q, H4 r6 k$ i" h
int占用4字节

% V2 a' b! k, E  }- F. B) D+ m
long占用4字节
: l2 H$ c5 q3 C; g
long int占用4字节

! n, r. q* [8 @9 m3 C  \
float占用4字节

6 a# h  C! X7 ]( I. c  k7 _
double占用8字节

- L$ n9 Y4 E6 A! ^- R, `8 }& \
即有如下宏定义

6 q, R# g& c1 a
typedef unsigned char    uint8;      // 无符号8位字符型变量
$ }, V4 y( {# a6 C5 j
typedef signed   char    int8;       // 有符号8位字符型变量
+ X! p. d, |) j3 T- }typedef unsigned short   uint16;     // 无符号16位短整型变量4 O. Q) R/ W/ I& x! f- z1 z
typedef signed   short   int16;      // 有符号16位短整型变量
3 ]/ G+ _' ~* Q& utypedef unsigned int     uint32;     // 无符号32位整型变量+ U4 ]9 ?7 o' X+ F0 Q
typedef signed   int     int32;      // 有符号32位整型变量
$ f& K6 W, q. G& ]( a; Y& j
typedef float            fp32;       // 单精度浮点数(32位长度)

; \/ B- m3 P, `
typedef double           fp64;       // 双精度浮点数(64位长度)
) m7 C) y2 [% F3 [
0 h$ r8 s; J4 u

4 ?" r6 k1 F5 f! ?/ U7 |9 l' k$ e! J1 B; H- Y# S# u; A

& f4 C$ n6 B5 n
注:C语言中的种类数据:整型:int short long 实型:float, double 。
7 {1 c+ m5 U0 p: n7 w: G
其中,Unsigned 为无符号, signed  有符号。

  }" b0 N8 J( \$ d; r, Y0 x
STM32的数据类型的宏定义
2 v+ o( _9 u' }+ X6 }: X( ?) {
STM32采用了大量的固件库,其中在2.0库中有24个数据类型如下
/ _& c2 ~" Q: ]& k
typedef unsigned char u8;/*无符号8位变量**/0~255一字节
. a" L/ H- p; @/ ~0 h
typedef signed char s8;/**有符号8位变量*/-128~127

# B, D& ^, ^" V$ ]2 l
typedef volatile unsigned char vu8;/* 易变的8位无符号变量**/

6 H  [7 g, C( x! N8 u7 j
typedef volatile signed char vs8;/* 易变的8位有符号变量*/
8 \! a- w7 `/ S5 `, E0 O# }
typedef unsigned char const uc8; /* 只读的8位无符号变量 */
$ H1 u; A* y; e3 ]7 x/ e) K
typedef signed char const sc8; /* 只读的8位有符号变量 */

6 B5 l' \+ d, L' F2 [( t) E
typedef volatile unsigned char const vuc8; /* 易变只读的8位无符变量*/

! B) ~( c; j/ l
typedef volatile signed char const vsc8; /* 易变只读8位有符号变量 */
6 N( [7 r* ~- l
typedef unsigned short u16; /*16位短整型无符号变量**/0~65535两字节
# @/ T) v3 t+ C0 L, c
typedef signed short s16; /*16位短整型有符号变量**/-32768~32767两字节
* ?1 A) Q* _3 Z! S% D
typedef volatile unsigned short vu16;

3 R( Q0 `9 I4 j5 f. L2 z
typedef volatile signed short vs16;

: F( u* |# D; I) J' P! w
typedef unsigned short const uc16; /* Read Only */

' i3 p2 t8 B" B& b
typedef signed short const sc16; /* Read Only */

/ e# t  B3 ^3 }4 ]4 ?, ?9 t
typedef signed short const sc16; /* Read Only */
% M0 a3 e& b, X. z/ N
typedef volatile unsigned short const vuc16; /* Read Only */

+ J# E6 [3 J+ t5 _- ]8 c
typedef volatile signed short const vsc16; /* Read Only */

. s! r2 Z! q- C) C0 C6 }: L3 }
typedef unsigned long u32; /*32位长整型无符号变量**/0~(2^32-1)四字节

; a) c( I( U6 ^  L+ D( ?
typedef signed long s32; /*[(-2^32)/2]~ [(-2^32)/2-1]四字节
' ^& }. s( G4 B+ R) H
typedef volatile unsigned long vu32;
) D/ R3 J7 c+ m- K  a' \
typedef volatile signed long vs32;
9 T$ L, W* v' W) X0 g  k/ X
typedef unsigned long const uc32; /* Read Only */

- ~4 P. P) X; W& _" p
typedef signed long const sc32; /* Read Only */

7 p( L  X( o% S
typedef volatile unsigned long const vuc32; /* Read Only */
8 W) n0 U9 C+ c9 y6 A3 B( G4 B
typedef volatile signed long const vsc32; /* Read Only */
" `- ^+ i& x; s- G6 X( e$ r
对部分数据类型后面作了注释,其它类型类推。
4 D6 f/ _" M6 M3 g4 j

, Q. p- f" [/ q" t) p) a% x
+ M7 w  ^) i6 V, Q
关于两个关键词说明 volatile& const
/ [) ^! v9 q: J
(1)volatile :这个关键字,很多人只知道用,不知道其含义,有介绍解释是不易被编译器优

, P  m+ s& s& ]* T  ~+ M; t6 z: u
                  化的。在STM32资料中解释加了易挥发的变量。这些解释都是含糊不清的。

' _# _" x7 Z. U! U" D1 D
                  为此笔者专门查了下这个修饰关键字含义
( L" R3 ]3 e8 C' ]
通俗的解释:    随时会改变,并被多函数调用可以加volatile修饰

" V3 b- ?2 Q9 }9 Q9 N3 c
                  简称易变变量或易挥发变量。
# }7 P) `0 g& N
                  表示这个变量的真的很容易变。

% S* W7 P) O# `; k* n0 Y  Q
进阶解释:  加了这个volatile意义就是在每次取这个变量值的时候,要求不是取它上次在某个 时候取的临时缓存变量(比如说暂存在某个寄存器中),而是直接到内存中取。

7 ]0 `# Y" i7 f* [, M7 o- t* b+ I
个人经验: 告诉编译器,volatile定义的变量必须RAM变量.不能是寄存器变量.

# X( O. h1 M7 L1 c
              尤其是中断中用   全局变量一定要加volatile。

+ e5 W6 X9 z( d1 S9 p  T% t
(2)const: 在定义变量时候,如果加上关键词const,则变量的值在程序运行期间不能改变,当然不能再赋值了。这种变量称为常变量(constant variable)或是只读变量(read-only-variable,这样觉得更恰当)。
/ E' z5 y+ g# A5 Z( Q% Q
▲  STM32F10x_StdPeriph_Driver 3.0以后的版本中使用了CMSIS数据类型

; X0 w( _- E- Y; ~. U
3.0以后版本与之前版本变量的定义有所不同,但是出于兼容旧版本的目的,以上的数据类型仍然兼容。CMSIS的IO类型限定词如表 3所示,CMSIS和STM32固件库的数据类型对比如表 5所示。这些数据类型可以在
% x* s6 h6 _8 G; h8 u' Q
    STM32F10x_StdPeriph_Lib_V3.4.0\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x
' Z: F; G, v8 s9 h# D
\stm32f10x.h中找到具体的定义。
6 q# Y+ o' F! f2 F# x6 Z; H
数据类型和IO类型限定词
9 c) s4 n% X& \2 F0 _7 ~   Cortex-Mx HAL使用标准ANSI C头文件定义的标准类型。特别用类型限定词IO来访问外设的变量。         表3 数据类型限定词IO: a8 S- D3 `- W6 f+ N' F% m
            
IO类型限定词

, H2 N- P* f  @! |& e" Q            
            
#define
' ^  J2 l9 a+ j7 {+ r
            
            
描述
8 z) z% M; N* R1 E0 |: N/ X
            
            __I , N( _/ d- @: P: [
            volatile const ( x) ?+ [( I! r
            只读访问3 b# j7 h( a2 d: X+ R2 K' H
            __O * T. l! n3 F$ H/ j  q8 E
            volatile
4 C% y/ r  {% G5 q
            只写访问9 q5 l5 j( N* d3 |" U
            __IO
7 h1 V; l: T# G, _* i2 x
            volatile
! S, B; M1 C/ L7 c1 i7 C
            读和写访问
$ [. f) r, r, V0 ?7 D8 @( L$ ?1 U' B
, F) H3 W3 y8 D  P8 u

$ E2 t# b/ i" g$ {: AST从库包中移除了文件”stm32f10x_type.h”,新的库使用CMSIS定义的数据类型。
2 e1 i: S( k" ]5 V5展示了STM32F10xxx之间数据类型的一一对应关系。
% g/ w; R* W# n* J4 I% \     5  STM32F10xxx固件库V2.0.3CMSIS数据类型对比
4 M5 @7 L! l, K5 s
            
STM32F10xxx固件库类型
7 z6 A5 R1 n* j: o
            
            
CMSIS类型
9 A3 v5 t. j: S3 }
            
            
描述

  g9 q4 O- k9 Y            
            s32 ( B9 [5 q2 p$ C+ @
            int32_t
1 q% n  e3 }& A" Q! b
            有符号32位数据
- F8 Y1 ~' I0 V% G* N- ~
            s16
* M7 Z6 Y) l" T7 v+ U! r
            int16_t ) o7 E; s1 H8 Q% h8 D* _
            有符号16位数据
# k9 r$ v' L* }) G1 d
            s8
3 ?- T/ u* l, R
            int8_t
9 Y- I) H8 K( M( f' F/ Q
            有符号8位数据2 Q1 ^6 ]# z8 R( q3 q3 V
            sc32 * y3 u9 [* W' s6 H$ _+ b: g  s
            const int32_t 0 {0 h" s9 K, F  G
            只读有符号32位数据
+ j( V4 ^* T" V) |* X3 c+ z
            sc16               const int16_t - N  ]* W0 @$ `" E/ L8 P. {
            只读有符号16位数据
, w$ C; }+ o: m" I) P
            sc8 6 D& l2 M) ~4 P6 b
            const int8_t 0 Z3 {) @4 u, g* ]/ m  P
            只读有符号8位数据
1 Q. T) M7 i2 C9 I' f% `
            vs32
7 q" d) L( d7 ?  C1 F
            __IO int32_t
# U6 X; Q8 d  w( R! s
易挥发读写访问有符号32位数据
+ F7 x2 U2 P8 m) m
            vs16
- G4 `  ~1 {4 f# F
            __IO int16_t / i* m- b) Z) f% b, {3 l7 u2 u
易挥发读写访问有符号16位数据, V3 C4 U7 P* f# T! ~! z
            vs8
  [) G* G0 t9 w+ Z3 U" \
            __IO int8_t + \( \$ Z+ @/ Y* v% G8 ^, ~* B3 J
易挥发读写访问有符号8位数据   
            vsc32 & L) y# [% E2 S, r
            __I int32_t ' ^* `- w& {' ^: ~- ^0 J: ^
易挥发只读有符号32位数据
) Q) F' \: U4 h9 Y" U- v8 u8 B  J, c, L
            vsc16 8 j. w2 H' P) ]2 A
            __I int16_t
5 }9 ^1 D9 c' Z& r: [
易挥发只读有符号16位数据
            vsc8             __I int8_t 2 N' U; R9 d, \( K% _: k9 P) c+ g
易挥发只读有符号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位数据  

& N8 ?' C( n' W+ u2 M( Z6 \4 a3 r! [: d( r! X7 q
注意出于兼容旧版本的目的文件”stm32f10x.h”中仍然定义了STM32F10xxx固件库原有数据类型。
$ O- J6 z# ?6 A0 L# Y2 l9 o
  文件”stm32f10x.h”中也定义了STM32F10xxx固件库专用类型.
6 Z; _5 Q2 {# s* q" u  j
它们是:typedef enum {FALSE = 0, TRUE = !FALSE} bool;
( [5 x4 y- i7 Y& F( G
typedef enum {RESET = 0, SET = !RESET} FlagStatus, ITStatus;   E4 y' j% R) |! g
typedef enum {DISABLE = 0, ENABLE = !DISABLE} FunctionalState;
' y) E  s* y; F( U" p# j#define IS_FUNCTIONAL_STATE(STATE) (((STATE) == DISABLE) || ((STATE) == ENABLE))
9 o! |9 }# t3 M, ~+ E
typedef enum {ERROR = 0, SUCCESS = !ERROR} ErrorStatus;

( z( v/ m$ F9 z8 T- W/ P0 R2 g- h) Y/ s; U1 E
; A! t/ C" c( K6 @

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
看一下: l+ i: b" L3 E4 N0 Y+ G
星辰一方 回答时间: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 0 x* j2 Y) Q, i+ U
12下一页

所属标签

相似分享

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版