DMA1在stm32f103c8中不能与USART1一起使用吗?

时间:2019-12-02 20:57:45

标签: stm32 dma stm32f4 usart

我正在尝试在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 );
    }
}

有人可以帮我吗?

1 个答案:

答案 0 :(得分:0)

我已经解决了我的问题,这是配置错误。错误是当我传递数据寄存器的地址时,我尚未传递地址,但我传递了数据寄存器地址的值