[mw_shl_code=c,true]/***********************************************************************************
***********************************************************************************/
void DMA1_Channel2Config(void)
{
DMA_InitTypeDef DMA_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); //使能DMA传输
DMA_DeInit(DMA1_Channel2); //将DMA的通道4寄存器重设为缺省值
DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)(&USART3->DR); //DMA外设
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST; //数据传输方向,从内存读取发送到外设
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //外设地址寄存器不变
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; //内存地址寄存器递增
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; //数据宽度为8位
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; //数据宽度为8位
DMA_InitStructure.DMA_Mode = DMA_Mode_Normal; //工作在正常缓存模式
DMA_InitStructure.DMA_Priority = DMA_Priority_Medium; //DMA通道 x拥有中优先级
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; //DMA通道x没有设置为内存到内存传输
DMA_Init(DMA1_Channel2, &DMA_InitStructure); //根据DMA_InitStruct中指定的参数初始化DMA的通道USART1_Tx_DMA_Channel所标识的寄存器
DMA_ITConfig(DMA1_Channel2,DMA_IT_TC,ENABLE); //发送完成中断
NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
/***********************************************************************************
***********************************************************************************/
void USART3_DMATransmit(u8*dat,u8 datlen)
{
USART_DMACmd(USART3,USART_DMAReq_Tx,ENABLE);
DMA_Cmd( DMA1_Channel2, DISABLE ); //USART1 TX DMA1
DMA1_Channel2->CMAR = (u32)dat;
DMA1_Channel2->CNDTR = datlen;
DMA_Cmd(DMA1_Channel2, ENABLE);
}
/***********************************************************************************
***********************************************************************************/
void DMA1_Channel2_IRQHandler(void)
{
if(DMA1->ISR&(1<<5))
{
DMA1->IFCR |= (1<<5);
}
}
[/mw_shl_code]
以上是串口3的DMA配置,下面一个奇怪的问题出现了
当main函数是这样时
while
{
lizhi();
}
void lizhi(void)
{
u8 eee[9]={1,2,3,4,5,6,7,8,9};
USART1_DMATransmit(eee,9);
Delay_ms(1000);
}
发送的数据完全正确。当我改成
while
{
lizhi();
Delay_ms(1000);
}
void lizhi(void)
{
u8 eee[9]={1,2,3,4,5,6,7,8,9};
USART1_DMATransmit(eee,9);
}
时。事情就完全不一样了
输出:01 02 03 00 09 02 00 08 A2
这有什么不一样吗?求大神出关
|