关于STM32的变量定义
STM32变量类型
STM32变量类型
在STM32开发中,变量类型是非常重要的概念。正确选择合适的变量类型,不仅可以提高代码的可读性和效率,还能节省宝贵的内存资源。本文将从整数、浮点数和其他常见的变量类型等方面介绍STM32中常用的变量类型。
1. 整数类型
在STM32中,整数类型用于表示没有小数部分的数字。常见的整数类型有:
- int:使用4个字节表示,范围是-2147483648到2147483647。
- short int:使用2个字节表示,范围是-32768到32767。
- long int:使用8个字节表示,范围是-9223372036854775808到9223372036854775807。
在选择整数类型时,根据实际需求选择合适的范围,以充分利用内存空间。
2. 浮点数类型
在STM32中,浮点数类型用于表示带有小数部分的数字。常见的浮点数类型有:
- float:使用4个字节表示,能够表示6到7位有效数字。
- double:使用8个字节表示,能够表示15到16位有效数字。
浮点数类型相比于整数类型,能够更精确地表示小数,但占用的内
存空间更大。因此,在选择浮点数类型时,需要根据精确度和内存占
用的折衷来进行选择。
3. 无符号整数类型
在STM32中,无符号整数类型用于表示仅有正数的数字。常见的
无符号整数类型有:
- unsigned int:使用4个字节表示,范围是0到4294967295。
- unsigned short int:使用2个字节表示,范围是0到65535。
- unsigned long int:使用8个字节表示,范围是0到18446744073709551615。
stm32布尔变量定义
stm32布尔变量定义
STM32布尔变量
定义
•布尔变量是一种逻辑数据类型,用于表示真值(true)或假值(false)。
•在STM32开发中,布尔变量通常用于逻辑判断和条件控制。
理由
•使用布尔变量可以简化逻辑判断的操作,并且提高代码的可读性。•STM32芯片作为嵌入式系统的一种常用解决方案,其资源有限,因此在编写代码的时候需要考虑节省资源的问题。布尔变量在内
存和处理器时间上的消耗较小,非常适合在STM32中使用。
书籍推荐
•《嵌入式系统设计与应用》
–作者:王钟燕、王文兴、徐卫
–该书详细介绍了嵌入式系统的设计原理、编程技术和计算机硬件知识。其中包括了对STM32开发的简单介绍,并提
供了大量的STM32应用实例供读者参考。这本书适合初学
者和资深工程师阅读,对于理解STM32布尔变量的定义和
应用场景很有帮助。
•《STM32F103精英入门》
–作者:秦安宁
–该书主要介绍了STM32F103系列芯片的基本知识和编程方法。其中涉及到了布尔变量的定义和使用方法,并且提供
了实际应用案例进行讲解。这本书对于想要深入了解
STM32布尔变量的程序员和电子爱好者来说,是一本不可
多得的好书。
•《精通STM32F4开发》
–作者:冯学伟
–本书通过详细的项目实例,全面介绍了STM32F4系列芯片的硬件原理、软件编程和应用实践。其中包括了布尔变量
的定义和使用方法,并提供了一些常见的STM32F4相关编
程技巧。这本书适合有一定STM32开发基础的工程师和学
习者阅读,对于深入理解STM32布尔变量的用法有很大帮
助。
结论
在STM32开发中,布尔变量是一种重要的数据类型,用于逻辑判
stm32 原子变量
stm32 原子变量
STM32是一种广泛应用于嵌入式系统中的微控制器。在STM32的编程中,原子变量是一个重要的概念。本文将介绍什么是STM32原子变量以及其在嵌入式系统中的应用。
我们来了解什么是原子变量。原子变量是指在多线程编程中可以被原子地访问和修改的变量。在单个指令周期内,原子变量的读取和写入是不可分割的,不会被其他线程中断。这样可以避免多线程访问共享变量时产生的竞争条件和数据不一致问题。
在STM32中,原子变量是通过使用特殊的指令来实现的。这些指令保证了对原子变量的读取和写入是原子操作,即不可中断的。在多线程环境下,使用原子变量可以避免由于并发访问共享资源引起的数据竞争和数据不一致的问题。
在嵌入式系统中,原子变量的应用非常广泛。首先,原子变量可以用于实现线程间的同步和互斥操作。例如,在多个线程同时访问某个共享资源时,可以使用原子变量来保证只有一个线程能够访问该资源,从而避免数据竞争和数据不一致的问题。
原子变量还可以用于实现计数器和标志位等功能。例如,在一个任务中需要对某个事件进行计数,可以使用原子变量来实现计数器的功能。又如,在一个任务中需要设置某个标志位,可以使用原子变量来实现标志位的设置和清除操作。这些功能在嵌入式系统中非常
常见,使用原子变量可以保证它们的操作是原子的,不会被其他线程中断。
原子变量还可以用于实现硬件的原子操作。例如,在某些特定的硬件操作中,需要保证一系列的写入和读取操作是不可中断的。这时可以使用原子变量来实现硬件的原子操作,从而保证操作的正确性和可靠性。
STM32CUBEIDE如何将变量定义到指定内存地址
STM32CUBEIDE如何将变量定义到指定内存地址
使⽤场景如下:
我需要将bootloader/APP的版本号和⼀些字段信息定义到指定FLASH地址.
在STM32CubeIDE中的⽅法:
截⽌当前STM32CubeIDE还没有提供图形化的针对FLASH划分定义的⽀持选项, 所以第⼀步我们需要⼿动更改 .ld⽂件 (链接⽂件).原⽂件如下(部分):
/* Memories definition */
MEMORY
{
CCMRAM (xrw) : ORIGIN = 0x10000000, LENGTH = 64K
RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 128K
FLASH (rx) : ORIGIN = 0x8000000, LENGTH = 64K
}
修改后:
/* Memories definition */
MEMORY
{
CCMRAM (xrw) : ORIGIN = 0x10000000, LENGTH = 64K
RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 128K
FLASH (rx) : ORIGIN = 0x8000000, LENGTH = 8K
VERSION_FLASH (rx) : ORIGIN = 0x8002000, LENGTH = 1K
REMFLASH (rx) : ORIGIN = 0x8002400, LENGTH = 55K
}
/* Sections */
SECTIONS
{
/* The startup code into "FLASH" Rom type memory */
如何设置STM32单片机非初始化数据变量不被零初始化
如何设置STM32单片机非初始化数据变量不被零初始化
一些产品,当系统复位后(非上电复位),可能要求保持住复位前RAM中的数据,用来快速恢复现场,或者不至于因瞬间复位而重启现场设备。而keil mdk在默认情况下,任何形式的复位都会将RAM区的非初始化变量数据清零。
在给出方法之前,先来了解一下代码和数据的存放规则、属性,以及复位后为何默认非初始化变量所在RAM都被初始化为零了呢。
什么是初始化数据变量,什么又是非初始化数据变量?(因为我的文字描述不一定准确,所以喜欢举一些例子来辅助理解文字。)
定义一个变量:int nTimerCount=20;变量nTImerCount就是初始化变量,也就是已经有初值;
如果定义变量:int nTImerCount;变量nTImerCount就是一个非赋值的变量,Keil MDK默认将它放到属性为ZI的输入节。
那么,什么是“ZI”,什么又是“输入节”呢?这要了解一下ARM映像文件(image)的组成了,这部分内容略显无聊,但我认为这是非常有必要掌握的。
ARM映像文件的组成:
一个映像文件由一个或多个域(region,也有译为“区”)组成
每个域包含一个或多个输出段(secTIon,也有译为“节”)
每个输出段包含一个或多个输入段
各个输入段包含了目标文件中的代码和数据
输入段中包含了四类内容:代码、已经初始化的数据、未经过初始化的存储区域、内容初始化为零的存储区域。每个输入段有相应的属性:只读的(RO)、可读写的(RW)以及初始化成零的(ZI)。
一个输出段中包含了一些列具有相同的RO、RW和ZI属性的输入段。输出段属性与其中包含的输入段属性相同。
STM32单片机库函数结构体详解
STM32单片机库函数结构体详解
在学习STM32F103的过程中,经常用到库函数,尤其遇到如下的结构体定义语句,如何理解。本文将解释清楚这类结构体的定义。
typedef struct
{
uint32_t x;
uint16_t y;
uint8_t z;
} Sname;
对于以上程序,包含三部分,如下图1所示,包括3部分,分别是typedef、struct{... }和Sname。
图1
(1)typedef是C语言的关键字,其用途是为一种数据类型定义一个新名字,主要是将较复杂的数据类型定义为易记且意义明确的新名字。
通常,我们定义一个变量,如定义一个无符号的整形变量x,则c语言中表示如下:unsigned int x; 数据类型unsigned int比较复杂,因此可以使用typedef
用一个简单的名字重新定义。如:typedef unsigned int uint32_t; 即用uint32_t代表unsigned int。则unsigned int x; 可以表示为uint32_t x;
uint16_t x和uint8_t x也同样是这样的定义。如下所示。
typedef unsigned short uint16_t;
typedef unsigned char uint8_t;
(2)struct也是C语言的关键字,其用途是将具有不同数据类型的变量打包管理,作为结构体。参照上文(1)中变量定义,结构体变量定义为struct Sname;Sname是变量名。为了增加不同数据类型的结构体成员,将成员增加在大括号{ }内,{ }内的内容是结构体的成员变量。如下所示。
stm32 const用法
stm32 const用法
STM32的const用法是指将变量声明为常量,不可修改。常量在程序运行期间不会发生变化,这在嵌入式系统开发中非常有用。常量声明为const后,在程序中任何尝试修改它的操作都会导致编译错误。
声明常量的语法格式如下:
```c
const <data_type> <variable_name> = <value>;
```
其中,`<data_type>`是常量的数据类型,`<variable_name>`是常量的名称,`<value>`是常量的值。
常量可以应用于各种数据类型,包括基本数据类型(如整数、浮点数、字符)以及结构体和枚举类型。
下面是一些常见的常量用法示例:
1. 声明整数型常量
```c
const int MAX_VALUE = 100;
const int MIN_VALUE = 0;
```
2. 声明浮点型常量
```c
const float PI = 3.14159;
const float E = 2.71828;
```
3. 声明字符型常量
```c
const char NEWLINE = '\n';
const char TAB = '\t';
```
4. 声明枚举常量
```c
enum Weekday {
MONDAY,
TUESDAY,
WEDNESDAY,
THURSDAY,
FRIDAY,
SATURDAY,
SUNDAY
};
const enum Weekday TODAY = TUESDAY; ```
STM32中static和extern
STM32中static和extern
今天⽤串⼝通信接收蓝⽛的数据并产⽣中断,发现⼀直卡在某个莫名其妙的启动⽂件上,检查了很多遍多没有发现问题,最后发现问题在接受数据的变量只是局部变量,且没有赋初值,于是,程序只在中断函数运⾏,所以,以后写变量⼀定要初始化,
void USART1_IRQHander(void)
{
static u8 r;
TIM_Cmd(TIM1,DISABLE);//¹Ø±Õ¶¨Ê±Æ÷
if(USART_GetITStatus(USART1,USART_IT_RXNE) == SET)
{
r = USART_ReceiveData(USART1);
USART_SendData(USART1,r);
if(r == 'a')
{
PWMA += 100;
if(PWMA >7199)
{
PWMA = 5000;
}
}
if(r == 'c')
{
PWMA -= 100;
if(PWMA <5000)
{
PWMA = 5000;
}
}
if(r == 'b')
{
PWMB += 100;
if(PWMB >7199)
{
PWMB = 5000;
}
}
while(USART_GetITStatus(USART1,USART_IT_TC) != SET);
}
USART_ClearITPendingBit(USART1,USART_FLAG_TC);
TIM_Cmd(TIM1,ENABLE);//¿ªÆô¶¨Ê±Æ÷
}
再来说说static与extern
static在函数内部声明变量会使其初始化为0,并且下次调⽤该变量的值时为上次的变量值,但只能在同⽂件内传递变量值,若⽤static声明静态全局变量,这⽤法和静态局部变量⼀致,
stm32cubeide 中数据类型定义
stm32cubeide 中数据类型定义在STM32CubeIDE中,有很多数据类型的定义,这些数据类型用于存储和操作不同类型的数据,如整数、浮点数、字符等。接下来,我将详细介绍一些常见的数据类型以及它们在STM32CubeIDE中的定义。
1.整型数据类型:
在STM32CubeIDE中,整型数据类型用于存储整数值。以下是常见的整型数据类型的定义:
- int8_t:有符号8位整数,取值范围为-128到127。
- uint8_t:无符号8位整数,取值范围为0到255。
- int16_t:有符号16位整数,取值范围为-32768到32767。
- uint16_t:无符号16位整数,取值范围为0到65535。
- int32_t:有符号32位整数,取值范围为-2147483648到2147483647。
- uint32_t:无符号32位整数,取值范围为0到4294967295。
2.浮点型数据类型:
在STM32CubeIDE中,浮点型数据类型用于存储浮点数值。以下是
常见的浮点型数据类型的定义:
- float:单精度浮点数,占用4个字节,可表示大约6到7位有
效数字。
- double:双精度浮点数,占用8个字节,可表示大约15到16
位有效数字。
3.字符型数据类型:
在STM32CubeIDE中,字符型数据类型用于存储单个字符。以下是
常见的字符型数据类型的定义:
- char:字符型数据类型,占用1个字节,用于存储ASCII码值。
4.枚举型数据类型:
在STM32CubeIDE中,枚举型数据类型用于定义一个有限的取值范围。以下是枚举型数据类型的定义示例:
stm32switch语句
stm32switch语句
STM32是一款面向微控制器市场的32位处理器。它集
成了许多资源,能够处理多种任务,从嵌入式应用,到具
有高度实时性的应用程序。STM32具有非常灵活的开发环
境,允许开发人员使用各种编程语言来控制该设备。其中
一种最常用的编程语言是C语言。在C语言中,有一个流
程控制语句,称为switch语句。本文将介绍STM32 switch
语句的详细信息。
什么是STM32 switch语句?
在C语言中,switch语句是一种在多种可能的情况下
进行选择的结构。它通常用于测试变量等式值。STM32
switch语句非常类似于C语言中的switch语句。它包含一
个表达式和多个case标签。在编写STM32应用程序时,开
发人员可以使用switch语句来检查变量的值,并根据值执
行相应的操作。
STM32 switch语句的语法
STM32 switch语句的语法与C语言中的类似。具体来
说,它的语法如下:
switch(expression) { case constant-expression: statement(s); break; case constant-expression: statement(s); break; default: statement(s); }
expression是一个表达式,在switch语句中进行测
试。其可以是整数,字符或枚举类型。case是常量表达式
标签。当expression和case标签具有相同的值时,对应
的语句将被执行。default是可选的,用于在expression
关于STM32的变量定义
关于STM32的变量定义
关于STM32的变量定义
分类:嵌入式系统2014-10-15 19:03 1644人阅读评论(0) 收藏举报今天调试程序时,想观察一下变量的情况,突然发现平时经常移植别人程序时最容易忽略的一个致命问题,那就是忽略变量类型,这里有必要给大家一定知识啦,都是库里面的,非原创!
3.0以后的版本中使用了CMSIS数据类型,变量的定义有所不同,但是出于兼容旧版本的目的,以上的数据类型仍然兼容。CMSIS的IO 类型限定词如表5-7所示,CMSIS和STM32固件库的数据类型对比如表5-8所示。这些数据类型可以在
STM32F10x_StdPeriph_Lib_V3.4.0\Libraries\CMSIS\CM3\Dev iceSupport\ST\STM32F10x\s tm32f10x.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 */
stm32 attribute参数
STM32是一系列由STMicroelectronics公司开发的32位ARM基于Cortex-M内核的嵌入式微控制器产品。在STM32中,attribute参
数作为编译器指令的一部分,对于程序的优化和调试非常重要。本文
将详细探讨STM32中attribute参数的相关知识,包括其定义、常见类型和使用方法等。
一、attribute参数的定义和作用
attribute参数是一种用于指示编译器特定行为的修饰符。在STM32中,attribute参数可用于控制变量的内存分配、对齐方式以及函数调用约定等。通过正确使用attribute参数,可以提高程序的性能和可移植性,同时也能更好地适应不同的硬件评台和操作系统环境。
二、常见的attribute参数类型
在STM32中,常见的attribute参数类型包括:
1. __attribute__((section("name"))): 将变量或函数放置在指定的内存段中。这在嵌入式系统中非常有用,可以将特定的数据或代码存放在
不同的内存区域,如RAM、ROM等,以满足系统对内存的不同需求。
2. __attribute__((aligned(n))): 指定变量的对齐方式,其中n为对齐
字节数。对齐方式的优化可以提高数据访问的效率,特别是在处理大
量数据时。
3. __attribute__((optimize("O0"))): 控制编译器优化的级别。通过设置不同的优化级别,可以在程序大小和执行速度之间做出权衡,以满足不同应用场景的需求。
4. __attribute__((noreturn)): 表示函数不会返回。这对于一些特殊的函数,如系统中断处理函数或者永远循环的任务函数非常有用。
STM32单片机设计extern全局变量的定义解析
STM32单片机设计extern全局变量的定义解析
今天在写SysTcik_Handler()这个中断函数时,总是报错,明明在开头定义的全局变量extern u16 ntime,(nTIme--写在stm32f10x_it.c的sysTIck中断函数中)但是编译时总是报错,百度之后才有了解决方法,
之前也注意到过extern变量,但是没有仔细思考过它的使用方法,今天碰到了,一定要把它弄明白,把这个关键字的一般作用弄清楚(仅仅是一般作用,C的博大精深不敢妄谈);当你建立一个头文件库时,经常会遇到一个问题,就是在A文件中定义一个temple变量,想把它的值传递给B文件使用,但是A文件操作中函数又不可以带返回参数,比如说中断服务函数,那该怎么办?如果你把temple定义在A中,然后让A.h和B.h包含在includes.h 中,然后把includes.h放在A.c和B.c中单个编译是没有问题的,但是链接的时候会出现问题,
“Symbol temple mulTIply defined(by A.o and B.o)”
意思是这个变量被多次定义了!!!
解决的方法是:
在A中定义temple变量后,在B中用extern 声明一下就可以了,例如:
1.在A中定义temple并且赋值:u16 temp2=0;
2.在B中声明extern u16 temp2;
这里只是声明,不再赋值,否则会报错!
Symbol temp2 mulTIply defined (by catch_pwm.o and app.o)
这里要注意变量定义和变量声明的区别:
stm32 结构体位变量定义
stm32 结构体位变量定义
STM32是一款广泛应用于嵌入式系统开发的微控制器系列,其结构体位变量定义是其重要特性之一。本文将从结构体的定义、使用和优势等几个方面来介绍STM32结构体位变量的特点和应用。
我们来了解一下结构体。结构体是一种自定义的数据类型,可以将不同类型的数据组合在一起,形成一个新的数据类型。在STM32的开发中,结构体常用于定义寄存器、外设和状态等信息,以方便对这些信息进行统一管理和操作。
在STM32中,结构体位变量定义的方式为:先定义一个结构体类型,然后通过该类型定义一个或多个结构体变量。例如,我们可以定义一个名为GPIO_TypeDef的结构体类型,用于描述STM32的GPIO外设,其中包括寄存器和控制标志等信息。然后,我们可以通过该结构体类型定义一个名为GPIOA的结构体变量,用于表示STM32的GPIOA端口。
使用结构体位变量的好处之一是可以将相关的数据集中在一起,方便管理和使用。在STM32的开发中,我们常常需要对不同的外设进行配置和控制,使用结构体位变量可以将这些相关的配置信息整合在一起,便于对外设进行统一的配置和控制。
结构体位变量还可以提高代码的可读性和可维护性。通过结构体位变量的定义,我们可以清晰地看到每个变量的含义和用途,从而更
好地理解代码的功能。同时,结构体位变量的修改和扩展也变得更加方便,只需要修改结构体定义即可,而不需要修改大量的代码。结构体位变量还可以提高代码的重用性。通过将一些通用的配置参数定义在结构体中,我们可以将这些结构体用于不同的项目或模块中,减少代码的重复编写,提高开发效率。
stm命名规则
stm命名规则
STM命名规则是指在STM32平台上,定义变量、函数、宏等等时所遵循的一套统一的规则。这些规则的制定是为了方便代码的编写、维护和阅读,提高代码的可读性和可移植性,从而提高代码的质量和效率。
其中,STM命名规则包括以下几个方面:
1.变量名的命名规则
变量名应该尽量简短、具有描述性和易于理解。变量名应该由一个或多个单词组成,单词之间用下划线_分隔。
例如,int led_pin; 代表了一个控制LED灯的引脚。
2.函数名的命名规则
函数名应该由一个或多个单词组成,单词之间用下划线_分隔。函数名应该具有描述性、易于理解和表达其功能的含义。
例如,void delay_us(uint16_t us); 代表了一个延时函数,用于延时指定的微秒数。
3.宏定义的命名规则
宏定义应该由一个或多个单词组成,单词之间用下划线_分隔。宏定义应该具有描述性、易于理解和表达其功能的含义。
例如,#define LED_PIN PA5; 代表了一个LED灯的引脚。
4.结构体和枚举类型的命名规则
结构体和枚举类型的名称应该由一个或多个单词组成,单词之间用下划线_分隔。结构体和枚举类型的名称应该具有描述性、易于理
解和表达其功能的含义。
例如,typedef enum {LED_OFF, LED_ON} led_state; 代表了一个LED灯的状态。
总之,STM命名规则的制定是为了使代码更加规范、易读、易懂,从而提高代码质量,减少错误。在开发STM32平台的应用程序时,遵循这些规则能够帮助开发人员更好地组织代码,并提高程序的可读性、可维护性和可移植性。
stm32布尔变量定义(一)
stm32布尔变量定义(一)
STM32布尔变量
1. 定义
布尔变量是一种逻辑变量,它只能取两个值:真(true)或假(false)。在STM32微控制器中,布尔变量用来表示逻辑状态,常用于条件判断和开关控制等场景。
2. 为什么要使用布尔变量
布尔变量的使用在编程中有着重要的作用,以下是几个使用布尔变量的理由:
简化逻辑判断
布尔变量的取值只有两个,使得逻辑判断更简洁明了。通过对布尔变量的取值进行判断,可以实现复杂的逻辑控制。
节省资源
布尔变量只占用一个字节的内存空间,非常省资源。在嵌入式系统中,资源是非常宝贵的,特别是在存储器容量有限的情况下,使用布尔变量可以节省存储空间。
提高代码可读性
使用布尔变量可以使代码更易读,更易于理解和维护。通过给布尔变量起一个有意义的名字,可以清晰地表达变量的含义和作用,提高代码的可读性。
3. 书籍推荐
以下是几本关于STM32编程和布尔变量的书籍推荐:
1.《嵌入式系统设计与应用:STM32大容量的觉醒与实
战》
本书详细介绍了STM32微控制器的应用开发,并深入讲解了布尔变量的使用。通过实际案例和代码示例,读者能够全面了解布尔变量在STM32编程中的应用。
2.《STM32F系列单片机开发全程实战指南》
该书是一本系统而全面的STM32F系列单片机开发指南。其中章
节介绍了布尔变量的定义和使用方法,并提供了大量的实例和示范代码,帮助读者快速掌握布尔变量的应用技巧。
3.《STM32嵌入式系统设计开发实战教程》
本教程以STM32为基础,系统介绍了嵌入式系统的设计和开发过程。其中一章专门讲解了布尔变量的定义和使用,通过实验和实例,帮助读者理解布尔变量在嵌入式系统中的应用。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
关于STM32的变量定义
分类:嵌入式系统2014-10-15 19:03 1644人阅读评论(0) 收藏举报今天调试程序时,想观察一下变量的情况,突然发现平时经常移植别人程序时最容易忽略的一个致命问题,那就是忽略变量类型,这里有必要给大家一定知识啦,都是库里面的,非原创!
3.0以后的版本中使用了CMSIS数据类型,变量的定义有所不同,但是出于兼容旧版本的目的,以上的数据类型仍然兼容。CMSIS的IO类型限定词如表5-7所示,CMSIS和STM32固件库的数据类型对比如表5-8所示。这些数据类型可以在
STM32F10x_StdPeriph_Lib_V3.4.0\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\s tm32f10x.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描述
_I volatile const只读访问
_O volatile只写访问
_IO volatile读和写访问
固件库与CMSIS数据类型对比
固件库类型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位数据