所用型号:STM32F103ZET6
PA2/3是摁扭。
PA4/5是LED。
上一篇写了串口的接收与发送和接收中断的
这次学习串口的DMA,通过DMA接收和发送。
DAM可以大大减少cpu的定向数据搬运的工作量
解放cpu,减少cpu的空闲时间,大大提高cpu的工作效率
具体的DMA大家去百度学习
CubeMX配置
1.DAM串口发送
函数:HAL_UART_Transmit_DMA();
函数说明:
- 以DMA模式发送大量数据。
- 当UART奇偶校验不启用时(PCE = 0),并且字长被配置为9位(M1-M0 =01),发送的数据被处理为u16的集合。在这种情况下,Size必须表示通过pData提供的u16的数量。
原型:
HAL_StatusTypeDef HAL_UART_Receive_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size) 参数说明:
- huart:指向UART_HandleTypeDef结构的指针,该结构包含指定UART模块的配置信息。
- pData:指向数据缓冲区(u8或u16数据元素)的指针。
- Size:要发送的数据元素的数量(u8或u16)
1.DAM串口接收
函数:HAL_UART_Receive_DMA();
函数说明:
- 以DMA模式接收大量数据。
- 当UART奇偶校验不启用时(PCE = 0),并且字长被配置为9位(M1-M0 =01),将要接收的数据被处理为u16的集合。在这种情况下,Size必须表示通过pData提供的u16的数量。
- 当启用UART奇偶校验(PCE = 1)时,接收到的数据包含奇偶校验位。
原型:
HAL_StatusTypeDef HAL_UART_Transmit_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size) 参数说明:
- huart:指向UART_HandleTypeDef结构的指针,该结构包含指定UART模块的配置信息。
- pData:指向数据缓冲区(u8或u16数据元素)的指针。
- Size:将要接收的数据元素的数量(u8或u16)
上代码,初始化由CubeMX完成,不贴了
主函数
int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_DMA_Init();
MX_USART1_UART_Init();
/* USER CODE BEGIN 2 */
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
strcpy(txbuf, "你好这是一次串口DAM测试,对于DMA接收,在接收后会立即返回,对于DMA发送会重复发送“a”,当A3的摁扭嗯下时会按照ASCII码加1rn");
HAL_UART_Transmit(&huart1, txbuf, strlen(txbuf), 1000);
txbuf[0] = 97;
HAL_UART_Transmit_DMA(&huart1, txbuf, 1); //开启串口DMA发送
HAL_UART_Receive_DMA(&huart1, rxbuf, 1);//开启串口DMA接收
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
if (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_3) == 0)
{
HAL_Delay(10);
if (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_3) == 0)
{
txbuf[0]++;
}
}
}
/* USER CODE END 3 */
}
我开启了串口中断,DMA发送于接收也会触发串口中断
所以中断代码,在main.c里面即可
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
{
HAL_UART_Transmit_DMA(&huart1, txbuf, 1);
}
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
HAL_UART_Transmit(&huart1, rxbuf, strlen(txbuf), 100);
}
所用型号:STM32F103ZET6
PA2/3是摁扭。
PA4/5是LED。
上一篇写了串口的接收与发送和接收中断的
这次学习串口的DMA,通过DMA接收和发送。
DAM可以大大减少cpu的定向数据搬运的工作量
解放cpu,减少cpu的空闲时间,大大提高cpu的工作效率
具体的DMA大家去百度学习
CubeMX配置
1.DAM串口发送
函数:HAL_UART_Transmit_DMA();
函数说明:
- 以DMA模式发送大量数据。
- 当UART奇偶校验不启用时(PCE = 0),并且字长被配置为9位(M1-M0 =01),发送的数据被处理为u16的集合。在这种情况下,Size必须表示通过pData提供的u16的数量。
原型:
HAL_StatusTypeDef HAL_UART_Receive_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size) 参数说明:
- huart:指向UART_HandleTypeDef结构的指针,该结构包含指定UART模块的配置信息。
- pData:指向数据缓冲区(u8或u16数据元素)的指针。
- Size:要发送的数据元素的数量(u8或u16)
1.DAM串口接收
函数:HAL_UART_Receive_DMA();
函数说明:
- 以DMA模式接收大量数据。
- 当UART奇偶校验不启用时(PCE = 0),并且字长被配置为9位(M1-M0 =01),将要接收的数据被处理为u16的集合。在这种情况下,Size必须表示通过pData提供的u16的数量。
- 当启用UART奇偶校验(PCE = 1)时,接收到的数据包含奇偶校验位。
原型:
HAL_StatusTypeDef HAL_UART_Transmit_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size) 参数说明:
- huart:指向UART_HandleTypeDef结构的指针,该结构包含指定UART模块的配置信息。
- pData:指向数据缓冲区(u8或u16数据元素)的指针。
- Size:将要接收的数据元素的数量(u8或u16)
上代码,初始化由CubeMX完成,不贴了
主函数
int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_DMA_Init();
MX_USART1_UART_Init();
/* USER CODE BEGIN 2 */
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
strcpy(txbuf, "你好这是一次串口DAM测试,对于DMA接收,在接收后会立即返回,对于DMA发送会重复发送“a”,当A3的摁扭嗯下时会按照ASCII码加1rn");
HAL_UART_Transmit(&huart1, txbuf, strlen(txbuf), 1000);
txbuf[0] = 97;
HAL_UART_Transmit_DMA(&huart1, txbuf, 1); //开启串口DMA发送
HAL_UART_Receive_DMA(&huart1, rxbuf, 1);//开启串口DMA接收
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
if (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_3) == 0)
{
HAL_Delay(10);
if (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_3) == 0)
{
txbuf[0]++;
}
}
}
/* USER CODE END 3 */
}
我开启了串口中断,DMA发送于接收也会触发串口中断
所以中断代码,在main.c里面即可
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
{
HAL_UART_Transmit_DMA(&huart1, txbuf, 1);
}
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
HAL_UART_Transmit(&huart1, rxbuf, strlen(txbuf), 100);
}
举报