Compare commits
20 Commits
master
...
Expansion_
| Author | SHA1 | Date |
|---|---|---|
|
|
a5739ad609 | |
|
|
1790496208 | |
|
|
273560b3ac | |
|
|
8bbea3a147 | |
|
|
d354e097e4 | |
|
|
cfc764438b | |
|
|
967e983df7 | |
|
|
a584b681eb | |
|
|
6b38505012 | |
|
|
28f347c13f | |
|
|
67891ca538 | |
|
|
8f78a1e13b | |
|
|
572d57647d | |
|
|
4e16916b1b | |
|
|
399d6f4f5f | |
|
|
33051e8fb3 | |
|
|
5bb0d06413 | |
|
|
87184aa643 | |
|
|
c95d8275c2 | |
|
|
91135a05fe |
Binary file not shown.
|
|
@ -338,6 +338,32 @@ __INLINE__ void write32p(const void *ptr32, uint32_t value)
|
|||
*ptr = (uint8_t)((value&0xff000000)>>24);
|
||||
}
|
||||
|
||||
/**
|
||||
****************************************************************************************
|
||||
* @brief Reads a 16-bit word in an array
|
||||
* @param[in] ptr16 The address of the first byte of the 16 bits word.
|
||||
* @return The 16 bits value.
|
||||
****************************************************************************************
|
||||
*/
|
||||
__INLINE__ uint16_t read16Swap(const void *ptr16)
|
||||
{
|
||||
uint16_t value = ((uint8_t *)ptr16)[1] | ((uint8_t *)ptr16)[0] << 8;
|
||||
return value;
|
||||
}
|
||||
/**
|
||||
****************************************************************************************
|
||||
* @brief Write a 16-bit word in an array
|
||||
* @param[in] ptr16 The address of the first byte of the 16 bits word.
|
||||
* @param[in] value The value to write.
|
||||
****************************************************************************************
|
||||
*/
|
||||
__INLINE__ void write16Swap(const void *ptr16, uint16_t value)
|
||||
{
|
||||
uint8_t *ptr=(uint8_t*)ptr16;
|
||||
|
||||
*ptr++ = (value&0xff00)>>8;
|
||||
*ptr = value&0xff;
|
||||
}
|
||||
|
||||
/**
|
||||
****************************************************************************************
|
||||
|
|
|
|||
|
|
@ -142,5 +142,5 @@ void uart_send(uint8_t port, uint16_t len, const uint8_t *data)
|
|||
}
|
||||
|
||||
while (!(uart->SR.TBEM)); // wait tx finish
|
||||
//while (uart->SR.BUSY); // wait idle state
|
||||
//while (uart->SR.BUSY); // wait idle state /*BUG:修复概率性死锁,修复方法:注释改行 zsxfly 20240615*/
|
||||
}
|
||||
|
|
|
|||
|
|
@ -15,18 +15,18 @@
|
|||
|
||||
#if !defined(DBG_UART_BAUD)
|
||||
#if (SYS_CLK == 1)
|
||||
#define DBG_UART_BAUD BRR_DIV(115200, 32M)
|
||||
#define DBG_UART_BAUD BRR_DIV(9600, 32M)
|
||||
#elif (SYS_CLK == 2)
|
||||
#define DBG_UART_BAUD BRR_DIV(115200, 48M)
|
||||
#define DBG_UART_BAUD BRR_DIV(9600, 48M)
|
||||
#elif (SYS_CLK == 3)
|
||||
#define DBG_UART_BAUD BRR_DIV(115200, 64M)
|
||||
#define DBG_UART_BAUD BRR_DIV(9600, 64M)
|
||||
#else
|
||||
#define DBG_UART_BAUD (BRR_115200)
|
||||
#define DBG_UART_BAUD BRR_DIV(9600, 16M)
|
||||
#endif //SYS_CLK
|
||||
#endif
|
||||
|
||||
#if !defined(DBG_UART_PORT)
|
||||
#define DBG_UART_PORT (0) //UART1
|
||||
#define DBG_UART_PORT (1) //UART1
|
||||
#endif
|
||||
#if !defined(DBG_UART_TXD)
|
||||
#define DBG_UART_TXD (6) //PA06
|
||||
|
|
|
|||
|
|
@ -21,7 +21,7 @@
|
|||
|
||||
/// Number of Soft-Timer Instances
|
||||
#if !defined(SFTMR_NUM)
|
||||
#define SFTMR_NUM (8)
|
||||
#define SFTMR_NUM (12)
|
||||
#endif
|
||||
|
||||
#if (SFTMR_NUM > 15)
|
||||
|
|
@ -133,7 +133,15 @@ void CTMR_IRQHandler(void)
|
|||
#elif (SFTMR_SRC == TMS_SysTick)
|
||||
|
||||
#if !defined(TMS_SysTick_ARR)
|
||||
#if (SYS_CLK == 1)
|
||||
#define TMS_SysTick_ARR (32 * 10000) // 10ms(32MHz CLK)
|
||||
#elif (SYS_CLK == 2)
|
||||
#define TMS_SysTick_ARR (48 * 10000) // 10ms(48MHz CLK)
|
||||
#elif (SYS_CLK == 3)
|
||||
#define TMS_SysTick_ARR (64 * 10000) // 10ms(64MHz CLK)
|
||||
#else
|
||||
#define TMS_SysTick_ARR (16 * 10000) // 10ms(16MHz CLK)
|
||||
#endif //SYS_CLK
|
||||
#endif
|
||||
|
||||
// SysTick configure
|
||||
|
|
@ -260,7 +268,7 @@ static __forceinline tmr_id_t find_free_tmr(void)
|
|||
{
|
||||
for (tmr_id_t idx = 0; idx < SFTMR_NUM; idx++)
|
||||
{
|
||||
if (((sftmr_env.field & (1 << idx)) == 0) /*&& (sftmr_env.func[idx] == NULL)*/)
|
||||
if (((sftmr_env.field & (1 << idx)) == 0) && (sftmr_env.func[idx] == NULL))
|
||||
{
|
||||
return idx + 1; // found timer
|
||||
}
|
||||
|
|
@ -289,9 +297,8 @@ tmr_id_t sftmr_start(tmr_tk_t delay, tmr_cb_t func)
|
|||
return tmr_id;
|
||||
}
|
||||
|
||||
// ˢ<>¶<EFBFBD>ʱʱ<CAB1><CAB1>
|
||||
void sftmr_Refresh(tmr_id_t tmr_id, tmr_tk_t delay)
|
||||
{
|
||||
// Refresh timer delay time, continue mode.
|
||||
void sftmr_Refresh(tmr_id_t tmr_id, tmr_tk_t delay){
|
||||
if (TMR_ID_VALID(tmr_id)){
|
||||
tmr_id_t idx = tmr_id - 1;
|
||||
TMR_TK_RANGE(delay);
|
||||
|
|
|
|||
|
|
@ -1,33 +1,103 @@
|
|||
T3930 14699:798 SEGGER J-Link V4.82 Log File (0000ms, 1992ms total)
|
||||
T3930 14699:798 DLL Compiled: Mar 10 2014 19:07:45 (0000ms, 1992ms total)
|
||||
T3930 14699:798 Logging started @ 2024-06-28 22:42 (0000ms, 1992ms total)
|
||||
T3930 14699:798 JLINK_SetWarnOutHandler(...) (0000ms, 1992ms total)
|
||||
T3930 14699:798 JLINK_OpenEx(...)
|
||||
Firmware: J-Link ARM-OB STM32 compiled Aug 22 2012 19:52:04
|
||||
Hardware: V7.00
|
||||
S/N: 20090928
|
||||
Feature(s): RDI,FlashDL,FlashBP,JFlash,GDBDevice "CORTEX-M0" selected (0 KB flash, 0 KB RAM). returns O.K. (0026ms, 2018ms total)
|
||||
T3930 14699:824 JLINK_GetEmuCaps() returns 0x88EA5833 (0000ms, 2018ms total)
|
||||
T3930 14699:824 JLINK_TIF_GetAvailable(...) (0000ms, 2018ms total)
|
||||
T3930 14699:824 JLINK_SetErrorOutHandler(...) (0000ms, 2018ms total)
|
||||
T3930 14699:824 JLINK_ExecCommand("ProjectFile = "D:\home\Desktop\items\Ó²¼þСÏîÄ¿\Öпذå\Èí¼þ\bleSDK6_v1.4.1\projects\blezongkong\mdk\JLinkSettings.ini"", ...)Device "CORTEX-M0" selected (0 KB flash, 0 KB RAM). returns 0x00 (0000ms, 2018ms total)
|
||||
T3930 14699:824 JLINK_ExecCommand("Device = B6x", ...)Device "CORTEX-M0" selected (0 KB flash, 0 KB RAM). returns 0x00 (0000ms, 2018ms total)
|
||||
T3930 14699:824 JLINK_ExecCommand("DisableConnectionTimeout", ...) returns 0x01 (0000ms, 2018ms total)
|
||||
T3930 14699:824 JLINK_GetHardwareVersion() returns 0x11170 (0000ms, 2018ms total)
|
||||
T3930 14699:824 JLINK_GetDLLVersion() returns 48200 (0000ms, 2018ms total)
|
||||
T3930 14699:824 JLINK_GetFirmwareString(...) (0000ms, 2018ms total)
|
||||
T3930 14699:824 JLINK_GetDLLVersion() returns 48200 (0000ms, 2018ms total)
|
||||
T3930 14699:824 JLINK_GetCompileDateTime() (0000ms, 2018ms total)
|
||||
T3930 14699:824 JLINK_GetFirmwareString(...) (0000ms, 2018ms total)
|
||||
T3930 14699:824 JLINK_GetHardwareVersion() returns 0x11170 (0000ms, 2018ms total)
|
||||
T3930 14699:824 JLINK_TIF_Select(JLINKARM_TIF_SWD) returns 0x00 (0001ms, 2019ms total)
|
||||
T3930 14699:825 JLINK_SetSpeed(5000) (0000ms, 2019ms total)
|
||||
T3930 14699:825 JLINK_SetResetType(JLINKARM_RESET_TYPE_NORMAL) returns JLINKARM_RESET_TYPE_NORMAL (0000ms, 2019ms total)
|
||||
T3930 14699:825 JLINK_Reset() >0x108 TIF>Found SWD-DP with ID 0x0BC11477 >0x0D TIF> >0x21 TIF> >0x0D TIF> >0x28 TIF> >0x0D TIF> >0x28 TIF> >0x0D TIF> >0x21 TIF> >0x0D TIF> >0x28 TIF> >0x0D TIF> >0x21 TIF> >0x0D TIF> >0x21 TIF> >0x0D TIF> >0x21 TIF> >0x0D TIF> >0x21 TIF> >0x0D TIF> >0x28 TIF> >0x0D TIF> >0x28 TIF> >0x0D TIF> >0x21 TIF> >0x0D TIF> >0x28 TIF> >0x0D TIF> >0x28 TIF> >0x0D TIF> >0x28 TIF> >0x0D TIF> >0x21 TIF> >0x0D TIF> >0x21 TIF> >0x0D TIF> >0x28 TIF> >0x0D TIF> >0x21 TIF> >0x0D TIF>
|
||||
>0x21 TIF>Found Cortex-M0 r0p1, Little endian. -- CPU_WriteMem(4 bytes @ 0xE0002000) -- CPU_ReadMem(4 bytes @ 0xE000EDF0) -- CPU_ReadMem(4 bytes @ 0xE0002000)FPUnit: 4 code (BP) slots and 0 literal slots -- CPU_ReadMem(4 bytes @ 0xE000EDFC) -- CPU_ReadMem(4 bytes @ 0xE0001000) -- CPU_WriteMem(4 bytes @ 0xE0001000) -- CPU_ReadMem(4 bytes @ 0xE00FF018) -- CPU is running -- CPU_WriteMem(4 bytes @ 0xE000EDF0) -- CPU is running -- CPU_WriteMem(4 bytes @ 0xE000EDFC) >0x35 TIF> -- CPU is running
|
||||
-- CPU_WriteMem(4 bytes @ 0xE000ED0C) -- CPU is running -- CPU_ReadMem(4 bytes @ 0xE000EDF0) -- CPU is running -- CPU_ReadMem(4 bytes @ 0xE000EDF0) -- CPU is running -- CPU_WriteMem(4 bytes @ 0xE000EDF0) -- CPU is running -- CPU_WriteMem(4 bytes @ 0xE000EDFC) -- CPU is running -- CPU_ReadMem(4 bytes @ 0xE000EDF0) -- CPU_WriteMem(4 bytes @ 0xE0002000) -- CPU_ReadMem(4 bytes @ 0xE000EDFC) -- CPU_ReadMem(4 bytes @ 0xE0001000) -- CPU_WriteMem(4 bytes @ 0xE0001000) (0029ms, 2048ms total)
|
||||
T3930 14699:854 JLINK_GetId() >0x0D TIF> >0x21 TIF> returns 0x0BC11477 (0001ms, 2049ms total)
|
||||
T3930 14699:859 JLINK_GetFirmwareString(...) (0000ms, 2049ms total)
|
||||
T3930 14700:585 JLINK_Close() -- CPU_WriteMem(4 bytes @ 0xE0001004) (0001ms, 2050ms total)
|
||||
T3930 14700:585 (0001ms, 2050ms total)
|
||||
T3930 14700:585 Closed (0001ms, 2050ms total)
|
||||
T8684 1513:581.568 SEGGER J-Link V7.96q Log File
|
||||
T8684 1513:581.696 DLL Compiled: Jun 28 2024 12:33:32
|
||||
T8684 1513:581.696 Logging started @ 2024-09-06 11:31
|
||||
T8684 1513:581.696 Process: C:\APP\KeilMDK\UV4\UV4.exe
|
||||
T8684 1513:581.696 - 1451569.920ms
|
||||
T8684 1513:581.696 JLINK_SetWarnOutHandler(...)
|
||||
T8684 1513:581.696 - 0.003ms
|
||||
T8684 1513:581.696 JLINK_OpenEx(...)
|
||||
T8684 1513:583.360 Firmware: J-Link ARM-OB STM32 compiled Aug 22 2012 19:52:04
|
||||
T8684 1513:584.000 Firmware: J-Link ARM-OB STM32 compiled Aug 22 2012 19:52:04
|
||||
T8684 1513:585.408 Hardware: V7.00
|
||||
T8684 1513:585.408 S/N: 20090928
|
||||
T8684 1513:585.408 OEM: SEGGER
|
||||
T8684 1513:585.408 Feature(s): RDI,FlashDL,FlashBP,JFlash,GDB
|
||||
T8684 1513:585.664 Bootloader: (Could not read)
|
||||
T8684 1513:586.176 TELNET listener socket opened on port 19021
|
||||
T8684 1513:614.080 Device "CORTEX-M0" selected.
|
||||
T8684 1513:615.104 WEBSRV WEBSRV_Init(): Starting webserver thread(s)
|
||||
T8684 1513:615.232 WEBSRV Webserver running on local port 19080
|
||||
T8684 1513:615.232 Looking for J-Link GUI Server exe at: C:\APP\KeilMDK\ARM\Segger\JLinkGUIServer.exe
|
||||
T8684 1513:615.360 Looking for J-Link GUI Server exe at: C:\Program Files\SEGGER\JLink_V796q\JLinkGUIServer.exe
|
||||
T8684 1513:615.360 Forking J-Link GUI Server: C:\Program Files\SEGGER\JLink_V796q\JLinkGUIServer.exe
|
||||
T8684 1513:627.264 J-Link GUI Server info: "J-Link GUI server V7.96q "
|
||||
T8684 1513:630.208 - 48.508ms returns "O.K."
|
||||
T8684 1513:630.208 JLINK_GetEmuCaps()
|
||||
T8684 1513:630.208 - 0.008ms returns 0x88EA5833
|
||||
T8684 1513:630.208 JLINK_TIF_GetAvailable(...)
|
||||
T8684 1513:632.768 - 2.520ms
|
||||
T8684 1513:633.152 JLINK_SetErrorOutHandler(...)
|
||||
T8684 1513:633.152 - 0.017ms
|
||||
T8684 1513:633.152 JLINK_ExecCommand("ProjectFile = "D:\home\Desktop\items\Ó²¼þСÏîÄ¿\Öпذå\Èí¼þ\bleSDK6_v1.4.1\projects\blezongkong\mdk\JLinkSettings.ini"", ...).
|
||||
T8684 1513:637.120 Device "CORTEX-M0" selected.
|
||||
T8684 1513:637.632 - 4.325ms returns 0x00
|
||||
T8684 1513:639.936 JLINK_ExecCommand("Device = B6x", ...).
|
||||
T8684 1513:640.064 Flash bank @ 0x18000000: SFL: Parsing sectorization info from ELF file
|
||||
T8684 1513:640.064 FlashDevice.SectorInfo[0]: .SectorSize = 0x00001000, .SectorStartAddr = 0x00000000
|
||||
T8684 1513:640.064 OFL: Init() present @ offset 0x000000AB
|
||||
T8684 1513:640.064 OFL: UnInit() present @ offset 0x000001E1
|
||||
T8684 1513:640.064 OFL: EraseSector() present @ offset 0x00000293
|
||||
T8684 1513:640.064 OFL: ProgramPage() present @ offset 0x000002C5
|
||||
T8684 1513:640.064 OFL: EraseChip() present @ offset 0x00000225
|
||||
T8684 1513:640.064 OFL: BlankCheck() N/A
|
||||
T8684 1513:640.064 OFL: Verify() present @ offset 0x00000383
|
||||
T8684 1513:640.064 OFL: SEGGER_FL_Erase() N/A
|
||||
T8684 1513:640.192 OFL: SEGGER_OPEN_Erase() N/A
|
||||
T8684 1513:640.192 OFL: SEGGER_FL_Program() N/A
|
||||
T8684 1513:640.192 OFL: SEGGER_OPEN_Program() N/A
|
||||
T8684 1513:640.192 OFL: SEGGER_FL_Read() N/A
|
||||
T8684 1513:640.192 OFL: SEGGER_OPEN_Read() N/A
|
||||
T8684 1513:640.192 OFL: SEGGER_FL_CalcCRC() N/A
|
||||
T8684 1513:640.192 OFL: SEGGER_OPEN_CalcCRC() N/A
|
||||
T8684 1513:640.192 OFL: SEGGER_FL_Start() N/A
|
||||
T8684 1513:640.192 OFL: SEGGER_OPEN_Start() N/A
|
||||
T8684 1513:640.192 OFL: SEGGER_FL_GetFlashInfo() N/A
|
||||
T8684 1513:640.192 OFL: SEGGER_OPEN_GetFlashInfo() N/A
|
||||
T8684 1513:640.192 OFL: SEGGER_FL_Verify() N/A
|
||||
T8684 1513:640.192 OFL: SEGGER_FL_CheckBlank() N/A
|
||||
T8684 1513:640.192 OFL: SEGGER_FL_Prepare() N/A
|
||||
T8684 1513:640.192 OFL: SEGGER_FL_Restore() N/A
|
||||
T8684 1513:640.192 OFL: SEGGER_FL_EraseChip() N/A
|
||||
T8684 1513:640.192 OFL var <SEGGER_FL_GoIntEn>: N/A
|
||||
T8684 1513:643.904 Device "B6X" selected.
|
||||
T8684 1513:644.288 - 4.394ms returns 0x00
|
||||
T8684 1513:644.288 JLINK_ExecCommand("DisableConnectionTimeout", ...).
|
||||
T8684 1513:644.288 ERROR: Unknown command
|
||||
T8684 1513:644.288 - 0.011ms returns 0x01
|
||||
T8684 1513:644.416 JLINK_GetHardwareVersion()
|
||||
T8684 1513:644.416 - 0.006ms returns 70000
|
||||
T8684 1513:644.416 JLINK_GetDLLVersion()
|
||||
T8684 1513:644.416 - 0.006ms returns 79617
|
||||
T8684 1513:644.416 JLINK_GetOEMString(...)
|
||||
T8684 1513:644.416 JLINK_GetFirmwareString(...)
|
||||
T8684 1513:644.416 - 0.037ms
|
||||
T8684 1513:652.096 JLINK_GetDLLVersion()
|
||||
T8684 1513:652.224 - 0.024ms returns 79617
|
||||
T8684 1513:652.224 JLINK_GetCompileDateTime()
|
||||
T8684 1513:652.224 - 0.006ms
|
||||
T8684 1513:654.144 JLINK_GetFirmwareString(...)
|
||||
T8684 1513:654.144 - 0.014ms
|
||||
T8684 1513:655.808 JLINK_GetHardwareVersion()
|
||||
T8684 1513:655.936 - 0.010ms returns 70000
|
||||
T8684 1513:657.600 JLINK_GetSN()
|
||||
T8684 1513:657.600 - 0.012ms returns 20090928
|
||||
T8684 1513:659.008 JLINK_GetOEMString(...)
|
||||
T8684 1513:664.640 JLINK_TIF_Select(JLINKARM_TIF_SWD)
|
||||
T8684 1513:664.896 - 0.316ms returns 0x00
|
||||
T8684 1513:664.896 JLINK_HasError()
|
||||
T8684 1513:664.896 JLINK_SetSpeed(5000)
|
||||
T8684 1513:664.896 - 0.059ms
|
||||
T8684 1513:664.896 JLINK_GetId()
|
||||
T8684 1513:668.992 ConfigTargetSettings() start
|
||||
T8684 1513:668.992 J-Link Script File: Executing ConfigTargetSettings()
|
||||
T8684 1513:670.528 ConfigTargetSettings() end - Took 14us
|
||||
T8684 1513:774.848 Failed to attach to CPU. Trying connect under reset.
|
||||
T8684 1514:295.552 Connect fallback: Reset via Reset pin & Connect.
|
||||
T8684 1514:351.360 ConfigTargetSettings() start
|
||||
T8684 1514:351.360 J-Link Script File: Executing ConfigTargetSettings()
|
||||
T8684 1514:352.384 ConfigTargetSettings() end - Took 10us
|
||||
T8684 1514:458.752 - 793.763ms returns 0x00000000
|
||||
T8684 1582:110.080 JLINK_Close()
|
||||
T8684 1582:130.432 - 20.341ms
|
||||
T8684 1582:130.432
|
||||
T8684 1582:130.432 Closed
|
||||
|
|
|
|||
|
|
@ -0,0 +1,383 @@
|
|||
import serial
|
||||
import serial.tools.list_ports
|
||||
import struct
|
||||
import sys
|
||||
import time
|
||||
import os
|
||||
import fnmatch
|
||||
|
||||
def crc16(data):
|
||||
crc = 0xFFFF
|
||||
for byte in data:
|
||||
crc ^= byte
|
||||
for _ in range(8):
|
||||
if (crc & 0x0001) != 0:
|
||||
crc >>= 1
|
||||
crc ^= 0xA001
|
||||
else:
|
||||
crc >>= 1
|
||||
return crc
|
||||
|
||||
def create_frame(index, data):
|
||||
crc = crc16(struct.pack('>H', index) + data)
|
||||
frame = struct.pack('>H', index) + data + struct.pack('>H', crc)
|
||||
return frame
|
||||
|
||||
def list_serial_ports():
|
||||
ports = serial.tools.list_ports.comports()
|
||||
return [port.device for port in ports]
|
||||
|
||||
def list_bin_files(directory):
|
||||
bin_files = []
|
||||
for dirpath, dirnames, filenames in os.walk(directory):
|
||||
for filename in fnmatch.filter(filenames, '*.bin'):
|
||||
# 使用 os.path.relpath 将路径转换为相对路径
|
||||
relative_path = os.path.relpath(os.path.join(dirpath, filename), start=os.getcwd())
|
||||
bin_files.append(relative_path)
|
||||
return bin_files
|
||||
|
||||
# def list_bin_files(directory):
|
||||
# bin_files = []
|
||||
# for dirpath, dirnames, filenames in os.walk(directory):
|
||||
# for filename in fnmatch.filter(filenames, '*.bin'):
|
||||
# bin_files.append(os.path.join(dirpath, filename))
|
||||
# return bin_files
|
||||
|
||||
def select_option(options, prompt):
|
||||
for index, option in enumerate(options):
|
||||
print(f"{index + 1}: {option}")
|
||||
selected_index = int(input(prompt)) - 1
|
||||
if selected_index < 0 or selected_index >= len(options):
|
||||
print("无效的选择。")
|
||||
sys.exit(1)
|
||||
return options[selected_index]
|
||||
|
||||
def main():
|
||||
# 列出可用串口
|
||||
serial_ports = list_serial_ports()
|
||||
if not serial_ports:
|
||||
print("没有找到可用的串口。")
|
||||
sys.exit(1)
|
||||
|
||||
print("可用串口:")
|
||||
selected_port = select_option(serial_ports, "请选择串口序号: ")
|
||||
|
||||
# 列出当前目录及子目录下所有的bin文件
|
||||
bin_files = list_bin_files(os.path.dirname(os.path.abspath(__file__)))
|
||||
if not bin_files:
|
||||
print("没有找到任何 .bin 文件。")
|
||||
sys.exit(1)
|
||||
|
||||
print("找到以下 .bin 文件:")
|
||||
selected_file = select_option(bin_files, "请选择文件序号: ")
|
||||
|
||||
baudrate = 9600 # 这里可以根据需要设置波特率
|
||||
init_delay = 0.04 # 这里也可以根据需要设置延迟
|
||||
|
||||
COM_serial = serial.Serial(selected_port, baudrate, timeout=0)
|
||||
|
||||
with open(selected_file, 'rb') as f:
|
||||
file_data = f.read()
|
||||
|
||||
time.sleep(2) # 等待串口稳定
|
||||
|
||||
# 发送初始化帧
|
||||
chunk = file_data[8:11]
|
||||
chunk = chunk.ljust(16, b'\x00')
|
||||
init_frame = create_frame(0xFF01, chunk)
|
||||
|
||||
count = 0
|
||||
ACK_OK = False
|
||||
while True:
|
||||
print(f"Sent start frame: {init_frame.hex().upper()}")
|
||||
COM_serial.write(init_frame)
|
||||
time_count = 0
|
||||
while True:
|
||||
response = COM_serial.read(2)
|
||||
if len(response) == 2:
|
||||
error_code = int.from_bytes(response, byteorder='big')
|
||||
if 0xFF01 == error_code:
|
||||
ACK_OK = True
|
||||
print("Initialization response received: 0xFF01")
|
||||
break
|
||||
elif 0x5501 == error_code:
|
||||
print("Firmware partition verification fails. Please check whether the selected firmware is correct.")
|
||||
sys.exit(1)
|
||||
elif 0x5502 <= error_code <= 0x5514:
|
||||
print(f"Received error code: {error_code:04X}. Stopping file transmission.")
|
||||
sys.exit(1)
|
||||
time.sleep(0.001)
|
||||
time_count += 1
|
||||
if time_count > 1000:
|
||||
count += 1
|
||||
print("Initialization response not received. Retrying...")
|
||||
break
|
||||
if ACK_OK:
|
||||
break
|
||||
if count >= 3:
|
||||
sys.exit(1)
|
||||
|
||||
index = 0
|
||||
frame_size = 16
|
||||
num_frames = (len(file_data) + frame_size - 1) // frame_size
|
||||
|
||||
# 发送数据帧
|
||||
for i in range(num_frames):
|
||||
start = i * frame_size
|
||||
end = start + frame_size
|
||||
chunk = file_data[start:end]
|
||||
|
||||
if len(chunk) < frame_size:
|
||||
chunk = chunk.ljust(frame_size, b'\x00')
|
||||
|
||||
frame = create_frame(index, chunk)
|
||||
COM_serial.write(frame)
|
||||
if (index % 16 == 0): # 每16个数据帧delay一下
|
||||
time.sleep(0.02)
|
||||
|
||||
# 尝试接收响应和错误码
|
||||
time_count = 0
|
||||
while True:
|
||||
response = COM_serial.read(2)
|
||||
if len(response) == 2:
|
||||
error_code = int.from_bytes(response, byteorder='big')
|
||||
if 0x5501 <= error_code <= 0x5514:
|
||||
print(f"Received error code: {error_code:04X}. Stopping file transmission.")
|
||||
sys.exit(1)
|
||||
time.sleep(0.001)
|
||||
time_count += 1
|
||||
if time_count > (1000 * init_delay):
|
||||
break
|
||||
|
||||
frame_crc = struct.pack('>H', crc16(struct.pack('>H', index) + chunk))
|
||||
print(f"IDX:{struct.pack('>H', index).hex().upper()}|DATA:{chunk.hex().upper()}|CRC:{frame_crc.hex().upper()}")
|
||||
index += 1
|
||||
|
||||
# 发送尾帧
|
||||
end_frame_index = index - 1
|
||||
end_frame_index_bytes = struct.pack('>H', end_frame_index)
|
||||
end_frame_index_inverted = struct.pack('>H', ~end_frame_index & 0xFFFF)
|
||||
end_frame_data = end_frame_index_bytes + end_frame_index_inverted + b'\x00' * 12
|
||||
end_frame = create_frame(0xFF02, end_frame_data)
|
||||
|
||||
print(f"Sent end frame: {end_frame.hex().upper()}")
|
||||
COM_serial.write(end_frame)
|
||||
|
||||
# 尝试接收尾帧响应和错误码
|
||||
time_count = 0
|
||||
while True:
|
||||
response = COM_serial.read(2)
|
||||
if len(response) == 2:
|
||||
error_code = int.from_bytes(response, byteorder='big')
|
||||
if 0xFF02 == error_code:
|
||||
print("OTA update successfully.")
|
||||
break
|
||||
elif 0x5501 <= error_code <= 0x5514:
|
||||
print(f"OTA update failed: error code:{error_code:04X}")
|
||||
sys.exit(1)
|
||||
time.sleep(0.001)
|
||||
time_count += 1
|
||||
if time_count > 1500:
|
||||
print("OTA update failed: timeout...")
|
||||
break
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
# import serial
|
||||
# import struct
|
||||
# import sys
|
||||
# import time
|
||||
|
||||
# def crc16(data):
|
||||
# crc = 0xFFFF
|
||||
# for byte in data:
|
||||
# crc ^= byte
|
||||
# for _ in range(8):
|
||||
# if (crc & 0x0001) != 0:
|
||||
# crc >>= 1
|
||||
# crc ^= 0xA001
|
||||
# else:
|
||||
# crc >>= 1
|
||||
# return crc
|
||||
|
||||
# def create_frame(index, data):
|
||||
# crc = crc16(struct.pack('>H', index) + data)
|
||||
# frame = struct.pack('>H', index) + data + struct.pack('>H', crc)
|
||||
# return frame
|
||||
|
||||
# def save_frame_to_file(frame, index):
|
||||
# with open('frames.txt', 'a') as f:
|
||||
# f.write(f"Frame {index}: {frame.hex().upper()}\n")
|
||||
|
||||
# def main():
|
||||
# if len(sys.argv) != 5:
|
||||
# print("Usage: python serial_sender.py <port> <baudrate> <file> <float_delay>")
|
||||
# sys.exit(1)
|
||||
|
||||
# port = sys.argv[1]
|
||||
# baudrate = int(sys.argv[2])
|
||||
# file_path = sys.argv[3]
|
||||
# init_delay = float(sys.argv[4])
|
||||
|
||||
# COM_serial = serial.Serial(port, baudrate, timeout=0)
|
||||
|
||||
# with open(file_path, 'rb') as f:
|
||||
# file_data = f.read()
|
||||
|
||||
# time.sleep(2) #等待串口稳定
|
||||
|
||||
|
||||
# # 发送初始化帧
|
||||
# chunk = file_data[8:11]
|
||||
# chunk = chunk.ljust(16, b'\x00')
|
||||
# init_frame = create_frame(0xFF01, chunk)
|
||||
|
||||
# # init_frame = create_frame(0xFF01, b'\x00' * 16)
|
||||
|
||||
# # response = COM_serial.read(2)
|
||||
# # print(f"Received response: {response.hex().upper()}")
|
||||
# count =0
|
||||
# ACK_OK = False
|
||||
# while True:
|
||||
# print(f"Sent satrt frame: {init_frame.hex().upper()}")
|
||||
# COM_serial.write(init_frame)
|
||||
# time_count = 0
|
||||
# while True:
|
||||
# response = COM_serial.read(2)
|
||||
# error_code = int.from_bytes(response, byteorder='big')
|
||||
# if 0xFF01 == error_code:
|
||||
# ACK_OK = True
|
||||
# print("Initialization response received: 0xFF01")
|
||||
# break
|
||||
# elif 0x5501 == error_code:
|
||||
# print("Firmware partition verification fails. Please check whether the selected firmware is correct.")
|
||||
# sys.exit(1)
|
||||
# # break
|
||||
# elif 0x5502 <= error_code <= 0x5514:
|
||||
# print(f"Received error code: {error_code:04X}. Stopping file transmission.")
|
||||
# # sys.exit(1)
|
||||
# break
|
||||
# else:
|
||||
# time.sleep(0.001)
|
||||
# time_count += 1
|
||||
# if time_count > 1000:
|
||||
# count += 1
|
||||
# print("Initialization response not received. Retrying...")
|
||||
# break
|
||||
# if ACK_OK:
|
||||
# break
|
||||
# if count >= 3:
|
||||
# sys.exit(1)
|
||||
|
||||
# # save_frame_to_file(init_frame, 0)
|
||||
|
||||
# index = 0
|
||||
# frame_size = 16
|
||||
# num_frames = (len(file_data) + frame_size - 1) // frame_size
|
||||
|
||||
# # 发送数据帧
|
||||
# for i in range(num_frames):
|
||||
# start = i * frame_size
|
||||
# end = start + frame_size
|
||||
# chunk = file_data[start:end]
|
||||
|
||||
# if len(chunk) < frame_size:
|
||||
# chunk = chunk.ljust(frame_size, b'\x00')
|
||||
|
||||
# frame = create_frame(index, chunk) # 发送数据帧
|
||||
# COM_serial.write(frame)
|
||||
# if (index % 16 == 0): # 每16个数据帧delay一下
|
||||
# # print("delay...")
|
||||
# time.sleep(0.02)
|
||||
# # 尝试接收响应和错误码
|
||||
# time_count = 0
|
||||
# while True:
|
||||
# response = COM_serial.read(2)
|
||||
# error_code = int.from_bytes(response, byteorder='big')
|
||||
# if 0x5501 <= error_code <= 0x5514:
|
||||
# print(f"Received error code: {error_code:04X}. Stopping file transmission.")
|
||||
# sys.exit(1)
|
||||
# else:
|
||||
# time.sleep(0.001)
|
||||
# time_count += 1
|
||||
# if time_count > (1000 * init_delay):
|
||||
# # print("timeout...")
|
||||
# break
|
||||
|
||||
# # response = COM_serial.read(2)
|
||||
# # if response:
|
||||
# # error_code = int.from_bytes(response, byteorder='big')
|
||||
# # if 0x5501 <= error_code <= 0x5514:
|
||||
# # print(f"Received error code: {error_code:04X}. Stopping file transmission.")
|
||||
# # sys.exit(1)
|
||||
# # # save_frame_to_file(frame, index)
|
||||
# # time.sleep(init_delay)
|
||||
|
||||
# frame_crc = struct.pack('>H',crc16(struct.pack('>H', index) + chunk))
|
||||
# frame_index = struct.pack('>H', index)
|
||||
# print(f"IDX:{frame_index.hex().upper()}|DATA:{chunk.hex().upper()}|CRC:{frame_crc.hex().upper()}")
|
||||
# index += 1
|
||||
|
||||
|
||||
|
||||
# # 发送尾帧
|
||||
# end_frame_index = index - 1
|
||||
# end_frame_index_bytes = struct.pack('>H', end_frame_index)
|
||||
# end_frame_index_inverted = struct.pack('>H', ~end_frame_index & 0xFFFF)
|
||||
# end_frame_data = end_frame_index_bytes + end_frame_index_inverted + b'\x00' * 12
|
||||
# end_frame = create_frame(0xFF02, end_frame_data)
|
||||
|
||||
# print(f"Sent end frame: {end_frame.hex().upper()}")
|
||||
# COM_serial.write(end_frame)
|
||||
# # 尝试接收尾帧响应和错误码
|
||||
# time_count = 0
|
||||
# while True:
|
||||
# response = COM_serial.read(2)
|
||||
# error_code = int.from_bytes(response, byteorder='big')
|
||||
# if 0xFF02 == error_code:
|
||||
# print("OTA update successfully.")
|
||||
# break
|
||||
# elif 0x5501 <= error_code <= 0x5514:
|
||||
# print(f"OTA update failed: error code:{error_code:04X}")
|
||||
# sys.exit(1)
|
||||
# else:
|
||||
# time.sleep(0.001)
|
||||
# time_count += 1
|
||||
# if time_count > 1500:
|
||||
# print("OTA update failed: timeout...")
|
||||
# break
|
||||
# # save_frame_to_file(end_frame, index)
|
||||
|
||||
|
||||
# # end_frame_count = 0
|
||||
# # while True:
|
||||
# # # if COM_serial.in_waiting > 0: # 检查是否有数据可读
|
||||
# # response = COM_serial.read(2)
|
||||
# # if response:
|
||||
# # print(f"Received response: {response.hex().upper()}")
|
||||
# # error_code = int.from_bytes(response, byteorder='big')
|
||||
# # if 0x5501 <= error_code <= 0x5514:
|
||||
# # print(f"Received error code: {error_code:04X}. Stopping file transmission.")
|
||||
# # sys.exit(1)
|
||||
# # elif error_code == 0xFF02:
|
||||
# # print("OTA update successfully.")
|
||||
# # break
|
||||
# # else:
|
||||
# # end_frame_count +=1
|
||||
# # if end_frame_count > 10:
|
||||
# # print("End frame response not received. Stopping file transmission.")
|
||||
# # sys.exit(1)
|
||||
# # print("End frame response not received. Retrying...")
|
||||
|
||||
# if __name__ == "__main__":
|
||||
# main()
|
||||
|
|
@ -0,0 +1,134 @@
|
|||
$Bank_A = '_0x04000'
|
||||
$Bank_B = '_0x20000'
|
||||
$Ext_lnp = '.lnp'
|
||||
$Ext_axf = '.axf'
|
||||
$Ext_hex = '.hex'
|
||||
$Ext_bin = '.bin'
|
||||
$Ext_asm = '.asm'
|
||||
$Path_lnp = '.\output\'
|
||||
|
||||
# user defined
|
||||
$Path_cmd = 'C:\app\keil_MDK\Keil_v5\ARM\ARMCC\bin'
|
||||
$env:path+=";$Path_cmd;"
|
||||
|
||||
# 获取最新的lnp文件(eg:\projects\bleOTA\mdk\output\bleOTA.lnp)
|
||||
$full_path = Get-ChildItem -Path $Path_lnp -Recurse -ErrorAction SilentlyContinue -Filter *.lnp | Where-Object { $_.Extension -eq '.lnp' } | Where-Object {$_.LastWriteTime} | Select-Object -last 1 | Select-Object -ExpandProperty FullName
|
||||
|
||||
# 以.为分隔符, 分割带路径的文件名(eg:\projects\bleOTA\mdk\output\bleOTA)和后缀名(eg:lnp)
|
||||
# 去掉.lnp的长度
|
||||
$full_paht_len = $full_path.length - 4
|
||||
#$Pname, $Ext = $full_path.Split(".")
|
||||
$Pname = $full_path.Substring(0, $full_paht_len)
|
||||
|
||||
# 带路径不带后缀的名称
|
||||
# (eg:\projects\bleOTA\mdk\output\bleOTA)
|
||||
# (eg:\projects\bleOTA\mdk\output\bleOTA_0x20000)
|
||||
$Bank_A_name = $Pname
|
||||
$Bank_B_name = $Pname+$Bank_B
|
||||
|
||||
# 获取不带路径且不带后缀的lnp文件名
|
||||
$Bank_A_File_Name = (Get-Item $full_path).BaseName
|
||||
$Bank_B_File_Name = $Bank_A_File_Name+$Bank_B
|
||||
|
||||
# 拼成带路径的原始文件
|
||||
# (eg:\projects\bleOTA\mdk\output\bleOTA.lnp)
|
||||
# (eg:\projects\bleOTA\mdk\output\bleOTA.axf)
|
||||
# (eg:\projects\bleOTA\mdk\output\bleOTA_0x04000.hex)
|
||||
# (eg:\projects\bleOTA\mdk\output\bleOTA_0x04000.bin)
|
||||
# (eg:\projects\bleOTA\mdk\output\bleOTA_0x04000.asm)
|
||||
$Org_lnp = $Bank_A_name+$Ext_lnp
|
||||
$Org_axf = $Bank_A_name+$Ext_axf
|
||||
$Org_hex = $Bank_A_name+'_0x04000'+$Ext_hex
|
||||
$Org_bin = $Bank_A_name+'_0x04000'+$Ext_bin
|
||||
$Org_asm = $Bank_A_name+'_0x04000'+$Ext_asm
|
||||
|
||||
# 拼成带路径的目标文件
|
||||
# (eg:\projects\bleOTA\mdk\output\bleOTA_0x20000.lnp)
|
||||
# (eg:\projects\bleOTA\mdk\output\bleOTA_0x20000.axf)
|
||||
# (eg:\projects\bleOTA\mdk\output\bleOTA_0x20000.hex)
|
||||
# (eg:\projects\bleOTA\mdk\output\bleOTA_0x20000.bin)
|
||||
# (eg:\projects\bleOTA\mdk\output\bleOTA_0x20000.asm)
|
||||
$Obj_lnp = $Bank_B_name+$Ext_lnp
|
||||
$Obj_axf = $Bank_B_name+$Ext_axf
|
||||
$Obj_hex = $Bank_B_name+$Ext_hex
|
||||
$Obj_bin = $Bank_B_name+$Ext_bin
|
||||
$Obj_asm = $Bank_B_name+$Ext_asm
|
||||
|
||||
|
||||
# 在原始lnp文件基础上替换sct文件, 并保存为目标lnp文件
|
||||
# (eg:link_xip_ble_0x04000替换为link_xip_ble_0x20000)
|
||||
(Get-Content $Org_lnp) -Replace $Bank_A, $Bank_B | Set-Content $Obj_lnp
|
||||
|
||||
# 替换目标lnp文件中的文件名
|
||||
# (eg:bleOTA替换为bleOTA_0x20000)
|
||||
(Get-Content $Obj_lnp) -Replace $Bank_A_File_Name, $Bank_B_File_Name | Set-Content $Obj_lnp
|
||||
|
||||
Write-Output "**************** Linking High Bank ... ****************"
|
||||
# 链接生成目标文件(axf, map)
|
||||
armlink.exe --Via $Obj_lnp
|
||||
|
||||
# 删除目标lnp, 防止下次读取时存在多个lnp导致的报错
|
||||
Remove-Item $Obj_lnp
|
||||
|
||||
# 生成hex
|
||||
fromelf.exe $Org_axf --i32combined --output $Org_hex
|
||||
fromelf.exe $Obj_axf --i32combined --output $Obj_hex
|
||||
|
||||
# 生成bin
|
||||
fromelf.exe $Org_axf --bin --output $Org_bin
|
||||
fromelf.exe $Obj_axf --bin --output $Obj_bin
|
||||
|
||||
# 生成asm
|
||||
fromelf.exe $Org_axf --text -a -c --output $Org_asm
|
||||
fromelf.exe $Obj_axf --text -a -c --output $Obj_asm
|
||||
|
||||
# 计算CRC32
|
||||
Add-Type -TypeDefinition @"
|
||||
using System;
|
||||
using System.Runtime.InteropServices;
|
||||
|
||||
public class Win32Api {
|
||||
[DllImport("ntdll.dll")]
|
||||
public static extern uint RtlComputeCrc32(uint dwInitial, byte[] pData, int iLen);
|
||||
}
|
||||
"@
|
||||
|
||||
function Get-CRC32 {
|
||||
[CmdletBinding()]
|
||||
param (
|
||||
[Parameter(Mandatory=$true,ValueFromPipeline = $true)]
|
||||
[string]$InputFile
|
||||
)
|
||||
|
||||
#Write-host $InputFile
|
||||
|
||||
# Read the file as bytes
|
||||
$fileBytes = [System.IO.File]::ReadAllBytes($InputFile)
|
||||
|
||||
# Calculate the CRC32 checksum using the Win32 API
|
||||
$crc32 = [Win32Api]::RtlComputeCrc32(0, $fileBytes, $fileBytes.Length)
|
||||
|
||||
# Convert the CRC32 value to hexadecimal string
|
||||
$crc32String = $crc32.ToString("X8")
|
||||
|
||||
# Display the CRC32 checksum
|
||||
Write-Output $crc32String
|
||||
}
|
||||
|
||||
$Bank_A = "File : " + $Bank_A_File_Name + '_0x04000' + $Ext_bin
|
||||
$Bank_B = "File : " + $Bank_B_File_Name + $Ext_bin
|
||||
|
||||
$CRC32 = Get-CRC32 $Org_bin
|
||||
Write-Output "================================="
|
||||
Write-Output $Bank_A
|
||||
$CRC32 = "CRC32: " + "0x" +$CRC32
|
||||
Write-Output $CRC32
|
||||
Write-Output "================================="
|
||||
|
||||
$CRC32 = Get-CRC32 $Obj_bin
|
||||
Write-Output $Bank_B
|
||||
$CRC32 = "CRC32: " + "0x" +$CRC32
|
||||
Write-Output $CRC32
|
||||
Write-Output "================================="
|
||||
|
||||
#pause
|
||||
|
|
@ -0,0 +1,40 @@
|
|||
#! armcc -E -I ..\src\
|
||||
#include "cfg.h"
|
||||
|
||||
#define SCT_FLASH_BASE (0x18004000)
|
||||
#define SCT_FLASH_END (0x18020000)
|
||||
#define SCT_FLASH_LEN (SCT_FLASH_END - SCT_FLASH_BASE)
|
||||
|
||||
LR_IROM1 SCT_FLASH_BASE SCT_FLASH_LEN
|
||||
{
|
||||
ER_IROM1 SCT_FLASH_BASE SCT_FLASH_LEN
|
||||
{
|
||||
*.o (RESET, +First)
|
||||
*(InRoot$$Sections)
|
||||
startup*.o (+RO)
|
||||
.ANY (+RO)
|
||||
}
|
||||
|
||||
RW_IRAM_VECT 0x20003000 EMPTY 152
|
||||
{
|
||||
; sram vector
|
||||
}
|
||||
|
||||
RW_IRAM_USER +0
|
||||
{
|
||||
*.o(ram_func*)
|
||||
.ANY (+RW +ZI)
|
||||
}
|
||||
|
||||
RW_IRAM_STACK 0x20008000-0x600 UNINIT 0x600
|
||||
{
|
||||
.ANY (STACK)
|
||||
}
|
||||
|
||||
RW_IRAM_RETN 0x20008000 UNINIT 0x2000
|
||||
{
|
||||
; retention memory 8KB
|
||||
; user manual init
|
||||
*.o(user_retention)
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,40 @@
|
|||
#! armcc -E -I ..\src\
|
||||
#include "cfg.h"
|
||||
|
||||
#define SCT_FLASH_BASE (0x18020000)
|
||||
#define SCT_FLASH_END (0x18040000)
|
||||
#define SCT_FLASH_LEN (SCT_FLASH_END - SCT_FLASH_BASE)
|
||||
|
||||
LR_IROM1 SCT_FLASH_BASE SCT_FLASH_LEN
|
||||
{
|
||||
ER_IROM1 SCT_FLASH_BASE SCT_FLASH_LEN
|
||||
{
|
||||
*.o (RESET, +First)
|
||||
*(InRoot$$Sections)
|
||||
startup*.o (+RO)
|
||||
.ANY (+RO)
|
||||
}
|
||||
|
||||
RW_IRAM_VECT 0x20003000 EMPTY 152
|
||||
{
|
||||
; sram vector
|
||||
}
|
||||
|
||||
RW_IRAM_USER +0
|
||||
{
|
||||
*.o(ram_func*)
|
||||
.ANY (+RW +ZI)
|
||||
}
|
||||
|
||||
RW_IRAM_STACK 0x20008000-0x600 UNINIT 0x600
|
||||
{
|
||||
.ANY (STACK)
|
||||
}
|
||||
|
||||
RW_IRAM_RETN 0x20008000 UNINIT 0x2000
|
||||
{
|
||||
; retention memory 8KB
|
||||
; user manual init
|
||||
*.o(user_retention)
|
||||
}
|
||||
}
|
||||
Binary file not shown.
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
|
@ -22,7 +22,7 @@
|
|||
</DaveTm>
|
||||
|
||||
<Target>
|
||||
<TargetName>uartTest</TargetName>
|
||||
<TargetName>OTA</TargetName>
|
||||
<ToolsetNumber>0x4</ToolsetNumber>
|
||||
<ToolsetName>ARM-ADS</ToolsetName>
|
||||
<TargetOption>
|
||||
|
|
@ -30,8 +30,8 @@
|
|||
<OPTTT>
|
||||
<gFlags>1</gFlags>
|
||||
<BeepAtEnd>1</BeepAtEnd>
|
||||
<RunSim>0</RunSim>
|
||||
<RunTarget>1</RunTarget>
|
||||
<RunSim>1</RunSim>
|
||||
<RunTarget>0</RunTarget>
|
||||
<RunAbUc>0</RunAbUc>
|
||||
</OPTTT>
|
||||
<OPTHX>
|
||||
|
|
@ -89,7 +89,7 @@
|
|||
<sRfunc>1</sRfunc>
|
||||
<sRbox>1</sRbox>
|
||||
<tLdApp>1</tLdApp>
|
||||
<tGomain>1</tGomain>
|
||||
<tGomain>0</tGomain>
|
||||
<tRbreak>1</tRbreak>
|
||||
<tRwatch>1</tRwatch>
|
||||
<tRmem>1</tRmem>
|
||||
|
|
@ -117,106 +117,25 @@
|
|||
<pMon>Segger\JL2CM3.dll</pMon>
|
||||
</DebugOpt>
|
||||
<TargetDriverDllRegistry>
|
||||
<SetRegEntry>
|
||||
<Number>0</Number>
|
||||
<Key>UL2CM3</Key>
|
||||
<Name>UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000)</Name>
|
||||
</SetRegEntry>
|
||||
<SetRegEntry>
|
||||
<Number>0</Number>
|
||||
<Key>JL2CM3</Key>
|
||||
<Name>-U20090928 -O78 -S2 -ZTIFSpeedSel5000 -A0 -C0 -JU1 -JI127.0.0.1 -JP0 -RST0 -N00("ARM CoreSight SW-DP") -D00(0BC11477) -L00(0) -TO18 -TC10000000 -TP21 -TDS8001 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -TB1 -TFE0 -FO11 -FD20003000 -FC5000 -FN1 -FF0B6x_256kB_PY_D.FLM -FS018000000 -FL040000 -FP0($$Device:B6x$.\Flash\B6x_256kB_PY_D.FLM)</Name>
|
||||
</SetRegEntry>
|
||||
<SetRegEntry>
|
||||
<Number>0</Number>
|
||||
<Key>ARMRTXEVENTFLAGS</Key>
|
||||
<Name>-L70 -Z18 -C0 -M0 -T1</Name>
|
||||
</SetRegEntry>
|
||||
<SetRegEntry>
|
||||
<Number>0</Number>
|
||||
<Key>DLGTARM</Key>
|
||||
<Name>(1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)</Name>
|
||||
</SetRegEntry>
|
||||
<SetRegEntry>
|
||||
<Number>0</Number>
|
||||
<Key>ARMDBGFLAGS</Key>
|
||||
<Name></Name>
|
||||
<Name>-U20090928 -O78 -S2 -ZTIFSpeedSel5000 -A0 -C0 -JU1 -JI127.0.0.1 -JP0 -RST0 -N00("ARM CoreSight SW-DP") -D00(0BC11477) -L00(0) -TO18 -TC10000000 -TP21 -TDS8008 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -TB1 -TFE0 -FO31 -FD20003000 -FC5000 -FN1 -FF0B6x_256kB_PY_D.FLM -FS018000000 -FL040000 -FP0($$Device:B6x$.\Flash\B6x_256kB_PY_D.FLM)</Name>
|
||||
</SetRegEntry>
|
||||
</TargetDriverDllRegistry>
|
||||
<Breakpoint>
|
||||
<Bp>
|
||||
<Number>0</Number>
|
||||
<Type>0</Type>
|
||||
<LineNumber>0</LineNumber>
|
||||
<EnabledFlag>1</EnabledFlag>
|
||||
<Address>402735504</Address>
|
||||
<ByteObject>0</ByteObject>
|
||||
<HtxType>0</HtxType>
|
||||
<ManyObjects>0</ManyObjects>
|
||||
<SizeOfObject>0</SizeOfObject>
|
||||
<BreakByAccess>0</BreakByAccess>
|
||||
<BreakIfRCount>1</BreakIfRCount>
|
||||
<Filename></Filename>
|
||||
<ExecCommand></ExecCommand>
|
||||
<Expression>0x18014190</Expression>
|
||||
</Bp>
|
||||
<Bp>
|
||||
<Number>1</Number>
|
||||
<Type>0</Type>
|
||||
<LineNumber>0</LineNumber>
|
||||
<EnabledFlag>1</EnabledFlag>
|
||||
<Address>402735500</Address>
|
||||
<ByteObject>0</ByteObject>
|
||||
<HtxType>0</HtxType>
|
||||
<ManyObjects>0</ManyObjects>
|
||||
<SizeOfObject>0</SizeOfObject>
|
||||
<BreakByAccess>0</BreakByAccess>
|
||||
<BreakIfRCount>1</BreakIfRCount>
|
||||
<Filename></Filename>
|
||||
<ExecCommand></ExecCommand>
|
||||
<Expression>0x1801418C</Expression>
|
||||
</Bp>
|
||||
<Bp>
|
||||
<Number>2</Number>
|
||||
<Type>0</Type>
|
||||
<LineNumber>0</LineNumber>
|
||||
<EnabledFlag>1</EnabledFlag>
|
||||
<Address>402735502</Address>
|
||||
<ByteObject>0</ByteObject>
|
||||
<HtxType>0</HtxType>
|
||||
<ManyObjects>0</ManyObjects>
|
||||
<SizeOfObject>0</SizeOfObject>
|
||||
<BreakByAccess>0</BreakByAccess>
|
||||
<BreakIfRCount>1</BreakIfRCount>
|
||||
<Filename></Filename>
|
||||
<ExecCommand></ExecCommand>
|
||||
<Expression>0x1801418E</Expression>
|
||||
</Bp>
|
||||
</Breakpoint>
|
||||
<WatchWindow1>
|
||||
<Ww>
|
||||
<count>0</count>
|
||||
<WinNumber>1</WinNumber>
|
||||
<ItemText>gBleSleep</ItemText>
|
||||
</Ww>
|
||||
<Ww>
|
||||
<count>1</count>
|
||||
<WinNumber>1</WinNumber>
|
||||
<ItemText>DMA_RX_BUFF</ItemText>
|
||||
</Ww>
|
||||
</WatchWindow1>
|
||||
<Breakpoint/>
|
||||
<Tracepoint>
|
||||
<THDelay>0</THDelay>
|
||||
</Tracepoint>
|
||||
<DebugFlag>
|
||||
<trace>0</trace>
|
||||
<periodic>1</periodic>
|
||||
<aLwin>1</aLwin>
|
||||
<periodic>0</periodic>
|
||||
<aLwin>0</aLwin>
|
||||
<aCover>0</aCover>
|
||||
<aSer1>0</aSer1>
|
||||
<aSer2>0</aSer2>
|
||||
<aPa>0</aPa>
|
||||
<viewmode>1</viewmode>
|
||||
<viewmode>0</viewmode>
|
||||
<vrSel>0</vrSel>
|
||||
<aSym>0</aSym>
|
||||
<aTbox>0</aTbox>
|
||||
|
|
@ -379,8 +298,8 @@
|
|||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
<bDave2>0</bDave2>
|
||||
<PathWithFileName>..\src\app_buzzer.c</PathWithFileName>
|
||||
<FilenameWithoutPath>app_buzzer.c</FilenameWithoutPath>
|
||||
<PathWithFileName>..\src\app_bat.c</PathWithFileName>
|
||||
<FilenameWithoutPath>app_bat.c</FilenameWithoutPath>
|
||||
<RteFlg>0</RteFlg>
|
||||
<bShared>0</bShared>
|
||||
</File>
|
||||
|
|
@ -391,8 +310,68 @@
|
|||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
<bDave2>0</bDave2>
|
||||
<PathWithFileName>..\src\app_bat.c</PathWithFileName>
|
||||
<FilenameWithoutPath>app_bat.c</FilenameWithoutPath>
|
||||
<PathWithFileName>..\..\..\modules\src\CRCxx.c</PathWithFileName>
|
||||
<FilenameWithoutPath>CRCxx.c</FilenameWithoutPath>
|
||||
<RteFlg>0</RteFlg>
|
||||
<bShared>0</bShared>
|
||||
</File>
|
||||
<File>
|
||||
<GroupNumber>2</GroupNumber>
|
||||
<FileNumber>12</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
<bDave2>0</bDave2>
|
||||
<PathWithFileName>..\src\app_PAD.c</PathWithFileName>
|
||||
<FilenameWithoutPath>app_PAD.c</FilenameWithoutPath>
|
||||
<RteFlg>0</RteFlg>
|
||||
<bShared>0</bShared>
|
||||
</File>
|
||||
<File>
|
||||
<GroupNumber>2</GroupNumber>
|
||||
<FileNumber>13</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
<bDave2>0</bDave2>
|
||||
<PathWithFileName>..\src\app_Time_Event.c</PathWithFileName>
|
||||
<FilenameWithoutPath>app_Time_Event.c</FilenameWithoutPath>
|
||||
<RteFlg>0</RteFlg>
|
||||
<bShared>0</bShared>
|
||||
</File>
|
||||
<File>
|
||||
<GroupNumber>2</GroupNumber>
|
||||
<FileNumber>14</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>1</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
<bDave2>0</bDave2>
|
||||
<PathWithFileName>..\src\sys_config.c</PathWithFileName>
|
||||
<FilenameWithoutPath>sys_config.c</FilenameWithoutPath>
|
||||
<RteFlg>0</RteFlg>
|
||||
<bShared>0</bShared>
|
||||
</File>
|
||||
<File>
|
||||
<GroupNumber>2</GroupNumber>
|
||||
<FileNumber>15</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
<bDave2>0</bDave2>
|
||||
<PathWithFileName>..\src\app_ota.c</PathWithFileName>
|
||||
<FilenameWithoutPath>app_ota.c</FilenameWithoutPath>
|
||||
<RteFlg>0</RteFlg>
|
||||
<bShared>0</bShared>
|
||||
</File>
|
||||
<File>
|
||||
<GroupNumber>2</GroupNumber>
|
||||
<FileNumber>16</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
<bDave2>0</bDave2>
|
||||
<PathWithFileName>..\src\app_modbus.c</PathWithFileName>
|
||||
<FilenameWithoutPath>app_modbus.c</FilenameWithoutPath>
|
||||
<RteFlg>0</RteFlg>
|
||||
<bShared>0</bShared>
|
||||
</File>
|
||||
|
|
@ -400,13 +379,13 @@
|
|||
|
||||
<Group>
|
||||
<GroupName>drivers\src</GroupName>
|
||||
<tvExp>1</tvExp>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
<cbSel>0</cbSel>
|
||||
<RteFlg>0</RteFlg>
|
||||
<File>
|
||||
<GroupNumber>3</GroupNumber>
|
||||
<FileNumber>12</FileNumber>
|
||||
<FileNumber>17</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
|
|
@ -418,7 +397,7 @@
|
|||
</File>
|
||||
<File>
|
||||
<GroupNumber>3</GroupNumber>
|
||||
<FileNumber>13</FileNumber>
|
||||
<FileNumber>18</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
|
|
@ -430,7 +409,7 @@
|
|||
</File>
|
||||
<File>
|
||||
<GroupNumber>3</GroupNumber>
|
||||
<FileNumber>14</FileNumber>
|
||||
<FileNumber>19</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
|
|
@ -442,7 +421,7 @@
|
|||
</File>
|
||||
<File>
|
||||
<GroupNumber>3</GroupNumber>
|
||||
<FileNumber>15</FileNumber>
|
||||
<FileNumber>20</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
|
|
@ -454,7 +433,7 @@
|
|||
</File>
|
||||
<File>
|
||||
<GroupNumber>3</GroupNumber>
|
||||
<FileNumber>16</FileNumber>
|
||||
<FileNumber>21</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
|
|
@ -466,7 +445,7 @@
|
|||
</File>
|
||||
<File>
|
||||
<GroupNumber>3</GroupNumber>
|
||||
<FileNumber>17</FileNumber>
|
||||
<FileNumber>22</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
|
|
@ -478,7 +457,7 @@
|
|||
</File>
|
||||
<File>
|
||||
<GroupNumber>3</GroupNumber>
|
||||
<FileNumber>18</FileNumber>
|
||||
<FileNumber>23</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
|
|
@ -490,7 +469,7 @@
|
|||
</File>
|
||||
<File>
|
||||
<GroupNumber>3</GroupNumber>
|
||||
<FileNumber>19</FileNumber>
|
||||
<FileNumber>24</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
|
|
@ -502,7 +481,7 @@
|
|||
</File>
|
||||
<File>
|
||||
<GroupNumber>3</GroupNumber>
|
||||
<FileNumber>20</FileNumber>
|
||||
<FileNumber>25</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
|
|
@ -514,7 +493,7 @@
|
|||
</File>
|
||||
<File>
|
||||
<GroupNumber>3</GroupNumber>
|
||||
<FileNumber>21</FileNumber>
|
||||
<FileNumber>26</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
|
|
@ -526,7 +505,7 @@
|
|||
</File>
|
||||
<File>
|
||||
<GroupNumber>3</GroupNumber>
|
||||
<FileNumber>22</FileNumber>
|
||||
<FileNumber>27</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
|
|
@ -538,7 +517,7 @@
|
|||
</File>
|
||||
<File>
|
||||
<GroupNumber>3</GroupNumber>
|
||||
<FileNumber>23</FileNumber>
|
||||
<FileNumber>28</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
|
|
@ -550,7 +529,7 @@
|
|||
</File>
|
||||
<File>
|
||||
<GroupNumber>3</GroupNumber>
|
||||
<FileNumber>24</FileNumber>
|
||||
<FileNumber>29</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
|
|
@ -562,7 +541,7 @@
|
|||
</File>
|
||||
<File>
|
||||
<GroupNumber>3</GroupNumber>
|
||||
<FileNumber>25</FileNumber>
|
||||
<FileNumber>30</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
|
|
@ -574,7 +553,7 @@
|
|||
</File>
|
||||
<File>
|
||||
<GroupNumber>3</GroupNumber>
|
||||
<FileNumber>26</FileNumber>
|
||||
<FileNumber>31</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
|
|
@ -586,7 +565,7 @@
|
|||
</File>
|
||||
<File>
|
||||
<GroupNumber>3</GroupNumber>
|
||||
<FileNumber>27</FileNumber>
|
||||
<FileNumber>32</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
|
|
@ -598,7 +577,7 @@
|
|||
</File>
|
||||
<File>
|
||||
<GroupNumber>3</GroupNumber>
|
||||
<FileNumber>28</FileNumber>
|
||||
<FileNumber>33</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
|
|
@ -610,7 +589,7 @@
|
|||
</File>
|
||||
<File>
|
||||
<GroupNumber>3</GroupNumber>
|
||||
<FileNumber>29</FileNumber>
|
||||
<FileNumber>34</FileNumber>
|
||||
<FileType>4</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
|
|
@ -630,7 +609,7 @@
|
|||
<RteFlg>0</RteFlg>
|
||||
<File>
|
||||
<GroupNumber>4</GroupNumber>
|
||||
<FileNumber>30</FileNumber>
|
||||
<FileNumber>35</FileNumber>
|
||||
<FileType>5</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
|
|
@ -650,7 +629,7 @@
|
|||
<RteFlg>0</RteFlg>
|
||||
<File>
|
||||
<GroupNumber>5</GroupNumber>
|
||||
<FileNumber>31</FileNumber>
|
||||
<FileNumber>36</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
|
|
@ -670,7 +649,7 @@
|
|||
<RteFlg>0</RteFlg>
|
||||
<File>
|
||||
<GroupNumber>6</GroupNumber>
|
||||
<FileNumber>32</FileNumber>
|
||||
<FileNumber>37</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
|
|
@ -682,7 +661,7 @@
|
|||
</File>
|
||||
<File>
|
||||
<GroupNumber>6</GroupNumber>
|
||||
<FileNumber>33</FileNumber>
|
||||
<FileNumber>38</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
|
|
@ -694,7 +673,7 @@
|
|||
</File>
|
||||
<File>
|
||||
<GroupNumber>6</GroupNumber>
|
||||
<FileNumber>34</FileNumber>
|
||||
<FileNumber>39</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
|
|
@ -706,7 +685,7 @@
|
|||
</File>
|
||||
<File>
|
||||
<GroupNumber>6</GroupNumber>
|
||||
<FileNumber>35</FileNumber>
|
||||
<FileNumber>40</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
|
|
@ -718,7 +697,7 @@
|
|||
</File>
|
||||
<File>
|
||||
<GroupNumber>6</GroupNumber>
|
||||
<FileNumber>36</FileNumber>
|
||||
<FileNumber>41</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
|
|
@ -730,7 +709,7 @@
|
|||
</File>
|
||||
<File>
|
||||
<GroupNumber>6</GroupNumber>
|
||||
<FileNumber>37</FileNumber>
|
||||
<FileNumber>42</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
|
|
@ -750,7 +729,7 @@
|
|||
<RteFlg>0</RteFlg>
|
||||
<File>
|
||||
<GroupNumber>7</GroupNumber>
|
||||
<FileNumber>38</FileNumber>
|
||||
<FileNumber>43</FileNumber>
|
||||
<FileType>4</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
|
|
@ -770,7 +749,7 @@
|
|||
<RteFlg>0</RteFlg>
|
||||
<File>
|
||||
<GroupNumber>8</GroupNumber>
|
||||
<FileNumber>39</FileNumber>
|
||||
<FileNumber>44</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
|
|
@ -782,7 +761,7 @@
|
|||
</File>
|
||||
<File>
|
||||
<GroupNumber>8</GroupNumber>
|
||||
<FileNumber>40</FileNumber>
|
||||
<FileNumber>45</FileNumber>
|
||||
<FileType>1</FileType>
|
||||
<tvExp>0</tvExp>
|
||||
<tvExpOptDlg>0</tvExpOptDlg>
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@
|
|||
|
||||
<Targets>
|
||||
<Target>
|
||||
<TargetName>uartTest</TargetName>
|
||||
<TargetName>OTA</TargetName>
|
||||
<ToolsetNumber>0x4</ToolsetNumber>
|
||||
<ToolsetName>ARM-ADS</ToolsetName>
|
||||
<pCCUsed>5060750::V5.06 update 6 (build 750)::ARMCC</pCCUsed>
|
||||
|
|
@ -48,7 +48,7 @@
|
|||
<InvalidFlash>1</InvalidFlash>
|
||||
</TargetStatus>
|
||||
<OutputDirectory>.\output\</OutputDirectory>
|
||||
<OutputName>uartTest.elf</OutputName>
|
||||
<OutputName>OTA_V2_8</OutputName>
|
||||
<CreateExecutable>1</CreateExecutable>
|
||||
<CreateLib>0</CreateLib>
|
||||
<CreateHexFile>1</CreateHexFile>
|
||||
|
|
@ -79,10 +79,10 @@
|
|||
<nStopB2X>0</nStopB2X>
|
||||
</BeforeMake>
|
||||
<AfterMake>
|
||||
<RunUserProg1>1</RunUserProg1>
|
||||
<RunUserProg2>0</RunUserProg2>
|
||||
<RunUserProg1>0</RunUserProg1>
|
||||
<RunUserProg2>1</RunUserProg2>
|
||||
<UserProg1Name>fromelf.exe --bin -o "$L@L.bin" "#L"</UserProg1Name>
|
||||
<UserProg2Name></UserProg2Name>
|
||||
<UserProg2Name>powershell -executionpolicy Unrestricted -file .\link_high_bank.PS1</UserProg2Name>
|
||||
<UserProg1Dos16Mode>0</UserProg1Dos16Mode>
|
||||
<UserProg2Dos16Mode>0</UserProg2Dos16Mode>
|
||||
<nStopA1X>0</nStopA1X>
|
||||
|
|
@ -184,6 +184,8 @@
|
|||
<uocXRam>0</uocXRam>
|
||||
<RvdsVP>0</RvdsVP>
|
||||
<RvdsMve>0</RvdsMve>
|
||||
<RvdsCdeCp>0</RvdsCdeCp>
|
||||
<nBranchProt>0</nBranchProt>
|
||||
<hadIRAM2>0</hadIRAM2>
|
||||
<hadIROM2>0</hadIROM2>
|
||||
<StupSel>0</StupSel>
|
||||
|
|
@ -350,7 +352,7 @@
|
|||
<NoWarn>0</NoWarn>
|
||||
<uSurpInc>0</uSurpInc>
|
||||
<useXO>0</useXO>
|
||||
<uClangAs>0</uClangAs>
|
||||
<ClangAsOpt>4</ClangAsOpt>
|
||||
<VariousControls>
|
||||
<MiscControls>--thumb</MiscControls>
|
||||
<Define></Define>
|
||||
|
|
@ -368,7 +370,7 @@
|
|||
<TextAddressRange>0x00000000</TextAddressRange>
|
||||
<DataAddressRange>0x00000000</DataAddressRange>
|
||||
<pXoBase></pXoBase>
|
||||
<ScatterFile>..\..\..\core\mdk\link_xip.sct</ScatterFile>
|
||||
<ScatterFile>.\link_xip_0x04000.sct</ScatterFile>
|
||||
<IncludeLibs></IncludeLibs>
|
||||
<IncludeLibsPath></IncludeLibsPath>
|
||||
<Misc>--diag_suppress=L6312,L6314,L6329</Misc>
|
||||
|
|
@ -431,16 +433,41 @@
|
|||
<FileType>1</FileType>
|
||||
<FilePath>..\src\app_radar.c</FilePath>
|
||||
</File>
|
||||
<File>
|
||||
<FileName>app_buzzer.c</FileName>
|
||||
<FileType>1</FileType>
|
||||
<FilePath>..\src\app_buzzer.c</FilePath>
|
||||
</File>
|
||||
<File>
|
||||
<FileName>app_bat.c</FileName>
|
||||
<FileType>1</FileType>
|
||||
<FilePath>..\src\app_bat.c</FilePath>
|
||||
</File>
|
||||
<File>
|
||||
<FileName>CRCxx.c</FileName>
|
||||
<FileType>1</FileType>
|
||||
<FilePath>..\..\..\modules\src\CRCxx.c</FilePath>
|
||||
</File>
|
||||
<File>
|
||||
<FileName>app_PAD.c</FileName>
|
||||
<FileType>1</FileType>
|
||||
<FilePath>..\src\app_PAD.c</FilePath>
|
||||
</File>
|
||||
<File>
|
||||
<FileName>app_Time_Event.c</FileName>
|
||||
<FileType>1</FileType>
|
||||
<FilePath>..\src\app_Time_Event.c</FilePath>
|
||||
</File>
|
||||
<File>
|
||||
<FileName>sys_config.c</FileName>
|
||||
<FileType>1</FileType>
|
||||
<FilePath>..\src\sys_config.c</FilePath>
|
||||
</File>
|
||||
<File>
|
||||
<FileName>app_ota.c</FileName>
|
||||
<FileType>1</FileType>
|
||||
<FilePath>..\src\app_ota.c</FilePath>
|
||||
</File>
|
||||
<File>
|
||||
<FileName>app_modbus.c</FileName>
|
||||
<FileType>1</FileType>
|
||||
<FilePath>..\src\app_modbus.c</FilePath>
|
||||
</File>
|
||||
</Files>
|
||||
</Group>
|
||||
<Group>
|
||||
|
|
@ -628,4 +655,13 @@
|
|||
<files/>
|
||||
</RTE>
|
||||
|
||||
<LayerInfo>
|
||||
<Layers>
|
||||
<Layer>
|
||||
<LayName>zhongkong</LayName>
|
||||
<LayPrjMark>1</LayPrjMark>
|
||||
</Layer>
|
||||
</Layers>
|
||||
</LayerInfo>
|
||||
|
||||
</Project>
|
||||
|
|
|
|||
|
|
@ -0,0 +1,329 @@
|
|||
#include "b6x.h"
|
||||
#include "drvs.h"
|
||||
#include "dbg.h"
|
||||
#include "rbuf.h"
|
||||
#include "CRCxx.h"
|
||||
|
||||
#include "sys_config.h"
|
||||
|
||||
#include "app_PAD.h"
|
||||
|
||||
|
||||
// 用于PAD通信处理
|
||||
PAD_daraframe_t PAD_daraframe;
|
||||
volatile uint8_t Rec_state =0;
|
||||
volatile uint8_t Rec_data_cnt =0;
|
||||
|
||||
/*
|
||||
static void PAD_Data_Hande(void){
|
||||
uint8_t ret_data[MAX_LEN]={0,0};
|
||||
uint8_t length=0;
|
||||
|
||||
if((PAD_daraframe.cmd_id == OTA_CMD_ID) && (PAD_daraframe.reg_addr == OTA_REG_ADDR) && (PAD_daraframe.length == 18)){
|
||||
app_otas_rxd(PAD_daraframe.length ,PAD_daraframe.data);
|
||||
goto PAD_Data_Hande_end;
|
||||
}
|
||||
|
||||
switch(PAD_daraframe.reg_addr){
|
||||
case 0x01: // 写入系统配置
|
||||
if(PAD_daraframe.cmd_id == 0x06){// 写入
|
||||
write_cfg(&sys_conf);
|
||||
}
|
||||
break;
|
||||
case 0x02: // 管理员模式油门极限寄存器(Unit:%)
|
||||
if(PAD_daraframe.cmd_id == 0x03){// 读取
|
||||
// ret_data[length++] =0;
|
||||
ret_data[length++] =sys_conf.Manager_sLim;
|
||||
// if(0 == --PAD_daraframe.length){
|
||||
break;
|
||||
// }
|
||||
}else if(PAD_daraframe.cmd_id == 0x06){// 写入
|
||||
sys_conf.Manager_sLim =PAD_daraframe.data[0];
|
||||
break;
|
||||
}
|
||||
case 0x03: // 游客模式油门极限寄存器(Unit:%)
|
||||
if(PAD_daraframe.cmd_id == 0x03){// 读取
|
||||
// ret_data[length++] =0;
|
||||
ret_data[length++] =sys_conf.Tourist_sLim;
|
||||
// if(0 == --PAD_daraframe.length){
|
||||
break;
|
||||
// }
|
||||
}else if(PAD_daraframe.cmd_id == 0x06){// 写入
|
||||
sys_conf.Tourist_sLim =PAD_daraframe.data[0];
|
||||
break;
|
||||
}
|
||||
case 0x04: // 减速油门极限寄存器(Unit:%)(自动减速时油门极限)
|
||||
if(PAD_daraframe.cmd_id == 0x03){// 读取
|
||||
// ret_data[length++] =0;
|
||||
ret_data[length++] =sys_conf.Speed_Cut_sLim;
|
||||
// if(0 == --PAD_daraframe.length){
|
||||
break;
|
||||
// }
|
||||
}else if(PAD_daraframe.cmd_id == 0x06){// 写入
|
||||
sys_conf.Speed_Cut_sLim =PAD_daraframe.data[0];
|
||||
break;
|
||||
}
|
||||
case 0x05: // 刹车距离极限寄存器(前进)(Unit:mm)
|
||||
if(PAD_daraframe.cmd_id == 0x03){// 读取
|
||||
ret_data[length++] =sys_conf.Brake_DLimit & 0x00FF;
|
||||
ret_data[length++] =sys_conf.Brake_DLimit >> 8;
|
||||
// if(0 == --PAD_daraframe.length){
|
||||
break;
|
||||
// }
|
||||
}else if(PAD_daraframe.cmd_id == 0x06){// 写入
|
||||
sys_conf.Brake_DLimit =(((uint16_t)PAD_daraframe.data[1]) << 8) | PAD_daraframe.data[0];
|
||||
break;
|
||||
}
|
||||
case 0x06: // 减速距离极限寄存器(Unit:mm)
|
||||
if(PAD_daraframe.cmd_id == 0x03){// 读取
|
||||
ret_data[length++] =sys_conf.Speed_Cut_DLimit & 0x00FF;
|
||||
ret_data[length++] =sys_conf.Speed_Cut_DLimit >> 8;
|
||||
// if(0 == --PAD_daraframe.length){
|
||||
break;
|
||||
// }
|
||||
}else if(PAD_daraframe.cmd_id == 0x06){// 写入
|
||||
sys_conf.Speed_Cut_DLimit =(((uint16_t)PAD_daraframe.data[1]) << 8) | PAD_daraframe.data[0];
|
||||
break;
|
||||
}
|
||||
case 0x07: // 刹车距离极限寄存器(前进)(Unit:mm)
|
||||
if(PAD_daraframe.cmd_id == 0x03){// 读取
|
||||
ret_data[length++] =sys_conf.Brake_DLimit_B & 0x00FF;
|
||||
ret_data[length++] =sys_conf.Brake_DLimit_B >> 8;
|
||||
// if(0 == --PAD_daraframe.length){
|
||||
break;
|
||||
// }
|
||||
}else if(PAD_daraframe.cmd_id == 0x06){// 写入
|
||||
sys_conf.Brake_DLimit_B =(((uint16_t)PAD_daraframe.data[1]) << 8) | PAD_daraframe.data[0];
|
||||
break;
|
||||
}
|
||||
case 0x08: // 减速距离极限寄存器(Unit:mm)
|
||||
if(PAD_daraframe.cmd_id == 0x03){// 读取
|
||||
ret_data[length++] =sys_conf.Speed_Cut_DLimit_B & 0x00FF;
|
||||
ret_data[length++] =sys_conf.Speed_Cut_DLimit_B >> 8;
|
||||
// if(0 == --PAD_daraframe.length){
|
||||
break;
|
||||
// }
|
||||
}else if(PAD_daraframe.cmd_id == 0x06){// 写入
|
||||
sys_conf.Speed_Cut_DLimit_B = (((uint16_t)PAD_daraframe.data[1]) << 8) | PAD_daraframe.data[0];
|
||||
break;
|
||||
}
|
||||
case 0x09: //PAD模式寄存器
|
||||
if(PAD_daraframe.cmd_id == 0x03){// 读取
|
||||
// ret_data[length++] =0;
|
||||
ret_data[length++] =sys_sta.Pmode;
|
||||
// if(0 == --PAD_daraframe.length){
|
||||
break;
|
||||
// }
|
||||
}else if(PAD_daraframe.cmd_id == 0x06){// 写入
|
||||
sys_sta.Pmode = PAD_daraframe.data[0] & 0x03;//0 退出模式//1 进入游客模式//2 进入管理员模式
|
||||
break;
|
||||
}
|
||||
case 0x0A: //系统模式寄存器
|
||||
if(PAD_daraframe.cmd_id == 0x03){// 读取
|
||||
// ret_data[length++] =0;
|
||||
ret_data[length++] =sys_sta.Smode;
|
||||
// if(0 == --PAD_daraframe.length){
|
||||
break;
|
||||
// }
|
||||
}
|
||||
case 0x0B: //0 关闭12V输出//1 开启12V输出
|
||||
if(PAD_daraframe.cmd_id == 0x03){// 读取
|
||||
// ret_data[length++] =0;
|
||||
ret_data[length++] =sys_sta.O_12V;
|
||||
// if(0 == --PAD_daraframe.length){
|
||||
break;
|
||||
// }
|
||||
}else if(PAD_daraframe.cmd_id == 0x06){// 写入
|
||||
sys_sta.O_12V = PAD_daraframe.data[0] & 0x01;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
// default :
|
||||
// app_PAD_Sendcmd(PAD_daraframe.cmd_id,PAD_daraframe.reg_addr,PAD_daraframe.data,PAD_daraframe.length);
|
||||
// break;
|
||||
}
|
||||
app_PAD_Sendcmd(PAD_daraframe.cmd_id ,PAD_daraframe.reg_addr ,ret_data ,length);
|
||||
|
||||
PAD_Data_Hande_end:
|
||||
Rec_state =0;//数据处理完要清零,准备接收下一帧数据
|
||||
}
|
||||
*/
|
||||
|
||||
void app_PAD_CheckData(uint8_t *dat , uint8_t len){
|
||||
uint8_t ret_data[MAX_LEN]={0,0};
|
||||
uint8_t length=0;
|
||||
|
||||
PAD_daraframe.header = dat[0] << 8 | dat[1];
|
||||
PAD_daraframe.cmd_id = dat[2];
|
||||
PAD_daraframe.reg_addr = dat[3];
|
||||
PAD_daraframe.length = dat[4];
|
||||
if(PAD_daraframe.length > MAX_LEN){
|
||||
return;
|
||||
}
|
||||
for(uint8_t i=0;i<PAD_daraframe.length;i++){
|
||||
PAD_daraframe.data[i] = dat[5+i];
|
||||
}
|
||||
PAD_daraframe.crc = dat[5+PAD_daraframe.length];
|
||||
|
||||
if(PAD_daraframe.header == FRAME_HEADER){
|
||||
uint8_t CRC =crc8_maxim(dat ,len-1);
|
||||
if(CRC == PAD_daraframe.crc){ //CRC校验通过
|
||||
switch(PAD_daraframe.cmd_id){//cmd_id
|
||||
case 0x01: // 配置系统参数
|
||||
// uint8_t
|
||||
sys_conf.Manager_sLim= PAD_daraframe.data[0];
|
||||
sys_conf.Tourist_sLim= PAD_daraframe.data[1];
|
||||
// uint16_t
|
||||
sys_conf.Brake_DLimit= 100 * PAD_daraframe.data[2];
|
||||
sys_conf.Speed_Cut_DLimit= 100 * PAD_daraframe.data[3];
|
||||
sys_conf.Brake_DLimit_B= 100 * PAD_daraframe.data[4];
|
||||
sys_conf.Speed_Cut_DLimit_B= 100 * PAD_daraframe.data[5];
|
||||
|
||||
sys_conf.VERSION =SOFTWARE_ID; // 软件版本号
|
||||
sys_conf.Modbus_addr =D_Modbus_addr; // MODBUS地址
|
||||
sys_conf.Speed_Cut_sLim =D_Speed_Cut_sLim; // 减速油门极限
|
||||
|
||||
write_cfg(&sys_conf);
|
||||
case 0x02: // 读取系统配置
|
||||
ret_data[length++]=sys_conf.Manager_sLim;
|
||||
ret_data[length++]=sys_conf.Tourist_sLim;
|
||||
|
||||
ret_data[length++]=sys_conf.Brake_DLimit /100;
|
||||
ret_data[length++]=sys_conf.Speed_Cut_DLimit /100;
|
||||
ret_data[length++]=sys_conf.Brake_DLimit_B /100;
|
||||
ret_data[length++]=sys_conf.Speed_Cut_DLimit_B /100;
|
||||
|
||||
// app_PAD_Sendcmd(UART1_PORT,PAD_daraframe.cmd_id,0x01,ret_data,length);
|
||||
break;
|
||||
case 0x03: //写 //0 命令控制进入管理员模式//1 命令控制进入游客模式
|
||||
sys_sta.Manager =PAD_daraframe.data[0];
|
||||
sys_sta.Tourist =PAD_daraframe.data[1];
|
||||
if(1==sys_sta.Tourist && 1==sys_sta.Manager){
|
||||
sys_sta.Tourist =0;
|
||||
sys_sta.Manager =1;
|
||||
}
|
||||
ret_data[length++] =sys_sta.Manager;
|
||||
ret_data[length++] =sys_sta.Tourist;
|
||||
// app_PAD_Sendcmd(UART1_PORT,PAD_daraframe.cmd_id,0x01,PAD_daraframe.data,PAD_daraframe.length);
|
||||
break;
|
||||
case 0x04: //读 系统模式
|
||||
ret_data[length++] =sys_sta.Smode;
|
||||
break;
|
||||
case 0x05: //写 //0 关闭12V输出//1 开启12V输出
|
||||
ret_data[length++] =sys_sta.O_12V;
|
||||
break;
|
||||
case 0x06: //读 //12V输出状态
|
||||
sys_sta.O_12V = PAD_daraframe.data[0] & 0x01;
|
||||
break;
|
||||
case 0x10:
|
||||
ret_data[length++] =BAT_Message.Bat_STA; // 电池状态
|
||||
ret_data[length++] =BAT_Message.Bat_Voltage >> 8; //电池电压
|
||||
ret_data[length++] =BAT_Message.Bat_Voltage & 0xff;
|
||||
ret_data[length++] =get_in_acc_percent();// 当前油门百分比
|
||||
ret_data[length++] =radar_data.radar_id;// 雷达ID
|
||||
ret_data[length++] =radar_data.distance/100;// 雷达距离信息
|
||||
ret_data[length++] =(sys_sta.IOgps <<0) | (sys_sta.I_back <<1) | (sys_sta.I_brake <<2)
|
||||
| (sys_sta.IOmanager <<3) | (sys_sta.Manager <<4)
|
||||
| (sys_sta.Tourist <<5) | (sys_sta.A_Speed_Cut <<6) | (sys_sta.A_brake <<7);
|
||||
}
|
||||
app_PAD_Sendcmd(PAD_daraframe.cmd_id ,PAD_daraframe.reg_addr ,ret_data ,length);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
void app_PAD_Receive(uint8_t data){
|
||||
uint8_t *frame = (uint8_t *)&PAD_daraframe;
|
||||
|
||||
switch(Rec_state){
|
||||
case 0://header
|
||||
if ((data == (uint8_t)(FRAME_HEADER >> 8)) && (PAD_daraframe.header == 0x0)) {
|
||||
PAD_daraframe.header = (FRAME_HEADER >> 8);
|
||||
} else if ((data == (uint8_t)(FRAME_HEADER & 0x00FF)) && (PAD_daraframe.header == (uint8_t)(FRAME_HEADER >> 8))) {
|
||||
PAD_daraframe.header = ((uint16_t)((FRAME_HEADER << 8)|(FRAME_HEADER >> 8)));//0xA100;
|
||||
PAD_daraframe.length = 0;
|
||||
Rec_state = 1;//to cmd id
|
||||
//debug("header");
|
||||
}
|
||||
break;
|
||||
case 1://cmd_id
|
||||
//debug("rxcmd:%x", data);
|
||||
PAD_daraframe.cmd_id = data;
|
||||
Rec_state = 2;//to device addr
|
||||
break;
|
||||
case 2://reg addr
|
||||
//debug("reg_addr");
|
||||
PAD_daraframe.reg_addr = data;
|
||||
Rec_state = 3;//to data length
|
||||
break;
|
||||
case 3://data length
|
||||
//debug("length");
|
||||
PAD_daraframe.length = (data < MAX_LEN) ? data : MAX_LEN;
|
||||
if (PAD_daraframe.length == 0) {
|
||||
Rec_state = 5;//to crc
|
||||
} else {
|
||||
Rec_state = 4;//to data
|
||||
Rec_data_cnt = 0;
|
||||
}
|
||||
break;
|
||||
case 4://data
|
||||
//debug("data");
|
||||
if (Rec_data_cnt < PAD_daraframe.length) {
|
||||
PAD_daraframe.data[Rec_data_cnt++] = data;
|
||||
}
|
||||
if (Rec_data_cnt == PAD_daraframe.length) {
|
||||
Rec_data_cnt = 0;
|
||||
Rec_state = 5;//to crc
|
||||
}
|
||||
break;
|
||||
case 5://CRC8
|
||||
PAD_daraframe.crc = crc8_maxim(frame, 5 + PAD_daraframe.length);
|
||||
#if !PAD_CRC8_EN
|
||||
PAD_daraframe.crc = data;
|
||||
#endif
|
||||
//计算并验证crc8
|
||||
if (PAD_daraframe.crc == data) {
|
||||
Rec_state = 6;//to ack
|
||||
//debug("crc correct cmd:%x", PAD_daraframe.cmd_id);
|
||||
} else {
|
||||
Rec_state = 0;//to haeder
|
||||
PAD_daraframe.header = 0;
|
||||
//debug("crc error cmd:%x-%x", PAD_daraframe.cmd_id, PAD_daraframe.crc);
|
||||
}
|
||||
break;
|
||||
}
|
||||
// uart_putc(UART1_PORT,data);//debug
|
||||
// uart_putc(UART1_PORT,'0'+Rec_state);
|
||||
if(Rec_state == 6){
|
||||
PAD_daraframe.header = 0;
|
||||
Rec_state = 7;//数据处理完,需要将状态位归零,才会接收下一帧数据,即:uart1_state =0时。
|
||||
PAD_Data_Hande();
|
||||
Rec_state =0;
|
||||
}
|
||||
}
|
||||
*/
|
||||
|
||||
|
||||
//发送命令
|
||||
void app_PAD_Sendcmd(uint8_t cmd_id ,uint8_t reg_addr ,const uint8_t *data, uint8_t length){
|
||||
PAD_daraframe_t frame;
|
||||
uint8_t *cmd_data =(uint8_t *)&frame;
|
||||
uint8_t i;
|
||||
|
||||
frame.header = ((uint16_t)((FRAME_HEADER << 8)|(FRAME_HEADER >> 8)));//0xA100
|
||||
frame.cmd_id = cmd_id;
|
||||
frame.reg_addr = reg_addr;
|
||||
frame.length = length < MAX_LEN ? length:MAX_LEN;
|
||||
|
||||
for(i = 0;i < frame.length ;i ++){
|
||||
frame.data[i] = * data++;
|
||||
}
|
||||
length =5 + frame.length;
|
||||
frame.crc = crc8_maxim(cmd_data, length);
|
||||
while(length--)
|
||||
uart_putc(UART1_PORT, (uint32_t)(*cmd_data ++));
|
||||
uart_putc(UART1_PORT, (uint32_t)(frame.crc));
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -0,0 +1,40 @@
|
|||
#ifndef _APP_PAD_H_
|
||||
#define _APP_PAD_H_
|
||||
|
||||
#include <stdint.h>
|
||||
#include "uart.h"
|
||||
|
||||
//数据帧头
|
||||
#define FRAME_HEADER 0xA100
|
||||
|
||||
#define OTA_CMD_ID 0xA5
|
||||
#define OTA_REG_ADDR 0x00
|
||||
|
||||
#define MAX_LEN 32
|
||||
|
||||
//0:失能数据校验
|
||||
#define PAD_CRC8_EN 0
|
||||
|
||||
typedef struct PAD_daraframe{
|
||||
uint16_t header;//0xA100
|
||||
uint8_t cmd_id;
|
||||
uint8_t reg_addr;
|
||||
uint8_t length;
|
||||
uint8_t data[MAX_LEN];
|
||||
uint8_t crc;
|
||||
} PAD_daraframe_t;
|
||||
|
||||
|
||||
|
||||
|
||||
//初始化
|
||||
void app_uart_Init(uint8_t port, uint32_t baudrate, uint8_t io_tx, uint8_t io_rx);
|
||||
|
||||
void app_PAD_CheckData(uint8_t *dat , uint8_t len);
|
||||
|
||||
// 接收数据
|
||||
void app_PAD_Receive(uint8_t data);
|
||||
//发送命令
|
||||
void app_PAD_Sendcmd(uint8_t cmd_id ,uint8_t reg_addr ,const uint8_t *data, uint8_t length);
|
||||
|
||||
#endif
|
||||
|
|
@ -4,6 +4,16 @@
|
|||
|
||||
#include "sys_config.h"
|
||||
|
||||
#define DBG_TIME_ENEVT 0
|
||||
|
||||
#if (DBG_TIME_ENEVT)
|
||||
#include "dbg.h"
|
||||
#define DEBUG(format, ...) debug("[TR_ET]" format "\r\n", ##__VA_ARGS__)
|
||||
#else
|
||||
#define DEBUG(format, ...)
|
||||
//#define debugHex(dat, len)
|
||||
#endif
|
||||
|
||||
static Time_Events_t Time_Events[Time_Event_MAX];
|
||||
tmr_tk_t Time_Event_tmr_id;
|
||||
|
||||
|
|
@ -15,10 +25,20 @@ void Event_Handle(uint16_t Event_List ,bool isOn,void *Parameter){
|
|||
(void)Parameter;
|
||||
switch(Event_List){
|
||||
case Buzzer_Event:
|
||||
Set_Status(OUT_Buzzer,isOn);
|
||||
Set_Status(OUT_BUZZER,isOn);
|
||||
break;
|
||||
case Pmode_Timeout_Event:
|
||||
if(!isOn){
|
||||
DEBUG("Pmode_Timeout_Event\n\nERROR\n\n");
|
||||
// sys_sta.Pmode =0;
|
||||
}
|
||||
break;
|
||||
case GRB_WS2812_Event:
|
||||
if(0x01 == (sys_sta.Pmode | sys_sta.Smode)){
|
||||
GRB_WS2812_Write_color(WS2812_GRBs.len, isOn ? WS2812_GRBs.GRBs : 0x0);
|
||||
}else{
|
||||
GRB_WS2812_Write_color(WS2812_GRBs.len, isOn ? GRB_ORANGE : 0x0);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
|
||||
|
|
@ -30,7 +50,9 @@ static tmr_tk_t Time_Event_Handle(tmr_id_t id) {
|
|||
for (uint16_t i = 0; i < Time_Event_MAX; i++) {
|
||||
Time_Events_t *Events = &Time_Events[i];
|
||||
|
||||
if (Events->delay == 1) {
|
||||
if(1 < Events->delay){
|
||||
Events->delay--;
|
||||
}else if (1 == Events->delay--) {
|
||||
switch (Events->mode) {
|
||||
case Time_MODE_OFF:
|
||||
// 关闭
|
||||
|
|
@ -40,6 +62,7 @@ static tmr_tk_t Time_Event_Handle(tmr_id_t id) {
|
|||
// 打开
|
||||
Events->isOn = true;
|
||||
if(Events->Ms_delayoff){
|
||||
DEBUG("OffDelay:%d,delay:%d\n",i,Events->Ms_delayoff);
|
||||
Events->mode = Time_MODE_OFF;
|
||||
Events->delay =1 + Events->Ms_delayoff;
|
||||
Events->Ms_delayoff =0;
|
||||
|
|
@ -50,11 +73,11 @@ static tmr_tk_t Time_Event_Handle(tmr_id_t id) {
|
|||
if (Events->blinkCount > 0) {
|
||||
if (Events->isOn) {
|
||||
Events->isOn = false;
|
||||
Events->delay =1 + Events->Ms_off;
|
||||
if(0xffff != Events->blinkCount) {Events->blinkCount--;}
|
||||
Events->delay =1 + Events->Ms_off / Time_delay_interval;
|
||||
} else {
|
||||
Events->isOn = true;
|
||||
Events->delay =1 + Events->Ms_on / Time_delay_interval;
|
||||
Events->delay =1 + Events->Ms_on;
|
||||
}
|
||||
} else {
|
||||
Events->mode = Time_MODE_OFF;
|
||||
|
|
@ -63,49 +86,65 @@ static tmr_tk_t Time_Event_Handle(tmr_id_t id) {
|
|||
}
|
||||
Event_Handle(i, Events->isOn,Events->Parameter);
|
||||
}
|
||||
if(Events->delay >= 1){
|
||||
Events->delay--;
|
||||
|
||||
}
|
||||
}
|
||||
return (Time_delay_interval / 10);
|
||||
return (Time_delay_interval / 10);//1;
|
||||
}
|
||||
|
||||
void Time_Event_Init(void) {
|
||||
for (uint16_t i = 0; i < Time_Event_MAX; i++) {
|
||||
Time_Events[i].mode = Time_MODE_OFF;
|
||||
Time_Events[i].delay = 1;
|
||||
Time_Events[i].delay = 0;
|
||||
Time_Events[i].Ms_on = 0;
|
||||
Time_Events[i].Ms_off = 0;
|
||||
Time_Events[i].blinkCount = 0;
|
||||
Time_Events[i].isOn = false;
|
||||
Time_Events[i].Parameter=NULL;
|
||||
Time_Events[i].Ms_delayoff =0;
|
||||
DEBUG("Delay:%d,%dms",i, Time_Events[i].Ms_delayoff);
|
||||
}
|
||||
Time_Event_tmr_id = sftmr_start(10, Time_Event_Handle);
|
||||
}
|
||||
|
||||
void Time_Event_DelayOff(uint16_t ledIndex ,uint16_t Ms_delayoff,void *Parameter) {
|
||||
Time_Events[ledIndex].mode = Time_MODE_ON;
|
||||
Time_Events[ledIndex].delay = 1;
|
||||
Time_Events[ledIndex].Ms_delayoff =1 + Ms_delayoff;
|
||||
Time_Events[ledIndex].Parameter=Parameter;
|
||||
}
|
||||
|
||||
void Time_Event_On(uint16_t ledIndex,void *Parameter) {
|
||||
DEBUG("On:%d",ledIndex);
|
||||
Time_Events[ledIndex].mode = Time_MODE_ON;
|
||||
Time_Events[ledIndex].delay = 1;
|
||||
// Time_Events[ledIndex].Ms_delayoff =0;
|
||||
Time_Events[ledIndex].Parameter=Parameter;
|
||||
}
|
||||
|
||||
void Time_Event_Off(uint16_t ledIndex,void *Parameter) {
|
||||
DEBUG("Off:%d",ledIndex);
|
||||
Time_Events[ledIndex].mode = Time_MODE_OFF;
|
||||
Time_Events[ledIndex].delay = 1;
|
||||
// Time_Events[ledIndex].Ms_delayoff =0;
|
||||
Time_Events[ledIndex].Parameter=Parameter;
|
||||
}
|
||||
|
||||
void Time_Event_DelayOff(uint16_t ledIndex ,uint16_t Ms_delayoff,void *Parameter) {
|
||||
DEBUG("Delay:%d,%dms",ledIndex, Ms_delayoff);
|
||||
if(0 == Ms_delayoff/Time_delay_interval){return;}
|
||||
Time_Events[ledIndex].mode = Time_MODE_ON;
|
||||
Time_Events[ledIndex].delay = 1;
|
||||
Time_Events[ledIndex].Ms_delayoff =Ms_delayoff / Time_delay_interval;
|
||||
Time_Events[ledIndex].Parameter=Parameter;
|
||||
}
|
||||
|
||||
void Time_Event_Cancel_DelayOff(uint16_t ledIndex) {
|
||||
DEBUG("Cancel:%d",ledIndex);
|
||||
Time_Events[ledIndex].mode = Time_MODE_OFF;
|
||||
Time_Events[ledIndex].delay = 0;
|
||||
Time_Events[ledIndex].Ms_delayoff =0;
|
||||
Time_Events[ledIndex].Parameter =NULL;
|
||||
}
|
||||
|
||||
void Time_Event_Blink(uint16_t ledIndex, uint16_t Ms_on, uint16_t Ms_off, uint16_t blinkCount,void *Parameter) {
|
||||
DEBUG("Blink:%d,on%dms,off%dms,count%d",ledIndex, Ms_on, Ms_off, blinkCount);
|
||||
|
||||
Time_Events[ledIndex].mode = Time_MODE_BLINK;
|
||||
Time_Events[ledIndex].Ms_on = Ms_on;
|
||||
Time_Events[ledIndex].Ms_off = Ms_off;
|
||||
Time_Events[ledIndex].Ms_on = Ms_on / Time_delay_interval;
|
||||
Time_Events[ledIndex].Ms_off = Ms_off / Time_delay_interval;
|
||||
Time_Events[ledIndex].blinkCount = blinkCount;
|
||||
Time_Events[ledIndex].delay =1 + Ms_on / Time_delay_interval;
|
||||
Time_Events[ledIndex].Parameter=Parameter;
|
||||
|
|
@ -1,5 +1,5 @@
|
|||
#ifndef _APP_BUZZER_H_
|
||||
#define _APP_BUZZER_H_
|
||||
#ifndef _APP_TIME_EVENT_H_
|
||||
#define _APP_TIME_EVENT_H_
|
||||
|
||||
#define Time_delay_interval 50
|
||||
|
||||
|
|
@ -22,6 +22,7 @@ typedef struct {
|
|||
|
||||
typedef enum {
|
||||
Buzzer_Event,
|
||||
Pmode_Timeout_Event,
|
||||
GRB_WS2812_Event,
|
||||
Time_Event_MAX
|
||||
} Time_Event_List;
|
||||
|
|
@ -32,6 +33,8 @@ void Time_Event_Init(void);
|
|||
|
||||
void Time_Event_DelayOff(uint16_t ledIndex ,uint16_t Ms_delayoff, void *Parameter);
|
||||
|
||||
void Time_Event_Cancel_DelayOff(uint16_t ledIndex);
|
||||
|
||||
void Time_Event_On(uint16_t ledIndex, void *Parameter);
|
||||
|
||||
void Time_Event_Off(uint16_t ledIndex, void *Parameter);
|
||||
|
|
@ -5,19 +5,143 @@
|
|||
#include "app_bat.h"
|
||||
#include "sys_config.h"
|
||||
|
||||
#define BAT_Message_interval 1000
|
||||
#define DBG_EN 0
|
||||
|
||||
#if (DBG_EN)
|
||||
#include "dbg.h"
|
||||
#define DEBUG(format, ...) debug("[Bat]" format, ##__VA_ARGS__)
|
||||
#else
|
||||
#define DEBUG(format, ...)
|
||||
//#define debugHex(dat, len)
|
||||
#endif
|
||||
|
||||
#define BAT_Message_interval 100
|
||||
|
||||
tmr_id_t BAT_Message_tmr_id;
|
||||
BAT_Message_t BAT_Message;
|
||||
uint16_t Bat_Voltage_Last;
|
||||
uint16_t Voltage_lag_count;
|
||||
|
||||
uint8_t Bat_STA_Last;
|
||||
|
||||
// 门锁状态更新标志
|
||||
bool GRB_Door_lock_updata=0;
|
||||
uint8_t Bat_STA_Last;
|
||||
uint16_t Voltage_lag_count;
|
||||
uint16_t Voltage_update_count;
|
||||
float temp_bat_voltage=0;
|
||||
// uint16_t Bat_Voltage_Last;
|
||||
|
||||
// uint8_t bat_str[50]={0,0},bat_str_len=0;
|
||||
|
||||
|
||||
const uint16_t coulomp_voltage_table[11] = {
|
||||
BAT_LEVEL_0PERCENT_VOLT,
|
||||
BAT_LEVEL_10PERCENT_VOLT,
|
||||
BAT_LEVEL_20PERCENT_VOLT,
|
||||
BAT_LEVEL_30PERCENT_VOLT,
|
||||
BAT_LEVEL_40PERCENT_VOLT,
|
||||
BAT_LEVEL_50PERCENT_VOLT,
|
||||
BAT_LEVEL_60PERCENT_VOLT,
|
||||
BAT_LEVEL_70PERCENT_VOLT,
|
||||
BAT_LEVEL_80PERCENT_VOLT,
|
||||
BAT_LEVEL_90PERCENT_VOLT,
|
||||
BAT_LEVEL_100PERCENT_VOLT,
|
||||
};
|
||||
|
||||
uint8_t pmu_voltage_to_percent(uint32_t volt){//电压转百分比
|
||||
uint8_t i, percent;
|
||||
float step, base;
|
||||
if((volt < coulomp_voltage_table[0])){
|
||||
return 0;
|
||||
}
|
||||
if((volt >= coulomp_voltage_table[10])){
|
||||
return 100;
|
||||
}
|
||||
|
||||
for (i = 0; i < 10; i++) {
|
||||
if((volt < coulomp_voltage_table[i+1]) && (volt >= coulomp_voltage_table[i])){
|
||||
step = (coulomp_voltage_table[i+1] - coulomp_voltage_table[i]) / 10.0;
|
||||
base = coulomp_voltage_table[i];
|
||||
percent = (10 * i) + (volt - base) / step;
|
||||
DEBUG("\n\ni:%d,volt:%d,step:%02.2f,base:%02.2f,percent:%d\n\n",i,volt,step,base,percent);
|
||||
return (uint8_t)percent;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
uint8_t LED_control =0,LED_control_last =0;
|
||||
|
||||
static tmr_tk_t BAT_Message_Handle(tmr_id_t id) {
|
||||
uint16_t in_acc_percent= get_in_acc_percent();
|
||||
|
||||
if(BAT_Message.Runing_Time < 0xFFFF){
|
||||
BAT_Message.Runing_Time++;
|
||||
}
|
||||
|
||||
temp_bat_voltage += get_bat_voltage() * 10;
|
||||
|
||||
Voltage_update_count++;
|
||||
if(Voltage_update_count >= (1000/BAT_Message_interval)){//1s
|
||||
BAT_Message.Bat_Voltage = temp_bat_voltage / Voltage_update_count;
|
||||
Voltage_update_count=0;
|
||||
temp_bat_voltage = 0;
|
||||
}
|
||||
// in_acc_percent =80;
|
||||
if(in_acc_percent >= 80){ // 油门大于80%时,
|
||||
if(BAT_Message.Deep_ACC_Time < 0xFFFF){
|
||||
BAT_Message.Deep_ACC_Time++;
|
||||
}
|
||||
Voltage_lag_count++;
|
||||
if(Voltage_lag_count >= (2000/BAT_Message_interval)){//2s
|
||||
Voltage_lag_count=0;
|
||||
BAT_Message.Bat_Percent = pmu_voltage_to_percent(BAT_Message.Bat_Voltage);
|
||||
}
|
||||
if(BAT_Message.Bat_Percent < 12){
|
||||
BAT_Message.Bat_Low_Volt_count++;
|
||||
}
|
||||
}else{
|
||||
Voltage_lag_count=0;
|
||||
}
|
||||
|
||||
|
||||
if(BAT_Message.Bat_Percent < 7){
|
||||
BAT_Message.Bat_STA =(BAT_Message.Bat_STA & 0xE0)|Bat_Low_STA;
|
||||
WS2812_GRBs.GRBs=GRB_RED;
|
||||
}else if(BAT_Message.Bat_Percent < 30){ // 7~30%
|
||||
BAT_Message.Bat_STA =(BAT_Message.Bat_STA & 0xE0)|Bat_30_STA;
|
||||
WS2812_GRBs.GRBs=GRB_RED;
|
||||
}else if(BAT_Message.Bat_Percent < 60){ // 30~60%
|
||||
BAT_Message.Bat_STA =(BAT_Message.Bat_STA & 0xE0)|Bat_60_STA;
|
||||
WS2812_GRBs.GRBs=GRB_BLUE;
|
||||
}else if(BAT_Message.Bat_Percent < 80){ // 60~80%
|
||||
BAT_Message.Bat_STA =(BAT_Message.Bat_STA & 0xE0)|Bat_80_STA;
|
||||
WS2812_GRBs.GRBs=GRB_WHITE;
|
||||
}else{
|
||||
BAT_Message.Bat_STA =(BAT_Message.Bat_STA & 0xE0)|Bat_100_STA;
|
||||
WS2812_GRBs.GRBs=GRB_WHITE;
|
||||
}
|
||||
|
||||
if((Bat_STA_Last != BAT_Message.Bat_STA) || (GRB_Door_lock_updata != Get_Status(OUT_Door_lock)) || (LED_control != LED_control_last)){
|
||||
GRB_Door_lock_updata=Get_Status(OUT_Door_lock);
|
||||
LED_control_last =LED_control;
|
||||
Bat_STA_Last =BAT_Message.Bat_STA;
|
||||
if( Get_Status(OUT_Door_lock) || (LED_control != 0)){
|
||||
if(BAT_Message.Bat_STA & Bat_Charge_STA){
|
||||
Time_Event_Blink(GRB_WS2812_Event,500,500,0xffff,NULL);
|
||||
}else{
|
||||
if(BAT_Message.Bat_STA & Bat_Low_STA){
|
||||
Time_Event_Blink(GRB_WS2812_Event,200,200,0xffff,NULL);
|
||||
}else{
|
||||
Time_Event_Blink(GRB_WS2812_Event,500,500,0xffff,NULL);
|
||||
}
|
||||
}
|
||||
}else{
|
||||
Time_Event_Off(GRB_WS2812_Event,NULL);
|
||||
}
|
||||
}
|
||||
DEBUG("\n\nSTA:0x%#X,V:%d,%d %%,Run:%d,D_A:%d\n\n",BAT_Message.Bat_STA,BAT_Message.Bat_Voltage,BAT_Message.Bat_Percent,BAT_Message.Runing_Time,BAT_Message.Deep_ACC_Time);
|
||||
return (BAT_Message_interval / 10);
|
||||
}
|
||||
|
||||
/*
|
||||
static tmr_tk_t BAT_Message_Handle(tmr_id_t id) {
|
||||
uint16_t Bat_Voltage = get_bat_voltage() * 10;
|
||||
|
||||
|
|
@ -33,10 +157,10 @@ static tmr_tk_t BAT_Message_Handle(tmr_id_t id) {
|
|||
WS2812_GRBs.GRBs=GRB_BLUE;
|
||||
}else if(Bat_Percent_100 > Bat_Voltage){
|
||||
BAT_Message.Bat_STA =(BAT_Message.Bat_STA & 0x03)|Bat_100_STA;
|
||||
WS2812_GRBs.GRBs=GRB_GREEN;
|
||||
WS2812_GRBs.GRBs=GRB_WHITE;
|
||||
}else{
|
||||
BAT_Message.Bat_STA =(BAT_Message.Bat_STA & 0xF3)|Bat_Full_STA;
|
||||
WS2812_GRBs.GRBs=GRB_GREEN;
|
||||
WS2812_GRBs.GRBs=GRB_WHITE;
|
||||
}
|
||||
if(0==(BAT_Message.Bat_STA & Bat_Charge_STA)){
|
||||
Bat_Voltage_Last =Bat_Voltage;
|
||||
|
|
@ -74,7 +198,8 @@ static tmr_tk_t BAT_Message_Handle(tmr_id_t id) {
|
|||
Bat_STA_Last =BAT_Message.Bat_STA;
|
||||
if( Get_Status(OUT_Door_lock)){
|
||||
if(BAT_Message.Bat_STA & Bat_Charge_STA){
|
||||
Time_Event_On(GRB_WS2812_Event,NULL);
|
||||
// Time_Event_On(GRB_WS2812_Event,NULL);
|
||||
Time_Event_Blink(GRB_WS2812_Event,500,500,0xffff,NULL);
|
||||
}else if(BAT_Message.Bat_STA & Bat_Low_STA){
|
||||
Time_Event_Blink(GRB_WS2812_Event,150,150,0xffff,NULL);
|
||||
}else{
|
||||
|
|
@ -83,15 +208,19 @@ static tmr_tk_t BAT_Message_Handle(tmr_id_t id) {
|
|||
}else{
|
||||
Time_Event_Off(GRB_WS2812_Event,NULL);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
BAT_Message.Bat_Voltage =Bat_Voltage;
|
||||
|
||||
return (BAT_Message_interval / 10);
|
||||
}
|
||||
*/
|
||||
|
||||
void BAT_Message_Init(void) {
|
||||
BAT_Message_tmr_id = sftmr_start(10, BAT_Message_Handle);
|
||||
Bat_Voltage_Last =get_bat_voltage() * 10;
|
||||
BAT_Message.Bat_Voltage = get_bat_voltage() * 10;
|
||||
BAT_Message.Bat_Percent = pmu_voltage_to_percent(BAT_Message.Bat_Voltage);
|
||||
BAT_Message.Runing_Time = 0;
|
||||
BAT_Message.Deep_ACC_Time = 0;
|
||||
BAT_Message.Bat_STA = 0;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,37 +1,61 @@
|
|||
#ifndef _APP_BAT_H_
|
||||
#define _APP_BAT_H_
|
||||
|
||||
|
||||
#define BAT_SxP1 4 // 电池四串一并
|
||||
#define BAT_VOLT(_Volt) (_Volt * BAT_SxP1) //电压单位转换
|
||||
#define BAT_Low_VOLT BAT_VOLT(105) //10.5V x 4 = 42V
|
||||
#define BAT_Full_VOLT BAT_VOLT(144) //14.4V x 4 = 57.6V
|
||||
|
||||
// #define BAT_LEVEL_0PERCENT_VOLT BAT_VOLT(105) // 0%:(105~110]=(42.0V~44.0V]
|
||||
// #define BAT_LEVEL_10PERCENT_VOLT BAT_VOLT(113) // 10%:(110~113]=(44.0V~45.2V]
|
||||
// #define BAT_LEVEL_20PERCENT_VOLT BAT_VOLT(116) // 20%:(113~116]=(45.2V~46.4V]
|
||||
// #define BAT_LEVEL_30PERCENT_VOLT BAT_VOLT(119) // 30%:(116~119]=(46.4V~47.6V]
|
||||
// #define BAT_LEVEL_40PERCENT_VOLT BAT_VOLT(122) // 40%:(119~122]=(47.6V~48.8V]
|
||||
// #define BAT_LEVEL_50PERCENT_VOLT BAT_VOLT(125) // 50%:(122~125]=(48.8V~50.0V]
|
||||
// #define BAT_LEVEL_60PERCENT_VOLT BAT_VOLT(128) // 60%:(125~128]=(50.0V~51.2V]
|
||||
// #define BAT_LEVEL_70PERCENT_VOLT BAT_VOLT(131) // 70%:(128~131]=(51.2V~52.4V]
|
||||
// #define BAT_LEVEL_80PERCENT_VOLT BAT_VOLT(134) // 80%:(131~134]=(52.4V~53.6V]
|
||||
// #define BAT_LEVEL_90PERCENT_VOLT BAT_VOLT(137) // 90%:(134~137]=(53.6V~54.8V]
|
||||
// #define BAT_LEVEL_100PERCENT_VOLT BAT_VOLT(144) //100%:(137~144]=(54.8V~57.6V]
|
||||
|
||||
// 内阻 20mΩ * 4 =80mΩ // 线损 10A 0.1V
|
||||
|
||||
#define BAT_LEVEL_0PERCENT_VOLT BAT_VOLT(105) // 0%
|
||||
#define BAT_LEVEL_10PERCENT_VOLT BAT_VOLT(107) // 10%
|
||||
#define BAT_LEVEL_20PERCENT_VOLT BAT_VOLT(109) // 20%
|
||||
#define BAT_LEVEL_30PERCENT_VOLT BAT_VOLT(111) // 30%
|
||||
#define BAT_LEVEL_40PERCENT_VOLT BAT_VOLT(113) // 40%
|
||||
#define BAT_LEVEL_50PERCENT_VOLT BAT_VOLT(115) // 50%
|
||||
#define BAT_LEVEL_60PERCENT_VOLT BAT_VOLT(117) // 60%
|
||||
#define BAT_LEVEL_70PERCENT_VOLT BAT_VOLT(119) // 70%
|
||||
#define BAT_LEVEL_80PERCENT_VOLT BAT_VOLT(123) // 80%
|
||||
#define BAT_LEVEL_90PERCENT_VOLT BAT_VOLT(127) // 90%
|
||||
#define BAT_LEVEL_100PERCENT_VOLT BAT_VOLT(134) //100%
|
||||
|
||||
|
||||
// 充电状态
|
||||
typedef enum {
|
||||
Bat_NotCharge_STA=0x01,
|
||||
Bat_Charge_STA=0x02,
|
||||
Bat_Full_STA=0x04,
|
||||
Bat_Low_STA=0x08,
|
||||
Bat_30_STA=0x10,
|
||||
Bat_60_STA=0x20,
|
||||
Bat_100_STA=0x40,
|
||||
Bat_Low_STA=(1<<0),
|
||||
Bat_30_STA=(1<<1),
|
||||
Bat_60_STA=(1<<2),
|
||||
Bat_80_STA=(1<<3),
|
||||
Bat_100_STA=(1<<4),
|
||||
Bat_NotCharge_STA=(1<<5),
|
||||
Bat_Charge_STA=(1<<6),
|
||||
} BAT_STA_t;
|
||||
|
||||
typedef enum {
|
||||
Bat_Percent_Low =420,
|
||||
Bat_Percent_30 =454,
|
||||
Bat_Percent_60 =489,
|
||||
Bat_Percent_100 =535,
|
||||
} BAT_Percent_t;
|
||||
|
||||
// typedef enum {
|
||||
// Bat_Percent_Low =240,
|
||||
// Bat_Percent_30 =260,
|
||||
// Bat_Percent_60 =300,
|
||||
// Bat_Percent_100 =350,
|
||||
// } BAT_Percent_t;
|
||||
|
||||
typedef struct BAT_Message{
|
||||
uint8_t Bat_STA;
|
||||
uint8_t Bat_Percent; // 42=42%
|
||||
uint8_t Bat_Low_Volt_count; // 低压计数
|
||||
uint16_t Bat_Voltage; // 480=48.0V
|
||||
uint16_t Runing_Time; // 系统运行时间
|
||||
uint16_t Deep_ACC_Time; // 深踩油门时间
|
||||
} BAT_Message_t;
|
||||
|
||||
|
||||
uint8_t pmu_voltage_to_percent(uint32_t volt); // 电压转百分比
|
||||
void BAT_Message_Init(void);
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -28,10 +28,10 @@ void sess_cb_rxd(uint8_t conidx, uint16_t len, const uint8_t *data)
|
|||
|
||||
// app_set_speed(*(int8_t *)(&data[2]));
|
||||
|
||||
Set_Status(OUT_High_brake,(0x01 & (data[1] >> 0)));
|
||||
Set_Status(OUT_Low_brake,(0x01 & (data[1] >> 1)));
|
||||
Set_Status(IO_BACK,(0x01 & (data[1] >> 0)));
|
||||
Set_Status(IO_BRAKE,(0x01 & (data[1] >> 1)));
|
||||
|
||||
Set_Status(OUT_Low_speed,(0x01 & (data[1] >> 4)));
|
||||
// Set_Status(OUT_Low_speed,(0x01 & (data[1] >> 4)));
|
||||
Set_Status(OUT_Door_lock,(0x01 & (data[1] >> 5)));
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -5,40 +5,50 @@
|
|||
#include "sys_config.h"
|
||||
#include "stdio.h"
|
||||
|
||||
#include "app_control_out.h"
|
||||
|
||||
#define DBG_CONTROL_EN 1
|
||||
|
||||
#if (DBG_CONTROL_EN)
|
||||
#include "dbg.h"
|
||||
#define DEBUG(format, ...) debug("[control]" format "\r\n", ##__VA_ARGS__)
|
||||
#else
|
||||
#define DEBUG(format, ...)
|
||||
#define debugHex(dat, len)
|
||||
#endif
|
||||
|
||||
|
||||
uint16_t ACC_Dmin ;
|
||||
uint16_t ACC_Dmax ;
|
||||
|
||||
//管理员模式速度极限
|
||||
uint8_t M_mode_sLim =M_DEFAULT_sLim;
|
||||
//游客模式速度极限
|
||||
uint8_t U_mode_sLim =U_DEFAULT_sLim;
|
||||
|
||||
// 使能电平
|
||||
bool app_control_en[PA_MAX]={
|
||||
[IN_GPS] =OE_LOW, // GPS输入0 /边沿触发/L:低使能(反)
|
||||
[IN_Back] =OE_LOW, // 倒车 /边沿触发
|
||||
[IN_Brake] =OE_LOW, // 制动 /边沿触发
|
||||
[IN_Manager_Mode] =OE_LOW, // 管理员模式 /边沿触发
|
||||
|
||||
[OUT_Buzzer] =OE_HIGH, // 蜂鸣器 /H:高使能
|
||||
[OUT_Low_speed] =OE_HIGH, // 使能低速档位 /L:低使能(反)
|
||||
[OUT_Back_car] =OE_HIGH, // 使能倒车 /L:低使能倒车(反)
|
||||
[OUT_Low_brake] =OE_HIGH, // 使能低制动 /L:低使能(反)
|
||||
[OUT_High_brake] =OE_LOW, // 使能高制动 /H:高使能(反)
|
||||
[OUT_12V_Control] =OE_HIGH, // 12V电源控制输出 /H:12V输出
|
||||
[OUT_Door_lock] =OE_HIGH, // 开锁 /H:开锁(同)
|
||||
};
|
||||
[IO_MANAGER_MODE] =OE_LOW, // 管理员模式 /低电平触发
|
||||
[IO_BACK] =OE_LOW, // 倒车 /H:前进/L:后退
|
||||
[IO_AUTO_BRAKE] =OE_HIGH, // 自动刹车 /H:高使能
|
||||
[IO_BRAKE] =OE_LOW, // 制动 /L:低使能
|
||||
|
||||
[IO_TTL_TX] =OE_LOW, // 串口发送
|
||||
[IO_TTL_RX] =OE_LOW, // 串口接收
|
||||
|
||||
[OUT_BUZZER] =OE_HIGH, // 蜂鸣器输出 /H:蜂鸣器响
|
||||
[IO_INTERACTION] =OE_LOW, // 交互信号输入 (人体感应器) /L:低电平触发
|
||||
};
|
||||
sys_sta_t sys_sta;
|
||||
|
||||
// 油门控制输入初始化/PA08/CH3
|
||||
// 电池电压检测/充电检测/PA04/CH7
|
||||
static void acc_in_bat_in_sadc_init(void)
|
||||
{
|
||||
// Analog Enable
|
||||
GPIO_DIR_CLR(GPIO08 | GPIO04);
|
||||
GPIO_DIR_CLR(GPIO08 | GPIO04 | GPIO02);
|
||||
|
||||
// ADC
|
||||
iom_ctrl(PA04, IOM_ANALOG);//BAT//AIN3//电池电量
|
||||
iom_ctrl(PA08, IOM_ANALOG);//ACC//AIN7//油门
|
||||
// iom_ctrl(PA02, IOM_ANALOG);//ACC_FEEDBACK//AIN2//油门反馈
|
||||
iom_ctrl(PA04, IOM_ANALOG);//BAT//AIN3//电池电量
|
||||
|
||||
// sadc init
|
||||
#if SADC_VREF==VREF_VDD
|
||||
|
|
@ -73,20 +83,22 @@ static void acc_in_bat_in_sadc_init(void)
|
|||
|
||||
// 获取油门输入信号原始ADC值
|
||||
uint16_t get_in_acc_raw(void){
|
||||
return (sadc_read(SADC_CH_AIN7, 0));
|
||||
return (sadc_read(ACC_IN_CH, 0));
|
||||
}
|
||||
|
||||
// 获取油门输入电压信号(unit:mV)
|
||||
uint16_t get_in_acc_voltage(void){
|
||||
return ((((SADC_VREF * sadc_read(SADC_CH_AIN7, 3))/1024)/ACC_DOWN_Res)*(ACC_UP_Res+ACC_DOWN_Res));
|
||||
return ((((SADC_VREF * sadc_read(ACC_IN_CH, 3)) / 1024) / ACC_DOWN_Res) * (ACC_UP_Res + ACC_DOWN_Res));
|
||||
}
|
||||
|
||||
// 获取输入油门百分比(unit:%)(踏板信号)
|
||||
uint16_t get_in_acc_percent(void){
|
||||
uint16_t acc_voltage =get_in_acc_voltage();
|
||||
if(900 > acc_voltage) {return 0;}
|
||||
else if(3800 < acc_voltage){return 100;}
|
||||
else{
|
||||
if(900 > acc_voltage) {
|
||||
return 0;
|
||||
}else if(3800 < acc_voltage){
|
||||
return 100;
|
||||
}else{
|
||||
return ((acc_voltage-900)/29);
|
||||
// return (100*(acc_voltage - 900)/(3800-900));
|
||||
}
|
||||
|
|
@ -94,7 +106,7 @@ uint16_t get_in_acc_percent(void){
|
|||
|
||||
// 获取电池电压值(unit:V)
|
||||
float get_bat_voltage(void){
|
||||
return (((((SADC_VREF / 1000.0) * sadc_read(SADC_CH_AIN3, 3))/1024.0)/BAT_DOWN_Res)*(BAT_UP_Res+BAT_DOWN_Res));
|
||||
return (((((SADC_VREF / 1000.0) * sadc_read(BAT_IN_CH, 3))/1024.0)/BAT_DOWN_Res)*(BAT_UP_Res+BAT_DOWN_Res));
|
||||
}
|
||||
|
||||
// 油门调节输出初始化/PWM4/PA05
|
||||
|
|
@ -121,44 +133,70 @@ void set_out_acc_percent(uint8_t percent){
|
|||
|
||||
//中控控制IO初始化
|
||||
void app_control_init(void){
|
||||
// out
|
||||
gpio_dir_output(OUT_Door_lock,OE_LOW);// 默认锁车
|
||||
gpio_dir_output(OUT_Low_speed,OE_LOW);// 低速档位,默认失能
|
||||
gpio_dir_output(OUT_Back_car,OE_LOW);// 默认前进模式
|
||||
gpio_dir_output(OUT_Low_brake,OE_LOW);// 默认关低制动
|
||||
gpio_dir_output(OUT_High_brake,OE_HIGH);// 默认关高制动
|
||||
gpio_dir_output(OUT_Buzzer,OE_LOW);// 默认关蜂鸣器
|
||||
//in
|
||||
gpio_dir_input(OUT_Door_lock,IE_DOWN);// 默认锁车
|
||||
gpio_dir_input(OUT_Low_speed,IE_DOWN);// 低速档位,默认失能
|
||||
gpio_dir_input(OUT_Back_car,IE_DOWN);// 默认前进模式
|
||||
gpio_dir_input(OUT_Low_brake,IE_DOWN);// 默认关低制动
|
||||
gpio_dir_input(OUT_High_brake,IE_UP);// 默认关高制动
|
||||
gpio_dir_input(OUT_Buzzer,IE_DOWN);// 默认关蜂鸣器
|
||||
// IO init
|
||||
gpio_dir_output(OUT_12V_Control,OE_LOW);// 12V电源控制输出 /H:12V输出
|
||||
gpio_dir_input(OUT_12V_Control,IE_UP);
|
||||
gpio_dir_output(OUT_Door_lock,OE_LOW); // 电门锁 /H:开锁
|
||||
gpio_dir_input(OUT_Door_lock,IE_UP);
|
||||
|
||||
gpio_dir_output(IO_MANAGER_MODE,OE_HIGH);// 管理员模式 /边沿触发
|
||||
gpio_dir_input(IO_MANAGER_MODE,IE_UP);
|
||||
|
||||
gpio_dir_output(IO_BACK,OE_HIGH);// 倒车 /H:前进/L:后退
|
||||
gpio_dir_input(IO_BACK,IE_UP);
|
||||
|
||||
gpio_dir_output(IO_AUTO_BRAKE,OE_HIGH); // 自动刹车 /H:高使能
|
||||
gpio_dir_input(IO_AUTO_BRAKE,IE_UP);
|
||||
gpio_dir_output(IO_BRAKE,OE_LOW); // 制动 /L:低使能
|
||||
gpio_dir_input(IO_BRAKE,IE_UP);
|
||||
|
||||
gpio_dir_input(IO_TTL_TX,IE_UP); // 串口发送
|
||||
gpio_dir_input(IO_TTL_RX,IE_UP); // 串口接收
|
||||
|
||||
gpio_dir_output(OUT_BUZZER,OE_LOW); // 蜂鸣器输出
|
||||
|
||||
gpio_dir_output(IO_INTERACTION,OE_HIGH);
|
||||
gpio_dir_input(IO_INTERACTION,IE_UP); // 交互信号输入 (人体感应器)
|
||||
|
||||
//默认都失能
|
||||
Set_Status(OUT_12V_Control,0);
|
||||
Set_Status(OUT_Door_lock,0);
|
||||
Set_Status(OUT_Low_speed,0);
|
||||
Set_Status(OUT_Back_car,0); //失能倒车
|
||||
Set_Status(OUT_Low_brake,0);
|
||||
Set_Status(OUT_High_brake,0);
|
||||
Set_Status(OUT_Buzzer,0);
|
||||
|
||||
// in
|
||||
gpio_dir_input(IN_GPS, IE_UP); // Input enable, pull-up
|
||||
gpio_dir_input(IN_Back, IE_UP);
|
||||
gpio_dir_input(IN_Brake, IE_UP);
|
||||
gpio_dir_input(IN_Manager_Mode, IE_UP);
|
||||
|
||||
Set_Status(IO_AUTO_BRAKE,0);
|
||||
Set_Status(IO_BRAKE,0);
|
||||
Set_Status(OUT_BUZZER,0);
|
||||
// // EXTI config
|
||||
// exti_init(EXTI_DBC(15, 4));
|
||||
// exti_set(EXTI_FTS, EXTI_SRC(IN_GPS) | EXTI_SRC(IN_Back) | EXTI_SRC(IN_Brake) | EXTI_SRC(IN_Manager_Mode)); // falling
|
||||
// exti_set(EXTI_DBE, EXTI_SRC(IN_GPS) | EXTI_SRC(IN_Back) | EXTI_SRC(IN_Brake) | EXTI_SRC(IN_Manager_Mode));
|
||||
// exti_set(EXTI_IER, EXTI_SRC(IN_GPS) | EXTI_SRC(IN_Back) | EXTI_SRC(IN_Brake) | EXTI_SRC(IN_Manager_Mode));
|
||||
// exti_set(EXTI_FTS, EXTI_SRC(IO_INTERACTION) | EXTI_SRC(IO_BACK) | EXTI_SRC(IO_BRAKE) | EXTI_SRC(IO_MANAGER_MODE)); // falling
|
||||
// exti_set(EXTI_DBE, EXTI_SRC(IO_INTERACTION) | EXTI_SRC(IO_BACK) | EXTI_SRC(IO_BRAKE) | EXTI_SRC(IO_MANAGER_MODE));
|
||||
// exti_set(EXTI_IER, EXTI_SRC(IO_INTERACTION) | EXTI_SRC(IO_BACK) | EXTI_SRC(IO_BRAKE) | EXTI_SRC(IO_MANAGER_MODE));
|
||||
|
||||
// IRQ enable
|
||||
// NVIC_EnableIRQ(EXTI_IRQn);
|
||||
|
||||
// sys_sta.Pmode = 0;
|
||||
sys_sta.Manager =0;
|
||||
sys_sta.Tourist =0;
|
||||
// sys_sta.Smode = 0;
|
||||
sys_sta.IOgps = 0;
|
||||
sys_sta.IOmanager = Get_Status(IO_MANAGER_MODE);
|
||||
|
||||
sys_sta.I_interaction = Get_Status(IO_INTERACTION);
|
||||
sys_sta.A_brake = Get_Status(IO_AUTO_BRAKE);
|
||||
sys_sta.I_back = Get_Status(IO_BACK);
|
||||
sys_sta.I_brake = Get_Status(IO_BRAKE);
|
||||
sys_sta.A_Speed_Cut = 0;
|
||||
sys_sta.O_lock = 0;
|
||||
sys_sta.P_Radar_EN =1;
|
||||
sys_sta.Reserve0 = 0;
|
||||
|
||||
sys_sta.IO_TX = Get_Status(IO_TTL_TX);
|
||||
sys_sta.IO_RX = Get_Status(IO_TTL_RX);
|
||||
sys_sta.O_12V = 0;
|
||||
sys_sta.Reserve1 = 0;
|
||||
|
||||
DEBUG("sys_sta_t:lenght=%d",sizeof(sys_sta));
|
||||
DEBUG("sys_sta_t=%#04X",*(uint16_t*)&sys_sta);
|
||||
|
||||
acc_in_bat_in_sadc_init();
|
||||
acc_out_pwm_init();
|
||||
|
||||
|
|
@ -170,56 +208,69 @@ void EXTI_IRQHandler(void)
|
|||
{
|
||||
uint32_t irq_sta = EXTI->RIF.Word;
|
||||
|
||||
if (irq_sta & EXTI_SRC(IN_GPS))//
|
||||
if (irq_sta & EXTI_SRC(IO_INTERACTION))//
|
||||
{
|
||||
EXTI->ICR.Word = EXTI_SRC(IN_GPS);
|
||||
EXTI->ICR.Word = EXTI_SRC(IO_INTERACTION);
|
||||
|
||||
}
|
||||
|
||||
if (irq_sta & EXTI_SRC(IN_Back))
|
||||
if (irq_sta & EXTI_SRC(IO_BACK))
|
||||
{
|
||||
EXTI->ICR.Word = EXTI_SRC(IN_Back);
|
||||
EXTI->ICR.Word = EXTI_SRC(IO_BACK);
|
||||
|
||||
}
|
||||
|
||||
if (irq_sta & EXTI_SRC(IN_Brake))
|
||||
if (irq_sta & EXTI_SRC(IO_BRAKE))
|
||||
{
|
||||
EXTI->ICR.Word = EXTI_SRC(IN_Brake);
|
||||
EXTI->ICR.Word = EXTI_SRC(IO_BRAKE);
|
||||
|
||||
}
|
||||
|
||||
if (irq_sta & EXTI_SRC(IN_Manager_Mode))
|
||||
if (irq_sta & EXTI_SRC(IO_MANAGER_MODE))
|
||||
{
|
||||
EXTI->ICR.Word = EXTI_SRC(IN_Manager_Mode);
|
||||
EXTI->ICR.Word = EXTI_SRC(IO_MANAGER_MODE);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
// PAD控制进入管理员模式
|
||||
bool PAD_Manager_Mode=0;
|
||||
// PAD控制进入游客模式
|
||||
bool PAD_User_Mode=0;
|
||||
// 系统自动刹车
|
||||
bool SYS_AUTO_brake=0;
|
||||
// 系统自动减速
|
||||
bool SYS_AUTO_Speed_Cut=0;
|
||||
|
||||
// 控制进程,定时调用
|
||||
void Control_procedure(void){
|
||||
|
||||
//电门锁
|
||||
Set_Status(OUT_Door_lock,(PAD_User_Mode || PAD_Manager_Mode || Get_Status(IN_GPS) || Get_Status(IN_Manager_Mode)));
|
||||
// sys_sta.Smode = 0;
|
||||
sys_sta.IOgps = 0; //更新GPS状态
|
||||
sys_sta.IOmanager = Get_Status(IO_MANAGER_MODE); //更新管理员模式状态
|
||||
sys_sta.O_lock = (0 != (sys_sta.Pmode | sys_sta.Smode));
|
||||
Set_Status(OUT_Door_lock, sys_sta.O_lock);
|
||||
|
||||
//12V电源
|
||||
Set_Status(OUT_12V_Control ,sys_sta.O_12V);// 更新12V电源状态
|
||||
|
||||
// 倒车
|
||||
Set_Status(OUT_Back_car,Get_Status(IN_Back));
|
||||
// 刹车
|
||||
Set_Status(OUT_Low_brake,(Get_Status(IN_Brake) || SYS_AUTO_brake));
|
||||
Set_Status(OUT_High_brake,(Get_Status(IN_Brake) || SYS_AUTO_brake));
|
||||
Set_Status(IO_AUTO_BRAKE ,sys_sta.A_brake);// 高刹车
|
||||
Set_Status(IO_BRAKE ,sys_sta.A_brake);// 低刹车
|
||||
sys_sta.I_brake = Get_Status(IO_BRAKE); //更新刹车状态// 输出为高电平时,可读取外部刹车状态
|
||||
|
||||
sys_sta.I_interaction = Get_Status(IO_INTERACTION);
|
||||
sys_sta.I_back = Get_Status(IO_BACK);
|
||||
sys_sta.IO_TX = Get_Status(IO_TTL_TX);
|
||||
sys_sta.IO_RX = Get_Status(IO_TTL_RX);
|
||||
// GRB_WS2812_Write_color(64, 0xffffff);
|
||||
//油门控制
|
||||
if(Get_Status(OUT_Door_lock)){
|
||||
set_out_acc_percent((SYS_AUTO_Speed_Cut?0.5:1)*get_in_acc_percent()*((PAD_Manager_Mode || Get_Status(IN_Manager_Mode)) ? sys_conf_info.M_mode_sLim : sys_conf_info.U_mode_sLim) / 100.0);
|
||||
if(0 != (sys_sta.Pmode | sys_sta.Smode)){
|
||||
uint8_t acc_percent =0;
|
||||
if(0x01 == (sys_sta.Pmode | sys_sta.Smode)){//游客模式
|
||||
if(sys_sta.A_Speed_Cut){//自动减速
|
||||
acc_percent = (get_in_acc_percent() * sys_conf.Speed_Cut_sLim) / 100.0;
|
||||
}else{
|
||||
acc_percent = (get_in_acc_percent() * sys_conf.Tourist_sLim) / 100.0;
|
||||
}
|
||||
}else{//管理员模式
|
||||
// Time_Event_Blink(GRB_WS2812_Event,500,500,0xffff,NULL);
|
||||
acc_percent = (get_in_acc_percent() * sys_conf.Manager_sLim) / 100.0;
|
||||
}
|
||||
set_out_acc_percent(acc_percent);
|
||||
}else{
|
||||
// Time_Event_Off(GRB_WS2812_Event,NULL);
|
||||
set_out_acc_percent(0);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -20,39 +20,94 @@ extern uint16_t ACC_Dmax ;
|
|||
|
||||
#define ACC_PERCENT(s) (ACC_Dmin + ((ACC_Dmax - ACC_Dmin)*(s))/100)
|
||||
|
||||
|
||||
// GPIO的输出需反向
|
||||
enum app_control{
|
||||
IN_GPS =PA09, // GPS输入0 /边沿触发
|
||||
IN_Back =PA10, // 倒车 /边沿触发
|
||||
IN_Brake =PA11, // 制动 /边沿触发
|
||||
IN_Manager_Mode =PA12, // 管理员模式 /边沿触发
|
||||
|
||||
OUT_Buzzer =PA13, // 蜂鸣器 /H:高使能
|
||||
OUT_Low_speed =PA14, // 低速档位 /L:低使能
|
||||
OUT_Back_car =PA15, // 前进后退 /H:前进/L:后退
|
||||
OUT_Low_brake =PA16, // 低制动 /L:低使能
|
||||
OUT_High_brake =PA17, // 高制动 /H:低使能
|
||||
OUT_Door_lock =PA18, // 电门锁 /H:开锁
|
||||
enum app_adc_dac_chx{
|
||||
ACC_IN_CH =SADC_CH_AIN7, // 油门输入
|
||||
BAT_IN_CH =SADC_CH_AIN3, // 电池输入
|
||||
};
|
||||
|
||||
|
||||
extern bool app_control_en[PA_MAX];
|
||||
enum app_control{
|
||||
OUT_12V_Control =PA17, // 12V电源控制输出 /H:12V输出
|
||||
OUT_Door_lock =PA18, // 电门锁 /H:开锁
|
||||
IO_MANAGER_MODE =PA13, // 管理员模式 /边沿触发
|
||||
IO_BACK =PA14, // 倒车 /H:前进/L:后退
|
||||
IO_AUTO_BRAKE =PA03, // 高制动 /高:高使能
|
||||
IO_BRAKE =PA15, // 低制动 /L:低使能
|
||||
|
||||
// PAD控制进入管理员模式
|
||||
extern bool PAD_Manager_Mode;
|
||||
// PAD控制进入游客模式
|
||||
extern bool PAD_User_Mode;
|
||||
// 系统自动刹车
|
||||
extern bool SYS_AUTO_brake;
|
||||
// 系统自动减速
|
||||
extern bool SYS_AUTO_Speed_Cut;
|
||||
IO_TTL_TX =PA11, // 串口发送
|
||||
IO_TTL_RX =PA12, // 串口接收
|
||||
|
||||
RADAR_TXD0 =PA06, // 串口0发送
|
||||
RADAR_RXD0 =PA07, // 串口0接收
|
||||
PAD_TXD1 =PA10, // 串口1发送
|
||||
PAD_RXD1 =PA09, // 串口1接收
|
||||
|
||||
ACC_PA8_ADC7 =PA08, // 油门输入
|
||||
PWM4_DAC =PA05, // 油门输出
|
||||
|
||||
RGB_DATA_IO =PA16, // RGB数据输出
|
||||
|
||||
BAT_PA4_ADC3 =PA04, // 电池电压输入
|
||||
|
||||
OUT_BUZZER =PA19, // 蜂鸣器输出
|
||||
IO_INTERACTION =PA02, // 交互信号输入 (人体感应器)
|
||||
};
|
||||
|
||||
typedef struct sys_sta{
|
||||
// uint16_t Pmode:2;
|
||||
union{
|
||||
uint8_t Pmode;
|
||||
struct{
|
||||
uint8_t Tourist:1;
|
||||
uint8_t Manager:1;
|
||||
uint8_t RES_0:6;
|
||||
};
|
||||
};
|
||||
union{
|
||||
uint8_t Smode;
|
||||
struct{
|
||||
uint8_t IOgps:1;
|
||||
uint8_t IOmanager:1;
|
||||
uint8_t RES_1:6;
|
||||
};
|
||||
};
|
||||
union{// 输入状态
|
||||
uint8_t I_STA:8;
|
||||
struct{
|
||||
uint8_t I_interaction :1; // 交互信号(人体感应器)输入状态
|
||||
uint8_t I_brake :1; // 制动信号输入状态
|
||||
uint8_t I_back :1; // 倒车信号输入状态
|
||||
uint8_t A_brake :1; // 自动刹车状态
|
||||
uint8_t A_Speed_Cut :1; // 自动减速状态
|
||||
uint8_t O_lock :1; // 电门锁输出状态
|
||||
uint8_t P_Radar_EN :1; // PAD雷达输出使能状态
|
||||
uint8_t Reserve0:1;
|
||||
};
|
||||
};
|
||||
union{// 输入输出状态
|
||||
uint8_t IO_STA:8;
|
||||
struct{
|
||||
uint8_t IO_TX :1;
|
||||
uint8_t IO_RX :1;
|
||||
uint8_t O_12V :1; // 12V电源输出状态
|
||||
uint8_t Reserve1:5;
|
||||
};
|
||||
};
|
||||
} sys_sta_t;
|
||||
|
||||
extern sys_sta_t sys_sta;
|
||||
|
||||
|
||||
extern bool app_control_en[PA_MAX];
|
||||
|
||||
// 写1使能,写0失能
|
||||
#define Set_Status(pad,activity) (gpio_put(pad, ((0 == activity) ? !app_control_en[pad] : app_control_en[pad])))
|
||||
// 获取状态 1使能,0失能
|
||||
#define Get_Status(pad) ((app_control_en[pad] == gpio_get(pad)) ? 1 : 0)
|
||||
|
||||
#define SYS_Manager_STA Get_Status(IO_MANAGER_MODE) //管理员输入状态
|
||||
#define SYS_Back_STA Get_Status(IO_BACK) //倒车状态
|
||||
#define SYS_Brake_STA Get_Status(IO_BRAKE) //制动状态
|
||||
|
||||
//中控控制IO初始化
|
||||
void app_control_init(void);
|
||||
|
|
|
|||
|
|
@ -0,0 +1,573 @@
|
|||
#include "b6x.h"
|
||||
#include "drvs.h"
|
||||
#include "dbg.h"
|
||||
#include "sftmr.h"
|
||||
|
||||
#include "app_modbus.h"
|
||||
#include "CRCxx.h"
|
||||
#include "app_ota.h"
|
||||
#include "sys_config.h"
|
||||
|
||||
#define ModbusCRC16_EN 1
|
||||
|
||||
#define DEBUG_MODBUS 1
|
||||
|
||||
#if DEBUG_MODBUS
|
||||
#define DEBUG(fmt, args...) debug("[modbus]" fmt, ##args)
|
||||
#else
|
||||
#define DEBUG(fmt, args...)
|
||||
#endif
|
||||
|
||||
#define MODBUS_MAX_LEN 64
|
||||
|
||||
static uint8_t MODBUS_ReceCount =0;
|
||||
static uint8_t MODBUS_Rece_BUF[MODBUS_MAX_LEN];
|
||||
static uint8_t MODBUS_Sent_BUF[MODBUS_MAX_LEN];
|
||||
|
||||
bool app_modbus_CheckData(uint8_t *dat , uint8_t len);
|
||||
|
||||
|
||||
//发送数据并计算CRC
|
||||
void app_modbus_SendData(uint8_t *dat ,uint8_t len){
|
||||
if(0 == len){
|
||||
return;
|
||||
}
|
||||
uint16_t CRC16=crc16_modbus(dat ,len);
|
||||
|
||||
dat[len++] =CRC16 & 0xff;// CRC低字节在前
|
||||
dat[len++] =CRC16 >> 8;
|
||||
|
||||
uart_send(UART1_PORT ,len ,dat);
|
||||
while(len){//清空发送数据缓存
|
||||
dat[--len] =0;
|
||||
}
|
||||
}
|
||||
|
||||
// 01 功能码
|
||||
void FunctionalCode_01(uint16_t reg_addr){//ID寄存器地址//返回7字节
|
||||
uint8_t len_count=0;
|
||||
|
||||
// DEBUG("FuncCode_01:0x%X\n",reg_addr);
|
||||
|
||||
MODBUS_Sent_BUF[len_count++] =MODBUS_ADDR;
|
||||
MODBUS_Sent_BUF[len_count++] =0x01;
|
||||
switch(reg_addr){
|
||||
case 0x0005:
|
||||
|
||||
break;
|
||||
default:
|
||||
len_count =0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
extern uint8_t LED_control;
|
||||
|
||||
// 03 功能码 # 读 - 保持寄存器
|
||||
// 06 功能码 # 写 - 单个寄存器
|
||||
void FunctionalCode_03_06(uint8_t CMDCode, uint16_t reg_addr , uint16_t reg_val_num){//寄存器地址//返回8字节或15字节
|
||||
|
||||
uint8_t len_count=0;
|
||||
|
||||
// DEBUG("FuncCode_03:0x%X\n",reg_addr);
|
||||
|
||||
MODBUS_Sent_BUF[len_count++] =MODBUS_ADDR;
|
||||
MODBUS_Sent_BUF[len_count++] =CMDCode;
|
||||
if(CMDCode == 0x03){//寄存器个数计数
|
||||
MODBUS_Sent_BUF[2] =0;
|
||||
len_count++;
|
||||
}else if(CMDCode == 0x06){
|
||||
MODBUS_Sent_BUF[len_count++] =(reg_addr >> 8) & 0xff;
|
||||
MODBUS_Sent_BUF[len_count++] =reg_addr & 0xff;
|
||||
}
|
||||
|
||||
switch(reg_addr){
|
||||
case 0x0001: // 设备的 Modbus地址
|
||||
if(CMDCode == 0x03){
|
||||
MODBUS_Sent_BUF[len_count++] =0x00;
|
||||
MODBUS_Sent_BUF[len_count++] =MODBUS_ADDR & 0xff;
|
||||
MODBUS_Sent_BUF[2] +=2;
|
||||
if(0 == --reg_val_num){
|
||||
break;
|
||||
}
|
||||
}else if(CMDCode == 0x06){
|
||||
MODBUS_ADDR =reg_val_num & 0xff;
|
||||
MODBUS_Sent_BUF[len_count++] =MODBUS_ADDR >> 8;
|
||||
MODBUS_Sent_BUF[len_count++] =MODBUS_ADDR & 0xff;
|
||||
break;
|
||||
}
|
||||
case 0x0002: // 设备的软件版本号
|
||||
if(CMDCode == 0x03){
|
||||
MODBUS_Sent_BUF[len_count++] =(sys_conf.VERSION | VER_TYPE) >> 8;
|
||||
MODBUS_Sent_BUF[len_count++] =(sys_conf.VERSION | VER_TYPE) & 0xff;
|
||||
MODBUS_Sent_BUF[2] +=2;
|
||||
if(0 == --reg_val_num){
|
||||
break;
|
||||
}
|
||||
}else if(CMDCode == 0x06){
|
||||
len_count =0;
|
||||
// sys_conf.VERSION =reg_val_num;
|
||||
// MODBUS_Sent_BUF[len_count++] =sys_conf.VERSION >> 8;
|
||||
// MODBUS_Sent_BUF[len_count++] =sys_conf.VERSION & 0xff;
|
||||
break;
|
||||
}
|
||||
case 0x0003: // 系统自检(只读)
|
||||
if(CMDCode == 0x03){
|
||||
uint16_t sys_sta=0;
|
||||
MODBUS_Sent_BUF[len_count++] =sys_sta >> 8;
|
||||
MODBUS_Sent_BUF[len_count++] =sys_sta & 0xff;
|
||||
MODBUS_Sent_BUF[2] +=2;
|
||||
if(0 == --reg_val_num){
|
||||
break;
|
||||
}
|
||||
}else if(CMDCode == 0x06){
|
||||
len_count =0;
|
||||
// sys_conf.VERSION =reg_val_num;
|
||||
// MODBUS_Sent_BUF[len_count++] =sys_conf.VERSION >> 8;
|
||||
// MODBUS_Sent_BUF[len_count++] =sys_conf.VERSION & 0xff;
|
||||
break;
|
||||
}
|
||||
{ // 0x0101-0x0002
|
||||
case 0x0101: // // 写系统配置
|
||||
if(CMDCode == 0x03){ // # 读 - 保持寄存器
|
||||
len_count =0;
|
||||
break;
|
||||
}else if(CMDCode == 0x06){ // # 写 - 单个寄存器
|
||||
write_cfg(&sys_conf); //保存写入配置
|
||||
MODBUS_Sent_BUF[len_count++] =reg_val_num >> 8;
|
||||
MODBUS_Sent_BUF[len_count++] =reg_val_num & 0xff;
|
||||
break;
|
||||
}
|
||||
case 0x0102: // 管理员模式油门极限寄存器(Unit:%)
|
||||
if(CMDCode == 0x03){
|
||||
MODBUS_Sent_BUF[len_count++] =sys_conf.Manager_sLim >> 8;
|
||||
MODBUS_Sent_BUF[len_count++] =sys_conf.Manager_sLim & 0xff;
|
||||
MODBUS_Sent_BUF[2] +=2;
|
||||
if(0 == --reg_val_num){
|
||||
break;
|
||||
}
|
||||
}else if(CMDCode == 0x06){
|
||||
sys_conf.Manager_sLim =reg_val_num > 100 ? 100 : reg_val_num;
|
||||
MODBUS_Sent_BUF[len_count++] =sys_conf.Manager_sLim >> 8;
|
||||
MODBUS_Sent_BUF[len_count++] =sys_conf.Manager_sLim & 0xff;
|
||||
break;
|
||||
}
|
||||
case 0x0103: // 游客模式油门极限寄存器(Unit:%)
|
||||
if(CMDCode == 0x03){
|
||||
MODBUS_Sent_BUF[len_count++] =sys_conf.Tourist_sLim >> 8;
|
||||
MODBUS_Sent_BUF[len_count++] =sys_conf.Tourist_sLim & 0xff;
|
||||
MODBUS_Sent_BUF[2] +=2;
|
||||
if(0 == --reg_val_num){
|
||||
break;
|
||||
}
|
||||
}else if(CMDCode == 0x06){
|
||||
sys_conf.Tourist_sLim =reg_val_num > 100 ? 100 : reg_val_num;
|
||||
MODBUS_Sent_BUF[len_count++] =sys_conf.Tourist_sLim >> 8;
|
||||
MODBUS_Sent_BUF[len_count++] =sys_conf.Tourist_sLim & 0xff;
|
||||
break;
|
||||
}
|
||||
case 0x0104: // 减速油门极限寄存器(Unit:%)(自动减速时油门极限)
|
||||
if(CMDCode == 0x03){
|
||||
MODBUS_Sent_BUF[len_count++] =sys_conf.Speed_Cut_sLim >> 8;
|
||||
MODBUS_Sent_BUF[len_count++] =sys_conf.Speed_Cut_sLim & 0xff;
|
||||
MODBUS_Sent_BUF[2] +=2;
|
||||
if(0 == --reg_val_num){
|
||||
break;
|
||||
}
|
||||
}else if(CMDCode == 0x06){
|
||||
sys_conf.Speed_Cut_sLim =reg_val_num > 100 ? 100 : reg_val_num;
|
||||
MODBUS_Sent_BUF[len_count++] =sys_conf.Speed_Cut_sLim >> 8;
|
||||
MODBUS_Sent_BUF[len_count++] =sys_conf.Speed_Cut_sLim & 0xff;
|
||||
break;
|
||||
}
|
||||
case 0x0105: // 刹车距离寄存器(前进)(Unit:mm)
|
||||
if(CMDCode == 0x03){
|
||||
MODBUS_Sent_BUF[len_count++] =sys_conf.Brake_DLimit >> 8;
|
||||
MODBUS_Sent_BUF[len_count++] =sys_conf.Brake_DLimit & 0xff;
|
||||
MODBUS_Sent_BUF[2] +=2;
|
||||
if(0 == --reg_val_num){
|
||||
break;
|
||||
}
|
||||
}else if(CMDCode == 0x06){
|
||||
sys_conf.Brake_DLimit =reg_val_num>4500 ? 4500 : reg_val_num;
|
||||
MODBUS_Sent_BUF[len_count++] =sys_conf.Brake_DLimit >> 8;
|
||||
MODBUS_Sent_BUF[len_count++] =sys_conf.Brake_DLimit & 0xff;
|
||||
break;
|
||||
}
|
||||
case 0x0106: // 减速距离寄存器(Unit:mm)
|
||||
if(CMDCode == 0x03){
|
||||
MODBUS_Sent_BUF[len_count++] =sys_conf.Speed_Cut_DLimit >> 8;
|
||||
MODBUS_Sent_BUF[len_count++] =sys_conf.Speed_Cut_DLimit & 0xff;
|
||||
MODBUS_Sent_BUF[2] +=2;
|
||||
if(0 == --reg_val_num){
|
||||
break;
|
||||
}
|
||||
}else if(CMDCode == 0x06){
|
||||
sys_conf.Speed_Cut_DLimit =reg_val_num>4500 ? 4500 : reg_val_num;
|
||||
MODBUS_Sent_BUF[len_count++] =sys_conf.Speed_Cut_DLimit >> 8;
|
||||
MODBUS_Sent_BUF[len_count++] =sys_conf.Speed_Cut_DLimit & 0xff;
|
||||
break;
|
||||
}
|
||||
case 0x0107: // 刹车距离极限寄存器(后退)(Unit:mm)
|
||||
if(CMDCode == 0x03){
|
||||
MODBUS_Sent_BUF[len_count++] =sys_conf.Brake_DLimit_B >> 8;
|
||||
MODBUS_Sent_BUF[len_count++] =sys_conf.Brake_DLimit_B & 0xff;
|
||||
MODBUS_Sent_BUF[2] +=2;
|
||||
if(0 == --reg_val_num){
|
||||
break;
|
||||
}
|
||||
}else if(CMDCode == 0x06){
|
||||
sys_conf.Brake_DLimit_B =reg_val_num>4500 ? 4500 : reg_val_num;
|
||||
MODBUS_Sent_BUF[len_count++] =sys_conf.Brake_DLimit_B >> 8;
|
||||
MODBUS_Sent_BUF[len_count++] =sys_conf.Brake_DLimit_B & 0xff;
|
||||
break;
|
||||
}
|
||||
case 0x0108: // 减速距离极限寄存器(Unit:mm)
|
||||
if(CMDCode == 0x03){
|
||||
MODBUS_Sent_BUF[len_count++] =sys_conf.Speed_Cut_DLimit_B >> 8;
|
||||
MODBUS_Sent_BUF[len_count++] =sys_conf.Speed_Cut_DLimit_B & 0xff;
|
||||
MODBUS_Sent_BUF[2] +=2;
|
||||
if(0 == --reg_val_num){
|
||||
break;
|
||||
}
|
||||
}else if(CMDCode == 0x06){
|
||||
sys_conf.Speed_Cut_DLimit_B =reg_val_num>4500 ? 4500 : reg_val_num;
|
||||
MODBUS_Sent_BUF[len_count++] =sys_conf.Speed_Cut_DLimit_B >> 8;
|
||||
MODBUS_Sent_BUF[len_count++] =sys_conf.Speed_Cut_DLimit_B & 0xff;
|
||||
break;
|
||||
}
|
||||
}
|
||||
{ // 0x0109-0x010D
|
||||
case 0x0201: //PAD模式寄存器
|
||||
if(CMDCode == 0x03){
|
||||
MODBUS_Sent_BUF[len_count++] =0;
|
||||
MODBUS_Sent_BUF[len_count++] =sys_sta.Pmode & 0xff;
|
||||
MODBUS_Sent_BUF[2] +=2;
|
||||
if(0 == --reg_val_num){
|
||||
break;
|
||||
}
|
||||
}else if(CMDCode == 0x06){
|
||||
// uint8_t Pmode_Timeout =((reg_val_num >> 8) & 0xff);
|
||||
// if(0 == Pmode_Timeout){
|
||||
// Time_Event_Cancel_DelayOff(Pmode_Timeout_Event);
|
||||
// }else{
|
||||
// if(Pmode_Timeout > 65){
|
||||
// Pmode_Timeout =65;
|
||||
// }
|
||||
// Time_Event_DelayOff(Pmode_Timeout_Event ,1000 * Pmode_Timeout ,NULL);
|
||||
// }
|
||||
sys_sta.Pmode =reg_val_num & 0x03;
|
||||
LED_control = (0 ==(reg_val_num & 0x80))?0:1;
|
||||
MODBUS_Sent_BUF[len_count++] =reg_val_num >> 8;
|
||||
MODBUS_Sent_BUF[len_count++] =sys_sta.Pmode & 0xff;
|
||||
break;
|
||||
}
|
||||
case 0x0202: //系统模式寄存器(只读)
|
||||
if(CMDCode == 0x03){
|
||||
MODBUS_Sent_BUF[len_count++] =0;
|
||||
MODBUS_Sent_BUF[len_count++] =sys_sta.Smode & 0xff;
|
||||
MODBUS_Sent_BUF[2] +=2;
|
||||
if(0 == --reg_val_num){
|
||||
break;
|
||||
}
|
||||
}else if(CMDCode == 0x06){
|
||||
len_count =0;
|
||||
// sys_sta.Smode =reg_val_num & 0xff;
|
||||
// MODBUS_Sent_BUF[len_count++] =sys_sta.Smode >> 8;
|
||||
// MODBUS_Sent_BUF[len_count++] =sys_sta.Smode & 0xff;
|
||||
break;
|
||||
}
|
||||
case 0x0203: //输入输出状态寄存器
|
||||
if(CMDCode == 0x03){
|
||||
MODBUS_Sent_BUF[len_count++] =sys_sta.IO_STA >> 8;
|
||||
MODBUS_Sent_BUF[len_count++] =sys_sta.IO_STA & 0xff;
|
||||
MODBUS_Sent_BUF[2] +=2;
|
||||
if(0 == --reg_val_num){
|
||||
break;
|
||||
}
|
||||
}else if(CMDCode == 0x06){// 输入输出状态寄存器可写
|
||||
// sys_sta.I_STA =reg_val_num & 0xff;//输入寄存器不可写
|
||||
sys_sta.IO_STA =reg_val_num & 0xff;
|
||||
MODBUS_Sent_BUF[len_count++] =sys_sta.IO_STA >> 8;
|
||||
MODBUS_Sent_BUF[len_count++] =sys_sta.IO_STA & 0xff;
|
||||
break;
|
||||
}
|
||||
case 0x0204: //输入状态寄存器
|
||||
if(CMDCode == 0x03){
|
||||
MODBUS_Sent_BUF[len_count++] =sys_sta.I_STA >> 8;
|
||||
MODBUS_Sent_BUF[len_count++] =sys_sta.I_STA & 0xff;
|
||||
MODBUS_Sent_BUF[2] +=2;
|
||||
if(0 == --reg_val_num){
|
||||
break;
|
||||
}
|
||||
}else if(CMDCode == 0x06){
|
||||
// sys_sta.I_STA =reg_val_num & 0xff;//输入寄存器不可写
|
||||
MODBUS_Sent_BUF[len_count++] =sys_sta.I_STA >> 8;
|
||||
MODBUS_Sent_BUF[len_count++] =sys_sta.I_STA & 0xff;
|
||||
break;
|
||||
}
|
||||
case 0x0205: //0 关闭12V输出//1 开启12V输出
|
||||
if(CMDCode == 0x03){
|
||||
MODBUS_Sent_BUF[len_count++] =sys_sta.O_12V >> 8;
|
||||
MODBUS_Sent_BUF[len_count++] =sys_sta.O_12V & 0xff;
|
||||
MODBUS_Sent_BUF[2] +=2;
|
||||
if(0 == --reg_val_num){
|
||||
break;
|
||||
}
|
||||
}else if(CMDCode == 0x06){
|
||||
sys_sta.O_12V =reg_val_num ? 1 : 0;
|
||||
MODBUS_Sent_BUF[len_count++] =sys_sta.O_12V >> 8;
|
||||
MODBUS_Sent_BUF[len_count++] =sys_sta.O_12V & 0xff;
|
||||
break;
|
||||
}
|
||||
case 0x0206: //0 关闭游客雷达//1 开启游客雷达
|
||||
if(CMDCode == 0x03){
|
||||
MODBUS_Sent_BUF[len_count++] =sys_sta.P_Radar_EN >> 8;
|
||||
MODBUS_Sent_BUF[len_count++] =sys_sta.P_Radar_EN & 0xff;
|
||||
MODBUS_Sent_BUF[2] +=2;
|
||||
if(0 == --reg_val_num){
|
||||
break;
|
||||
}
|
||||
}else if(CMDCode == 0x06){
|
||||
sys_sta.P_Radar_EN =reg_val_num ? 1 : 0;
|
||||
MODBUS_Sent_BUF[len_count++] =sys_sta.P_Radar_EN >> 8;
|
||||
MODBUS_Sent_BUF[len_count++] =sys_sta.P_Radar_EN & 0xff;
|
||||
break;
|
||||
}
|
||||
}
|
||||
{ // 0x0201-0x0203
|
||||
case 0x0301: // 电池状态及电量信息
|
||||
if(CMDCode == 0x03){
|
||||
MODBUS_Sent_BUF[len_count++] =BAT_Message.Bat_STA;
|
||||
MODBUS_Sent_BUF[len_count++] =BAT_Message.Bat_Percent;
|
||||
MODBUS_Sent_BUF[2] +=2;
|
||||
if(0 == --reg_val_num){
|
||||
break;
|
||||
}
|
||||
}else if(CMDCode == 0x06){
|
||||
BAT_Message.Bat_Voltage = get_bat_voltage() * 10;
|
||||
BAT_Message.Bat_Percent = pmu_voltage_to_percent(BAT_Message.Bat_Voltage);
|
||||
MODBUS_Sent_BUF[len_count++] =BAT_Message.Bat_STA;
|
||||
MODBUS_Sent_BUF[len_count++] =BAT_Message.Bat_Percent;
|
||||
break;
|
||||
}
|
||||
case 0x0302: // 电池电压
|
||||
if(CMDCode == 0x03){
|
||||
MODBUS_Sent_BUF[len_count++] =BAT_Message.Bat_Voltage >> 8;
|
||||
MODBUS_Sent_BUF[len_count++] =BAT_Message.Bat_Voltage & 0xff;
|
||||
MODBUS_Sent_BUF[2] +=2;
|
||||
if(0 == --reg_val_num){
|
||||
break;
|
||||
}
|
||||
}else if(CMDCode == 0x06){
|
||||
len_count =0;
|
||||
break;
|
||||
}
|
||||
case 0x0303: // 系统运行时间
|
||||
if(CMDCode == 0x03){
|
||||
MODBUS_Sent_BUF[len_count++] =BAT_Message.Runing_Time >> 8;
|
||||
MODBUS_Sent_BUF[len_count++] =BAT_Message.Runing_Time & 0xff;
|
||||
MODBUS_Sent_BUF[2] +=2;
|
||||
if(0 == --reg_val_num){
|
||||
break;
|
||||
}
|
||||
}else if(CMDCode == 0x06){
|
||||
BAT_Message.Runing_Time =0;
|
||||
MODBUS_Sent_BUF[len_count++] =BAT_Message.Runing_Time >> 8;
|
||||
MODBUS_Sent_BUF[len_count++] =BAT_Message.Runing_Time & 0xff;
|
||||
break;
|
||||
}
|
||||
case 0x0304: // 深踩油门时间
|
||||
if(CMDCode == 0x03){
|
||||
MODBUS_Sent_BUF[len_count++] =BAT_Message.Deep_ACC_Time >> 8;
|
||||
MODBUS_Sent_BUF[len_count++] =BAT_Message.Deep_ACC_Time & 0xff;
|
||||
MODBUS_Sent_BUF[2] +=2;
|
||||
if(0 == --reg_val_num){
|
||||
break;
|
||||
}
|
||||
}else if(CMDCode == 0x06){
|
||||
BAT_Message.Deep_ACC_Time =0;
|
||||
MODBUS_Sent_BUF[len_count++] =BAT_Message.Deep_ACC_Time >> 8;
|
||||
MODBUS_Sent_BUF[len_count++] =BAT_Message.Deep_ACC_Time & 0xff;
|
||||
break;
|
||||
}
|
||||
case 0x0305: // 低压计数
|
||||
if(CMDCode == 0x03){
|
||||
MODBUS_Sent_BUF[len_count++] =BAT_Message.Bat_Low_Volt_count >> 8;
|
||||
MODBUS_Sent_BUF[len_count++] =BAT_Message.Bat_Low_Volt_count & 0xff;
|
||||
MODBUS_Sent_BUF[2] +=2;
|
||||
if(0 == --reg_val_num){
|
||||
break;
|
||||
}
|
||||
}else if(CMDCode == 0x06){
|
||||
len_count =0;
|
||||
break;
|
||||
}
|
||||
case 0x0306: // 当前油门百分比
|
||||
if(CMDCode == 0x03){
|
||||
uint16_t in_acc_percent= get_in_acc_percent();
|
||||
MODBUS_Sent_BUF[len_count++] =in_acc_percent >> 8;
|
||||
MODBUS_Sent_BUF[len_count++] =in_acc_percent & 0xff;
|
||||
MODBUS_Sent_BUF[2] +=2;
|
||||
if(0 == --reg_val_num){
|
||||
break;
|
||||
}
|
||||
}else if(CMDCode == 0x06){
|
||||
len_count =0;
|
||||
break;
|
||||
}
|
||||
case 0x0307: // 雷达距离信息
|
||||
if(CMDCode == 0x03){
|
||||
MODBUS_Sent_BUF[len_count++] =radar_data.distance >> 8;
|
||||
MODBUS_Sent_BUF[len_count++] =radar_data.distance & 0xff;
|
||||
MODBUS_Sent_BUF[2] +=2;
|
||||
if(0 == --reg_val_num){
|
||||
break;
|
||||
}
|
||||
}else if(CMDCode == 0x06){
|
||||
len_count =0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
default:
|
||||
len_count =0;
|
||||
break;
|
||||
}
|
||||
if(len_count == 0){
|
||||
return;
|
||||
}
|
||||
app_modbus_SendData(MODBUS_Sent_BUF ,len_count);
|
||||
}
|
||||
|
||||
bool app_modbus_CheckData(uint8_t *dat , uint8_t len){//检查数据
|
||||
uint16_t CRC16;
|
||||
|
||||
// DEBUG("len:%d\n",len);
|
||||
if(len > 8){
|
||||
len = 8;
|
||||
}
|
||||
|
||||
if(dat[0] ==MODBUS_ADDR || dat[0] == 0xff){//验证从机地址
|
||||
CRC16 =crc16_modbus(dat ,len-2);//计算CRC
|
||||
DEBUG("CRC16:0x%X\n",CRC16);
|
||||
#if !ModbusCRC16_EN
|
||||
CRC16 =((uint16_t)(dat[len-1])<<8) + dat[len-2];
|
||||
#endif
|
||||
if(CRC16 ==((uint16_t)(dat[len-1])<<8) + dat[len-2]){//CRC低字节在前
|
||||
switch(dat[1]){//功能码
|
||||
case 0x01:// 功能码 01
|
||||
FunctionalCode_01(((uint16_t)dat[2]<<8) + dat[3]);
|
||||
break;
|
||||
case 0x03:// 功能码03 # 读 - 保持寄存器
|
||||
FunctionalCode_03_06(0x03,((uint16_t)dat[2]<<8) + dat[3] ,((uint16_t)dat[4]<<8) + dat[5]);
|
||||
// FunctionalCode_03(((uint16_t)dat[2]<<8) + dat[3] ,((uint16_t)dat[4]<<8) + dat[5]);
|
||||
break;
|
||||
case 0x06:// 功能码06 # 写 - 单个寄存器
|
||||
FunctionalCode_03_06(0x06,((uint16_t)dat[2]<<8) + dat[3] ,((uint16_t)dat[4]<<8) + dat[5]);
|
||||
// FunctionalCode_06(((uint16_t)dat[2]<<8) + dat[3] ,((uint16_t)dat[4]<<8) + dat[5]);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
#if !defined(Modbus_RBUF_SIZE)
|
||||
#define Modbus_RBUF_SIZE 0x100
|
||||
#endif
|
||||
|
||||
#define Modbus_FIFO_RXTL 8
|
||||
|
||||
#undef RBUF_SIZE
|
||||
#define RBUF_SIZE Modbus_RBUF_SIZE
|
||||
#include "rbuf.h"
|
||||
|
||||
/// RingBuffer for modbus1
|
||||
static rbuf_t ModbusRbRx;
|
||||
|
||||
void app_modbus_Rb_Reset(void){
|
||||
rbuf_init(&ModbusRbRx);
|
||||
}
|
||||
|
||||
uint16_t app_modbus_Rb_Len(void){
|
||||
return rbuf_len(&ModbusRbRx);
|
||||
}
|
||||
|
||||
uint16_t app_modbus_Rb_Read(uint8_t *buff, uint16_t max){
|
||||
return rbuf_gets(&ModbusRbRx, buff, max);
|
||||
}
|
||||
|
||||
#define Rx_timeout _MS(20) // 接收超时时间
|
||||
static tmr_tk_t Rx_timeout_id=0;
|
||||
|
||||
static tmr_tk_t Rx_timeout_handler(tmr_id_t id){
|
||||
(void)(id);
|
||||
|
||||
MODBUS_ReceCount = app_modbus_Rb_Read(&MODBUS_Rece_BUF[0], MODBUS_MAX_LEN);
|
||||
|
||||
DEBUG("RC:%d\n",MODBUS_ReceCount);
|
||||
|
||||
app_PAD_CheckData(MODBUS_Rece_BUF, MODBUS_ReceCount);//PAD数据解析
|
||||
|
||||
app_modbus_CheckData(MODBUS_Rece_BUF, MODBUS_ReceCount);//modbus数据解析
|
||||
|
||||
app_otas_rxd(MODBUS_ReceCount ,MODBUS_Rece_BUF);//otas数据解析
|
||||
|
||||
while(MODBUS_ReceCount){
|
||||
MODBUS_Rece_BUF[--MODBUS_ReceCount] = 0;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
void app_modbus_Init(uint32_t baudrate, uint8_t io_tx, uint8_t io_rx){
|
||||
|
||||
uart_init(UART1_PORT, io_tx, io_rx);
|
||||
uart_conf(UART1_PORT, BRR_BAUD(baudrate), LCR_BITS(8, 1, none));
|
||||
|
||||
// 使能FIFO 接收8字节时触发、使能超过20字节触发超时中断
|
||||
uart_fctl(UART1_PORT, FCR_FIFOEN_BIT | FCR_RXTL_8BYTE,
|
||||
20/*bits_rto*/, UART_IR_RXRD_BIT | UART_IR_RTO_BIT);
|
||||
|
||||
// empty buffer
|
||||
rbuf_init(&ModbusRbRx);
|
||||
|
||||
DEBUG("MODBUS init success!\n");
|
||||
|
||||
NVIC_EnableIRQ(UART1_IRQn);
|
||||
Rx_timeout_id =sftmr_start(10, Rx_timeout_handler);
|
||||
}
|
||||
|
||||
|
||||
void UART1_IRQHandler(void){
|
||||
uint32_t state = UART1->IFM.Word; // UART1->RIF.Word;
|
||||
|
||||
if (state & 0x01){ //(BIT_RXRD)
|
||||
UART1->IDR.RXRD = 1; // Disable RXRD Interrupt
|
||||
|
||||
for (uint8_t i = 0; i < Modbus_FIFO_RXTL; i++){
|
||||
rbuf_putc(&ModbusRbRx, UART1->RBR);
|
||||
}
|
||||
sftmr_Refresh(Rx_timeout_id ,Rx_timeout);
|
||||
UART1->ICR.RXRD = 1; // Clear RXRD Interrupt Flag
|
||||
UART1->IER.RXRD = 1; // Enable RXRD Interrupt
|
||||
}
|
||||
|
||||
if (state & 0x10){ //(BIT_RTO)
|
||||
|
||||
UART1->IDR.RTO = 1; // Disable RTO Interrupt
|
||||
|
||||
while (UART1->SR.RFNE){
|
||||
rbuf_putc(&ModbusRbRx, UART1->RBR);
|
||||
if(0 ==UART1->SR.RFNE){
|
||||
sftmr_Refresh(Rx_timeout_id ,Rx_timeout);
|
||||
}
|
||||
}
|
||||
|
||||
UART1->ICR.RTO = 1; // Clear RTO Interrupt Flag
|
||||
UART1->IER.RTO = 1; // Enable RTO Interrupt
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -0,0 +1,25 @@
|
|||
#ifndef _APP_MODBUS_H_
|
||||
#define _APP_MODBUS_H_
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
//MODBUS从机地址(广播地址0)
|
||||
#define MODBUS_ADDR sys_conf.Modbus_addr
|
||||
|
||||
|
||||
void app_modbus_Init(uint32_t baudrate, uint8_t io_tx, uint8_t io_rx);
|
||||
|
||||
// Empty RingBuffer to reset.
|
||||
void app_modbus_Rb_Reset(void);
|
||||
|
||||
// Get Length of data in RB.
|
||||
uint16_t app_modbus_Rb_Len(void);
|
||||
|
||||
// Read data from RB, return the Length of data copied.
|
||||
uint16_t app_modbus_Rb_Read(uint8_t *buff, uint16_t max);
|
||||
|
||||
// Uart Data procedure
|
||||
void app_modbus_procedure(void);
|
||||
|
||||
|
||||
#endif
|
||||
|
|
@ -0,0 +1,421 @@
|
|||
/**
|
||||
****************************************************************************************
|
||||
*
|
||||
* @file ota.c
|
||||
*
|
||||
* @brief Main loop of the application.
|
||||
*
|
||||
****************************************************************************************
|
||||
*/
|
||||
#include "drvs.h"
|
||||
#include "regs.h"
|
||||
// #include "prf_otas.h"
|
||||
// #include "app.h"
|
||||
#include "sftmr.h"
|
||||
#include "list.h"
|
||||
#include "utils.h"
|
||||
|
||||
#include "app_ota.h"
|
||||
// #include "app_led_control.h"
|
||||
#include "app_modbus.h"
|
||||
|
||||
|
||||
/*
|
||||
* DEFINES
|
||||
****************************************************************************************
|
||||
*/
|
||||
/// examples\loader
|
||||
#define CFG_USE_LOAD 0
|
||||
#define DBG_OTAS 1
|
||||
|
||||
#if (DBG_OTAS)
|
||||
#include "dbg.h"
|
||||
#define DEBUG(format, ...) debug("[OTA]" format "\r\n", ##__VA_ARGS__)
|
||||
#else
|
||||
#define DEBUG(format, ...)
|
||||
#define debugHex(dat, len)
|
||||
#endif
|
||||
|
||||
|
||||
#ifndef FLASH_BASE
|
||||
#define FLASH_BASE (0x18000000)
|
||||
#endif
|
||||
|
||||
#define FLASH_SIZE (0x40000) // 256KB
|
||||
#define FLASH_PAGE_SIZE (0x100) // 256B
|
||||
#define FLASH_SECTOR_SIZE (0x1000) // 4KB
|
||||
#define FLASH_PAGE_SIZE_WLEN (FLASH_PAGE_SIZE >> 2)
|
||||
|
||||
#define FLASH_INFO_PAGE (0x00)
|
||||
#define FLASH_INFO_MAGIC (FLASH_BASE + 0x00)
|
||||
#define FLASH_INFO_CODE_LEN (FLASH_BASE + 0x04)
|
||||
#define FLASH_INFO_CODE_ADDR (FLASH_BASE + 0x08)
|
||||
|
||||
#define OTA_BANK_A_BASE (0x18004000)
|
||||
#if (CFG_USE_LOAD)
|
||||
#define OTA_BANK_B_BASE (0x18020100)
|
||||
#else
|
||||
#define OTA_BANK_B_BASE (0x18020000)
|
||||
#endif
|
||||
#define OTA_BANK_A (OTA_BANK_A_BASE - FLASH_BASE)
|
||||
#define OTA_BANK_B (OTA_BANK_B_BASE - FLASH_BASE)
|
||||
|
||||
#define FLASH_ADDR_INVALID (0xFFFFFFFF)
|
||||
|
||||
#define OTA_FW_SECTOR_MAX_SIZE ((FLASH_SIZE - OTA_BANK_B) / FLASH_SECTOR_SIZE)
|
||||
#define OTA_FW_MAX_SIZE (OTA_FW_SECTOR_MAX_SIZE * FLASH_SECTOR_SIZE) / 16 // 112K
|
||||
|
||||
#define OTA_PKT_LEN (20) // 2B peer_index + 16B ota data + 2B CRC
|
||||
#define OTA_DATA_LEN (OTA_PKT_LEN - 4)
|
||||
|
||||
#define OTA_DATA_OLD (0x55)
|
||||
#define OTA_DATA_NEW (0xAA)
|
||||
|
||||
#define OTA_TIMER_TICK _MS(3000) // 3s
|
||||
#define OTA_MAX_TIMEOUT (400) // 600s/20min
|
||||
|
||||
enum ota_state{
|
||||
OTA_IDLE,
|
||||
OTA_START,
|
||||
OTA_BUSY,
|
||||
OTA_ERROR,
|
||||
};
|
||||
|
||||
enum ota_cmd{
|
||||
OTA_CMD_START = 0xFF01,
|
||||
OTA_CMD_END = 0xFF02,
|
||||
};
|
||||
|
||||
enum ota_err_code{
|
||||
OTA_ERR_NONE = 0, // No error
|
||||
OTA_ERR_BANK_ADDR = 0x5501,//升级固件地址无效
|
||||
OTA_ERR_FAIL = 0x5502,//升级失败
|
||||
OTA_ERR_CRC = 0x5503,//CRC校验失败
|
||||
OTA_ERR_FW = 0x5504,//固件过大
|
||||
OTA_ERR_TIMEOUT = 0x5505,//升级超时
|
||||
OTA_ERR_INDEX = 0x5506,//数据索引错误
|
||||
OTA_ERR_DLEN = 0x5507,//数据长度错误
|
||||
};
|
||||
|
||||
typedef struct ota_env{
|
||||
uint32_t bank; //当前选择的BANK
|
||||
uint8_t ota_sta;//OTA状态
|
||||
uint8_t new_data_flag; //新数据标志
|
||||
uint16_t data_idx;//本地OTA数据索引
|
||||
uint16_t err_info; //错误信息
|
||||
tmr_tk_t tick_cnt; //计时器
|
||||
tmr_tk_t time_id; //定时器ID
|
||||
}ota_env_t;
|
||||
|
||||
|
||||
uint8_t ota_recv_buf[OTA_PKT_LEN];
|
||||
uint32_t ota_wr_data[FLASH_PAGE_SIZE_WLEN];
|
||||
|
||||
volatile ota_env_t ota_env;
|
||||
|
||||
/*
|
||||
* FUNCTION DEFINITIONS
|
||||
****************************************************************************************
|
||||
*/
|
||||
__attribute__((section("ram_func.ota.124")))
|
||||
static void flash_sector_erase(uint32_t offset)
|
||||
{
|
||||
GLOBAL_INT_DISABLE();
|
||||
|
||||
while (SYSCFG->ACC_CCR_BUSY);
|
||||
|
||||
fshc_erase(offset, FSH_CMD_ER_SECTOR);
|
||||
|
||||
GLOBAL_INT_RESTORE();
|
||||
}
|
||||
|
||||
__attribute__((section("ram_func.ota.136")))
|
||||
static void flash_wr_protect(uint8_t val)
|
||||
{
|
||||
GLOBAL_INT_DISABLE();
|
||||
|
||||
while (SYSCFG->ACC_CCR_BUSY);
|
||||
|
||||
uint8_t sta_reg0 = fshc_rd_sta(FSH_CMD_RD_STA0, 1);
|
||||
|
||||
if (val != sta_reg0)
|
||||
{
|
||||
// д<><D0B4><EFBFBD><EFBFBD>0x000-0xFFF (4KB)
|
||||
// write en singal
|
||||
fshc_en_cmd(FSH_CMD_WR_EN);
|
||||
|
||||
// send write sta cmd
|
||||
fshc_wr_sta(FSH_CMD_WR_STA, 1, val);
|
||||
|
||||
bootDelayUs(12000);
|
||||
}
|
||||
|
||||
GLOBAL_INT_RESTORE();
|
||||
}
|
||||
|
||||
|
||||
/******************************************************************************
|
||||
* Name: CRC-16/MODBUS
|
||||
* Poly: 0x8005 ( x16+x15+x2+1 )
|
||||
* Init: 0xFFFF
|
||||
* Refin: True
|
||||
* Refout: True
|
||||
* Xorout: 0x0000
|
||||
*****************************************************************************/
|
||||
static uint16_t crc16_modbus(uint8_t *data, uint16_t length)
|
||||
{
|
||||
uint8_t i;
|
||||
uint16_t crc = 0xFFFF; // Initial value
|
||||
|
||||
while (length--)
|
||||
{
|
||||
crc ^= *data++;
|
||||
|
||||
for (i = 0; i < 8; ++i)
|
||||
{
|
||||
if (crc & 1)
|
||||
{
|
||||
crc = (crc >> 1) ^ 0xA001; // 0xA001 = reverse 0x8005
|
||||
}
|
||||
else
|
||||
{
|
||||
crc = (crc >> 1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return crc;
|
||||
}
|
||||
|
||||
void app_otas_rxd(uint16_t len, const uint8_t *data)
|
||||
{
|
||||
// 接收20字节数据包
|
||||
if (len > OTA_PKT_LEN){
|
||||
len = OTA_PKT_LEN;
|
||||
}
|
||||
|
||||
// memcpy(ota_recv_buf, data, ota_env.data_len);
|
||||
for(uint16_t i = 0; i < OTA_PKT_LEN; i++){
|
||||
ota_recv_buf[i] = data[i];
|
||||
}
|
||||
// uart_send(UART1_PORT ,len ,ota_recv_buf);
|
||||
ota_env.new_data_flag = OTA_DATA_NEW;
|
||||
}
|
||||
|
||||
void app_otas_txd(uint16_t len, const uint8_t *data){
|
||||
uart_send(UART1_PORT ,len ,data);
|
||||
}
|
||||
|
||||
tmr_tk_t ota_time_handle(uint8_t timeid){
|
||||
ota_env.tick_cnt++;
|
||||
DEBUG("sta:%d,tick_cnt:%d",ota_env.ota_sta, ota_env.tick_cnt);
|
||||
if (ota_env.tick_cnt > OTA_MAX_TIMEOUT){
|
||||
ota_env.tick_cnt = 0;
|
||||
ota_env.ota_sta = OTA_ERROR;
|
||||
ota_env.err_info = OTA_ERR_TIMEOUT;
|
||||
DEBUG("time_handle -> OTA_TIMEOUT");
|
||||
sftmr_clear(ota_env.time_id);
|
||||
}else if (ota_env.ota_sta == OTA_IDLE){
|
||||
DEBUG("time_handle -> OTA_IDLE");
|
||||
ota_env.tick_cnt = 0;
|
||||
sftmr_clear(ota_env.time_id);
|
||||
}
|
||||
|
||||
return OTA_TIMER_TICK;
|
||||
}
|
||||
|
||||
#define PEER_IDX (read16Swap(p_OTAData))
|
||||
#define PEER_CRC (read16Swap(p_OTAData + OTA_PKT_LEN - 2))
|
||||
#define PEER_DAT (p_OTAData + 2)
|
||||
|
||||
uint32_t OTA_read32(const void *ptr32){
|
||||
uint32_t value = (0xff & ((uint8_t *)ptr32)[0]) | ((0xff & ((uint8_t *)ptr32)[1]) << 8) | ((0xff & ((uint8_t *)ptr32)[2]) << 16) | ((0xff & ((uint8_t *)ptr32)[3]) << 24);
|
||||
return value;
|
||||
}
|
||||
|
||||
void app_ota_proc(void){
|
||||
uint8_t *p_OTAData = ota_recv_buf;
|
||||
|
||||
switch (ota_env.ota_sta){
|
||||
case OTA_IDLE:{
|
||||
if (ota_env.new_data_flag == OTA_DATA_OLD){ //跳过旧包数据
|
||||
return;
|
||||
}
|
||||
ota_env.new_data_flag = OTA_DATA_OLD;
|
||||
if ((PEER_IDX == OTA_CMD_START) && (ota_env.err_info == OTA_ERR_NONE)){ //初始帧
|
||||
uint16_t local_crc16 = crc16_modbus(p_OTAData, OTA_PKT_LEN - 2);
|
||||
if(local_crc16 != PEER_CRC){
|
||||
DEBUG("CRC16:0x%X,local_crc16:0x%X", PEER_CRC, local_crc16);
|
||||
ota_env.ota_sta = OTA_ERROR;
|
||||
ota_env.err_info = OTA_ERR_CRC;
|
||||
DEBUG("OTA_ERR_CRC");
|
||||
return;
|
||||
}
|
||||
if((ota_env.bank != FLASH_ADDR_INVALID) && (ota_env.bank ==(0xFFF000 & OTA_read32(PEER_DAT)))){//检验数据包的是否有效
|
||||
// Erase
|
||||
uint32_t erase_offset = (ota_env.bank & 0xFFFFF000UL);
|
||||
uint32_t erase_end = (ota_env.bank == OTA_BANK_B ? FLASH_SIZE : OTA_BANK_B);
|
||||
DEBUG("erase_offset:0x%X,erase_end:0x%X", erase_offset, erase_end);
|
||||
for (;erase_offset < erase_end; erase_offset += FLASH_SECTOR_SIZE){
|
||||
flash_sector_erase(erase_offset);
|
||||
}
|
||||
DEBUG("sector_erase OK");
|
||||
ota_env.ota_sta = OTA_START;
|
||||
ota_env.err_info = OTA_ERR_NONE;
|
||||
|
||||
app_otas_txd(2, p_OTAData);//初始帧应答 FF01
|
||||
}else{
|
||||
ota_env.ota_sta = OTA_ERROR;
|
||||
ota_env.err_info = OTA_ERR_BANK_ADDR;
|
||||
DEBUG("OTA_PACK_INVALID");
|
||||
return;
|
||||
}
|
||||
}
|
||||
}break;
|
||||
case OTA_START:{
|
||||
DEBUG("OTA_START");
|
||||
ota_env.ota_sta = OTA_BUSY;
|
||||
ota_env.err_info = OTA_ERR_NONE;
|
||||
ota_env.data_idx = 0;
|
||||
ota_env.tick_cnt = 0;
|
||||
if(0==ota_env.time_id)ota_env.time_id = sftmr_start(OTA_TIMER_TICK, ota_time_handle);
|
||||
// app_led_TurnOff(LED_Keyboard);
|
||||
// app_led_Blink(LED_Mifare,200,200,0xffff);
|
||||
}break;
|
||||
case OTA_BUSY:{ //按扇区编程数据
|
||||
if (ota_env.new_data_flag == OTA_DATA_OLD){ //跳过旧包数据
|
||||
return;
|
||||
}
|
||||
ota_env.new_data_flag = OTA_DATA_OLD;
|
||||
|
||||
uint16_t local_crc16 = crc16_modbus(p_OTAData, OTA_PKT_LEN - 2);
|
||||
if(local_crc16 != PEER_CRC){
|
||||
DEBUG("IDX:%d,CRC16:0x%X,local_crc16:0x%X",PEER_IDX, PEER_CRC, local_crc16);
|
||||
ota_env.ota_sta = OTA_ERROR;
|
||||
ota_env.err_info = OTA_ERR_CRC;
|
||||
DEBUG("OTA_ERR_CRC");
|
||||
return;
|
||||
}
|
||||
if(ota_env.data_idx == PEER_IDX && ota_env.data_idx < OTA_FW_MAX_SIZE){ //数据索引正确
|
||||
uint8_t wr_data_pos = (ota_env.data_idx % OTA_DATA_LEN) * OTA_DATA_LEN;
|
||||
uint32_t wr_addr = (ota_env.data_idx / OTA_DATA_LEN) * FLASH_PAGE_SIZE + ota_env.bank;
|
||||
memcpy(((uint8_t *)ota_wr_data + wr_data_pos), PEER_DAT, OTA_DATA_LEN);
|
||||
if((ota_env.data_idx % OTA_DATA_LEN) == (OTA_DATA_LEN - 1)){
|
||||
DEBUG("ADDRW:0x%X,peer_idx:%d", wr_addr, ota_env.data_idx);
|
||||
flash_write(wr_addr, ota_wr_data, FLASH_PAGE_SIZE_WLEN);
|
||||
}
|
||||
ota_env.data_idx ++;
|
||||
// ota_env.err_info = OTA_ERR_NONE;
|
||||
}else if((PEER_IDX == OTA_CMD_END ) && (read16Swap(PEER_DAT) == (0xffff & (~read16Swap(PEER_DAT+2))))
|
||||
&& (ota_env.data_idx == read16Swap(PEER_DAT) + 1)){//尾帧
|
||||
|
||||
// uint16_t txd_data = read16Swap(&PEER_IDX);
|
||||
// app_otas_txd(2, (uint8_t *)&txd_data);
|
||||
|
||||
app_otas_txd(2, p_OTAData);//尾帧应答 FF02
|
||||
|
||||
// write remain data
|
||||
if ((ota_env.data_idx % OTA_DATA_LEN) != 0){
|
||||
uint32_t wr_addr = (ota_env.data_idx / OTA_DATA_LEN) * FLASH_PAGE_SIZE + ota_env.bank;
|
||||
DEBUG("ADDRW:0x%X,ota_app_idx:%d", wr_addr, ota_env.data_idx);
|
||||
flash_write(wr_addr, ota_wr_data, FLASH_PAGE_SIZE_WLEN);
|
||||
}
|
||||
DEBUG("OTA_success");
|
||||
|
||||
#if (CFG_USE_LOAD)
|
||||
DEBUG("data_idx:%d", ota_env.data_idx);
|
||||
memset((uint8_t *)ota_wr_data, 0xFF, sizeof(ota_wr_data));
|
||||
ota_wr_data[0] = 0x55AA5AA5;
|
||||
ota_wr_data[1] = (ota_env.data_idx * 16);
|
||||
ota_wr_data[2] = OTA_BANK_B_BASE;
|
||||
|
||||
flash_page_erase(OTA_BANK_B - FLASH_PAGE_SIZE);
|
||||
flash_write(OTA_BANK_B - FLASH_PAGE_SIZE, ota_wr_data, FLASH_PAGE_SIZE_WLEN);
|
||||
#else
|
||||
flash_wr_protect(0x00);
|
||||
|
||||
flash_read(FLASH_INFO_PAGE, ota_wr_data, FLASH_PAGE_SIZE_WLEN);
|
||||
ota_wr_data[1] = ota_env.data_idx * 16;
|
||||
ota_wr_data[2] = ota_env.bank | FLASH_BASE;
|
||||
|
||||
flash_page_erase(FLASH_INFO_PAGE);
|
||||
flash_write(FLASH_INFO_PAGE, ota_wr_data, FLASH_PAGE_SIZE_WLEN);
|
||||
|
||||
flash_wr_protect(0x64);
|
||||
#endif
|
||||
ota_env.ota_sta = OTA_IDLE;
|
||||
ota_env.err_info = OTA_ERR_NONE;
|
||||
ota_env.data_idx = 0;
|
||||
ota_env.tick_cnt = 0;
|
||||
|
||||
// app_led_TurnOn(LED_Keyboard);
|
||||
// app_led_Blink(LED_Mifare,80,80,0xffff);
|
||||
bootDelayMs(5000);
|
||||
NVIC_SystemReset();
|
||||
}else{//数据索引错误
|
||||
DEBUG("IDX_ERR:env_idx:0x%04X,peer_idx:0x%04X-0x%04X=0x%04X", ota_env.data_idx, PEER_IDX,read16Swap(PEER_DAT),(0xffff & (~read16Swap(PEER_DAT+2))));
|
||||
ota_env.ota_sta = OTA_ERROR;
|
||||
ota_env.err_info = OTA_ERR_INDEX;
|
||||
DEBUG("INDEX_ERROR");
|
||||
return;
|
||||
}
|
||||
} break;
|
||||
case OTA_ERROR:{
|
||||
if(OTA_ERR_NONE != ota_env.err_info){
|
||||
DEBUG("ERROR_CODE:0x%x", ota_env.err_info);
|
||||
|
||||
ota_env.err_info = read16Swap((void *)&ota_env.err_info);
|
||||
app_otas_txd(2, (uint8_t *)&ota_env.err_info);//错误帧应答 5501~5507
|
||||
|
||||
// app_led_Blink(LED_Keyboard,200,200,10);//4S
|
||||
// app_led_Blink(LED_Mifare,200,200,10);
|
||||
|
||||
ota_env.ota_sta = OTA_IDLE;
|
||||
// ota_env.new_data_flag = OTA_DATA_OLD;
|
||||
ota_env.data_idx = 0;
|
||||
ota_env.err_info = OTA_ERR_NONE;
|
||||
ota_env.tick_cnt = 0;
|
||||
DEBUG("OTA_IDLE");
|
||||
// NVIC_SystemReset();
|
||||
}
|
||||
}break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
bool app_is_ota_proc(void){
|
||||
return (ota_env.ota_sta != OTA_IDLE);
|
||||
}
|
||||
|
||||
static void ota_env_init(void){
|
||||
ota_env.bank = FLASH_ADDR_INVALID;
|
||||
ota_env.ota_sta = OTA_IDLE;
|
||||
ota_env.new_data_flag = OTA_DATA_OLD;
|
||||
ota_env.data_idx = 0;
|
||||
ota_env.err_info = OTA_ERR_NONE;
|
||||
ota_env.tick_cnt = 0;
|
||||
ota_env.time_id = TMR_ID_NONE;
|
||||
}
|
||||
|
||||
void app_ota_init(void){
|
||||
ota_env_init();
|
||||
|
||||
#if (CFG_USE_LOAD)
|
||||
ota_env.bank = OTA_BANK_B;
|
||||
#else
|
||||
uint32_t curr_code_addr = RD_32(FLASH_INFO_CODE_ADDR);
|
||||
DEBUG("Curr Addr:0x%x", curr_code_addr);
|
||||
ota_env.bank = FLASH_ADDR_INVALID;
|
||||
if(curr_code_addr == OTA_BANK_A_BASE){
|
||||
ota_env.bank = OTA_BANK_B;
|
||||
}
|
||||
else if(curr_code_addr == OTA_BANK_B_BASE){
|
||||
ota_env.bank = OTA_BANK_A;
|
||||
}
|
||||
#endif
|
||||
// app_led_Blink(LED_Keyboard,200,200,0xffff);
|
||||
// app_led_TurnOff(LED_Mifare);
|
||||
|
||||
DEBUG("OTA_BANK:0x%x", ota_env.bank);
|
||||
}
|
||||
|
|
@ -0,0 +1,12 @@
|
|||
#ifndef _APP_OTA_H_
|
||||
#define _APP_OTA_H_
|
||||
|
||||
#include <stdbool.h>
|
||||
|
||||
void app_ota_init(void);
|
||||
void app_ota_proc(void);
|
||||
bool app_is_ota_proc(void);
|
||||
|
||||
void app_otas_rxd(uint16_t len, const uint8_t *data);
|
||||
|
||||
#endif
|
||||
|
|
@ -4,127 +4,89 @@
|
|||
#include "app_radar.h"
|
||||
#include "sftmr.h"
|
||||
|
||||
#include "CRCxx.h"
|
||||
|
||||
#include "sys_config.h"
|
||||
|
||||
#define DBG_RADAR_EN 0
|
||||
|
||||
radar_daraframe_t radar_daraframe;
|
||||
#if (DBG_RADAR_EN)
|
||||
#include "dbg.h"
|
||||
#define DEBUG(format, ...) debug("[RADAR]" format "\r\n", ##__VA_ARGS__)
|
||||
#else
|
||||
#define DEBUG(format, ...)
|
||||
//#define debugHex(dat, len)
|
||||
#endif
|
||||
|
||||
// 定时处理数和获取数据
|
||||
tmr_id_t radar_timer_tmr_id;
|
||||
|
||||
bool radar_flag=0;
|
||||
uint8_t radar_flag_cnt=0;
|
||||
static bool radar_NewData_flag=0;// 新数据标志位
|
||||
static uint8_t radar_CMDSend_cnt=0; // 发送命令计数
|
||||
radar_data_t radar_data;
|
||||
|
||||
// uint8_t radar_str[50]={0,0},radar_str_len=0;
|
||||
|
||||
// 自动刹车或减速判断处理函数
|
||||
void radar_AUTO_BrakeORSpeedCut(uint8_t radar_id , uint16_t Car_Distance){ //距离数据30~4500mm
|
||||
// 自动刹车距离
|
||||
uint16_t Brake_Distance = ((radar_id == RADAR_ID_Back )? sys_conf.Brake_DLimit_B : sys_conf.Brake_DLimit);
|
||||
// 自动减速距离
|
||||
uint16_t Speed_Cut_Distance = ((radar_id == RADAR_ID_Back )? sys_conf.Speed_Cut_DLimit_B : sys_conf.Speed_Cut_DLimit);
|
||||
|
||||
if((35 < Car_Distance) && Car_Distance < Brake_Distance){//小于自动刹车距离时
|
||||
if(!sys_sta.A_brake){
|
||||
Time_Event_Blink(Buzzer_Event,100,100,0xffff,NULL);
|
||||
}
|
||||
sys_sta.A_brake =1;//使能自动刹车
|
||||
sys_sta.A_Speed_Cut=1;
|
||||
}else if((35 < Car_Distance) && Car_Distance < Speed_Cut_Distance){//小于自动减速距离时
|
||||
if(sys_sta.A_brake || !sys_sta.A_Speed_Cut){
|
||||
Time_Event_Blink(Buzzer_Event,200,500,0xffff,NULL);
|
||||
}
|
||||
sys_sta.A_brake =0;
|
||||
sys_sta.A_Speed_Cut=1;//使能自动减速
|
||||
}else{
|
||||
if(sys_sta.A_brake || sys_sta.A_Speed_Cut){
|
||||
Time_Event_Off(Buzzer_Event,NULL);
|
||||
}
|
||||
sys_sta.A_brake =0;
|
||||
sys_sta.A_Speed_Cut=0;
|
||||
}
|
||||
}
|
||||
|
||||
static uint8_t new_state_cnt=3;//标记状态是否变化
|
||||
|
||||
// 定时处理数和获取数据
|
||||
static tmr_tk_t radar_timer_handler(tmr_id_t id){
|
||||
(void)(id);
|
||||
uint16_t Car_Distance=0;
|
||||
|
||||
if(Get_Status(OUT_Door_lock)){
|
||||
// 定时发送状态信息
|
||||
if(radar_flag_cnt > 4){
|
||||
uint8_t ret_data[20]={0,0};
|
||||
radar_flag_cnt =0;
|
||||
ret_data[radar_flag_cnt++] =BAT_Message.Bat_STA; // 电池状态
|
||||
ret_data[radar_flag_cnt++] =BAT_Message.Bat_Voltage >> 8; //电池电压
|
||||
ret_data[radar_flag_cnt++] =BAT_Message.Bat_Voltage & 0xff;
|
||||
ret_data[radar_flag_cnt++] =get_in_acc_percent();// 当前油门百分比
|
||||
ret_data[radar_flag_cnt++] =radar_daraframe.Front_data /100;// 前雷达距离信息
|
||||
ret_data[radar_flag_cnt++] =radar_daraframe.Back_data/100;// 后雷达距离信息
|
||||
// 读取系统配置
|
||||
ret_data[radar_flag_cnt++]=sys_conf_info.M_mode_sLim;
|
||||
ret_data[radar_flag_cnt++]=sys_conf_info.U_mode_sLim;
|
||||
ret_data[radar_flag_cnt++]=sys_conf_info.AUTO_Brake_Distance;
|
||||
ret_data[radar_flag_cnt++]=sys_conf_info.AUTO_Speed_Cut_Distance;
|
||||
ret_data[radar_flag_cnt++]=sys_conf_info.AUTO_Brake_Distance_B;
|
||||
ret_data[radar_flag_cnt++]=sys_conf_info.AUTO_Speed_Cut_Distance_B;
|
||||
ret_data[radar_flag_cnt++] =(Get_Status(IN_GPS)<<0) | (Get_Status(IN_Back)<<1) | (Get_Status(OUT_Low_brake)<<2)
|
||||
| (Get_Status(IN_Manager_Mode)<<3) | ((PAD_Manager_Mode)<<4)
|
||||
| ((PAD_User_Mode)<<5) | ((SYS_AUTO_Speed_Cut)<<6) | ((SYS_AUTO_brake)<<7);
|
||||
app_uart_Sendcmd(UART1_PORT,0x10,0x01,ret_data,radar_flag_cnt);
|
||||
radar_flag_cnt =0;
|
||||
goto radar_end;
|
||||
}else {
|
||||
radar_flag_cnt++;
|
||||
if(radar_NewData_flag == 1){
|
||||
radar_NewData_flag =0; // 清空新数据标志位
|
||||
radar_CMDSend_cnt =0; // 清空发送命令计数
|
||||
DEBUG("ID =%d,distance =%d", radar_data.radar_id ,radar_data.distance);
|
||||
}
|
||||
if((radar_CMDSend_cnt !=0)||(1 ==new_state_cnt)){//
|
||||
DEBUG("Clear:CMD_cnt =%d", radar_CMDSend_cnt);
|
||||
radar_CMDSend_cnt =0; // 清空发送命令计数
|
||||
radar_AUTO_BrakeORSpeedCut(radar_data.radar_id , 0);//复位自动刹车和减速状态
|
||||
}
|
||||
if(new_state_cnt > 0){
|
||||
new_state_cnt--;
|
||||
}
|
||||
// 进入游客模式开启雷达 //管理员模式优先于游客模式
|
||||
if((0x01 == (sys_sta.Pmode | sys_sta.Smode)) && sys_sta.P_Radar_EN){
|
||||
// 根据倒车状态确定雷达ID
|
||||
DEBUG("SendCMD:ID=%#02x", SYS_Back_STA ? RADAR_ID_Back : RADAR_ID_Front);
|
||||
app_radar_Sendcmd(SYS_Back_STA ? RADAR_ID_Back : RADAR_ID_Front,RADAR_MODE_Real);
|
||||
new_state_cnt =3;
|
||||
radar_CMDSend_cnt++;
|
||||
}
|
||||
|
||||
if(radar_flag == 1){
|
||||
// radar_str_len =sprintf((char *)radar_str, "F=%d,B=%d\n", radar_daraframe.Front_data ,radar_daraframe.Back_data);
|
||||
// uart_send(UART1_PORT,radar_str_len,radar_str);
|
||||
radar_flag = 0;
|
||||
}
|
||||
if(Get_Status(OUT_Door_lock) && !(PAD_Manager_Mode || Get_Status(IN_Manager_Mode))){
|
||||
if(Get_Status(IN_Back)){//如果是倒车状态
|
||||
#if (0 ==RADAR_MODE)
|
||||
// uint8_t data[8]={0x02,0x03,0x01,0x00,0x00,0x01,0x85,0xC5};//读取处理值数据//520ms
|
||||
uint8_t data[8]={0x02,0x03,0x01,0x01,0x00,0x01,0xD4,0x05};////读取实时值数据//120ms
|
||||
#elif (1 ==RADAR_MODE)
|
||||
uint8_t data[8]={0x02,0x03,0x00,0x01,0x00,0x01,0xD5,0xf9};////读取实时值数据//120ms
|
||||
#endif
|
||||
Car_Distance =radar_daraframe.Back_data/100;
|
||||
radar_daraframe.Back_data=0xffff;
|
||||
uart_send(UART1_PORT,8,data);
|
||||
}else{
|
||||
#if (0 ==RADAR_MODE)
|
||||
// uint8_t data[8]={0x01,0x03,0x01,0x00,0x00,0x01,0x85,0xf6};//读取处理值数据//520ms
|
||||
uint8_t data[8]={0x01,0x03,0x01,0x01,0x00,0x01,0xD4,0x36};//读取实时值数据//120ms
|
||||
#elif (1 ==RADAR_MODE)
|
||||
uint8_t data[8]={0x01,0x03,0x00,0x01,0x00,0x01,0xD5,0xCA};////读取实时值数据//120ms
|
||||
#endif
|
||||
Car_Distance =radar_daraframe.Front_data/100;
|
||||
radar_daraframe.Front_data=0xffff;
|
||||
uart_send(UART1_PORT,8,data);
|
||||
return _MS(140);//300ms
|
||||
}
|
||||
|
||||
if((0 < Car_Distance) && Car_Distance < (Get_Status(IN_Back)?sys_conf_info.AUTO_Brake_Distance_B :sys_conf_info.AUTO_Brake_Distance)){//小于自动刹车距离时
|
||||
if(!SYS_AUTO_brake){
|
||||
Time_Event_Blink(Buzzer_Event,100,100,0xffff,NULL);
|
||||
}
|
||||
SYS_AUTO_brake =1;//使能自动刹车
|
||||
SYS_AUTO_Speed_Cut=1;
|
||||
}else if((0 < Car_Distance) && Car_Distance < (Get_Status(IN_Back)?sys_conf_info.AUTO_Speed_Cut_Distance_B :sys_conf_info.AUTO_Speed_Cut_Distance)){//小于自动减速距离时
|
||||
if(SYS_AUTO_brake || !SYS_AUTO_Speed_Cut){
|
||||
Time_Event_Blink(Buzzer_Event,200,500,0xffff,NULL);
|
||||
}
|
||||
SYS_AUTO_brake =0;
|
||||
SYS_AUTO_Speed_Cut=1;
|
||||
}else{
|
||||
if(SYS_AUTO_brake || SYS_AUTO_Speed_Cut){
|
||||
Time_Event_Off(Buzzer_Event,NULL);
|
||||
}
|
||||
SYS_AUTO_brake =0;
|
||||
SYS_AUTO_Speed_Cut=0;
|
||||
}
|
||||
}else{
|
||||
if(SYS_AUTO_brake || SYS_AUTO_Speed_Cut){
|
||||
Time_Event_Off(Buzzer_Event,NULL);
|
||||
}
|
||||
SYS_AUTO_brake =0;
|
||||
SYS_AUTO_Speed_Cut=0;
|
||||
}
|
||||
radar_end:
|
||||
return _MS(300);//300ms
|
||||
}
|
||||
static uint8_t radar_buff[RADAR_BUFF_MAX];
|
||||
|
||||
// 雷达测离初始化
|
||||
void app_radar_init(void){
|
||||
// sftmr_init(); //main函数中已初始化
|
||||
radar_timer_tmr_id = sftmr_start(10, radar_timer_handler);
|
||||
}
|
||||
|
||||
#if (1 ==BLE_ENABLE)
|
||||
extern uint16_t Front_data;
|
||||
extern uint16_t Back_data;
|
||||
#endif
|
||||
|
||||
uint8_t radar_buff[10],radar_state;
|
||||
uint16_t i;
|
||||
|
||||
// 串口数据接收
|
||||
// 数据接收
|
||||
void app_radar_Receive(uint8_t data){
|
||||
static uint8_t cnt=0,radar_state=0;
|
||||
switch(radar_state){
|
||||
case 0://dev_addr
|
||||
if (data == 0x01 || data == 0x02) {
|
||||
|
|
@ -145,44 +107,62 @@ void app_radar_Receive(uint8_t data){
|
|||
if (data == 0x02) {
|
||||
radar_buff[2]=data;
|
||||
radar_state = 3;
|
||||
i=0;
|
||||
cnt=0;
|
||||
}else {
|
||||
radar_state = 0;
|
||||
radar_buff[0]=0;
|
||||
}
|
||||
break;
|
||||
case 3://data
|
||||
radar_buff[3+i] =data;
|
||||
i++;
|
||||
if(i==2){
|
||||
i=0;
|
||||
radar_buff[3+cnt] =data;
|
||||
cnt++;
|
||||
if(cnt==2){
|
||||
cnt=0;
|
||||
radar_state = 4;
|
||||
}
|
||||
|
||||
break;
|
||||
case 4://crc16
|
||||
radar_buff[5+i] =data;
|
||||
i++;
|
||||
if(i==2){
|
||||
uint16_t crc16 =crc16_checkout(radar_buff,5);
|
||||
radar_buff[5+cnt] =data;
|
||||
cnt++;
|
||||
if(cnt==2){
|
||||
uint16_t crc16 =crc16_modbus(radar_buff,5);
|
||||
if(crc16 == (((uint16_t)radar_buff[6] << 8 ) | radar_buff[5])){
|
||||
if(0x01 == radar_buff[0]){
|
||||
radar_daraframe.Front_data = ((uint16_t)radar_buff[3] << 8 ) | radar_buff[4];
|
||||
#if (1 ==BLE_ENABLE)
|
||||
Front_data=radar_daraframe.Front_data;
|
||||
#endif
|
||||
}else if(0x02 == radar_buff[0]){
|
||||
radar_daraframe.Back_data = ((uint16_t)radar_buff[3] << 8 ) | radar_buff[4];
|
||||
#if (1 ==BLE_ENABLE)
|
||||
Back_data=radar_daraframe.Back_data;
|
||||
#endif
|
||||
radar_data.radar_id = radar_buff[0];
|
||||
radar_data.distance = ((uint16_t)radar_buff[3] << 8 ) | radar_buff[4];
|
||||
radar_AUTO_BrakeORSpeedCut(radar_data.radar_id ,radar_data.distance);
|
||||
radar_NewData_flag = 1;
|
||||
}
|
||||
radar_flag = 1;
|
||||
}
|
||||
i=0;
|
||||
cnt=0;
|
||||
radar_state = 0;
|
||||
radar_buff[0]=0;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
//发送读取实时值数据命令
|
||||
void app_radar_Sendcmd(uint8_t radar_id , uint8_t radar_mode){
|
||||
uint8_t len=0;
|
||||
uint8_t data[8];
|
||||
|
||||
data[len++] = radar_id;
|
||||
data[len++] = 0x03;
|
||||
data[len++] = 0x01;
|
||||
data[len++] = radar_mode ? 0x01 : 0x00; // 0x01:实时值(120ms) 0x00:处理值(520ms)
|
||||
data[len++] = 0x00;
|
||||
data[len++] = 0x01;
|
||||
|
||||
uint16_t crc16 =crc16_modbus(data,len);
|
||||
data[len++] = crc16 & 0xff;
|
||||
data[len++] = (crc16 >> 8) & 0xff;
|
||||
uart_send(UART2_PORT,len,data);
|
||||
}
|
||||
|
||||
// 雷达测离初始化
|
||||
void app_radar_init(void){
|
||||
radar_data.radar_id = RADAR_ID_Front;
|
||||
radar_data.distance = 0;
|
||||
// sftmr_init(); //main函数中已初始化
|
||||
sftmr_start(10, radar_timer_handler);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -2,22 +2,35 @@
|
|||
#define _RADAR_H_
|
||||
#include "sftmr.h"
|
||||
|
||||
#define BUFF_MAX 10
|
||||
|
||||
#define RADAR_BUFF_MAX 9
|
||||
|
||||
typedef struct radar_daraframe{
|
||||
volatile uint16_t Front_data;
|
||||
volatile uint16_t Back_data;
|
||||
} radar_daraframe_t;
|
||||
|
||||
extern radar_daraframe_t radar_daraframe;
|
||||
extern uint8_t radar_buff[];
|
||||
extern uint8_t Rec_lenght;
|
||||
enum RADAR_MODE{
|
||||
RADAR_MODE_Dispose = 0, //处理模式
|
||||
RADAR_MODE_Real = 1, //实时模式
|
||||
};
|
||||
|
||||
enum RADAR_ID{
|
||||
RADAR_ID_Front = 0x01, //前雷达ID
|
||||
RADAR_ID_Back = 0x02, //后雷达ID
|
||||
};
|
||||
|
||||
typedef struct radar_data{
|
||||
uint8_t radar_id;
|
||||
uint16_t distance;
|
||||
} radar_data_t;
|
||||
|
||||
extern radar_data_t radar_data;
|
||||
|
||||
// 雷达测离初始化
|
||||
void app_radar_init(void);
|
||||
|
||||
// 串口数据接收
|
||||
void app_radar_Receive(uint8_t data);
|
||||
|
||||
//发送读取实时值数据命令
|
||||
void app_radar_Sendcmd(uint8_t radar_id , uint8_t radar_mode);
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -2,8 +2,11 @@
|
|||
#include "drvs.h"
|
||||
#include "dbg.h"
|
||||
#include "rbuf.h"
|
||||
|
||||
#include "sys_config.h"
|
||||
|
||||
#include "app_PAD.h"
|
||||
|
||||
void app_uart_Init(uint8_t port, uint32_t baudrate, uint8_t io_tx, uint8_t io_rx)
|
||||
{
|
||||
uart_init(port, io_tx, io_rx);
|
||||
|
|
@ -14,196 +17,25 @@ void app_uart_Init(uint8_t port, uint32_t baudrate, uint8_t io_tx, uint8_t io_rx
|
|||
NVIC_EnableIRQ(port==UART1_PORT?UART1_IRQn:UART2_IRQn);
|
||||
}
|
||||
|
||||
// void UART1_IRQHandler(void)
|
||||
// {
|
||||
// uint32_t state = UART1->IFM.Word; // UART1->RIF.Word;
|
||||
|
||||
//CRC-8/MAXIM:x8+X5+X4+1
|
||||
uint8_t crc8_checkout(uint8_t *buff, uint8_t length)
|
||||
{
|
||||
uint8_t i;
|
||||
uint8_t crc = 0; //initial value
|
||||
// if (state & 0x01) //(BIT_RXRD)
|
||||
// {
|
||||
// UART1->IDR.RXRD = 1; // Disable RXRD Interrupt
|
||||
// uint8_t data = UART1->RBR;
|
||||
|
||||
while (length--) {
|
||||
crc ^= *buff++; //crc ^= *buff; buff++;
|
||||
for(i = 0; i < 8; i++) {
|
||||
if(crc & 1)
|
||||
crc = (crc >> 1) ^ 0x8C; //0x8C = reverse 0x31
|
||||
else
|
||||
crc >>= 1;
|
||||
}
|
||||
}
|
||||
return crc;
|
||||
}
|
||||
|
||||
// CRC-16/MODBUS polynomial: x^16 + x^15 + x^2 + 1 (0x8005)
|
||||
uint16_t crc16_checkout(uint8_t *buff, uint16_t length) {
|
||||
uint8_t i;
|
||||
uint16_t crc = 0xffff; // Initial value
|
||||
while (length--)
|
||||
{
|
||||
crc ^= *buff++;
|
||||
for (i = 0; i < 8; ++i)
|
||||
{
|
||||
if (crc & 1)
|
||||
crc = (crc >> 1) ^ 0xA001; // 0xA001 = reverse 0x8005
|
||||
else
|
||||
crc = (crc >> 1);
|
||||
}
|
||||
}
|
||||
return crc;
|
||||
}
|
||||
|
||||
|
||||
|
||||
uart_daraframe_t uart1_daraframe;
|
||||
volatile uint8_t uart1_state =0;
|
||||
volatile uint8_t uart1_data_cnt =0;
|
||||
|
||||
bool uart2_Back_car=0;
|
||||
|
||||
static void app_uart1_hande(void){
|
||||
uint8_t ret_data[MAX_LEN]={0,0};
|
||||
uint8_t length=0;
|
||||
|
||||
switch(uart1_daraframe.cmd_id){
|
||||
case 0x01: // 配置系统参数
|
||||
sys_conf_info.M_mode_sLim= uart1_daraframe.data[0];
|
||||
sys_conf_info.U_mode_sLim= uart1_daraframe.data[1];
|
||||
sys_conf_info.AUTO_Brake_Distance= uart1_daraframe.data[2];
|
||||
sys_conf_info.AUTO_Speed_Cut_Distance= uart1_daraframe.data[3];
|
||||
sys_conf_info.AUTO_Brake_Distance_B= uart1_daraframe.data[4];
|
||||
sys_conf_info.AUTO_Speed_Cut_Distance_B= uart1_daraframe.data[5];
|
||||
write_cfg(&sys_conf_info);
|
||||
case 0x02: // 读取系统配置
|
||||
ret_data[length++]=sys_conf_info.M_mode_sLim;
|
||||
ret_data[length++]=sys_conf_info.U_mode_sLim;
|
||||
ret_data[length++]=sys_conf_info.AUTO_Brake_Distance;
|
||||
ret_data[length++]=sys_conf_info.AUTO_Speed_Cut_Distance;
|
||||
ret_data[length++]=sys_conf_info.AUTO_Brake_Distance_B;
|
||||
ret_data[length++]=sys_conf_info.AUTO_Speed_Cut_Distance_B;
|
||||
|
||||
app_uart_Sendcmd(UART1_PORT,uart1_daraframe.cmd_id,0x01,ret_data,length);
|
||||
break;
|
||||
case 0x03: //0 命令控制进入管理员模式//1 命令控制进入游客模式
|
||||
PAD_Manager_Mode =uart1_daraframe.data[0];
|
||||
PAD_User_Mode =uart1_daraframe.data[1];
|
||||
if(1==PAD_User_Mode && 1==PAD_Manager_Mode){
|
||||
PAD_User_Mode=0;
|
||||
PAD_Manager_Mode=1;
|
||||
}
|
||||
app_uart_Sendcmd(UART1_PORT,uart1_daraframe.cmd_id,0x01,uart1_daraframe.data,uart1_daraframe.length);
|
||||
break;
|
||||
// case 0x04:
|
||||
|
||||
// break;
|
||||
|
||||
default :
|
||||
app_uart_Sendcmd(UART1_PORT,uart1_daraframe.cmd_id,uart1_daraframe.reg_addr,uart1_daraframe.data,uart1_daraframe.length);
|
||||
break;
|
||||
/*
|
||||
其他功能....
|
||||
*/
|
||||
}
|
||||
uart1_state =0;//数据处理完要清零,准备接收下一帧数据
|
||||
}
|
||||
|
||||
static void uart1_Receive(uint8_t data)
|
||||
{
|
||||
uint8_t *frame = (uint8_t *)&uart1_daraframe;
|
||||
|
||||
switch(uart1_state){
|
||||
case 0://header
|
||||
if ((data == (uint8_t)(FRAME_HEADER >> 8)) && (uart1_daraframe.header == 0x0)) {
|
||||
uart1_daraframe.header = (FRAME_HEADER >> 8);
|
||||
} else if ((data == (uint8_t)(FRAME_HEADER & 0x00FF)) && (uart1_daraframe.header == (uint8_t)(FRAME_HEADER >> 8))) {
|
||||
uart1_daraframe.header = ((uint16_t)((FRAME_HEADER << 8)|(FRAME_HEADER >> 8)));//0xA100;
|
||||
uart1_daraframe.length = 0;
|
||||
uart1_state = 1;//to cmd id
|
||||
//debug("header");
|
||||
}
|
||||
break;
|
||||
case 1://cmd_id
|
||||
//debug("rxcmd:%x", data);
|
||||
uart1_daraframe.cmd_id = data;
|
||||
uart1_state = 2;//to device addr
|
||||
break;
|
||||
case 2://reg addr
|
||||
//debug("reg_addr");
|
||||
uart1_daraframe.reg_addr = data;
|
||||
uart1_state = 3;//to data length
|
||||
break;
|
||||
case 3://data length
|
||||
//debug("length");
|
||||
uart1_daraframe.length = (data < MAX_LEN) ? data : MAX_LEN;
|
||||
if (uart1_daraframe.length == 0) {
|
||||
uart1_state = 5;//to crc
|
||||
} else {
|
||||
uart1_state = 4;//to data
|
||||
uart1_data_cnt = 0;
|
||||
}
|
||||
break;
|
||||
case 4://data
|
||||
//debug("data");
|
||||
if (uart1_data_cnt < uart1_daraframe.length) {
|
||||
uart1_daraframe.data[uart1_data_cnt++] = data;
|
||||
}
|
||||
if (uart1_data_cnt == uart1_daraframe.length) {
|
||||
uart1_data_cnt = 0;
|
||||
uart1_state = 5;//to crc
|
||||
}
|
||||
break;
|
||||
case 5://CRC8
|
||||
uart1_daraframe.crc = crc8_checkout(frame, 5 + uart1_daraframe.length);
|
||||
#if DISABLE_CRC8
|
||||
uart1_daraframe.crc = data;
|
||||
#endif
|
||||
//计算并验证crc8
|
||||
if (uart1_daraframe.crc == data) {
|
||||
uart1_state = 6;//to ack
|
||||
//debug("crc correct cmd:%x", uart1_daraframe.cmd_id);
|
||||
} else {
|
||||
uart1_state = 0;//to haeder
|
||||
uart1_daraframe.header = 0;
|
||||
//debug("crc error cmd:%x-%x", uart1_daraframe.cmd_id, uart1_daraframe.crc);
|
||||
}
|
||||
break;
|
||||
}
|
||||
// uart_putc(UART1_PORT,data);//debug
|
||||
// uart_putc(UART1_PORT,'0'+uart1_state);
|
||||
if(uart1_state == 6){
|
||||
uart1_daraframe.header = 0;
|
||||
uart1_state = 7;//数据处理完,需要将状态位归零,才会接收下一帧数据,即:uart1_state =0时。
|
||||
app_uart1_hande();
|
||||
uart1_state =0;
|
||||
/*
|
||||
rx handler codes....
|
||||
*/
|
||||
}
|
||||
}
|
||||
|
||||
void UART1_IRQHandler(void)
|
||||
{
|
||||
uint32_t state = UART1->IFM.Word; // UART1->RIF.Word;
|
||||
|
||||
if (state & 0x01) //(BIT_RXRD)
|
||||
{
|
||||
UART1->IDR.RXRD = 1; // Disable RXRD Interrupt
|
||||
uint8_t data = UART1->RBR;
|
||||
app_radar_Receive(data);
|
||||
uart1_Receive(data);
|
||||
UART1->ICR.RXRD = 1; // Clear RXRD Interrupt Flag
|
||||
UART1->IER.RXRD = 1; // Enable RXRD Interrupt
|
||||
}
|
||||
|
||||
}
|
||||
// app_PAD_Receive(data);
|
||||
// UART1->ICR.RXRD = 1; // Clear RXRD Interrupt Flag
|
||||
// UART1->IER.RXRD = 1; // Enable RXRD Interrupt
|
||||
// }
|
||||
// }
|
||||
|
||||
/*
|
||||
***************************************UART2*****************************************************
|
||||
*/
|
||||
|
||||
static void uart2_Receive(uint8_t data)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
void UART2_IRQHandler(void)
|
||||
{
|
||||
uint32_t state = UART2->IFM.Word; // UART2->RIF.Word;
|
||||
|
|
@ -211,33 +43,11 @@ void UART2_IRQHandler(void)
|
|||
if (state & 0x01) //(BIT_RXRD)
|
||||
{
|
||||
UART2->IDR.RXRD = 1; // Disable RXRD Interrupt
|
||||
uint8_t data = UART2->RBR;
|
||||
|
||||
uart2_Receive(UART2->RBR);
|
||||
app_radar_Receive(data);
|
||||
UART2->ICR.RXRD = 1; // Clear RXRD Interrupt Flag
|
||||
UART2->IER.RXRD = 1; // Enable RXRD Interrupt
|
||||
}
|
||||
}
|
||||
|
||||
//发送命令
|
||||
void app_uart_Sendcmd(uint8_t port, volatile uint8_t cmd_id ,volatile uint8_t reg_addr ,volatile uint8_t *data, volatile uint8_t length)
|
||||
{
|
||||
uart_daraframe_t frame;
|
||||
uint8_t *cmd_data =(uint8_t *)&frame;
|
||||
uint8_t i;
|
||||
|
||||
frame.header = ((uint16_t)((FRAME_HEADER << 8)|(FRAME_HEADER >> 8)));//0xA100
|
||||
frame.cmd_id = cmd_id;
|
||||
frame.reg_addr = reg_addr;
|
||||
frame.length = length < MAX_LEN ? length:MAX_LEN;
|
||||
|
||||
for(i = 0;i < frame.length ;i ++){
|
||||
frame.data[i] = * data++;
|
||||
}
|
||||
length =5 + frame.length;
|
||||
frame.crc = crc8_checkout(cmd_data, length);
|
||||
while(length--)
|
||||
uart_putc(port, (uint32_t)(*cmd_data ++));
|
||||
uart_putc(port, (uint32_t)(frame.crc));
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -9,8 +9,8 @@
|
|||
|
||||
#define MAX_LEN 32
|
||||
|
||||
//1:失能数据校验
|
||||
#define DISABLE_CRC8 0
|
||||
//0:失能数据校验
|
||||
#define ENABLE_CRC8 1
|
||||
|
||||
typedef struct uart_daraframe
|
||||
{
|
||||
|
|
|
|||
|
|
@ -2,9 +2,9 @@
|
|||
#include "drvs.h"
|
||||
#include "dbg.h"
|
||||
#include "app_ws2812.h"
|
||||
#include "sys_config.h"
|
||||
|
||||
|
||||
#define OUT_GRB_WS2812_DIN PA02
|
||||
#define OUT_GRB_WS2812_DIN RGB_DATA_IO
|
||||
|
||||
uint32_t ___WS2812_DIN___ =1<< OUT_GRB_WS2812_DIN;
|
||||
//0x02 = 1<<PA01
|
||||
|
|
@ -37,6 +37,7 @@ void GRB_WS2812_Write_24Bits(uint32_t GRB888)
|
|||
{
|
||||
uint32_t i;
|
||||
|
||||
__disable_irq();
|
||||
for(i=0x800000;i!=0;i>>=1){
|
||||
WS2812_DIN_H;
|
||||
if(GRB888 & i ){
|
||||
|
|
@ -49,7 +50,7 @@ void GRB_WS2812_Write_24Bits(uint32_t GRB888)
|
|||
}
|
||||
WS2812_DIN_L;
|
||||
}
|
||||
|
||||
__enable_irq();
|
||||
}
|
||||
|
||||
void GRB_WS2812_Write_GRBs(uint8_t len, uint32_t *GRB888)
|
||||
|
|
|
|||
|
|
@ -14,9 +14,41 @@ typedef struct BLE_GRB_Data{
|
|||
uint32_t GRBs;
|
||||
} BLE_GRB_Data_t;
|
||||
|
||||
#define GRB_RED 0x00ff00;
|
||||
#define GRB_GREEN 0xff0000;
|
||||
#define GRB_BLUE 0x0000ff;
|
||||
#define GRB_RED 0x00ff00
|
||||
#define GRB_GREEN 0xff0000
|
||||
#define GRB_BLUE 0x0000ff
|
||||
#define GRB_WHITE 0xffffff
|
||||
#define GRB_BLACK 0x000000
|
||||
#define GRB_YELLOW 0xffff00
|
||||
#define GRB_CYAN 0x00ffff
|
||||
#define GRB_MAGENTA 0xff00ff
|
||||
#define GRB_ORANGE 0x2B73F5//0xa5ff00
|
||||
#define GRB_PURPLE 0x800080
|
||||
#define GRB_PINK 0xffc0cb
|
||||
#define GRB_BROWN 0xa52a2a
|
||||
#define GRB_GRAY 0x808080
|
||||
#define GRB_LIGHT_BLUE 0xadd8e6
|
||||
#define GRB_DARK_BLUE 0x00008b
|
||||
#define GRB_LIGHT_GREEN 0x90ee90
|
||||
#define GRB_DARK_GREEN 0x006400
|
||||
#define GRB_LIGHT_RED 0xffc0cb
|
||||
#define GRB_DARK_RED 0x8b0000
|
||||
#define GRB_LIGHT_YELLOW 0xffffe0
|
||||
#define GRB_DARK_YELLOW 0xffa500
|
||||
#define GRB_LIGHT_CYAN 0xe0ffff
|
||||
#define GRB_DARK_CYAN 0x008b8b
|
||||
#define GRB_LIGHT_MAGENTA 0xffa07a
|
||||
#define GRB_DARK_MAGENTA 0x8b008b
|
||||
#define GRB_LIGHT_ORANGE 0xffa500
|
||||
#define GRB_DARK_ORANGE 0xff8c00
|
||||
#define GRB_LIGHT_PURPLE 0x800080
|
||||
#define GRB_DARK_PURPLE 0x663399
|
||||
#define GRB_LIGHT_PINK 0xffc0cb
|
||||
#define GRB_DARK_PINK 0xff1493
|
||||
#define GRB_LIGHT_BROWN 0xa52a2a
|
||||
#define GRB_DARK_BROWN 0x663300
|
||||
#define GRB_LIGHT_GRAY 0xd3d3d3
|
||||
#define GRB_DARK_GRAY 0x808080
|
||||
|
||||
|
||||
extern BLE_GRB_Data_t WS2812_GRBs;
|
||||
|
|
|
|||
|
|
@ -14,7 +14,7 @@
|
|||
/// System Clock(0=16MHz, 1=32MHz, 2=48MHz, 3=64MHz)
|
||||
#define SYS_CLK (0)
|
||||
/// Debug Mode(0=Disable, 1=via UART, 2=via RTT)
|
||||
#define DBG_MODE (0)
|
||||
#define DBG_MODE (1)
|
||||
|
||||
#define UART_IRQ_MODE (0)
|
||||
#define UART_RTS_CTRL (1)
|
||||
|
|
|
|||
|
|
@ -8,19 +8,25 @@
|
|||
|
||||
#include "prf_sess.h"
|
||||
#include "sys_config.h"
|
||||
#include "app_modbus.h"
|
||||
|
||||
|
||||
#define DBG_MAIN_EN 1
|
||||
|
||||
#if (DBG_MAIN_EN)
|
||||
#include "dbg.h"
|
||||
#define DEBUG(format, ...) debug("[MAIN]" format "\r\n", ##__VA_ARGS__)
|
||||
#else
|
||||
#define DEBUG(format, ...)
|
||||
#define debugHex(dat, len)
|
||||
#endif
|
||||
|
||||
|
||||
void HardFault_Handler(void){
|
||||
debug("HardFault_Handler\r\n");
|
||||
DEBUG("HardFault_Handler\r\n");
|
||||
NVIC_SystemReset();
|
||||
}
|
||||
|
||||
#define FLASH_INFO_CODE_ADDR (FLASH_BASE + 0x08)
|
||||
#define OTA_BANK_A_BASE (0x18004000)
|
||||
#define OTA_BANK_B_BASE (0x18020000)
|
||||
#define OTA_BANK_A (OTA_BANK_A_BASE - FLASH_BASE)
|
||||
#define OTA_BANK_B (OTA_BANK_B_BASE - FLASH_BASE)
|
||||
|
||||
|
||||
BLE_GRB_Data_t BLE_WS2812_GRBs;
|
||||
|
||||
|
|
@ -60,12 +66,14 @@ static void sysInit(void)
|
|||
APBMISC->XOSC16M_CTRL.XOSC16M_CAP_TR = 0x22;
|
||||
}
|
||||
|
||||
static void devInit(void)
|
||||
{
|
||||
static void devInit(void){
|
||||
uint16_t rsn = rstrsn();
|
||||
|
||||
dbgInit();
|
||||
// debug("Start(rsn:0x%X)...\r\n", rsn);
|
||||
iospc_rstpin(true);// 复用为GPIO
|
||||
|
||||
// dbgInit();
|
||||
DEBUG("Start(rsn:0x%X)...\r\n", rsn);// 复位原因
|
||||
|
||||
#if (1 ==BLE_ENABLE)
|
||||
// Init BLE App
|
||||
app_init(rsn);
|
||||
|
|
@ -120,27 +128,6 @@ static tmr_tk_t test_timer_handler(tmr_id_t id){
|
|||
}
|
||||
#endif
|
||||
|
||||
|
||||
uint32_t bank;
|
||||
SYS_CONF_t sys_conf_info;
|
||||
|
||||
__attribute__((section("ram_func.fshc.")))
|
||||
static void flash_sector_erase(uint32_t offset)
|
||||
{
|
||||
GLOBAL_INT_DISABLE();
|
||||
|
||||
while (SYSCFG->ACC_CCR_BUSY);
|
||||
|
||||
fshc_erase(offset, FSH_CMD_ER_SECTOR);
|
||||
|
||||
GLOBAL_INT_RESTORE();
|
||||
}
|
||||
|
||||
void write_cfg(SYS_CONF_t *sys_config_info_t){
|
||||
flash_sector_erase(bank);
|
||||
flash_write(bank, (uint32_t *)sys_config_info_t,sizeof(SYS_CONF_t)/sizeof(uint32_t));
|
||||
}
|
||||
|
||||
int main(void)
|
||||
{
|
||||
sysInit();
|
||||
|
|
@ -148,79 +135,99 @@ int main(void)
|
|||
|
||||
// Global Interrupt Enable
|
||||
GLOBAL_INT_START();
|
||||
/****************
|
||||
bootDelayMs(2000);
|
||||
gpio_dir_output(PA02, OE_HIGH);
|
||||
gpio_dir_output(PA03, OE_HIGH);
|
||||
gpio_dir_output(PA04, OE_HIGH);
|
||||
gpio_dir_output(PA05, OE_HIGH);
|
||||
gpio_dir_output(PA06, OE_HIGH);
|
||||
gpio_dir_output(PA07, OE_HIGH);
|
||||
gpio_dir_output(PA08, OE_HIGH);
|
||||
gpio_dir_output(PA09, OE_HIGH);
|
||||
gpio_dir_output(PA10, OE_HIGH);
|
||||
gpio_dir_output(PA11, OE_HIGH);
|
||||
gpio_dir_output(PA12, OE_HIGH);
|
||||
gpio_dir_output(PA13, OE_HIGH);
|
||||
gpio_dir_output(PA14, OE_HIGH);
|
||||
gpio_dir_output(PA15, OE_HIGH);
|
||||
gpio_dir_output(PA16, OE_HIGH);
|
||||
gpio_dir_output(PA17, OE_HIGH);
|
||||
gpio_dir_output(PA18, OE_HIGH);
|
||||
gpio_dir_output(PA19, OE_HIGH);
|
||||
|
||||
uint32_t curr_code_addr = RD_32(FLASH_INFO_CODE_ADDR);
|
||||
if(curr_code_addr == OTA_BANK_A_BASE)
|
||||
{
|
||||
bank = OTA_BANK_B;
|
||||
while(1){
|
||||
gpio_put(PA02, OE_HIGH);
|
||||
gpio_put(PA03, OE_HIGH);
|
||||
gpio_put(PA04, OE_HIGH);
|
||||
gpio_put(PA05, OE_HIGH);
|
||||
gpio_put(PA06, OE_HIGH);
|
||||
gpio_put(PA07, OE_HIGH);
|
||||
gpio_put(PA08, OE_HIGH);
|
||||
gpio_put(PA09, OE_HIGH);
|
||||
gpio_put(PA10, OE_HIGH);
|
||||
gpio_put(PA11, OE_HIGH);
|
||||
gpio_put(PA12, OE_HIGH);
|
||||
gpio_put(PA13, OE_HIGH);
|
||||
gpio_put(PA14, OE_HIGH);
|
||||
gpio_put(PA15, OE_HIGH);
|
||||
gpio_put(PA16, OE_HIGH);
|
||||
gpio_put(PA17, OE_HIGH);
|
||||
gpio_put(PA18, OE_HIGH);
|
||||
gpio_put(PA19, OE_HIGH);
|
||||
bootDelayMs(200);
|
||||
gpio_put(PA02, OE_LOW);
|
||||
gpio_put(PA03, OE_LOW);
|
||||
gpio_put(PA04, OE_LOW);
|
||||
gpio_put(PA05, OE_LOW);
|
||||
gpio_put(PA06, OE_LOW);
|
||||
gpio_put(PA07, OE_LOW);
|
||||
gpio_put(PA08, OE_LOW);
|
||||
gpio_put(PA09, OE_LOW);
|
||||
gpio_put(PA10, OE_LOW);
|
||||
gpio_put(PA11, OE_LOW);
|
||||
gpio_put(PA12, OE_LOW);
|
||||
gpio_put(PA13, OE_LOW);
|
||||
gpio_put(PA14, OE_LOW);
|
||||
gpio_put(PA15, OE_LOW);
|
||||
gpio_put(PA16, OE_LOW);
|
||||
gpio_put(PA17, OE_LOW);
|
||||
gpio_put(PA18, OE_LOW);
|
||||
gpio_put(PA19, OE_LOW);
|
||||
bootDelayMs(200);
|
||||
}
|
||||
else if(curr_code_addr == OTA_BANK_B_BASE)
|
||||
{
|
||||
bank = OTA_BANK_A;
|
||||
}
|
||||
// read config
|
||||
// read flash
|
||||
flash_read(bank, (uint32_t *)(&sys_conf_info),sizeof(sys_conf_info)/sizeof(uint32_t));
|
||||
|
||||
if(0xA5 !=sys_conf_info.HEAD){
|
||||
sys_conf_info.HEAD=0xA5;
|
||||
sys_conf_info.M_mode_sLim = M_DEFAULT_sLim,//read flash
|
||||
sys_conf_info.U_mode_sLim = U_DEFAULT_sLim,//read flash
|
||||
sys_conf_info.AUTO_Brake_Distance =DEF_AUTO_Brake_Distance,//自动刹车距离
|
||||
sys_conf_info.AUTO_Speed_Cut_Distance =DEF_AUTO_Speed_Cut_Distance,//自动减速距离
|
||||
sys_conf_info.AUTO_Brake_Distance_B =DEF_AUTO_Brake_Distance,//自动刹车距离
|
||||
sys_conf_info.AUTO_Speed_Cut_Distance_B =DEF_AUTO_Speed_Cut_Distance,//自动减速距离
|
||||
write_cfg(&sys_conf_info);
|
||||
}
|
||||
|
||||
|
||||
app_uart_Init(UART1_PORT,9600,PA06,PA07);//上位机//倒车雷达
|
||||
// app_uart_Init(UART2_PORT,9600,20,PA03);
|
||||
*****************/
|
||||
|
||||
app_modbus_Init(9600,PAD_TXD1,PAD_RXD1);//modbus
|
||||
app_uart_Init(UART2_PORT,9600,RADAR_TXD0,RADAR_RXD0);//雷达
|
||||
app_control_init();
|
||||
conf_init();
|
||||
app_radar_init();
|
||||
Time_Event_Init();
|
||||
|
||||
uint8_t str[50]={0,0},str_len=0;
|
||||
|
||||
str_len =sprintf((char *)str, "HEAD=%#X,M_s=%d,U_s=%d\n Brake=%d,Speed_Cut=%d\n Brake_B=%d,Speed_Cut_B=%d\n OKzsxfly",
|
||||
sys_conf_info.HEAD,
|
||||
sys_conf_info.M_mode_sLim,
|
||||
sys_conf_info.U_mode_sLim,
|
||||
sys_conf_info.AUTO_Brake_Distance,
|
||||
sys_conf_info.AUTO_Speed_Cut_Distance,
|
||||
sys_conf_info.AUTO_Brake_Distance_B,
|
||||
sys_conf_info.AUTO_Speed_Cut_Distance_B);
|
||||
uart_send(UART1_PORT,str_len,str);
|
||||
|
||||
GRB_WS2812_Init();
|
||||
|
||||
// GRB_WS2812_Write_color(WS2812_GRBs.len,0xff);
|
||||
// bootDelayMs(1000);
|
||||
// GRB_WS2812_Write_color(WS2812_GRBs.len,0x00);
|
||||
// bootDelayMs(1000);
|
||||
// GRB_WS2812_Write_color(WS2812_GRBs.len,0xff00);
|
||||
// bootDelayMs(1000);
|
||||
// GRB_WS2812_Write_color(WS2812_GRBs.len,0x00);
|
||||
// bootDelayMs(1000);
|
||||
// GRB_WS2812_Write_color(WS2812_GRBs.len,0xff0000);
|
||||
// bootDelayMs(1000);
|
||||
|
||||
BAT_Message_Init();
|
||||
app_ota_init();
|
||||
|
||||
#if (1 ==BLE_ENABLE)
|
||||
// ADC初始化
|
||||
sftmr_start(20, test_timer_handler);
|
||||
#endif
|
||||
|
||||
while(1){
|
||||
// SoftTimer Polling
|
||||
sftmr_schedule();
|
||||
|
||||
#if (1 ==BLE_ENABLE)
|
||||
// Schedule Messages & Events
|
||||
ble_schedule();
|
||||
#endif
|
||||
|
||||
// User's Procedure
|
||||
// app_ble_procedure();
|
||||
|
||||
// OTA Procedure
|
||||
app_ota_proc();
|
||||
|
||||
Control_procedure();
|
||||
iwdt_feed();//喂狗
|
||||
}
|
||||
|
|
|
|||
|
|
@ -0,0 +1,88 @@
|
|||
#include "b6x.h"
|
||||
#include "regs.h"
|
||||
#include "drvs.h"
|
||||
#include "dbg.h"
|
||||
#include "sftmr.h"
|
||||
#include "CRCxx.h"
|
||||
|
||||
#include "bledef.h"
|
||||
#include "app.h"
|
||||
#include "prf_sess.h"
|
||||
|
||||
#include "sys_config.h"
|
||||
|
||||
#define DBG_CONF_EN 1
|
||||
|
||||
#if (DBG_CONF_EN)
|
||||
#include "dbg.h"
|
||||
#define DEBUG(format, ...) debug("[CONF]" format "\r\n", ##__VA_ARGS__)
|
||||
#else
|
||||
#define DEBUG(format, ...)
|
||||
#define debugHex(dat, len)
|
||||
#endif
|
||||
|
||||
|
||||
SYS_CONF_t sys_conf;
|
||||
|
||||
// __attribute__((section("ram_func.fshc.")))
|
||||
// static void flash_sector_erase(uint32_t offset)
|
||||
// {
|
||||
// GLOBAL_INT_DISABLE();
|
||||
|
||||
// while (SYSCFG->ACC_CCR_BUSY);
|
||||
|
||||
// fshc_erase(offset, FSH_CMD_ER_SECTOR);
|
||||
|
||||
// GLOBAL_INT_RESTORE();
|
||||
// }
|
||||
|
||||
|
||||
// 写配置
|
||||
void write_cfg(SYS_CONF_t *sys_config_info_t){
|
||||
flash_page_erase(CONF_OFFSET_ADDR & 0x00FFFF00);
|
||||
|
||||
sys_config_info_t->CRC16 = crc16_modbus((uint8_t *)sys_config_info_t,sizeof(SYS_CONF_t)-2); //计算CRC16
|
||||
DEBUG("Write: CRC16:%#04x",sys_config_info_t->CRC16);
|
||||
flash_write(CONF_OFFSET_ADDR & 0x00FFFF00, (uint32_t *)sys_config_info_t,sizeof(SYS_CONF_t)/sizeof(uint32_t));
|
||||
}
|
||||
|
||||
// 读配置 // 返回 0 成功 1 数据校验错误
|
||||
uint8_t read_cfg(SYS_CONF_t *sys_config_info_t){
|
||||
uint16_t crc16;
|
||||
|
||||
flash_read(CONF_OFFSET_ADDR & 0x00FFFF00, (uint32_t *)sys_config_info_t,sizeof(SYS_CONF_t)/sizeof(uint32_t));
|
||||
|
||||
crc16 = crc16_modbus((uint8_t *)sys_config_info_t,sizeof(SYS_CONF_t)-2); //计算CRC16
|
||||
DEBUG("READ: CRC16:%#04x ,CRC16_CAL:%#04x",sys_config_info_t->CRC16 ,crc16);
|
||||
|
||||
return ((sys_config_info_t->CRC16 == crc16) ? 0 : 1);
|
||||
}
|
||||
|
||||
void conf_init(void){
|
||||
// read config
|
||||
if( read_cfg(&sys_conf) || (sys_conf.VERSION != SOFTWARE_ID)){
|
||||
DEBUG("Read Config :CRC_ERROR ");//读取配置文件失败//使用默认配置
|
||||
sys_conf.VERSION =SOFTWARE_ID;
|
||||
sys_conf.Modbus_addr =D_Modbus_addr;
|
||||
sys_conf.Manager_sLim = D_Manager_sLim;
|
||||
sys_conf.Tourist_sLim = D_Tourist_sLim;
|
||||
sys_conf.Speed_Cut_sLim = D_Speed_Cut_sLim;//(自动减速时油门极限)
|
||||
sys_conf.Brake_DLimit = D_Brake_DLimit;//自动刹车距离(前进)
|
||||
sys_conf.Speed_Cut_DLimit = D_Speed_Cut_DLimit;//自动减速距离
|
||||
sys_conf.Brake_DLimit_B = D_Brake_DLimit_B;//自动刹车距离(后退)
|
||||
sys_conf.Speed_Cut_DLimit_B = D_Speed_Cut_DLimit_B;//自动减速距离
|
||||
DEBUG("write Default Config!!!");// 写入默认配置
|
||||
write_cfg(&sys_conf);
|
||||
}
|
||||
DEBUG("\nsys_conf:lenght=%d",sizeof(sys_conf));
|
||||
DEBUG("VERSION:%#04X",sys_conf.VERSION);
|
||||
DEBUG("Modbus_addr:%#04X",sys_conf.Modbus_addr);
|
||||
DEBUG("Manager_sLim:%d",sys_conf.Manager_sLim);
|
||||
DEBUG("Tourist_sLim:%d",sys_conf.Tourist_sLim);
|
||||
DEBUG("Speed_Cut_sLim:%d",sys_conf.Speed_Cut_sLim);
|
||||
DEBUG("Brake_DLimit:%d",sys_conf.Brake_DLimit);
|
||||
DEBUG("Speed_Cut_DLimit:%d",sys_conf.Speed_Cut_DLimit);
|
||||
DEBUG("Brake_DLimit_B:%d",sys_conf.Brake_DLimit_B);
|
||||
DEBUG("Speed_Cut_DLimit_B:%d\n",sys_conf.Speed_Cut_DLimit_B);
|
||||
}
|
||||
|
||||
|
|
@ -5,26 +5,45 @@
|
|||
#include "stdio.h"
|
||||
#include "app_radar.h"
|
||||
#include "app_ws2812.h"
|
||||
#include "app_buzzer.h"
|
||||
#include "app_Time_Event.h"
|
||||
#include "app_bat.h"
|
||||
#include "app_PAD.h"
|
||||
#include "app_ota.h"
|
||||
|
||||
// 存储在第1扇区第0页
|
||||
#define CONF_OFFSET_BASE (0x18001000) // 配置信息存储地址(以页为单位:0x100)
|
||||
#define CONF_OFFSET_ADDR (CONF_OFFSET_BASE - FLASH_BASE)
|
||||
|
||||
// 必须4字节对齐
|
||||
typedef struct SYS_CONF{
|
||||
uint32_t HEAD;
|
||||
uint32_t M_mode_sLim;
|
||||
uint32_t U_mode_sLim;
|
||||
uint32_t AUTO_Brake_Distance;
|
||||
uint32_t AUTO_Speed_Cut_Distance;
|
||||
uint32_t AUTO_Brake_Distance_B;
|
||||
uint32_t AUTO_Speed_Cut_Distance_B;
|
||||
|
||||
union{
|
||||
uint16_t VERSION; // 软件版本号
|
||||
struct{
|
||||
uint16_t SW_version:11; // 软件版本序号
|
||||
uint16_t HW_version:4; // 硬件版本序号
|
||||
uint16_t VER_type:1; // 当前固件类型0:0x04000;1:0x20000
|
||||
};
|
||||
};
|
||||
uint8_t Modbus_addr; // MODBUS地址
|
||||
uint8_t Manager_sLim; // 管理员模式油门极限(Unit:%)
|
||||
uint8_t Tourist_sLim; // 游客模式油门极限
|
||||
uint8_t Speed_Cut_sLim; // 减速油门极限(Unit:%)(自动减速时油门极限)
|
||||
uint16_t Brake_DLimit; // 刹车距离极限(前进)(Unit:mm)
|
||||
uint16_t Speed_Cut_DLimit; // 减速距离极限
|
||||
uint16_t Brake_DLimit_B; // 刹车距离极限(后退)
|
||||
uint16_t Speed_Cut_DLimit_B;// 减速距离极限
|
||||
uint16_t CRC16; // 配置信息CRC16校验码
|
||||
}SYS_CONF_t;
|
||||
|
||||
extern uint32_t bank;
|
||||
extern SYS_CONF_t sys_conf_info;
|
||||
extern SYS_CONF_t sys_conf;
|
||||
extern BAT_Message_t BAT_Message;
|
||||
|
||||
// 写配置
|
||||
void write_cfg(SYS_CONF_t *sys_config_info_t);
|
||||
// 读配置
|
||||
uint8_t read_cfg(SYS_CONF_t *sys_config_info_t);
|
||||
// 初始化配置
|
||||
void conf_init(void);
|
||||
|
||||
|
||||
// 油门ADC
|
||||
|
|
@ -32,29 +51,44 @@ void write_cfg(SYS_CONF_t *sys_config_info_t);
|
|||
#define ACC_DOWN_Res 5.1 //下分压电阻
|
||||
|
||||
// 电池ADC
|
||||
#define BAT_UP_Res 68.0 //上分压电阻(unit:KΩ)
|
||||
#define BAT_DOWN_Res 3.0 //下分压电阻
|
||||
#define BAT_UP_Res 197.0 //上分压电阻(unit:KΩ)
|
||||
#define BAT_DOWN_Res 4.7 //下分压电阻
|
||||
|
||||
|
||||
/*****************************速度************************/
|
||||
// 管理员模式默认速度极限(0-100%)
|
||||
#define M_DEFAULT_sLim 100
|
||||
// 游客模式默认速度极限(0-100%)
|
||||
#define U_DEFAULT_sLim 50
|
||||
/**************************系统版本**************************/
|
||||
// 软件本号
|
||||
#define SW_VERSION (8)
|
||||
// 硬件本号
|
||||
#define HW_VERSION (2)
|
||||
// 版本类型:0:0x04000;1:0x20000//不可修改
|
||||
#define VER_TYPE ((0x18004000 ==RD_32(0x18000008))?0x0000:0x8000)
|
||||
|
||||
#define SOFTWARE_ID (((SW_VERSION & 0x07FF) | ((HW_VERSION & 0x0F)<<11)) & 0x7fff)
|
||||
|
||||
/*****************************刹车************************/
|
||||
// 默认自动刹车距离0~45dm(分米)
|
||||
#define DEF_AUTO_Brake_Distance 10
|
||||
// 默认自动减速距离0~45dm
|
||||
#define DEF_AUTO_Speed_Cut_Distance 16
|
||||
#define D_Modbus_addr 0x37
|
||||
/************************油门(Unit:%)************************/
|
||||
// 管理员模式默认油门极限(0-100%)
|
||||
#define D_Manager_sLim 100
|
||||
// 游客模式默认油门极限(0-100%)
|
||||
#define D_Tourist_sLim 50
|
||||
// 减速油门极限(0-100%)(自动减速时油门极限)
|
||||
#define D_Speed_Cut_sLim 50
|
||||
/*****************刹车减速距离(前进)(Unit:mm)*****************/
|
||||
// 默认自动刹车距离35~4500mm(毫米)
|
||||
#define D_Brake_DLimit 1000
|
||||
// 默认自动减速距离35~4500mm
|
||||
#define D_Speed_Cut_DLimit 1600
|
||||
/*****************刹车减速距离(后退)(Unit:mm)*****************/
|
||||
// 默认自动刹车距离35~4500mm(毫米)
|
||||
#define D_Brake_DLimit_B 1000
|
||||
// 默认自动减速距离35~4500mm
|
||||
#define D_Speed_Cut_DLimit_B 1600
|
||||
|
||||
|
||||
/*****************************BLE************************/
|
||||
#define BLE_ENABLE 0
|
||||
|
||||
|
||||
|
||||
/*****************************雷达************************/
|
||||
#define RADAR_MODE 0 // 0:电应普 1:FD07-3
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue