这是我们用的F1的代码,F4的原理应该差不多
//初始化uart1的DMA发送,未启动
//uart1 TX对应DMA1_CH4
void InitUart1DmaT(void)
{
DMA1_Channel4->CPAR = (u32)(&(USART1->DR));
DMA1_Channel4->CCR = DMA_DIR_PeripheralDST
| DMA_PeripheralInc_Disable
| DMA_MemoryInc_Enable
| DMA_PeripheralDataSize_Byte
| DMA_MemoryDataSize_Byte
| DMA_Mode_Normal
| DMA_Priority_VeryHigh
| DMA_M2M_Disable
| DMA_IT_TC
| DISABLE;
USART1->CR3 |= USART_DMAReq_Tx;
}
//uart1使用DMA_CH4发送数据
void sio1_write_dma(const char *pDat,u16 len){
if(DMA1_Channel4->CCR & ENABLE) {//如果已经启动DMA
while(!(DMA1->ISR & DMA_ISR_TCIF4));//等发送完成
DMA1->IFCR |= DMA_IFCR_CTCIF4; //清状态位
DMA1_Channel4->CCR &= ~ENABLE;//禁DMA
}
DMA1_Channel4->CMAR = (u32)(pDat); //设定数据地址
DMA1_Channel4->CNDTR = len; //设定数据长度
DMA1_Channel4->CCR |= ENABLE; //使能
}
|