大学生
最后登录1970-1-1
在线时间 小时
注册时间2015-5-29
|
亲们 ,求解惑,感激不尽 。
昨天就被一个师弟问的问题给难住了 ,本来感觉一个简单的DMA问题 ,以为很快就能搞定的 ,结果... 好吧 ,学艺不精!
要实现的功能: 通过串口usart1 中断接受数据,保存在sendBUFF数组中;再通过DMA将数组发送到USart1 的发送端(即: 在串口助手中打印,相当于printf函数)。
以下是我配置的函数:
DMA函数:
#include "bsp_dma.h"
uint8_t SendBuff[SENDBUFF_SIZE];
DMA_InitTypeDef DMA_InitStructure;
void DMA_Config(void)
{
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
NVIC_Config();
DMA_InitStructure.DMA_PeripheralBaseAddr = USART1_DR_Base;
DMA_InitStructure.DMA_MemoryBaseAddr = (u32)SendBuff;
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;
DMA_InitStructure.DMA_BufferSize = SENDBUFF_SIZE;
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
DMA_InitStructure.DMA_Mode = DMA_Mode_Normal ;
DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
DMA_Init(DMA1_Channel4, &DMA_InitStructure);
DMA_Cmd (DMA1_Channel4,ENABLE);
DMA_ITConfig(DMA1_Channel4,DMA_IT_TC,ENABLE);
// RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, DISABLE);
}
static void NVIC_Config(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel4_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
串口函数,直接搬野火教程里的中断函数 。以测试 ,直接用printf函数是可以打印的 。
中断部分:
void USART1_IRQHandler(void)
{
uint16_t i = 0;
while(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
{
SendBuff=USART_ReceiveData(USART1);
// printf("%c",SendBuff);
i++;
}
USART_DMACmd(USART1,USART_DMAReq_Tx,ENABLE);
}
可是,实验结果是这样的 :
实验结果
|
|