USART校驗(yàn)控制
STM32F103 系列控制器 USART 支持奇偶校驗(yàn)。當(dāng)使用校驗(yàn)位時(shí),串口傳輸?shù)拈L(zhǎng)度將是 8 位的數(shù)據(jù)幀加上 1 位的校驗(yàn)位總共 9 位,此時(shí) USART_CR1 寄存器的 M 位需要設(shè)置為 1,即 9 數(shù)據(jù)位。
將 USART_CR1 寄存器的 PCE 位置 1 就可以啟動(dòng)奇偶校驗(yàn)控制,奇偶校驗(yàn)由硬件自動(dòng)完成啟動(dòng)了奇偶校驗(yàn)控制之后,在發(fā)送數(shù)據(jù)幀時(shí)會(huì)自動(dòng)添加校驗(yàn)位,接收數(shù)據(jù)時(shí)自動(dòng)驗(yàn)證校驗(yàn)位。接收數(shù)據(jù)時(shí)如果出現(xiàn)奇偶校驗(yàn)位驗(yàn)證失敗,會(huì)見 USART_SR 寄存器的 PE 位置 1,并可以產(chǎn)生奇偶校驗(yàn)中斷。
使能了奇偶校驗(yàn)控制后,每個(gè)字符幀的格式將變成:起始位 + 數(shù)據(jù)幀 + 校驗(yàn)位 + 停止位。
中斷控制
與USART配置有關(guān)的固件庫(kù)函數(shù)
USART 初始化結(jié)構(gòu)體
標(biāo)準(zhǔn)庫(kù)函數(shù)對(duì)每個(gè)外設(shè)都建立了一個(gè)初始化結(jié)構(gòu)體,比如 USART_InitTypeDef,結(jié)構(gòu)體成員用于 設(shè)置外設(shè)工作參數(shù),并由外設(shè)初始化配置函數(shù),比如 USART_Init() 調(diào)用,這些設(shè)定參數(shù)將會(huì)設(shè)置 外設(shè)相應(yīng)的寄存器,達(dá)到配置外設(shè)工作環(huán)境的目的。
初始化結(jié)構(gòu)體定義在 stm32f10x_usart.h 文件中,初始化庫(kù)函數(shù)定義在 stm32f10x_usart.c 文件中。
typedef struct
{
uint32_t USART_BaudRate; // 波特率
uint16_t USART_WordLength; // 字長(zhǎng)
uint16_t USART_StopBits; // 停止位
uint16_t USART_Parity; // 校驗(yàn)位
uint16_t USART_Mode; // USART 模式
uint16_t USART_HardwareFlowControl; // 硬件流控制
} USART_InitTypeDef;
●USART_BaudRate:波特率設(shè)置。
一般設(shè)置為 2400、9600、19200、115200。標(biāo)準(zhǔn)庫(kù)函數(shù)會(huì)根據(jù)設(shè)定值計(jì)算得到 USARTDIV 值,從而設(shè)置 USART_BRR 寄存器值。
●USART_WordLength:數(shù)據(jù)幀字長(zhǎng),可選 8 位或 9 位。
它設(shè)定 USART_CR1 寄存器的 M 位的值。如果沒有使能奇偶校驗(yàn)控制,一般使用 8 數(shù)據(jù)位;如果使能了奇偶校驗(yàn)則一般設(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 個(gè)、1 個(gè)、1.5 個(gè)和 2 個(gè)停止位,它設(shè)定 USART_CR2寄存器的 STOP[1:0] 位的值,一般我們選擇 1 個(gè)停止位。
#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:奇偶校驗(yàn)控制選擇。
奇偶校驗(yàn)位可選 USART_Parity_No(無(wú)校驗(yàn))、USART_Parity_Even(偶校驗(yàn)) 以及 USART_Parity_Odd(奇校驗(yàn)),它設(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,允許使用邏輯或運(yùn)算選擇兩個(gè),它設(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 時(shí)鐘初始化結(jié)構(gòu)體
typedef struct
{
uint16_t USART_Clock; // 時(shí)鐘使能控制
uint16_t USART_CPOL; // 時(shí)鐘極性
uint16_t USART_CPHA; // 時(shí)鐘相位
uint16_t USART_LastBit; // 最尾位時(shí)鐘脈沖
} USART_ClockInitTypeDef;
● USART_Clock:同步模式下 SCLK 引腳上時(shí)鐘輸出使能控制。
可選禁止時(shí)鐘輸出 (USART_Clock_Disable) 或開啟時(shí)鐘輸出 (USART_Clock_Enable);如果使用同步模式發(fā)送,一般都需要開啟時(shí)鐘。它設(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è)置。
可設(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è)置在時(shí)鐘第一個(gè)變化沿捕獲數(shù)據(jù) (USART_CPHA_1Edge) 或在時(shí)鐘第二個(gè)變化沿捕獲數(shù)據(jù)。它設(shè)定 USART_CR2 寄存器的CPHA 位的值。USART_CPHA 與 USART_CPOL 配合使用可以獲得多種模式時(shí)鐘關(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ā)送最后一個(gè)數(shù)據(jù)位的時(shí)候時(shí)鐘脈沖是否在 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文章
148瀏覽量
34288 -
串口通訊
+關(guān)注
關(guān)注
1文章
258瀏覽量
24857 -
串行通訊
+關(guān)注
關(guān)注
2文章
77瀏覽量
16356
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論