#include #include #include "sysctrl.h" #include "gpio.h" #include "flash.h" #include "bsp.h" #include "lpuart.h" #include "uart.h" #include "lpm.h" #include "lptim.h" #include "spi.h" #include "reset.h" #include "wdt.h" #include "rtc.h" #include "i2c.h" #include "bgr.h" #include "adc.h" #include "UartDebug.h" #include "lsm6dsl_app.h" #include "mmc5983.h" #include "sx127x.h" extern void LPUartRx_CallBack(uint8_t Rx); extern void Uart1Rx_CallBack(uint8_t Rx); extern void DebugUartIRQ(uint8_t Data); extern void SysTick_CallBack(void); extern void RtcIRQHander(void); extern void LPTimer0IRQHander(void); extern void LORA_RxCallBack(uint8_t *rBuff, uint8_t rlen); static __IO uint32_t SysTickCnt = 0; static volatile uint32_t u32AdcRestult; static void SystemClkDivInit(void)//系统时钟分频设置 { //时钟分频设置 Sysctrl_SetHCLKDiv(SysctrlHclkDiv1); Sysctrl_SetPCLKDiv(SysctrlPclkDiv1); } static void SystemClkInit(en_sysctrl_rch_freq_t enRchFreq)//时钟初始化 { ///< RCH时钟不同频率的切换,需要先将时钟切换到RCL Sysctrl_SetRCLTrim(SysctrlRclFreq38400); Sysctrl_SetRCLStableTime(SysctrlRclStableCycle64); Sysctrl_ClkSourceEnable(SysctrlClkRCL, TRUE); /*内部高速时钟初始化 24MHZ*/ /*Sysctrl_SetRCHTrim(enRchFreq); Sysctrl_ClkSourceEnable(SysctrlClkRCH, TRUE); //< HCLK不超过24M:此处设置FLASH读等待周期为0 cycle Flash_WaitCycle(FlashWaitCycle0); Sysctrl_SysClkSwitch(SysctrlClkRCH);//系统时钟源选择 */ /*内部高速时钟初始化 48MHZ*/ stc_sysctrl_pll_cfg_t stcPLLCfg; ///< 加载目标频率的RCH的TRIM值 Sysctrl_SetRCHTrim(SysctrlRchFreq4MHz); ///< 使能RCH Sysctrl_ClkSourceEnable(SysctrlClkRCH, TRUE); stcPLLCfg.enInFreq = SysctrlPllInFreq4_6MHz; //RCH 4MHz stcPLLCfg.enOutFreq = SysctrlPllOutFreq36_48MHz; //PLL 输出 stcPLLCfg.enPllClkSrc = SysctrlPllRch; //输入时钟源选择RCH stcPLLCfg.enPllMul = SysctrlPllMul12; //4MHz x 12 = 48MHz Sysctrl_SetPLLFreq(&stcPLLCfg); ///< 当使用的时钟源HCLK大于24M:设置FLASH 读等待周期为1 cycle(默认值也为1 cycle) Flash_WaitCycle(FlashWaitCycle1); ///< 使能PLL Sysctrl_ClkSourceEnable(SysctrlClkPLL, TRUE); ///< 时钟切换到PLL Sysctrl_SysClkSwitch(SysctrlClkPLL); /*外部低速晶振初始化 32.768KHz*/ /* Sysctrl_XTLDriverCfg(SysctrlXtlAmp3, SysctrlXtalDriver3); Sysctrl_SetXTLStableTime(SysctrlXtlStableCycle16384); Sysctrl_ClkSourceEnable(SysctrlClkXTL, TRUE); */ } static void SystemRCLInit(void) { Sysctrl_SetRCLTrim(SysctrlRclFreq38400); ///< 配置RCL时钟为38400kHz Sysctrl_SetRCLStableTime(SysctrlRclStableCycle256); Sysctrl_ClkSourceEnable(SysctrlClkRCL, TRUE); ///< 使能RCL时钟 } void Uart0Init(uint32_t Baud) { stc_gpio_cfg_t stcGpioCfg; stc_uart_cfg_t stcCfg; DDL_ZERO_STRUCT(stcGpioCfg); Sysctrl_SetPeripheralGate(SysctrlPeripheralGpio,TRUE); /// 0x99 || RtcInitStruct.rtcTime.u8Month > 0x12) { RtcInitStruct.rtcTime.u8Second = 0x30; RtcInitStruct.rtcTime.u8Minute = 0x38; RtcInitStruct.rtcTime.u8Hour = 0x08; RtcInitStruct.rtcTime.u8Day = 0x02; RtcInitStruct.rtcTime.u8DayOfWeek = 0x06; RtcInitStruct.rtcTime.u8Month = 0x09; RtcInitStruct.rtcTime.u8Year = 0x23; } RtcInitStruct.rtcCompen = RtcCompenEnable; RtcInitStruct.rtcCompValue = 0; //补偿值 根据实际情况进行补偿 Rtc_Init(&RtcInitStruct); Rtc_AlmIeCmd(TRUE); //使能闹钟中断 EnableNvic(RTC_IRQn, IrqLevel3, TRUE); //使能RTC中断向量 Rtc_Cmd(TRUE); //使能RTC开始计数 Rtc_StartWait(); //启动RTC计数,如果要立即切换到低功耗,需要执行此函数 } /****************************************************************************** * 函数名称: LPTimer0Init * 功能描述: 低功耗定时器0初始化 * 参 数: sTime 定时中断秒时间 * 返 回 值: 无 ******************************************************************************/ void LPTimer0Init(uint16_t _100ms) { Lptim_Cmd(M0P_LPTIMER0, FALSE); stc_lptim_cfg_t stcLptCfg; DDL_ZERO_STRUCT(stcLptCfg); ///< 使能LPTIM0 外设时钟 Sysctrl_SetPeripheralGate(SysctrlPeripheralLpTim0, TRUE); stcLptCfg.enPrs = LptimPrsDiv256; stcLptCfg.enGate = LptimGateLow; stcLptCfg.enGatep = LptimGatePLow; stcLptCfg.enTcksel = LptimRcl; stcLptCfg.enTogen = LptimTogEnLow; stcLptCfg.enCt = LptimTimerFun; //警示器功能 stcLptCfg.enMd = LptimMode1; //工作模式为模式1:无自动重装载16位计数器/定时器 stcLptCfg.u16Arr = 0x10000 - (_100ms * 13); //预装载寄存器值 Lptim_Init(M0P_LPTIMER0, &stcLptCfg); Lptim_ClrItStatus(M0P_LPTIMER0); //清除中断标志位 Lptim_ConfIt(M0P_LPTIMER0, TRUE); //允许LPTIMER中断 EnableNvic(LPTIM_0_1_IRQn, IrqLevel3, TRUE); Lptim_Cmd(M0P_LPTIMER0, TRUE); } void LPTimer0_ON(uint16_t _100ms) { LPTimer0Init(_100ms); } void LPTimer0_OFF(void) { EnableNvic(LPTIM_0_1_IRQn, IrqLevel3, FALSE); Lptim_Cmd(M0P_LPTIMER0, FALSE); } static void GPIOInit(void) { stc_gpio_cfg_t GpioInitStruct; DDL_ZERO_STRUCT(GpioInitStruct); Sysctrl_SetPeripheralGate(SysctrlPeripheralGpio,TRUE); //未使用或引出的脚设为输入上拉 GpioInitStruct.enDir = GpioDirIn; GpioInitStruct.enPu = GpioPuEnable; Gpio_Init(GpioPortA, GpioPin0, &GpioInitStruct); Gpio_Init(GpioPortA, GpioPin1, &GpioInitStruct); Gpio_Init(GpioPortA, GpioPin2, &GpioInitStruct); Gpio_Init(GpioPortA, GpioPin5, &GpioInitStruct); Gpio_Init(GpioPortA, GpioPin6, &GpioInitStruct); Gpio_Init(GpioPortA, GpioPin7, &GpioInitStruct); Gpio_Init(GpioPortA, GpioPin8, &GpioInitStruct); Gpio_Init(GpioPortB, GpioPin2, &GpioInitStruct); Gpio_Init(GpioPortB, GpioPin8, &GpioInitStruct); Gpio_Init(GpioPortB, GpioPin9, &GpioInitStruct); Gpio_Init(GpioPortB, GpioPin15, &GpioInitStruct); Gpio_Init(GpioPortF, GpioPin6, &GpioInitStruct); //end /********************************** GPIO输出 ****************************************/ GpioInitStruct.enDir = GpioDirOut; ///< 端口方向配置->输出 GpioInitStruct.enDrv = GpioDrvH; ///< 端口驱动能力配置->高驱动能力 GpioInitStruct.enPu = GpioPuDisable; ///< 端口上下拉配置->无 GpioInitStruct.enPd = GpioPdDisable; GpioInitStruct.enOD = GpioOdDisable; ///< 端口开漏输出配置->开漏输出关闭 GpioInitStruct.enCtrlMode = GpioAHB; ///< 端口输入/输出值寄存器总线控制模式配置->AHB GpioInitStruct.bOutputVal = false; ///< 端口默认输出配置->低电平 //< RS485控制引脚 Gpio_Init(RS485_CTRL_PORTx,RS485_CTRL_PINx,&GpioInitStruct); //< 激光控制引脚 Gpio_Init(LASER1_ON_OFF_PORTx,LASER1_ON_OFF_PINx,&GpioInitStruct); Gpio_Init(LASER2_ON_OFF_PORTx,LASER2_ON_OFF_PINx,&GpioInitStruct); Gpio_Init(LASER3_ON_OFF_PORTx,LASER3_ON_OFF_PINx,&GpioInitStruct); //< ADC??????? Gpio_Init(AD_ON_OFF_PORTx,AD_ON_OFF_PINx,&GpioInitStruct); GpioInitStruct.bOutputVal = true; ///< 端口默认输出配置->高电平 //< LORA --> RST Gpio_Init(LORA_RST_PORTx,LORA_RST_PINx,&GpioInitStruct); //< LED_State Gpio_Init(LED_STATE_PORTx,LED_STATE_PINx,&GpioInitStruct); /********************************** GPIO输入 ****************************************/ GpioInitStruct.enDir = GpioDirIn; ///< 端口方向配置->输入 GpioInitStruct.enPu = GpioPuDisable; ///< 端口上下拉配置->无 GpioInitStruct.enPd = GpioPdDisable; GpioInitStruct.enOD = GpioOdDisable; //< LORA --> DIO0 Gpio_Init(LORA_DIO0_PORTx,LORA_DIO0_PINx,&GpioInitStruct); //< LORA --> DIO0 Gpio_Init(LORA_DIO1_PORTx,LORA_DIO1_PINx,&GpioInitStruct); //< ACC_INT1 Gpio_Init(LSM6DSLTR_INT1_PORTx,LSM6DSLTR_INT1_PINx,&GpioInitStruct); //< ACC_INT2 Gpio_Init(LSM6DSLTR_INT2_PORTx,LSM6DSLTR_INT2_PINx,&GpioInitStruct); //< MMC_INT Gpio_Init(MMC5983MA_INT_PORTx,MMC5983MA_INT_PINx,&GpioInitStruct); GlobalIntEnable(); } void GlobalIntEnable(void)//全局中断使能 { EnableNvic(PORTB_IRQn, IrqLevel3, TRUE); EnableNvic(PORTC_E_IRQn, IrqLevel3, TRUE); } void GlobalIntDisable(void)//全局中断失能 { EnableNvic(PORTB_IRQn, IrqLevel3, FALSE); EnableNvic(PORTC_E_IRQn, IrqLevel3, FALSE); } void LORAIntEnable(void)//LORA中断使能 { Gpio_EnableIrq(LORA_DIO0_PORTx, LORA_DIO0_PINx, GpioIrqRising);//LORA_DIO0 Gpio_EnableIrq(LORA_DIO1_PORTx, LORA_DIO1_PINx, GpioIrqRising);//LORA_DIO1 } void LORAIntDisable(void)//LORA中断失能 { Gpio_DisableIrq(LORA_DIO0_PORTx, LORA_DIO0_PINx, GpioIrqRising); Gpio_DisableIrq(LORA_DIO1_PORTx, LORA_DIO1_PINx, GpioIrqRising); } void ACCandMMCIntEnable(void)//加速度和地磁中断使能 { Gpio_EnableIrq(LSM6DSLTR_INT1_PORTx, LSM6DSLTR_INT1_PINx, GpioIrqRising);//ACC_Int1 Gpio_EnableIrq(LSM6DSLTR_INT2_PORTx, LSM6DSLTR_INT2_PINx, GpioIrqRising);//ACC_Int2 Gpio_EnableIrq(MMC5983MA_INT_PORTx, MMC5983MA_INT_PINx, GpioIrqRising);//MMC_Int } void ACCandMMCIntDisable(void)//加速度和地磁中断失能 { Gpio_DisableIrq(LSM6DSLTR_INT1_PORTx, LSM6DSLTR_INT1_PINx, GpioIrqRising);//ACC_Int1 Gpio_DisableIrq(LSM6DSLTR_INT2_PORTx, LSM6DSLTR_INT2_PINx, GpioIrqRising);//ACC_Int2 Gpio_DisableIrq(MMC5983MA_INT_PORTx, MMC5983MA_INT_PINx, GpioIrqRising);//MMC_Int } static void SPI0Init(void) { stc_gpio_cfg_t GpioInitStruct; stc_spi_cfg_t SpiInitStruct; DDL_ZERO_STRUCT(GpioInitStruct); Sysctrl_SetPeripheralGate(SysctrlPeripheralGpio,TRUE); /************************** SPI0配置:主机-->LORA *******************************/ GpioInitStruct.enDir = GpioDirOut; Gpio_Init(SPI0_NSS_PORTx,SPI0_NSS_PINx,&GpioInitStruct); Gpio_SetAfMode(SPI0_NSS_PORTx,SPI0_NSS_PINx,SPI0_NSS_AF); //配置SPI0_NSS Gpio_Init(SPI0_SCK_PORTx,SPI0_SCK_PINx,&GpioInitStruct); Gpio_SetAfMode(SPI0_SCK_PORTx,SPI0_SCK_PINx,SPI0_SCK_AF); //配置SPI0_SCK Gpio_Init(SPI0_MOSI_PORTx,SPI0_MOSI_PINx,&GpioInitStruct); Gpio_SetAfMode(SPI0_MOSI_PORTx,SPI0_MOSI_PINx,SPI0_MOSI_AF); //配置SPI0_MOSI GpioInitStruct.enDir = GpioDirIn; ///< 端口方向配置->输入 Gpio_Init(SPI0_MISO_PORTx,SPI0_MISO_PINx,&GpioInitStruct); Gpio_SetAfMode(SPI0_MISO_PORTx, SPI0_MISO_PINx,SPI0_MISO_AF); //配置SPI0_MISO Sysctrl_SetPeripheralGate(SysctrlPeripheralSpi0,TRUE); ///< 打开SPI0外设时钟 Reset_RstPeripheral0(ResetMskSpi0); ///<复位模块 //SPI0模块配置:主机 SpiInitStruct.enSpiMode = SpiMskMaster; //配置位主机模式 SpiInitStruct.enPclkDiv = SpiClkMskDiv4; //波特率:PCLK/4 SpiInitStruct.enCPHA = SpiMskCphasecond; //第二边沿采样 SpiInitStruct.enCPOL = SpiMskcpolhigh; //极性为高 Spi_Init(M0P_SPI0, &SpiInitStruct); } static void SPI1Init(void) { stc_gpio_cfg_t GpioInitStruct; stc_spi_cfg_t SpiInitStruct; DDL_ZERO_STRUCT(GpioInitStruct); Sysctrl_SetPeripheralGate(SysctrlPeripheralGpio,TRUE); /************************** SPI1配置:主机-->LORA *******************************/ GpioInitStruct.enDir = GpioDirOut; Gpio_Init(SPI1_NSS_PORTx,SPI1_NSS_PINx,&GpioInitStruct); Gpio_SetAfMode(SPI1_NSS_PORTx,SPI1_NSS_PINx,SPI1_NSS_AF); //配置SPI1_NSS Gpio_Init(SPI1_SCK_PORTx,SPI1_SCK_PINx,&GpioInitStruct); Gpio_SetAfMode(SPI1_SCK_PORTx,SPI1_SCK_PINx,SPI1_SCK_AF); //配置SPI1_SCK Gpio_Init(SPI1_MOSI_PORTx,SPI1_MOSI_PINx,&GpioInitStruct); Gpio_SetAfMode(SPI1_MOSI_PORTx,SPI1_MOSI_PINx,SPI1_MOSI_AF); //配置SPI1_MOSI GpioInitStruct.enDir = GpioDirIn; ///< 端口方向配置->输入 Gpio_Init(SPI1_MISO_PORTx,SPI1_MISO_PINx,&GpioInitStruct); Gpio_SetAfMode(SPI1_MISO_PORTx, SPI1_MISO_PINx,SPI1_MISO_AF); //配置SPI1_MISO Sysctrl_SetPeripheralGate(SysctrlPeripheralSpi1,TRUE); ///< 打开SPI0外设时钟 Reset_RstPeripheral0(ResetMskSpi1); ///<复位模块 //SPI1模块配置:主机 SpiInitStruct.enSpiMode = SpiMskMaster; //配置位主机模式 SpiInitStruct.enPclkDiv = SpiClkMskDiv2; //波特率:PCLK/2 SpiInitStruct.enCPHA = SpiMskCphasecond; //第二边沿采样 SpiInitStruct.enCPOL = SpiMskcpolhigh; //极性为高 Spi_Init(M0P_SPI1, &SpiInitStruct); } uint8_t Spi0SendReceive(uint8_t sData) { return Spi_RWByte(M0P_SPI0, sData); } uint8_t Spi1SendReceive(uint8_t sData) { return Spi_RWByte(M0P_SPI1, sData); } static void I2C0Init(void) { stc_gpio_cfg_t stcGpioCfg; stc_i2c_cfg_t stcI2cCfg; DDL_ZERO_STRUCT(stcI2cCfg); DDL_ZERO_STRUCT(stcGpioCfg); Sysctrl_SetPeripheralGate(SysctrlPeripheralGpio,TRUE); //开启GPIO时钟门控 stcGpioCfg.enDir = GpioDirOut; ///< 端口方向配置->输出 stcGpioCfg.enOD = GpioOdEnable; ///< 开漏输出 stcGpioCfg.enPu = GpioPuEnable; ///< 端口上拉配置->使能 stcGpioCfg.enPd = GpioPdDisable; ///< 端口下拉配置->禁止 stcGpioCfg.bOutputVal = TRUE; Gpio_Init(I2C0_SCL_PORTx, I2C0_SCL_PINx, &stcGpioCfg); ///< 端口初始化 Gpio_SetAfMode(I2C0_SCL_PORTx, I2C0_SCL_PINx, I2C0_SCL_AF); Gpio_Init(I2C0_SDA_PORTx, I2C0_SDA_PINx, &stcGpioCfg); Gpio_SetAfMode(I2C0_SDA_PORTx, I2C0_SDA_PINx, I2C0_SDA_AF); Sysctrl_SetPeripheralGate(SysctrlPeripheralI2c0,TRUE); ///< 开启I2C0时钟门控 stcI2cCfg.u32Pclk = Sysctrl_GetPClkFreq(); ///< 获取PCLK时钟 stcI2cCfg.u32Baud = 400000; ///< 1MHz stcI2cCfg.enMode = I2cMasterMode; ///< 主机模式 stcI2cCfg.u8SlaveAddr = 0xD5; ///< 从地址,主模式无效 stcI2cCfg.bGc = FALSE; ///< 广播地址应答使能关闭 I2C_Init(M0P_I2C0, &stcI2cCfg); ///< 模块初始化 } static void I2C1Init(void) { stc_gpio_cfg_t stcGpioCfg; stc_i2c_cfg_t stcI2cCfg; DDL_ZERO_STRUCT(stcI2cCfg); DDL_ZERO_STRUCT(stcGpioCfg); Sysctrl_SetPeripheralGate(SysctrlPeripheralGpio,TRUE); //开启GPIO时钟门控 stcGpioCfg.enDir = GpioDirOut; ///< 端口方向配置->输出 stcGpioCfg.enOD = GpioOdEnable; ///< 开漏输出 stcGpioCfg.enPu = GpioPuEnable; ///< 端口上拉配置->使能 stcGpioCfg.enPd = GpioPdDisable; ///< 端口下拉配置->禁止 stcGpioCfg.bOutputVal = TRUE; Gpio_Init(I2C1_SCL_PORTx, I2C1_SCL_PINx, &stcGpioCfg); ///< 端口初始化 Gpio_SetAfMode(I2C1_SCL_PORTx, I2C1_SCL_PINx, I2C1_SCL_AF); Gpio_Init(I2C1_SDA_PORTx, I2C1_SDA_PINx, &stcGpioCfg); Gpio_SetAfMode(I2C1_SDA_PORTx, I2C1_SDA_PINx, I2C1_SDA_AF); Sysctrl_SetPeripheralGate(SysctrlPeripheralI2c1,TRUE); ///< 开启I2C1时钟门控 stcI2cCfg.u32Pclk = Sysctrl_GetPClkFreq(); ///< 获取PCLK时钟 stcI2cCfg.u32Baud = 400000; ///< 1MHz stcI2cCfg.enMode = I2cMasterMode; ///< 主机模式 stcI2cCfg.u8SlaveAddr = 0xD5; ///< 从地址,主模式无效 stcI2cCfg.bGc = FALSE; ///< 广播地址应答使能关闭 I2C_Init(M0P_I2C1, &stcI2cCfg); ///< 模块初始化 } static void WdtInit(void) { #if (USE_WDT == 1) ///< 开启WDT外设时钟 Sysctrl_SetPeripheralGate(SysctrlPeripheralWdt,TRUE); ///< WDT 初始化 Wdt_Init(WdtResetEn, WdtT52s4); Wdt_Start(); #endif } void FlashWrite(uint32_t Addr, uint32_t *wData, int wLen) { while(Ok != Flash_SectorErase(Addr)); for(int i = 0; i < wLen; i++) { Flash_WriteWord(Addr + i * 4, wData[i]); } } void FlashRead(uint32_t Addr, uint32_t *rData, int rLen) { uint32_t u32Addr = Addr; for(int i = 0; i < rLen; i++) { rData[i] = *((volatile uint32_t*)(u32Addr + i * 4)); } } void FeedDog(void) { #if (USE_WDT == 1) Wdt_Feed(); #endif } static uint8_t BCDToDec(uint8_t bcd) { return ((bcd >> 4)& 0x0f) * 10 + (bcd & 0x0f); } static uint8_t DecToBCD(uint8_t Dec) { return (Dec / 10) << 4 | (Dec % 10); } void TimeGet(struct tm *cTime) { stc_rtc_time_t RtcDateTime; Rtc_ReadDateTime(&RtcDateTime); cTime->tm_year = BCDToDec(RtcDateTime.u8Year) + 100; cTime->tm_mon = BCDToDec(RtcDateTime.u8Month) - 1; cTime->tm_mday = BCDToDec(RtcDateTime.u8Day); cTime->tm_hour = BCDToDec(RtcDateTime.u8Hour) + 8; cTime->tm_min = BCDToDec(RtcDateTime.u8Minute); cTime->tm_sec = BCDToDec(RtcDateTime.u8Second); cTime->tm_isdst = 0; } uint32_t TimeTs(void) { struct tm cTime; TimeGet(&cTime); time_t cTimet = mktime(&cTime); return cTimet; } void TimeShow(uint32_t dwStamp) { struct tm *stime; stime = localtime(&dwStamp); DBG_LOG("%d/",stime->tm_year + 1900); DBG_LOG("%d/",stime->tm_mon + 1); DBG_LOG("%d ",stime->tm_mday); DBG_LOG("%d:",stime->tm_hour); DBG_LOG("%d:",stime->tm_min); DBG_LOG("%d\r\n",stime->tm_sec); } void TimeSync(time_t ts) { struct tm *td; stc_rtc_time_t RtcDateTime; td = localtime(&ts); RtcDateTime.u8Year = DecToBCD(td->tm_year - 100); RtcDateTime.u8Month = DecToBCD(td->tm_mon + 1); RtcDateTime.u8Day = DecToBCD(td->tm_mday); RtcDateTime.u8DayOfWeek = DecToBCD(td->tm_wday); RtcDateTime.u8Hour = DecToBCD(td->tm_hour); RtcDateTime.u8Minute = DecToBCD(td->tm_min); RtcDateTime.u8Second = DecToBCD(td->tm_sec); Rtc_SetTime(&RtcDateTime); } void PrintfMess(void) { DBG_LOG("\r\n"); uint32_t CT = TimeTs(); TimeShow(CT); #if(USE_LED == 1) LED_ON(); #endif #if(USE_VBAT_AD == 1) DBG_LOG("VBAT_Percentage:%d\r\n",VBAT_Percentage); #endif } void DBGUartSendByte(uint8_t sData) { if(gDebugChannel == DBG_CH_RS485_1) { LPUart_SendData(M0P_LPUART0, sData); } else { Uart_SendDataPoll(M0P_UART0, sData); } } void DBGUartSend(uint8_t *sData, int sLen) { if(gDebugChannel == DBG_CH_RS485_1) { LPUart0SendArray(sData, sLen); } else { for(int i = 0; i < sLen; i++) { Uart_SendDataPoll(M0P_UART0, sData[i]); } } } void LPUart0SendArray(uint8_t *sData, uint8_t sLen) { RS485_CTRL_TX(); for(int i = 0; i < sLen; i++) { LPUart_SendData(M0P_LPUART0, sData[i]); } RS485_CTRL_RX(); } uint32_t GetSysTick(void) { return SysTickCnt; } void delay_us(uint32_t uS)//24MHz一个nop延时0.5us,12MHz延时1us { uS *= 2; while(uS--) { __NOP(); } } void delay_ms(uint32_t mS) { volatile uint32_t cTick, mTick; cTick = GetSysTick(); while(1){ mTick = GetSysTick(); if(mTick - cTick >= mS) break; } } void SysTick_IRQHandler(void) { SysTickCnt++; SysTick_CallBack(); } void PortA_IRQHandler(void) { } void PortB_IRQHandler(void) { //LORA DIO0 if(TRUE == Gpio_GetIrqStatus(LORA_DIO0_PORTx, LORA_DIO0_PINx)) { Gpio_ClearIrq(LORA_DIO0_PORTx, LORA_DIO0_PINx); Sx1276LoRaLoopHandler(); //lora } //LORA DIO1 if(TRUE == Gpio_GetIrqStatus(LORA_DIO1_PORTx, LORA_DIO1_PINx)) { Gpio_ClearIrq(LORA_DIO1_PORTx, LORA_DIO1_PINx); } } void PortC_IRQHandler(void) { //加速度INT1 if(TRUE == Gpio_GetIrqStatus(LSM6DSLTR_INT1_PORTx, LSM6DSLTR_INT1_PINx)) { Gpio_ClearIrq(LSM6DSLTR_INT1_PORTx, LSM6DSLTR_INT1_PINx); Lsm6dsInt1CallBack(); } //地磁INT if(TRUE == Gpio_GetIrqStatus(MMC5983MA_INT_PORTx, MMC5983MA_INT_PINx)) { Gpio_ClearIrq(MMC5983MA_INT_PORTx, MMC5983MA_INT_PINx); MMC5983IntCallBack(); } } ///CTRL &= ~SysTick_CTRL_ENABLE_Msk; //< LORA Sx1276LoRaSleep();//Lora睡眠 LORAIntDisable();//关闭LORA中断 ACCandMMCIntDisable();//关闭加速度和地磁中断 #if (USE_VBAT_AD == 1)//< AD AD_OFF(); Sysctrl_SetPeripheralGate(SysctrlPeripheralAdcBgr, TRUE); Sysctrl_ClkSourceEnable(SysctrlClkPLL,FALSE); Bgr_BgrDisable(); ///< 关闭BGR Sysctrl_SetPeripheralGate(SysctrlPeripheralAdcBgr, FALSE); Adc_SGL_Stop();//关闭单次采样 #endif #if (USE_SPI0 == 1) Sysctrl_SetPeripheralGate(SysctrlPeripheralSpi0,FALSE);//关闭SPI0外设时钟 #endif #if (USE_UART0 == 1) EnableNvic(UART0_2_IRQn, IrqLevel3, false); Sysctrl_SetPeripheralGate(SysctrlPeripheralUart0,FALSE); //关闭UART0时钟 #endif DeepSleepGPIOCfg(); Lpm_GotoDeepSleep(FALSE); } void WakeUpInit(void) { SystemClkDivInit(); SystemClkInit(SysctrlRchFreq24MHz); GPIOInit(); #if (USE_VBAT_AD == 1)//< AD AD_ON(); AdcInit(); #endif #if (USE_UART0 == 1) Uart0Init(500000); #endif #if (USE_SPI0 == 1) SPI0Init(); #endif #if (USE_WDT == 1)//< WDT WdtInit(); #endif LORAIntEnable();//开启LORA中断 Sx1276LoRaWakeup();//LORA唤醒 ACCandMMCIntEnable();//开启加速度和地磁中断 SysTick_Config(SystemCoreClock/1000); } void SystemReset(void) { NVIC_SystemReset(); } void BspInit(void) { SystemClkDivInit(); SystemClkInit(SysctrlRchFreq24MHz); GPIOInit(); #if (USE_VBAT_AD == 1)//< AD AD_ON(); AdcInit(); #endif #if (USE_UART0 == 1)//< DEBUG Uart0Init(500000); #endif #if (USE_RTC == 1)//< RTC RTCInit(30); #endif #if (USE_WDT == 1)//< WDT WdtInit(); #endif #if (USE_SPI0 == 1) SPI0Init(); #endif #if (USE_SPI1 == 1) SPI1Init(); #endif #if (USE_LPUART0 == 1)//< LPUART0 LpUart0Init(9600); #endif #if(USE_I2C0 == 1) I2C0Init(); #endif #if(USE_I2C1 == 1) I2C1Init(); #endif SysTick_Config(SystemCoreClock/1000); while(Ok != Flash_Init(6, TRUE)); }