2025-02-19 13:21:11 +08:00
|
|
|
/*
|
|
|
|
* 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.
|
|
|
|
*/
|
2025-02-18 10:13:34 +08:00
|
|
|
#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 */
|
2025-02-19 13:21:11 +08:00
|
|
|
FL_RMU_BOR_Enable(RMU); /* 关闭BOR 2uA */
|
|
|
|
FL_VREF_Disable(VREF); /* 关闭VREF1p2 */
|
2025-02-18 10:13:34 +08:00
|
|
|
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) */
|
|
|
|
|