你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

基于STM32固件库语法的经验分享

[复制链接]
攻城狮Melo 发布时间:2023-3-26 18:27
查看固件库,里面有很多在通常的C语言教程中不常看到的语法内容,总结如下:
__I:其实是个宏定义,在core_cm3.h里面:
  1. [mw_shl_code=c,true]#ifdef __cplusplus
  2.   #define     __I     volatile                /*!< defines 'read only' permissions      */
  3. #else
  4.   #define     __I     volatile const          /*!< defines 'read only' permissions      */
  5. #endif
  6. #define     __O     volatile                  /*!< defines 'write only' permissions     */
  7. #define     __IO    volatile                  /*!< defines 'read / write' permissions   */
  8. [/mw_shl_code]
复制代码

除了__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,理解为别名好了。
  1. [mw_shl_code=c,true]    /* exact-width signed integer types */
  2. typedef   signed          char int8_t;
  3. typedef   signed short     int int16_t;
  4. typedef   signed           int int32_t;
  5. typedef   signed       __INT64 int64_t;


  6.     /* exact-width unsigned integer types */
  7. typedef unsigned          char uint8_t;
  8. typedef unsigned short     int uint16_t;
  9. typedef unsigned           int uint32_t;
  10. typedef unsigned       __INT64 uint64_t;
  11. [/mw_shl_code]
复制代码

关于硬件的数据类型可能不会自动识别为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这类。
  1. [mw_shl_code=c,true]typedef __IO uint32_t  vu32;
  2. typedef __IO uint16_t vu16;
  3. typedef __IO uint8_t  vu8;
  4. [/mw_shl_code]
复制代码

这是在uint32_t的基础上加上了__IO修饰,定义了这么多,记忆是个问题。我现在的理解是:如果有__IO等修饰,那么就是从硬件读或写数据,不能用简单赋值。
————————————————
版权声明:被大佬糊弄的只会点灯的小菜鸡
如有侵权请联系删除


收藏 评论0 发布时间:2023-3-26 18:27

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版