我正在尝试在stm32f103c8中使用USART1启用DMA1,但是它不起作用。 我使usart可以用作发射器。 然后启用DMA1并对其进行配置 1使能来自RCC的DMA1时钟。 2禁用DMA1通道。 3设置DMA1通道的周长为非常高的周长。 4使DMA1通道从存储器到外围设备的方向。 5-将内存大小和外围设备大小设置为字节。 6-启用内存增量,并禁用外设增量。 7禁用循环模式。 8位设置DMA中断以完成传输。 7-设置存储器地址缓冲区,并将外设地址设置为usart1数据寄存器。 8将dma传输的次数设置为6。 9使能NVIC中的DMA1通道中断。 10启用usart1中的DMAT以使usart与DMA1一起使用 11-启用DMA1以开始工作。
完成所有此配置后,DMA不起作用,但usart成功运行。 在主代码中,我初始化了usart1,然后初始化了DMA1,正如我所说的,然后将while(1)空了。 终端未在内存和DMA中收到字符串 没有进入处理程序,这意味着DMA永远无法正常工作?
u8 Buffer[6] = "hesham";
int main(void){
/*--------------------------------------------------------------------------------------------*/
RCC_VidInit();
RCC_VidEnablePeripheralClock( APB2_BUS , IOPA_EN ); //Enable PORTA Clock
RCC_VidEnablePeripheralClock( APB2_BUS , USART1_EN ); //Enable USART1 Clock
RCC_VidEnablePeripheralClock( AHB_BUS , DMA1_EN ); //Enable DMA1 Clock
/*--------------------------------------------------------------------------------------------*/
NVIC_VidEnableIRQ( 14 ); //Enable The DMA1Channel4 Interrupt Inside The NVIC
/*-------------------------------GPIO Configuration Of Tx And Rx------------------------------*/
CLR_BIT( GPIOA->CRH , 4 ); SET_BIT( GPIOA->CRH , 5 ); //PIN9 (TX) Output With 2MHZ Speed
CLR_BIT( GPIOA->CRH , 6 ); SET_BIT( GPIOA->CRH , 7 ); //Make Pin9 Alternative Func PushPull
CLR_BIT( GPIOA->CRH , 8 ); CLR_BIT( GPIOA->CRH , 9 ); //Pin10 (RX) Input
SET_BIT( GPIOA->CRH , 10 ); CLR_BIT( GPIOA->CRH , 11 ); //Make Pin10 Floating Input
/*-----------------------------------------------USART1 Configuration--------- ---------------*/
//Using The Deafult M Size = 8 bit And 1 Stop bit
USART1->BRR = 0x341 ; //Set The BaudRate = 9600 Of External Oscillator = 8MHZ
SET_BIT( USART1->CR3 , 7 ); //Enable Usart To Work With DMA As Transmitter (DMAT bit)
SET_BIT( USART1->CR1 , 3 ); SET_BIT( USART1->CR1 , 13 ); //Enable The Transmitter (TE Bit) and Enable The USART (UE bit)
/*-----------------------------------------------DMA1 Channel 4 Configuration-----------------*/
CLR_BIT( DMA1_CHANNEL4->CCR , 0 ); //Disable The DMA To Access The Registers
SET_BIT( DMA1_CHANNEL4->CCR , 1 ); //Enable The Trnasmit Complete Interrupt (TCIE)
SET_BIT( DMA1_CHANNEL4->CCR , 4 ); //DMA Direction Is From Memory To Peripheral
CLR_BIT( DMA1_CHANNEL4->CCR , 5 ); //Disable Circular
CLR_BIT( DMA1_CHANNEL4->CCR , 6 ); //Disable Peripheral Increment
SET_BIT( DMA1_CHANNEL4->CCR , 7 ); //Enable Memory Increment
CLR_BIT( DMA1_CHANNEL4->CCR , 8 ); CLR_BIT( DMA1_CHANNEL4->CCR , 9 ); //Peripheral Size = BYTE
CLR_BIT( DMA1_CHANNEL4->CCR , 10 ); CLR_BIT( DMA1_CHANNEL4->CCR , 11 ); //Memory Size = BYTE
SET_BIT( DMA1_CHANNEL4->CCR , 12 ); SET_BIT( DMA1_CHANNEL4->CCR , 13 ); //Channel Priority = Very High
CLR_BIT( DMA1_CHANNEL4->CCR , 14 ); //Disable Memory To Memory Mode
DMA1_CHANNEL4->CPAR = (u32)USART1->DR ; //The Address Of Peripheral is Usart Data Reg
DMA1_CHANNEL4->CMAR = Buffer ; //The Address Of Memory is Buffer
DMA1_CHANNEL4->CNDTR = 6 ; //The Number Of Transfer Item Is = The Size Of Buffer = 6
//Clear The DMA1 Flags Of Channel 4
SET_BIT( DMA1->IFCR , 12 );SET_BIT( DMA1->IFCR , 13 );SET_BIT( DMA1->IFCR , 14 );SET_BIT( DMA1->IFCR , 15 );
SET_BIT( DMA1_CHANNEL4->CCR , 0 ); //Enable The DMA To Work
/*--------------------------------------------------------------------------------------------*/
while(1);
return 0;
}
这是DMA的处理程序
void DMA1_Channel4_IRQHandler(void){
if( (GET_BIT( DMA1->ISR , 13 )) == 1 ){ //Checking About Transfer Complete Flag Of DMA
//Clear The DMA1 Flags Of Channel 4
SET_BIT( DMA1->IFCR , 12 );SET_BIT( DMA1->IFCR , 13 );SET_BIT( DMA1->IFCR , 14 );SET_BIT( DMA1->IFCR , 15 );
}
}
有人可以帮我吗?
答案 0 :(得分:0)
我已经解决了我的问题,这是配置错误。错误是当我传递数据寄存器的地址时,我尚未传递地址,但我传递了数据寄存器地址的值