一、RS232通信協議
1、概念
個人計算機上的通訊接口之一,由電子工業協會(Electronic Industries Association,EIA) 所制定的異步傳輸標准接口。
2、電氣特性
邏輯1(MARK): -3V~-15V
邏輯0(SPACE): +3~+15V
3、接口
實現全雙工異步通信只需要三根線:RX、TX和GND。
二、常見COMS電平轉RS232電平的芯片--MAX3232
1、邏輯輸入與邏輯輸出特性
2、RS232接口端輸入特性
3、RS232接口端輸出特性
三、STM32串口硬件電路
1、芯片內部串口電路
2、開發板串口硬件電路
四、STM32串口編程
1、整體流程
① 開啟GPIO時鍾和USARTX時鍾
② 配置TX和RX引腳
③ 初始化USART控制器
2、細節實現
① 開啟GPIO時鍾和USARTX時鍾
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE);
② 配置TX和RX引腳
/* Configure USART1 Tx (PA.09) as alternate function push-pull */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); /* Configure USART1 Rx (PA.10) as input floating */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOA, &GPIO_InitStructure);
③ 初始化USART控制器
/* USART1 mode config */ USART_InitStructure.USART_BaudRate = 115200; USART_InitStructure.USART_WordLength = USART_WordLength_8b; 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_Cmd(USART1, ENABLE);
五、STM32串口疑惑
1、串口時鍾使能與控制器使能的關系
為何USART時鍾使能了,還需要在配置USART控制器的時候再使能一次?
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE);
USART_Cmd(USART1, ENABLE);
1> USART的時鍾使能
APB2 peripheral clock enable register (RCC_APB2ENR)
2> USART控制器使能
USART Control register 1(USART_CR1)
3> 原因
RCC_APB2ENR: 控制APB2時鍾是否供應給USART控制器
USART_CR1: 控制USART控制器的分頻器和輸出是否工作
2、TDR與RDR共用一個特殊功能寄存器地址
USART_DR功能描述:
包含了發送或接收的數據。由於它是由兩個寄存器組成的,一個給發送用(TDR) ,一個給接收用(RDR) ,該寄存器兼具讀和寫的功能。TDR寄存器提供了內部總線和輸出移位寄存器之間的並行接口(參見圖236 )。RDR寄存器提供了輸入移位寄存器和內部總線之間的並行接口。(摘自《STM32參考手冊》)
筆者的理解是:當對USART_DR進行讀操作的時候,訪問的是RDR;當對USART_DR進行寫操作的時候,訪問的是TDR。
六、串口調試時需要注意的地方
1、通過MDK結合一些調試器可以單步、任意斷點等等方式進行代碼的調試。可是,這種調試方法對於調試操作系統,比如uCOS-II,還有那些必須要全速運行才能進行調試的情況,就顯得力不從心。串口調試正是用於這些地方,可以在程序全速運行的情況下,實時的打印系統的運行信息。
2、串口調試也有它的局限性,由於串口的波特率相對於STM32這樣高速運行的單片機顯得遲鈍,很多情況下不能及時的打印系統的運行信息。甚至有些情況下,我們原本那些串口調試的代碼會成為影響我們系統實時性最主要的因素。
參考資料:《STM32庫開發實戰指南》
《STM32芯片手冊》