3
LPUART 从Sleep/DeepSleep模式
唤醒的软硬件设计
LPUART是如何控制配置实现接收UART数据,利用对方UART发送一个Byte中的START起始位,唤醒Sleep/DeepSleep模式的呢?
3.1在库函数版本的样例中可以通过如下顺序初始化LPUART
a. 使能SYSCFG ,PWR,BKP,LSE时钟,待LSE稳定,使能LPUART时钟;
RCC_APB2PeriphclockCmd(RCC_APB2ENR_SYSCFG, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1ENR_PWR, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1ENR_BKP, ENABLE);
PWR_BackupAccessCmd(ENABLE);
RCC_LSEConfig(RCC_LSE_ON);
DelayNop_Init();
DelayNop_Ms(100);
while(RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET) {;}
RCC_APB2PeriphClockCmd(RCC_APB2ENR_LPUART1, ENABLE);
b. 配置LPUART的LPUART_InitTypeDef结构体中指定的参数;
选择时钟源为LSE 32.768KHz;
选择波特率为9600Bps,8个数据位,1个停止位,无校验位;
对应9600Bps的MDU匹配值为0x952; LPUART_InitTypeDef init_struct;
LPUART_StructInit(&init_struct);
init_struct.LPUART_Clock_Source = 0;
init_struct.LPUART_BaudRate = LPUART_Baudrate_9600;
init_struct.LPUART_WordLength = LPUART_WordLength_8b;
init_struct.LPUART_StopBits = LPUART_StopBits_1;
init_struct.LPUART_Parity = LPUART_Parity_No;
init_struct.LPUART_MDU_Value = 0x952;
init_struct.LPUART_RecvEventCfg = LPUART_RecvEvent_Start_Bit;
LPUART_Init(LPUART1, &init_struct);
c. 使能LPUART接收中断
LPUART_ClearITPendingBit( LPUART1, LPUART_LPUIF_RXIF);
LPUART_ITConfig( LPUART1, LPUART_LPUCON_RXIE, ENABLE );
d. 设置LPUART中断向量
void NVIC_LPUART_ConfigInit(void)
{
NVIC_InitTypeDef NVIC_InitStruct;
NVIC_InitStruct.NVIC_IRQChannel = LPUART1_IRQn;
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
NVIC_InitStruct.NVIC_IRQChannelPriority = 1;
NVIC_Init( &NVIC_InitStruct);
}
e. 设置LPUART1复用的GPIO,复用到PA4&PA5;
void LPUART1_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
RCC_AHBPeriphClockCmd(RCC_AHBENR_GPIOA, ENABLE);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource4, GPIO_AF_3);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource5, GPIO_AF_3);
//LPUART1_TX GPIOA.4
GPIO_StructInit(&GPIO_InitStruct);
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_4;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOA, &GPIO_InitStruct);
//LPUART1_RX GPIOA.5
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_5;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(GPIOA, &GPIO_InitStruct);
}
f. 设定LPUART对应唤醒的EXTI参数
void LPUART1_WKUP_Init(void)
{
EXTI_InitTypeDef EXTI_InitStructure;
EXTI_InitStructure.EXTI_Line = EXTI_Line22;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_trigger = EXTI_Trigger_Falling;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
}
|