STM32學習心得--序列通訊相關
1.STM32中與穿行通訊相關的暫存器
1.USART_SR 狀態暫存器,主要用來放置某些標誌位
2.USART_DR 資料暫存器,用於存放資料
3.USART_BRR 波特率暫存器,設定波特率
對於用庫函式來編寫序列通訊相關的程式碼來說,暫存器並不是我們所重點關注的內容,雖然他很重要。如需更多瞭解,可以查閱“STM32中文參考手冊”等
2.波特率的計算
其中,Fpclkx是給串列埠的時鐘(PCLK1用於USART2、3、4、5,PCLK2用於USART1);
USARTDIV是一個無符號定點數。我們只要得到USARTDIV 的值,就可以得到串列埠波特率暫存器USART1->BRR的值,反過來,我們得到USART1->BRR的值,也可以推匯出USARTDIV:的值。但我們更關心的是如何從USARTDIV的值得到USART_BRR的值,因為一般我們知道的是波特率,和 PCLKx的時鐘,要求的就是USART_BRR的值。
下面我們來介紹如何通過USARTDIV得到串列埠USART_BRR暫存器的值。假設我們的串列埠1要設定為115200的波特率,而PCLK2的時鐘為72M。這樣,我們根據上面的公式有:
USARTDIV=72000000/(115200*16)=39.0625
那麼得到:
DIV_Fraction=16*0.0625=1=0x01;
DIV_Mantissa=39=0X27;
然後分別把整數和小數送入波特率設定暫存器
這樣,我們就得到了USART1->BRR 的值為0x0271。只要設定串列埠1的BRR暫存器值為0x0271就可以得到115200的波特率。
3.串列埠操作常用庫函式
與之相關的庫函式在“stm32f10x_uart.h”檔案中有相關的函式宣告。
對其中常用的庫函式進行註釋
void USART_Init();//串列埠初始化:波特率,資料字長,奇偶校驗,硬體流控以及收發使能 void USART_StructInit(); void USART_ClockInit(); void USART_ClockStructInit(); void USART_Cmd();//使能串列埠 void USART_ITConfig();//使能相關中斷 void USART_DMACmd(); void USART_SetAddress(); void USART_WakeUpConfig(); void USART_ReceiverWakeUpCmd(); void USART_LINBreakDetectLengthConfig(); void USART_LINCmd(); void USART_SendData();//傳送資料到串列埠傳送暫存器 uint16_t USART_ReceiveData();//接收資料,從DR讀取接收到的資料 void USART_SendBreak(); void USART_SetGuardTime(); void USART_SetPrescaler(); void USART_SmartCardCmd(); void USART_SmartCardNACKCmd(); void USART_HalfDuplexCmd(); void USART_OverSampling8Cmd(); void USART_OneBitMethodCmd(); void USART_IrDAConfig(); void USART_IrDACmd(); FlagStatus USART_GetFlagStatus();//獲取狀態標誌位 void USART_ClearFlag();//清除狀態標誌位 ITStatus USART_GetITStatus();//獲取中斷狀態標誌位 void USART_ClearITPendingBit();//清除中斷狀態標誌位
下面著重分析串列埠初始化函式
void USART_Init(USART_TypeDef* USARTx, USART_InitTypeDef* USART_InitStruct);
共有兩個形參,第一個是串列埠標號,共有USART1、USART2、USART3、UART4、UART5這幾個引數可供選擇。
第二個引數為串列埠初始化結構體指標,下面來分析結構體中各成員變數
typedef struct
{
uint32_t USART_BaudRate; //波特率,其計算方法前文已經給出
uint16_t USART_WordLength; //字長 可以是8位或9位
uint16_t USART_StopBits; //停止位
uint16_t USART_Parity; //奇偶校驗位
uint16_t USART_Mode; //串列埠模式 ,傳送or接收使能,或者兩個都開啟
uint16_t USART_HardwareFlowControl; //硬體流,此引數很少使用
} USART_InitTypeDef;
4.(*)串列埠配置的一般步驟
1.串列埠時鐘使能, GPIO時鐘使能:RCC_APB2PeriphClockCmd();
2.串列埠復位:USART_Delnit();//這一步不是必須的
3.GPIO埠模式設定:GPIO_lnit();模式設定可以參考STM32中文參考手冊
4.串列埠引數初始化:USART_Init();
5.使能串列埠:USART_Cmd();
6.開啟中斷並且初始化NVIC(如果需要開啟中斷才需要這個步驟)
1.NVIC_PriorityGroupConfig();//配置中斷優先順序分組,建議寫在main函式開頭,並且只寫一次。
2.USART_ITConfig();
3.NVIC_Init();//在misc.h檔案中
typedef struct
{
uint8_t NVIC_IRQChannel;
uint8_t NVIC_IRQChannelPreemptionPriority;
uint8_t NVIC_IRQChannelSubPriority;
FunctionalState NVIC_IRQChannelCmd;
} NVIC_InitTypeDef;
NVIC_IRQChannel; 其引數在stm32f10x.h中以IRQn結尾的引數
NVIC_IRQChannelCmd; ENABLE OR DISABLE
接下來兩個是用來設定搶佔優先順序和子優先順序,與其引數前面配置的分組有關
NVIC_IRQChannelPreemptionPriority;
NVIC_IRQChannelSubPriority;
7.編寫中斷處理函式: USARTx_IRQHandler();
在編寫中斷處理函式時,用ITStatus USART_GetITStatus(USART_TypeDef* USARTx, uint16_t USART_IT);來判斷是否是此串列埠下觸發了中斷
接著使用USART_ReceiveData()來接收資料。
再把其傳送出去
8.串列埠資料收發:
void USART_SendData();//傳送資料到串列埠, DR
uint16_t USART_ReceiveData();//接受資料,從DR讀取接受到的資料
9.串列埠傳輸狀態獲取:
FlagStatus USART_GetFlagStatus(USART TypeDef* USARTX,uint16_t USART _FLAG)
void USART_ClearITPendingBit(USART_TypeDef*USARTX,uint16_t USART_IT);