一.STM32串口介绍
a.串口的数据包格式为 起始位+数据位+校验位+停止位,所以一般需要设置数据位为8,校验位为1,停止位为1。我们再发送过程中只发送数据,其他的都由硬件来完成了,所以通信的双方在数据包格式配置相同时才能正确通信。
b.除去数据包格式设置一样外,因为串口大多数都是用异步通信,由于没有时钟信号,所以2个通信设备需约定好波特率,常见的有4800、9600、115200等,波特率一致时才能正确通信。
c.stm32的库文件中将这些需要配置的参数都写在了USART_InitTypeDef 结构体中,我们只要对其进行赋值,再调用函数USART_Init(),USART_Init函数会将USART_InitTypeDef 结构体中的数据写入相应的寄存器,这样就完成了对32串口的配置。
二.串口初始化(统一初始化)
a.串口配置时,只有少数值需要时常更改,大部分都是重复内容,因此将常用的这些值做为参数传入。这样调用一个函数可以对所有的串口进行赋值。(串口使用的GPIO在后续的文章中统一配置)借鉴前辈的代码。
b.串口初始化流程 开外设时钟->配置引脚(统一配置)->配置参数 ->使能中断 ->使能串口
void User_Usart_Init(USART_TypeDef* USARTx, u32 BaudRate, u16 WordLength, u16 StopBits, u16 Parity)
{
USART_InitTypeDef USART_InitStructure;
USART_ClockInitTypeDef USART_ClockInitStructure ;
if(USARTx == USART1)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);// Enable USART1使能或者失能APB2外设时钟 高速72MHz
}
else if(USARTx == USART2)
{
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);// Enable USART2使能或者失能APB1外设时钟 低速36MHz
}
else if(USARTx == USART3)
{
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE);// Enable USART3使能或者失能APB1外设时钟 低速36MHz
}
else if(USARTx == UART4)
{
RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART4,ENABLE);// Enable USART4使能或者失能APB1外设时钟 低速36MHz
}
else if(USARTx == UART5)
{
RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART5,ENABLE);// Enable USART5使能或者失能APB1外设时钟 低速36MH
}
USART_DeInit(USARTx);
USART_InitStructure.USART_BaudRate = BaudRate; //波特率
USART_InitStructure.USART_WordLength = WordLength; //数据长度
USART_InitStructure.USART_StopBits = StopBits; //一个停止位
USART_InitStructure.USART_Parity = Parity; //无校验
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; //禁止硬件流控制
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //Receive and transmit enabled
USART_Init(USARTx, &USART_InitStructure); // Configure the USART1
USART_ClockInitStructure.USART_Clock = USART_Clock_Disable; //USART Clock disabled
USART_ClockInitStructure.USART_CPOL = USART_CPOL_Low; //USART CPOL: Clock is active low
USART_ClockInitStructure.USART_CPHA = USART_CPHA_2Edge; //USART CPHA: Data is captured on the second edge
USART_ClockInitStructure.USART_LastBit = USART_LastBit_Disable; //USART LastBit: The clock pulse of the last data bit is not output to the SCLK pin
USART_ClockInit(USARTx, &USART_ClockInitStructure);
USART_ITConfig(USARTx, USART_IT_RXNE, ENABLE); //允许接收寄存器非空中断
USART_Cmd(USARTx, ENABLE); // Enable USARTx
}
三.拓展待完成
a.关于不同的芯片串口的数量不同,此时可以使用#ifdef和#endif来解决此问题。
b.以下程序只是测试使用,代码较乱,串口中断部分,文章借用了正点原子的串口中断部分。
c.会分三部记录串口的日常使用,后两部分为中断以及读书的记录,会在第三部分完善代码并上传
d.第一次发帖记录学习,不恰当的地方一起讨论学习。
代码下载:
测试.7z
(174.09 KB, 下载次数: 5)
|