3.30学习笔记
3.31 学习笔记总结
1. STM32单片机知识:
(1)在工程文件中为什么Lib文件夹只需要添加src文件夹中的文件而不需要添加inc文件夹中的文件?
答:Lib文件夹中src文件夹存放的均为.c文件,而inc文件夹中存放的均为src文件夹中对应的.h文件,在编译器中,只需要添加好文件路径,在编译的过程中编译器会根据.c文件中的头文件标识,自动将对应的.h文件添加进去。
(2)为什么在Keil 4中要勾选Create HEX File?
答:HEX和Bin文件中的信息均为单片机能识别的语言,是可以在FLASH中读取运行的机械语言。在添加新的工程文件中时默认不勾选状态,要记住打上勾。
(3)STM32系列单片机中,16k-32k闪存为小容量产品,64k-128k为中等容量产品,256k-512k为大容量产品。
(4)USART与电脑数据通信发送与接收均为8位16进制数。
(5)若一个GPIO端口启用USART串口功能,在使用USART串口功能前,GPIO与USART的时钟均需要启用。
(6)USART_Cmd函数是在USART初始化后用来启用USART功能的函数。
(7)USART与UART的区别:USART是通用同步异步收发器,是一个串行通信设备,可以灵活地与外部设备进行全双工数据交换。而USRT是通用异步收发器,异步串行通信口(UART)就是我们在嵌入式中常说的串口,它还是一种通用的数据通信议。
USART是指单片机的一个端口模块,可以根据需要配置成同步模式(SPI,I2C),也可以将其配置为异步模式,后者就是UART。所以说UART姑且可以称之为一个与SPI,I2C对等的“协议”,而USART则不是一个协议,而是更应该理解为一个实体。相比于同步通讯,UART不需要统一的时钟线,接线更加方便。但是,为了正常的对信号进行解码,使用UART通讯的双方必须事先约定好波特率,即每个码元的长度。
(8)奇偶校验:是一种校验代码传输正确性的方法。根据被传输的一组二进制代码的数位中"1"的个数是奇数或偶数来进行校验。奇偶校验需要一位校验位,即使用串口通信的方式2或方式3(8位数据位+1位校验位)。
奇校验(odd parity):让传输的数据(包含校验位)中1的个数为奇数。即:如果传输字节中1的个数是偶数,则校验位为“1”,奇数相反。以发送字符:10101010为例
偶校验(even parity):让传输的数据(包含校验位)中1的个数为偶数。即:如果传输字节中1的个数是偶数,则校验位为“0”,奇数相反。还是以发送字符:10101010为例
(9)什么是硬件流控制?【4/1日详细学习】
答:“流”所指的就是数据流,由于单片机和电脑的处理速度不同,如电脑和单片机通讯,一方接收缓冲区已满,如果继续传输数据,那么接下来的数据都会丢失。为了解决这个问题,就有了流控制,一旦信息处理不过来,就发出“不再接收信号”,发送端停止发送数据,当信息处理完成,就发出“继可以续发送信号”,发送端开始发送数据。
硬件流控制常用的有RTS/CTS流控制和DTR/DSR(数据终端就绪/数据设置就绪)流控制。
硬件流控制必须将相应的电缆线连上,用RTS/CTS(请求发送/清除发送)流控制时,应将通讯两端的RTS、CTS线对应相连,数据终端设备(如计算机)使用RTS来起始调制解调器或其它数据通讯设备的数据流,而数据通讯设备(如调制解调器)则用CTS来起动和暂停来自计算机的数据流。这种硬件握手方式的过程为:我们在编程时根据接收端缓冲区大小设置一个高位标志(可为缓冲区大小的75%)和一个低位标志(可为缓冲区大小的25%),当缓冲区内数据量达到高位时,我们在接收端将CTS线置低电平(送逻辑0),当发送端的程序检测到CTS为低后,就停止发送数据,直到接收端缓冲区的数据量低于低位而将CTS置高电平。RTS则用来标明接收设备有没有准备好接收数据。
2.C语言知识:
(1)变量的声明和定义的区别:
定义:是需要建立存储空间的。例如:int a 在声明的时候就已经建立了存储空间。一般写在.c文件
声明:是不需要建立存储空间的。 例如:extern int a 其中变量a是在别的文件中定义的。一般写在.h文件。
(2)怎样定义和声明全局变量和函数最好?
定义是分配空间并赋初值 (如果有) ,声明则是给需要调用该变量或者函数的地方声明该变量或函数,使编译不出错。
最好的安排是在某个相关的 .c 文件中定义, 然后在其对应的头文件 (.h)(用extern修饰) 中进行外部声明, 在需要使用的时候, 只要包含对应的头文件即可。定义变量的 .c 文件也应该包含该头文件, 以便编译器检查定义和声明的一致性。
(3)(u16*)Address:在FLASH_R函数中,有一这样的强制转换*(u16*)Address,Address是单片机中FLASH的地址,读取地址信息不能直接星号Address,因为Address只是一个32位的变量,在C语言中读取地址数据需要指针,(u16*)就是为了让Address这个32位变量转换位存放16位数据的地址的指针。
即:unsigned short *pa = (unsigned short *)Address;
*pa = 0x12345678;
(4)va_list,va_start,va_arg,va_end,vsnprintf定义和用法:https://blog.****.net/swif_n_f/article/details/78712315
https://blog.****.net/f110300641/article/details/83822290