1. 程式人生 > 其它 >STM32學習心得--序列通訊相關

STM32學習心得--序列通訊相關

技術標籤:STM32學習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);