瑞萨单片机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位地址。
是这样的 说的很有道理~~
谢谢分享,大赞!