ads1.2 dma s3c2410问题
/****** DMA0 Initialize *****/
rDISRC0 = (U32)(s_array); //将数组首地址赋值给DMA源地址寄存器,但是s_array数组的内容改变后,DMA发送的数据还是数组第一次的值,而且这个“第一次的值”也与数组中的字符串有些不同。高手帮解下什么原因??
下面是整个MAIN.c:
#include <string.h>
#include "..\INC\config.h"
//#define SEND_DATA (*(volatile unsigned char *) 0x30200000)
//#define SEND_ADDR ((unsigned char *) 0x30200000)
char s_array[100]; //定义DMA源数据区,要为全局变量
int stringchange(char sdata)
{
int i,j;
char *s=s_array;
*s='\n';
s++;
*s++='\r';
for(i=0;i<11;i++)
*s++=sdata;
*s++='\n';
*s++='\r';
for(j=0;j<3;j++)
{
*s++=sdata;
for(i=0;i<9;i++)
*s++=' ';
*s++=sdata;
*s++='\n';
*s++='\r';
}
for(i=0;i<11;i++)
*s++=sdata;
*s++='\n';
*s++='\r';
*s++='\n';
*s++='\r';
*s++='\n';
*s++='\r';
for (i=0;s_array。i。;i++);
return i;
}
void DMA_init(void)
{
/*Uart设置成DMA形式*/
rUCON0 = rUCON0 & 0xff3 | 0x8;
/****** DMA0 Initialize *****/
rDISRC0 = (U32)(s_array);
rDISRCC0 = (0<<1)|(0<<0); //Src=AHB,Increment
rDIDST0 = (U32)UTXH0; // Tx FIFO address
rDIDSTC0 = (1<<1)|(1<<0); //Dst=APB,Fixed;
rDCON0 = (0<<31)|(0<<30)|(1<<29)|(0<<2|(0 << 27) | (1 << 24) | (1 << 23) | (1 << 22) | (0 << 20) | (0);
//handshake,Sync=APB,IntEn, unit, single, dst=UART0, HwReqMode, NoAutoReload,Halfword,
// rDMASKTRIG0 = (1<<1); //DMA0En
}
void DMA_start(int num)
{
Uart_Printf("And sending ...\n\r\n\r";
rDCON0 |=num; //The number of sending.
rDMASKTRIG0 = (1<<1); //DMA0En
}
void Main(void)
{
char data=0,i;
Target_Init();
DMA_init();
//memset(s_array,0,100);
for(i=0;i<100;i++)
s_array=0;
while(1)
{
Uart_Printf("\n\r\n\r\n\r\n\rPlease insert character ...\n\r";
while(!data)
{
data = Uart_GetKey();
}
Uart_Printf("\n\r\n\rReseived . It is %c.\n\r",data);
DMA_start(stringchange(s_array,data));
data=0;
}
}
///////////////////
以s_array开始的地址的字符串的内容有改变,而发送的数据没有变
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
自己顶下!!
void Main(void)
{
char data=0,i;
Target_Init();
DMA_init();
//memset(s_array,0,100);
for(i=0;i<100;i++)
s_array=0;
while(1)
{
Uart_Printf("\n\r\n\r\n\r\n\rPlease insert character ...\n\r";
while(!data)
{
data = Uart_GetKey();
}
Uart_Printf("\n\r\n\rReseived . It is %c.\n\r",data);
DMA_start(stringchange(s_array,data));
data=0;
}
}
int stringchange(char sdata)
问题不能是在楼上的说的那儿,MAIN是下面这样
#include <string.h>
#include "..\INC\config.h"
//#define SEND_DATA (*(volatile unsigned char *) 0x30200000)
//#define SEND_ADDR ((unsigned char *) 0x30200000)
char s_array[100]; //定义DMA源数据区,要为全局变量
int stringchange(char sdata)
{
int i,j;
char *s=s_array;
*s='\n';
s++;
*s++='\r';
for(i=0;i<11;i++)
*s++=sdata;
*s++='\n';
*s++='\r';
for(j=0;j<3;j++)
{
*s++=sdata;
for(i=0;i<9;i++)
*s++=' ';
*s++=sdata;
*s++='\n';
*s++='\r';
}
for(i=0;i<11;i++)
*s++=sdata;
*s++='\n';
*s++='\r';
*s++='\n';
*s++='\r';
*s++='\n';
*s++='\r';
for (i=0;s_array(i);i++); //中括号显示不出来,用(i)代替。
return i;
}
void DMA_init(void)
{
/*Uart设置成DMA形式*/
rUCON0 = rUCON0 & 0xff3 | 0x8;
/****** DMA0 Initialize *****/
rDISRC0 = (U32)(s_array);
rDISRCC0 = (0<<1)|(0<<0); //Src=AHB,Increment
rDIDST0 = (U32)UTXH0; // Tx FIFO address
rDIDSTC0 = (1<<1)|(1<<0); //Dst=APB,Fixed;
rDCON0 = (0<<31)|(0<<30)|(1<<29)|(0<<2|(0 << 27) | (1 << 24) | (1 << 23) | (1 << 22) | (0 << 20) | (0);
//handshake,Sync=APB,IntEn, unit, single, dst=UART0, HwReqMode, NoAutoReload,Halfword,
// rDMASKTRIG0 = (1<<1); //DMA0En
}
void DMA_start(int num)
{
Uart_Printf("And sending ...\n\r\n\r";
rDCON0 |=num; //The number of sending.
rDMASKTRIG0 = (1<<1); //DMA0En
}
void Main(void)
{
char data=0,i;
Target_Init();
DMA_init();
//memset(s_array,0,100);
for(i=0;i<100;i++)
s_array(i)=0;//中括号显示不出来,用(i)代替。
while(1)
{
Uart_Printf("\n\r\n\r\n\r\n\rPlease insert character ...\n\r";
while(!data)
{
data = Uart_GetKey();
}
Uart_Printf("\n\r\n\rReseived . It is %c.\n\r",data);
DMA_start(stringchange(data));
data=0;
}
}
自己顶起来