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

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

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

带你学STM32之中断入门理解——中断优先级NVIC理解


本文适合刚刚入门的ST新手阅读,高手就不需要看了。哈哈
首先说一下编程过程中几个步骤吧

第一,选择一门语言,C语言或汇编语言,嵌入式编程一般目前流行还是C,这个需要基础与时间

第二读懂了解 MCU的寄存器各寄存器的功能,尤其是一些IO口设置,各模块时钟设置比如定时器,I2C,同步异步串口,PWM等等,以前的话51的话没有这样设置。而现在MCU基本上各模块时钟都分开了。这个可以看官方数据说明书就可以了。
其实程的目的就是设置一系列寄存器.并根据你设计程序流程去执行它,期间可能加入了你设计好的一些算法,和数学公式。进行计算,或执行。

第三,你有一块你的实验板就如这次STM32推的F429,你还需要下载程序的编程器。就是把编译器编译好的代码下载到你的目标实验板上,不过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;/*无符号8位变量**/0~255一字节

typedef signed char s8;/**有符号8位变量*/-128~127

typedef volatile unsigned char vu8;/* 易变的8位无符号变量**/

typedef volatile signed char vs8;/* 易变的8位有符号变量*/

typedef unsigned char const uc8; /* 只读的8位无符号变量 */

typedef signed char const sc8; /* 只读的8位有符号变量 */

typedef volatile unsigned char const vuc8; /* 易变只读的8位无符变量*/

typedef volatile signed char const vsc8; /* 易变只读8位有符号变量 */

typedef unsigned short u16; /*16位短整型无符号变量**/0~65535两字节

typedef signed short s16; /*16位短整型有符号变量**/-32768~32767两字节

typedef volatile unsigned short vu16;

typedef volatile signed short vs16;

typedef unsigned short const uc16; /* Read Only */

typedef signed short const sc16; /* Read Only */

typedef signed short const sc16; /* Read Only */

typedef volatile unsigned short const vuc16; /* Read Only */

typedef volatile signed short const vsc16; /* Read Only */

typedef unsigned long u32; /*32位长整型无符号变量**/0~(2^32-1)四字节

typedef signed long s32; /*[(-2^32)/2]~ [(-2^32)/2-1]四字节

typedef volatile unsigned long vu32;

typedef volatile signed long vs32;

typedef unsigned long const uc32; /* Read Only */

typedef signed long const sc32; /* Read Only */

typedef volatile unsigned long const vuc32; /* Read Only */

typedef volatile signed long const vsc32; /* Read Only */

对部分数据类型后面作了注释,其它类型类推。



关于两个关键词说明 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.0\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x

\stm32f10x.h中找到具体的定义。

数据类型和IO类型限定词
   Cortex-Mx HAL使用标准ANSI C头文件定义的标准类型。特别用类型限定词IO来访问外设的变量。         表3 数据类型限定词IO
            
IO类型限定词

            
            
#define

            
            
描述

            
            __I
            volatile const
            只读访问
            __O
            volatile
            只写访问
            __IO
            volatile
            读和写访问


ST从库包中移除了文件”stm32f10x_type.h”,新的库使用CMSIS定义的数据类型。
5展示了STM32F10xxx之间数据类型的一一对应关系。
     5  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;



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

下载

171.61 KB, 下载次数: 390

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

举报

24个回答
alan 回答时间: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
谢谢!!!
QianFan 回答时间:2014-12-6 19:58:20
在keil中,软件延时不加volatile可以,但是在gcc编译器中,不加volatile是不行的,在gcc中,不加volatile的软件也是是被优化掉的。在这方面吃过亏。之前支持到外设的定义要加volatile,没注意到这里。
数码小叶 回答时间:2014-12-7 19:16:25
学习学习
梦想家的秘密 回答时间:2015-2-10 13:43:39
看一下
123下一页

所属标签

STM32团队

意法半导体微控制器和微处理器拥有广泛的产品线,包含低成本的8位单片机和基于ARM® Cortex®-M0、M0+、M3、M4、M33、M7及A7内核并具备丰富外设选择的32位微控制器及微处理器


最新内容

相似技术帖

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版