一.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)
2021-8-12 16:08 上傳
點擊文件名下載附件
|