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.eeworld.com.cn/mcu/ic481623.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

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

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

推荐阅读

简析stm32启动过程
说明:本文是杰杰以前保存下来的,出处已经不知道在哪了,应该是各大论坛中,当然转这种文章,到处都有。今天我就把它重写一遍。基于原作者的内容添加一些内容(源码)讲解。杰杰水平有限,出错在所难免,还望各位大神指点一二。startup_stm32f10x_cl.s互联型的STM32F105xx,STM32F107xxstartup_stm32f10x_hd.s 大容量的STM32F101xx,STM32F102xx,STM32F103xxstartup_stm32f10x_hd_vl.s 大容量的STM32F100xxstartup_stm32f10x_ld.s 小容量的STM32F101xx,STM32
发表于 2019-12-14
简析stm32启动过程
【干货】老外的GitHub整理的stm32f4驱动库
昨晚在github发现了一个老外自己整理的封装库,有很多,比如一些通讯啊啥的,一些显示屏驱动等等目录STM32F4Libraries and projectsHere are listed all libraries for STM32F4 devices.Libraries are designed to work with STM32F4xx series of MCU. Every project hereis created with Keil uVision, but tested with GCC compiler too (Coocox). Eachproject includes 4 targets
发表于 2019-12-14
【干货】老外的GitHub整理的stm32f4驱动库
基于Linux的kfifo移植到STM32(支持os的互斥访问)
关于kfifokfifo是内核里面的一个First In First Out数据结构,它采用环形循环队列的数据结构来实现;它提供一个无边界的字节流服务,最重要的一点是,它使用并行无锁编程技术,即当它用于只有一个入队线程和一个出队线程的场情时,两个线程可以并发操作,而不需要任何加锁行为,就可以保证kfifo的线程安全。具体什么是环形缓冲区,请看我以前的文章说明关于kfifo的相关概念我不会介绍,有兴趣可以看他的相关文档,我只将其实现过程移植重写,移植到适用stm32开发板上,并且按照我个人习惯重新命名,RingBuff->意为环形缓冲区RingBuff_t环形缓冲区的结构体成员变量,具体含义看注释。buffer: 用于存放
发表于 2019-12-14
STM32之重定向printf
学习stm32,打交道最多的莫过于串口通讯了,但是官方的串口发送库太恶心了,完全不好用甚是还念C语言的printf,想输出什么就有什么,现在,一步步来做个重定向,让你的stm32可以跟C语言一样能想看什么就看什么:首先:添加printf的头文件 :#include <stdio.h>    //当时学C语言最熟悉的stdio.h其次:改写int fputc(int ch, FILE *f)函数int fputc(int ch, FILE *f);int fputc(int ch, FILE *f){USART_SendData(USARTx, (uint8_t) ch);while
发表于 2019-12-14
STM8L051F3_02_EXTI应用
本章介绍STM8L051F3的EXTI相关知识,内容分为以下几部分:EXTI简介KEY外部中断检测1、EXTI简介EXTI也是属于GPIO的知识点,应用比较广泛。STM8L051F3每个I/O口在输入模式下都能配置为中断,在这个配置下,一个信号沿或电平输入到I/O口上将产生一个中断请求。外部中断只有在端口的输入模式下才有效。可通过配置寄存器Px_CR2相应的位来独立地使能或禁能某个端口的外部中断功能。另外,可通过ADC_TDRH和ADC_TDRL寄存器来禁用施密特触发器节省功耗。2、KEY外部中断检测2.1 KEY的外部中断配置本小节介绍将GPIO配置为外部中断输入模式,并通过KEY(PC4)来触发一个外部中断信号,然后产生中
发表于 2019-12-14
STM8L051之通过ADC1与DMA读取内部参考电压
stm8L051芯片内部的参考电压与电源电压有一定的关系这在芯片供电电压变化的情况下,测量外部ADC电压输入提供一个确定的参考电压。这里提前厘清下:该内部参考电压VREFINT 并非ADC 的参考电压,ADC 的参考电压依然是VDD。即使VDD 有所波动,这个VREFINT 电压恒定不变,对于ADC 电路而言,它只是个测试点。 对于某固定的ADC 参考电压情况下,所有被测电压点的AD转换值与该点电压值保持同一比例关系,换句话说,对于ADC参考电压固定情况下,各点的电压与ADC值与成线性关系。下面图形是芯片分别在3个不同参考电压的示意图,这里参考电压接VDD。下面三根斜线分别是VDD 为2.8V、3.2V、3.6V 时的
发表于 2019-12-14
STM8L051之通过ADC1与DMA读取内部参考电压
小广播
何立民专栏 单片机及嵌入式宝典

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

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2019 EEWORLD.com.cn, Inc. All rights reserved