void Rtc_Init(void)
{
RCC->APB1ENR |= 1<<28; //使能PWR时钟
PWR->CR |= 1<<8; //访问允许
RCC->CSR |= RCC_CSR_LSION; // 开启LSI
while(!(RCC->CSR & RCC_CSR_LSIRDY));
RCC->CSR |= RCC_CSR_RTCSEL_LSI; // 选择LSI
RCC->CSR |= RCC_CSR_RTCEN; // 使能RTC时钟
RTC->WPR = 0xCA;
RTC->WPR = 0x53;
while(!(RTC->ISR & RTC_ISR_RSF)); // 等待RTC寄存器同步APB
if((RTC->ISR & RTC_ISR_INITF) == 0) // 是为了防止复位后再次初始化
{
RTC->ISR |= RTC_ISR_INIT; // 进入初始化
while(!(RTC->ISR & RTC_ISR_INITF));
RTC->CR &= ~RTC_CR_FMT; // 小时格式 0 24/天 1 AM/PM格式
RTC-> RER = 36 << 16; // 分频 37KZ / (36 + 1) = 1KHZ
RTC-> RER |= 999; // 1KHZ / (999 + 1) =1hz
RTC->ISR &= ~RTC_ISR_INIT; // 推出初始化
}
EXTI->IMR |= EXTI_Line20; // 中断屏蔽,失能
EXTI->EMR |= EXTI_Line20; // 时间屏蔽寄存器
EXTI->SWIER &= ~EXTI_SWIER_SWIER20; // 清除软中断
EXTI-> R |= EXTI_PR_PR20; // 当SWIER 软中断寄存器变为1时,该挂起寄存器
NVIC->ISER[RTC_WKUP_IRQn >> 0x05] = 1U << (RTC_WKUP_IRQn & 0x1F);
RTC->CR &= ~RTC_CR_WUTE;
RTC->CR |= RTC_CR_WUCKSEL_2; // RTC选择 18小时计数 WUTR 是向下计数的
RTC->WUTR = 1; // 唤醒寄存器重装值
RTC->CR |= RTC_CR_WUTIE; // 使能唤醒中断
RTC->CR |= RTC_CR_WUTE; // 使能唤醒计数器
RTC->WPR = 0xFF;
}
void RTC_WKUP_IRQHandler(void)
{
if(RTC->ISR & RTC_ISR_WUTF)
{
RTC->ISR &= ~RTC_ISR_WUTF;
//EXTI->  R |= EXTI_Line20;
//UART1_SendByte(0xAB);
}
UART1_SendByte(0xcd);
}
int main(void)
{
__enable_irq();
Rtc_Init();
VariablesStart();
//PWM_Init_TIM3_CH3(11840, 0); //   WM 初始化 11840得到2.7KHZ的时钟
while(1)
{
CheckUart1(); // 串口接收数据检查
}
}
MCU是 STM32L100
首先说一下唤醒事件是连接到EXTI20的,RTC初始化步骤:
-> 使能内部低速时钟LSI-> RTC选择内部低速时钟LSI
-> 设置异步和同步分频器的值(从而产生1HZ的秒时钟)
-> 选择唤醒计数器的时钟为前面配置的1HZ秒时钟
-> 配置计数器1个时钟产生一次唤醒事件
-> 配置EXTI20事件和中断屏蔽不屏蔽
-> 使能中断,使能唤醒计数器
结果在一个新的板子上第一次烧进去,能产生大约1秒的唤醒中断,后来修改里面的一些参数,烧了第二次也能正常,到第三次就没反应了,不会进入中断里面! 之前的那快板子也不能中断,但是今天同样的程序拿到新的板子上,工作了2次就又没用了!
找了以上午没找到问题,来这里求助了,原子哥!!!求助。
|