概述
本章STM32CUBEMX配置STM32F103,并且在GD32F303中進(jìn)行開(kāi)發(fā),同時(shí)通過(guò)GD32303C_START開(kāi)發(fā)板內(nèi)進(jìn)行驗(yàn)證。 本章主要配置串口進(jìn)行DMA收發(fā)。 需要GD樣片的可以加Q_QUN申請(qǐng):6_15061293。
查閱手冊(cè)可以得知,PA9、PA10為串口0的輸出和輸入口。
樣品申請(qǐng)
https://www.wjx.top/vm/mB2IKus.aspx
硬件準(zhǔn)備
這里準(zhǔn)備了GD32303C_START開(kāi)發(fā)板進(jìn)行驗(yàn)證。
STM32CUBEMX配置
勾選中斷。
開(kāi)啟DMA讀取和接收。 其中Word = 32bit,Half word = 16bit,Byte = 8bit
keil配置
microlib 進(jìn)行了高度優(yōu)化以使代碼變得很小。 它的功能比缺省 C 庫(kù)少,并且根本不具備某些 ISO C 特性。 某些庫(kù)函數(shù)的運(yùn)行速度也比較慢,如果要使用printf(),必須開(kāi)啟。
串口重定向
在main.c中,添加頭文件,若不添加會(huì)出現(xiàn) identifier "FILE" is undefined報(bào)錯(cuò)。
/* USER CODE BEGIN Includes */
#include "stdio.h"
/* USER CODE END Includes */
函數(shù)聲明和串口重定向:
/* USER CODE BEGIN PFP */
#ifdef __GNUC__ //串口重定向
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif
PUTCHAR_PROTOTYPE
{
HAL_UART_Transmit(&huart1 , (uint8_t *)&ch, 1, 0xFFFF);
return ch;
}
/* USER CODE END PFP */
串口接收發(fā)送函數(shù)
一般情況下,串口接收發(fā)送函數(shù)有如下所示。
● HAL_UART_Transmit();串口輪詢模式發(fā)送,使用超時(shí)管理機(jī)制。
● HAL_UART_Receive();串口輪詢模式發(fā)送,使用超時(shí)管理機(jī)制。
● HAL_UART_Transmit_IT();串口中斷模式發(fā)送
● HAL_UART_Receive_IT();串口中斷模式接收
● HAL_UART_Transmit_DMA();串口DMA模式發(fā)送
● HAL_UART_Receive_DMA();串口DMA模式接收
HAL_UART_Transmit_DMA()發(fā)送
測(cè)試代碼如下。 定義需要發(fā)送的數(shù)據(jù)。
/* USER CODE BEGIN PV */
uint8_t TxData[] = "
**** Hello,World!' ***
";
/* USER CODE END PV */
HAL_UART_Transmit_DMA()發(fā)送代碼。
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
HAL_UART_Transmit_DMA(&huart1, (uint8_t *)TxData, sizeof(TxData)-1);
HAL_Delay(1000);
}
/* USER CODE END 3 */
DMA有normal和circular兩種模式。 Normal表單次傳輸,傳輸一次后終止傳輸,所以需要傳輸幾次就需要開(kāi)啟幾次,Circular表示循環(huán)傳輸,傳輸完成后又重新開(kāi)始繼續(xù)傳輸,開(kāi)啟一次后會(huì)一直傳輸。 normal傳輸打印如下所示,傳輸完成就關(guān)閉。
circular傳輸打印如下所示,一直傳輸,不會(huì)停止。
HAL_UART_Receive_DMA()發(fā)送
測(cè)試代碼如下。 定義需要接受存放數(shù)組。
/* USER CODE BEGIN PV */
uint8_t RxData[255];
/* USER CODE END PV */
開(kāi)啟HAL_UART_Receive_DMA()接受代碼。
/* USER CODE BEGIN 2 */
HAL_UART_Receive_DMA(&huart1, RxData, 10); // 這里加這個(gè)函數(shù),接收數(shù)據(jù)
/* USER CODE END 2 */
重寫讀取回調(diào)函數(shù),將接受的數(shù)據(jù)發(fā)送出去在開(kāi)啟接收。
/* USER CODE BEGIN 4 */
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
HAL_UART_Transmit(&huart1, (uint8_t *)"text:", 5,0xffff);//輪詢發(fā)送,不然可能發(fā)送不出去
HAL_UART_Transmit_DMA(&huart1, (uint8_t *)RxData, 10);//發(fā)送接受的數(shù)據(jù)
HAL_UART_Receive_DMA(&huart1, RxData, 10); // 這里加這個(gè)函數(shù),接收數(shù)據(jù)
}
/* USER CODE END 4 */
DMA有normal和circular兩種模式。 Normal表單次接收,接收一次后終止接收,所以需要接收幾次就需要開(kāi)啟幾次,Circular表示循環(huán)接收,接收完成后又重新頭開(kāi)始繼續(xù)接收,開(kāi)啟一次后會(huì)一直接收。 normal傳輸打印如下所示,傳輸完成就關(guān)閉。 演示效果如下所示。
circular接收打印如下所示,當(dāng)發(fā)送數(shù)據(jù)大于接收長(zhǎng)度時(shí)候,會(huì)進(jìn)行循環(huán)接收。
審核編輯 黃昊宇
-
STM32
+關(guān)注
關(guān)注
2272文章
10923瀏覽量
357555 -
dma
+關(guān)注
關(guān)注
3文章
566瀏覽量
100953 -
USART
+關(guān)注
關(guān)注
1文章
195瀏覽量
30968 -
stm32cubemx
+關(guān)注
關(guān)注
5文章
284瀏覽量
15002 -
gd32f303
+關(guān)注
關(guān)注
4文章
38瀏覽量
3718
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論