STM32 数据类型定义

2019-11-30来源: eefocus关键字:STM32  数据类型定义  编译器

在 Keil MDK 开发环境中,经常会遇到类似于unsigned int 8、uint8_t 、u8等数据变量定义,对于初学者来讲确实是有点痛苦,后来查询发现以上三种方式均表示——无符号的8位整形数据。


由于C语言类型的长度完全由编译器决定,char 通常被定义成 8 位宽;int 通常被定义成 16 位或 32 位宽(或更高),它取决于平台(编译器将在这两者间选择最合适的字宽);short 通常被定义成 16 位宽;long 通常被定义成 32 或 64位宽。

所以 C99 中引进了一个标准C库头文件 stdint。h ,方便精确确定整数类型的宽度


定义标准的扩展整数类型_stdint.h文件(部分)


/* Signed。 */  

/* There is some amount of overlap with as known by inet code */  

#ifndef __int8_t_defined  

# define __int8_t_defined  

typedef signed char     int8_t;  //标准表达方式 signed char 被等同于 int8_t;

typedef short int       int16_t;  

typedef int         int32_t;  

# if __WORDSIZE == 64  

typedef long int        int64_t;  

# else  

__extension__  

typedef long long int       int64_t;  

# endif  

#endif  

/***************************************/ 

/* Unsigned。 */  

typedef unsigned char       uint8_t;  

typedef unsigned short int uint16_t;  

#ifndef __uint32_t_defined  

typedef unsigned int        uint32_t;  

# define __uint32_t_defined  

#endif  

#if __WORDSIZE == 64  

typedef unsigned long int   uint64_t;  

#else  

__extension__  

typedef unsigned long long int uint64_t;  

#endif  

 /***************************************/ 

/* Small types。 */   

/* Signed。 */  

typedef signed char     int_least8_t;  

typedef short int       int_least16_t;  

typedef int         int_least32_t;  

#if __WORDSIZE == 64  

typedef long int        int_least64_t;  

#else  

__extension__  

typedef long long int       int_least64_t;  

#endif  

/***************************************/ 

/* Unsigned. */  

typedef unsigned char       uint_least8_t;  

typedef unsigned short int uint_least16_t;  

typedef unsigned int        uint_least32_t;  

#if __WORDSIZE == 64  

typedef unsigned long int   uint_least64_t;  

#else  

__extension__  

typedef unsigned long long int uint_least64_t;  

#endif  


/***************************************/   

/* Fast types. */  

/* Signed. */  

typedef signed char     int_fast8_t;  

#if __WORDSIZE == 64  

typedef long int        int_fast16_t;  

typedef long int        int_fast32_t;  

typedef long int        int_fast64_t;  

#else  

typedef int         int_fast16_t;  

typedef int         int_fast32_t;  

__extension__  

typedef long long int       int_fast64_t;  

#endif  

/***************************************/  

/* Unsigned. */  

typedef unsigned char       uint_fast8_t;  

#if __WORDSIZE == 64  

typedef unsigned long int   uint_fast16_t;  

typedef unsigned long int   uint_fast32_t;  

typedef unsigned long int   uint_fast64_t;  

#else  

typedef unsigned int        uint_fast16_t;  

typedef unsigned int        uint_fast32_t;  

__extension__  

typedef unsigned long long int uint_fast64_t;  

#endif  


/***************************************/  

/* Types for `void *' pointers. */  

#if __WORDSIZE == 64  

# ifndef __intptr_t_defined  

typedef long int        intptr_t;  

# define __intptr_t_defined  

# endif  

typedef unsigned long int   uintptr_t;  

#else  

# ifndef __intptr_t_defined  

typedef int         intptr_t;  

# define __intptr_t_defined  

# endif  

typedef unsigned int        uintptr_t;  

#endif  


/***************************************/   

/* Largest integral types. */  

#if __WORDSIZE == 64  

typedef long int        intmax_t;  

typedef unsigned long int   uintmax_t;  

#else  

__extension__  

typedef long long int       intmax_t;  

