SYS_INIT(); ---> 这里面将外设时钟都disable了
/* GPIO Configuration */
GPIO_Configuration();
RCCU_Div2Config(ENABLE); // Enable DIV2
RCCU_MCLKConfig(RCCU_DEFAULT); // Configure MCLK = RCLK
RCCU_FCLKConfig(RCCU_DEFAULT); // Configure FCLK = RCLK
RCCU_PCLKConfig(RCCU_DEFAULT); // Configure PCLK = RCLK
RCCU_PLL1Config(RCCU_Mul_12, RCCU_Div_2) ; // Configure the PLL1 ( * 12 , / 2 )
while(RCCU_FlagStatus(RCCU_PLL1_LOCK) == RESET);// Wait PLL to lock
RCCU_RCLKSourceConfig(RCCU_PLL1_Output) ; // Select PLL1_Output as RCLK clock
// at this step the CKOUT signal should be equal to 48 Mhz
/* Enable RTC and EIC clocks on APB1 */
APB_ClockConfig (APB1, ENABLE, UART0_Periph );
/* Enable RTC and EIC clocks on APB2 */
APB_ClockConfig (APB2, ENABLE, //RTC_Periph | --> RTC 仍然可以跑
EIC_Periph |
// TIM0_Periph | --> T0仍然可以跑
TIM1_Periph |
GPIO0_Periph |
GPIO1_Periph |
GPIO2_Periph);
/* Enable the CKOUT clock for debug purpose*/
APB_ClockConfig (APB2, ENABLE, CKOUT_Periph);
请教怎么实现外设功能的时钟势能与关闭
试试直接DISABLE,怀疑你调试时先前已经使能
随后没有恢复到复位状态,所以造成这种情况。
试试直接DISABLE:APB_ClockConfig (APB2, DISABLE, RTC_Periph );
在SYS_INIT函数中已经全部DISABLE了
/* Set the PRCCU registers to theire reset values (This is for debug purpose) */
RCCU->CCR = 0;
RCCU->CFR = 0x00008008;
RCCU->PLL1CR = 0x00000007;
PCU->PWRCR = 0x8000;
/* Disable all peripheral on APB1 */
APB_ClockConfig (APB1, DISABLE, APB1_ALL_Periph);
/* Disable all peripheral on APB2 */
APB_ClockConfig (APB2, DISABLE, APB2_ALL_Periph);
/* Stop the PLL2 */
RCCU_PLL2Disable();
/* Stop unused periph clocks in PRCCU_PER register for low power consumption */
//RCCU->PER &=~0x001F;
RCCU->PER &= 0xfffe0014; // save ~2mA
请把完整的测试程序发上来
你也可以试试把DISABLE所有外设时钟的操作挪到配置好RCCU之后。
再有,你可以直接察看寄存器的值,看它是否正确。
香水
香水,我查看了寄存器,发现对它的操作没有变化,这是怎么回事呢?
谢谢大家关注,此问题已经找到。
typedef volatile struct
{
vu32 EMPTY[3];
vu32 CKDIS;
vu32 SWRES;
} APB_TypeDef;
-->>>
typedef volatile struct
{
vu32 EMPTY[4];
vu32 CKDIS;
vu32 SWRES;
} APB_TypeDef;
我用的是比较老的库,有这个BUG。