打印
[STM8]

求助,stm8s103串口接收中断进不了

[复制链接]
13412|24
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
cgha|  楼主 | 2011-4-14 21:49 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 cgha 于 2011-4-14 21:50 编辑

使用串口进行单片机间通信,发送可以,接收不行,进不了接收中断。
初始化:
UART1_DeInit();
    /* Configure the UART1 */
UART1_Init((u32)9600, UART1_WORDLENGTH_8D,UART1_STOPBITS_1, UART1_PARITY_NO,UART1_SYNCMODE_CLOCK_DISABLE,UART1_MODE_TXRX_ENABLE);
   
UART1_ITConfig(UART1_IT_RXNE_OR, ENABLE);

中断vector
{0x82, UART1_TX_IRQHandler}, /* irq17 */
{0x82, UART1_RX_IRQHandler}, /* irq18 */

然后在UART1_RX_IRQHandler中设断点,没进来。用示波器量rx端数据波形正确。
用的是cosmic 4.3.4 。stm8s103 为tssop20的封装。

setting.jpg (59.4 KB )

setting.jpg
沙发
re张风| | 2011-4-14 22:13 | 只看该作者
不晓得你用是啥子编译器。
我用keil,套用官方提供的库时,要用串口及用中断,有4个方面需要初始化:
串口用的引脚
串口通讯的相应参数
串口的中断
NVIC初始化

最后再完成中断服务程序(由中断向量表中查找相应的程序名字吧)!

使用特权

评论回复
板凳
cgha|  楼主 | 2011-4-14 22:22 | 只看该作者
多谢回复,引脚我没初始化,因为我看官方的例子也没有初始化。
我是从stm8s207的3合1板子调好程序后移植过去的。也就是说在stms8s207上程序是可以的,移植到stm8s103就不行。区别是前者用的是UART3,而后者是UART1,但是发送是可以的。我用的是cosmic,帖子里已经说明。

使用特权

评论回复
地板
cgha|  楼主 | 2011-4-15 11:32 | 只看该作者
问题解决,在stm8s103中adc和串口复用。我在adc初始化的时候把施密特触发器关掉了,导致发送可以,接收不行。

使用特权

评论回复
5
lmlj0502| | 2011-6-14 13:50 | 只看该作者
怎么初始化引脚的啊,我 的也进不了中断,怎么整啊? 3# cgha

使用特权

评论回复
6
lsj19851118| | 2013-1-22 22:21 | 只看该作者
全部中断是不是没有开呀?你在进入等待中断前加上_asm("rim");试试看看,我之前调试的就遇到过这样的问题

使用特权

评论回复
7
jiachenglong01| | 2013-3-22 14:47 | 只看该作者
解决了嘛??我的也进不去

使用特权

评论回复
8
nawei87| | 2013-3-31 22:25 | 只看该作者
解决了吗?遇到同样问题

使用特权

评论回复
9
mycdh| | 2014-3-8 11:17 | 只看该作者
在stm8s103中adc和串口复用的吗?、
好像不是复用的吧

使用特权

评论回复
10
mycdh| | 2014-3-8 11:18 | 只看该作者
本帖最后由 mycdh 于 2014-3-8 14:35 编辑

我也遇到把ADC初始化注销之后,能进入串口中断接收数据,ADC初始化不注销,就无法接收数据的。经过一番折腾之后,发现施密特触发器的寄存器配置对串口接收中断有影响,虽然为何有影响还不清楚,因为我用的是S003芯片,ADC和串口的引脚也没有共用的啊。
最开始我只用了一个AD通道,采用单次转换模式,没出现对串口的影响,后来用了单次扫描模式,用了四个通道,就发现无法进入串口接收中断。再把施密特触发器使能之后,发现接收正常了。代码如下:
ADC1_Init(ADC1_CONVERSIONMODE_SINGLE , ADC1_CHANNEL_3, ADC1_PRESSEL_FCPU_D8,\
    ADC1_EXTTRIG_TIM, DISABLE, ADC1_ALIGN_RIGHT,ADC1_SCHMITTTRIG_ALL,ENABLE);
ADC1_ScanModeCmd(ENABLE);

注意到ADC1_Init()函数的最后一个参数应该是:ENABLE。

使用特权

评论回复
11
nienianhong| | 2014-3-8 11:50 | 只看该作者

使用特权

评论回复
12
yougen1314| | 2014-4-8 10:33 | 只看该作者
我也遇到了这个问题,,,,感谢这个帖子,,,,

我的也是串口1可以正常发送,死活进不了接收中断,,,看寄存器配置都正确,,,最后把ADC的施密特触发打开就没问题了。。。。

再次感谢本帖。。。

使用特权

评论回复
13
suxilong| | 2015-10-15 09:23 | 只看该作者
mycdh 发表于 2014-3-8 11:18
我也遇到把ADC初始化注销之后,能进入串口中断接收数据,ADC初始化不注销,就无法接收数据的。经过一番折腾 ...

mycdh !

我用到 型号和你一样。  主函数是这样的, 我也没有设置ADC 什么的
但是也进不了 串口接收中断!

void main()
{
    My_CLK_Config(); // 初始化时钟
    disableInterrupts(); // 关闭中断
    UART1_DeInit();    //复位UART1
    UART1_Init((uint32_t)115200, UART1_WORDLENGTH_8D,UART1_STOPBITS_1, UART1_PARITY_NO,UART1_SYNCMODE_CLOCK_DISABLE, UART1_MODE_TXRX_ENABLE);    // 配置串口
    UART1_ITConfig(UART1_IT_RXNE,ENABLE);       //配置串口1的接收中断
    enableInterrupts();   // 开启中断
    while (1)
    { }
}

使用特权

评论回复
14
suxilong| | 2015-10-15 09:24 | 只看该作者
yougen1314 发表于 2014-4-8 10:33
我也遇到了这个问题,,,,感谢这个帖子,,,,

我的也是串口1可以正常发送,死活进不了接收中断,,, ...

怎么打开啊???
调用库函数吗?
能否贴出来共享一下。  

使用特权

评论回复
15
suxilong| | 2015-10-15 09:27 | 只看该作者
lsj19851118 发表于 2013-1-22 22:21
全部中断是不是没有开呀?你在进入等待中断前加上_asm("rim");试试看看,我之前调试的就遇到过这样的问题 ...

请问使用STVD 的时候
全中断 打开是  调用enableInterrupts();  呢还是调用rim()   ???

我看stm8s.h 文件中  有这么一段定义L:
我迷糊了, 这些_RAISONANCE_  宏到底是在哪里设置的,  我记得用IAR的时候 在工程的option 中有的追加,但是在STVD 的编译器中的 就不知道哪里可以设置。
如果不设置是不是默认最后的

#ifdef _RAISONANCE_
#include <intrins.h>
#define enableInterrupts()    _rim_()  /* enable interrupts */
#define disableInterrupts()   _sim_()  /* disable interrupts */
#define rim()                 _rim_()  /* enable interrupts */
#define sim()                 _sim_()  /* disable interrupts */
#define nop()                 _nop_()  /* No Operation */
#define trap()                _trap_() /* Trap (soft IT) */
#define wfi()                 _wfi_()  /* Wait For Interrupt */
#define halt()                _halt_() /* Halt */
#elif defined(_COSMIC_)
#define enableInterrupts()    {_asm("rim\n");}  /* enable interrupts */
#define disableInterrupts()   {_asm("sim\n");}  /* disable interrupts */
#define rim()                 {_asm("rim\n");}  /* enable interrupts */
#define sim()                 {_asm("sim\n");}  /* disable interrupts */
#define nop()                 {_asm("nop\n");}  /* No Operation */
#define trap()                {_asm("trap\n");} /* Trap (soft IT) */
#define wfi()                 {_asm("wfi\n");}  /* Wait For Interrupt */
#define halt()                {_asm("halt\n");} /* Halt */
#else /*_IAR_*/
#include <intrinsics.h>
#define enableInterrupts()    __enable_interrupt()   /* enable interrupts */
#define disableInterrupts()   __disable_interrupt()  /* disable interrupts */
#define rim()                 __enable_interrupt()   /* enable interrupts */
#define sim()                 __disable_interrupt()  /* disable interrupts */
#define nop()                 __no_operation()       /* No Operation */
#define trap()                __trap()               /* Trap (soft IT) */
#define wfi()                 __wait_for_interrupt() /* Wait For Interrupt */
#define halt()                __halt()               /* Halt */
#endif /*_RAISONANCE_*/

