STM32串口的設置和庫函數的介紹


串口設置的一般步驟可以總結為如下幾個:
1) 串口時鍾使能, GPIO時鍾使能 
2) 串口復位
3)GPIO 端口模式設置
4) 串口參數初始化 
5) 開啟中斷並且初始化 NVIC(如果需要開啟中斷才這個步驟) (如果需要開啟中斷才這個步驟)
6) 使能串口 使能串口

7) 編寫中斷處理函數 


下面,我們就簡單介紹這幾個與串口基本配置直接相關的固件庫函數。這些函數和 定義主要分布在 stm32f10x_usart.h ,stm32f10x_usart.c 文件中。 

1.串口時鍾使能。串口是掛載在APB2上的,所以使能函數為:

RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1)

2.串口復位。當外設出現異常的時候可以通過復位置 ,實現該外設的復位,然后重新配置這個外設讓其重新工作的目。一般在系統剛開始配置時候,都會先執行復位該這個外 設達到讓其重新工作的目。復位是在函數 USART_DeInit()完成:

void USART_DeInit(USART_TypeDef* USARTx)

3串口參數初始化

void USART_Init()函數: 

     voidUSART_Init(USART_TypeDef*USARTx,USART_InitTypeDef*USART_InitStruct);

作用:

          根據指定參數初始化相應串口(波特率,字長,停止位,奇偶校驗,硬件流控制等)

           主要是用來初始化寄存器BRR以及CR1,CR2,CR3控制寄存器

使用范例:

         USART_InitTypeDefUSART_InitStructure;  

         USART_InitStructure.USART_BaudRate= 9600;//波特率設置;

        USART_InitStructure.USART_WordLength= USART_WordLength_8b;//字長為8位數據格式

        USART_InitStructure.USART_StopBits= USART_StopBits_1;//一個停止位

        USART_InitStructure.USART_Parity= USART_Parity_No;//無奇偶校驗位

        USART_InitStructure.USART_HardwareFlowControl= USART_HardwareFlowControl_None; //無硬件數據流控制

       USART_InitStructure.USART_Mode= USART_Mode_Rx| USART_Mode_Tx;  //收發模式

      USART_Init(USART1,&USART_InitStructure);//初始化串口



4.void USART_Cmd()函數: 

原型:

      voidUSART_Cmd(USART_TypeDef*USARTx,FunctionalStateNewState);

作用:

            使能相應的串口,用來設置寄存器CR1的串口使能位

 使用范例:

           USART_Cmd(USART1,ENABLE);                    //使能串口1


5.void USART_ITConfig()函數: 
原型:     voidUSART_ITConfig(USART_TypeDef*USARTx,

    uint16_t    USART_IT, FunctionalStateNewState);

 作用:開啟串口相應中斷,設置串口控制寄存器
  使用范例:

            USART_ITConfig(USART1,USART_IT_RXNE, ENABLE); //開啟讀數據寄存器非空中斷

6.USART_SendData()函數: 
原型:

       voidUSART_SendData(USART_TypeDef* USARTx, uint16_t Data);

  作用:

            發送數據到串口。

 使用范例:

          USART_SendData(USART1,0x12);                    

7.uint16_tUSART_ReceiveData()函數: 
原型: uint16_t USART_ReceiveData(USART_TypeDef*USARTx)

獲取串口最新接受的值。

 使用范例:

     USART_ReceiveData(USART1);

8.四個狀態標志相關的函數:


FlagStatusUSART_GetFlagStatus(USART_TypeDef*USARTx,uint16_t USART_FLAG);
void USART_ClearFlag(USART_TypeDef*USARTx,uint16_t USART_FLAG);

ITStatusUSART_GetITStatus(USART_TypeDef*USARTx,uint16_t USART_IT);

void USART_ClearITPendingBit(USART_TypeDef*USARTx,uint16_t USART_IT);

以下是一個完整的初始化串口函數和一個中斷服務函數:
//初始化IO 串口1 
//bound:波特率
void uart_init(u32 bound){
    //GPIO端口設置
    GPIO_InitTypeDef GPIO_InitStructure;
 USART_InitTypeDef USART_InitStructure;
 NVIC_InitTypeDef NVIC_InitStructure;
 
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE); //使能USART1,GPIOA時鍾
   USART_DeInit(USART1);  //復位串口1
//USART1_TX   PA.9
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA.9
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //復用推挽輸出
    GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化PA9
   
    //USART1_RX  PA.10
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空輸入
    GPIO_Init(GPIOA, &GPIO_InitStructure);  //初始化PA10


   //Usart1 NVIC 配置


    NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//搶占優先級3
 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //子優先級3
 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能
 NVIC_Init(&NVIC_InitStructure); //根據指定的參數初始化VIC寄存器
  
   //USART 初始化設置


USART_InitStructure.USART_BaudRate = bound;//一般設置為9600;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字長為8位數據格式
USART_InitStructure.USART_StopBits = USART_StopBits_1;//一個停止位
USART_InitStructure.USART_Parity = USART_Parity_No;//無奇偶校驗位
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//無硬件數據流控制
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //收發模式


    USART_Init(USART1, &USART_InitStructure); //初始化串口
    USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//開啟中斷
    USART_Cmd(USART1, ENABLE);                    //使能串口 


}


void USART1_IRQHandler(void)                 //串口1中斷服務程序
{
u8 Res;
#ifdef OS_TICKS_PER_SEC //如果時鍾節拍數定義了,說明要使用ucosII了.
OSIntEnter();    
#endif
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  //接收中斷(接收到的數據必須是0x0d 0x0a結尾)
{
Res =USART_ReceiveData(USART1);//(USART1->DR); //讀取接收到的數據

if((USART_RX_STA&0x8000)==0)//接收未完成
{
if(USART_RX_STA&0x4000)//接收到了0x0d
{
if(Res!=0x0a)USART_RX_STA=0;//接收錯誤,重新開始
else USART_RX_STA|=0x8000; //接收完成了 
}
else //還沒收到0X0D
{
if(Res==0x0d)USART_RX_STA|=0x4000;
else
{
USART_RX_BUF[USART_RX_STA&0X3FFF]=Res ;
USART_RX_STA++;
if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;//接收數據錯誤,重新開始接收  
}  
}
}    
     } 
#ifdef OS_TICKS_PER_SEC //如果時鍾節拍數定義了,說明要使用ucosII了.
OSIntExit();    
#endif
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM