/* * Copyright (c) 2022, SHANGHAI FUDAN MICROELECTRONICS GROUP CO., LTD.(FUDAN MICROELECTRONICS./ FUDAN MICRO.) * All rights reserved. * * Processor: FM33LG0xxA * http: http://www.fmdevelopers.com.cn/ * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * 3. Neither the name of the copyright holder nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * 4. To provide the most up-to-date information, the revision of our documents * on the World Wide Web will be the most Current. Your printed copy may be * an earlier revision. To verify you have the latest information avaliable, * refer to: http://www.fmdevelopers.com.cn/. * * THIS SOFTWARE IS PROVIDED BY FUDAN MICRO "AS IS" AND ANY EXPRESSED * ORIMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED.IN NO EVENT SHALL FUDAN MICRO OR ITS CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISINGIN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OFTHE POSSIBILITY OF SUCH DAMAGE. */ #include "main.h" #include "user_init.h" #include "uart.h" #include "lin.h" #include "sleep.h" #if (SLEEP_SUPPORT == 1) uint8_t g_awake_init = 0; /** * @brief LIN RX引脚GPIO中断初始化 * @param void * @retval void */ void GPIO_interrupt_init(void) { FL_GPIO_InitTypeDef GPIO_InitStruct = {0}; /* 引脚边沿触发选择 */ FL_CMU_EnableEXTIOnSleep(); /* 休眠使能外部中断采样 */ FL_CMU_EnableGroup3OperationClock(FL_CMU_GROUP3_OPCLK_EXTI);/* EXTI工作时钟使能 */ /* 用到的GPIO引脚 设为输入 */ GPIO_InitStruct.pin = LIN_UART_RX_PIN; GPIO_InitStruct.mode = FL_GPIO_MODE_INPUT; GPIO_InitStruct.outputType = FL_GPIO_OUTPUT_PUSHPULL; GPIO_InitStruct.pull = FL_DISABLE; GPIO_InitStruct.remapPin = FL_DISABLE; FL_GPIO_Init(LIN_UART_RX_GPIO, &GPIO_InitStruct); FL_GPIO_SetTriggerEdge0(GPIO, LIN_RX_EXTI_LINE, FL_GPIO_EXTI_TRIGGER_EDGE_DISABLE); /* 关闭边沿触发 */ /* 每条LINE只能选择一个引脚 */ FL_GPIO_SetExtiLine12(GPIO, LIN_RX_EXTI_LINE_PIN); /* 中断引脚选择 */ FL_GPIO_EnableDigitalFilter(GPIO, LIN_RX_EXTI_LINE); /* EXTI数字滤波功能 */ FL_GPIO_SetTriggerEdge0(GPIO, LIN_RX_EXTI_LINE, FL_GPIO_EXTI_TRIGGER_EDGE_FALLING); /* 边沿选择 */ FL_GPIO_ClearFlag_EXTI(GPIO, LIN_RX_EXTI_LINE); /* 清除中断标志 */ /* NVIC中断配置 */ NVIC_DisableIRQ(GPIO_IRQn); NVIC_SetPriority(GPIO_IRQn, LIN_GPIO_IRQ_PRI); NVIC_EnableIRQ(GPIO_IRQn); } /** * @brief LIN Sleep切换 * @param void * @retval void */ void prepare_sleep(void) { lin_sleep_init(); /* 切换Rx引脚为GPIO, 使能中断唤醒 */ GPIO_interrupt_init(); } /** * @brief 进入 Sleep * @param void * @retval void */ void enter_sleep(void) { FL_PMU_SleepInitTypeDef LPM_InitStruct; LED_R_ON(); LPM_InitStruct.deepSleep = FL_PMU_SLEEP_MODE_NORMAL; LPM_InitStruct.powerMode = FL_PMU_POWER_MODE_SLEEP_OR_DEEPSLEEP; LPM_InitStruct.wakeupFrequency = FL_PMU_RCHF_WAKEUP_FREQ_8MHZ; LPM_InitStruct.wakeupDelay = FL_PMU_WAKEUP_DELAY_2US; LPM_InitStruct.LDOLowPowerMode = FL_PMU_LDO_LPM_DISABLE; LPM_InitStruct.coreVoltageScaling = FL_DISABLE; FL_PMU_Sleep_Init(PMU, &LPM_InitStruct); //FL_CMU_RCLF_Enable(); /* 暂开启RCLF */ FL_RMU_PDR_Enable(RMU); /* 打开PDR */ FL_RMU_BOR_Enable(RMU); /* 关闭BOR 2uA */ FL_VREF_Disable(VREF); /* 关闭VREF1p2 */ FL_CDIF_DisableCPUToVAO(CDIF); /* 关闭CPU到VAO的通道 */ /* 睡眠电源模式*/ FL_PMU_SetLowPowerMode(PMU, FL_PMU_POWER_MODE_SLEEP_OR_DEEPSLEEP); __WFI(); //休眠 FL_VREF_Enable(VREF); //使能VREF1p2 } /** * @brief GPIO中断 * @note 唤醒后配置 * @param void * @retval void */ void GPIO_IRQHandler(void) { if(GPIO->EXTIISR & LIN_RX_EXTI_LINE) { LED0_TOG(); /* 第一时间将接收引脚切换为数字功能, 开始GPTIM输入捕获*/ LIN_UART_RX_GPIO->FCR &= ~LIN_UART_RX_PIN_FCR_MASK; LIN_UART_RX_GPIO->FCR |= LIN_UART_RX_PIN_FCR_DIGIT; #if (AUTOBAUD == 1) /* 引脚重配置为GPTIM输入 */ LIN_UART_RX_GPIO->DFS |= LIN_UART_RX_PIN; /* 清中断标志, 使能GPTIM2中断 */ GPTIM2->ISR = LIN_GPTIM2_ISR_MASK; NVIC_ClearPendingIRQ(GPTIM2_IRQn); NVIC_EnableIRQ(GPTIM2_IRQn); /* 使能定时器 */ GPTIM2->CR1 |= GPTIM_CR1_CEN_Msk; #else /* 引脚重置为UART Rx */ LIN_UART_RX_GPIO->DFS &= ~LIN_UART_RX_PIN; /* 清除UART中断标志, 使能UART接收中断 */ LIN_UART->ISR = LIN_UART->ISR; NVIC_ClearPendingIRQ(LIN_UART_IRQType); NVIC_EnableIRQ(LIN_UART_IRQType); /* 使能UART接收功能 */ LIN_UART->CSR |= UART_CSR_RXEN_Msk; #endif LED0_TOG(); /* lin唤醒后配置 */ lin_awake_init(); LED_R_OFF(); LED0_TOG(); /* 清中断标志, 关闭GPIO中断 */ GPIO->EXTIISR = LIN_RX_EXTI_LINE; FL_GPIO_SetTriggerEdge0(GPIO, LIN_RX_EXTI_LINE, FL_GPIO_EXTI_TRIGGER_EDGE_DISABLE); NVIC_ClearPendingIRQ(GPIO_IRQn); } } /** * @brief lin Sleep * @param void * @retval void */ void sleep(void) { prepare_sleep(); enter_sleep(); } #endif /* End #if (SLEEP_SUPPORT == 1) */