/*============================== Interrupt vector Handling ========================*/

#ifdef _COSMIC_
#define INTERRUPT_HANDLER(a,b) @far @interrupt void a(void)
#define INTERRUPT_HANDLER_TRAP(a) void @far @interrupt a(void)
#endif /* _COSMIC_ */

#ifdef _RAISONANCE_
#define INTERRUPT_HANDLER(a,b) void a(void) interrupt b
#define INTERRUPT_HANDLER_TRAP(a) void a(void) trap
#endif /* _RAISONANCE_ */

#ifdef _IAR_
#define STRINGVECTOR(x) #x
#define VECTOR_ID(x) STRINGVECTOR( vector = (x) )
#define INTERRUPT_HANDLER( a, b )  \
_Pragma( VECTOR_ID( (b)+2 ) )        \
__interrupt void (a)( void )
#define INTERRUPT_HANDLER_TRAP(a) \
_Pragma( VECTOR_ID( 1 ) ) \
__interrupt void (a) (void)  
#endif /* _IAR_ */

/*============================== Interrupt Handler declaration ========================*/
#ifdef _COSMIC_
#define INTERRUPT @far @interrupt
#elif defined(_IAR_)
#define INTERRUPT __interrupt
#endif /* _COSMIC_ */

使用特权

评论回复
16
suxilong| | 2015-10-15 09:28 | 只看该作者
cgha 发表于 2011-4-15 11:32
问题解决,在stm8s103中adc和串口复用。我在adc初始化的时候把施密特触发器关掉了,导致发送可以,接收不行 ...

楼主,我也没有使用ADC  我的主函数 是这样的:
void main()
{
    My_CLK_Config(); // 初始化时钟
    disableInterrupts(); // 关闭中断
    UART1_DeInit();    //复位UART1
    UART1_Init((uint32_t)115200, UART1_WORDLENGTH_8D,UART1_STOPBITS_1, UART1_PARITY_NO,UART1_SYNCMODE_CLOCK_DISABLE, UART1_MODE_TXRX_ENABLE);    // 配置串口
    UART1_ITConfig(UART1_IT_RXNE,ENABLE);       //配置串口1的接收中断
    enableInterrupts();   // 开启中断
    while (1)
    { }
}

但是死活就是进不了串口中断函数

使用特权

评论回复
17
sun1238898| | 2015-10-15 10:44 | 只看该作者
值得借鉴一下。

使用特权

评论回复
18
北宸xyz| | 2015-12-14 17:31 | 只看该作者
我也碰到类似问题,现在已经解决。
具体情况:
单片机:STM8S103F3P6,
  使用串口PD5_TX,PD6_RX; 采用中断接收功能;
  使用ADC功能的AIN2,AIN3,AIN4;

先初始化UART,再初始化ADC;
测试现象,在UART中断接收过一次数据后,就无法进行第二次UART中断数据接收功能。

看到本贴后,在UART接收完数据后,准备第二次接收前增加
“ADC1_DeInit();”

后完美解决。

因为串口PD5_TX,PD6_RX的第二功能分别为 AIN5 , AIN6端口;

但是我没有初始化AIN5和AIN6,原因还不清楚,现在也没查下去了。

使用特权

评论回复
19
roceyulcy| | 2015-12-30 12:47 | 只看该作者
为什么我的一添加stm8s_adc1.c,编译就报错,说adc1未定义啊,有同样情况的吗?

使用特权

评论回复
20
阳光豆苗| | 2015-12-30 13:27 | 只看该作者
:lol,前排等结果。

使用特权

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

本版积分规则

561

主题

719

帖子

0

粉丝