基于HAL库的DMA串口通信及中断方式的串口通信
(一)DMA串口通信
- DMA相关信息:
①DMA,全称Direct Memory Access,即直接存储器访问。DMA传输将数据从一个地址空间复制到另一个地址空间,提供在外设和存储器之间或者存储器和存储器之间的高速数据传输。
②DMA用来提供在外设和存储器之间或者存储器和存储器之间的高速数据传输。无须CPU的干预,通过DMA数据可以快速地移动。这就节省了CPU的资源来做其他操作。
③DMA的作用就是实现数据的直接传输,而去掉了传统数据传输需要CPU寄存器参与的环节。
- CubeMX项目创建
①设置RCC与SYS
②设置USART1
选择异步通信Asynchronous,下方参数可修改,但本次操作不需要。
点击该界面的NVIC Setting,设置使能串口
点击DMA Setting 添加通道,点击Add,添加RX,TX两个通道
其余操作与其他STM32Cube项目创建基本一致。
3.代码部分
在main函数代码如下
HAL_Init();
uint8_t message[]="hello Windows!";//定义发送数组
SystemClock_Config();
MX_GPIO_Init();
MX_DMA_Init();
MX_USART1_UART_Init();
while (1)
{
HAL_UART_Transmit_DMA(&huart1,(uint8_t *)message,sizeof(message));
HAL_Delay(1000);
}
编译烧录,运行结果如下:
(二)中断方式的串口通信
1.中断方式与流水灯不同,有专门的函数:
HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
功能:串口中断接收,以中断方式接收指定长度数据。
大致过程是,设置数据存放位置,接收数据长度,然后使能串口接收中断。
接收到数据时,会触发串口中断。
再然后,串口中断函数处理,直到接收到指定长度数据
而后关闭中断,进入中断接收回调函数,不再触发接收中断。(只触发一次中断)
2.STM32Cube项目创建
基本与前面一致,不过还需设置NVIC
3.代码部分
在main函数部分添加如下代码
uint8_t message[]="hello Windows!";//输出信息
uint8_t flag='*';//指令 0:停止 1:开始
while (1)
{
HAL_UART_Receive_IT(&huart1, (uint8_t *)&flag, 1);//设置中断
if(flag=='*'){
HAL_UART_Transmit_IT(&huart1, (uint8_t *)message, sizeof(message)); //发送信息
HAL_Delay(1000);//延时
}
else if(flag=='#')
{
}
}
编译烧录,结果如下: