打印
[STM8]

串口中断接受程序 在IAR中成功 STVD中无法使用

[复制链接]
4452|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
shuishuo615|  楼主 | 2013-3-5 21:42 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 shuishuo615 于 2013-3-6 21:56 编辑

程序非常简短
在IAR可以调试收发成功
但是在STVD中不能用,请帮忙看下是哪里有问题工程文件在附件中

/*******************it.c****************/ INTERRUPT_HANDLER(UART1_RX_IRQHandler, 18)
{
        unsigned char c;
  c = UART1_DR;          // 接收到数据了
  while(!UART1_SR_TXE);
  c++;                   // 把接收到的数据加1
  UART1_DR = c;         
}
#endif






/*************main.c**********************/


void CLK_init(void)
{
  CLK_CKDIVR = 0x08;         // 16M内部RC经2分频后系统时钟为8M
}

void UART1_init(void)
{
  UART1_BRR2 = 0x01;         // 设置波特率9600
  UART1_BRR1 = 0x34;         // 8M/9600 = 0x341
  UART1_CR2 = 0x2C;          // 允许接收中断,允许接收,允许发送
}


void init_devices(void)
{
  _asm("sim");  // 关全局中断
  CLK_init();
  UART1_init();  // 开发板上的串口接的是UART3,刚开始想当然的认为UART1,浪费我半个小时
  _asm("rim");  // 开全局中断
}
void main(void)
{
    init_devices();
/* Infinite loop */
  while (1)
  {
                ;
  }
}
调试发现,发送一个数据后,停留在中断的25号中断中,
INTERRUPT_HANDLER(NonHandledInterrupt, 25)
{
  /* In order to detect unexpected events during development,
     it is recommended to set a breakpoint on the following instruction.
  */
;}
#endif /*_COSMIC_*/
并非UAR1接收中断的18号中断中我将程序写入25号中断,可以执行
问题出在哪里?
我的选型是103,为什么不进18号中断





UART_INT.zip

1.65 MB

沙发
uet_cache| | 2013-3-5 22:05 | 只看该作者
你可以看下STVD下芯片选对了没,再不行,看下寄存器的地址定义,不同的CPU,部分寄存器地址有点点区别。一般如果能单步仿真运行,程序没问题的话,就有可能是上面的问题了。

使用特权

评论回复
板凳
shuishuo615|  楼主 | 2013-3-6 15:57 | 只看该作者
uet_cache 发表于 2013-3-5 22:05
你可以看下STVD下芯片选对了没,再不行,看下寄存器的地址定义,不同的CPU,部分寄存器地址有点点区别。一 ...

STVD也是一直在用的,在STVD里头用查询接受时可行的。这个应该能拍出寄存器问题了吧。

使用特权

评论回复
地板
cjhk| | 2013-3-6 20:54 | 只看该作者
可能是寄存器选错了   个人的认为   呵呵   寄存器设置错误通常会出现这种情况   呵呵   

使用特权

评论回复
5
shuishuo615|  楼主 | 2013-3-6 21:04 | 只看该作者
cjhk 发表于 2013-3-6 20:54
可能是寄存器选错了   个人的认为   呵呵   寄存器设置错误通常会出现这种情况   呵呵    ...

谢谢你的回复,可是在IAR中为社么可以?
另外新发现,发送一个数据后,停留在中断的25号中断中,
INTERRUPT_HANDLER(NonHandledInterrupt, 25)
{
  /* In order to detect unexpected events during development,
     it is recommended to set a breakpoint on the following instruction.
  */
;}
#endif /*_COSMIC_*/
并非UAR1接收中断的18号中断中
而datasheet上中断号只到24

使用特权

评论回复
6
shuishuo615|  楼主 | 2013-3-6 21:05 | 只看该作者
uet_cache 发表于 2013-3-5 22:05
你可以看下STVD下芯片选对了没,再不行,看下寄存器的地址定义,不同的CPU,部分寄存器地址有点点区别。一 ...

新发现,发送一个数据后,停留在中断的25号中断中,
INTERRUPT_HANDLER(NonHandledInterrupt, 25)
{
  /* In order to detect unexpected events during development,
     it is recommended to set a breakpoint on the following instruction.
  */
;}
#endif /*_COSMIC_*/
并非UAR1接收中断的18号中断中
而datasheet上中断号只到24

使用特权

评论回复
7
uet_cache| | 2013-3-6 21:06 | 只看该作者
哪是你的中断向量表没定义好,要么还是芯片型号没选对,或没定义。

使用特权

评论回复
8
shuishuo615|  楼主 | 2013-3-6 21:31 | 只看该作者
uet_cache 发表于 2013-3-6 21:06
哪是你的中断向量表没定义好,要么还是芯片型号没选对,或没定义。

型号选的是对的,我放到25号里面就可以收发了

使用特权

评论回复
9
shuishuo615|  楼主 | 2013-3-6 21:31 | 只看该作者
cjhk 发表于 2013-3-6 20:54
可能是寄存器选错了   个人的认为   呵呵   寄存器设置错误通常会出现这种情况   呵呵    ...

放到25号里面就可以收发了

使用特权

评论回复
10
shuishuo615|  楼主 | 2013-3-6 21:55 | 只看该作者
shuishuo615 发表于 2013-3-6 21:31
型号选的是对的,我放到25号里面就可以收发了


我这个project模板是从官网下的,对应的是105的discovery 板子
但是我看了下it里面的define也是没有问题的啊103里面有uart1 18号

只有一个地方是选型号的吧,我选的是103F2P
。。。还有什么地方可能有误

使用特权

评论回复
11
shuishuo615|  楼主 | 2013-3-6 22:12 | 只看该作者
uet_cache 发表于 2013-3-6 21:06
哪是你的中断向量表没定义好,要么还是芯片型号没选对,或没定义。

问题如你所说是型号没选对
因为我改成库文件来写的时候
比如写UART1->BSRR = 0x34;报错说undefined
但是GPIOD->DDR = 0x00;不会报错
就是说型号的问题,但是我明明选的103?

使用特权

评论回复
12
uet_cache| | 2013-3-7 08:50 | 只看该作者
库的版本不同,那个寄存器地址有点点区别的,而且有些好像需要声明型号,不是仅仅选择了芯片就行的

使用特权

评论回复
13
shuishuo615|  楼主 | 2013-3-23 21:42 | 只看该作者
uet_cache 发表于 2013-3-5 22:05
你可以看下STVD下芯片选对了没,再不行,看下寄存器的地址定义,不同的CPU,部分寄存器地址有点点区别。一 ...

芯片是没有选错,但的确是这个选芯片的问题,我从官网下了个工程文件,就可以了

使用特权

评论回复
14
hawksabre| | 2013-3-24 19:09 | 只看该作者
问题解决了  就好   呵呵   

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

8

主题

66

帖子

0

粉丝