#include #include "bsp.h" #include "rtthread.h" #include "ff.h" #define SPI_MASTER_MODE //stc_sd_handle_t stcSdhandle; static uint16_t m_au16Adc1SaValue; #if USE_SD_CARD #include "sd_card.h" /***************************************************************************************** * MMC or SD ****************************************************************************************/ static stc_sdcard_init_t stcCardInitCfg; static stc_sdcard_dma_init_t stcDmaInitCfg; /***************************************************************************************** * 函数名称: SdioInit * 功能描述: Sdio初始化函数 * 参 数: 无 * 返 回 值: 无 *****************************************************************************************/ en_result_t SdioInit(void) { en_result_t result; PORT_SetFunc(SDIOC_D0_PORT, SDIOC_D0_PIN, Func_Sdio, Disable); PORT_SetFunc(SDIOC_D1_PORT, SDIOC_D1_PIN, Func_Sdio, Disable); PORT_SetFunc(SDIOC_D2_PORT, SDIOC_D2_PIN, Func_Sdio, Disable); PORT_SetFunc(SDIOC_D3_PORT, SDIOC_D3_PIN, Func_Sdio, Disable); //PORT_SetFunc(SDIOC_CD_PORT, SDIOC_CD_PIN, Func_Sdio, Disable); PORT_SetFunc(SDIOC_CK_PORT, SDIOC_CK_PIN, Func_Sdio, Disable); PORT_SetFunc(SDIOC_CMD_PORT, SDIOC_CMD_PIN, Func_Sdio, Disable); stcCardInitCfg.enBusWidth = SdiocBusWidth4Bit; stcCardInitCfg.enClkFreq = SdiocClk50M; stcCardInitCfg.enSpeedMode = SdiocHighSpeedMode; stcCardInitCfg.pstcInitCfg = NULL; stcDmaInitCfg.DMAx = M4_DMA2; stcDmaInitCfg.enDmaCh = DmaCh1; stcSdhandle.SDIOCx = SDIOC_UNIT; stcSdhandle.enDevMode = SdCardDmaMode; stcSdhandle.pstcDmaInitCfg = &stcDmaInitCfg; result = SDCARD_Init(&stcSdhandle, &stcCardInitCfg); return result; } /***************************************************************************************** * 函数名称: SDCardErase * 功能描述: SDCard扇区擦除函数,最大擦除扇区数10 * 参 数: u32BlkStartAddr 起始扇区 u32BlkEndAddr 结束扇区 * 返 回 值: 操作成功返回true,失败返回false *****************************************************************************************/ bool SDCardErase(uint32_t u32BlkStartAddr, uint32_t u32BlkEndAddr) { if(u32BlkEndAddr - u32BlkStartAddr > 10) return false; if(Ok != SDCARD_Erase(&stcSdhandle, u32BlkStartAddr, u32BlkEndAddr, 2000u)) { return false; } return true; } /***************************************************************************************** * 函数名称: SDCardReadBlocks * 功能描述: SDCard扇区读取函数,最大读取扇区数10 * 参 数: u32BlkStartAddr 起始扇区 u32BlkEndAddr 结束扇区 * 返 回 值: 操作成功返回true,失败返回false *****************************************************************************************/ bool SDCardReadBlocks(uint32_t u32BlkStartAddr, uint32_t u32BlkEndAddr, uint8_t *ReadBuff) { if(u32BlkEndAddr - u32BlkStartAddr > 10) return false; if (Ok != SDCARD_ReadBlocks(&stcSdhandle, u32BlkStartAddr, u32BlkEndAddr, ReadBuff, 2000u)) { return false; } return true; } /***************************************************************************************** * 函数名称: SDCardWriteBlocks * 功能描述: SDCard扇区写入函数,最大写入扇区数10 * 参 数: u32BlkStartAddr 起始扇区 u32BlkEndAddr 结束扇区 * 返 回 值: 操作成功返回true,失败返回false *****************************************************************************************/ bool SDCardWriteBlocks(uint32_t u32BlkStartAddr, uint32_t u32BlkEndAddr, uint8_t *WriteBuff) { if(u32BlkEndAddr - u32BlkStartAddr > 10) return false; if (Ok != SDCARD_WriteBlocks(&stcSdhandle, u32BlkStartAddr, u32BlkEndAddr, WriteBuff, 2000u)) { return false; } return true; } #endif /***************************************************************************************** * System Clock ****************************************************************************************/ /***************************************************************************************** * 函数名称: SystemClockConfig * 功能描述: 系统时钟设置 * 参 数: 无 * 返 回 值: 无 *****************************************************************************************/ static void SystemClockConfig(void) { stc_clk_sysclk_cfg_t stcSysClkCfg; stc_clk_xtal_cfg_t stcXtalCfg; stc_clk_mpll_cfg_t stcMpllCfg; stc_sram_config_t stcSramConfig; MEM_ZERO_STRUCT(stcSysClkCfg); MEM_ZERO_STRUCT(stcXtalCfg); MEM_ZERO_STRUCT(stcMpllCfg); MEM_ZERO_STRUCT(stcSramConfig); /* Set bus clk div. */ stcSysClkCfg.enHclkDiv = ClkSysclkDiv1; stcSysClkCfg.enExclkDiv = ClkSysclkDiv2; stcSysClkCfg.enPclk0Div = ClkSysclkDiv1; stcSysClkCfg.enPclk1Div = ClkSysclkDiv2; stcSysClkCfg.enPclk2Div = ClkSysclkDiv4; stcSysClkCfg.enPclk3Div = ClkSysclkDiv4; stcSysClkCfg.enPclk4Div = ClkSysclkDiv2; CLK_SysClkConfig(&stcSysClkCfg); /* Config Xtal and Enable Xtal */ stcXtalCfg.enMode = ClkXtalModeOsc; stcXtalCfg.enDrv = ClkXtalLowDrv; stcXtalCfg.enFastStartup = Enable; CLK_XtalConfig(&stcXtalCfg); CLK_XtalCmd(Enable); // /* Config Hrc and enable HRC */ // CLK_HrcTrim(SystemCoreClock); // CLK_HrcCmd(Enable); /* sram init include read/write wait cycle setting */ stcSramConfig.u8SramIdx = Sram12Idx | Sram3Idx | SramHsIdx | SramRetIdx; stcSramConfig.enSramRC = SramCycle2; stcSramConfig.enSramWC = SramCycle2; SRAM_Init(&stcSramConfig); /* flash read wait cycle setting */ EFM_Unlock(); EFM_SetLatency(EFM_LATENCY_5); EFM_Lock(); /* MPLL config (XTAL / pllmDiv * plln / PllpDiv = 200M). */ stcMpllCfg.pllmDiv = 2ul; stcMpllCfg.plln = 50ul; stcMpllCfg.PllpDiv = 2ul; stcMpllCfg.PllqDiv = 2ul; stcMpllCfg.PllrDiv = 2ul; CLK_SetPllSource(ClkPllSrcXTAL); CLK_MpllConfig(&stcMpllCfg); /* Enable MPLL. */ CLK_MpllCmd(Enable); /* Wait MPLL ready. */ while(Set != CLK_GetFlagStatus(ClkFlagMPLLRdy)) { ; } /* Switch driver ability */ PWC_HS2HP(); /* Switch system clock source to MPLL. */ CLK_SetSysClkSource(CLKSysSrcMPLL); } /***************************************************************************************** * 函数名称: Xtal32_ClockConfig * 功能描述: 系统低速时钟配置 * 参 数: 无 * 返 回 值: 无 *****************************************************************************************/ static void Xtal32_ClockConfig(void) { stc_clk_xtal32_cfg_t stcXtal32Cfg; /* configure structure initialization */ MEM_ZERO_STRUCT(stcXtal32Cfg); /* Stop xtal32 */ CLK_Xtal32Cmd(Disable); Ddl_Delay1ms(100u); /* Configuration xtal32 structure */ stcXtal32Cfg.enDrv = ClkXtal32HighDrv; stcXtal32Cfg.enFilterMode = ClkXtal32FilterModeFull; CLK_Xtal32Config(&stcXtal32Cfg); /* Startup xtal32 */ CLK_Xtal32Cmd(Enable); /* wait for xtal32 running */ Ddl_Delay1ms(100u); } /***************************************************************************************** * Debug Uart ****************************************************************************************/ /***************************************************************************************** * 函数名称: DbgUartRec * 功能描述: 调试串口接收函数 * 参 数: 无 * 返 回 值: 返回收到的字符 *****************************************************************************************/ static uint8_t DbgUartRec(void) { uint16_t u16Data = USART_RecData(DBG_USART_CH); return (uint8_t)u16Data; } /***************************************************************************************** * 函数名称: DBGUsartErrIrqCallback * 功能描述: 调试串口错误中断回调函数 * 参 数: 无 * 返 回 值: 无 *****************************************************************************************/ static void DBGUsartErrIrqCallback(void) { if(DBG_USART_CH->SR_f.ORE) { DBG_USART_CH->CR1_f.CORE = 1; USART_RecData(DBG_USART_CH); } if(DBG_USART_CH->SR_f.PE) DBG_USART_CH->CR1_f.CPE = 1; if(DBG_USART_CH->SR_f.FE) DBG_USART_CH->CR1_f.CFE = 1; } /***************************************************************************************** * 函数名称: DbgUsartRxIrqCallback * 功能描述: 调试串口接收中断回调函数 * 参 数: 无 * 返 回 值: 无 *****************************************************************************************/ static void DbgUsartRxIrqCallback(void) { uint8_t rData = DbgUartRec(); DbgRxIrqCallback(rData); } /***************************************************************************************** * 函数名称: DbgUart_Config * 功能描述: 调试串口配置函数 * 参 数: BaudRate 串口波特率 * 返 回 值: 无 *****************************************************************************************/ void DbgUart_Config(uint32_t BaudRate) { stc_usart_uart_init_t stcInitCfg; stc_irq_regi_conf_t stcIrqRegiCfg; en_result_t enRet; stc_port_init_t stcPortInit; MEM_ZERO_STRUCT(stcPortInit); stcPortInit.enPinOType = Pin_OType_Cmos; PORT_Init(DBG_USART_RX_PORT, DBG_USART_RX_PIN, &stcPortInit); PORT_Init(DBG_USART_TX_PORT, DBG_USART_TX_PIN, &stcPortInit); stcInitCfg.enClkMode = UsartIntClkCkNoOutput; stcInitCfg.enClkDiv = UsartClkDiv_1; stcInitCfg.enDataLength = UsartDataBits8; stcInitCfg.enDirection = UsartDataLsbFirst; stcInitCfg.enStopBit = UsartOneStopBit; stcInitCfg.enParity = UsartParityNone; stcInitCfg.enSampleMode = UsartSampleBit8; stcInitCfg.enDetectMode = UsartStartBitFallEdge; stcInitCfg.enHwFlow = UsartRtsEnable; PWC_Fcg1PeriphClockCmd(DBG_FCG1_PERIPH, Enable); PORT_SetFunc(DBG_USART_RX_PORT, DBG_USART_RX_PIN, DBG_USART_RX_FUNC, Disable); PORT_SetFunc(DBG_USART_TX_PORT, DBG_USART_TX_PIN, DBG_USART_TX_FUNC, Disable); enRet = USART_UART_Init(DBG_USART_CH, &stcInitCfg); if(enRet != Ok) { Error_Handler(); } enRet = USART_SetBaudrate(DBG_USART_CH, BaudRate); if(enRet != Ok) { Error_Handler(); } stcIrqRegiCfg.enIRQn = DBGUART_IRQn; stcIrqRegiCfg.pfnCallback = &DbgUsartRxIrqCallback; stcIrqRegiCfg.enIntSrc = DBG_USART_RI_NUM; enIrqRegistration(&stcIrqRegiCfg); NVIC_SetPriority(stcIrqRegiCfg.enIRQn, DDL_IRQ_PRIORITY_DEFAULT); NVIC_ClearPendingIRQ(stcIrqRegiCfg.enIRQn); NVIC_EnableIRQ(stcIrqRegiCfg.enIRQn); /* Set USART RX error IRQ */ stcIrqRegiCfg.enIRQn = DBGUART_EI_IRQn; stcIrqRegiCfg.pfnCallback = &DBGUsartErrIrqCallback; stcIrqRegiCfg.enIntSrc = DBG_USART_EI_NUM; enIrqRegistration(&stcIrqRegiCfg); NVIC_SetPriority(stcIrqRegiCfg.enIRQn, DDL_IRQ_PRIORITY_DEFAULT); NVIC_ClearPendingIRQ(stcIrqRegiCfg.enIRQn); NVIC_EnableIRQ(stcIrqRegiCfg.enIRQn); #if 0 /* Set USART TX IRQ */ stcIrqRegiCfg.enIRQn = Int002_IRQn; stcIrqRegiCfg.pfnCallback = &UsartTxIrqCallback; stcIrqRegiCfg.enIntSrc = USART_TI_NUM; enIrqRegistration(&stcIrqRegiCfg); NVIC_SetPriority(stcIrqRegiCfg.enIRQn, DDL_IRQ_PRIORITY_DEFAULT); NVIC_ClearPendingIRQ(stcIrqRegiCfg.enIRQn); NVIC_EnableIRQ(stcIrqRegiCfg.enIRQn); /* Set USART TX complete IRQ */ stcIrqRegiCfg.enIRQn = Int003_IRQn; stcIrqRegiCfg.pfnCallback = &UsartTxCmpltIrqCallback; stcIrqRegiCfg.enIntSrc = USART_TCI_NUM; enIrqRegistration(&stcIrqRegiCfg); NVIC_SetPriority(stcIrqRegiCfg.enIRQn, DDL_IRQ_PRIORITY_DEFAULT); NVIC_ClearPendingIRQ(stcIrqRegiCfg.enIRQn); NVIC_EnableIRQ(stcIrqRegiCfg.enIRQn); #endif USART_FuncCmd(DBG_USART_CH, UsartTx, Enable); USART_FuncCmd(DBG_USART_CH, UsartRx, Enable); USART_FuncCmd(DBG_USART_CH, UsartRxInt, Enable); } /***************************************************************************************** * 函数名称: DebugUartSend * 功能描述: 调试串口发送函数 * 参 数: sData 发送数据入口指针 sLen 发送数据长度 * 返 回 值: 无 *****************************************************************************************/ void DebugUartSend(uint8_t *sData, uint16_t sLen) { for(int i = 0; i < sLen; i++) { USART_SendData(DBG_USART_CH, sData[i]); while(USART_GetStatus(DBG_USART_CH, UsartTxComplete) == Reset); } } /***************************************************************************************** * RS485Ch1 Uart ****************************************************************************************/ /***************************************************************************************** * 函数名称: RS485Ch1UartRec * 功能描述: RS485通道1串口接收函数 * 参 数: 无 * 返 回 值: 返回收到的字符 *****************************************************************************************/ static uint8_t RS485Ch1UartRec(void) { uint16_t u16Data = USART_RecData(RS485_CH1_USART_CH); return (uint8_t)u16Data; } /***************************************************************************************** * 函数名称: RS485Ch1UsartErrIrqCallback * 功能描述: RS485通道1串口错误中断回调函数 * 参 数: 无 * 返 回 值: 无 *****************************************************************************************/ static void RS485Ch1UsartErrIrqCallback(void) { if(RS485_CH1_USART_CH->SR_f.ORE) { RS485_CH1_USART_CH->CR1_f.CORE = 1; USART_RecData(RS485_CH1_USART_CH); } if(RS485_CH1_USART_CH->SR_f.PE) RS485_CH1_USART_CH->CR1_f.CPE = 1; if(RS485_CH1_USART_CH->SR_f.FE) RS485_CH1_USART_CH->CR1_f.CFE = 1; } /***************************************************************************************** * 函数名称: RS485Ch1UsartRxIrqCallback * 功能描述: RS485通道1串口接收中断回调函数 * 参 数: 无 * 返 回 值: 无 *****************************************************************************************/ static void RS485Ch1UsartRxIrqCallback(void) { uint8_t rData = RS485Ch1UartRec(); RS485Ch1RxIrqCallback(rData); } /***************************************************************************************** * 函数名称: RS485Ch1_Config * 功能描述: RS485通道1配置函数 * 参 数: BaudRate 串口波特率 * 返 回 值: 无 *****************************************************************************************/ void RS485Ch1_Config(uint32_t BaudRate) { stc_usart_uart_init_t stcInitCfg; stc_irq_regi_conf_t stcIrqRegiCfg; en_result_t enRet; stc_port_init_t stcPortInit; MEM_ZERO_STRUCT(stcPortInit); stcPortInit.enPinOType = Pin_OType_Cmos; PORT_Init(RS485_CH1_USART_RX_PORT, RS485_CH1_USART_RX_PIN, &stcPortInit); PORT_Init(RS485_CH1_USART_TX_PORT, RS485_CH1_USART_TX_PIN, &stcPortInit); stcInitCfg.enClkMode = UsartIntClkCkNoOutput; stcInitCfg.enClkDiv = UsartClkDiv_16; stcInitCfg.enDataLength = UsartDataBits8; stcInitCfg.enDirection = UsartDataLsbFirst; stcInitCfg.enStopBit = UsartOneStopBit; stcInitCfg.enParity = UsartParityNone; stcInitCfg.enSampleMode = UsartSampleBit8; stcInitCfg.enDetectMode = UsartStartBitFallEdge; stcInitCfg.enHwFlow = UsartRtsEnable; PWC_Fcg1PeriphClockCmd(RS485_CH1_FCG1_PERIPH, Enable); PORT_SetFunc(RS485_CH1_USART_RX_PORT, RS485_CH1_USART_RX_PIN, RS485_CH1_USART_RX_FUNC, Disable); PORT_SetFunc(RS485_CH1_USART_TX_PORT, RS485_CH1_USART_TX_PIN, RS485_CH1_USART_TX_FUNC, Disable); enRet = USART_UART_Init(RS485_CH1_USART_CH, &stcInitCfg); if(enRet != Ok) { Error_Handler(); } enRet = USART_SetBaudrate(RS485_CH1_USART_CH, BaudRate); if(enRet != Ok) { Error_Handler(); } stcIrqRegiCfg.enIRQn = RS485CH1_UART_IRQn; stcIrqRegiCfg.pfnCallback = &RS485Ch1UsartRxIrqCallback; stcIrqRegiCfg.enIntSrc = RS485_CH1_USART_RI_NUM; enIrqRegistration(&stcIrqRegiCfg); NVIC_SetPriority(stcIrqRegiCfg.enIRQn, DDL_IRQ_PRIORITY_DEFAULT); NVIC_ClearPendingIRQ(stcIrqRegiCfg.enIRQn); NVIC_EnableIRQ(stcIrqRegiCfg.enIRQn); /* Set USART RX error IRQ */ stcIrqRegiCfg.enIRQn = RS485CH1_UART_EI_IRQn; stcIrqRegiCfg.pfnCallback = &RS485Ch1UsartErrIrqCallback; stcIrqRegiCfg.enIntSrc = RS485_CH1_USART_EI_NUM; enIrqRegistration(&stcIrqRegiCfg); NVIC_SetPriority(stcIrqRegiCfg.enIRQn, DDL_IRQ_PRIORITY_DEFAULT); NVIC_ClearPendingIRQ(stcIrqRegiCfg.enIRQn); NVIC_EnableIRQ(stcIrqRegiCfg.enIRQn); #if 0 /* Set USART TX IRQ */ stcIrqRegiCfg.enIRQn = Int002_IRQn; stcIrqRegiCfg.pfnCallback = &UsartTxIrqCallback; stcIrqRegiCfg.enIntSrc = USART_TI_NUM; enIrqRegistration(&stcIrqRegiCfg); NVIC_SetPriority(stcIrqRegiCfg.enIRQn, DDL_IRQ_PRIORITY_DEFAULT); NVIC_ClearPendingIRQ(stcIrqRegiCfg.enIRQn); NVIC_EnableIRQ(stcIrqRegiCfg.enIRQn); /* Set USART TX complete IRQ */ stcIrqRegiCfg.enIRQn = Int003_IRQn; stcIrqRegiCfg.pfnCallback = &UsartTxCmpltIrqCallback; stcIrqRegiCfg.enIntSrc = USART_TCI_NUM; enIrqRegistration(&stcIrqRegiCfg); NVIC_SetPriority(stcIrqRegiCfg.enIRQn, DDL_IRQ_PRIORITY_DEFAULT); NVIC_ClearPendingIRQ(stcIrqRegiCfg.enIRQn); NVIC_EnableIRQ(stcIrqRegiCfg.enIRQn); #endif USART_FuncCmd(RS485_CH1_USART_CH, UsartTx, Enable); USART_FuncCmd(RS485_CH1_USART_CH, UsartRx, Enable); USART_FuncCmd(RS485_CH1_USART_CH, UsartRxInt, Enable); } /***************************************************************************************** * 函数名称: RS485Ch1UartSend * 功能描述: RS485通道1串口发送函数 * 参 数: sData 发送数据入口指针 sLen 发送数据长度 * 返 回 值: 无 *****************************************************************************************/ void RS485Ch1UartSend(uint8_t *sData, uint16_t sLen) { RS485_CH1_TX(); for(int i = 0; i < sLen; i++) { USART_SendData(RS485_CH1_USART_CH, sData[i]); while(USART_GetStatus(RS485_CH1_USART_CH, UsartTxComplete) == Reset); } RS485_CH1_RX(); } /***************************************************************************************** * RS485Ch2 Uart ****************************************************************************************/ /***************************************************************************************** * 函数名称: RS485Ch1UartRec * 功能描述: RS485通道1串口接收函数 * 参 数: 无 * 返 回 值: 返回收到的字符 *****************************************************************************************/ static uint8_t RS485Ch2UartRec(void) { uint16_t u16Data = USART_RecData(RS485_CH2_USART_CH); return (uint8_t)u16Data; } /***************************************************************************************** * 函数名称: RS485Ch1UsartErrIrqCallback * 功能描述: RS485通道1串口错误中断回调函数 * 参 数: 无 * 返 回 值: 无 *****************************************************************************************/ static void RS485Ch2UsartErrIrqCallback(void) { if(RS485_CH2_USART_CH->SR_f.ORE) { RS485_CH2_USART_CH->CR1_f.CORE = 1; USART_RecData(RS485_CH2_USART_CH); } if(RS485_CH2_USART_CH->SR_f.PE) RS485_CH2_USART_CH->CR1_f.CPE = 1; if(RS485_CH2_USART_CH->SR_f.FE) RS485_CH2_USART_CH->CR1_f.CFE = 1; } /***************************************************************************************** * 函数名称: RS485Ch1UsartRxIrqCallback * 功能描述: RS485通道1串口接收中断回调函数 * 参 数: 无 * 返 回 值: 无 *****************************************************************************************/ static void RS485Ch2UsartRxIrqCallback(void) { uint8_t rData = RS485Ch2UartRec(); RS485Ch2RxIrqCallback(rData); } /***************************************************************************************** * 函数名称: RS485Ch1_Config * 功能描述: RS485通道1配置函数 * 参 数: BaudRate 串口波特率 * 返 回 值: 无 *****************************************************************************************/ void RS485Ch2_Config(uint32_t BaudRate) { stc_usart_uart_init_t stcInitCfg; stc_irq_regi_conf_t stcIrqRegiCfg; en_result_t enRet; stc_port_init_t stcPortInit; MEM_ZERO_STRUCT(stcPortInit); stcPortInit.enPinOType = Pin_OType_Cmos; PORT_Init(RS485_CH2_USART_RX_PORT, RS485_CH2_USART_RX_PIN, &stcPortInit); PORT_Init(RS485_CH2_USART_TX_PORT, RS485_CH2_USART_TX_PIN, &stcPortInit); stcInitCfg.enClkMode = UsartIntClkCkNoOutput; stcInitCfg.enClkDiv = UsartClkDiv_16; stcInitCfg.enDataLength = UsartDataBits8; stcInitCfg.enDirection = UsartDataLsbFirst; stcInitCfg.enStopBit = UsartOneStopBit; stcInitCfg.enParity = UsartParityNone; stcInitCfg.enSampleMode = UsartSampleBit8; stcInitCfg.enDetectMode = UsartStartBitFallEdge; stcInitCfg.enHwFlow = UsartRtsEnable; PWC_Fcg1PeriphClockCmd(RS485_CH2_FCG1_PERIPH, Enable); PORT_SetFunc(RS485_CH2_USART_RX_PORT, RS485_CH2_USART_RX_PIN, RS485_CH2_USART_RX_FUNC, Disable); PORT_SetFunc(RS485_CH2_USART_TX_PORT, RS485_CH2_USART_TX_PIN, RS485_CH2_USART_TX_FUNC, Disable); enRet = USART_UART_Init(RS485_CH2_USART_CH, &stcInitCfg); if(enRet != Ok) { Error_Handler(); } enRet = USART_SetBaudrate(RS485_CH2_USART_CH, BaudRate); if(enRet != Ok) { Error_Handler(); } stcIrqRegiCfg.enIRQn = RS485CH2_UART_IRQn; stcIrqRegiCfg.pfnCallback = &RS485Ch2UsartRxIrqCallback; stcIrqRegiCfg.enIntSrc = RS485_CH2_USART_RI_NUM; enIrqRegistration(&stcIrqRegiCfg); NVIC_SetPriority(stcIrqRegiCfg.enIRQn, DDL_IRQ_PRIORITY_DEFAULT); NVIC_ClearPendingIRQ(stcIrqRegiCfg.enIRQn); NVIC_EnableIRQ(stcIrqRegiCfg.enIRQn); /* Set USART RX error IRQ */ stcIrqRegiCfg.enIRQn = RS485CH2_UART_EI_IRQn; stcIrqRegiCfg.pfnCallback = &RS485Ch2UsartErrIrqCallback; stcIrqRegiCfg.enIntSrc = RS485_CH2_USART_EI_NUM; enIrqRegistration(&stcIrqRegiCfg); NVIC_SetPriority(stcIrqRegiCfg.enIRQn, DDL_IRQ_PRIORITY_DEFAULT); NVIC_ClearPendingIRQ(stcIrqRegiCfg.enIRQn); NVIC_EnableIRQ(stcIrqRegiCfg.enIRQn); #if 0 /* Set USART TX IRQ */ stcIrqRegiCfg.enIRQn = Int002_IRQn; stcIrqRegiCfg.pfnCallback = &UsartTxIrqCallback; stcIrqRegiCfg.enIntSrc = USART_TI_NUM; enIrqRegistration(&stcIrqRegiCfg); NVIC_SetPriority(stcIrqRegiCfg.enIRQn, DDL_IRQ_PRIORITY_DEFAULT); NVIC_ClearPendingIRQ(stcIrqRegiCfg.enIRQn); NVIC_EnableIRQ(stcIrqRegiCfg.enIRQn); /* Set USART TX complete IRQ */ stcIrqRegiCfg.enIRQn = Int003_IRQn; stcIrqRegiCfg.pfnCallback = &UsartTxCmpltIrqCallback; stcIrqRegiCfg.enIntSrc = USART_TCI_NUM; enIrqRegistration(&stcIrqRegiCfg); NVIC_SetPriority(stcIrqRegiCfg.enIRQn, DDL_IRQ_PRIORITY_DEFAULT); NVIC_ClearPendingIRQ(stcIrqRegiCfg.enIRQn); NVIC_EnableIRQ(stcIrqRegiCfg.enIRQn); #endif USART_FuncCmd(RS485_CH2_USART_CH, UsartTx, Enable); USART_FuncCmd(RS485_CH2_USART_CH, UsartRx, Enable); USART_FuncCmd(RS485_CH2_USART_CH, UsartRxInt, Enable); } /***************************************************************************************** * 函数名称: RS485Ch1UartSend * 功能描述: RS485通道1串口发送函数 * 参 数: sData 发送数据入口指针 sLen 发送数据长度 * 返 回 值: 无 *****************************************************************************************/ void RS485Ch2UartSend(uint8_t *sData, uint16_t sLen) { RS485_CH2_TX(); for(int i = 0; i < sLen; i++) { USART_SendData(RS485_CH2_USART_CH, sData[i]); while(USART_GetStatus(RS485_CH2_USART_CH, UsartTxComplete) == Reset); } RS485_CH2_RX(); } /***************************************************************************************** * Eth Or Cat1 Uart ****************************************************************************************/ /***************************************************************************************** * 函数名称: EthOrCat1UartRec * 功能描述: cat1和eth串口接收函数 * 参 数: 无 * 返 回 值: 返回收到的字符 *****************************************************************************************/ static uint8_t EthOrCat1UartRec(void) { uint16_t u16Data = USART_RecData(ETH_OR_CAT1_USART_CH); return (uint8_t)u16Data; } /***************************************************************************************** * 函数名称: RS485Ch1UsartErrIrqCallback * 功能描述: cat1和eth串口错误中断回调函数 * 参 数: 无 * 返 回 值: 无 *****************************************************************************************/ static void EthOrCat1UsartErrIrqCallback(void) { if(ETH_OR_CAT1_USART_CH->SR_f.ORE) { ETH_OR_CAT1_USART_CH->CR1_f.CORE = 1; USART_RecData(ETH_OR_CAT1_USART_CH); } if(ETH_OR_CAT1_USART_CH->SR_f.PE) ETH_OR_CAT1_USART_CH->CR1_f.CPE = 1; if(ETH_OR_CAT1_USART_CH->SR_f.FE) ETH_OR_CAT1_USART_CH->CR1_f.CFE = 1; } /***************************************************************************************** * 函数名称: RS485Ch1UsartRxIrqCallback * 功能描述: cat1和eth串口接收中断回调函数 * 参 数: 无 * 返 回 值: 无 *****************************************************************************************/ static void EthOrCat1UsartRxIrqCallback(void) { uint8_t rData =EthOrCat1UartRec(); EthOrCat1RxIrqCallback(rData); } /***************************************************************************************** * 函数名称: RS485Ch1_Config * 功能描述: cat1和eth串口配置函数 * 参 数: BaudRate 串口波特率 * 返 回 值: 无 *****************************************************************************************/ void EthOrCat1_Config(uint32_t BaudRate) { stc_usart_uart_init_t stcInitCfg; stc_irq_regi_conf_t stcIrqRegiCfg; en_result_t enRet; stc_port_init_t stcPortInit; MEM_ZERO_STRUCT(stcPortInit); stcPortInit.enPinOType = Pin_OType_Cmos; PORT_Init(ETH_OR_CAT1_USART_RX_PORT, ETH_OR_CAT1_USART_RX_PIN, &stcPortInit); PORT_Init(ETH_OR_CAT1_USART_TX_PORT, ETH_OR_CAT1_USART_TX_PIN, &stcPortInit); stcInitCfg.enClkMode = UsartIntClkCkNoOutput; stcInitCfg.enClkDiv = UsartClkDiv_1; stcInitCfg.enDataLength = UsartDataBits8; stcInitCfg.enDirection = UsartDataLsbFirst; stcInitCfg.enStopBit = UsartOneStopBit; stcInitCfg.enParity = UsartParityNone; stcInitCfg.enSampleMode = UsartSampleBit8; stcInitCfg.enDetectMode = UsartStartBitFallEdge; stcInitCfg.enHwFlow = UsartRtsEnable; PWC_Fcg1PeriphClockCmd(ETH_OR_CAT1_FCG1_PERIPH, Enable); PORT_SetFunc(ETH_OR_CAT1_USART_RX_PORT, ETH_OR_CAT1_USART_RX_PIN, ETH_OR_CAT1_USART_RX_FUNC, Disable); PORT_SetFunc(ETH_OR_CAT1_USART_TX_PORT, ETH_OR_CAT1_USART_TX_PIN, ETH_OR_CAT1_USART_TX_FUNC, Disable); enRet = USART_UART_Init(ETH_OR_CAT1_USART_CH, &stcInitCfg); if(enRet != Ok) { Error_Handler(); } enRet = USART_SetBaudrate(ETH_OR_CAT1_USART_CH, BaudRate); if(enRet != Ok) { Error_Handler(); } stcIrqRegiCfg.enIRQn = ETH_OR_CAT1_UART_IRQn; stcIrqRegiCfg.pfnCallback = &EthOrCat1UsartRxIrqCallback; stcIrqRegiCfg.enIntSrc = ETH_OR_CAT1_USART_RI_NUM; enIrqRegistration(&stcIrqRegiCfg); NVIC_SetPriority(stcIrqRegiCfg.enIRQn, DDL_IRQ_PRIORITY_DEFAULT); NVIC_ClearPendingIRQ(stcIrqRegiCfg.enIRQn); NVIC_EnableIRQ(stcIrqRegiCfg.enIRQn); /* Set USART RX error IRQ */ stcIrqRegiCfg.enIRQn = ETH_OR_CAT1_UART_EI_IRQn; stcIrqRegiCfg.pfnCallback = &EthOrCat1UsartErrIrqCallback; stcIrqRegiCfg.enIntSrc = ETH_OR_CAT1_USART_EI_NUM; enIrqRegistration(&stcIrqRegiCfg); NVIC_SetPriority(stcIrqRegiCfg.enIRQn, DDL_IRQ_PRIORITY_DEFAULT); NVIC_ClearPendingIRQ(stcIrqRegiCfg.enIRQn); NVIC_EnableIRQ(stcIrqRegiCfg.enIRQn); #if 0 /* Set USART TX IRQ */ stcIrqRegiCfg.enIRQn = Int002_IRQn; stcIrqRegiCfg.pfnCallback = &UsartTxIrqCallback; stcIrqRegiCfg.enIntSrc = USART_TI_NUM; enIrqRegistration(&stcIrqRegiCfg); NVIC_SetPriority(stcIrqRegiCfg.enIRQn, DDL_IRQ_PRIORITY_DEFAULT); NVIC_ClearPendingIRQ(stcIrqRegiCfg.enIRQn); NVIC_EnableIRQ(stcIrqRegiCfg.enIRQn); /* Set USART TX complete IRQ */ stcIrqRegiCfg.enIRQn = Int003_IRQn; stcIrqRegiCfg.pfnCallback = &UsartTxCmpltIrqCallback; stcIrqRegiCfg.enIntSrc = USART_TCI_NUM; enIrqRegistration(&stcIrqRegiCfg); NVIC_SetPriority(stcIrqRegiCfg.enIRQn, DDL_IRQ_PRIORITY_DEFAULT); NVIC_ClearPendingIRQ(stcIrqRegiCfg.enIRQn); NVIC_EnableIRQ(stcIrqRegiCfg.enIRQn); #endif USART_FuncCmd(ETH_OR_CAT1_USART_CH, UsartTx, Enable); USART_FuncCmd(ETH_OR_CAT1_USART_CH, UsartRx, Enable); USART_FuncCmd(ETH_OR_CAT1_USART_CH, UsartRxInt, Enable); } /***************************************************************************************** * 函数名称: EthOrCat1UartSend * 功能描述: cat1和eth串口发送函数 * 参 数: sData 发送数据入口指针 sLen 发送数据长度 * 返 回 值: 无 *****************************************************************************************/ void EthOrCat1UartSend(uint8_t *sData, uint16_t sLen) { for(int i = 0; i < sLen; i++) { USART_SendData(ETH_OR_CAT1_USART_CH, sData[i]); while(USART_GetStatus(ETH_OR_CAT1_USART_CH, UsartTxComplete) == Reset); } } /***************************************************************************************** * GPIO ****************************************************************************************/ /***************************************************************************************** * 函数名称: LoraDio0IrqCallback * 功能描述: LORA DIO0中断回调函数 * 参 数: 无 * 返 回 值: 无 *****************************************************************************************/ static void LoraDio0IrqCallback(void) { EXINT_IrqFlgClr(LORA_DIO_EXIT_CH); LoraTxRxIrqCallback(); } /***************************************************************************************** * 函数名称: GPIO_Config * 功能描述: GPIO配置函数 * 参 数: 无 * 返 回 值: 无 *****************************************************************************************/ static void GPIO_Config(void) { stc_port_init_t stcPortInit; stc_port_pub_set_t stcPortPub; stc_exint_config_t stcExtiConfig; stc_irq_regi_conf_t stcIrqRegiConf; PORT_DebugPortSetting(TDO_SWO, Disable); PORT_DebugPortSetting(TDI, Disable); PORT_DebugPortSetting(TRST, Disable); MEM_ZERO_STRUCT(stcPortInit); MEM_ZERO_STRUCT(stcPortPub); stcPortPub.enReadWait = WaitCycle3; PORT_PubSetting(&stcPortPub); stcPortInit.enPinMode = Pin_Mode_Out; stcPortInit.enPinOType = Pin_OType_Cmos; stcPortInit.enPinDrv = Pin_Drv_H; stcPortInit.enPullUp = Disable; PORT_Init(RS485_CH1_CTRL_PORT, RS485_CH1_CTRL_PIN, &stcPortInit); RS485_CH1_RX(); PORT_Init(RS485_CH1_POW_PORT, RS485_CH1_POW_PIN, &stcPortInit); RS485_CH1_POW_OFF(); // PORT_Init(RS485_CH1_VOL_CTRL_PORT, RS485_CH1_VOL_CTRL_PIN, &stcPortInit); // RS485_CH1_VOL_5V(); PORT_Init(RS485_CH2_CTRL_PORT, RS485_CH2_CTRL_PIN, &stcPortInit); RS485_CH2_RX(); PORT_Init(RS485_CH2_POW_PORT, RS485_CH2_POW_PIN, &stcPortInit); RS485_CH2_POW_OFF(); // PORT_Init(RS485_CH2_VOL_CTRL_PORT, RS485_CH2_VOL_CTRL_PIN, &stcPortInit); // RS485_CH1_VOL_5V(); PORT_Init(ETH_OR_CAT1_CTRL_PORT, ETH_OR_CAT1_CTRL_PIN, &stcPortInit); // PORT_Init(ETH_OR_CAT1_TX_CTRL_PORT, ETH_OR_CAT1_TX_CTRL_PIN, &stcPortInit); ETH_ON(); PORT_Init(CAT1_PWR_KEY_PORT, CAT1_PWR_KEY_PIN, &stcPortInit); CAT1_PWR_KEY_SET(); PORT_Init(CAT1_RESET_PORT, CAT1_RESET_PIN, &stcPortInit); CAT1_RESET_CLR(); // PORT_Init(CAT1_POW_PORT, CAT1_POW_PIN, &stcPortInit); // CAT1_POW_OFF(); PORT_Init(ETH_RESET_PORT, ETH_RESET_PIN, &stcPortInit); ETH_RESET_CLR(); PORT_Init(ETH_DEF_PORT, ETH_DEF_PIN, &stcPortInit); ETH_DEF_SET(); // PORT_Init(SPI_NSS_PORT, SPI_NSS_PIN, &stcPortInit); // SPI_NSS_SET(); // PORT_Init(SPI2_NSS_PORT, SPI2_NSS_PIN, &stcPortInit); // SPI2_NSS_SET(); PORT_Init(LORA_RESET_PORT, LORA_RESET_PIN, &stcPortInit); LORA_RESET_SET(); PORT_Init(LORA_RXEN_PORT, LORA_RXEN_PIN, &stcPortInit); LORA_RXEN_SET(); PORT_Init(LORA_TXEN_PORT, LORA_TXEN_PIN, &stcPortInit); LORA_TXEN_CLR(); PORT_Init(POWER_LED_PORT, POWER_LED_PIN, &stcPortInit); POWER_LED_OFF(); PORT_Init(LORA_RX_LED_PORT, LORA_RX_LED_PIN, &stcPortInit); LORA_RX_LED_CLR(); PORT_Init(LORA_POW_PORT, LORA_POW_PIN, &stcPortInit); LORA_POW_OFF(); stcPortInit.enPinMode = Pin_Mode_In; PORT_Init(ETH_LINK_PORT, ETH_LINK_PIN, &stcPortInit); stcPortInit.enExInt = Enable; stcPortInit.enPullUp = Enable; PORT_Init(LORA_DIO_PORT, LORA_DIO_PIN, &stcPortInit); stcExtiConfig.enExitCh = LORA_DIO_EXIT_CH; stcExtiConfig.enFilterEn = Enable; stcExtiConfig.enFltClk = Pclk3Div8; stcExtiConfig.enExtiLvl = ExIntRisingEdge; EXINT_Init(&stcExtiConfig); stcIrqRegiConf.enIntSrc = LORA_DIO_EXIT_SRC; /* Select External Int Ch.1 */ stcIrqRegiConf.enIRQn = LORA_DIO0_IRQn; /* Register External Int to Vect.No.000 */ stcIrqRegiConf.pfnCallback = &LoraDio0IrqCallback; /* Callback function */ enIrqRegistration(&stcIrqRegiConf); /* Registration IRQ */ NVIC_ClearPendingIRQ(stcIrqRegiConf.enIRQn); /* Clear pending */ NVIC_SetPriority(stcIrqRegiConf.enIRQn, DDL_IRQ_PRIORITY_00); /* Set priority */ NVIC_EnableIRQ(stcIrqRegiConf.enIRQn); /* Enable NVIC */ //enIntWakeupEnable(Extint2WU); } /***************************************************************************************** * SPI1 spiflash ****************************************************************************************/ /***************************************************************************************** * 函数名称: Spi1_Config * 功能描述: SPI1配置函数 * 参 数: 无 * 返 回 值: 无 *****************************************************************************************/ static void Spi1_Config(void) { stc_spi_init_t stcSpiInit; stc_port_init_t stcPortInit; MEM_ZERO_STRUCT(stcPortInit); stcPortInit.enPinOType = Pin_OType_Cmos; PORT_Init(SPI_SCK_PORT, SPI_SCK_PIN, &stcPortInit); PORT_Init(SPI_MOSI_PORT, SPI_MOSI_PIN, &stcPortInit); PORT_Init(SPI_MISO_PORT, SPI_MISO_PIN, &stcPortInit); stcPortInit.enPinMode = Pin_Mode_Out; stcPortInit.enPinOType = Pin_OType_Cmos; stcPortInit.enPinDrv = Pin_Drv_H; stcPortInit.enPullUp = Disable; PORT_Init(SPI_NSS_PORT, SPI_NSS_PIN, &stcPortInit); SPI_NSS_SET(); /* configuration structure initialization */ MEM_ZERO_STRUCT(stcSpiInit); /* Configuration peripheral clock */ PWC_Fcg1PeriphClockCmd(SPI_UNIT_CLOCK, Enable); /* Configuration SPI pin */ PORT_SetFunc(SPI_SCK_PORT, SPI_SCK_PIN, SPI_SCK_FUNC, Disable); PORT_SetFunc(SPI_MOSI_PORT, SPI_MOSI_PIN, SPI_MOSI_FUNC, Disable); PORT_SetFunc(SPI_MISO_PORT, SPI_MISO_PIN, SPI_MISO_FUNC, Disable); /* Configuration SPI structure */ stcSpiInit.enClkDiv = SpiClkDiv16; stcSpiInit.enFrameNumber = SpiFrameNumber1; stcSpiInit.enDataLength = SpiDataLengthBit8; stcSpiInit.enFirstBitPosition = SpiFirstBitPositionMSB; stcSpiInit.enSckPolarity = SpiSckIdleLevelHigh; stcSpiInit.enSckPhase = SpiSckOddChangeEvenSample; stcSpiInit.enReadBufferObject = SpiReadReceiverBuffer; stcSpiInit.enWorkMode = SpiWorkMode4Line; stcSpiInit.enTransMode = SpiTransFullDuplex; stcSpiInit.enCommAutoSuspendEn = Disable; stcSpiInit.enModeFaultErrorDetectEn = Disable; stcSpiInit.enParitySelfDetectEn = Disable; stcSpiInit.enParityEn = Disable; stcSpiInit.enParity = SpiParityEven; #ifdef SPI_MASTER_MODE stcSpiInit.enMasterSlaveMode = SpiModeMaster; stcSpiInit.stcDelayConfig.enSsSetupDelayOption = SpiSsSetupDelayCustomValue; stcSpiInit.stcDelayConfig.enSsSetupDelayTime = SpiSsSetupDelaySck1; stcSpiInit.stcDelayConfig.enSsHoldDelayOption = SpiSsHoldDelayCustomValue; stcSpiInit.stcDelayConfig.enSsHoldDelayTime = SpiSsHoldDelaySck1; stcSpiInit.stcDelayConfig.enSsIntervalTimeOption = SpiSsIntervalCustomValue; stcSpiInit.stcDelayConfig.enSsIntervalTime = SpiSsIntervalSck6PlusPck2; stcSpiInit.stcSsConfig.enSsValidBit = SpiSsValidChannel0; stcSpiInit.stcSsConfig.enSs0Polarity = SpiSsLowValid; #endif #ifdef SPI_SLAVE_MODE stcSpiInit.enMasterSlaveMode = SpiModeSlave; stcSpiInit.stcSsConfig.enSsValidBit = SpiSsValidChannel0; stcSpiInit.stcSsConfig.enSs0Polarity = SpiSsLowValid; #endif SPI_Init(SPI_UNIT, &stcSpiInit); SPI_Cmd(SPI_UNIT, Enable); } /***************************************************************************************** * 函数名称: Spi1SendReceive * 功能描述: SPI1发送接收函数 * 参 数: sData 发送的数据入库哦 * 返 回 值: 接收到的数据 *****************************************************************************************/ uint16_t Spi1SendReceive(uint16_t sData) { uint16_t retry = 0; uint16_t rData; /* Wait tx buffer empty */ while (Reset == SPI_GetFlag(SPI_UNIT, SpiFlagSendBufferEmpty)) { retry++; if(retry > 0x4000) return 0; } /* Send data */ SPI_SendData8(SPI_UNIT, sData); /* Wait rx buffer full */ retry = 0; while (Reset == SPI_GetFlag(SPI_UNIT, SpiFlagReceiveBufferFull)) { retry++; if(retry > 0x4000) return 0; } /* Receive data */ rData = SPI_ReceiveData8(SPI_UNIT); return rData; } /***************************************************************************************** * SPI2 spiflash ****************************************************************************************/ /***************************************************************************************** * 函数名称: Spi2_Config * 功能描述: SPI2配置函数 * 参 数: 无 * 返 回 值: 无 *****************************************************************************************/ static void Spi2_Config(void) { stc_spi_init_t stcSpiInit; stc_port_init_t stcPortInit; MEM_ZERO_STRUCT(stcPortInit); stcPortInit.enPinOType = Pin_OType_Cmos; PORT_Init(SPI2_SCK_PORT, SPI2_SCK_PIN, &stcPortInit); PORT_Init(SPI2_MOSI_PORT, SPI2_MOSI_PIN, &stcPortInit); PORT_Init(SPI2_MISO_PORT, SPI2_MISO_PIN, &stcPortInit); //PORT_Init(SPI2_NSS_PORT, SPI2_NSS_PIN, &stcPortInit); stcPortInit.enPinMode = Pin_Mode_Out; stcPortInit.enPinOType = Pin_OType_Cmos; stcPortInit.enPinDrv = Pin_Drv_H; stcPortInit.enPullUp = Disable; PORT_Init(SPI2_NSS_PORT, SPI2_NSS_PIN, &stcPortInit); SPI2_NSS_SET(); /* configuration structure initialization */ MEM_ZERO_STRUCT(stcSpiInit); /* Configuration peripheral clock */ PWC_Fcg1PeriphClockCmd(SPI2_UNIT_CLOCK, Enable); /* Configuration SPI pin */ PORT_SetFunc(SPI2_SCK_PORT, SPI2_SCK_PIN, SPI2_SCK_FUNC, Disable); PORT_SetFunc(SPI2_MOSI_PORT, SPI2_MOSI_PIN, SPI2_MOSI_FUNC, Disable); PORT_SetFunc(SPI2_MISO_PORT, SPI2_MISO_PIN, SPI2_MISO_FUNC, Disable); //PORT_SetFunc(SPI2_NSS_PORT, SPI2_NSS_PIN, SPI2_NSS_FUNC, Disable); /* Configuration SPI structure */ stcSpiInit.enClkDiv = SpiClkDiv16; stcSpiInit.enFrameNumber = SpiFrameNumber1; stcSpiInit.enDataLength = SpiDataLengthBit8; stcSpiInit.enFirstBitPosition = SpiFirstBitPositionMSB; stcSpiInit.enSckPolarity = SpiSckIdleLevelHigh; stcSpiInit.enSckPhase = SpiSckOddChangeEvenSample; stcSpiInit.enReadBufferObject = SpiReadReceiverBuffer; stcSpiInit.enWorkMode = SpiWorkMode4Line; stcSpiInit.enTransMode = SpiTransFullDuplex; stcSpiInit.enCommAutoSuspendEn = Disable; stcSpiInit.enModeFaultErrorDetectEn = Disable; stcSpiInit.enParitySelfDetectEn = Disable; stcSpiInit.enParityEn = Disable; stcSpiInit.enParity = SpiParityEven; #ifdef SPI_MASTER_MODE stcSpiInit.enMasterSlaveMode = SpiModeMaster; stcSpiInit.stcDelayConfig.enSsSetupDelayOption = SpiSsSetupDelayCustomValue; stcSpiInit.stcDelayConfig.enSsSetupDelayTime = SpiSsSetupDelaySck1; stcSpiInit.stcDelayConfig.enSsHoldDelayOption = SpiSsHoldDelayCustomValue; stcSpiInit.stcDelayConfig.enSsHoldDelayTime = SpiSsHoldDelaySck1; stcSpiInit.stcDelayConfig.enSsIntervalTimeOption = SpiSsIntervalCustomValue; stcSpiInit.stcDelayConfig.enSsIntervalTime = SpiSsIntervalSck8PlusPck2; stcSpiInit.stcSsConfig.enSsValidBit = SpiSsValidChannel0; stcSpiInit.stcSsConfig.enSs0Polarity = SpiSsLowValid; #endif #ifdef SPI_SLAVE_MODE stcSpiInit.enMasterSlaveMode = SpiModeSlave; stcSpiInit.stcSsConfig.enSsValidBit = SpiSsValidChannel0; stcSpiInit.stcSsConfig.enSs0Polarity = SpiSsLowValid; #endif SPI_Init(SPI2_UNIT, &stcSpiInit); SPI_Cmd(SPI2_UNIT, Enable); } /***************************************************************************************** * 函数名称: Spi2SendReceive * 功能描述: SPI2发送接收函数 * 参 数: sData 发送的数据入库哦 * 返 回 值: 接收到的数据 *****************************************************************************************/ uint16_t Spi2SendReceive(uint16_t sData) { uint16_t retry = 0; uint16_t rData; /* Wait tx buffer empty */ while (Reset == SPI_GetFlag(SPI2_UNIT, SpiFlagSendBufferEmpty)) { retry++; if(retry > 0x4000) return 0; } /* Send data */ SPI_SendData8(SPI2_UNIT, sData); /* Wait rx buffer full */ retry = 0; while (Reset == SPI_GetFlag(SPI2_UNIT, SpiFlagReceiveBufferFull)) { retry++; if(retry > 0x4000) return 0; } /* Receive data */ rData = SPI_ReceiveData8(SPI2_UNIT); return rData; } /***************************************************************************************** * 函数名称: Rtc_Config * 功能描述: RTC配置 * 参 数: 无 * 返 回 值: 无 *****************************************************************************************/ static void Rtc_Config(void) { stc_rtc_init_t stcRtcInit; stc_irq_regi_conf_t stcIrqRegiConf; /* configuration structure initialization */ MEM_ZERO_STRUCT(stcRtcInit); MEM_ZERO_STRUCT(stcIrqRegiConf); /* Reset rtc counter */ if (RTC_DeInit() == ErrorTimeout) { //DBG_LOG("Reset RTC Failed!\r\n"); } else { /* Configuration rtc structure */ stcRtcInit.enClkSource = RtcClkXtal32; stcRtcInit.enPeriodInt = RtcPeriodIntInvalid; stcRtcInit.enTimeFormat = RtcTimeFormat24Hour; stcRtcInit.enCompenWay = RtcOutputCompenDistributed; stcRtcInit.enCompenEn = Disable; stcRtcInit.u16CompenVal = 0u; RTC_Init(&stcRtcInit); // /* Configure interrupt of rtc period */ // stcIrqRegiConf.enIntSrc = INT_RTC_PRD; // stcIrqRegiConf.enIRQn = RTC_IRQn; // stcIrqRegiConf.pfnCallback = &RtcPeriod_IrqCallback; // enIrqRegistration(&stcIrqRegiConf); // NVIC_ClearPendingIRQ(stcIrqRegiConf.enIRQn); // NVIC_SetPriority(stcIrqRegiConf.enIRQn, DDL_IRQ_PRIORITY_DEFAULT); // NVIC_EnableIRQ(stcIrqRegiConf.enIRQn); // enIntWakeupEnable(RtcPeriodWU); // /* Enable period interrupt */ // RTC_IrqCmd(RtcIrqPeriod, Enable); /* Startup rtc count */ RTC_Cmd(Enable); } } /***************************************************************************************** * 函数名称: AdcInitConfig * 功能描述: ADC初始化配置 * 参 数: 无 * 返 回 值: 无 *****************************************************************************************/ static void AdcInitConfig(void) { stc_adc_init_t stcAdcInit; MEM_ZERO_STRUCT(stcAdcInit); stcAdcInit.enResolution = AdcResolution_12Bit; stcAdcInit.enDataAlign = AdcDataAlign_Right; stcAdcInit.enAutoClear = AdcClren_Enable; stcAdcInit.enScanMode = AdcMode_SAOnce; stcAdcInit.enRschsel = AdcRschsel_Restart; /* 1. Enable ADC1. */ PWC_Fcg3PeriphClockCmd(PWC_FCG3_PERIPH_ADC1, Enable); /* 2. Initialize ADC1. */ ADC_Init(M4_ADC1, &stcAdcInit); } /***************************************************************************************** * 函数名称: AdcSetChannelPinMode * 功能描述: ADC通道引脚配置 * 参 数: 无 * 返 回 值: 无 *****************************************************************************************/ static void AdcSetChannelPinMode(uint32_t u32Channel) { en_port_t enPort; en_pin_t enPin; stc_port_init_t stcPortInit; MEM_ZERO_STRUCT(stcPortInit); stcPortInit.enPinMode = Pin_Mode_Ana; stcPortInit.enPullUp = Disable; switch (u32Channel) { case ADC1_CH0: enPort = PortA; enPin = Pin00; break; case ADC1_CH1: enPort = PortA; enPin = Pin01; break; case ADC1_CH2: enPort = PortA; enPin = Pin02; break; case ADC1_CH3: enPort = PortA; enPin = Pin03; break; case ADC1_CH4: enPort = PortA; enPin = Pin04; break; case ADC1_CH5: enPort = PortA; enPin = Pin05; break; case ADC1_CH6: enPort = PortA; enPin = Pin06; break; case ADC1_CH7: enPort = PortA; enPin = Pin07; break; case ADC1_CH8: enPort = PortB; enPin = Pin00; break; case ADC1_CH9: enPort = PortB; enPin = Pin01; break; case ADC1_CH10: enPort = PortC; enPin = Pin00; break; case ADC1_CH11: enPort = PortC; enPin = Pin01; break; case ADC1_CH12: enPort = PortC; enPin = Pin02; break; case ADC1_CH13: enPort = PortC; enPin = Pin03; break; case ADC1_CH14: enPort = PortC; enPin = Pin04; break; case ADC1_CH15: enPort = PortC; enPin = Pin05; break; default: return; } PORT_Init(enPort, enPin, &stcPortInit); } /***************************************************************************************** * 函数名称: AdcChannelConfig * 功能描述: ADC通道配置 * 参 数: 无 * 返 回 值: 无 *****************************************************************************************/ static void AdcChannelConfig(void) { stc_adc_ch_cfg_t stcChCfg; uint8_t au8Adc1SaSampTime[1] = {255}; MEM_ZERO_STRUCT(stcChCfg); stcChCfg.u32Channel = BAT_COLL_ADC_CH; stcChCfg.u8Sequence = ADC_SEQ_A; stcChCfg.pu8SampTime = au8Adc1SaSampTime; AdcSetChannelPinMode(BAT_COLL_ADC_CH); /* 2. Add ADC channel. */ ADC_AddAdcChannel(M4_ADC1, &stcChCfg); /* 3. Configure the average channel if you need. */ ADC_ConfigAvg(M4_ADC1, AdcAvcnt_256); //平均通道配置,多次采样后输出平均值 /* 4. Add average channel if you need. */ ADC_AddAvgChannel(M4_ADC1, BAT_COLL_ADC_CH); } /***************************************************************************************** * 函数名称: Adc1_Config * 功能描述: ADC1配置 * 参 数: 无 * 返 回 值: 无 *****************************************************************************************/ static void Adc1_Config(void) { CLK_SetPeriClkSource(ClkPeriSrcPclk); AdcInitConfig(); AdcChannelConfig(); } /***************************************************************************************** * 函数名称: AdcDmaConfig * 功能描述: ADC DMA配置 * 参 数: 无 * 返 回 值: 无 *****************************************************************************************/ static void AdcDmaConfig(void) { stc_dma_config_t stcDmaCfg; MEM_ZERO_STRUCT(stcDmaCfg); stcDmaCfg.u16BlockSize = 1; stcDmaCfg.u16TransferCnt = 0u; stcDmaCfg.u32SrcAddr = (uint32_t)(&M4_ADC1->DR1); stcDmaCfg.u32DesAddr = (uint32_t)(&m_au16Adc1SaValue); stcDmaCfg.u16DesRptSize = 1; stcDmaCfg.u16SrcRptSize = 1; stcDmaCfg.u32DmaLlp = 0u; stcDmaCfg.stcSrcNseqCfg.u16Cnt = 0u; stcDmaCfg.stcSrcNseqCfg.u32Offset = 0u; stcDmaCfg.stcDesNseqCfg.u16Cnt = 0u; stcDmaCfg.stcDesNseqCfg.u32Offset = 0u; stcDmaCfg.stcDmaChCfg.enSrcInc = AddressIncrease; stcDmaCfg.stcDmaChCfg.enDesInc = AddressIncrease; stcDmaCfg.stcDmaChCfg.enSrcRptEn = Enable; stcDmaCfg.stcDmaChCfg.enDesRptEn = Enable; stcDmaCfg.stcDmaChCfg.enSrcNseqEn = Disable; stcDmaCfg.stcDmaChCfg.enDesNseqEn = Disable; stcDmaCfg.stcDmaChCfg.enTrnWidth = Dma16Bit; stcDmaCfg.stcDmaChCfg.enLlpEn = Disable; /* Enable DMA interrupt. */ stcDmaCfg.stcDmaChCfg.enIntEn = Enable; PWC_Fcg0PeriphClockCmd(PWC_FCG0_PERIPH_DMA1, Enable); DMA_InitChannel(M4_DMA1, DmaCh0, &stcDmaCfg); DMA_Cmd(M4_DMA1, Enable); DMA_ChannelCmd(M4_DMA1, DmaCh0, Enable); DMA_ClearIrqFlag(M4_DMA1, DmaCh0, TrnCpltIrq); /* AOS must be enabled to use DMA */ /* AOS enabled at first. */ /* If you have enabled AOS before, then the following statement is not needed. */ PWC_Fcg0PeriphClockCmd(PWC_FCG0_PERIPH_AOS, Enable); DMA_SetTriggerSrc(M4_DMA1, DmaCh0, EVT_ADC1_EOCA); } /***************************************************************************************** * 函数名称: DmaIrqRegister * 功能描述: DMA中断寄存器配置 * 参 数: pstcCfg, 中断参数 u32Priority, 中断优先级 * 返 回 值: 无 *****************************************************************************************/ static void DmaIrqRegister(stc_irq_regi_conf_t *pstcCfg, uint32_t u32Priority) { int16_t s16Vnum = pstcCfg->enIRQn; if (((s16Vnum >= Int000_IRQn) && (s16Vnum <= Int031_IRQn)) || ((s16Vnum >= Int038_IRQn) && (s16Vnum <= Int043_IRQn))) { if (Ok != enIrqRegistration(pstcCfg)) return; } else if (Int129_IRQn == s16Vnum) enShareIrqEnable(pstcCfg->enIntSrc); else return; NVIC_ClearPendingIRQ(pstcCfg->enIRQn); NVIC_SetPriority(pstcCfg->enIRQn, u32Priority); NVIC_EnableIRQ(pstcCfg->enIRQn); } /***************************************************************************************** * 函数名称: DmaIrqRegister * 功能描述: DMA中断配置 * 参 数: 无 * 返 回 值: 无 *****************************************************************************************/ static void DmaIrqConfig(void) { stc_irq_regi_conf_t stcAdcIrqCfg; stcAdcIrqCfg.enIntSrc = INT_DMA1_BTC0; stcAdcIrqCfg.enIRQn = Int030_IRQn; stcAdcIrqCfg.pfnCallback = Dma1Btc0_IrqHandler; DmaIrqRegister(&stcAdcIrqCfg, DDL_IRQ_PRIORITY_03); } /***************************************************************************************** * 函数名称: DmaIrqRegister * 功能描述: DMA配置 * 参 数: 无 * 返 回 值: 无 *****************************************************************************************/ static void Dma_Config(void) { AdcDmaConfig(); DmaIrqConfig(); } /***************************************************************************************** * 函数名称: ReadAdcValue * 功能描述: 读取AD值 * 参 数: 无 * 返 回 值: AD值 *****************************************************************************************/ uint16_t GetADCBuffPoint(void) { return m_au16Adc1SaValue; } /***************************************************************************************** * 函数名称: ADC_Start * 功能描述: 启动ADC转换 * 参 数: 无 * 返 回 值: AD值 *****************************************************************************************/ void ADC_Start(void) { ADC_StartConvert(M4_ADC1); } //void ReadAdcValue(uint16_t *ADValue) //{ // ADC_PollingSa(M4_ADC1, ADValue, 1, 100); //} /***************************************************************************************** * 函数名称: TimeGet * 功能描述: 获取系统时间 * 参 数: tm 读取时间入口 * 返 回 值: 无 *****************************************************************************************/ void TimeGet(struct tm *cTime) { stc_rtc_date_time_t RtcDateTime; RTC_GetDateTime(RtcDataFormatDec, &RtcDateTime); cTime->tm_year = RtcDateTime.u8Year + 100; cTime->tm_mon = RtcDateTime.u8Month - 1; cTime->tm_mday = RtcDateTime.u8Day; cTime->tm_hour = RtcDateTime.u8Hour; cTime->tm_min = RtcDateTime.u8Minute; cTime->tm_sec = RtcDateTime.u8Second; cTime->tm_isdst = 0; } /***************************************************************************************** * 函数名称: TimeTs * 功能描述: 系统时间转换时间戳 * 参 数: 无 * 返 回 值: 返回时间戳 *****************************************************************************************/ int TimeTs(void) { struct tm cTime; TimeGet(&cTime); time_t cTimet = mktime(&cTime); return cTimet; } /***************************************************************************************** * 函数名称: TimeShow * 功能描述: 将时间输出到DBG串口 * 参 数: 无 * 返 回 值: 无 *****************************************************************************************/ void TimeShow(uint32_t dwStamp) { struct tm *stime; stime = localtime(&dwStamp); rt_kprintf("%d/",stime->tm_year + 1900); rt_kprintf("%d/",stime->tm_mon + 1); rt_kprintf("%d-",stime->tm_mday); rt_kprintf("%d:",stime->tm_hour); rt_kprintf("%d:",stime->tm_min); rt_kprintf("%d\r\n",stime->tm_sec); } /***************************************************************************************** * 函数名称: TimeSync * 功能描述: 通过时间戳同步 * 参 数: ts 时间入口 * 返 回 值: 无 *****************************************************************************************/ void TimeSync(time_t ts) { struct tm *td; stc_rtc_date_time_t RtcDateTime; td = localtime(&ts); RtcDateTime.u8Year = td->tm_year - 100; RtcDateTime.u8Month = td->tm_mon + 1; RtcDateTime.u8Day = td->tm_mday; RtcDateTime.u8Weekday = td->tm_wday; RtcDateTime.u8Hour = td->tm_hour; RtcDateTime.u8Minute = td->tm_min; RtcDateTime.u8Second = td->tm_sec; RTC_SetDateTime(RtcDataFormatDec, &RtcDateTime, Enable, Enable); } /***************************************************************************************** * 函数名称: TimeSync2 * 功能描述: 通过年月日同步 * 参 数: Year 年 Month 月 Day 日 Hour 时 Min 分 Sec 秒 * 返 回 值: 无 *****************************************************************************************/ void TimeSync2(uint8_t Year, uint8_t Month, uint8_t Day, uint8_t Hour, uint8_t Min, uint8_t Sec) { stc_rtc_date_time_t RtcDateTime; if(Year > 99 || Month < 1 || Month > 12 || Day < 1 || Day > 31 || Hour > 23 || Min > 59 || Sec > 59) return; RtcDateTime.u8Year = Year; RtcDateTime.u8Month = Month; RtcDateTime.u8Day = Day; RtcDateTime.u8Hour = Hour; RtcDateTime.u8Minute = Min; RtcDateTime.u8Second = Sec; RTC_SetDateTime(RtcDataFormatDec, &RtcDateTime, Enable, Enable); } void FlashWrite(uint32_t Addr, uint32_t *wData, uint8_t wLen) { // while(Ok != Flash_SectorErase(BOOT_PARA_ADDRESS)); // for(int i = 0; i < wLen / 4; i++) { // Flash_WriteWord(BOOT_PARA_ADDRESS + i * 4, wData[i]); // } EFM_Unlock(); /* Enable flash. */ EFM_FlashCmd(Enable); /* Wait flash ready. */ while(Set != EFM_GetFlagStatus(EFM_FLAG_RDY)) { ; } /* Sequence program. */ //EFM_SequenceProgram(FLASH_WRITE_ADDR, wLen, wData); for(int i = 0; i < wLen; i++) { EFM_SingleProgram(Addr + i * 4, wData[i]); } EFM_Lock(); } void FlashRead(uint32_t Addr,uint32_t *rData, uint8_t rLen) { for(int i = 0; i < rLen / 4; i++) { rData[i] = *((volatile uint32_t*)(Addr + i * 4)); } } void dev_boot_read_param(boot_para_t *pParam) { FlashRead(FLASH_BINFO_BASE,(uint8_t *)pParam,sizeof(boot_para_t)); } int dev_boot_write_param(boot_para_t Param) { int wLen; uint32_t *pData; pData= (uint32_t *)&Param; wLen = sizeof(boot_para_t)/4; EFM_Unlock(); /* Enable flash. */ EFM_FlashCmd(Enable); /* Wait flash ready. */ while(Set != EFM_GetFlagStatus(EFM_FLAG_RDY)) { ; } /* Erase sector. */ EFM_SectorErase(FLASH_BINFO_BASE); for(int i = 0; i < wLen; i++) { EFM_SingleProgram(FLASH_BINFO_BASE + i * 4, pData[i]); } /* Lock EFM. */ EFM_Lock(); } /***************************************************************************************** * 函数名称: EnterStop * 功能描述: 进入低功耗状态 * 参 数: SleepStatus 设备低功耗状态 * 返 回 值: 无 *****************************************************************************************/ //void EnterStop(void) //{ // stc_pwc_stop_mode_cfg_t stcPwcStopCfg; // stc_port_init_t stcPortInit; // uint16_t AnaPin; // // PWC_Fcg1PeriphClockCmd(SPI_UNIT_CLOCK, Disable); // PWC_Fcg1PeriphClockCmd(DBG_FCG1_PERIPH, Disable); // DBGRxWakeupInit(); // // MEM_ZERO_STRUCT(stcPortInit); // stcPortInit.enPinMode = Pin_Mode_Ana; // AnaPin = PinAll & (~(Pin13|Pin14)); // PORT_Init(PortA, AnaPin, &stcPortInit); // // AnaPin = PinAll & (~Pin02); // PORT_Init(PortB, AnaPin, &stcPortInit); // // AnaPin = PinAll & (~(Pin03)); // PORT_Init(PortC, AnaPin, &stcPortInit); // // AnaPin = Pin02; // PORT_Init(PortH, AnaPin, &stcPortInit); // // SysTick_Suspend(); // // stcPwcStopCfg.enStpDrvAbi = StopUlowspeed; // stcPwcStopCfg.enStopClk = ClkFix; // stcPwcStopCfg.enStopFlash = Wait; // stcPwcStopCfg.enPll = Enable; // // while(Ok != PWC_StopModeCfg(&stcPwcStopCfg)){;} // while(1ul != M4_EFM->FSR_f.RDY){;} // PWC_EnterStopMd(); //} /***************************************************************************************** * 函数名称: Wakeup * 功能描述: 设备唤醒 * 参 数: 无 * 返 回 值: 无 *****************************************************************************************/ //void Wakeup(void) //{ // NVIC_DisableIRQ(DBG_RXPIN_IRQn); // PWC_ClkRecover(); // //SystemClockConfig(); // Spi_Config(); // DbgUart_Config(500000); // //GPIO_Config(); // //SysTick_Resume(); // SysTick_Init(1000); //} void Error_Handler(void) { while(1){ ; } } /***************************************************************************************** * Watch Dog ****************************************************************************************/ /***************************************************************************************** * 函数名称: FeedDog * 功能描述: 看门狗喂狗函数 * 参 数: 无 * 返 回 值: 无 *****************************************************************************************/ void FeedDog(void) { #if (WATCH_DOG == 1) SWDT_RefreshCounter(); #endif } void DelaymS(int Dly) { int j; for(int i = 0; i < Dly; i++){ j = 350; while(j > 0) j--; } } void BSP_Init(void) { stc_clk_freq_t Freq; GPIO_Config(); POWER_LED_ON(); LORA_POW_OFF(); CAT1_RESET_CLR(); ETH_RESET_CLR(); FeedDog(); for(int i = 0; i < 6; i++) { DelaymS(6000); FeedDog(); } POWER_LED_OFF(); SystemClockConfig(); Xtal32_ClockConfig(); DbgUart_Config(500000); EthOrCat1_Config(115200); // RS485Ch1_Config(9600); // RS485Ch2_Config(9600); #if USE_SD_CARD SdioInit(); #endif Rtc_Config(); Spi1_Config(); Spi2_Config(); Adc1_Config(); Dma_Config(); FeedDog(); ADC_Start(); CLK_GetClockFreq(&Freq); SysTick_Init(1000); FeedDog(); //DBG_LOG("SysFreq = %d\r\n", Freq.sysclkFreq); } /***************************************************************************************** * User Irq CallBack ****************************************************************************************/ /***************************************************************************************** * 函数名称: LoraTxRxIrqCallback * 功能描述: LORA收发中断外部重定向回调函数 * 参 数: 无 * 返 回 值: 无 *****************************************************************************************/ __weak void LoraTxRxIrqCallback(void) { } /***************************************************************************************** * 函数名称: DbgRxIrqCallback * 功能描述: 调试串口接收中断外部重定向回调函数 * 参 数: 无 * 返 回 值: 无 *****************************************************************************************/ __weak void DbgRxIrqCallback(uint8_t rData) { } /***************************************************************************************** * 函数名称: RS485Ch1RxIrqCallback * 功能描述: RS485通道1串口接收中断外部重定向回调函数 * 参 数: 无 * 返 回 值: 无 *****************************************************************************************/ __weak void RS485Ch1RxIrqCallback(uint8_t rData) { } /***************************************************************************************** * 函数名称: RS485Ch2RxIrqCallback * 功能描述: RS485通道1串口接收中断外部重定向回调函数 * 参 数: 无 * 返 回 值: 无 *****************************************************************************************/ __weak void RS485Ch2RxIrqCallback(uint8_t rData) { } /***************************************************************************************** * 函数名称: EthOrCat1RxIrqCallback * 功能描述: Eth和Cat1串口接收中断外部重定向回调函数 * 参 数: 无 * 返 回 值: 无 *****************************************************************************************/ __weak void EthOrCat1RxIrqCallback(uint8_t rData) { } /***************************************************************************************** * 函数名称: RtcPeriod_IrqCallback * 功能描述: RTC中断回调 * 参 数: 无 * 返 回 值: 无 *****************************************************************************************/ //__weak void RtcPeriod_IrqCallback(void) //{ //} /***************************************************************************************** * 函数名称: Dma1Btc0_IrqHandler * 功能描述: DMA中断外部重定向回调函数 * 参 数: 无 * 返 回 值: 无 *****************************************************************************************/ __weak void Dma1Btc0_IrqHandler(void) { DMA_ClearIrqFlag(M4_DMA1, DmaCh0, BlkTrnCpltIrq); ADC_Start(); }