USART驱动的工作原理
总结一下我们之前使用中断的方式来进行数据的发送和接收 如果收到数据数据在RDR寄存器中 RXNE标志位就从0到1触发中断 进入中断服务函数 把数据缓存在队列中 然后在到进程函数中断接收数据函数中进行出队处理
发送数据就是把中断关闭(标志位TXE的寄存器TDR为空的时候为1会误触发中断所以要关闭)要发送的数据进行入队然后打开中断 IDR寄存器中还是没数据
然后标志位TXE为1触发中断 进入中断服务函数把数据出队 逐个发送
USART驱动的具体使用方法
驱动概述
PAL库初始化USART
因为数据发送和数据的接收都是共同用一个中断源
所以只需要设置一个优先级分组和子优先级和抢占优先级
发送缓冲区和接收缓冲区
因为我们是使用中断的方式发送和接收数据的 PAL库中 所以要把数据缓存在队列中也就是缓冲区 但是这个队列不能太长因为队列占用的是RAM 芯片的RAM收到限制
PAL库函数的初始化
hUSART1.Init.USARTx = USART1;hUSART1.Init.BaudRate = 9600;hUSART1.Init.USART_WordLength = USART_WordLength_8b;hUSART1.Init.USART_StopBits = USART_StopBits_1;hUSART1.Init.USART_Parity = USART_Parity_No;hUSART1.Init.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;hUSART1.Init.USART_IRQ_PreemptionPriority = 0;hUSART1.Init.USART_IRQ_SubPriority = 0;hUSART1.Init.TxBufferSize = 128;//缓冲区的长度hUSART1.Init.RxBufferSize = 128;//缓冲区的长度hUSART1.Init.Advanced.Remap = 1;//启用复用功能 AFIOhUSART1.Init.Advanced.LineSeparator = LineSeparator_CRLF; // \r\nPAL_USART_Init(&hUSART1);
编写PAL库的中断服务函数
具体代码
void USART1_IRQHandler(void)
{PAL_USART_IRQHandler(&hUSART1);
}
数据的发送
数据的接收
time out (超时值)如果在调用这个函数接口 对应传入的的TIME out值就如上图所示
数据的接收
PAL_USART_ReadLine 在使用这个函数接口之前先要设置行分隔符的方式 行分隔符就是\r \r\n 等多种分隔行 在初始化的时候调用高级参数
char strBuffer[64];设置为64即可
#include "stm32f10x.h"
#include "stm32f10x_pal.h"
#include "stm32f10x_pal_usart.h"static PalUSART_HandleTypeDef hUSART1;//声明句柄int main(void)
{PAL_Init();hUSART1.Init.USARTx = USART1;hUSART1.Init.BaudRate = 9600;hUSART1.Init.USART_WordLength = USART_WordLength_8b;hUSART1.Init.USART_StopBits = USART_StopBits_1;hUSART1.Init.USART_Parity = USART_Parity_No;hUSART1.Init.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;hUSART1.Init.USART_IRQ_PreemptionPriority = 0;hUSART1.Init.USART_IRQ_SubPriority = 0;hUSART1.Init.TxBufferSize = 128;//缓冲区的长度hUSART1.Init.RxBufferSize = 128;//缓冲区的长度hUSART1.Init.Advanced.Remap = 1;//启用复用功能 AFIOhUSART1.Init.Advanced.LineSeparator = LineSeparator_CRLF; // \r\nPAL_USART_Init(&hUSART1);// // 1. 发送单个字节 0x5a
// PAL_USART_SendByte(&hUSART1, 0x5a);// // 2. 发送字节数组 01 02 03 04 05
// const uint8_t a[] = {1,2,3,4,5};
//
// PAL_USART_SendBytes(&hUSART1, a, sizeof(a)/sizeof(uint8_t));// // 3. 发送单个字符 H
// PAL_USART_PutChar(&hUSART1, 'H');// // 4. 发送字符串Hello world\r\n
// PAL_USART_SendString(&hUSART1, "Hello world\r\n");// // 5. 发送格式化字符串
// const char *name = "Tom";
// uint32_t age = 18;
// float height = 173.5;
//
// PAL_USART_Printf(&hUSART1, "\r\nName:%s\r\nAge:%d\r\nHeight:%.1fcm\r\n", name, age, height);
// // // 1. 接收单个字节
// PAL_USART_SendString(&hUSART1, "Receive single byte...");
// uint8_t byteRcvd;
// byteRcvd = PAL_USART_ReceiveByte(&hUSART1, PAL_MAX_DELAY);
// PAL_USART_Printf(&hUSART1, "Byte received: 0x%02x\r\n", byteRcvd);// // 2. 接收5个字节
// PAL_USART_SendString(&hUSART1, "Receive 5 bytes ...");
//
// uint8_t a[5];
// PAL_USART_ReceiveBytes(&hUSART1, a, 5, PAL_MAX_DELAY);
//
// PAL_USART_Printf(&hUSART1, "5 bytes received: %02x %02x %02x %02x %02x", a[0], a[1], a[2], a[3], a[4]);// 3. 接收一行字符串PAL_USART_SendString(&hUSART1, "Receive a line ...\r\n");char strBuffer[64];PAL_USART_ReadLine(&hUSART1, strBuffer, sizeof(strBuffer) / sizeof(char), PAL_MAX_DELAY);PAL_USART_Printf(&hUSART1, "Line received: %s\r\n", strBuffer);while(1){}
}void USART1_IRQHandler(void)
{PAL_USART_IRQHandler(&hUSART1);
}