先交代一下背景:
最近在做这么一个测试,stm32L053进入停机模式,配置stm32的两个串口互相转发数据,并返回到PC端的调试助手。串口使用的是中断接收,
我看了一下文档,说是外部事件可以唤醒,所以,就没有添加按键中断。
贴一下源码:
//串口UART1 中断接收
void USART1_IRQHandler(void)
{
HAL_UART_IRQHandler(&UartHandle);
flag_uart1=1;//标志在主函数里面发送数据
//如果串口1接收到数据,则通过串口2将串口1接收的数据回发到PC端
TxBuffer2[0]=aRxBuffer[0];
HAL_UART_Receive_IT(&UartHandle,(uint8_t *)aRxBuffer,1);//使能接收中断
}
//串口UART2 中断接收
void USART2_IRQHandler(void)
{
HAL_UART_IRQHandler(&Uart2Handle);//中断服务函数
flag_uart2=1; //标志在主函数里面发送数据
//如果串口2接收到数据,则通过串口1将串口2接收的数据回发到PC端
aTxBuffer[0]=RxBuffer2[0];//将数据保存至缓存
HAL_UART_Receive_IT(&Uart2Handle,(uint8_t *)RxBuffer2,1);//使能接收中断
}
int main(void)
{
HAL_Init();//硬件抽象层初始化
SystemClock_Config();
SystemPower_Config();
USART1_Init();//串口 UART1
USART2_Init();//串口 UART2
while(1)
{
if( (flag_uart1==1) || (flag_uart2==1))//如果中断接收了数据
{
if(flag_uart1==1)
{
flag_uart1=0;
//如果串口1接收到数据,则通过串口2将串口1接收的数据回发到PC端
HAL_UART_Transmit(&Uart2Handle,(uint8_t *)TxBuffer2,1,100);
}
if(flag_uart2==1)
{
flag_uart2=0;
//如果串口2接收到数据,则通过串口1将串口2接收的数据回发到PC
HAL_UART_Transmit(&UartHandle,(uint8_t *)aTxBuffer,1,100);
}
}
HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFE); //进入停机模式,等待外部事件唤醒
SystemClockConfig_STOP();//唤醒后时钟的配置,参考了库函数的代码
}
}
|