DMA,全称Direct Memory Access,即直接存储器访问。
DMA传输将数据从一个地址空间复制到另一个地址空间,提供在外设和存储器之间或者存储器和存储器之间的高速数据传输。

DMA用来提供在外设和存储器之间或者存储器和存储器之间的高速数据传输。无须CPU的干预,通过DMA数据可以快速地移动。这就节省了CPU的资源来做其他操作。
DMA框图


芯片根据实际情况选择

1点击USATR1
2设置MODE为异步通信(Asynchronous)
3基础参数:波特率为115200 Bits/s。传输数据长度为8 Bit。奇偶检验无,停止位1 接收和发送都使能
4GPIO引脚自动设置 USART1_RX/USART_TX


点击DMASettings 下的 Add 添加通道,传输速率设置为中速






点击右上角GENERATE CODE,完成
上面的步骤由于芯片差异,不是每一步都要求一样,按照实际情况来。
三、代码改写及运行效果
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_USART2_UART_Init();
uint8_t Senbuff[10] = {1,2,3,4,5,6,7,8,9,0};
uint8_t Senbuff2[10] = {1,2,3,4,5,6,7,8,9,0};
uint16_t count = 0;
while (1)
{
count++;
memset(Senbuff, 0, 10);
memcpy(Senbuff, Senbuff2, 10);
Senbuff[0] = count;
HAL_Delay(5);
/* USER CODE END WHILE */
HAL_UART_Transmit_DMA(&huart2, (uint8_t *)Senbuff, sizeof(Senbuff));
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10, GPIO_PIN_RESET);
HAL_Delay(100);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10, GPIO_PIN_SET);
HAL_Delay(100);
}
}
1.开机只打印一次

2.开机狂打日志

至于为什么还在研究中…
UASRT2要勾选中断,重新生成代码正常了。DMA确实比较好用

1.主要参考STM32之DMA通信
2.STM32的中断控制与DMA