目录
(一)定义①DMA(Direct Memory Access)全称为:直接内存访问。
三. 在没有示波器条件下,可以使用Keil的软件仿真逻辑分析仪功能观察串口输出波形,并分析时序状态正确与否,计算波特率实际为多少。设置魔法棒
一、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数据转运
二、使用HAL库实现DMA串口通信
(一)在STM32CubeMX中新建文件
2.设置rcc
设置usart1
设置nvic setting
设置dma setting
project
3.编译代码
声明常量为:
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";
int main 的前置声明
HAL_UART_Receive_DMA(&huart1,(uint8_t *)&receive,sizeof(receive));
写循环函数
if(flag == 1){
HAL_UART_Transmit_DMA(&huart1,(uint8_t *)Sendbuff,sizeof(Sendbuff));
HAL_Delay(1000);
}
回调
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));
}
烧录结果:
三. 在没有示波器条件下,可以使用Keil的软件仿真逻辑分析仪功能观察串口输出波形,并分析时序状态正确与否,计算波特率实际为多少。
设置魔法棒
点开仿真图像
ps:注意在观察图像之前需要修改代码,因为按照源代码的思路当没有传入启动信号观察不到端口的传输情况。
示波器显示图像usart1:
波特率:UART通信协议进行一个字节数据的传输时就是在信号线上产生八个高低电平的组合,数据传送速率用波特率来表示,即每秒钟传送的二进制位数。
已知:1位停止位,无校验位
1字符包含 1(起始位)+8(数据位)+0(校验位)+1(停止位)=10bit
计算得115200