【解析新特性】300W单路输出工业电源>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » R8C/2B 串口1的相关问题想问大家

共6条 1/1 1 跳转至

R8C/2B 串口1的相关问题想问大家

菜鸟
2008-06-09 18:39:07    评分

有关UART1的使用,我怎么调都调不过,这边问问大家有什么办法不?

问题1.UART1发送,只能在开机的第一次可以发送第一个字节,
以后在查询发送寄存器的时候,总是为不空的,然后就不能再发送了
芯片是R8C/2B,片内震荡20MHz,相似的配置在UART0是可以正常使用的

问题2.还有个关于编译器的问题,提示信息:
H:\Workspace\IIIB_0806\IIIB_0806\sect30.inc(112) : Warning (ln30): H:\Workspace\IIIB_0806\IIIB_0806\Debug\ncrt0.r30 : 'ROMDATA' section 'vector' is overlapped on the 'program' from FEDCH to FEDCH
H:\Workspace\IIIB_0806\IIIB_0806\sect30.inc(185) : Error (ln30): H:\Workspace\IIIB_0806\IIIB_0806\Debug\ncrt0.r30 : 'ROMDATA' section 'fvector' is overlapped on the 'program' from FFDCH to FFFFH


相似的位置还有 section  “rom_FE”,“rom_FO”
前面有个相关的帖子是也是这样的错误,但是我这边不知道怎么解决掉这个问题,
sect30.inc文件中,除了中断地址之外我是没有修改的.


UART1相关的源码:


/************************************************************************************
Name:        uart_init
Parameters:  None
Returns:     None
Description: Initial setting of UART SFR
************************************************************************************/
void uart1_init(void)
{
 UINT i;

 asm("FCLR I");      /* Interrupt disabled */

 p6|=0x20;
 u1pinsel=1;
 pd6|=0x20;
 pd6&=~0x80;
 
 //u1c0 &= 0x08;
 u1c0 = 0x00;
 u1c1 = 0x00;
 
 u1mr = 0x05;//8 位数据,1个停止位,无校验
 
 u1brg = 124;//9600
 
 s1tic = 0x05;      /* Enable UART0 transmit Interrupt */
 s1ric = 0x05;      /* Enable UART0 receive Interrupt */
 
 te_u1c1=1;//允许发送
 re_u1c1=1;//允许接受

 asm("FSET I");      /* Interrupt enable */

}
#pragma INTERRUPT /B UART0_transINT 19
void UART1_transINT(void)
{
 //ti_u1c1=1;
}
#pragma INTERRUPT /B UART0_recvINT 20
void UART1_recvINT(void)
{
 UINT8 t;
 if(ri_u1c1==1&&sum_u1rb==0)
 {
  t=u1rbl;
 }
 re_u1c1=1;
}


void UART1_SendMem(const char *buf,UINT8 n)
{
 
 UINT8 i;
 i=0;
 while(i<n)
 {
  while(!ti_u1c1);   //等待发送寄存器空闲
  u1tb=buf[i];   
  i++;     
 }
 while(!ti_u1c1);
 //while(!txept_u1c0);
 
}

void UART1_Send(const char *buf)
{
 UART1_SendMem(buf,strlen(buf));
 
}

void UART1_SendChar(UINT8 ch)
{

 while(!ti_u1c1);
 u1tb=ch;
 while(!ti_u1c1);
 //while(!txept_u1c0);
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/*
中断向量
*/
  .section vector,ROMDATA
  .org  __VECTOR_ADR__

.if 1
  .lword dummy_int  ; vector  0
  .lword dummy_int  ; vector  1
  .lword dummy_int  ; vector  2
  .lword dummy_int  ; vector  3
  .lword dummy_int  ; vector  4
  .lword dummy_int  ; vector  5
  .lword dummy_int  ; vector  6
  .lword dummy_int  ; vector  7
  .lword dummy_int  ; vector  8
  .lword dummy_int  ; vector  9
  .lword dummy_int  ; vector 10
  .lword dummy_int  ; vector 11
  .lword dummy_int  ; vector 12
  .lword dummy_int  ; vector 13
  .lword dummy_int  ; vector 14
  .lword dummy_int  ; vector 15
  .lword dummy_int  ; vector 16
  ;.lword dummy_int  ; vector 17
  .glb _UART0_transINT
  .lword _UART0_transINT ;UART0发送中断
  ;.lword dummy_int  ; vector 18
  .glb _UART0_recvINT
  .lword _UART0_recvINT ;UART0 接收中断
  ;.lword dummy_int  ; vector 19
  .glb _UART1_transINT
  .lword _UART1_transINT ;UART1发送中断
  ;.lword dummy_int  ; vector 20
  .glb _UART1_recvINT
  .lword _UART1_recvINT ;UART1 接收中断
  .lword dummy_int  ; vector 21
  ;.lword dummy_int  ; vector 22
  .glb _timerRa_INT
  .lword _timerRa_INT ;定时器A中断
  ;.lword dummy_int  ; vector 23
  .glb _timerRb_INT
  .lword _timerRb_INT ;定时器中断B
  .lword dummy_int  ; vector 24
  .lword dummy_int  ; vector 25
  .lword dummy_int  ; vector 26

  .endif




关键词: 串口     相关     问题     想问     大家     UART1     UART    

菜鸟
2008-06-09 22:03:26    评分
2楼

楼主先请检查所用的调试器是E8/E8a吗?瑞萨R8C的on chip 调试器好像用到了UART1,调试时最好先避开调试UART1。网上有E8/E8a调试注意事项的文档下载。至于overlap的错误,一般定义的RAM/ROM区的地址定义区间有冲突,请仔细检查一下,包括E8/E8a调试时所需的firmware与你的应用程序。


菜鸟
2008-06-09 22:29:16    评分
3楼

那如果我就是需要使用UART1的话,可以使用起来吗?软件可以使用的.看了你的回帖,我新建了 一个工程,在[Setting the Target of System for Debugging]这个步骤的时候,R8C Simulator和R8C E8  SYSTEM 这两个选项都没有选上,
测试的时候我是将Mot文件直接烧入到芯片中运行测试,但是效果还是一样的。只能发送第一个字节


菜鸟
2008-06-09 22:39:02    评分
4楼
忘了说了我用的E8 的调试器

菜鸟
2008-06-10 15:05:53    评分
5楼

#pragma INTERRUPT /B UART0_transINT 19

void UART1_transINT(void)

{

 //ti_u1c1=1;

}

您声明的中断程序名和实际定义的中断程序名称不一样啊!


菜鸟
2008-06-10 16:14:01    评分
6楼
啊,,,,,发现了发现了,
谢谢了啊,可以正确的发送出去了。

共6条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]