首先说一下编程过程中几个步骤吧
第一,选择一门语言,c语言或汇编语言,嵌入式编程一般目前流行还是c,这个需要基础与时间
第二读懂了解 mcu的寄存器各寄存器的功能,尤其是一些io口设置,各模块时钟设置比如定时器,i2c,同步异步串口,pwm等等,以前的话51的话没有这样设置。而现在mcu基本上各模块时钟都分开了。这个可以看官方数据说明书就可以了。
其实程的目的就是设置一系列寄存器.并根据你设计程序流程去执行它,期间可能加入了你设计好的一些算法,和数学公式。进行计算,或执行。
第三,你有一块你的实验板就如这次stm32推的f429,你还需要下载程序的编程器。就是把编译器编译好的代码下载到你的目标实验板上,不过st推的多数实验班都是自带usb串口的程序下载器。比如stm32f429就自带了
第四,你还需要了解的是编译器,编译器的数据类型一些定义,及有些编译器的可能自带内建函数,这个不必须了解。否则无法编程。
本文主要就介绍stm32的数据类型的基础知识。以及一些关键词的意义。
▲在keli mdk数据类型中进了如下定义
char占用1个字节
short int占用2字节
int占用4字节
long占用4字节
long int占用4字节
float占用4字节
double占用8字节
即有如下宏定义
typedef unsigned charuint8;//无符号8位字符型变量
typedef signedcharint8;//有符号8位字符型变量
typedef unsigned shortuint16;// 无符号16位短整型变量
typedef signedshortint16;// 有符号16位短整型变量
typedef unsigned intuint32;// 无符号32位整型变量
typedef signedintint32;// 有符号32位整型变量
typedef floatfp32;//单精度浮点数(32位长度)
typedef doublefp64;//双精度浮点数(64位长度)
注:c语言中的种类数据:整型:int short long 实型:float, double 。
其中,unsigned 为无符号, signed有符号。
▲stm32的数据类型的宏定义
stm32采用了大量的固件库,其中在2.0库中有24个数据类型如下
typedef unsigned char u8;0~255一字节
typedef signed char s8;-128~127
typedef volatile unsigned char vu8;
typedef volatile signed char vs8;
typedef unsigned char const uc8;
typedef signed char const sc8;
typedef volatile unsigned char const vuc8;
typedef volatile signed char const vsc8;
typedef unsigned short u16; 0~65535两字节
typedef signed short s16; -32768~32767两字节
typedef volatile unsigned short vu16;
typedef volatile signed short vs16;
typedef unsigned short const uc16;
typedef signed short const sc16;
typedef signed short const sc16;
typedef volatile unsigned short const vuc16;
typedef volatile signed short const vsc16;
typedef unsigned long u32; 0~(2^32-1)四字节
typedef signed long s32;
typedef signed long const sc32;
typedef volatile unsigned long const vuc32;
typedef volatile signed long const vsc32;
对部分数据类型后面作了注释,其它类型类推。
▲关于两个关键词说明 volatile& const
(1)volatile:这个关键字,很多人只知道用,不知道其含义,有介绍解释是不易被编译器优
化的。在stm32资料中解释加了易挥发的变量。这些解释都是含糊不清的。
为此笔者专门查了下这个修饰关键字含义
通俗的解释:随时会改变,并被多函数调用可以加volatile修饰。
简称易变变量或易挥发变量。
表示这个变量的真的很容易变。
进阶解释: 加了这个volatile意义就是在每次取这个变量值的时候,要求不是取它上次在某个时候取的临时缓存变量(比如说暂存在某个寄存器中),而是直接到内存中取。
个人经验:告诉编译器,volatile定义的变量必须ram变量.不能是寄存器变量.
尤其是中断中用全局变量一定要加volatile。
(2)const: 在定义变量时候,如果加上关键词const,则变量的值在程序运行期间不能改变,当然不能再赋值了。这种变量称为常变量(constant variable)或是只读变量(read-only-variable,这样觉得更恰当)。
▲ stm32f10x_stdperiph_driver3.0以后的版本中使用了cmsis数据类型
3.0以后版本与之前版本变量的定义有所不同,但是出于兼容旧版本的目的,以上的数据类型仍然兼容。cmsis的io类型限定词如表 3所示,cmsis和stm32固件库的数据类型对比如表 5所示。这些数据类型可以在
stm32f10x_stdperiph_lib_v3.4.0\libraries\cmsis\cm3\devicesupport\st\stm32f10x
\stm32f10x.h中找到具体的定义。
▲数据类型和io类型限定词cortex-mx hal使用标准ansi c头文件定义的标准类型。特别用类型限定词io来访问外设的变量。
表3 数据类型限定词io。
▲st从库包中移除了文件”stm32f10x_type.h”,新的库使用cmsis和定义的数据类型。
表5展示了stm32f10xxx和之间数据类型的一一对应关系。表5 stm32f10xxx固件库v2.0.3与cmsis数据类型对比
▲注意出于兼容旧版本的目的文件”stm32f10x.h”中仍然定义了stm32f10xxx固件库原有数据类型。
文件”stm32f10x.h”中也定义了stm32f10xxx固件库专用类型.
它们是:typedef enum {false = 0, true = !false}bool;
typedef enum {reset = 0, set = !reset}flagstatus,itstatus;
typedef enum {disable = 0, enable = !disable}functionalstate;
#define is_functional_state(state) (((state) == disable) || ((state) == enable))
typedef enum {error = 0, success = !error}errorstatus;
农业或将成为未来机器人产业落地的领域
雷达水位计比测分析
RC充放电电路原理解析及LTspice仿真
Voxel Space实现地形渲染
郭台铭:鸿海与日企联手挑战三星
STM32的数据类型基础介绍
未来三年内,特斯拉股价有可能大涨300%
OPPO Reno系列搭载OZO Audio技术
halcon与opencv标定板的选择
消息称NVIDIA欲复活RTX 2060 Super产品线
西门子STEP7编程软件设置组件属性
电商网站开发需要注意哪些问题?
stm32复位电路电阻和电容怎么搭配
加密社区对加密世界的潜在破坏力感到惶恐
视在功率是什么_视在功率计算公式_视在功率有功功率无功功率
魅族员工讽刺抄袭魅族工艺,被HTC打脸
母联充电保护启动条件 母线充电保护什么时候投入
西门子与Terna组建的企业联合体成功中标希腊电网3.7亿欧元合同
辊压机轴磨损还得靠专业的维修技术
可灵活配置的高性能EtherCAT伺服驱动解决方案