[PIC®/AVR®/dsPIC®产品] 睡眠中可以用数据接收中断唤醒吗

[复制链接]
1454|27
 楼主| CCCq33 发表于 2022-12-5 09:29 | 显示全部楼层 |阅读模式
睡眠中可以用数据接收中断唤醒吗
用MCC中哪一段代码可以实现,有什么需要注意的吗
ynwa 发表于 2022-12-5 10:23 | 显示全部楼层
请先把问题描述的具体清楚一些。比如,芯片型号是什么?用什么接口外设接收数据?
一般来说,通信外设接收数据都是可以从休眠唤醒的。
唤醒一般是硬件实现的,只要外设唤醒条件满足即可。不需要什么专门的软件唤醒代码。
 楼主| CCCq33 发表于 2022-12-5 10:58 | 显示全部楼层
ynwa 发表于 2022-12-5 10:23
请先把问题描述的具体清楚一些。比如,芯片型号是什么?用什么接口外设接收数据?
一般来说,通信外设接收 ...

用的是PIC24fj64ga702,RS232.
我现在进入睡眠模式后,就无法再接收到数据了
 楼主| CCCq33 发表于 2022-12-5 10:59 | 显示全部楼层
ynwa 发表于 2022-12-5 10:23
请先把问题描述的具体清楚一些。比如,芯片型号是什么?用什么接口外设接收数据?
一般来说,通信外设接收 ...

刚开始入手,相关的资料较少。感觉好难
 楼主| CCCq33 发表于 2022-12-5 11:08 | 显示全部楼层
ynwa 发表于 2022-12-5 10:23
请先把问题描述的具体清楚一些。比如,芯片型号是什么?用什么接口外设接收数据?
一般来说,通信外设接收 ...

我用看门狗是可以实现跳出sleep()睡眠的,我不知道调用下面这段函数是否可以唤醒跳出sleep().
void UART1_SetTxInterruptHandler(void (* interruptHandler)(void))
{
    if(interruptHandler == NULL)
    {
        UART1_TxDefaultInterruptHandler = &UART1_Transmit_CallBack;
    }
    else
    {
        UART1_TxDefaultInterruptHandler = interruptHandler;
    }
}
xch 发表于 2022-12-5 12:16 | 显示全部楼层
先得唤醒才能接收。
 楼主| CCCq33 发表于 2022-12-5 13:03 | 显示全部楼层
xch 发表于 2022-12-5 12:16
先得唤醒才能接收。

设置个电平信号的变化唤醒,再接收吗
ynwa 发表于 2022-12-5 15:00 | 显示全部楼层
本帖最后由 ynwa 于 2022-12-5 15:01 编辑
CCCq33 发表于 2022-12-5 13:03
设置个电平信号的变化唤醒,再接收吗
先进入sleep,当检测到RX上的起始位会将MCU从sleep唤醒,然后接收数据。
你进入Sleep前,需要把UART模块的WAKE位置1。

建议你看看PIC24 UART系列参考手册 https://ww1.microchip.com/downloads/en/DeviceDoc/70000582e.pdf,11.0 UART OPERATION DURING CPU SLEEP AND IDLE MODES
xch 发表于 2022-12-5 15:37 | 显示全部楼层
CCCq33 发表于 2022-12-5 13:03
设置个电平信号的变化唤醒,再接收吗

是啊!  一般是起始位下降沿唤醒。然后默认唤醒后使用默认RC 振荡器时钟快速唤醒。也许还来得及接收第一个字节。
hjl2832 发表于 2022-12-6 08:23 | 显示全部楼层
可以使用接收中断唤醒,不过波特率不能太快,有可能第一个字节的起始位接收不完整导致第一个字节丢失。
 楼主| CCCq33 发表于 2022-12-6 10:15 | 显示全部楼层
ynwa 发表于 2022-12-5 15:00
先进入sleep,当检测到RX上的起始位会将MCU从sleep唤醒,然后接收数据。
你进入Sleep前,需要把UART模块的W ...

U2MODE<7>=1;
我是需要在我的代码中加入它是吗。
此时当我的UART2口接受数据时,我的MCU就会被唤醒吗。
 楼主| CCCq33 发表于 2022-12-6 10:19 | 显示全部楼层
hjl2832 发表于 2022-12-6 08:23
可以使用接收中断唤醒,不过波特率不能太快,有可能第一个字节的起始位接收不完整导致第一个字节丢失。 ...

是将启动位的唤醒使能拉U2MODE<7>=1;
再调用MCC生成代码的这个条函数吗void __attribute__ ( ( interrupt, no_auto_psv ) ) _U2RXInterrupt( void )
ynwa 发表于 2022-12-6 12:59 | 显示全部楼层
本帖最后由 ynwa 于 2022-12-8 11:23 编辑
CCCq33 发表于 2022-12-6 10:19
是将启动位的唤醒使能拉U2MODE=1;
再调用MCC生成代码的这个条函数吗void __attribute__ ( ( interrupt, n ...

在你执行sleep指令前,把wake位置1使能唤醒即可。唤醒也不是必须要执行中断服务程序的。你在用之前还是要先看看手册。

另外,如果使能了中断,中断服务程序也不需要用户在软件中调用的。中断条件发生时,是由硬件跳转到中断向量的。

MCC只是根据你对外设、中断的配置,帮你产生外设的初始化和一些功能函数、以及中断服务程序的代码而已。减轻了一些写代码的工作。但还是要以了解MCU外设的工作原理、中断机制等内容为前提,才能知道如何使用MCC产生的代码。

如果你对休眠、UART唤醒、中断机制以及中断和唤醒的关系不了解,建议你还是必须要先去看看PIC24每个模块的参考手册。
 楼主| CCCq33 发表于 2022-12-6 14:53 | 显示全部楼层
ynwa 发表于 2022-12-6 12:59
在你执行sleep指令前,把wake位置1使能唤醒即可。唤醒也不是必须要使能中断以及执行中断服务程序的。你在 ...

十分感谢你耐心的回答,我想我已经有一些头绪了
xu@xupt 发表于 2022-12-7 00:51 | 显示全部楼层
ynwa 发表于 2022-12-6 12:59
在你执行sleep指令前,把wake位置1使能唤醒即可。唤醒也不是必须要使能中断以及执行中断服务程序的。你在 ...

学习
tpgf 发表于 2023-1-4 15:42 | 显示全部楼层
有很多种睡眠的模式 如果在当前选择的睡眠模式下数据发送和接收还能能够正常运行 那就是能唤醒了
八层楼 发表于 2023-1-4 15:51 | 显示全部楼层
可以先看一下当前进入的低功耗模式有没有关闭串口需要使用的时钟
观海 发表于 2023-1-4 16:02 | 显示全部楼层
执行sleep指令前,把wake位置1可以唤醒的前提是接收模块还能正常工作
guanjiaer 发表于 2023-1-4 16:20 | 显示全部楼层
应该是可以的 只要把wake位置1  就可以唤醒
heimaojingzhang 发表于 2023-1-4 16:26 | 显示全部楼层
一般的轻度的低功耗模式都是可以通过数据接收唤醒的
您需要登录后才可以回帖 登录 | 注册

本版积分规则

13

主题

78

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部