常用的串口相關寄存器
- USART_SR狀態寄存器
- USART_DR數據寄存器
- USART_BRR波特率寄存器
串口操作相關庫函數(省略入口參數):
void USART_Init(); //串口初始化:波特率,數據字長,奇偶校驗,硬件流控以及收發使能
void USART_Cmd();//使能串口
void USART_ITConfig();//使能相關中斷void USART_SendData();//發送數據到串口,DR
uint16_t USART_ReceiveData();//接受數據,從DR讀取接受到的數據FlagStatus USART_GetFlagStatus();//獲取狀態標志位
void USART_ClearFlag();//清除狀態標志位
ITStatus USART_GetITStatus();//獲取中斷狀態標志位,若有數據到來則返回一。
void USART_ClearITPendingBit();//清除中斷狀態標志位
FlagStatus USART_GetFlagStatus(USART_TypeDef* USARTx, uint16_t USART_FLAG);
例如我們要判斷讀寄存器是否非空(RXNE),操作庫函數的方法是:
USART_GetFlagStatus(USART1, USART_FLAG_RXNE);
我們要判斷發送是否完成(TC),操作庫函數的方法是:
USART_GetFlagStatus(USART1, USART_FLAG_TC);
void USART_SendData(USART_TypeDef* USARTx, uint16_t Data);
uint16_t USART_ReceiveData(USART_TypeDef* USARTx);
void USART_Init(USART_TypeDef* USARTx, USART_InitTypeDef* USART_InitStruct);
波特率計算方法:
串口配置的一般步驟
- 串口時鐘使能,GPIO時鐘使能,都是這一個函數:
RCC_APB2PeriphClockCmd();
- 串口復位:
USART_DeInit(); 這一步不是必須的
- GPIO端口模式設置:
GPIO_Init();
TX的模式設置為GPIO_Mode_AF_PP
RX的模式設置為浮空輸入( GPIO_Mode_IN_FLOATING)
或帶上拉輸入(GPIO_Mode_IPU)
-
PS :外設的GPIO的MODE配置:
-
串口參數初始化:
USART_Init();
這個函數的第一個入口參數是指定初始化的串口標號,這里選擇 USART1。
第二個入口參數是一個 USART_InitTypeDef 類型的結構體指針,這個結構體指針的成員變量用
來設置串口的一些參數。一般的實現格式為:
USART_InitStructure.USART_BaudRate = bound; //波特率設置;
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); //初始化串口從上面的初始化格式可以看出初始化需要設置的參數為:波特率,字長,停止位,奇偶校驗位,
硬件數據流控制,模式(收,發)。我們可以根據需要設置這些參數。
- 開啟中斷并且初始化NVIC(如果需要開啟中斷才需要這個步驟)
NVIC_Init();USART_ITConfig();
- 使能串口:
USART_Cmd();
- 編寫中斷處理函數:
USARTx_IRQHandler();
- 串口數據收發:
void USART_SendData();//發送數據到串口,DR
uint16_t USART_ReceiveData();//接受數據,從DR讀取接受到的數據
- 串口傳輸狀態獲取:
FlagStatus USART_GetFlagStatus(USART_TypeDef* USARTx, uint16_t USART_FLAG);
void USART_ClearITPendingBit(USART_TypeDef* USARTx, uint16_t USART_IT);
USART.h部分代碼:
#ifndef __UART_H
#define __UART_H
#include "stm32f10x.h"void My_Usart_Init(void);//串口、GPIO、中斷初始化函數
void USART1_IRQHandler(void);//中斷函數#endif
USART.c部分代碼:
#include "USART.h"
void My_Usart_Init(void)
{USART_InitTypeDef USART_InitStrue;GPIO_InitTypeDef GPIO_InitSture;NVIC_InitTypeDef NVIC_InitSture;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//GPIOA時鐘使能RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);//串口時鐘使能USART_DeInit( USART1);//串口復位GPIO_InitSture.GPIO_Pin=GPIO_Pin_9;GPIO_InitSture.GPIO_Mode=GPIO_Mode_AF_PP;//設置GPIOA.9的模式是復用推挽輸出GPIO_InitSture.GPIO_Speed=GPIO_Speed_10MHz;GPIO_Init(GPIOA,&GPIO_InitSture);//GPIO初始化GPIO_InitSture.GPIO_Pin=GPIO_Pin_10;GPIO_InitSture.GPIO_Mode= GPIO_Mode_IN_FLOATING;//設置GPIOA.10的模式是浮空輸入GPIO_InitSture.GPIO_Speed=GPIO_Speed_10MHz;GPIO_Init(GPIOA,&GPIO_InitSture);//GPIO初始化USART_InitStrue.USART_BaudRate=115200;//波特率115200USART_InitStrue.USART_WordLength=USART_WordLength_8b;//8個數據位USART_InitStrue.USART_StopBits=USART_StopBits_1;//一個停止位USART_InitStrue.USART_Parity=USART_Parity_No;//無奇偶校驗位USART_InitStrue.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;//收發模式USART_InitStrue.USART_HardwareFlowControl=USART_HardwareFlowControl_None;USART_Init(USART1,&USART_InitStrue);//串口初始化USART_Cmd(USART1,ENABLE);//串口使能USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);//開啟接收中斷,第一個參數是要使能哪個串口的中斷。//第二個參數是確定使能中斷的類型USART_IT_RXNE是接收緩沖區非空//當接受緩沖區非空的時候觸發中斷,TC是發送完成觸發中斷NVIC_InitSture.NVIC_IRQChannel=USART1_IRQn;//指出是哪一個通道(在stm32f10x.h中可查看通道)NVIC_InitSture.NVIC_IRQChannelCmd=ENABLE;NVIC_InitSture.NVIC_IRQChannelPreemptionPriority=1;NVIC_InitSture.NVIC_IRQChannelSubPriority=1;NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//中斷設置分組NVIC_Init(&NVIC_InitSture);//中斷初始化
}void USART1_IRQHandler(void)//中斷函數
{u8 read;if(USART_GetITStatus(USART1,USART_IT_RXNE)){read=USART_ReceiveData(USART1);//讀取數據USART_SendData(USART1,read);}
}
main.c部分代碼:
#include "stm32f10x.h"
#include "USRT.h"int main(void)
{ My_Usart_Init();while(1);
}