首页 理论教育 嵌入式应用技术:STM32固件库编程主要内容

嵌入式应用技术:STM32固件库编程主要内容

时间:2023-10-21 理论教育 版权反馈
【摘要】:它本身是一种存储类的关键字,与auto、extern、mutable、static、register等关键字不能出现在同一个表达式中。可为数据类型另外指派一个名称,比如“typedef int Counter”,这样Counter就等同于int。例如,“Counter m,n;”相当于“int m,n;”。这些量说明不能归属为整型、字符型或其他类型。如说明a为Weekday数据变量:enum Weekday a;则a可以等于Mon等7个枚举元素中的一个。#define BufferSize语句用于计算缓冲区大小。图9-22主函数流程图

嵌入式应用技术:STM32固件库编程主要内容

主函数的思路是将数组存储到W25Q128中,然后将其读出,将写入的数据与读出的数据逐个比较,若完全一样,输出正常的提示;若有不同,输出错误的提示。所有输出使用串口输出到PC,用串口助手观察。

注意:由于秉火实验板上的W25Q128芯片默认已经存储了特定用途的数据,擦除这些数据,会影响某些程序的运行。芯片的“第0扇区(0—4096地址)”预留了空白区域给用户使用,如非必要,请勿擦除其他地址的内容。

由于使用串口的工程模板,主函数可以直接调用串口初始化。编写程序如下:

与其他主程序一样,程序的开头需包含头文件,这里说明一下第四行的宏定义。

typedef enum{FAILED=0,PASSED=!FAILED}TestStatus;

typedef在计算机编程语言中用来为复杂的声明定义简单的别名,它与宏定义有些差异。它本身是一种存储类的关键字,与auto、extern、mutable、static、register等关键字不能出现在同一个表达式中。可为数据类型另外指派一个名称,比如“typedef int Counter”,这样Counter就等同于int。例如,“Counter m,n;”相当于“int m,n;”。

enum叫作枚举,它是计算机编程语言中的一种数据类型。在实际应用中,有些变量的取值被限定在一个有限的范围内。例如,一个星期只有七天,一个班每周有六门课程等。这些量说明不能归属为整型字符型或其他类型。为此,C语言提供了一种称为“枚举”的类型,在“枚举”类型的定义中列举出所有可能的取值,被声明为该“枚举”类型的变量取值不能超过定义中的范围。使用格式如下:

enum枚举名{枚举值表};

枚举值表应罗列出所有可用值。这些值也称为枚举元素。

例如,定义一个枚举类型Weekday,里面的枚举元素有Mon、Tue、Wed、Thu、Fri、Sat、Sun,则可以这样定义:

enum Weekday{Mon,Tue,Wed,Thu,Fri,Sat,Sun};

凡被说明为Weekday类型变量的取值只能是七个元素的某一个。如说明a为Weekday数据变量:(www.xing528.com)

enum Weekday a;则a可以等于Mon等7个枚举元素中的一个。

上面两行语句也可以使用下面一条语句表示:

enum Weekday{Mon,Tue,Wed,Thu,Fri,Sat,Sun}a;

typedef与enum放在一块的含义是用typedef关键字将枚举类型定义成别名,并利用该别名进行变量声明,用法如下:

typedef enum{Mon,Tue,Wed,Thu,Fri,Sat,Sun}Weekday;

Weekday为枚举类型enum Weekday的别名。声明之后可以直接使用“Weekday a;”对变量a进行说明,与上面的过程一致。

再看主程序的第四行宏定义,TestStatus为枚举类型{FAILED=0,PASSED=!FAILED}的别名。后面程序可以直接使用TestStatus说明变量。这些说明的变量只能取FAILED与PASSED两个结果,而且FAILED已经赋值为0,PASSED为非0。例如,语句TestStatus TransferStatus1,变量TransferStatus1只能等于FAILED或者PASSED这两个中的其中一个。

下面再介绍#define countof(a)(sizeof(a)/sizeof(*(a)))语句。sizeof是计算对象所占的字节数,通常用来查看变量、数组或结构体等所占的字节个数。比如“int a[]={1,2,3};”,则sizeof(a)的值等于12。sizeof(*(a))相当于sizeof(a[0]),即计算数组单个元素的字节数,因此sizeof(a)/sizeof(*(a))相当于计算数据有多少个元素。通过#define对countof(a)进行宏定义,这等同于sizeof(a)/sizeof(*(a)),后面只需用countof()即可计算元素数量了。

#define BufferSize(countof(Tx_Buffer)-1)语句用于计算缓冲区大小。注意,这里计算缓冲区大小时要减1。由于发送的数组是字符串(uint8_t Tx_Buffer[]="Hello!Foshan Polytech";),而字符串数组中的最后会以空字符\0作为终止符(这个是自动加上去的),使用sizeof()时会算上这个空字符,因此需要在计算缓冲区大小时将这个空字符减掉。如果发送的数组不是字符串形式,则计算时不能减1。

比较函数TestStatus Buffercmp(uint8_t*pBuffer1,uint8_t*pBuffer2,uint16_t BufferLength)带返回值,形参有数组1的指针、数组2的指针、数量。程序通过循环,逐一比较每一个数组成员,只要有一个不相同,则返回FAILED;若全等,则返回PASSED。

主函数流程图如图9-22所示。需要注意的是,要先擦除扇区,再写入数据。

图9-22 主函数流程图

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