本帖最后由 badfong 于 2016-3-2 15:40 编辑
刚接触DSP,选了2812入手,做了块测试板,其中用到Xintf总线及SCI串口资源,看似两个简单的功能,没想到问题多多,希望大神们能帮我解答以下两问题:
1、我先用Xintf总线方式访问外部存储器件,先写后读,然后用printf函数打印出所读数据,在调试模式下发现用了printf函数后会影响Xintf总线时序,但是点开memory查看xintf寄存器设置值就是我初始化的值,没有改变,至于为什么会影响了xintf总线时序,我想可能是打印用了内存资源,导致这种现象。有什么方法能解决这问题求大神们告知下小弟;
2、考虑到可能是调试模式下内存资源空间太小,影响了程序,于是将程序下载到Flash下启动运行。由于在Flash下运行,就不能用自带的printf函数打印了,我就将之前arm用过的打印程序移植过来,也是遇到各种问题,后来才知道arm是8位的内存,而2812是16位的,所以程序不能直接用,改了下终于调通了,现在字符,十进制数正常打印,但是打印十六进制数时,却只能打印到8位...崩溃了
3、我就想用Xintf总线及串口打印功能,哪位大神有这可用的例程提供小弟参考吗?(网上找了很少有串口打印的例程,都是用调试模式下自带printf函数,程序一大再用上printf函数编译都不过了)
附上自写的printf函数:
/* Private define ------------------------------------------------------------*/
#define uart_sizeof_int(n) ((sizeof(n) + sizeof(int) - 1) & ~(sizeof(int) - 1))
//#define uart_va_start(ap,v) (ap = (uart_va_list)&v +uart_sizeof_int(v))
#define uart_va_start(ap,v) (ap = (uart_va_list)&v + 1)
//#define uart_va_arg(ap,t) (*(t *)((ap += uart_sizeof_int(t)) - uart_sizeof_int(t)))
#define uart_va_arg(ap,t) (*(t *)((ap -= uart_sizeof_int(t)) - uart_sizeof_int(t)))
#define uart_va_end(ap) (ap = (uart_va_list)0)
//#define UART_SEND_BYTE(ch) USART_SendChar(USART2, (u8*)ch)
#define UART_SEND_BYTE(ch) USART_SendChar((char*)ch)
void USART_SendChar(char* ch)
{
ScibRegs.SCITXBUF = (ch[0] & (u16)0x01FF);
while(ScibRegs.SCICTL2.bit.TXEMPTY == 0);
//while(USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET);
}
void DebugPrintf(char* format, ...)
{
char * s = 0;
int d = 0, i = 0;
int x = 0;
unsigned char ch[sizeof(int) * 2 + 2] = {0};
unsigned char zero[2]={48,48};
uart_va_list ap = 0;
uart_va_start(ap, format);
while (* format)
{
if (* format != '%')
{
UART_SEND_BYTE(format++);
continue;
}
switch (*(++format))
{
case 's':
case 'S':
s = uart_va_arg(ap, char *);
for ( ; *s; s++)
{
UART_SEND_BYTE(s);
}
break;
case 'c':
case 'C':
UART_SEND_BYTE(uart_va_arg(ap, char));
break;
case 'd':
case 'D':
d = uart_va_arg(ap, int);
if(d==0)
{
UART_SEND_BYTE(zero);
}
else
{
while(d!=0)
{
ch =d%10 +'0';
d/=10;
i++;
}
for(; i > 0; i--)
UART_SEND_BYTE(&ch[i -1]);
}
break;
case 'x':
case 'X':
x = uart_va_arg(ap, int);
for(i = 0; i < sizeof(int) * 2; i++)
{
ch = (unsigned char)(x&0x0f) + '0';
if(ch > '9')
ch += 7;
x >>= 4;
}
ch[i++] = 'x';
ch = '0';
for(i = sizeof(int) * 2 + 2; i > 0; i--)
UART_SEND_BYTE(&ch[i -1]);
break;
default:
UART_SEND_BYTE(format);
break;
}
format++;
}
uart_va_end(ap);
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
还是通过SCI啊 串口一次最多传一个字节啊
请查看我的帖子
http://bbs.21ic.com/icview-556056-1-1.html
一周热门 更多>