ch592f无法用RTC_TRIGFunCfg触发唤醒,但是可以用RTC_TMRFunCfg定时唤醒
用ch592的rtc和休眠例子,也是一样,无法rtc触发唤醒
另外串口只能读取不超过7个字节。超过7个字节,只能一个一个字节读取。有没有办法一次读取超过7个字节,比如13个字节
ch592f无法用RTC_TRIGFunCfg触发唤醒,但是可以用RTC_TMRFunCfg定时唤醒
用ch592的rtc和休眠例子,也是一样,无法rtc触发唤醒
另外串口只能读取不超过7个字节。超过7个字节,只能一个一个字节读取。有没有办法一次读取超过7个字节,比如13个字节
①使用触发中断唤醒时,进入中断服务函数再触发一次:
RTC_ClearITFlag(RTC_TRIG_EVENT);
②可以使用串口中断的方式接收数据,fifo是8字节,所以可配置的触发接收最大是7字节,无法一次性接收到13个字节。
可以手动修改,写一个缓冲区,接收触发的数据后,再移位接收超时的数据,这样就可以完整的接收到数据。
将触发for循环的接收数据-1(for(i = 0; i != (trigB-1); i++)),少接收一个数据,则每次都会进入超时。
触发模式的 rtc还是无法启动
在中断中是类似这样写么
void RTC_IRQHandler(void) { UINT16 py; UINT16 pmon; UINT16 pd; UINT16 ph; UINT16 pm; UINT16 ps; RTC_GetTime(&py,&pmon,&pd,&ph,&pm,&ps); if (RTC_GetITFlag(RTC_TRIG_EVENT)) { printf("%d年%d月%d日%d时%d分%d秒\r\n",py,pmon,pd,ph,pm,ps); RTC_TRIGFunCfg(32768*1); RTC_ClearITFlag(RTC_TRIG_EVENT); } if (RTC_GetITFlag(RTC_TMR_EVENT)) { printf("%d年%d月%d日%d时%d分%d秒\r\n",py,pmon,pd,ph,pm,ps); RTC_ClearITFlag(RTC_TMR_EVENT); } }
如是这样,试了。还是无法启动
有参考的代码没
#include "CH59x_common.h" /********************************************************************* * @fn DebugInit * * @brief 调试初始化 * * @return none */ void DebugInit(void) { GPIOA_SetBits(GPIO_Pin_9); GPIOA_ModeCfg(GPIO_Pin_9, GPIO_ModeOut_PP_5mA); UART1_DefInit(); } /********************************************************************* * @fn main * * @brief 主函数 * * @return none */ int main() { SetSysClock(CLK_SOURCE_PLL_60MHz); PWR_DCDCCfg(ENABLE); GPIOA_ModeCfg(GPIO_Pin_All, GPIO_ModeIN_PU); GPIOB_ModeCfg(GPIO_Pin_All, GPIO_ModeIN_PU); /* 配置串口调试 */ DebugInit(); PRINT("Start @ChipID=%02x\n", R8_CHIP_ID); DelayMs(200); #if 1 LClk32K_Select(Clk32K_LSE);//启用外部32K R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG1; R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG2; R8_CK32K_CONFIG |= RB_CLK_XT32K_PON; R8_SAFE_ACCESS_SIG = 0; RTC_InitTime(2024,1,1,0,0,0); RTC_TRIGFunCfg(65535); PFIC_EnableIRQ(RTC_IRQn); PWR_PeriphWakeUpCfg( ENABLE, RB_SLP_RTC_WAKE, Long_Delay ); printf("Init RTC OK\r\n"); #endif #if 1 /* 配置唤醒源为 GPIO - PA5 */ GPIOA_ModeCfg(GPIO_Pin_5, GPIO_ModeIN_PU); GPIOA_ITModeCfg(GPIO_Pin_5, GPIO_ITMode_FallEdge); // 下降沿唤醒 PFIC_EnableIRQ(GPIO_A_IRQn); PWR_PeriphWakeUpCfg(ENABLE, RB_SLP_GPIO_WAKE, Long_Delay); #endif #if 1 while(1){ // PRINT("sleep mode sleep \n"); DelayMs(2); // 注意当主频为80M时,Sleep睡眠唤醒中断不可调用flash内代码。 LowPower_Sleep(RB_PWR_RAM24K | RB_PWR_RAM2K | RB_XT_PRE_EN); //只保留24+2K SRAM 供电 HSECFG_Current(HSE_RCur_100); // 降为额定电流(低功耗函数中提升了HSE偏置电流) // PRINT("wake.. \n"); } #endif // while(1); } __INTERRUPT __HIGH_CODE void GPIOA_IRQHandler(void) { printf("GPIO...\n"); GPIOA_ClearITFlagBit(GPIO_Pin_6 | GPIO_Pin_5); } __attribute__((interrupt("WCH-Interrupt-fast"))) __attribute__((section(".highcode"))) void RTC_IRQHandler(void) { UINT16 py; UINT16 pmon; UINT16 pd; UINT16 ph; UINT16 pm; UINT16 ps; RTC_GetTime(&py,&pmon,&pd,&ph,&pm,&ps); if (RTC_GetITFlag(RTC_TRIG_EVENT)) { printf("%d年%d月%d日%d时%d分%d秒\r\n",py,pmon,pd,ph,pm,ps); RTC_ClearITFlag(RTC_TRIG_EVENT); RTC_TRIGFunCfg(65535); } }
可以参考看下,如果有问题,可以发送邮件至邮箱lpc@wch.cn,我直接提供代码看下。
参考博客:
CH573芯片Sleep说明(RTC程序说明) - SweetTea_lllpc - 博客园 (cnblogs.com)
rtc触发模式和rf 2.4g是不是有冲突?去掉2.4g相关。rtc正常运行
rtc定时模式在rf 2.4g可以正常使用
问题解决了,放在2.4g初始化后面