Compare commits

..

20 Commits

Author SHA1 Message Date
kkkjtr a5739ad609 上传文件至 /
增加说明文档
2025-10-12 23:11:21 +08:00
kkkjtr 1790496208 ble_expansion_board 2025-07-28 10:09:29 +08:00
zsx 273560b3ac Merge branch 'Control_Borad_V1.2' into Expansion_Board 2025-04-26 12:29:15 +08:00
zsx 8bbea3a147 调整电量计算规则,添加LED控制功能 zsxfly20250426 2025-04-26 09:42:03 +08:00
zsx d354e097e4 修复电量显示问题 zsxfly20250116 2025-01-16 19:29:02 +08:00
zsx cfc764438b 根据新板子调整软件配置 zsxfly20240104 2025-01-04 12:59:51 +08:00
zsx 967e983df7 修复各类问题 --V2.5 zsxfly20241226 2024-12-26 15:37:11 +08:00
zsx a584b681eb 修复当前固件类型指示错误问题 zsxfly20240919 2024-09-19 23:26:19 +08:00
zsx 6b38505012 重定义软件版本定义 zsxfly20240919 2024-09-19 18:02:53 +08:00
zsx 28f347c13f 修复蜂鸣器无法关闭的问题 zsxfly20240919 2024-09-19 18:02:18 +08:00
zsx 67891ca538 添加OTA固件生成脚本,添加系统自检功能 zsxfly20240919 2024-09-19 17:49:52 +08:00
zsx 8f78a1e13b modbus协议添加软件版本寄存器,添加PAD模式超时退出功能,优化定时事件触发处理逻辑 zsxfly20240907 2024-09-07 12:25:32 +08:00
zsx 572d57647d 添加游客模式手动关闭功能 zsxfly20240825 2024-08-25 16:39:07 +08:00
zsx 4e16916b1b 修复不同模式油门限制搞反问题 zsxfly20240822 2024-08-22 23:02:22 +08:00
zsx 399d6f4f5f 修复modbus错误回传0长度报文 zsxfly20240820 2024-08-20 23:33:30 +08:00
zsx 33051e8fb3 兼容旧版本串口协议 zsxfly20240820 2024-08-20 14:05:50 +08:00
zsx 5bb0d06413 修改串口数据接收解析策略,添加OTA升级功能 zsxfly20240820 2024-08-20 11:02:49 +08:00
zsx 87184aa643 添加OTA升级功能 zsxfly20240819 2024-08-19 12:09:05 +08:00
zsx c95d8275c2 PAD通信协议优化 zsxfly20240819 2024-08-19 08:46:40 +08:00
zsx 91135a05fe 提交中控板V2.1源码 zsxfly20240819 2024-08-19 01:14:21 +08:00
39 changed files with 5080 additions and 4974 deletions

27
.gitignore vendored
View File

@ -1,29 +1,2 @@
/.vscode/
output/
*.rar
*.o
*.d
*.crf
*.htm
*.dep
*.map
*.bak
*.lnp
*.lst
*.ini
*.iex
*.scvd
*.uvguix
.uvoptx
*.dbg*
*.uvguix.*
.mxproject
!*.uvprojx
!*.h
!*.c
!*.ioc
!*.axf
!*.bin
!*.hex

Binary file not shown.

View File

@ -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;
}
/**
****************************************************************************************

View File

@ -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*/
}

View File

@ -26,7 +26,7 @@
#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

View File

@ -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);

File diff suppressed because it is too large Load Diff

View File

@ -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()

View File

@ -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

View File

@ -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)
}
}

View File

@ -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

View File

@ -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 -S5 -ZTIFSpeedSel1000 -A0 -C0 -JU1 -JI127.0.0.1 -JP0 -RST0 -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>
@ -252,7 +171,7 @@
<Group>
<GroupName>core</GroupName>
<tvExp>0</tvExp>
<tvExp>1</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<cbSel>0</cbSel>
<RteFlg>0</RteFlg>
@ -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>
@ -406,7 +385,7 @@
<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>
@ -624,13 +603,13 @@
<Group>
<GroupName>drivers</GroupName>
<tvExp>0</tvExp>
<tvExp>1</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<cbSel>0</cbSel>
<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>
@ -664,13 +643,13 @@
<Group>
<GroupName>ble\app</GroupName>
<tvExp>0</tvExp>
<tvExp>1</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<cbSel>0</cbSel>
<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>

View File

@ -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>

View File

@ -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));
}

View File

@ -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

View File

@ -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;

View File

@ -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);

View File

@ -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;
}

View File

@ -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

View File

@ -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)));

View File

@ -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);
}
}

View File

@ -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);

View File

@ -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
}
}

View File

@ -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

View File

@ -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);
}

View File

@ -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

View File

