BootLoader重构: 适配HC32F460KETA并按传感器通用串口升级协议V1.1改造
主要修改事项: 1. 器件更换: HC32F460PETB改为HC32F460KETA, 更新MDK工程(uvprojx/uvoptx/RTE), 调试器切换为Segger J-Link 2. 新增自定义分散加载文件MDK/BootLoader_custom.sct 3. 新增传感器通用串口升级协议V1.1.xlsx(协议文档) 4. 时钟系统: 取消外部晶振, 改用内部HRC 16MHz -> MPLL 200MHz 5. 删除未使用模块: FatFS/SDCard/SHT20/SX127x(Lora)/AD7924/spiflash/ADS1231/Encryption及LoraTask/CatOneTask/RS485Task/DebugCmd/AppTask, 清理工程IncludePath 6. bsp: BootPara_t参数结构体与GateWay APP对齐(新增GwMac/SvrAddr/SvrPort/LoraFreq/通道配置), 新增RS485 Ch1(USART2)升级通道及RS485 Ch2(USART3)配置, GPIO仅保留RS485方向控制(PC7/PB13) 7. main: 设备MAC固定地址由0x2800改为0x4000并按宏构造(VerInfo/PrjNum/GwNum), 帧头由0x7a改为0x7D并带DevMac字段, 增加MAC匹配(支持0xFF广播), 升级命令更新(0x01 ACK/0x02请求数据/0x81请求/0x82下发), CRC32校验后写参数并复位 8. 跳转APP前关闭全局中断/停SysTick/禁用NVIC中断, 避免残留中断干扰APP 9. Flash擦除仅擦APP区(不擦参数区), 首次运行检测及旧参数区默认值补齐 10. 修复驱动头文件乱码注释(hc32f460_dcu.h/hc32f460_icg.h)
This commit is contained in:
+244
-176
@@ -1,26 +1,16 @@
|
||||
#include <stdlib.h>
|
||||
#include "bsp.h"
|
||||
#include "ff.h"
|
||||
|
||||
/*****************************************************************************************
|
||||
* System Clock
|
||||
* System Clock - HRC 16MHz -> MPLL 200MHz (不用外部晶振)
|
||||
****************************************************************************************/
|
||||
|
||||
/*****************************************************************************************
|
||||
* 函数名称: 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);
|
||||
|
||||
@@ -34,17 +24,6 @@ static void SystemClockConfig(void)
|
||||
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;
|
||||
@@ -56,13 +35,16 @@ static void SystemClockConfig(void)
|
||||
EFM_SetLatency(EFM_LATENCY_5);
|
||||
EFM_Lock();
|
||||
|
||||
/* MPLL config (XTAL / pllmDiv * plln / PllpDiv = 200M). */
|
||||
stcMpllCfg.pllmDiv = 1ul;
|
||||
/* Config HRC and enable HRC */
|
||||
CLK_HrcCmd(Enable);
|
||||
|
||||
/* MPLL config (HRC / pllmDiv * plln / PllpDiv = 16/2*50/2 = 200M). */
|
||||
stcMpllCfg.pllmDiv = 2ul;
|
||||
stcMpllCfg.plln = 50ul;
|
||||
stcMpllCfg.PllpDiv = 2ul;
|
||||
stcMpllCfg.PllqDiv = 2ul;
|
||||
stcMpllCfg.PllrDiv = 2ul;
|
||||
CLK_SetPllSource(ClkPllSrcXTAL);
|
||||
CLK_SetPllSource(ClkPllSrcHRC);
|
||||
CLK_MpllConfig(&stcMpllCfg);
|
||||
|
||||
/* Enable MPLL. */
|
||||
@@ -76,64 +58,36 @@ static void SystemClockConfig(void)
|
||||
PWC_HS2HP();
|
||||
/* Switch system clock source to MPLL. */
|
||||
CLK_SetSysClkSource(CLKSysSrcMPLL);
|
||||
SystemCoreClockUpdate();
|
||||
}
|
||||
|
||||
|
||||
/*****************************************************************************************
|
||||
* Debug Uart
|
||||
* Debug Uart (USART1)
|
||||
****************************************************************************************/
|
||||
|
||||
/*****************************************************************************************
|
||||
* 函数名称: 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)
|
||||
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;
|
||||
@@ -142,11 +96,10 @@ void DbgUart_Config(uint32_t BaudRate)
|
||||
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;
|
||||
@@ -156,12 +109,12 @@ void DbgUart_Config(uint32_t BaudRate)
|
||||
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();
|
||||
@@ -170,56 +123,28 @@ void DbgUart_Config(uint32_t BaudRate)
|
||||
if(enRet != Ok) {
|
||||
Error_Handler();
|
||||
}
|
||||
|
||||
|
||||
stcIrqRegiCfg.enIRQn = DBGUART_IRQn;
|
||||
stcIrqRegiCfg.pfnCallback = &DbgUsartRxIrqCallback;
|
||||
stcIrqRegiCfg.pfnCallback = &DBGUsartRxIrqCallback;
|
||||
stcIrqRegiCfg.enIntSrc = DBG_USART_RI_NUM;
|
||||
enIrqRegistration(&stcIrqRegiCfg);
|
||||
NVIC_SetPriority(stcIrqRegiCfg.enIRQn, DDL_IRQ_PRIORITY_DEFAULT);
|
||||
NVIC_SetPriority(stcIrqRegiCfg.enIRQn, 2);
|
||||
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_SetPriority(stcIrqRegiCfg.enIRQn, 2);
|
||||
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++) {
|
||||
@@ -229,45 +154,223 @@ void DebugUartSend(uint8_t *sData, uint16_t sLen)
|
||||
}
|
||||
|
||||
/*****************************************************************************************
|
||||
* 函数名称: GPIO_Config
|
||||
* 功能描述: GPIO配置函数
|
||||
* 参 数: 无
|
||||
* 返 回 值: 无
|
||||
*****************************************************************************************/
|
||||
* RS485 Ch1 (USART2) - 升级通道, 按GateWay APP配置方式
|
||||
****************************************************************************************/
|
||||
static uint8_t RS485Ch1UartRec(void)
|
||||
{
|
||||
uint16_t u16Data = USART_RecData(RS485_CH1_USART_CH);
|
||||
return (uint8_t)u16Data;
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
static void RS485Ch1UsartRxIrqCallback(void)
|
||||
{
|
||||
uint8_t rData = RS485Ch1UartRec();
|
||||
RS485Ch1RxIrqCallback(rData);
|
||||
}
|
||||
|
||||
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, 2);
|
||||
NVIC_ClearPendingIRQ(stcIrqRegiCfg.enIRQn);
|
||||
NVIC_EnableIRQ(stcIrqRegiCfg.enIRQn);
|
||||
|
||||
stcIrqRegiCfg.enIRQn = RS485CH1_UART_EI_IRQn;
|
||||
stcIrqRegiCfg.pfnCallback = &RS485Ch1UsartErrIrqCallback;
|
||||
stcIrqRegiCfg.enIntSrc = RS485_CH1_USART_EI_NUM;
|
||||
enIrqRegistration(&stcIrqRegiCfg);
|
||||
NVIC_SetPriority(stcIrqRegiCfg.enIRQn, 2);
|
||||
NVIC_ClearPendingIRQ(stcIrqRegiCfg.enIRQn);
|
||||
NVIC_EnableIRQ(stcIrqRegiCfg.enIRQn);
|
||||
|
||||
USART_FuncCmd(RS485_CH1_USART_CH, UsartTx, Enable);
|
||||
USART_FuncCmd(RS485_CH1_USART_CH, UsartRx, Enable);
|
||||
USART_FuncCmd(RS485_CH1_USART_CH, UsartRxInt, Enable);
|
||||
}
|
||||
|
||||
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();
|
||||
}
|
||||
|
||||
/*****************************************************************************************
|
||||
* RS485 Ch2 (USART3)
|
||||
****************************************************************************************/
|
||||
static uint8_t RS485Ch2UartRec(void)
|
||||
{
|
||||
uint16_t u16Data = USART_RecData(RS485_CH2_USART_CH);
|
||||
return (uint8_t)u16Data;
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
static void RS485Ch2UsartRxIrqCallback(void)
|
||||
{
|
||||
uint8_t rData = RS485Ch2UartRec();
|
||||
RS485Ch2RxIrqCallback(rData);
|
||||
}
|
||||
|
||||
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, 2);
|
||||
NVIC_ClearPendingIRQ(stcIrqRegiCfg.enIRQn);
|
||||
NVIC_EnableIRQ(stcIrqRegiCfg.enIRQn);
|
||||
|
||||
stcIrqRegiCfg.enIRQn = RS485CH2_UART_EI_IRQn;
|
||||
stcIrqRegiCfg.pfnCallback = &RS485Ch2UsartErrIrqCallback;
|
||||
stcIrqRegiCfg.enIntSrc = RS485_CH2_USART_EI_NUM;
|
||||
enIrqRegistration(&stcIrqRegiCfg);
|
||||
NVIC_SetPriority(stcIrqRegiCfg.enIRQn, 2);
|
||||
NVIC_ClearPendingIRQ(stcIrqRegiCfg.enIRQn);
|
||||
NVIC_EnableIRQ(stcIrqRegiCfg.enIRQn);
|
||||
|
||||
USART_FuncCmd(RS485_CH2_USART_CH, UsartTx, Enable);
|
||||
USART_FuncCmd(RS485_CH2_USART_CH, UsartRx, Enable);
|
||||
USART_FuncCmd(RS485_CH2_USART_CH, UsartRxInt, Enable);
|
||||
}
|
||||
|
||||
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();
|
||||
}
|
||||
|
||||
/*****************************************************************************************
|
||||
* GPIO - RS485收发控制引脚 (PC7=Ch1方向, PB13=Ch2方向), PC10供电不动
|
||||
****************************************************************************************/
|
||||
static void GPIO_Config(void)
|
||||
{
|
||||
stc_port_init_t stcPortInit;
|
||||
stc_port_pub_set_t stcPortPub;
|
||||
|
||||
|
||||
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(KEY_LED_PORT, KEY_LED_PIN, &stcPortInit);
|
||||
PORT_ResetBits(KEY_LED_PORT, KEY_LED_PIN);
|
||||
|
||||
PORT_Init(BAT_LED_R_PORT, BAT_LED_R_PIN, &stcPortInit);
|
||||
PORT_ResetBits(BAT_LED_R_PORT, BAT_LED_R_PIN);
|
||||
|
||||
PORT_Init(BAT_LED_G_PORT, BAT_LED_G_PIN, &stcPortInit);
|
||||
PORT_ResetBits(BAT_LED_G_PORT, BAT_LED_G_PIN);
|
||||
|
||||
PORT_Init(STATE_LED_R_PORT, STATE_LED_R_PIN, &stcPortInit);
|
||||
PORT_ResetBits(STATE_LED_R_PORT, STATE_LED_R_PIN);
|
||||
|
||||
PORT_Init(STATE_LED_G_PORT, STATE_LED_G_PIN, &stcPortInit);
|
||||
PORT_ResetBits(STATE_LED_G_PORT, STATE_LED_G_PIN);
|
||||
|
||||
/* RS485 Ch1 方向控制 PC7: 高=发送, 低=接收 */
|
||||
PORT_Init(RS485_CH1_CTRL_PORT, RS485_CH1_CTRL_PIN, &stcPortInit);
|
||||
RS485_CH1_RX();
|
||||
|
||||
/* RS485 Ch2 方向控制 PB13 */
|
||||
PORT_Init(RS485_CH2_CTRL_PORT, RS485_CH2_CTRL_PIN, &stcPortInit);
|
||||
RS485_CH2_RX();
|
||||
}
|
||||
|
||||
void Error_Handler(void)
|
||||
@@ -276,58 +379,44 @@ void Error_Handler(void)
|
||||
}
|
||||
|
||||
/*****************************************************************************************
|
||||
* Watch Dog
|
||||
* Watch Dog - HC32F460 SWDT由ICG硬件启动, 周期喂狗
|
||||
****************************************************************************************/
|
||||
|
||||
/*****************************************************************************************
|
||||
* 函数名称: FeedDog
|
||||
* 功能描述: 看门狗喂狗函数
|
||||
* 参 数: 无
|
||||
* 返 回 值: 无
|
||||
*****************************************************************************************/
|
||||
void FeedDog(void)
|
||||
{
|
||||
#if (WATCH_DOG == 1)
|
||||
#if (WATCH_DOG == 1)
|
||||
SWDT_RefreshCounter();
|
||||
#endif
|
||||
#endif
|
||||
}
|
||||
|
||||
void BSP_Init(void)
|
||||
{
|
||||
SystemClockConfig();
|
||||
GPIO_Config();
|
||||
DbgUart_Config(500000);
|
||||
RS485Ch1_Config(500000);
|
||||
|
||||
FeedDog();
|
||||
SysTick_Init(1000);
|
||||
FeedDog();
|
||||
}
|
||||
|
||||
/*****************************************************************************************
|
||||
* Flash操作
|
||||
****************************************************************************************/
|
||||
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]);
|
||||
if(EFM_SingleProgram(Addr + i * 4, wData[i]) != Ok) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
EFM_Lock();
|
||||
}
|
||||
|
||||
static void FlashRead(uint32_t *rData, uint8_t rLen)
|
||||
static void FlashRead(uint32_t u32Addr, uint32_t *rData, uint8_t rLen)
|
||||
{
|
||||
uint32_t u32Addr = BOOT_PARA_ADDRESS;
|
||||
for(int i = 0; i < rLen / 4; i++) {
|
||||
rData[i] = *((volatile uint32_t*)(u32Addr + i * 4));
|
||||
}
|
||||
@@ -335,30 +424,28 @@ static void FlashRead(uint32_t *rData, uint8_t rLen)
|
||||
|
||||
void ReadBootPara(BootPara rData)
|
||||
{
|
||||
FlashRead((uint32_t *)rData, sizeof(BootPara_t));
|
||||
FlashRead(BOOT_PARA_ADDRESS, (uint32_t *)rData, sizeof(BootPara_t));
|
||||
}
|
||||
|
||||
void WriteBootPara(BootPara wData)
|
||||
{
|
||||
int wLen;
|
||||
uint32_t *Data;
|
||||
|
||||
|
||||
Data = (uint32_t *)wData;
|
||||
wLen = sizeof(BootPara_t) / 4;
|
||||
EFM_Unlock();
|
||||
|
||||
/* Enable flash. */
|
||||
EFM_FlashCmd(Enable);
|
||||
/* Wait flash ready. */
|
||||
while(Set != EFM_GetFlagStatus(EFM_FLAG_RDY)) { ; }
|
||||
|
||||
/* Erase sector. */
|
||||
EFM_SectorErase(BOOT_PARA_ADDRESS);
|
||||
|
||||
|
||||
for(int i = 0; i < wLen; i++) {
|
||||
EFM_SingleProgram(BOOT_PARA_ADDRESS + i * 4, Data[i]);
|
||||
if(EFM_SingleProgram(BOOT_PARA_ADDRESS + i * 4, Data[i]) != Ok) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
/* Lock EFM. */
|
||||
EFM_Lock();
|
||||
}
|
||||
|
||||
@@ -367,47 +454,28 @@ void EraseFlash(void)
|
||||
EFM_Unlock();
|
||||
EFM_FlashCmd(Enable);
|
||||
while(Set != EFM_GetFlagStatus(EFM_FLAG_RDY)) { ; }
|
||||
|
||||
for(int Addr = APP_ADDRESS; Addr < FLASH_SIZE; Addr += FLASH_SECTOR_SIZE) {
|
||||
|
||||
/* 只擦APP区, 不擦参数区(BOOT_PARA_ADDRESS) */
|
||||
for(int Addr = APP_ADDRESS; Addr < BOOT_PARA_ADDRESS; Addr += FLASH_SECTOR_SIZE) {
|
||||
EFM_SectorErase(Addr);
|
||||
FeedDog();
|
||||
}
|
||||
EFM_Lock();
|
||||
}
|
||||
|
||||
/*****************************************************************************************
|
||||
* User Irq CallBack
|
||||
* User Irq CallBack (weak)
|
||||
****************************************************************************************/
|
||||
|
||||
|
||||
/*****************************************************************************************
|
||||
* 函数名称: 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)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user