STM32
直播中

张涛

7年用户 1338经验值
私信 关注
[问答]

编译器KEIL MDK的数据类型有哪些?

编译器KEIL MDK的数据类型有哪些?
STM32的数据类型有哪些?

回帖(1)

李娜

2021-11-30 10:02:36
STM32编程入门之编译器KEIL MDK的数据类型及两个重要关键词volatile & const
  本文适合刚刚入门的ST新手阅读,高手就不需要看了。哈哈
  首先说一下编程过程中几个步骤吧
  第一,选择一门语言,C语言或汇编语言,嵌入式编程一般目前流行还是C,这个需要基础与时间
  第二读懂了解 MCU的寄存器各寄存器的功能,尤其是一些IO口设置,各模块时钟设置比如定时器,I2C,同步异步串口,PWM等等,以前的话51的话没有这样设置。而现在MCU基本上各模块时钟都分开了。这个可以看官方数据说明书就可以了。
  其实程的目的就是设置一系列寄存器.并根据你设计程序流程去执行它,期间可能加入了你设计好的一些算法,和数学公式。进行计算,或执行。
  第三,你有一块你的开发板,你还需要下载程序的编程器。就是把编译器编译好的代码下载到你的目标实验板上,不过ST推的多数实验班都是自带USB串口的程序下载器。比如STM32F429就自带了
  第四,你还需要了解的是编译器,编译器的数据类型一些定义,及有些编译器的可能自带内建函数,这个不必须了解。否则无法编程。
  本文主要就介绍STM32的数据类型的基础知识。以及一些关键词的意义。
   ▲在KELI MDK数据类型中进了如下定义
  char                 占用1个字节
  short int         占用2字节
  int                   占用4字节
  long               占用4字节
  long int         占用4字节
  float               占用4字节
  double          占用8字节
  即有如下宏定义
  typedef unsigned char   uint8;     // 无符号8位字符型变量
  typedef  signed  char   int8;      // 有符号8位字符型变量
typedef  unsigned short  uint16;    // 无符号16位短整型变量
typedef  signed  short  int16;     // 有符号16位短整型变量
typedef  unsigned int    uint32;    // 无符号32位整型变量
typedef  signed  int    int32;     // 有符号32位整型变量

  typedef  float           fp32;      // 单精度浮点数(32位长度)
  typedef  double          fp64;      // 双精度浮点数(64位长度)
  
  注:C语言中的种类数据:整型:int short long 实型:float, double 。
  其中,Unsigned 为无符号, signed  有符号。
   ▲STM32的数据类型的宏定义
  STM32采用了大量的固件库,其中在2.0库中有24个数据类型如下
typedef  unsigned char u8;0~255一字节
  typedef  signed char s8;-128~127
  typedef  volatile unsigned char vu8;
  typedef  volatile signed char vs8;
  typedef  unsigned char const uc8;
  typedef  signed char const sc8;
  typedef  volatile unsigned char const vuc8;
  typedef  volatile signed char const vsc8;
  typedef  unsigned short u16; 0~65535两字节
  typedef  signed short s16; -32768~32767两字节
  typedef  volatile unsigned short vu16;
  typedef  volatile signed short vs16;
  typedef  unsigned short const uc16;
  typedef  signed short const sc16;
  typedef  signed short const sc16;
  typedef  volatile unsigned short const vuc16;
  typedef  volatile signed short const vsc16;
  typedef  unsigned long u32; 0~(2^32-1)四字节
  typedef  signed long s32;
  typedef  signed long const sc32;
  typedef  volatile unsigned long const vuc32;
  typedef  volatile signed long const vsc32;
  对部分数据类型后面作了注释,其它类型类推。
  ▲ 关于两个关键词说明 volatile& const
  (1)volatile :这个关键字,很多人只知道用,不知道其含义,有介绍解释是不易被编译器优
                    化的。在STM32资料中解释加了易挥发的变量。这些解释都是含糊不清的。
                    为此笔者专门查了下这个修饰关键字含义
  通俗的解释:    随时会改变,并被多函数调用可以加volatile修饰
                    简称易变变量或易挥发变量。
                   表示这个变量的真的很容易变。
  进阶解释:  加了这个volatile意义就是在每次取这个变量值的时候,要求不是取它上次在某个 时候取的临时缓存变量(比如说暂存在某个寄存器中),而是直接到内存中取。
  个人经验: 告诉编译器,volatile定义的变量必须RAM变量.不能是寄存器变量.
                尤其是中断中用   全局变量一定要加volatile。
  (2)const: 在定义变量时候,如果加上关键词const,则变量的值在程序运行期间不能改变,当然不能再赋值了。这种变量称为常变量(constant variable)或是只读变量(read-only-variable,这样觉得更恰当)。
   ▲  STM32F10x_StdPeriph_Driver 3.0以后的版本中使用了CMSIS数据类型
  3.0以后版本与之前版本变量的定义有所不同,但是出于兼容旧版本的目的,以上的数据类型仍然兼容。CMSIS的IO类型限定词如表 3所示,CMSIS和STM32固件库的数据类型对比如表 5所示。这些数据类型可以在
      STM32F10x_StdPeriph_Lib_V3.4.0LibrariesCMSISCM3DeviceSupportSTSTM32F10x
  stm32f10x.h中找到具体的定义。
  ▲ 数据类型和IO类型限定词
     Cortex-Mx HAL使用标准ANSI C头文件定义的标准类型。特别用类型限定词IO来访问外设的变量。
                                                                                表1 数据类型限定词IO
  
IO类型限定词
#define
描述
__I
volatile const
只读访问
__O
volatile
只写访问
__IO
volatile
读和写访问
▲ ST从库包中移除了文件”stm32f10x_type.h”,新的库使用CMSIS和定义的数据类型。
  表5展示了STM32F10xxx和之间数据类型的一一对应关系。
                                              表2  STM32F10xxx固件库V2.0.3CMSIS数据类型对比
  
STM32F10xxx固件库类型
CMSIS类型
描述
s32
int32_t
有符号32位数据
s16
int16_t
有符号16位数据
s8
int8_t
有符号8位数据
sc32
const int32_t
只读有符号32位数据
sc16
const int16_t
只读有符号16位数据
sc8
const int8_t
只读有符号8位数据
vs32
__IO int32_t
易挥发读写访问有符号32位数据
vs16
__IO int16_t
易挥发读写访问有符号16位数据
vs8
__IO int8_t
易挥发读写访问有符号8位数据
vsc32
__I int32_t
易挥发只读有符号32位数据
vsc16
__I int16_t
易挥发只读有符号16位数据
vsc8
__I int8_t
易挥发只读有符号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位数据
▲注意出于兼容旧版本的目的文件”stm32f10x.h”中仍然定义了STM32F10xxx固件库原有数据类型。
    文件”stm32f10x.h”中也定义了STM32F10xxx固件库专用类型.
  它们是:typedef enum {FALSE = 0, TRUE = !FALSE} bool;
  typedef enum {RESET = 0, SET = !RESET} FlagStatus, ITStatus;
  typedef enum {DISABLE = 0, ENABLE = !DISABLE} FunctionalState;
  #define IS_FUNCTIONAL_STATE(STATE) (((STATE) == DISABLE) || ((STATE) == ENABLE))
  typedef enum {ERROR = 0, SUCCESS = !ERROR} ErrorStatus;
举报

更多回帖

发帖
×
20
完善资料,
赚取积分