这个_IO 是指静态 这个 _IO 是指静态 volatile uint32_t 是指32位的无符号整形变量uint32_t 是指32位的无符号整形变量;

搞stm32这么久了,经常看到stm32里面库文件里面有用“_IO”定义的变量,查过一下当时记住了,过段时间又给忘记了。所以才特意的写一个博文来记住。

volatile

volatile 类型是这样的,其数据确实可能在未知的情况下发生变化。比如,硬件设备的终端更改了它,现在硬件设备往往也有自己的私有内存地址,比如显存,他们一般是通过映象的方式,反映到一段特定的内存地址当中,这样,在某些条件下,程序就可以直接访问这些私有内存了。另外,比如共享的内存地址,多个程序都对它操作的时候。你的程序并不知道,这个内存何时被改变了。如果不加这个voliatile修饰,程序是利用catch当中的数据,那个可能是过时的了,加了 voliatile,就在需要用的时候,程序重新去那个地址去提取,保证是最新的。归纳起来如下:

1. volatile变量可变允许除了程序之外的比如硬件来修改他的内容 
2. 访问该数据任何时候都会直接访问该地址处内容,即通过cache提高访问速度的优化被取消

对于((volatile unsigned long *) 0xE0028000)为随硬件需要定义的一种地址,前面加上“*”指针,为直接指向该地址,整个定义约定符号IOPIN代替,调用的时候直接对指向的地址寄存器写内容既可。这实际上就是内存映射机制的方便性了。其中volatile关键字是嵌入式系统开发的一个重要特点。上述表达式拆开来分析,首先(volatile unsigned long *) 0xE0028000的意思是把0xE0028000强制转换成volatile unsigned long类型的指针,暂记为p,那么就是#define A *p,即A为P指针指向位置的内容了。这里就是通过内存寻址访问到寄存器A,可以读/写操作。

对于(volatile unsigned char *)0x20我们再分析一下,它是由两部分组成:
1)(unsigned char *)0x20,0x20只是个值,前面加(unsigned char *)表示0x20是个地址,而且这个地址类型是unsigned char ,意思是说读写这个地址时,要写进unsigned char 的值,读出也是unsigned char 。
2)volatile,关键字volatile 确保本条指令不会因C 编译器的优化而被省略,且要求每次直接读值。例如用while((unsigned char *)0x20)时,有时系统可能不真正去读0x20的值,而是用第一次读出的值,如果这样,那这个循环可能是个死循环。用了volatile 则要求每次都去读0x20的实际值。

那么(volatile unsigned char *)0x20是一个固定的指针,是不可变的,不是变量。而char *u则是个指针变量。
再在前面加"*":*(volatile unsigned char *)0x20则变成了变量(普通的unsigned char变量,不是指针变量),如果#define i (*(volatile unsigned char *)0x20),那么与unsigned char i是一样了,只不过前面的i的地址是固定的。

转载于:https://www.cnblogs.com/mingyunrangwozoudaoxianzai/p/7041518.html

