使用 USART RX 唤醒 PIC

Posted

技术标签:

【中文标题】使用 USART RX 唤醒 PIC【英文标题】:Wake-up PIC with USART RX 【发布时间】:2017-05-04 21:11:12 【问题描述】:

我正在使用极低功耗 (XLP) 微控制器 PIC 16LF1933。 为了消耗很少的电池,我让它进入睡眠状态,直到它在 RX 中接收到一个中断字符(00h)。该文档很好地解释了如何在 RX 中设置带中断字符的自动唤醒。我跟着它。 我正在使用 Proteus 来模拟项目,并使用虚拟终端来发送信息。如果您按 CTRL + SHIFT + @,它会发送 de 00h(null/全 0),因此,如文档中所述,这将唤醒 PIC。 问题是,当我这样做时,我会收到一条警告日志说Wake up event is only 937.500003us wide. Minimum (at current baudrate) expected is 6.656ms. I'm using 9600 baudrate. 如何使用 RX 进行正确的唤醒事件? 我的while 代码

while (1) 
    BAUDCONbits.WUE = 1;    //Wake-up Enable
    SLEEP();

    while (BAUDCONbits.WUE);

    msg = Receive_Serial(); //Clear RCIF
    __delay_ms(100);
    msg = '\0';             //Discard
    __delay_ms(100);
    msg = Receive_Serial(); //Receive the next character
    __delay_ms(100);
    RCREG = 0;
    msg = '\0';
    __delay_ms(100);

还有我的接收功能

unsigned char Receive_Serial() 
    if (OERR)                  //Overrun error
        RCSTAbits.CREN = 0;     //Fix reset Enable Receive
        RCSTAbits.CREN = 1;
    

    while (!RCIF);

    return RCREG;

【问题讨论】:

它有时被称为“突破水平信号”,其中行在0 状态下保持超过一个字符时间,以将其与正确的框架区分开来特点。您的数据表说“因此,传输中的初始字符必须全为 0。这必须是十个或更多位时间,对于 LIN 总线建议使用 13 位时间,或者对于标准 RS-232 设备,必须是任意数量的位时间。 "尽管您应该如何传输该中断电平信号,但我不知道,但是正如您所说,发送0 数据字节不会这样做。对于 8 位数据,发送 0 只会使线路保持低电平 9 位时间。 感谢您的评论,它确实解释了。对不起,我没有阅读这一部分,这是正确的。我会弄清楚如何发送 13 位乘以 0。 是的,但是警告日志表明它应该更长? 937.5 us9600 波特率的 9 位时间(约 1 毫秒),可能需要为 7 毫秒。 那么,我必须发送一个 63 位乘以 0 的数据? 除非蓝牙模块允许即时切换到较低的波特率 (1。 【参考方案1】:

您收到的警告消息仅仅是因为空字符 (00h) 不是中断条件。

您的图片代码可能没问题,但开发工具未生成正确的测试数据。

很久很久以前,我曾经绝望地发送一个break来唤醒一个休眠的设备,需要给它发送一个break。我的终端无法发送一个。我必须让它工作,所以快速破解是发送一个空字符并将终端设置为较低的波特率,然后切换回正确的波特率。

【讨论】:

以上是关于使用 USART RX 唤醒 PIC的主要内容,如果未能解决你的问题,请参考以下文章

Stm32L151RCxxx USART 挂起问题,同时基于中断的 TX/RX

USART1->DR=USART_RX_BUF[t]啥意思

Atmel SAME70 USART 接收超时未触发

利用串口空闲中断接收数据

arduino Usart1 中断

通过 PIC16 UART 发送转换后的 DS1820 温度