中级会员
- 积分
- 294
- 金钱
- 294
- 注册时间
- 2014-8-1
- 在线时间
- 6 小时
|
5金钱
本想今晚把我项目的DMA想法分享给群里,结果出现一些问题。
1. 串口初始化
2. DMA初始化
void MYDMA_Config()
{
DMA_InitTypeDef DMA_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2,ENABLE);
DMA_DeInit(DMA2_Stream7);
while (DMA_GetCmdStatus(DMA2_Stream7) != DISABLE){}
DMA_InitStructure.DMA_Channel = DMA_Channel_4;
DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)USART1_DR_ADDRESS;
DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)Buffer;
DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral;
DMA_InitStructure.DMA_BufferSize = 5;
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_Medium;
DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;
DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_Full;
DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;
DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;
DMA_Init(DMA2_Stream7, &DMA_InitStructure);
DMA_Cmd(DMA2_Stream7, ENABLE);
}
3.主函数
int main(void)
{
int i;
 rintf_Init();
for(i=0;i<5;i++) (1)
{
Buffer=i+1;
}
MYDMA_Config(); (2)
USART_DMACmd(USART1,USART_DMAReq_Tx,ENABLE); (3)
return(0);
}
串口打印的数据是 :
主函数
MYDMA_Config(); (2)
for(i=0;i<5;i++) (1)
{
Buffer=i+1;
}
这样的结果就丢失了第一个字节,
搞了一晚上貌似没有网友碰到这样的问题?
我还有一个想法就是 Buffer[] 数组DMA传输的, 每次可以传输数量可以改变] ,也就是
DMA_SetCurrDataCounter(DMA_Streamx,ndtr); //来改变传输量 原子哥例程里的
两个发送函数
void VIEWTECH_79 (u8 On_Time)
{
int i;
i=0;
Buffer[i++]=0xAA;
Buffer[i++]=0x79;
Buffer[i++]=On_Time;
Buffer[i++]=0xCC;
Buffer[i++]=0x33;
Buffer[i++]=0xC3;
Buffer[i++]=0x3C;
MYDMA_Enable(DMA2_Stream7, 7);
}
void VIEWTECH_52(void)
{
u8 i=0;
Buffer[i++]=0xAA;
Buffer[i++]=0x52;
Buffer[i++]=0xCC;
Buffer[i++]=0x33;
Buffer[i++]=0xC3;
Buffer[i++]=0x3C;
MYDMA_Enable(DMA2_Stream7, 6);
}
int main(void)
{
int i;
Printf_Init();
MYDMA_Config();
USART_DMACmd(USART1,USART_DMAReq_Tx,ENABLE); //?????®??1??DMA·???
VIEWTECH_79(100); (1)
VIEWTECH_52(); (2)
return(0);
}
这样运行的结果:
期待结果是: AA 79 64 CC 33 C3 3C AA 52 CC 33 C3 3C
要是把(2)注释掉,运行结果是正确的:
我的想法是我要把我最新的buffer[]数据发出去,大神们帮忙看看,谢谢,估计以后有人也会遇到这样的问题!
|
最佳答案
查看完整内容[请看2#楼]
回复【2楼】正点原子:
---------------------------------
解决方案是:
DMA_Cmd(DMA2_Stream7, ENABLE); 这条语句不能放在DMA初始化函数里,只要放在你构建好的数组后面就不会
int i;
Printf_Init() ...
|