使用MDK和Proteus软件,利用外部按键来控制DMA的传送,每按一次按键,DMA就传送一次数据到串口1,串口将数据输出到PC端显示出来。 LED作为程序运行的指示灯。 要求:(1)上传1张主要代码图片(只上传设置DMA的主要函数代码),图片上用数字1、2、3标识三行实现功能的主要代码,并分别解释代码1、2、3,解释内容通过音频上传; (2)上传1张Proteus的仿真结果图,要包含按键按下前和按下后拼成一张图,图中要完整包含DMA的显示内容
时间: 2023-06-18 15:06:48 浏览: 152
很抱歉,我是一名语言模型,无法上传图片和音频。但是我可以为您提供代码解释。
代码1:设置DMA传输的源地址、目的地址、传输数据量和传输方向
```c
void DMA_Configuration(void)
{
DMA_InitTypeDef DMA_InitStructure;
DMA_DeInit(DMA1_Channel4);
DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)&USART1->DR;
DMA_InitStructure.DMA_MemoryBaseAddr = (u32)TxBuffer;
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;
DMA_InitStructure.DMA_BufferSize = TxCounter;
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh;
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
DMA_Init(DMA1_Channel4, &DMA_InitStructure);
}
```
代码2:检测外部按键是否按下,并触发DMA传输
```c
while (1)
{
if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) == 0) //判断按键是否按下
{
DMA_Cmd(DMA1_Channel4, DISABLE); //关闭DMA传输
while(DMA_GetFlagStatus(DMA1_FLAG_TC4) == RESET); //等待DMA传输完成
DMA_ClearFlag(DMA1_FLAG_TC4); //清除DMA传输完成标志
USART_DMACmd(USART1, USART_DMAReq_Tx, ENABLE); //开启USART1的DMA发送请求
DMA_SetCurrDataCounter(DMA1_Channel4, TxCounter); //设置DMA传输数据量
DMA_Cmd(DMA1_Channel4, ENABLE); //开启DMA传输
while(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) == 0); //等待按键释放
}
}
```
代码3:DMA传输完成后,关闭USART1的DMA发送请求并重置TxCounter计数器
```c
void DMA1_Channel4_IRQHandler(void)
{
if(DMA_GetITStatus(DMA1_IT_TC4) != RESET)
{
DMA_ClearITPendingBit(DMA1_IT_TC4);
USART_DMACmd(USART1, USART_DMAReq_Tx, DISABLE); //关闭USART1的DMA发送请求
TxCounter = 0; //重置TxCounter计数器
}
}
```
以上就是实现按键触发DMA传输的主要代码。需要注意的是,在使用DMA传输时,一定要先关闭DMA传输,等待传输完成后再开启DMA传输。同时,在每次传输完成后,要关闭USART1的DMA发送请求,并重置TxCounter计数器。
阅读全文