微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 瑞萨单片机RL78/G13 样例程序 DMAC程序错误

瑞萨单片机RL78/G13 样例程序 DMAC程序错误

时间:10-02 整理:3721RD 点击:

void DMAC_DataTransfer(void)
{
        /* Enable the DMAC */
        R_DMAC0_Start();
        /* Start UART0 operations */
        R_UART0_Start();
        /* Wait for transfers to complete */
        while(gDMAC_Transfer != 0x1)
        {
                /* Transmit a byte from the data buffer */
                TXD0 = gDMAC_DataBuff[gTransfer_Count];
        
                /* Wait for end of UART transmit */
                while(STIF0 == 0);
                /* Check if the last byte in the buffer has been transmitted */
                if(gTransfer_Count++ == 0xF)
                {
                        /* Reset count */
                        gTransfer_Count = 0;
                }
        }        
        /* Inform the user that the specified
           number of transfers has been reached */
        DisplayString(LCD_LINE2, "  END   ");
}
就是这一段,DMA启动后会自动把内存中该地址的数据一个一个的送往目标地址,这个例子程序中查询后还继续给目标地址赋值是多此一举,正确的根据手册应该在第一次启动时只赋值一次后面DMA会自动传递数据。正确的应该是这样已经测试通过
void DMA_Config(uint16_t *RAM_ADDRESS,uint16_t cnt)
{
  DRC0 = _80_DMA_OPERATION_ENABLE;
    NOP();
    NOP();
    DMAMK0 = 1U; /* disable INTDMA0 interrupt */
    DMAIF0 = 0U; /* clear INTDMA0 interrupt flag */
    /* Set INTDMA0 high priority */
    DMAPR10 = 0U;
    DMAPR00 = 0U;                //DMA priority is low
    DMC0 = _40_DMA_TRANSFER_DIR_RAM2SFR | _00_DMA_DATA_SIZE_8 | _06_DMA_TRIGGER_ST0_CSI00;
    DSA0 = 0x10;        // DMA SFR_ADDRESS TXD0
    DRA0 =RAM_ADDRESS;// 0xefc7;                //DMA Ram address
    DBC0 =cnt;//cnt;// _0020_DMA0_BYTE_COUNT; DMA Buffer size
    DEN0 = 0U; /* disable DMA0 operation */       
                 
}
void DMA1_USART1_SEND(uint8_t   *Buff,uint16_t len)
{       
          DMA_Config(Buff+1,len);//DMA Channel 0,
        R_DMAC0_Start();                //start DMA
        R_UART0_Start();                //start uart
        /* Wait for transfers to complete */
        TXD0 = Buff[gTransfer_Count];
        /*while(gDMAC_Transfer != 0x1)
        {
               
                TXD0 = Buff[gTransfer_Count];// Transmit a byte from the data buffer
               
                while(STIF0 == 0);// Wait for end of UART transmit
               
                if(gTransfer_Count++ ==len)//Check if the last byte in the buffer has been transmitted
                {
                       
                        gTransfer_Count = 0;//Reset count
                }
        }       
        gDMAC_Transfer = 0;
        */
}
__interrupt static void r_dmac0_interrupt(void)
{
    /* Set flag to indicate end of transfers */
        gDMAC_Transfer = 0x1;
    /* Clear DMAC interrupt flag */
            DMAIF0 = 0;
   //R_DMAC0_Stop();        //transfer complete        ,stop DMA
}
DMA用代码生成器出来的程序使用的话很不方便,因为RAM地址在代码生成器中只能设置一次,不能灵活发送除指定RAM地址数组以外地址的数据,所以编写 DMA_Config(uint16_t *RAM_ADDRESS,uint16_t cnt)第一个参数传送进去RAM地址,第二个参数传送进去DMA数据缓冲区大小,DMA方向是RAM->SFR.这样可以很方便的把该函数作为串口发送函数,传送任意地址自定义的数据。 目标寄存器地址修改这个DSA0 = 0x10;赋值时只赋目标寄存器低8位地址。

是这样的 说的很有道理~~

谢谢分享,大赞!

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top