USART校驗控制
STM32F103 系列控制器 USART 支持奇偶校驗。當(dāng)使用校驗位時,串口傳輸?shù)拈L度將是 8 位的數(shù)據(jù)幀加上 1 位的校驗位總共 9 位,此時 USART_CR1 寄存器的 M 位需要設(shè)置為 1,即 9 數(shù)據(jù)位。
將 USART_CR1 寄存器的 PCE 位置 1 就可以啟動奇偶校驗控制,奇偶校驗由硬件自動完成啟動了奇偶校驗控制之后,在發(fā)送數(shù)據(jù)幀時會自動添加校驗位,接收數(shù)據(jù)時自動驗證校驗位。接收數(shù)據(jù)時如果出現(xiàn)奇偶校驗位驗證失敗,會見 USART_SR 寄存器的 PE 位置 1,并可以產(chǎn)生奇偶校驗中斷。
使能了奇偶校驗控制后,每個字符幀的格式將變成:起始位 + 數(shù)據(jù)幀 + 校驗位 + 停止位。
中斷控制
與USART配置有關(guān)的固件庫函數(shù)
USART 初始化結(jié)構(gòu)體
標準庫函數(shù)對每個外設(shè)都建立了一個初始化結(jié)構(gòu)體,比如 USART_InitTypeDef,結(jié)構(gòu)體成員用于 設(shè)置外設(shè)工作參數(shù),并由外設(shè)初始化配置函數(shù),比如 USART_Init() 調(diào)用,這些設(shè)定參數(shù)將會設(shè)置 外設(shè)相應(yīng)的寄存器,達到配置外設(shè)工作環(huán)境的目的。
初始化結(jié)構(gòu)體定義在 stm32f10x_usart.h 文件中,初始化庫函數(shù)定義在 stm32f10x_usart.c 文件中。
typedef struct
{
uint32_t USART_BaudRate; // 波特率
uint16_t USART_WordLength; // 字長
uint16_t USART_StopBits; // 停止位
uint16_t USART_Parity; // 校驗位
uint16_t USART_Mode; // USART 模式
uint16_t USART_HardwareFlowControl; // 硬件流控制
} USART_InitTypeDef;
●USART_BaudRate:波特率設(shè)置。
一般設(shè)置為 2400、9600、19200、115200。標準庫函數(shù)會根據(jù)設(shè)定值計算得到 USARTDIV 值,從而設(shè)置 USART_BRR 寄存器值。
●USART_WordLength:數(shù)據(jù)幀字長,可選 8 位或 9 位。
它設(shè)定 USART_CR1 寄存器的 M 位的值。如果沒有使能奇偶校驗控制,一般使用 8 數(shù)據(jù)位;如果使能了奇偶校驗則一般設(shè)置為 9 數(shù)據(jù)位。
#define USART_WordLength_8b ((uint16_t)0x0000)
#define USART_WordLength_9b ((uint16_t)0x1000)
#define IS_USART_WORD_LENGTH(LENGTH) (((LENGTH) == USART_WordLength_8b) || \\
((LENGTH) == USART_WordLength_9b))
● USART_StopBits:停止位設(shè)置。
停止位可選 0.5 個、1 個、1.5 個和 2 個停止位,它設(shè)定 USART_CR2寄存器的 STOP[1:0] 位的值,一般我們選擇 1 個停止位。
#define USART_StopBits_1 ((uint16_t)0x0000)
#define USART_StopBits_0_5 ((uint16_t)0x1000)
#define USART_StopBits_2 ((uint16_t)0x2000)
#define USART_StopBits_1_5 ((uint16_t)0x3000)
#define IS_USART_STOPBITS(STOPBITS) (((STOPBITS) == USART_StopBits_1) || \\
((STOPBITS) == USART_StopBits_0_5) || \\
((STOPBITS) == USART_StopBits_2) || \\
((STOPBITS) == USART_StopBits_1_5))
● USART_Parity:奇偶校驗控制選擇。
奇偶校驗位可選 USART_Parity_No(無校驗)、USART_Parity_Even(偶校驗) 以及 USART_Parity_Odd(奇校驗),它設(shè)定 USART_CR1 寄存器的 PCE 位和 PS 位的值。
#define USART_Parity_No ((uint16_t)0x0000)
#define USART_Parity_Even ((uint16_t)0x0400)
#define USART_Parity_Odd ((uint16_t)0x0600)
#define IS_USART_PARITY(PARITY) (((PARITY) == USART_Parity_No) || \\
((PARITY) == USART_Parity_Even) || \\
((PARITY) == USART_Parity_Odd))
● USART_Mode:USART 模式選擇。
USART的模式有 USART_Mode_Rx 和 USART_Mode_Tx,允許使用邏輯或運算選擇兩個,它設(shè)定 USART_CR1 寄存器的 RE 位和 TE 位。
#define USART_Mode_Rx ((uint16_t)0x0004)
#define USART_Mode_Tx ((uint16_t)0x0008)
#define IS_USART_MODE(MODE) ((((MODE) & (uint16_t)0xFFF3) == 0x00) && ((MODE) != (uint16_t)0x00))
●USART_HardwareFlowControl:硬件流控制選擇。
#define USART_HardwareFlowControl_None ((uint16_t)0x0000)
#define USART_HardwareFlowControl_RTS ((uint16_t)0x0100)
#define USART_HardwareFlowControl_CTS ((uint16_t)0x0200)
#define USART_HardwareFlowControl_RTS_CTS ((uint16_t)0x0300)
#define IS_USART_HARDWARE_FLOW_CONTROL(CONTROL)\\
(((CONTROL) == USART_HardwareFlowControl_None) || \\
((CONTROL) == USART_HardwareFlowControl_RTS) || \\
((CONTROL) == USART_HardwareFlowControl_CTS) || \\
((CONTROL) == USART_HardwareFlowControl_RTS_CTS))
USART 時鐘初始化結(jié)構(gòu)體
typedef struct
{
uint16_t USART_Clock; // 時鐘使能控制
uint16_t USART_CPOL; // 時鐘極性
uint16_t USART_CPHA; // 時鐘相位
uint16_t USART_LastBit; // 最尾位時鐘脈沖
} USART_ClockInitTypeDef;
● USART_Clock:同步模式下 SCLK 引腳上時鐘輸出使能控制。
可選禁止時鐘輸出 (USART_Clock_Disable) 或開啟時鐘輸出 (USART_Clock_Enable);如果使用同步模式發(fā)送,一般都需要開啟時鐘。它設(shè)定 USART_CR2 寄存器的 CLKEN 位的值。
#define USART_Clock_Disable ((uint16_t)0x0000)
#define USART_Clock_Enable ((uint16_t)0x0800)
#define IS_USART_CLOCK(CLOCK) (((CLOCK) == USART_Clock_Disable) || \\
((CLOCK) == USART_Clock_Enable))
● USART_CPOL:同步模式下 SCLK 引腳上輸出時鐘極性設(shè)置。
可設(shè)置在空閑時 SCLK 引腳為低電平 (USART_CPOL_Low) 或高電平 (USART_CPOL_High)。它設(shè)定 USART_CR2 寄存器的 CPOL位的值。
#define USART_CPOL_Low ((uint16_t)0x0000)
#define USART_CPOL_High ((uint16_t)0x0400)
#define IS_USART_CPOL(CPOL) (((CPOL) == USART_CPOL_Low) || ((CPOL) == USART_CPOL_High))
● USART_CPHA:同步模式下 SCLK 引腳上輸出時鐘相位設(shè)置。
可設(shè)置在時鐘第一個變化沿捕獲數(shù)據(jù) (USART_CPHA_1Edge) 或在時鐘第二個變化沿捕獲數(shù)據(jù)。它設(shè)定 USART_CR2 寄存器的CPHA 位的值。USART_CPHA 與 USART_CPOL 配合使用可以獲得多種模式時鐘關(guān)系。
#define USART_CPHA_1Edge ((uint16_t)0x0000)
#define USART_CPHA_2Edge ((uint16_t)0x0200)
#define IS_USART_CPHA(CPHA) (((CPHA) == USART_CPHA_1Edge) || ((CPHA) == USART_CPHA_2Edge))
● USART_LastBit:選擇在發(fā)送最后一個數(shù)據(jù)位的時候時鐘脈沖是否在 SCLK 引腳輸出。
可以是不輸出脈沖 (USART_LastBit_Disable)、輸出脈沖 (USART_LastBit_Enable)。它設(shè)定USART_CR2 寄存器的 LBCL 位的值。
#define USART_LastBit_Disable ((uint16_t)0x0000)
#define USART_LastBit_Enable ((uint16_t)0x0100)
#define IS_USART_LASTBIT(LASTBIT) (((LASTBIT) == USART_LastBit_Disable) || \\
((LASTBIT) == USART_LastBit_Enable))
-
物理層
+關(guān)注
關(guān)注
1文章
150瀏覽量
34372 -
串口通訊
+關(guān)注
關(guān)注
1文章
260瀏覽量
24931 -
串行通訊
+關(guān)注
關(guān)注
2文章
77瀏覽量
16376
發(fā)布評論請先 登錄
相關(guān)推薦
評論