日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

STM32之UART

發(fā)布時間:2024/3/12 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 STM32之UART 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

UART,是通用異步收發(fā)傳輸器(Universal Asynchronous Receiver/Transmitter),既然是“器”,顯然,它就是個設(shè)備而已,要完成一個特定的功能的硬件,它本身并不是協(xié)議。那么它要完成什么功能呢?它的最基本功能,是串行數(shù)據(jù)和并行數(shù)據(jù)之間的轉(zhuǎn)換。我們知道,計算機中的數(shù)據(jù)以Byte為基本單位,對一個Byte的存取是并行的,即,同時取得/寫入8個bit。而串行通信,需要把這個Byte“打碎”,按照時間順序來收發(fā)以實現(xiàn)串行。

RS232/RS485,是兩種不同的電氣協(xié)議,也就是說,是對電氣特性以及物理特性的規(guī)定,作用于數(shù)據(jù)的傳輸通路上,它并不內(nèi)含對數(shù)據(jù)的處理方式。比如,最顯著的特征是:RS232使用3-15v有效電平,而UART,因為對電氣特性并沒有規(guī)定,所以直接使用CPU使用的電平,就是所謂的TTL電平(可能在0~3.3V之間)。更具體的,電氣的特性也決定了線路的連接方式,比如RS232,規(guī)定用電平表示數(shù)據(jù),因此線路就是單線路的,用兩根線才能達到全雙工的目的;而RS485, 使用差分電平表示數(shù)據(jù),因此,必須用兩根線才能達到傳輸數(shù)據(jù)的基本要求,要實現(xiàn)全雙工,必需用4根線。但是,無論使用RS232還是RS485,它們與UART是相對獨立的,但是由于電氣特性的差別,必須要有專用的器件和UART接駁,才能完成數(shù)據(jù)在線路和UART之間的正常流動。

普通方式的串口

/* 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 */

注冊接收完成的回調(diào)函數(shù),這個函數(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ā)送需要等待下次中斷

//第二行代碼不會生效,只會發(fā)送"ab",而不會發(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通道的代碼

static void MX_DMA_Init(void) {/* DMA controller clock enable */__HAL_RCC_DMA2_CLK_ENABLE();/* DMA interrupt init *//* DMA2_Stream2_IRQn interrupt configuration */HAL_NVIC_SetPriority(DMA2_Stream2_IRQn, 0, 0);HAL_NVIC_EnableIRQ(DMA2_Stream2_IRQn);/* DMA2_Stream7_IRQn interrupt configuration */HAL_NVIC_SetPriority(DMA2_Stream7_IRQn, 0, 0);HAL_NVIC_EnableIRQ(DMA2_Stream7_IRQn);} HAL_UART_Transmit_DMA(&huart1, buffer, sizeof(buffer));

總結(jié)

以上是生活随笔為你收集整理的STM32之UART的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。