关于STM32库中 __IO 修饰符(volatile修饰符,反复无常的意思)

发布者:rho27最新更新时间:2016-07-30 来源: eefocus关键字:STM32库  修饰符  volatile 手机看文章 扫描二维码
随时随地手机看文章
STM32例子代码中会有像这样的代码 static __IO uint32_t TimingDelay;  这里边的__IO修饰符不好理解,单从字面可以看出是为IO相关,查其标准库可以得知这个__IO原来是在Core_cm3.h中被重定义,其实就是volatile,句子如下
/* IO definitions (access restrictions to peripheral registers) */
#ifdef __cplusplus
  #define   __I     volatile             /*!< defines 'read only' permissions                 */
#else
  #define   __I     volatile const       /*!< defines 'read only' permissions                 */
#endif
#define     __O     volatile             /*!< defines 'write only' permissions                */
#define     __IO    volatile             /*!< defines 'read / write' permissions              */ 
 
不难看出这些修饰管是用于指示编译器在编译时如何对变量进行操作。volatile 的作用就是指示编译器不要因优化而省略此指令,必须每次都直接读写其值。
写一段测试代码如下
  u8 test;
 
  test = 1;
  test = 2;
  test = 3;
设置优化级别中级
运行后test会被直接取值为3 只有最后一个语句被编译
如用volatile
  volatile u8 test;
 
  test = 1;
  test = 2;
  test = 3;
则所有语句都会被编译。test先后被设置成1、2、3
由此可以看出这个作用在IO操作,寄存器操作,特殊变量,多线程变量读写都是很重要。
关键字:STM32库  修饰符  volatile 引用地址:关于STM32库中 __IO 修饰符(volatile修饰符,反复无常的意思)

上一篇:STM32F051R8T6的RCC配置
下一篇:利用MDK4中的逻辑分析仪分析IO口的PWM波

推荐阅读最新更新时间:2024-03-16 15:02

c8051f 的IO配置方法及原则
C8051F---I/0口 问:C8051F020/022的p4-p7口和p0-p3口有什么不同? 答:P0-P3口复位时为通用口,可通过Crossbar(数据交叉开关)寄存器按优先级设置成第二功能。而P4-P7口是通用口,另外P4-P7寄存器不能位寻址。 问:如果通过Crossbar寄存器使能并分配为P0.0和P0.1引脚,那么,我还可以用这两个引脚为通用I/O吗? 答:①如果你通过Crossbar使能一个外设,如UART,那么这个外设将控制这些引脚的输出状态(逻辑高/逻辑低)。 ②你可以在任何时刻读引脚的状态,与Crossbar控制与否无关。 ③当被禁止时,大部分外设的输出引脚被置为高阻态(UART口是一个很好的例子)。因为
[单片机]
单片机IO驱动继电器电路的误区
经常看见的IO管脚驱动继电器的电路如下图,8550位于继电器下方。实际使用发现,此种的连接方法8550没有工作在饱和状态,即VCE未达到手册所说明的典型值0.2V,使得继电器线圈两端电压未达到理想值,一般达到4.4V已经不错了。 采用下图,改变电阻R,测试结果如下: 1)R=2K,VCC=5V,此时VCE=0.96V,线圈电压4.04V。 2)R=4K,VCC=5V,此时VCE=1.2V,线圈电压3.8V 3)R=6K,VCC=5V,此时VCE=1.6V,线圈电压3.4V。(Ib=0.126mA,Ie=28.2mA,Ic=27.9mA,放大倍数221) 这几种情况下,8550工作在放大状态。而继电器要求8550工作在饱和区,
[单片机]
STM32中IO模式
在STM32中选用IO模式 (1) 浮空输入_IN_FLOATING 浮空输入,可以做KEY识别,RX1 (2)带上拉输入_IPU IO内部上拉电阻输入 (3)带下拉输入_IPD IO内部下拉电阻输入 (4) 模拟输入_AIN 应用ADC模拟输入,或者低功耗下省电 (5)开漏输出_OUT_OD IO输出0接GND,IO输出1,悬空,需要外接上拉电阻,才能实现输出高电平。当输出为1时,IO口的状态由上拉电阻拉高电平,但由于是开漏输出模式,这样IO口也就可以由外部电路改变为低电平或不变。可以读IO输入电平变化,实现C51的IO双向功能 (6)推挽输出_OUT_PP IO输出0-接GND, IO输出1 -接VCC,读输入值是未知
[单片机]
STM32(五)IIC通信原理及IO口软件模拟编程
一、IIC概述 I2C(IIC,Inter-Integrated Circuit),两线式串行总线,由PHILIPS公司开发用于连接微控制器及其外围设备。 它是由数据线SDA和时钟SCL构成的串行总线,可发送和接收数据。在CPU与被控IC之间、IC与IC之间进行双向传送,高速IIC总线一般可达400kbps以上。 IIC是半双工通信方式。 多主机I2C总线系统结构: 二、I2C协议 1、空闲状态 I2C总线的SDA和SCL两条信号线同时处于高电平时,规定为总线的空闲状态。此时各个器件的输出级场效应管均处在截止状态,即释放总线,由两条信号线各自的上拉电阻把电平拉高。 2、开始信号
[单片机]
STM32(五)IIC通信原理及<font color='red'>IO</font>口软件模拟编程
【MSP430中断】MSP430的IO口中断/中断特性
MSP430学习笔记之七:IO口中断 MSP430中断嵌套机制 (1) 430默认的是关闭中断嵌套的,除非你在一个中断程序中再次开总中断EINT。 (2) 当进入中断程序时,只要不在中断中再次开中断,总中断是关闭的,此时来中断不管是比当前中断的优先级高还是低都不执行。 (3)若在中断A中开了总中断,刚可以响应后来的中断B(不管B的优先级比A高还是低),B执行完现继续执行。注意:进入中断B生总中断同样也会关闭,如果B中断程序执行时需响应中断C,则此时也要开总中断,若不需响应中断,则不用开中断,B执行完后中跳出中断程序进入A程序时,总中断会自动打开。 (4)若在中断中开了总中断,后来的中断同时有多个,则会按优先级来执行
[单片机]
gec210 i2c程序io模拟方式实现
开发环境:ubuntu arm-linux-gcc4.4.1 开发板: GEC210开发板 原理图 i2c芯片:FM24CL04 与cpu的连接,GPD1的0,1号引脚。0号引脚对应SDA功能,1号引脚对应SCL引脚 实现: io方式模拟i2c通信,没有使用i2c控制器 需要使用io引脚输出高低电平模拟i2c信号 或者需要改变为输入模式服务数据 //宏定义 #define GPD1DAT (*(volatile unsigned long*)0xe02000c4) #define GPD1CON (*(volatile unsigned long*)0xe02000c0) #def
[单片机]
STM32库函数USART波特率计算的问题
STM32的串口波特率计算本来没多大个事,只不过ST的StdPeriph以及后继者STM32Cube计算波特率那块弄得很复杂。写此文的目的是避免新手在这一块被函数库误导了。 STM32F1波特率计算只有一个公式: F2之后的系列有两公式,增加了8倍采样的模式,将16换成8就行。 先说常用的16倍采样。STM32的USART波特率生成支持小数分频,BRR寄存器高12位是整数部分,低4位是小数部分。刚好有4位小数部分,于是: BRR=(PCLK/(16*Baud)) 4=PCLK/Baud,so easy!你看硬件设计师都设计好了,波特率计算就这么简单。这样分频系数截尾误差最大1个bit,4位小数也就是1/16=0.0
[单片机]
<font color='red'>STM32库</font>函数USART波特率计算的问题
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved