使用STM32L4的芯片,在进入stop2模式之前先将RX引脚设置为EXTI模式,然后当接收到数据的时候退出stop2模式再将RX引脚设置为串口接收模式
基本思路是:
1、进入stop2,配置PC5为EXTI外部触发
2、主循环中进入stop2模式
3、使用串口调试助手发送数据,当接收到数据的时候,EXTI外部中断触发,退出STOP2模式,重新配置串口
但是好像串口不起作用。
串口接收中断:
[C] 纯文本查看 复制代码 void USER_USART3_IRQHandler(void)
{
uint8_t data = 0;
if (__HAL_UART_GET_FLAG(&huart3, UART_FLAG_RXNE) != RESET)
{
data = (uint8_t)huart3.Instance->RDR;
wrEleQueue(&uart[_COM3].Rx, data);
}
if (__HAL_UART_GET_FLAG(&huart3, UART_FLAG_IDLE))
{
uart[_COM3].flag = 1;
__HAL_UART_CLEAR_IDLEFLAG(&huart3);
}
}
进入和退出STOP2模式:
[C] 纯文本查看 复制代码 void EnterStop2ModeRTC(void) // 自定义的Enter函数
{
// printf("START STOP2 RTC\r\n");
__HAL_RCC_PWR_CLK_ENABLE();
__HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU);
__HAL_RTC_WAKEUPTIMER_CLEAR_FLAG(&hrtc, RTC_FLAG_WUTF);
__HAL_RTC_WAKEUPTIMER_EXTI_CLEAR_FLAG();
__HAL_RTC_TIMESTAMP_CLEAR_FLAG(&hrtc, RTC_FLAG_TSF);
__HAL_RTC_TAMPER_TIMESTAMP_EXTI_CLEAR_FLAG();
// HAL_RTCEx_SetWakeUpTimer_IT(&hrtc, 4, RTC_WAKEUPCLOCK_CK_SPRE_16BITS); // 休眠4s
// SystemPeripheralClockDisable();
// setUca3RxToExti(); // 配置串口3的RX为EXTI触发
setUca3RxToExti();
HAL_SuspendTick();
HAL_DBGMCU_EnableDBGStopMode();
__HAL_RCC_PWR_CLK_ENABLE(); // 打开电源控制时钟
HAL_PWREx_EnterSTOP2Mode(PWR_STOPENTRY_WFI); // 进入STOP2模式
}
void ExitStop2ModeRTC(void)
{
SystemClock_Config(); // 配置系统时钟
HAL_ResumeTick();
// SystemPeripheralClockEnable();
setUca3RxToRx();
SCB->SCR &= ~SCB_SCR_SLEEPONEXIT_Msk; // 退出中断时不再自动进入低功耗模式
// printf("STOP2 END RTC\r\n");
}
配置接收引脚状态:
[C] 纯文本查看 复制代码 void setUca3RxToExti(void)
{
HAL_UART_MspDeInit(&huart3);
GPIO_InitTypeDef GPIO_InitStruct = {0};
GPIO_InitStruct.Pin = GPIO_PIN_5;
GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
HAL_NVIC_SetPriority(EXTI9_5_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(EXTI9_5_IRQn);
}
void setUca3RxToRx(void)
{
// __HAL_RCC_USART3_CLK_ENABLE();
// __HAL_RCC_GPIOC_CLK_ENABLE();
// GPIO_InitTypeDef GPIO_InitStruct = {0};
// GPIO_InitStruct.Pin = GPIO_PIN_5;
// GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
// GPIO_InitStruct.Pull = GPIO_NOPULL;
// GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
// GPIO_InitStruct.Alternate = GPIO_AF7_USART3;
// HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
// HAL_NVIC_SetPriority(USART3_IRQn, 0, 0);
// HAL_NVIC_EnableIRQ(USART3_IRQn);
HAL_UART_MspInit(&huart3);
MX_USART3_UART_Init();
__HAL_UART_ENABLE_IT(&huart3, UART_IT_RXNE | UART_IT_IDLE);
}
EXTI中断函数:
[C] 纯文本查看 复制代码 void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
if ((GPIO_Pin == GPIO_PIN_5))
{
if ((HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_5) == GPIO_PIN_RESET))
{
ExitStop2ModeRTC();
}
}
}
主函数:
[C] 纯文本查看 复制代码 int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_LPTIM1_Init();
MX_USART3_UART_Init();
MX_RTC_Init();
MX_SPI1_Init();
_VDP_ON; // 外设电源打开
HAL_Delay(100);
_SD_POW_ON; // SD卡打开
MX_SDMMC1_SD_Init();
memory_init();
lcd_init(true);
setLcd();
lcd_full();
bleQueueInit();
__HAL_RTC_WAKEUPTIMER_ENABLE_IT(&hrtc, RTC_IT_WUT);
HAL_LPTIM_TimeOut_Start_IT(&hlptim1, 10, 10);
while (1)
{
// while (getExitLPM3())
// {
// saveData();
// lcdActionPro(); // lcd进程
// keyActPro();
// }
EnterStop2ModeRTC();
}
}
|