
查看固件库,里面有很多在通常的C语言教程中不常看到的语法内容,总结如下: __I:其实是个宏定义,在core_cm3.h里面:
除了__I以外还有__O、__IO等等,都是volatile的别名,意思是要求编译器不作优化而直接读取变量的真实地址上的内容。 怎么优化呢?复杂,好比说iTempA = iTempB * 2,下一步如果使用到iTempA就会一直认为iTempB * 2的值就是iTempA的值,而实际上可能在其他地方iTempA被其他程序改变,所以如果使用到iTempA的话就不能认为是iTempB * 2而应该从iTempA的实际地址读取。 这只是类比,STM32是关于硬件的,iTempA如果被volatile修饰就应该读取它的真实地址内容不应该读取缓冲区内容。用书上的话就是“易失性”。 从宏定义可以看出来,无论是__O还是__IO都是volatile,并无区别,这个只是给程序员看的,没有语法上的约束。唯一不同的是__I,是const,常量。 不过具体怎么用呢?目前不得而知。 ------------------------- 库里面有一些很奇特的数据类型,比如uint32_t,uint16_t,虽然猜能够猜到是什么,不过具体是什么呢? 使用Keil很容易找到定义处,在c:\Keil_v5\ARM\ARMCC\include\stdint.h里面定义。(可是我的项目中却没有#include这个头文件呀!!看来Keil调用编译器的时候自动包含的,Keil自带的include不是没用啊。) stdint.h里面定义了许多这样的数据类型,大多是C原生数据类型的typedef,理解为别名好了。
关于硬件的数据类型可能不会自动识别为int、float之类,这些都是需要使用者自己来识别来定义的,所以硬件的数据大多只和数据是存储在16bit还是32bit空间有关。 8位数据用C来定义就是signed char 或unsigned char ,而16位就是signed short int或unsigned short int,类似地,常用的寄存器是32位,就是unsigned int。 还是为了防止以后出现类型错误,减少编写出错几率。 ------------------------------------- 在stm32f10x.h中还定义了几个更精简的类型:vu32/vu16/vu8这类。
这是在uint32_t的基础上加上了__IO修饰,定义了这么多,记忆是个问题。我现在的理解是:如果有__IO等修饰,那么就是从硬件读或写数据,不能用简单赋值。 ———————————————— 版权声明:被大佬糊弄的只会点灯的小菜鸡 如有侵权请联系删除 |
STM32 GUI LTDC 最大像素时钟评估方法
【2025·STM32峰会】GUI解决方案实训分享1-对LVGL咖啡机例程的牛刀小试以及问题排查
OpenBLT移植到STM32F405开发板
为什么要先开启STM32外设时钟?
【STM32MP157】从ST官方例程中分析RPMsg-TTY/SDB核间通信的使用方法
【经验分享】STM32实例-RTC实时时钟实验④-获取RTC时间函数与中断服务函数
STM32 以太网 MAC Loopback 的实现
STM32功能安全设计包,助力产品功能安全认证
基于STM32启动过程startup_xxxx.s文件经验分享
HRTIM 指南