关于STM32 __IO 的变量定义相关推荐

  1. 关于STM32的变量定义

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

  2. ARM(IMX6U)裸机模仿STM32驱动开发实验(定义外设结构体)

    参考:Linux之ARM(IMX6U)裸机模仿STM32驱动开发格式 作者:一只青木呀 发布时间: 2020-08-15 12:11:56 网址:https://blog.csdn.net/weixi ...

  3. 1、C语言面试笔试---变量定义和声明

    文章目录 1.背景 2.变量定义和声明 1.局部变量和全局变量 2.变量的存储类别 3.例题 4.内存泄漏 1.背景 2019秋招马上开始了,今天已经是7月30号了,赶紧刷刷C语言,争取在8月中旬刷完 ...

  4. c语言字节溢出,C语言变量定义与数据溢出(初学者)

    1.变量定义的一般形式为:类型说明符.变量名标识符等:例:int a,b,c;(abc为整型变量) 在书写变量定义时应注意以下几点: (1)允许在一个类型说明符后,定义多个相同类型的变量.各变量之间用 ...

  5. 【STM32CubeIDE】将变量定义到指定地址

    使用Keil 在使用Keil编写程序的时候我们可以很轻松的将变量定义到指定地址 uint8_t array[1024] __attribute__((at(0x20010000))); 使用STM32 ...

  6. STM32H743+CubeIDE-将变量定义到指定的内存

    文章目录 一.前言 二.将变量定义到指定的内存 2.1.将变量定义到DTCM内存 2.2.将变量定义到RAM_D1内存 三.STM32CubeIDE实用技巧之ld链接文件解读 3.1.内存(MEMOR ...

  7. C++ 笔记(05)— 变量(变量定义、声明、初始化、extern关键字、变量之间转换)

    1. 变量定义 变量定义就是告诉编译器在何处创建变量的存储,以及如何创建变量的存储.变量定义指定一个数据类型,并包含了该类型的一个或多个变量的列表,如下所示: type variable_list; ...

  8. Go 学习笔记(6)— 变量定义、变量声明、变量作用域

    1. 变量定义 Go 语言变量名由字母.数字.下划线组成,其中首个字符不能为数字.声明变量的一般形式是使用 var 关键字: var varName dataType [= value] Go 语言和 ...

  9. VS插件开发——格式化变量定义语句块

    插件介绍 代码地址:https://github.com/sun2043430/vs2008_format_variable_define_plugin/ 在vs里,对选中的变量定义块进行格式化,效果 ...

  10. 判断变量定义和变量为空问题

    变量定义和变量为空问题:jrhmpt01:/root# cat x1.pl my $xx=""; if (defined($xx)){print "111111111\n ...

最新文章

  1. Eclipse启动时报错
  2. python学习音频-Python 音频数据扩充的技巧
  3. 洛谷P2566 [SCOI2009]围豆豆(状压dp+计算几何)
  4. [蓝桥杯][2013年第四届真题]危险系数-dfs+图的遍历
  5. docker 搭建指定版本的cas_Docker搭建-生成SpringBoot项目脚手架-各版本
  6. PHP中各种Hash算法性能比较
  7. django中怎样新建html页面,Django网站创建从html页面到另一个应用程序的主html页面的链接...
  8. Eclipse 中设置编辑器字体,包括 Java 编辑器,XML 编辑器和 Property 编辑器的字体都可以设置
  9. HDMI转PGA电脑没有声音处理方法
  10. 线程池之ForkJoinPool
  11. 海大11年春第5题:编程输出[m,n]之间所有素数,m,n由键盘输入。(10分)
  12. 第三只眼监控软件第三只眼网络监控软件
  13. 【微信公众号】获取获取微信的access_token
  14. php 代码质量检查_代码规范工具 phpcs 质量检查工具 phpmd
  15. public、private、protected的区别
  16. 移动端区分安卓系统和ios系统
  17. php 微商城 开源,一款基于ThinkPHP3.2开发的微信O2O开源微商城系统_微信开源微商城WEMALL...
  18. C#写Windows Service(windows服务程序)
  19. teamviewer12 linux安装,Ubuntu中下载安装TeamViewer 12
  20. KEIL编译器【C语言编译选项优化等级说明】【支持C99(变量声明在执行语句之后)】【反汇编设置】【C语言联合汇编】【use microlib选项】

热门文章

  1. Linux chapter test 9
  2. myBatis无法用log4j输出日志
  3. Spring Boot REST 请求(GetMapping,PostMapping)、格式化日期参数、压缩响应内容
  4. mysql中group_concat函数的使用以及separator的用法
  5. php算法结构,PHP中常用算法以及数据结构
  6. rabbitmq的发布订阅
  7. 阶段3 1.Mybatis_07.Mybatis的连接池及事务_5 mybatis中使用poolead配置连接的原理分析...
  8. 优秀架构师是怎么炼成的?
  9. lc 778. Swim in Rising Water
  10. 【MVC】VS常用技巧