STM32之UART
UART,是通用異步收發(fā)傳輸器(Universal Asynchronous Receiver/Transmitter),既然是“器”,顯然,它就是個(gè)設(shè)備而已,要完成一個(gè)特定的功能的硬件,它本身并不是協(xié)議。那么它要完成什么功能呢?它的最基本功能,是串行數(shù)據(jù)和并行數(shù)據(jù)之間的轉(zhuǎn)換。我們知道,計(jì)算機(jī)中的數(shù)據(jù)以Byte為基本單位,對(duì)一個(gè)Byte的存取是并行的,即,同時(shí)取得/寫(xiě)入8個(gè)bit。而串行通信,需要把這個(gè)Byte“打碎”,按照時(shí)間順序來(lái)收發(fā)以實(shí)現(xiàn)串行。
RS232/RS485,是兩種不同的電氣協(xié)議,也就是說(shuō),是對(duì)電氣特性以及物理特性的規(guī)定,作用于數(shù)據(jù)的傳輸通路上,它并不內(nèi)含對(duì)數(shù)據(jù)的處理方式。比如,最顯著的特征是:RS232使用3-15v有效電平,而UART,因?yàn)閷?duì)電氣特性并沒(méi)有規(guī)定,所以直接使用CPU使用的電平,就是所謂的TTL電平(可能在0~3.3V之間)。更具體的,電氣的特性也決定了線路的連接方式,比如RS232,規(guī)定用電平表示數(shù)據(jù),因此線路就是單線路的,用兩根線才能達(dá)到全雙工的目的;而RS485, 使用差分電平表示數(shù)據(jù),因此,必須用兩根線才能達(dá)到傳輸數(shù)據(jù)的基本要求,要實(shí)現(xiàn)全雙工,必需用4根線。但是,無(wú)論使用RS232還是RS485,它們與UART是相對(duì)獨(dú)立的,但是由于電氣特性的差別,必須要有專(zhuān)用的器件和UART接駁,才能完成數(shù)據(jù)在線路和UART之間的正常流動(dòng)。
普通方式的串口
/* USER CODE BEGIN WHILE */while (1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 */if(HAL_UART_Receive(&huart1, &c, sizeof(c), 1000) == HAL_OK){if(c == '\r'){HAL_UART_Transmit(&huart1, (uint8_t*)"\n", sizeof("\n"), 1000);}HAL_UART_Transmit(&huart1, &c, sizeof(c), 1000);}}/* USER CODE END 3 */串口使用printf()
#include <stdio.h> #ifdef __GNUC__ int __io_putchar(int ch) {HAL_UART_Transmit(&huart1, (uint8_t*)&ch, 1, 100);if(ch == '\n')HAL_UART_Transmit(&huart1, (uint8_t*)"\r", 2, 100);return ch; } #endif中斷方式UART
先在主函數(shù)中初始調(diào)用一次中斷接收
/* Initialize all configured peripherals */MX_GPIO_Init();MX_USART1_UART_Init();/* USER CODE BEGIN 2 */HAL_UART_Receive_IT(&huart1, &c, sizeof(c));/* USER CODE END 2 */注冊(cè)接收完成的回調(diào)函數(shù),這個(gè)函數(shù)是弱函數(shù)
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) {if(huart == &huart1){if(c == '\r'){HAL_UART_Transmit_IT(huart, (uint8_t*)"\n\r", sizeof("\n\r"));}else{HAL_UART_Transmit_IT(huart, &c, sizeof(c));}}HAL_UART_Receive_IT(huart, &c, sizeof(c)); }HAL_UART_Transmit_IT只發(fā)送一次數(shù)據(jù),下次發(fā)送需要等待下次中斷
//第二行代碼不會(huì)生效,只會(huì)發(fā)送"ab",而不會(huì)發(fā)生"abcde",或者被覆蓋成"cde"//這與中斷的結(jié)構(gòu)有關(guān)HAL_UART_Transmit_IT(huart, (uint8_t*)"ab", sizeof("ab"));HAL_UART_Transmit_IT(huart, (uint8_t*)"abc", sizeof("abc"));DMA串口
以USART1為例
MX配置完DMA通道的代碼
總結(jié)
以上是生活随笔為你收集整理的STM32之UART的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 【QT实现TCP和UDP协议通信(一)】
- 下一篇: IIC、SPI和UART区别