@ -4,192 +4,10 @@
#include "app_radar.h"
#include "sftmr.h"
#include "CRCxx.h"
#include "sys_config.h"
radar_daraframe_t radar_daraframe;
/*
// 定时处理数和获取数据
tmr_id_t radar_timer_tmr_id;
bool radar_flag=0;
uint8_t radar_flag_cnt=0;
// uint8_t radar_str[50]={0,0},radar_str_len=0;
// 定时处理数和获取数据
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_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;
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;
radar_daraframe.Front_data=0xffff;
uart_send(UART1_PORT,8,data);
}
if((35 < Car_Distance) && (Car_Distance < (Get_Status(IN_Back) ? (sys_conf_info.AUTO_Brake_Distance_B * 100) : (sys_conf_info.AUTO_Brake_Distance * 100)))){//小于自动刹车距离时
if(!SYS_AUTO_brake){
Time_Event_Blink(Buzzer_Event,100,100,0xffff,NULL);
}
SYS_AUTO_brake =1;//使能自动刹车
SYS_AUTO_Speed_Cut=1;
}else if((35 < Car_Distance) && (Car_Distance < (Get_Status(IN_Back) ? (sys_conf_info.AUTO_Speed_Cut_Distance_B * 100) : (sys_conf_info.AUTO_Speed_Cut_Distance * 100)))){//小于自动减速距离时
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
}
// 雷达测离初始化
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){
switch(radar_state){
case 0://dev_addr
if (data == 0x01 || data == 0x02) {
radar_buff[0]=data;
radar_state = 1;
}
break;
case 1://cmd_id
if (data == 0x03) {
radar_buff[1]=data;
radar_state = 2;
}else {
radar_state = 0;
radar_buff[0]=0;
}
break;
case 2://length
if (data == 0x02) {
radar_buff[2]=data;
radar_state = 3;
i=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_state = 4;
}
break;
case 4://crc16
radar_buff[5+i] =data;
i++;
if(i==2){
uint16_t crc16 =crc16_checkout(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_flag = 1;
}
i=0;
radar_state = 0;
radar_buff[0]=0;
}
break;
}
}
*/
#define DBG_RADAR_EN 0
#if (DBG_RADAR_EN)
@ -208,82 +26,37 @@ radar_data_t radar_data;
// 自动刹车或减速判断处理函数
void radar_AUTO_BrakeORSpeedCut(uint8_t radar_id , uint16_t Car_Distance){ //距离数据30~4500mm
if(radar_id == RADAR_ID_Front){
radar_daraframe.Front_data =Car_Distance;
}else{
radar_daraframe.Back_data =Car_Distance;
}
// 自动刹车距离
uint16_t Brake_Distance = ((radar_id == RADAR_ID_Back ) ? sys_conf_info.AUTO_Brake_Distance_B : sys_conf_info.AUTO_Brake_Distance) * 100;
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_info.AUTO_Speed_Cut_Distance_B : sys_conf_info.AUTO_Speed_Cut_Distance) * 100;
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_AUTO_brake){
if(!sys_sta.A_brake){
Time_Event_Blink(Buzzer_Event,100,100,0xffff,NULL);
}
SYS_AUTO_brake =1;//使能自动刹车
SYS_AUTO_Speed_Cut=1;
sys_sta.A_brake =1;//使能自动刹车
sys_sta.A_Speed_Cut=1;
}else if((35 < Car_Distance) && Car_Distance < Speed_Cut_Distance){//小于自动减速距离时
if(SYS_AUTO_brake || !SYS_AUTO_Speed_Cut){
if(sys_sta.A_brake || !sys_sta.A_Speed_Cut){
Time_Event_Blink(Buzzer_Event,200,500,0xffff,NULL);
}
SYS_AUTO_brake =0;
SYS_AUTO_Speed_Cut=1;//使能自动减速
sys_sta.A_brake =0;
sys_sta.A_Speed_Cut=1;//使能自动减速
}else{
if(SYS_AUTO_brake || SYS_AUTO_Speed_Cut){
if(sys_sta.A_brake || sys_sta.A_Speed_Cut){
Time_Event_Off(Buzzer_Event,NULL);
}
SYS_AUTO_brake =0;
SYS_AUTO_Speed_Cut=0;
sys_sta.A_brake =0;
sys_sta.A_Speed_Cut=0;
}
DEBUG("\r\nAB:%d,AS:%d\r\n", SYS_AUTO_brake, SYS_AUTO_Speed_Cut);
}
uint8_t radar_flag_cnt=0;
static uint8_t new_state_cnt=3;//标记状态是否变化
// 雷达开关 //0:关 1:开
bool radar_ONOFF =1;
// 定时处理数和获取数据
static tmr_tk_t radar_timer_handler(tmr_id_t id){
(void)(id);
if(Get_Status(OUT_Door_lock)){
// 定时发送状态信息
if(radar_flag_cnt > 8){
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;
return _MS(250);//300ms
}else {
radar_flag_cnt++;
}
}else{
radar_flag_cnt =0;
}
if(radar_NewData_flag == 1){
radar_NewData_flag =0; // 清空新数据标志位
radar_CMDSend_cnt =0; // 清空发送命令计数
@ -298,18 +71,18 @@ static tmr_tk_t radar_timer_handler(tmr_id_t id){
new_state_cnt--;
}
// 进入游客模式开启雷达 //管理员模式优先于游客模式
if(Get_Status(OUT_Door_lock) && !(PAD_Manager_Mode || Get_Status(IN_Manager_Mode)) && (1 == radar_ONOFF)){
if((0x01 == (sys_sta.Pmode | sys_sta.Smode)) && sys_sta.P_Radar_EN){
// 根据倒车状态确定雷达ID
DEBUG("SendCMD:ID=%#02x", (1 == Get_Status(IN_Back)) ? RADAR_ID_Back : RADAR_ID_Front);
app_radar_Sendcmd((1 == Get_Status(IN_Back)) ? RADAR_ID_Back : RADAR_ID_Front ,RADAR_MODE_Real);
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++;
}
return _MS(150);//300ms
return _MS(140);//300ms
}
static uint8_t radar_buff[9];
static uint8_t radar_buff[RADAR_BUFF_MAX];
// 数据接收
void app_radar_Receive(uint8_t data){
@ -353,7 +126,7 @@ void app_radar_Receive(uint8_t data){
radar_buff[5+cnt] =data;
cnt++;
if(cnt==2){
uint16_t crc16 =crc16_checkout(radar_buff,5);
uint16_t crc16 =crc16_modbus(radar_buff,5);
if(crc16 == (((uint16_t)radar_buff[6] << 8 ) | radar_buff[5])){
radar_data.radar_id = radar_buff[0];
radar_data.distance = ((uint16_t)radar_buff[3] << 8 ) | radar_buff[4];
@ -370,13 +143,6 @@ void app_radar_Receive(uint8_t data){
//发送读取实时值数据命令
void app_radar_Sendcmd(uint8_t radar_id , uint8_t radar_mode){
if(radar_id == RADAR_ID_Front){
radar_daraframe.Front_data =0xffff;
}else{
radar_daraframe.Back_data =0xffff;
}
uint8_t len=0;
uint8_t data[8];
@ -387,10 +153,10 @@ void app_radar_Sendcmd(uint8_t radar_id , uint8_t radar_mode){
data[len++] = 0x00;
data[len++] = 0x01;
uint16_t crc16 =crc16_checkout(data,len);
uint16_t crc16 =crc16_modbus(data,len);
data[len++] = crc16 & 0xff;
data[len++] = (crc16 >> 8) & 0xff;
uart_send(UART1_PORT,len,data);
uart_send(UART2_PORT,len,data);
}
// 雷达测离初始化
@ -400,4 +166,3 @@ void app_radar_init(void){
// sftmr_init(); //main函数中已初始化
sftmr_start(10, radar_timer_handler);
}

View File

@ -2,8 +2,7 @@
#define _RADAR_H_
#include "sftmr.h"
#define BUFF_MAX 10
#define RADAR_BUFF_MAX 9
typedef struct radar_daraframe{
volatile uint16_t Front_data;
@ -25,22 +24,13 @@ typedef struct radar_data{
uint16_t distance;
} radar_data_t;
extern radar_daraframe_t radar_daraframe;
extern uint8_t radar_buff[];
extern uint8_t Rec_lenght;
// 雷达开关 //0:关 1:开
extern bool radar_ONOFF;
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

View File

@ -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,215 +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/MAXIMx8+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:
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_daraframe.Front_data /100;// 前雷达距离信息
ret_data[length++] =radar_daraframe.Back_data/100;// 后雷达距离信息
// 读取系统配置
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;
ret_data[length++] =(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,0x4,0x01,ret_data,length);
break;
case 0x05: //0 关闭雷达//1 启用雷达
radar_ONOFF = 0 == uart1_daraframe.data[0] ? 0 : 1;
app_uart_Sendcmd(UART1_PORT,uart1_daraframe.cmd_id,0x01,uart1_daraframe.data,uart1_daraframe.length);
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;
@ -230,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));
}

View File

@ -9,8 +9,8 @@
#define MAX_LEN 32
//1:失能数据校验
#define DISABLE_CRC8 0
//0:失能数据校验
#define ENABLE_CRC8 1
typedef struct uart_daraframe
{

View File

@ -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)

View File

@ -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;

View File

@ -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)

View File

@ -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();
iospc_rstpin(true);// 复用为GPIO
// dbgInit();
// debug("Start(rsn:0x%X)...\r\n", rsn);
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();//喂狗
}

View File

@ -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);
}

View File

@ -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; // 当前固件类型00x0400010x20000
};
};
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)
// 版本类型00x0400010x20000//不可修改
#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电应普 1FD07-3