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

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

[复制链接]
alan_bach 发布时间: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个回答
党国特派员 回答时间: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
看一下
星辰一方 回答时间: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
12下一页

所属标签

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