完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
我正在尝试在 baremetal c 中使用 STM32L412RBT6 微控制器进行 RTC 唤醒中断,但中断没有触发,下面提到我的代码。
int 主要(无效) { 领导配置(); tim6Config(); RTC_ClockConfig(); RTC_Init(); /* 永远循环 */ 而(1) { GPIOB->BSRR |= (1U<<13); 延迟_ms(1000); GPIOB->BSRR |= (1U<<29); SysTick->CTRL &= ~SysTick_CTRL_TICKINT_Msk; RTC_SetWakeUpTimer_IT(RTC_WAKEUP_TIME_IN_SECONDS, WakeUpAutoClr); PWR_EnterStopMode(); RTC_DeactivateWakeUpTimer(); RTC_ClockConfig(); SysTick->CTRL |= SysTick_CTRL_TICKINT_Msk; } } void RTC_ClockConfig(void) { /* 为电源接口启用时钟。*/ RCC->APB1ENR1 |= (1U<<28); /*禁用备份域写保护*/ PWR->CR1 |= (1U<<8); while((PWR->CR1 & (1U<<8))==0); /*重置备份域*/ RCC->BDCR |= (1U<<16); RCC->BDCR &= ~(1U<<16); /*启用 LSE 时钟源并等待 LSERDY 位设置 */ RCC->BDCR |= (1U<<0); 而 ((RCC->BDCR & (1U<<1)) == 0); /*选择 LSE 作为 RTC 时钟*/ RCC->BDCR |= (1U<<8); RCC->BDCR &= ~(1U<<9); /*启用RTC时钟*/ RCC->BDCR |= (1U<<15); /*禁止访问RTC寄存器*/ RCC->APB1ENR1 &= ~(1U<<28); } void RTC_Init(void) { /* 禁用 RTC 寄存器的写保护 */ RTC->WPR = 0xCA; RTC->WPR = 0x53; /* 检查是否设置了初始化模式 */ 如果((RTC->ICSR & (1U<<6))==0) { /* 设置初始化模式 */ RTC->ICSR |= (1U<<7); /* 等到 RTC 进入 INIT 状态 */ while((RTC->ICSR & (1U<<6))==0); } /* 清除 RTC_CR FMT、OSEL、POL 和 TAMPOE 位 */ RTC->CR &= ~(1U<<6); //FMT RTC->CR &= ~(1U<<20); //POL RTC->CR &= ~(1U<<21); //OSEL RTC->CR &= ~(1U<<22); //OSEL RTC->CR &= ~(1U<<26); //坦波 /* 设置 RTC_CR 寄存器 */ RTC->CR &= ~(1U<<6); //FMT 位设置为零,小时格式选择为 24 RTC->CR &= ~(1U<<20); //POL 位设置为零,输出极性选择为高。 RTC->CR &= ~(1U<<21); //OSEL[22:21] 设置为零,输出选择禁用。 RTC->CR &= ~(1U<<22); /* 配置 RTC PRER */ RTC->PRER = 0xFF;// 同步值设置为 255 RTC->PRER |= (0x7F<<16); // 异步值设置为 127。 /* 退出初始化模式 */ RTC->ICSR &= ~(1U<<7); // 清除 INIT 位。 /* 清除 RTC_CR TAMPALRM_PU、TAMPALRM_TYPE 和 OUT2EN 位 */ RTC->CR &= ~(1U<<29); RTC->CR &= ~(1U<<30); RTC->CR &= ~(1U<<31); /*设置输出类型为开漏上拉*/ RTC->CR |= (1U<<30); /* 使能 RTC 寄存器的写保护 */ RTC->WPR = 0xFF; } void RTC_DeactivateWakeUpTimer(void) { /*禁用RTC寄存器的写保护*/ RTC->WPR = 0xCA; RTC->WPR = 0x53; /*禁用唤醒定时器*/ RTC->CR &= ~(1U<<10); /*如果使用中断模式,中断源必须禁用*/ RTC->CR &= ~(1U<<14); /* 等到 RTC WUTWF 标志被设置 */ 而 ((RTC->ICSR & (1U<<2)) == 0); /* 使能 RTC 寄存器的写保护 */ RTC->WPR = 0xFF; } void RTC_SetWakeUpTimer_IT(uint32_t RTC_WAKEUP_TIME_IN_SECONDS,uint32_t WakeUpAutoClr) { /* 禁用 RTC 寄存器的写保护 */ RTC->WPR = 0xCA; RTC->WPR = 0x53; /* 清除 RTC_CR 中的 WUTE 以禁用唤醒定时器 */ RTC->CR &= ~(1U<<10); /* 清除标志唤醒 */ RTC->SCR = (1U<<2); /* 轮询 WUTWF 直到它在 RTC_ICSR 中设置,以确保访问唤醒自动重载 计数器和 WUCKSEL[2:0] 位是允许的。*/ 如果((RTC->ICSR & (1U<<6))==0) { while((RTC->ICSR & (1U<<2))==0); } /* 配置唤醒定时器计数器和自动清除值 */ RTC->WUTR |= (RTC_WAKEUP_TIME_IN_SECONDS-1); RTC->WUTR |= (WakeUpAutoClr<<16); /* 配置时钟源 */ RTC->CR &= ~(1U<<0); RTC->CR &= ~(1U<<1); RTC->CR |= (1U<<2); /* RTC WakeUpTimer EXTI 配置:中断配置 */ EXTI->IMR1 |= (1U<<20); EXTI->RTSR1 |= (1U<<20); /* 在 RTC_CR 寄存器中配置中断 */ RTC->CR |= (1U<<14); /* 启用唤醒定时器 */ RTC->CR |= (1U<<10); /* 开启 RTC 寄存器的写保护 */ RTC->WPR = 0xFF; NVIC_EnableIRQ(RTC_WKUP_IRQn); } void RTC_WKUP_IRQHandler(void) { EXTI->PR1 = (1U<<20); 如果((RTC->MISR & (1U<<2))!=0) { RTC->SCR |= (1U<<2); } } 无效 LedConfig(无效) { RCC->AHB2ENR |= (1U<<1); GPIOB->MODER |= (1U<<26); GPIOB->MODER &= ~(1U<<27); } void PWR_EnterStopMode() { /* 使用低功耗稳压器停止 1 模式 */ PWR->CR1 |= (1U<<0); PWR->CR1 &= ~(1U<<1); PWR->CR1 &= ~(1U<<2); /* 设置 Cortex 系统控制寄存器的 SLEEPDEEP 位 */ SCB->SCR |= (1U<<2); /* 请求等待中断 */ __WFI(); /* 重置 Cortex 系统控制寄存器的 SLEEPDEEP 位 */ SCB->SCR &= ~(1U<<2); } void Tim6Config(void) { RCC->APB1ENR1 |= (1U<<4); // 启用定时器 6。 TIM6->PSC = 4-1;// 预分频值; TIM6->ARR = 0xFFFF;// 自动重新加载值。 TIM6->CR1 |= (1U<<0); //启用计数器。 而 (!(TIM6->SR & (1U<<0))); // 等待更新中断标志被设置。 } void Delay_ms(uint16_t 毫秒) { 对于(uint16_t i=0;i { TIM6->CNT = 0; 同时(TIM6->CNT < 1000); } } |
|
相关推荐
1个回答
|
|
问题已解决,在为 RTC_WUTR 寄存器设置值之前,我们必须将寄存器设置为零,因为它的复位值为 0x0000FFFF。一旦我这样做了,我的中断就开始工作了。
|
|
|
|
只有小组成员才能发言,加入小组>>
请教:在使用UDE STK时,单片机使用SPC560D30L1,在配置文件怎么设置或选择?里面只有SPC560D40的选项
2733 浏览 1 评论
3241 浏览 1 评论
请问是否有通过UART连接的两个微处理器之间实现双向值交换的方法?
1810 浏览 1 评论
3650 浏览 6 评论
6038 浏览 21 评论
1339浏览 4评论
201浏览 3评论
对H747I-DISCO写程序时将CN2的st-link复用为usart1,再次烧录时无法检测到stlink怎么解决?
350浏览 2评论
STM32G474RE芯片只是串口发个数据就发烫严重是怎么回事?
444浏览 2评论
STM32处理增量式编码器Z信号如何判断中断是正转的还是反向转的?
274浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-24 03:28 , Processed in 0.867072 second(s), Total 45, Slave 39 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号