__extension__  

typedef unsigned long long int uintmax_t;  

#endif  


*_t结尾的类型,可以理解为type/typedef的缩写,就是一个结构标注,表示是通过typedef定义的,而不是其它数据类型。(程序的可扩展性)

blob.png

这样定义的好处在于使用时不会感觉太混乱,从而能有效的维护代码。

blob.png

类型说明 

int_least16_t : 指获得一个当前平台所支持的至少有 16 位宽的最短整数类型。

int_fast32_t : 指获得当前平台下需要处理速度最快的至少为 32 位的整数类型。

intmax_t : 指获得当前平台所支持的最大宽度的整数类型。

intptr_t (无符号uintptr_t): 为安全跨平台编程的保证,对于写跨 64 位平台的程序非常重要,是指针和整数之间的转换经常用到(多用于需要精确控制数据在内存中的精确布局时)。换句话说,当需要把指针作为一个整数来运算时,转换成intptr_t才是安全的,然后在运算完毕后再安全的转回指针类型。


blob.png

volatile


   作为指令关键字,确保本条指令不会因编译器的优化而省略,且要求每次直接读值。

   俗称禁止程序优化,一般在进行多线程程序设计时加,就是在有中断的程序中常见,并且是中断程序所用变量一般用这个加以修饰。

   简单的说,就是不让编译器进行优化,即每次读取或者修改值的时候,都必须重新从内存或者寄存器中读取或者修改。


volatile一般用在以下三个方面:


中断标志位


多线程共享的变量


状态寄存器


const


    是一个C语言的关键字,它限定一个变量不允许被改变

    只读变量,即变量保存在只读静态存储区。编译时,如何尝试修改只读变量,则编译器提示出错,就能防止误修改。


const与define


两者都可以用来定义常量,但是const定义时,定义了常量的类型,所以更精确一些(其实const定义的是只读变量,而不是常量)。

#define只是简单的文本替换,除了可以定义常量外,还可以用来定义一些简单的函数,有点类似内置函数。

const和define定义的常量可以放在头文件里面。(小注:可以多次声明,但只能定义一次)

const与指针


int flag;   

const int * p1=&flag;       //p1可变,*p1不可变             const 修饰的是 *p1,即*p1不可变

int * const p2=&flag;       //p2不可变,*p2可变             const 修饰的是 p2,即p2不可变

const int *const p3=&flag;  //p3不可变,*p3也不可变          前一个const 修饰的是 *p3,后一个const 修饰的是p3,两者都不可变


关键字:STM32  数据类型定义  编译器 编辑:什么鱼 引用地址:http://news.pyfle.com/mcu/ic481623.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:STM32库函数详解----(通用输入/输出GPIO)
下一篇:stm32局部变量过大,导致栈溢出

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

