完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
在stop1模式下,设置rtc,gpio中断,usart1都可唤醒mcu,但是在rtc和gpio中断唤醒后,发现串口不能收发数据了,再次休眠后串口能唤醒。但是在由usart1唤醒的情况下,串口还是可以通讯使用,请问哪位高手能指点下!
void PrepareUSARTToStopMode(void) { /* Empty RX Fifo before entering Stop mode 1 (Otherwise, characters already present in FIFO will lead to immediate wake up */ while (LL_USART_IsActiveFlag_RXNE(USART1)) { /* Read Received character. RXNE flag is cleared by reading of RDR register */ ubReceivedChar = LL_USART_ReceiveData8(USART1); } /* Clear OVERRUN flag */ LL_USART_ClearFlag_ORE(USART1); /* Make sure that no USART transfer is on-going */ while(LL_USART_IsActiveFlag_BUSY(USART1) == 1) { } /* Make sure that USART is ready to receive */ while(LL_USART_IsActiveFlag_REACK(USART1) == 0) { } /* About to enter stop mode: switch off LED */ //LED_G_TogglePin; /* Configure USART1 transfer interrupts : */ /* Clear WUF flag and enable the UART Wake Up from stop mode Interrupt */ LL_USART_ClearFlag_WKUP(USART1); LL_USART_EnableIT_WKUP(USART1); /* Enable Wake Up From Stop */ LL_USART_EnableInStopMode(USART1); } void Configure_USART1(void) { /* (1) Enable GPIO clock and configures the USART1 pins **********************/ /* (TX on PA.9, RX on PA.10) **********************/ /* Enable the peripheral clock of GPIOA */ LL_AHB2_GRP1_EnableClock(LL_AHB2_GRP1_PERIPH_GPIOA); /* Configure TX Pin as : Alternate function, High Speed, PushPull, Pull up */ LL_GPIO_SetPinMode(GPIOA, LL_GPIO_PIN_9, LL_GPIO_MODE_ALTERNATE); LL_GPIO_SetAFPin_8_15(GPIOA, LL_GPIO_PIN_9, LL_GPIO_AF_7); LL_GPIO_SetPinSpeed(GPIOA, LL_GPIO_PIN_9, LL_GPIO_SPEED_FREQ_HIGH); LL_GPIO_SetPinOutputType(GPIOA, LL_GPIO_PIN_9, LL_GPIO_OUTPUT_PUSHPULL); LL_GPIO_SetPinPull(GPIOA, LL_GPIO_PIN_9, LL_GPIO_PULL_NO); /* Configure RX Pin as : Alternate function, High Speed, PushPull, Pull up */ LL_GPIO_SetPinMode(GPIOA, LL_GPIO_PIN_10, LL_GPIO_MODE_ALTERNATE); LL_GPIO_SetAFPin_8_15(GPIOA, LL_GPIO_PIN_10, LL_GPIO_AF_7); LL_GPIO_SetPinSpeed(GPIOA, LL_GPIO_PIN_10, LL_GPIO_SPEED_FREQ_HIGH); LL_GPIO_SetPinOutputType(GPIOA, LL_GPIO_PIN_10, LL_GPIO_OUTPUT_PUSHPULL); LL_GPIO_SetPinPull(GPIOA, LL_GPIO_PIN_10, LL_GPIO_PULL_NO); /* (2) NVIC Configuration for USART1 interrupts */ /* - Set priority for USART1_IRQn */ /* - Enable USART1_IRQn */ NVIC_SetPriority(USART1_IRQn, 0); NVIC_EnableIRQ(USART1_IRQn); /* (3) Enable the USART1 peripheral clock and clock source ****************/ LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_USART1); /* Set USART1 clock source as HSI */ LL_RCC_SetUSARTClockSource(LL_RCC_USART1_CLKSOURCE_HSI); /* (4) Configure USART1 functional parameters ********************************/ /* Disable USART1 prior modifying configuration registers */ /* Note: Commented as corresponding to Reset value */ // LL_USART_Disable(USART1); /* TX/RX direction */ LL_USART_SetTransferDirection(USART1, LL_USART_DIRECTION_TX_RX); /* 8 data bit, 1 start bit, 1 stop bit, no parity */ LL_USART_ConfigCharacter(USART1, LL_USART_DATAWIDTH_8B, LL_USART_PARITY_NONE, LL_USART_STOPBITS_1); /* No Hardware Flow control */ /* Reset value is LL_USART_HWCONTROL_NONE */ // LL_USART_SetHWFlowCtrl(USART1, LL_USART_HWCONTROL_NONE); /* Oversampling by 16 */ /* Reset value is LL_USART_OVERSAMPLING_16 */ // LL_USART_SetOverSampling(USART1, LL_USART_OVERSAMPLING_16); /* Set Baudrate to 9600 using HSI frequency set to HSI_VALUE */ LL_USART_SetBaudRate(USART1, HSI_VALUE, LL_USART_OVERSAMPLING_16, 9600); /* Set the wake-up event type : specify wake-up on RXNE flag */ LL_USART_SetWKUPType(USART1, LL_USART_WAKEUP_ON_RXNE); // LL_USART_EnableIT_RXNE(USART1); //开启接收中断 /* (5) Enable USART1 **********************************************************/ LL_USART_Enable(USART1); /* Polling USART initialisation */ //while((!(LL_USART_IsActiveFlag_TEACK(USART1))) || (!(LL_USART_IsActiveFlag_REACK(USART1)))) //{ //} } void Stop_Mode_Config(void) { __HAL_RCC_PWR_CLK_ENABLE(); /* Ensure that MSI is wake-up system clock */ __HAL_RCC_WAKEUPSTOP_CLK_CONFIG(RCC_STOP_WAKEUPCLOCK_HSI); /* USER CODE END 2 */ Configure_USART1(); PrepareUSARTToStopMode(); HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON,PWR_STOPENTRY_WFI); SystemClock_Config(); uart_init(9600); IIC_Init(); //HAL_PWREx_EnterSTOP2Mode(PWR_STOPENTRY_WFI); } |
|
相关推荐
2个回答
|
|
唤醒后重新配置一下串口呢
|
|
|
|
首先,请确保你的代码中正确地配置了串口的中断使能和优先级。
在Stop模式下,MCU会进入低功耗模式,所以除了RTC和GPIO中断外,其它外设都会被关闭。当MCU从低功耗模式唤醒时,它会恢复到正常工作模式,并自动开启被配置为唤醒源的中断。 所以你需要确认在唤醒后是否正确地初始化和使能了串口。 如果你的串口设置正常,但在唤醒后无法收发数据,可能是由于以下原因: 1. 确保串口中断设置正确:检查中断优先级设置,并确保中断回调函数中清除了对应的中断标志位。 2. 确保串口的时钟源:在低功耗模式下,MCU的时钟源可能被切换到低功耗RC时钟,而不是主时钟。你可以尝试在唤醒后重新配置串口的时钟源。 如果以上方法都不能解决问题,可以尝试打印调试信息以查看具体是什么导致了串口无法收发数据。您还可以尝试使用示波器或逻辑分析仪检查串口通信线路和信号。 希望这些信息对您有帮助! |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1727 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1605 浏览 1 评论
1043 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
720 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1660 浏览 2 评论
1911浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
704浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
554浏览 3评论
581浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
538浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-14 05:41 , Processed in 0.842149 second(s), Total 81, Slave 65 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号