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

STM32的变量定义(搞通STM32必须要理解透,这是基础)

[复制链接]
wambob 发布时间:2015-1-8 11:56
http://forum.eepw.com.cn/thread/215752/1原文地址

今天调试程序时,想观察一下变量的情况,突然发现平时经常移植别人程序时最容易忽略的一个致命问题,那就是忽略变量类型,这里有必要给大家一定知识啦,都是库里面的,非原创!


3.0以后的版本中使用了CMSIS数据类型,变量的定义有所不同,但是出于兼容旧版本的目的,以上的数据类型仍然兼容。CMSIS的IO类型限定词如表 5‑7所示,CMSIS和STM32固件库的数据类型对比如表 5‑8所示。这些数据类型可以在STM32F10x_StdPeriph_Lib_V3.4.0\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\stm32f10x.h中找到具体的定义,此部分定义如下。
1 /*!< STM32F10x Standard Peripheral Library old types (maintained for legacy purpose) */ 2  3 typedef int32_t s32; 4  5 typedef int16_t s16; 6  7 typedef int8_t s8; 8  9 typedef const int32_t sc32; /*!< Read Only */10 11 typedef const int16_t sc16; /*!< Read Only */12 13 typedef const int8_t sc8; /*!< Read Only */14 15 typedef __IO int32_t vs32;16 17 typedef __IO int16_t vs16;18 19 typedef __IO int8_t vs8;20 21 typedef __I int32_t vsc32; /*!< Read Only */22 23 typedef __I int16_t vsc16; /*!< Read Only */24 25 typedef __I int8_t vsc8; /*!< Read Only */26 27 typedef uint32_t u32;28 29 typedef uint16_t u16;30 31 typedef uint8_t u8;32 33 typedef const uint32_t uc32; /*!< Read Only */34 35 typedef const uint16_t uc16; /*!< Read Only */36 37 typedef const uint8_t uc8; /*!< Read Only */38 39 typedef __IO uint32_t vu32;40 41 typedef __IO uint16_t vu16;42 43 typedef __IO uint8_t vu8;44 45 typedef __I uint32_t vuc32; /*!< Read Only */46 47 typedef __I uint16_t vuc16; /*!< Read Only */48 49 typedef __I uint8_t vuc8; /*!< Read Only */

CMSIS IO类型限定词
IO类限定词#define描述
_Ivolatile const只读访问
_Ovolatile只写访问
_IOvolatile读和写访问

固件库与CMSIS数据类型对比
固件库类型CMSIS类型描述
s32int32_t易挥发只读有符号32位数据
s16int16_t易挥发只读有符号16位数据
s8int8_t易挥发只读有符号8位数据
sc32const int32_t只读有符号32位数据
sc16const int16_t只读有符号16位数据
sc8const 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位数据
u32uint32_t无符号32位数据
u16uint16_t无符号16位数据
u8uint8_t无符号8位数据
uc32const uint32_t只读无符号32位数据
uc16const uint16_t只读无符号16位数据
uc8const 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文件中还包含了常用的布尔形变量定义,如:
1 typedef enum {RESET = 0, SET = !RESET} FlagStatus, ITStatus;
2
3 typedef enum {DISABLE = 0, ENABLE = !DISABLE} FunctionalState;
4
5 #define IS_FUNCTIONAL_STATE(STATE) (((STATE) == DISABLE) || ((STATE) == ENABLE))
6
7 typedef enum {ERROR = 0, SUCCESS = !ERROR} ErrorStatus;


不同版本的标准外设库的变量定义略有不同,如3.4版本中就没有之前版本的TRUE和FALSE的定义,用户也可以根据自己的需求按照上面的格式定义自己的布尔形变量。在使用标准外设库进行开发遇到相关的定义问题时应首先找到对应的头文件定义。

收藏 2 评论16 发布时间:2015-1-8 11:56

举报

16个回答
晓枫VS枯叶 回答时间:2015-1-8 12:01:02
总结的不错,貌似现在用的比较多的事CMSIS的定义......
netlhx 回答时间:2015-1-8 12:07:36
不错,不过用好 代码追踪功能,这些都可以在IDE里找到
红玫瑰的偏爱 回答时间:2015-1-8 12:13:09
wambob 回答时间:2015-1-8 12:13:45
这是转载,我觉得很有道理,对新手有帮助吧,有时候下载的例程吧,出现很多错误.有的是变量类型的问题,有的是变量大小写的问题
天天晓宇 回答时间:2015-1-8 12:28:23
我用的就是cmsis的定义
wambob 回答时间:2015-1-8 12:36:25
天天晓宇 发表于 2015-1-8 12:28
我用的就是cmsis的定义

两个定义不一样,为什么分家啊
bldc小菜鸟 回答时间:2015-1-8 12:37:31
总结得很好,赞一个!
coolblood 回答时间:2015-1-8 12:57:36
厉害。总结的很好
pythonworld 回答时间:2015-1-8 13:10:04
两个定义不一样,为什么分家啊? 同问!
12下一页

所属标签

STM32团队

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


最新内容

相似技术帖

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