开发STM32MP1,没有一块好的开发办怎么行
STM32MP1系列的出现吸引了很多STM32的新老用户的关注,但是很多的人都会担心一个问题:以前是基于Cortex M系列MCU惊醒开发,对于cortex-A架构的处理器以及Linux系统都不熟悉。如何高效地从MCU跨越到MPU是大家都关心的话题。 作为ST官方合作伙伴,米尔电子推出了开发套件MYD-YA157C,该套件由核心板MYC-YA157C和底板MYB-YA157C组成。该平台采用STM32MP157系列高性能处理器,提供了高性能显示,千兆以太网,WIFI/蓝牙,RS232/RS485/CAN等丰富接口。贴合应用场景的产品定义,稳定可靠的硬件设计,丰富的软件和学习资源,能帮助大家轻松实现跨越,是一块值得推荐
发表于 2020-01-09
开发STM32MP1,没有一块好的开发办怎么行
stm8s输入捕获
输入捕获,简而言之,即 记录信号到来时刻的CNTR的值,然后把该值传给CCR。下面以PC1为例,代码如下:    TIM1_CR1_DIR = 0;//计数器向上计数    TIM1_IER_UIE = 1;//使能TIM1溢出中断      TIM1_PSCRH = 0x00;    TIM1_PSCRL = 0x05; //配置TIM1为6分频->0.75us记一次数     TIM1_ARRH = 0xFF;     TIM1_ARRL = 0xFF; //自动重
发表于 2020-01-09
STM32F10x_硬件I2C读写EEPROM(标准外设库版本)
Ⅰ、写在前面上一篇文章是“STM32F10x_模拟I2C读写EEPROM”,讲述使用IO口模拟I2C总线通信,对EEPROM(AT24Xxx)进行读写操作的过程。上一篇文章主要内容:I2C协议、模拟I2C底层驱动、EEPROM(AT24Xxx)单字节读写操作。本文主要内容:STM32硬件I2C详细配置、EEPROM(AT24Xxx)多字节读写操作、ST官方I2C存在问题。实例实验效果:1、多字节读写:任意地址(66), 写入任意长度(129)、读取并打印出来2、单字节读写:任意地址(0),写入1字节数据、 读取并打印出来实验说明:1.多字节读写实验为什么是从66地址写? 为什么是写入129字节?答案:验证对EEPROM多字节
发表于 2020-01-09
STM32F10x_硬件I2C读写EEPROM(标准外设库版本)
STM32系统学习——I2C (读写EEPROM)
I2C 通讯协议(Inter-Integrated Circuit)引脚少,硬件实现简单,可扩展性强,不需要 USART、CAN 等通讯协议的外部收发设备,现在被广泛地使用在系统内多个集成电路(IC)间的通讯。 在计算机科学里,大部分复杂的问题都可以通过分层来简化。如芯片被分为内核层和片上外设;STM32 标准库则是在寄存器与用户代码之间的软件层。对于通讯协议,我们也以分层的方式来理解,最基本的是把它分为物理层和协议层。 物理层规定通讯系统中具有机械、电子功能部分的特性,确保原始数据在物理媒体的传输。协议层主要规定通讯逻辑,统一收发双方的数据打包、解包标准。简单来说物理层规定我们用嘴巴还是用肢体来交流,协议层
发表于 2020-01-09
STM32系统学习——I2C (读写EEPROM)
STM8的IAP在线升级
IAP(In Application Program)在线应用编程官方资料(STVD开发环境):例程AN2659,《 AN2659 Application Note.pdf 》要实现在线升级,MCU代码须分为 : bootloader和 用户代码App 两个部分。图1.STM8下IAP程序的存储方式用户启动区域(UBC): (可理解为用户自定义的bootloader的存放区域)包含有复位和中断向量表,它可用于存储IAP及通讯程序。UBC有一个两级保护结构可保护用户代码及数据在IAP编程中免于无意的擦除或修改。这意味着该区域总是写保护的,而且写保护不能通过使用MASS密钥来解锁。它的大小可通过配置option bytes 设置
发表于 2020-01-09
STM8的IAP在线升级
STM8做BUS OFF快慢恢复策略
前言:CAN总线上出现错误会导致CAN控制器进入BUS OFF状态,具体的可以参考CAN的规范。CAN控制器提供自动恢复和手动恢复功能。1.自动恢复自动恢复比较简单,初始化的时候打开自动恢复功能。要求不高的话建议打开,否则CAN BUS OFF一直无法恢复通信。CAN->MCR |= CAN_MasterCtrl_AutoBusOffManagement;/*atuo bus off recovery */2.手动恢复一般车厂要求ECU不能自动恢复,而是先快恢复后慢恢复。常用的就是:先100ms恢复5次,然后是1000ms恢复一次。具体的就是:(1)发生BUS OFF后,立即关闭TX,然后重置CAN控制器(2)快恢复次数+1(
发表于 2020-01-09
小广播
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2019 EEWORLD。com。cn, Inc。 All rights reserved
上海11选5 上海快3走势图 快乐赛车计划群 快乐赛车大战破解版 快乐赛车冠军公式规律 快乐赛车哪个网站有 快乐飞艇有官方吗 快乐飞艇哪里开的 快乐飞艇如何玩才能盈利 吉林快3计划