N32WB031的APB1最高频率限制为32MHz,所以初始化的时候在SystemInit里面设置为了32MHz,系统时钟为64MHz,对应的RCC->CFG寄存器内容为0x00010400。一旦MCU进入SLEEP再次唤醒后,RCC->CFG寄存器内容就变为0x00010000,对应APB1时钟频率为64MHz,超过了32MHz的限制,实际测试APB1也是64MHz。这个现象是否正常,文档上未做解释
以下是SystemInit里面的一段内容
if(SYSCLK_FREQ == 64000000) { RCC->CTRL &= ~0x8000;// Set HSI as 64M /* Configures LSI trim */ tmp = RCC->CTRL & ~(0x7F << 8); // TRIM 8-14 bit RCC->CTRL = tmp|(trim_stored.stote_rc64m_trim_value << 8);// clear and set TRIM value RCC->CFG |= RCC_CFG_HSISRC_DIV1; // USE HSI as system clock RCC->CFG &= ~RCC_CFG_APB1PRES; RCC->CFG |= RCC_HCLK_DIV2; //APB1 = HCLK/2, APB1 max is 32M }
再补充一个信息,如果待机唤醒后再重新设置APB1时钟二分频,很多外设将无法工作,需要重新对外设初始化才可以使用。当MCU未发生过待机行为,则可以随意配置,再改回来,不会造成一些外设不可用
案例是低功耗串口和RTC,如果待机唤醒后重新配置了这个二分频,则这两个外设都无功能,如果唤醒后不重新配置这个二分频,外设均能工作,只是串口时钟频率高了一倍,波特率高了一倍。如果MCU重来未进入过待机,使用软件将二分频改为4分频或不分频,再改回来,串口功能仍然正常
怀疑MCU待机时,芯片设计上有一些硬件寄存器或硬件状态机的设计有问题
另外待机唤醒后,IWDT独立看门狗无功能,需要重新初始化看门狗