当前位置:   article > 正文

STM3CubeMX&Keil——STM32F103C8T6:HAL库实现DMA串口通信_stm32f103c8t6最小系统板 hal 串口通信

stm32f103c8t6最小系统板 hal 串口通信

一、DMA

(一)定义

①DMA(Direct Memory Access)全称为:直接内存访问

②DMA既可以指内存和外设直接存取数据这种内存访问的计算机技术,又可以指实现该技术的硬件模块(对于通用计算机PC而言,DMA控制逻辑由CPU和DMA控制接口逻辑芯片共同组成,嵌入式系统的DMA控制器内建在处理器芯片内部,一般称为DMA控制器,DMAC)。

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

(二)DMA传输

①DMA传输就是将数据从一个地址空间复制到另一个地址空间,提供在外设和存储器之间或者存储器和存储器之间的高速数据传输。

②DMA的作用就是实现数据的直接传输,而去掉了传统数据传输需要CPU寄存器参与的环节,主要涉及四种情况的数据传输:外设到内存、内存到外设、内存到内存、外设到外设。

1.传输参数

参数设置主要涉及源地址、目标地址、传输数据量这三个,DMA控制器就会启动数据传输,当剩余传输数据量为0时 达到传输终点,结束DMA传输 ,当然,DMA 还有循环传输模式 当到达传输终点时会重新启动DMA传输。

也就是说只要剩余传输数据量不是0,而且DMA是启动状态,那么就会发生数据传输。

2.DMA传输方式

①DMA_Mode_Normal,正常模式,

当一次DMA数据传输完后,停止DMA传送 ,也就是只传输一次
  
②DMA_Mode_Circular ,循环传输模式

当传输结束时,硬件自动会将传输数据量寄存器进行重装,进行下一轮的数据传输。 也就是多次传输模式

(三)C8T6的DMA资源

stm32F103C8T6有一个DMA资源(7个通道),每个通道都支持软件触发和特定的硬件触发,一般在存储器和存储器之间数据传输用软件触发,外设和存储器之间数据传输用硬件触发。
DMA1里仲裁器是有多通道使用的情况下,根据通道优先级决定通道使用顺序问题。在总线矩阵里也有一个仲裁器,作用是当CPU和DMA同时访问同一个外设时,DMA会暂停CPU的访问。DMA请求用与硬件触发DMA数据转运
DMA基本框图
在这里插入图片描述
在发生一个事件后,外设向DMA控制器发送一个请求信号。DMA控制器根据通道的优先权处理请求。当DMA控制器开始访问发出请求的外设时,DMA控制器立即发送给它一个应答信号。当从DMA控制器得到应答信号时,外设立即释放它的请求。一旦外设释放了这个请求,DMA控制器同时撤销应答信号。DMA传输结束,如果有更多的请求时,外设可以启动下一个周期。

每次DMA传送由3个操作组成:

①从外设数据寄存器或者从当前外设/存储器地址寄存器指示的存储器地址取数据,第一次传输时的开始地址是DMA_CPARx或DMA_CMARx寄存器指定的外设基地址或存储器单元;
②存数据到外设数据寄存器或者当前外设/存储器地址寄存器指示的存储器地址,第一次传输时的开始地址是DMA_CPARx或DMA_CMARx寄存器指定的外设基地址或存储器单元;
③执行一次DMA_CNDTRx寄存器的递减操作,该寄存器包含未完成的操作数目。

(四)DMA中断

每个DMA通道都可以在DMA传输过半、传输完成和传输错误时产生中断。为应用的灵活性考虑,通过设置寄存器的不同位来打开这些中断。
在这里插入图片描述

二、使用HAL库实现DMA串口通信

(一)在STM32CubeMX中新建文件

1.选择c8t6

在这里插入图片描述

2.设置RCC、SYS

在这里插入图片描述
在这里插入图片描述

一定要将sys的debug设置为Serial wire ,否则一直是no debug的话,使用ST-Link烧录第一次后,后面烧录需要将boot0置1才能再次烧录进去,就变得和串口一样麻烦了。

3.设置USART1、DMA

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4.设置时钟源

在这里插入图片描述

5.设置项目文件

在这里插入图片描述
在这里插入图片描述

(二)编写代码

1.声明常量

char Sendbuff[] = "Hello Windows!\r\n";
int flag = 1;
char receive ;
char r1[] = "start";
char r2[] = "stop";
char start[] ="start......\r\n";
char stop[] ="stop!\r\n";
char Error[] = "Input Error,Please input again.\r\n";
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

在这里插入图片描述

2.int main()前声明函数

    HAL_UART_Receive_DMA(&huart1,(uint8_t *)&receive,sizeof(receive));
  • 1

在这里插入图片描述

3.写while循环

	  if(flag == 1){
		  HAL_UART_Transmit_DMA(&huart1,(uint8_t *)Sendbuff,sizeof(Sendbuff));
		  HAL_Delay(1000);
	  }
  • 1
  • 2
  • 3
  • 4

在这里插入图片描述

4.回调

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{

	if(receive == '0')

	{
		flag = 1;
		HAL_UART_Transmit_DMA(&huart1,(uint8_t *)start,sizeof(start));		
	}
	else if(receive == '1')
	{
		flag = 0;
		HAL_UART_Transmit_DMA(&huart1,(uint8_t *)stop,sizeof(stop));			
	}
	else
	{
		flag = 0;
		HAL_UART_Transmit_DMA(&huart1,(uint8_t *)Error,sizeof(Error));
	}
	
	HAL_UART_Receive_DMA(&huart1,(uint8_t *)&receive,sizeof(receive));
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

在这里插入图片描述

(三)运行程序

在这里插入图片描述

三、总结

通过使用DMA串口通信实现最小系统板与windows11之间进行通信,发送“Hello World!”,与之前使用中断来进行通信相比,对cpu的占用更小,更加实用。

四、引用

【JamFF】DMA详解
【Z小旋】【STM32】 DMA原理,步骤超细详解,一文看懂DMA
【欠欠白白】STM32DMA资源
【醉意丶千层梦】基于HAL库实现DMA串口通信

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/433235?site
推荐阅读
相关标签
  

闽ICP备14008679号