打印
[技术问答]

N76E003 双串口打开中断接收问题有问题

[复制链接]
2508|15
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
不觉不明|  楼主 | 2018-1-16 19:37 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
最近使用N76E003的usart0  和 usart1开启中断接收数据,  遇到个问题如果使用usart0接收数据,usart1发送数据到PC端,程序毫无问题能稳定运行。    但是如果使用usart1接收数据,usart0发送数据到PC端,usart1只能接收一次数据过一段时间程序就飞了,这个时候如果把usart0的中断关掉 程序又没问题。  而且有点坑的是 片上调试功能使用的就是usart1的引脚,所以不能通过仿真定位问题        整个程序只是在吧发送和接收的串口对调了, 想问下是不是这款芯片usart1 和usart 0不能同时打开中断?
沙发
wahahaheihei| | 2018-1-16 21:32 | 只看该作者
使用一个串口就可以同时完成发送和接收啊,你怎么还两个,分别使用了一路线

使用特权

评论回复
评论
玛尼玛尼哄 2019-8-14 20:55 回复TA
@GWQ666 :没看例子吧。 
GWQ666 2019-8-14 16:08 回复TA
怎么用一个串口同时收发啊,同一个串口的话,怎么判断是发送中断还是接受中断。 
板凳
dongliushui| | 2018-1-17 10:38 | 只看该作者
一般都是用串口1作为跟电脑通信的接口。

使用特权

评论回复
地板
捉虫天师| | 2018-1-17 22:06 | 只看该作者
我记得有例子是同时开了两个串口啊。

使用特权

评论回复
5
heisexingqisi| | 2018-1-17 22:47 | 只看该作者
同时中断,需要考虑优先级吧。

使用特权

评论回复
6
huahuagg| | 2018-1-18 14:05 | 只看该作者
一般这种相同的外设,同时开最难搞的。

使用特权

评论回复
7
不觉不明|  楼主 | 2018-1-22 22:43 | 只看该作者
捉虫天师 发表于 2018-1-17 22:06
我记得有例子是同时开了两个串口啊。

有例子吗  求资料呀

使用特权

评论回复
8
不觉不明|  楼主 | 2018-1-22 22:44 | 只看该作者
heisexingqisi 发表于 2018-1-17 22:47
同时中断,需要考虑优先级吧。

这个还没考虑到   谢谢啦 我去看看

使用特权

评论回复
9
不觉不明|  楼主 | 2018-1-23 00:10 | 只看该作者
听了前面几位的回答,今天重新修改了下程序,发现是自己程序的问题      我使用usart0和usart1  使用的是官方的例子 用的V1.0.4版本。因为有使用发送函数所以TI的清除是没有放在中断里面做的,这样会导致数据发送后程序可能还一直卡在中断里面不会出来,所以我自己增加了一个标志位来判别是否清除了发送中断。usart0  和usart1 都使用的一样的方法。    可能是stm32写多了,可以单独使能发送和接收中断每太注意到这个
bit usart1_ti = 0;
void Send_Data_To_UART1 (UINT8 c)
{
    TI_1 = 0;
        usart1_ti = 0;
    SBUF_1 = c;
    while(usart1_ti==0);
}

void Send_Str_To_UART1(UINT8 *str)
{
        while(*str != 0) {
                Send_Data_To_UART1(*str);
                str++;
        }
}

void Send_Str_None_To_UART1(UINT8 *str,UINT8 len)
{
        while(len > 0) {
                Send_Data_To_UART1(*str);
                str++;
                len--;
        }
}


/**
* FUNCTION_PURPOSE: serial interrupt, echo received data.
* FUNCTION_INPUTS: P0.7(RXD) serial input
* FUNCTION_OUTPUTS: P0.6(TXD) serial output
*/
void SerialPort1_ISR(void) interrupt 15
{
    if (RI_1==1)
    {                                       /* if reception occur */
        clr_RI_1;                             /* clear reception flag for next reception */
        _GPS_USART_IRQHandler(SBUF_1);
    }
        if(TI_1 ==1) {
                clr_TI_1;
                usart1_ti = 1;
        }
}

使用特权

评论回复
10
玛尼玛尼哄| | 2019-8-14 20:55 | 只看该作者
void SerialPort1_ISR(void) interrupt 15 
{
    if (RI_1==1)
    {                                       /* if reception occur */
        clr_RI_1;                             /* clear reception flag for next reception */
        UART_BUFFER[u16CNT] = SBUF_1;
        u16CNT ++;
                                riflag =1;
    }
    if(TI_1==1)
    {
        clr_TI_1;                             /* if emission occur */
    }
}

使用特权

评论回复
11
玛尼玛尼哄| | 2019-8-14 20:56 | 只看该作者
虽然都是串口中断,但是判断的标志是不同的,一个是RI,一个是TI,一个判断接收中断,一个判断是否发送中断。

使用特权

评论回复
12
小明的同学| | 2019-8-17 10:03 | 只看该作者
中断标志是不同的。

使用特权

评论回复
13
tianxj01| | 2019-8-18 15:24 | 只看该作者
不觉不明 发表于 2018-1-22 22:44
这个还没考虑到   谢谢啦 我去看看

这个不需要特别注意,芯片上电默认模式中,串口0和串口1中断优先级本来就不一样,串口0=10,串口1=16,不会打架。

使用特权

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

本版积分规则

1

主题

5

帖子

0

粉丝