DSP2812串口打印问题求助

2019-07-23 15:40发布

本帖最后由 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);
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
6条回答
badfong
1楼-- · 2019-07-23 18:28
没人在么
zhangmangui
2楼-- · 2019-07-23 20:15
没这么玩过   将代码烧写后  通过串口打印   串口是通过JTAG来的吗  
还是通过SCI啊    串口一次最多传一个字节啊   
badfong
3楼-- · 2019-07-23 20:27
 精彩回答 2  元偷偷看……
zhangmangui
4楼-- · 2019-07-23 22:28
你想传16bie是吧     你那个截图显示很清楚   是8bit数据
badfong
5楼-- · 2019-07-24 00:22
已经解决了,ARM内存是8位的,DSP内存是16位的,在CCS3.1编译器上int和char都是16位,所以代码直接移植过来有问题。
zhangmangui
6楼-- · 2019-07-24 00:56
badfong 发表于 2016-3-8 21:44
已经解决了,ARM内存是8位的,DSP内存是16位的,在CCS3.1编译器上int和char都是16位,所以代码直接移植过来 ...

请查看我的帖子
http://bbs.21ic.com/icview-556056-1-1.html

一周热门 更多>