From 1ccbb168079849477a011f156175a827d91cb2ab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=97=AB=E5=B8=85=E6=9D=B0?= Date: Fri, 27 Oct 2023 11:14:10 +0800 Subject: [PATCH 01/66] =?UTF-8?q?#I8BC2Ddoxygen=E6=B3=A8=E9=87=8A=E7=BC=BA?= =?UTF-8?q?=E5=A4=B1=E8=A1=A5=E5=85=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- drivers/modules/message_queue.h | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/drivers/modules/message_queue.h b/drivers/modules/message_queue.h index 71d063a..77bf777 100644 --- a/drivers/modules/message_queue.h +++ b/drivers/modules/message_queue.h @@ -82,6 +82,11 @@ typedef struct mes_queue { /* 全局变量-------------------------------------------------------------------*/ /* 函数原型-------------------------------------------------------------------*/ +/** + * @addtogroup message_queue_global_functions + * @{ + */ + void mes_queue_init(mes_queue_t *_mq, uint32_t size); void mes_queue_delete(mes_queue_t *_mq); -- Gitee From 3375339b80a7d46baab89a69c1aa8abe554ee2e0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=97=AB=E5=B8=85=E6=9D=B0?= Date: Fri, 27 Oct 2023 13:40:33 +0800 Subject: [PATCH 02/66] =?UTF-8?q?#I8BC2D=20doxygen=E6=B3=A8=E9=87=8A?= =?UTF-8?q?=E7=BC=BA=E5=A4=B1=E8=A1=A5=E5=85=A8,=E7=A8=8B=E5=BA=8F?= =?UTF-8?q?=E7=BB=86=E8=8A=82=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- drivers/common/common_include.h | 6 +++--- drivers/modbus/modbus_common.c | 7 ++++--- drivers/modbus/modbus_common.h | 16 +++++++++++++++- drivers/modbus/modbus_host.c | 24 ++++++++++++------------ drivers/modbus/modbus_host.h | 4 ++-- drivers/modbus/modbus_slave.c | 25 +++++++++++++------------ drivers/modbus/modbus_slave.h | 4 ++-- drivers/modules/command_line.c | 3 +-- drivers/modules/command_line.h | 17 ++++++++--------- drivers/modules/delay_no_block.c | 8 +++----- drivers/modules/delay_no_block.h | 4 ++-- drivers/modules/memory.c | 2 +- drivers/modules/memory.h | 12 ++++++------ drivers/modules/message_queue.c | 2 +- drivers/modules/message_queue.h | 10 +++++----- drivers/modules/ring_queue.c | 2 +- drivers/modules/ring_queue.h | 12 ++++++------ drivers/modules/uart_handler.c | 2 +- drivers/modules/uart_handler.h | 18 +++++++++--------- 19 files changed, 95 insertions(+), 83 deletions(-) diff --git a/drivers/common/common_include.h b/drivers/common/common_include.h index 7568f99..a71ec8d 100644 --- a/drivers/common/common_include.h +++ b/drivers/common/common_include.h @@ -3,7 +3,7 @@ * @file common_include.h * @author ashuai0110 * @version V2.1 - * @date 2023-10-17 + * @date 2023-10-27 * @brief 通用头文件(所有组件都需包含此文件) * ****************************************************************************** @@ -15,8 +15,8 @@ ****************************************************************************** */ -#ifndef __MULTICOMMON_H -#define __MULTICOMMON_H +#ifndef __COMMON_INCLUDE_H +#define __COMMON_INCLUDE_H #ifdef __cplusplus extern "C" { diff --git a/drivers/modbus/modbus_common.c b/drivers/modbus/modbus_common.c index 8771876..ff6a4c4 100644 --- a/drivers/modbus/modbus_common.c +++ b/drivers/modbus/modbus_common.c @@ -3,7 +3,7 @@ * @file modbus_common.c * @author ashuai0110 * @version V2.1 - * @date 2023-10-24 + * @date 2023-10-27 * @brief modbus通用文件 * ****************************************************************************** @@ -65,7 +65,7 @@ static const uint8_t crcHiArr[] = { 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, - 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, + 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40 }; /* CRC 低位字节值表 */ static const uint8_t crcLoArr[] = { @@ -94,7 +94,7 @@ static const uint8_t crcLoArr[] = { 0x99, 0x59, 0x58, 0x98, 0x88, 0x48, 0x49, 0x89, 0x4B, 0x8B, 0x8A, 0x4A, 0x4E, 0x8E, 0x8F, 0x4F, 0x8D, 0x4D, 0x4C, 0x8C, 0x44, 0x84, 0x85, 0x45, 0x87, 0x47, 0x46, 0x86, 0x82, 0x42, - 0x43, 0x83, 0x41, 0x81, 0x80, 0x40, + 0x43, 0x83, 0x41, 0x81, 0x80, 0x40 }; /* HEX转ASCII */ @@ -107,6 +107,7 @@ static const char HEX_TO_ASCII[] = {0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38 /* 全局变量-------------------------------------------------------------------*/ /* 私有函数原型---------------------------------------------------------------*/ + /** * @defgroup modbus_common_global_functions modbus common global functions * @{ diff --git a/drivers/modbus/modbus_common.h b/drivers/modbus/modbus_common.h index 0da400f..1e3c5b4 100644 --- a/drivers/modbus/modbus_common.h +++ b/drivers/modbus/modbus_common.h @@ -3,7 +3,7 @@ * @file modbus_common.h * @author ashuai0110 * @version V2.1 - * @date 2023-10-24 + * @date 2023-10-27 * @brief modbus通用文件 * ****************************************************************************** @@ -41,13 +41,24 @@ extern "C" { * @{ */ +/** + * @defgroup modbus_common_parameters modbus common parameters + * @{ + */ #define MB_BUF_SIZE_MAX (256u) /*!< modbus缓存区最大长度byte */ #define MB_PDU_SIZE_MIN (4u) /*!< modbus PDU最小长度byte */ #define MB_RD_COIL_NUM_MAX (2000u) /*!< modbus读线圈最大数量 */ #define MB_RD_REG_NUM_MAX (125u) /*!< modbus读寄存器最大数量 */ #define MB_WR_COIL_NUM_MAX (1968u) /*!< modbus写线圈最大数量 */ #define MB_WR_REG_NUM_MAX (123u) /*!< modbus读寄存器最大数量 */ +/** + * @} + */ +/** + * @defgroup modbus_common_offset modbus common offset + * @{ + */ #define MB_ADDR_OFF (0u) /*!< modbus从站地址偏移 */ #define MB_CODE_OFF (1u) /*!< modbus功能码偏移 */ #define MB_REG_ADDR_HI_OFF (2u) /*!< modbus寄存器地址高八位偏移 */ @@ -60,6 +71,9 @@ extern "C" { #define MB_RSP_DATA_OFF (3u) /*!< modbus应答(读请求的应答)数据值偏移 */ #define MB_REQ_MULTI_DATA_OFF (7u) /*!< modbus请求(写多个的请求)数据值偏移 */ +/** + * @} + */ /** * @defgroup modbus_common_protocol modbus common protocol diff --git a/drivers/modbus/modbus_host.c b/drivers/modbus/modbus_host.c index 10e33af..9d483fa 100644 --- a/drivers/modbus/modbus_host.c +++ b/drivers/modbus/modbus_host.c @@ -3,7 +3,7 @@ * @file modbus_host.c * @author ashuai0110 * @version V2.1 - * @date 2023-10-25 + * @date 2023-10-27 * @brief modbus主机程序(RTU ASCII) * ****************************************************************************** @@ -449,7 +449,7 @@ uint8_t mb_host_poll(uint8_t ch) #endif } /* 应答的从机地址与请求时不同 */ - if(mbHostArr[ch].dataBuf[0] != mbHostArr[ch].slaveTmp) + if(mbHostArr[ch].dataBuf[MB_ADDR_OFF] != mbHostArr[ch].slaveTmp) { ret = RET_ING; /* 进行中 */ goto rspErr; @@ -579,15 +579,15 @@ uint8_t mb_host_send_cmd(uint8_t ch, uint8_t slaveAddr, uint8_t funCode, uint16_ * * @note 一般加入到(串口)接收中断 * - * @param ch : modbus主机管理序号(即数组索引) + * @param ch : modbus主机管理序号(即数组索引) * - * @param pBuf : 数据缓存区 + * @param pBuf : 数据缓存区 * - * @param len : 写入长度byte + * @param len : 写入长度byte * * @retval uint16_t - * @arg !0 : 成功写入的数据数量 - * @arg 0 : 失败(状态不对或写入已满) + * @arg !0 : 成功写入的数据数量 + * @arg 0 : 失败(状态不对或写入已满) */ uint16_t mb_host_write_rx_buf(uint8_t ch, void *pBuf, uint16_t len) { @@ -620,15 +620,15 @@ uint16_t mb_host_write_rx_buf(uint8_t ch, void *pBuf, uint16_t len) * * @note 一般加入到(串口)发送中断 * - * @param ch : modbus主机管理序号(即数组索引) + * @param ch : modbus主机管理序号(即数组索引) * - * @param pBuf : 数据存储区 + * @param pBuf : 数据存储区 * - * @param len : 读出长度byte + * @param len : 读出长度byte * * @retval uint16_t - * @arg !0 : 成功读出的数据数量 - * @arg 0 : 失败(状态不对或无数据可读) + * @arg !0 : 成功读出的数据数量 + * @arg 0 : 失败(状态不对或无数据可读) */ uint16_t mb_host_read_tx_buf(uint8_t ch, void *pBuf, uint16_t len) { diff --git a/drivers/modbus/modbus_host.h b/drivers/modbus/modbus_host.h index 87e4a3a..fb83d83 100644 --- a/drivers/modbus/modbus_host.h +++ b/drivers/modbus/modbus_host.h @@ -3,7 +3,7 @@ * @file modbus_host.h * @author ashuai0110 * @version V2.1 - * @date 2023-10-25 + * @date 2023-10-27 * @brief modbus主机程序(RTU ASCII) * ****************************************************************************** @@ -43,7 +43,7 @@ extern "C" { #define _MBH_DEBUG (0u) /*!< modbus主机调试信息打印开关 0:关闭 1:开启 */ -#define MBH_NUM (3u) /*!< modbus主机管理数量 用户根据需求自行修改 */ +#define MBH_NUM (3u) /*!< modbus主机管理数量 用户按需修改 */ /** * @} diff --git a/drivers/modbus/modbus_slave.c b/drivers/modbus/modbus_slave.c index d28ced1..9f28450 100644 --- a/drivers/modbus/modbus_slave.c +++ b/drivers/modbus/modbus_slave.c @@ -3,7 +3,7 @@ * @file modbus_slave.c * @author ashuai0110 * @version V2.1 - * @date 2023-10-25 + * @date 2023-10-27 * @brief modbus从机程序(RTU ASCII) * ****************************************************************************** @@ -41,6 +41,7 @@ /* modbus从机管理序号有效性检查 */ #define IS_VALID_MBS_CH(x) \ ( (x) < MBS_NUM) + /* modbus从机地址有效性检查 */ #define IS_VALID_MBS_ADDR(x) \ ( ((x) >= 1u) && \ @@ -326,7 +327,7 @@ uint8_t mb_slave_poll(uint8_t ch) #endif } /* 请求的从机地址与本站地址不相同 */ - if(mbSlaveArr[ch].dataBuf[0] != mbSlaveArr[ch].slaveAddr) + if(mbSlaveArr[ch].dataBuf[MB_ADDR_OFF] != mbSlaveArr[ch].slaveAddr) { ret = RET_ING; /* 进行中 */ goto rspErr; @@ -379,15 +380,15 @@ rspErr: * * @note 一般加入到(串口)接收中断 * - * @param ch : modbus从机管理序号(即数组索引) + * @param ch : modbus从机管理序号(即数组索引) * - * @param pBuf : 数据缓存区 + * @param pBuf : 数据缓存区 * - * @param len : 写入长度byte + * @param len : 写入长度byte * * @retval uint16_t - * @arg !0 : 成功写入的数据数量 - * @arg 0 : 失败(状态不对或写入已满) + * @arg !0 : 成功写入的数据数量 + * @arg 0 : 失败(状态不对或写入已满) */ uint16_t mb_slave_write_rx_buf(uint8_t ch, void *pBuf, uint16_t len) { @@ -419,15 +420,15 @@ uint16_t mb_slave_write_rx_buf(uint8_t ch, void *pBuf, uint16_t len) * * @note 一般加入到(串口)发送中断 * - * @param ch : modbus从机管理序号(即数组索引) + * @param ch : modbus从机管理序号(即数组索引) * - * @param pBuf : 数据存储区 + * @param pBuf : 数据存储区 * - * @param len : 读出长度byte + * @param len : 读出长度byte * * @retval uint16_t - * @arg !0 : 成功读出的数据数量 - * @arg 0 : 失败(状态不对或无数据可读) + * @arg !0 : 成功读出的数据数量 + * @arg 0 : 失败(状态不对或无数据可读) */ uint16_t mb_slave_read_tx_buf(uint8_t ch, void *pBuf, uint16_t len) { diff --git a/drivers/modbus/modbus_slave.h b/drivers/modbus/modbus_slave.h index 0263df2..6104e85 100644 --- a/drivers/modbus/modbus_slave.h +++ b/drivers/modbus/modbus_slave.h @@ -3,7 +3,7 @@ * @file modbus_slave.h * @author ashuai0110 * @version V2.1 - * @date 2023-10-25 + * @date 2023-10-27 * @brief modbus从机程序(RTU ASCII) * ****************************************************************************** @@ -43,7 +43,7 @@ extern "C" { #define _MBS_DEBUG (0u) /*!< modbus从机调试信息打印开关 0:关闭 1:开启 */ -#define MBS_NUM (3u) /*!< modbus从机管理数量 用户根据需求自行修改 */ +#define MBS_NUM (3u) /*!< modbus从机管理数量 用户按需修改 */ /** * @} diff --git a/drivers/modules/command_line.c b/drivers/modules/command_line.c index ab29529..bcbd2ed 100644 --- a/drivers/modules/command_line.c +++ b/drivers/modules/command_line.c @@ -3,10 +3,9 @@ * @file command_line.c * @author ashuai0110 * @version V2.1 - * @date 2023-09-24 + * @date 2023-10-27 * @brief 命令行交互 * (类命令行,空格分割 比如:cmd arg1 arg2\r\n或AT+CMD= arg1 arg2\r\n) - * 分隔符和结束符均可修改 * ****************************************************************************** * @attention diff --git a/drivers/modules/command_line.h b/drivers/modules/command_line.h index 1c5ae3c..b7b08df 100644 --- a/drivers/modules/command_line.h +++ b/drivers/modules/command_line.h @@ -3,10 +3,9 @@ * @file command_line.h * @author ashuai0110 * @version V2.1 - * @date 2023-09-24 + * @date 2023-10-27 * @brief 命令行交互 * (类命令行,空格分割 比如:cmd arg1 arg2\r\n或AT+CMD= arg1 arg2\r\n) - * 分隔符和结束符均可修改 * ****************************************************************************** * @attention @@ -47,13 +46,13 @@ extern "C" { * @defgroup cmd_line_parameters command line parameters * @{ */ -#define CMD_LINE_LEN_MAX (255u) /*!< 命令行一次输入最大长度 */ -#define CMD_LINE_ARG_MAX (8u) /*!< 命令行一次输入最多参数个数 */ -#define CMD_LINE_SAVE_MAX (16u) /*!< 存储命令最多条数 */ -#define CMD_LINE_NAME_MAX (12u) /*!< 命令名称最大长度 */ -#define CMD_LINE_SPLIT_SYMBOL (' ') /*!< 分隔符 */ -#define CMD_LINE_END_SYMBOL1 ('\r') /*!< 结束符1 */ -#define CMD_LINE_END_SYMBOL2 ('\n') /*!< 结束符2 */ +#define CMD_LINE_LEN_MAX (255u) /*!< 命令行一次输入最大长度 用户按需修改 */ +#define CMD_LINE_ARG_MAX (8u) /*!< 命令行一次输入最多参数个数 用户按需修改 */ +#define CMD_LINE_SAVE_MAX (16u) /*!< 存储命令最多条数 用户按需修改 */ +#define CMD_LINE_NAME_MAX (12u) /*!< 命令名称最大长度 用户按需修改 */ +#define CMD_LINE_SPLIT_SYMBOL (' ') /*!< 分隔符 用户按需修改 */ +#define CMD_LINE_END_SYMBOL1 ('\r') /*!< 结束符1 用户按需修改 */ +#define CMD_LINE_END_SYMBOL2 ('\n') /*!< 结束符2 用户按需修改 */ /** * @} */ diff --git a/drivers/modules/delay_no_block.c b/drivers/modules/delay_no_block.c index 669261c..72d201f 100644 --- a/drivers/modules/delay_no_block.c +++ b/drivers/modules/delay_no_block.c @@ -3,7 +3,7 @@ * @file delay_no_block.c * @author ashuai0110 * @version V2.1 - * @date 2023-09-24 + * @date 2023-10-27 * @brief 非阻塞延时 * ****************************************************************************** @@ -42,9 +42,7 @@ */ /* 延时任务ID有效性检查 */ #define IS_VALID_DELAY_ID(x) \ -( ((x) == 0) || \ - (((x) > 0) && \ - ((x) <= DELAY_TASK_SIZE))) +( (x) <= DELAY_TASK_SIZE) /* 延时任务计数值有效性检查 */ #define IS_VALID_DELAY_TICKS(x) \ @@ -67,7 +65,7 @@ */ static delay_item_t delayTaskArr[DELAY_TASK_SIZE]; /* 延时任务工作数组 */ -volatile static uint32_t delayBaseTicks; /* 基本计数值 */ +volatile static uint32_t delayBaseTicks; /* 基本计数值 */ /** * @} diff --git a/drivers/modules/delay_no_block.h b/drivers/modules/delay_no_block.h index 0f459d1..26cba37 100644 --- a/drivers/modules/delay_no_block.h +++ b/drivers/modules/delay_no_block.h @@ -3,7 +3,7 @@ * @file delay_no_block.h * @author ashuai0110 * @version V2.1 - * @date 2023-09-24 + * @date 2023-10-27 * @brief 非阻塞延时 * ****************************************************************************** @@ -45,7 +45,7 @@ extern "C" { * @defgroup delay_task_size delay task size * @{ */ -#define DELAY_TASK_SIZE (20u) /* 最大任务数量(1-65534) */ +#define DELAY_TASK_SIZE (20u) /* 最大任务数量(1-65534) 用户按需修改 */ /** * @} */ diff --git a/drivers/modules/memory.c b/drivers/modules/memory.c index c4d734a..8e22813 100644 --- a/drivers/modules/memory.c +++ b/drivers/modules/memory.c @@ -3,7 +3,7 @@ * @file memory.c * @author ashuai0110 * @version V2.1 - * @date 2023-09-20 + * @date 2023-10-27 * @brief 内存管理-小内存管理算法 * (参考rt-thread的mem,小内存管理算法<2MB) * diff --git a/drivers/modules/memory.h b/drivers/modules/memory.h index 4ffc255..1b95118 100644 --- a/drivers/modules/memory.h +++ b/drivers/modules/memory.h @@ -3,7 +3,7 @@ * @file memory.h * @author ashuai0110 * @version V2.1 - * @date 2023-09-20 + * @date 2023-10-27 * @brief 内存管理 * (参考rt-thread的mem,小内存管理算法<2MB) * @@ -46,7 +46,7 @@ extern "C" { * @defgroup memory_management_size memory management size * @{ */ -#define MEM_SIZE (1024u) /*!< 内存管理总字节数(28至2MB) */ +#define MEM_SIZE (1024u) /*!< 内存管理总字节数(28至2MB) 用户按需修改 */ /** * @} */ @@ -55,7 +55,7 @@ extern "C" { * @defgroup memory_usage_state memory usage state * @{ */ -#define _MEM_STATES (1) /*!< 内存用量统计 0:关闭 1:开启 */ +#define _MEM_STATES (1u) /*!< 内存用量统计 0:关闭 1:开启 */ /** * @} */ @@ -75,9 +75,9 @@ extern "C" { */ typedef struct memory{ uint16_t code; /*!< 内存管理标识 */ - uint16_t used; /*!< 内存使用标志 0未使用 1已使用 */ - uint32_t next; /*!< 下一个管理者的偏移(基于内存首地址) */ - uint32_t prev; /*!< 上一个管理者的偏移(基于内存首地址) */ + uint8_t used; /*!< 内存使用标志 0未使用 1已使用 */ + volatile uint32_t next; /*!< 下一个管理者的偏移(基于内存首地址) */ + volatile uint32_t prev; /*!< 上一个管理者的偏移(基于内存首地址) */ } mem_t; /** diff --git a/drivers/modules/message_queue.c b/drivers/modules/message_queue.c index 3b203e8..691fe61 100644 --- a/drivers/modules/message_queue.c +++ b/drivers/modules/message_queue.c @@ -3,7 +3,7 @@ * @file message_queue.c * @author ashuai0110 * @version V2.1 - * @date 2023-09-20 + * @date 2023-10-27 * @brief 消息队列 * (适合不定长数据和复杂数据,写入时动态申请内存) * diff --git a/drivers/modules/message_queue.h b/drivers/modules/message_queue.h index 77bf777..9b84dc0 100644 --- a/drivers/modules/message_queue.h +++ b/drivers/modules/message_queue.h @@ -3,7 +3,7 @@ * @file message_queue.h * @author ashuai0110 * @version V2.1 - * @date 2023-09-20 + * @date 2023-10-27 * @brief 消息队列 * (适合不定长数据和复杂数据,写入时动态申请内存) * @@ -69,10 +69,10 @@ typedef struct mes_queue_item { * @brief 消息队列 structrue definition */ typedef struct mes_queue { - uint16_t maxCnt; /*!< 消息数量 非消息长度而是消息项结构体(mes_queue_item_t)的个数 */ - uint16_t curCnt; /*!< 当前消息数量 */ - mes_queue_item_t *pHead; /*!< 消息队列头节点 */ - mes_queue_item_t *pTail; /*!< 消息队列尾节点 */ + uint16_t maxCnt; /*!< 消息数量 非消息长度而是消息项结构体(mes_queue_item_t)的个数 */ + volatile uint16_t curCnt; /*!< 当前消息数量 */ + mes_queue_item_t *pHead; /*!< 消息队列头节点 */ + mes_queue_item_t *pTail; /*!< 消息队列尾节点 */ } mes_queue_t; /** diff --git a/drivers/modules/ring_queue.c b/drivers/modules/ring_queue.c index bf90160..fc2791c 100644 --- a/drivers/modules/ring_queue.c +++ b/drivers/modules/ring_queue.c @@ -3,7 +3,7 @@ * @file ring_queue.c * @author ashuai0110 * @version V2.1 - * @date 2023-09-24 + * @date 2023-10-27 * @brief 环形队列 * (适合定长或易分离出的数据,写入后必须读出才可再写,写满后新数据无法写入) * diff --git a/drivers/modules/ring_queue.h b/drivers/modules/ring_queue.h index 65a2461..978356d 100644 --- a/drivers/modules/ring_queue.h +++ b/drivers/modules/ring_queue.h @@ -3,7 +3,7 @@ * @file ring_queue.h * @author ashuai0110 * @version V2.1 - * @date 2023-09-24 + * @date 2023-10-27 * @brief 环形队列 * (适合定长或易分离出的数据,写入后必须读出才可再写,写满后新数据无法写入) * @@ -48,11 +48,11 @@ extern "C" { * @brief 环形队列 structure definition */ typedef struct ring_queue { - char *pHead; /*!< 环形队列头节点(开始读节点) */ - char *pTail; /*!< 环形队列尾节点(开始写节点) */ - char *pBuf; /*!< 环形队列数据缓存区 */ - uint32_t curCnt; /*!< 环形队列数据当前存储数量(byte) */ - uint32_t maxCnt; /*!< 环形队列数据最大存储数量(byte) */ + char *pHead; /*!< 环形队列头节点(开始读节点) */ + char *pTail; /*!< 环形队列尾节点(开始写节点) */ + char *pBuf; /*!< 环形队列数据缓存区 */ + volatile uint32_t curCnt; /*!< 环形队列数据当前存储数量(byte) */ + uint32_t maxCnt; /*!< 环形队列数据最大存储数量(byte) */ } ring_queue_t; /** diff --git a/drivers/modules/uart_handler.c b/drivers/modules/uart_handler.c index 0802c52..eabd271 100644 --- a/drivers/modules/uart_handler.c +++ b/drivers/modules/uart_handler.c @@ -3,7 +3,7 @@ * @file uart_handler.c * @author woshiashuai * @version V2.1 - * @date 2023-09-26 + * @date 2023-10-27 * @brief 串口管理 * (使用帧间隔分帧或现有的分帧方法) * diff --git a/drivers/modules/uart_handler.h b/drivers/modules/uart_handler.h index 4d47b0b..966398e 100644 --- a/drivers/modules/uart_handler.h +++ b/drivers/modules/uart_handler.h @@ -3,7 +3,7 @@ * @file uart_handler.h * @author woshiashuai * @version V2.1 - * @date 2023-09-26 + * @date 2023-10-27 * @brief 串口管理 * (使用帧间隔分帧或现有的分帧方法) * @@ -43,7 +43,7 @@ extern "C" { * @{ */ -#define UART_HANDLER_NUM (1u) /*!< 串口管理数量 */ +#define UART_HANDLER_NUM (3u) /*!< 串口管理数量 用户按需修改 */ /** * @} @@ -70,13 +70,13 @@ typedef void (* uart_tx_en_fn_t)(uint8_t enState); * @brief 串口管理 structure definition */ typedef struct uart_handler { - uint16_t targetFrameIntv; /*!< 目标帧间隔 */ - uint16_t curFrameIntv; /*!< 当前帧间隔 */ - uint16_t recTimeoutCnt; /*!< 接收超时计数 */ - uint16_t recTimeout; /*!< 接收超时时间 */ - ring_queue_t txRingQueue; /*!< 发送环形队列 */ - ring_queue_t rxRingQueue; /*!< 接收环形队列 */ - uart_tx_en_fn_t uartTxEnFn; /*!< 串口发送前准备函数 */ + uint16_t targetFrameIntv; /*!< 目标帧间隔 */ + volatile uint16_t curFrameIntv; /*!< 当前帧间隔 */ + volatile uint16_t recTimeoutCnt; /*!< 接收超时计数 */ + uint16_t recTimeout; /*!< 接收超时时间 */ + ring_queue_t txRingQueue; /*!< 发送环形队列 */ + ring_queue_t rxRingQueue; /*!< 接收环形队列 */ + uart_tx_en_fn_t uartTxEnFn; /*!< 串口发送前准备函数 */ } uart_handler_t; /** -- Gitee From fe46e3bacfd8fbdec133f6bfcf52e136ec2d39ff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=98=BF=E8=A1=B00110?= Date: Sat, 23 Dec 2023 17:41:32 +0800 Subject: [PATCH 03/66] =?UTF-8?q?=E4=BF=AE=E6=94=B9gpio=E5=9F=BA=E7=A1=80?= =?UTF-8?q?=E6=93=8D=E4=BD=9C=E4=B8=BA=E7=8B=AC=E7=AB=8B=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- examples/[base_on_stm32f1]/stm32f1_sys/gpio.c | 89 +++++++++++-------- examples/[base_on_stm32f1]/stm32f1_sys/gpio.h | 6 +- 2 files changed, 57 insertions(+), 38 deletions(-) diff --git a/examples/[base_on_stm32f1]/stm32f1_sys/gpio.c b/examples/[base_on_stm32f1]/stm32f1_sys/gpio.c index 7554ba7..29fb38e 100644 --- a/examples/[base_on_stm32f1]/stm32f1_sys/gpio.c +++ b/examples/[base_on_stm32f1]/stm32f1_sys/gpio.c @@ -1,21 +1,26 @@ #include "gpio.h" -// LED_RUN + +/* GPIO使用到的时钟 */ +#define GPIO_USED_CLK (RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB) +/* GPIO基础操作API */ +#define GPIO_TOGGLE(port, pin) ((port)->BSRR = (((port)->ODR & (pin)) << 16) | (~(port)->ODR & (pin))) +#define GPIO_SET(port, pin) ((port)->BSRR = (uint32_t)(pin)) +#define GPIO_RESET(port, pin) ((port)->BSRR = (uint32_t)(pin) << 16) +#define GPIO_READ(port, pin) (((port)->IDR & (pin)) != 0) +/* 用户实现的GPIO端口和引脚宏定义 */ +/* LED_RUN 0点亮 1熄灭 */ #define LED_RUN_GPIO_PORT (GPIOA) -#define LED_RUN_GPIO_CLK (RCC_APB2Periph_GPIOA) #define LED_RUN_GPIO_PIN (GPIO_Pin_8) -#define LED_RUN_GPIO_TOGGLE (LED_RUN_GPIO_PORT->BSRR = ((LED_RUN_GPIO_PORT->ODR & LED_RUN_GPIO_PIN) << 16) | (~LED_RUN_GPIO_PORT->ODR & LED_RUN_GPIO_PIN)) -#define LED_RUN_GPIO_SET (LED_RUN_GPIO_PORT->BSRR = (uint32_t)LED_RUN_GPIO_PIN) -#define LED_RUN_GPIO_RESET (LED_RUN_GPIO_PORT->BSRR = (uint32_t)LED_RUN_GPIO_PIN<<16) -#define LED_RUN_GPIO_READ ((LED_RUN_GPIO_PORT->IDR & LED_RUN_GPIO_PIN) != 0) -// TEST_IN +/* TEST_IN */ #define TEST_IN_GPIO_PORT (GPIOA) -#define TEST_IN_GPIO_CLK (RCC_APB2Periph_GPIOA) #define TEST_IN_GPIO_PIN (GPIO_Pin_2) -#define TEST_IN_GPIO_TOGGLE (TEST_IN_GPIO_PORT->BSRR = ((TEST_IN_GPIO_PORT->ODR & TEST_IN_GPIO_PIN) << 16) | (~TEST_IN_GPIO_PORT->ODR & TEST_IN_GPIO_PIN)) -#define TEST_IN_GPIO_SET (TEST_IN_GPIO_PORT->BSRR = (uint32_t)TEST_IN_GPIO_PIN) -#define TEST_IN_GPIO_RESET (TEST_IN_GPIO_PORT->BSRR = (uint32_t)TEST_IN_GPIO_PIN<<16) -#define TEST_IN_GPIO_READ ((TEST_IN_GPIO_PORT->IDR & TEST_IN_GPIO_PIN) != 0) +/* GPIO_1 */ +#define GPIO_1_GPIO_PORT (GPIOB) +#define GPIO_1_GPIO_PIN (GPIO_Pin_1) +/* GPIO_2 */ +#define GPIO_2_GPIO_PORT (GPIOC) +#define GPIO_2_GPIO_PIN (GPIO_Pin_1) /** * @brief gpio初始化配置 @@ -26,69 +31,79 @@ void gpio_init_config(void) { GPIO_InitTypeDef GPIO_InitStructure; - /*开启LED相关的GPIO外设时钟*/ - RCC_APB2PeriphClockCmd(LED_RUN_GPIO_CLK, ENABLE); - GPIO_InitStructure.GPIO_Pin = LED_RUN_GPIO_PIN; - /*设置引脚模式为*/ - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; - /*设置引脚速率*/ - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; - /*调用库函数,初始化GPIO*/ - GPIO_Init(LED_RUN_GPIO_PORT, &GPIO_InitStructure); - /*关闭*/ - LED_RUN_GPIO_SET; + RCC_APB2PeriphClockCmd(GPIO_USED_CLK, ENABLE); /* 开启GPIO外设相关时钟 */ + + GPIO_InitStructure.GPIO_Pin = LED_RUN_GPIO_PIN; /* 设置引脚号 */ + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; /* 设置引脚模式 */ + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; /* 设置引脚速率 */ + GPIO_Init(LED_RUN_GPIO_PORT, &GPIO_InitStructure); /* 初始化GPIO */ + +// GPIO_InitStructure.GPIO_Pin = GPIO_1_GPIO_PIN; +// GPIO_Init(GPIO_1_GPIO_PORT, &GPIO_InitStructure); +// +// GPIO_InitStructure.GPIO_Pin = GPIO_2_GPIO_PIN; +// GPIO_Init(GPIO_2_GPIO_PORT, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = TEST_IN_GPIO_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; GPIO_Init(TEST_IN_GPIO_PORT, &GPIO_InitStructure); + + /* gpio default state */ + gpio_set(LED_RUN); } /** * @brief IO置高 - * @param None + * @param gpiox : gpio枚举名称 @ref gpiox_enum_t * @retval None */ void gpio_set(uint8_t gpiox) { switch(gpiox) { - case LED_RUN: LED_RUN_GPIO_SET; break; - case TEST_IN: TEST_IN_GPIO_SET; break; + case LED_RUN: GPIO_SET(LED_RUN_GPIO_PORT, LED_RUN_GPIO_PIN); break; + case TEST_IN: GPIO_SET(TEST_IN_GPIO_PORT, TEST_IN_GPIO_PIN); break; + case GPIO_1: GPIO_SET(GPIO_1_GPIO_PORT, GPIO_1_GPIO_PIN); break; + case GPIO_2: GPIO_SET(GPIO_2_GPIO_PORT, GPIO_2_GPIO_PIN); break; } } /** * @brief IO置低 - * @param None + * @param gpiox : gpio枚举名称 @ref gpiox_enum_t * @retval None */ void gpio_reset(uint8_t gpiox) { switch(gpiox) { - case LED_RUN: LED_RUN_GPIO_RESET; break; - case TEST_IN: TEST_IN_GPIO_RESET; break; + case LED_RUN: GPIO_RESET(LED_RUN_GPIO_PORT, LED_RUN_GPIO_PIN); break; + case TEST_IN: GPIO_RESET(TEST_IN_GPIO_PORT, TEST_IN_GPIO_PIN); break; + case GPIO_1: GPIO_RESET(GPIO_1_GPIO_PORT, GPIO_1_GPIO_PIN); break; + case GPIO_2: GPIO_RESET(GPIO_2_GPIO_PORT, GPIO_2_GPIO_PIN); break; } } /** * @brief IO翻转 - * @param None + * @param gpiox : gpio枚举名称 @ref gpiox_enum_t * @retval None */ void gpio_toggle(uint8_t gpiox) { switch(gpiox) { - case LED_RUN: LED_RUN_GPIO_TOGGLE; break; - case TEST_IN: TEST_IN_GPIO_TOGGLE; break; + case LED_RUN: GPIO_TOGGLE(LED_RUN_GPIO_PORT, LED_RUN_GPIO_PIN); break; + case TEST_IN: GPIO_TOGGLE(TEST_IN_GPIO_PORT, TEST_IN_GPIO_PIN); break; + case GPIO_1: GPIO_TOGGLE(GPIO_1_GPIO_PORT, GPIO_1_GPIO_PIN); break; + case GPIO_2: GPIO_TOGGLE(GPIO_2_GPIO_PORT, GPIO_2_GPIO_PIN); break; } } /** * @brief IO读取 - * @param None - * @retval None + * @param gpiox : gpio枚举名称 @ref gpiox_enum_t + * @retval 0:low level 1:high level */ uint8_t gpio_read(uint8_t gpiox) { @@ -96,8 +111,10 @@ uint8_t gpio_read(uint8_t gpiox) switch(gpiox) { - case LED_RUN: temp = LED_RUN_GPIO_READ; break; - case TEST_IN: temp = TEST_IN_GPIO_READ; break; + case LED_RUN: temp = GPIO_READ(LED_RUN_GPIO_PORT, LED_RUN_GPIO_PIN); break; + case TEST_IN: temp = GPIO_READ(TEST_IN_GPIO_PORT, TEST_IN_GPIO_PIN); break; + case GPIO_1: temp = GPIO_READ(GPIO_1_GPIO_PORT, GPIO_1_GPIO_PIN); break; + case GPIO_2: temp = GPIO_READ(GPIO_2_GPIO_PORT, GPIO_2_GPIO_PIN); break; } return temp; diff --git a/examples/[base_on_stm32f1]/stm32f1_sys/gpio.h b/examples/[base_on_stm32f1]/stm32f1_sys/gpio.h index a5dfc93..c0f1a76 100644 --- a/examples/[base_on_stm32f1]/stm32f1_sys/gpio.h +++ b/examples/[base_on_stm32f1]/stm32f1_sys/gpio.h @@ -17,9 +17,11 @@ PC13,PC14,PC15非必要不使用 /* 类型定义-------------------------------------------------------------------*/ typedef enum { - LED_RUN = 0, + LED_RUN, TEST_IN, -} GPIOxEnum; + GPIO_1, + GPIO_2 +} gpiox_enum_t; /* 全局变量-------------------------------------------------------------------*/ -- Gitee From d59db0d5bb0a1f7bc42af8be4e8f72cbf018771e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=98=BF=E8=A1=B00110?= Date: Sat, 23 Dec 2023 17:42:01 +0800 Subject: [PATCH 04/66] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E4=B8=B2=E5=8F=A31dma?= =?UTF-8?q?=E9=A9=B1=E5=8A=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../[base_on_stm32f1]/stm32f1_sys/usart_dma.c | 181 ++++++++++++++++++ .../[base_on_stm32f1]/stm32f1_sys/usart_dma.h | 26 +++ 2 files changed, 207 insertions(+) create mode 100644 examples/[base_on_stm32f1]/stm32f1_sys/usart_dma.c create mode 100644 examples/[base_on_stm32f1]/stm32f1_sys/usart_dma.h diff --git a/examples/[base_on_stm32f1]/stm32f1_sys/usart_dma.c b/examples/[base_on_stm32f1]/stm32f1_sys/usart_dma.c new file mode 100644 index 0000000..1637331 --- /dev/null +++ b/examples/[base_on_stm32f1]/stm32f1_sys/usart_dma.c @@ -0,0 +1,181 @@ +/* 包含头文件-----------------------------------------------------------------*/ +#include "usart.h" +#include "common_include.h" + +/* 私有宏定义-----------------------------------------------------------------*/ + +/* 私有类型定义---------------------------------------------------------------*/ + +/* 私有变量-------------------------------------------------------------------*/ + +/* 全局变量-------------------------------------------------------------------*/ + +/* 私有函数原型---------------------------------------------------------------*/ + + +/* 串口1中断 */ +//void USART1_IRQHandler(void) +//{ +// /* 串口1空闲中断 */ +// if(USART_GetITStatus(USART1,USART_IT_IDLE) != RESET) +// { +// USART1->SR; +// USART1->DR; +// +// /* 这里写接收处理 */ +// } +//} + +/* 串口1接收的dma中断 */ +//void DMA1_Channel5_IRQHandler(void) +//{ +// /* DMA传输完成中断 */ +// if(DMA_GetITStatus(DMA1_IT_TC5) != RESET) +// { +// /* 这里写接收处理 */ +// +// DMA_ClearITPendingBit(DMA1_IT_TC5); +// } +//} + +/* 串口1发送的dma中断 */ +//void DMA1_Channel4_IRQHandler(void) +//{ +// /* DMA传输完成中断 */ +// if(DMA_GetITStatus(DMA1_IT_TC4) != RESET) +// { +// /* 这里写读取发送内容的处理 */ +// +// DMA_ClearITPendingBit(DMA1_IT_TC5); +// } +//} + +/** + * @brief USART1 DMA初始化 + * @param baudRate : 波特率 + * @retval None + */ +void usart1_dma_init_config(uint32_t baudRate, uint8_t *pTxBuf, uint16_t txBufLen, uint8_t *pRxBuf, uint16_t rxBufLen) +{ + GPIO_InitTypeDef GPIO_InitStructure; + USART_InitTypeDef USART_InitStructure; + NVIC_InitTypeDef NVIC_InitStructure; + DMA_InitTypeDef DMA_InitStructure; + + /* DMA clock enable */ + RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); + /* Enable GPIO clock */ + RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); + /* Enable USART1 Clock */ + RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE); + + /* Configure USART1 Rx as input floating */ + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; + GPIO_Init(GPIOA, &GPIO_InitStructure); + + /* Configure USART1 Tx as alternate function push-pull */ + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; + GPIO_Init(GPIOA, &GPIO_InitStructure); + + USART_DeInit(USART1); + USART_InitStructure.USART_BaudRate = baudRate; + USART_InitStructure.USART_WordLength = USART_WordLength_8b; + USART_InitStructure.USART_StopBits = USART_StopBits_1; + USART_InitStructure.USART_Parity = USART_Parity_No; + USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; + USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; + /* Configure USART1 */ + USART_Init(USART1, &USART_InitStructure); + /* Enable USART1 DMA TX request */ + USART_DMACmd(USART1, USART_DMAReq_Tx, ENABLE); + /* Enable USART1 DMA RX request */ + USART_DMACmd(USART1, USART_DMAReq_Rx, ENABLE); + + DMA_DeInit(DMA1_Channel4); + DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)(&USART1->DR); + DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)pTxBuf; + DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST; + DMA_InitStructure.DMA_BufferSize = txBufLen; + DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; + DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; + DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; + DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; + DMA_InitStructure.DMA_Mode = DMA_Mode_Normal; + DMA_InitStructure.DMA_Priority = DMA_Priority_High; + DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; + DMA_Init(DMA1_Channel4, &DMA_InitStructure); + + DMA_DeInit(DMA1_Channel5); + DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)(&USART1->DR); + DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)pRxBuf; + DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; + DMA_InitStructure.DMA_BufferSize = rxBufLen; + DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; + DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; + DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; + DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; + DMA_InitStructure.DMA_Mode = DMA_Mode_Normal; + DMA_InitStructure.DMA_Priority = DMA_Priority_High; + DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; + DMA_Init(DMA1_Channel5, &DMA_InitStructure); + + DMA_ClearFlag(DMA1_FLAG_TC4); + DMA_ITConfig(DMA1_Channel4, DMA_IT_TE, ENABLE); + DMA_ITConfig(DMA1_Channel4, DMA_IT_TC, ENABLE); + DMA_ClearFlag(DMA1_FLAG_TC5); + DMA_ITConfig(DMA1_Channel5, DMA_IT_TE, ENABLE); + DMA_ITConfig(DMA1_Channel5, DMA_IT_TC, ENABLE); + /* Disable USART1 DMA TX Channel */ + DMA_Cmd(DMA1_Channel4, DISABLE); + /* Enable USART1 DMA RX Channel */ + DMA_Cmd(DMA1_Channel5, ENABLE); + + /* Enable the USART1 Receive IDLE Interrupt */ + USART_ITConfig(USART1, USART_IT_IDLE, ENABLE); + USART_Cmd(USART1, ENABLE); + + /* Enable the USART1 Interrupt */ + NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4); + NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; + NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; + NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; + NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; + NVIC_Init(&NVIC_InitStructure); + NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel4_IRQn; + NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; + NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; + NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; + NVIC_Init(&NVIC_InitStructure); + NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel5_IRQn; + NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3; + NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; + NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; + NVIC_Init(&NVIC_InitStructure); +} + +/** + * @brief USART1 DMA 发送重新初始化 + * @param num : 数量 + * @retval None + */ +void usart1_dma_tx_reconfig(uint16_t num) +{ + DMA_Cmd(DMA1_Channel4, DISABLE); + DMA_SetCurrDataCounter(DMA1_Channel4, num); + DMA_Cmd(DMA1_Channel4, ENABLE); +} + +/** + * @brief USART1 DMA 接收重新初始化 + * @param num : 数量 + * @retval None + */ +void usart1_dma_rx_reconfig(uint16_t num) +{ + DMA_Cmd(DMA1_Channel5, DISABLE); + DMA_SetCurrDataCounter(DMA1_Channel5, num); + DMA_Cmd(DMA1_Channel5, ENABLE); +} diff --git a/examples/[base_on_stm32f1]/stm32f1_sys/usart_dma.h b/examples/[base_on_stm32f1]/stm32f1_sys/usart_dma.h new file mode 100644 index 0000000..1d54bd9 --- /dev/null +++ b/examples/[base_on_stm32f1]/stm32f1_sys/usart_dma.h @@ -0,0 +1,26 @@ +#ifndef __USART_AS_H +#define __USART_AS_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* 包含头文件-----------------------------------------------------------------*/ +#include "stm32f10x.h" + +/* 宏定义---------------------------------------------------------------------*/ + +/* 类型定义-------------------------------------------------------------------*/ + +/* 全局变量-------------------------------------------------------------------*/ + +/* 函数原型-------------------------------------------------------------------*/ +void usart1_dma_init_config(uint32_t baudRate, uint8_t *pTxBuf, uint16_t txBufLen, uint8_t *pRxBuf, uint16_t rxBufLen); +void usart1_dma_tx_reconfig(uint16_t num); +void usart1_dma_rx_reconfig(uint16_t num); + +#ifdef __cplusplus +} +#endif + +#endif -- Gitee From 36283028fd6e666e1ec5c0da32d8301cdbf85ad0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=98=BF=E8=A1=B00110?= Date: Sat, 23 Dec 2023 17:44:41 +0800 Subject: [PATCH 05/66] =?UTF-8?q?#I8LFE8=20=E5=A2=9E=E5=8A=A0=E8=AF=A6?= =?UTF-8?q?=E7=BB=86=E7=9A=84=E6=BA=90=E7=A0=81=E6=B3=A8=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- drivers/modules/command_line.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/drivers/modules/command_line.c b/drivers/modules/command_line.c index bcbd2ed..42a902a 100644 --- a/drivers/modules/command_line.c +++ b/drivers/modules/command_line.c @@ -102,14 +102,15 @@ static void cmd_line_help(cmd_line_t *_cmd, int argc, char *argv[]) uint16_t cnt, len; cmd_line_printf(_cmd, "cmd name list:\n"); - + /* 输出所有命令名 */ for(cnt = 0; cnt < CMD_LINE_SAVE_MAX; cnt++) { len = strlen(cmdNameArr[cnt].cmdName); + /* 长度不为0才输出 */ if(len) { cmd_line_printf(_cmd, "->%s\n", cmdNameArr[cnt].cmdName); - } + } /* 长度为0直接退出 因为命令名的存放是连续的 */ else { return ; -- Gitee From 202d907ae63699bb78ba66c8704b41bd9bdf6eb1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=98=BF=E8=A1=B00110?= Date: Sat, 23 Dec 2023 17:46:18 +0800 Subject: [PATCH 06/66] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E8=A1=A5=E7=A0=81?= =?UTF-8?q?=E8=BD=AC=E6=95=B4=E6=95=B0=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- drivers/modules/data_convert.c | 71 ++++++++++++++++++++++++++++------ drivers/modules/data_convert.h | 7 +++- 2 files changed, 65 insertions(+), 13 deletions(-) diff --git a/drivers/modules/data_convert.c b/drivers/modules/data_convert.c index b2466ea..3299d37 100644 --- a/drivers/modules/data_convert.c +++ b/drivers/modules/data_convert.c @@ -3,7 +3,7 @@ * @file data_convert.c * @author ashuai0110 * @version V2.1 - * @date 2023-09-19 + * @date 2023-12-11 * @brief 数据转换方法集合 * ****************************************************************************** @@ -12,6 +12,10 @@ * 版权声明:内容为编者(ashuai0110)原创,使用请注明出处,当然,你也可以不这样做^_^ * 出处链接:https://gitee.com/ashuai0110/mcu_reuse_development_module.git * + * Change Logs: + * Date Author Notes + * 2023-12-11 ashuai0110 增加conv_complement_code_to_dec函数,增加详细的代码注释 + * ****************************************************************************** */ @@ -45,6 +49,10 @@ /* 十六进制字符串转十进制整数的长度有效性检查 */ #define IS_VALID_HEX_DEC_LENGTH(x) \ ( (x) <= 8) + +/* 补码转十进制整数的位数有效性检查 */ +#define IS_VALID_COMP_DEC_BIT_NUM(x) \ +( (x) <= 32) /** * @} */ @@ -75,17 +83,18 @@ static int conv_str_dec_to_dec_method(char *pSrc, uint8_t len) for(i = 0; i < len; i++) { + /* 超出十进制字符范围则return */ if(pSrc[i] < '0' || pSrc[i] > '9') { return 0; } - tmp = pSrc[i] - '0'; + tmp = pSrc[i] - '0'; /* 减去字符'0'即是整数值 */ j = len - 1 - i; while(j--) { - tmp = tmp * 10; + tmp = (tmp << 3) + (tmp << 1); /* 根据当前字符位置乘以10 例:共3个字符,当前字符是第1个,则乘以两次10 */ } - ret += tmp; + ret += tmp; /* 累加结果 */ } return ret; @@ -126,24 +135,29 @@ uint32_t conv_str_split(char *pBuf[], char *pSrc, char flg, uint32_t num) ASSERT_PARAM(IS_VALID_POINT(pBuf)); ASSERT_PARAM(IS_VALID_POINT(pSrc)); + /* 缓存区先存放第一个字符串首地址 */ pBuf[cnt++] = pSrc; while(1) { + /* 若当前字符与参数flg相同 */ if(*pSrc == flg) { + /* 当前字符改为'\0' 代表字符串到此结束 */ *pSrc = '\0'; + /* 若分割数量达到参数num则break */ if(cnt >= num) { - return cnt; + break; } + /* 缓存区存放下一个字符串首地址 */ pBuf[cnt++] = pSrc + 1; - } // 结束符'\r' '\n' '\0'可自定义修改 + } /* 若当前字符与结束符'\r' '\n' '\0'相同则break, 结束符可自定义修改 */ else if(*pSrc == '\r' || *pSrc == '\n' || *pSrc == '\0') { *pSrc = '\0'; break; } - pSrc++; + pSrc++; /* 当前字符地址自增 */ } return cnt; @@ -166,16 +180,17 @@ int conv_str_dec_to_dec(char *pSrc, uint8_t len) if(len == 0) { - len = strlen(pSrc); + len = strlen(pSrc); /* 参数len是0则使用strlen获取长度 */ } ASSERT_PARAM(IS_VALID_POINT(pSrc)); ASSERT_PARAM(IS_VALID_DEC_DEC_LENGTH(len)); + /* 首个字符是-则表示是负数 */ if(strncmp(pSrc, "-", 1) == 0) { dec = 0 - conv_str_dec_to_dec_method(pSrc + 1, len - 1); - } + } /* 首个字符不是-则表示是正数 */ else { dec = conv_str_dec_to_dec_method(pSrc, len); @@ -193,7 +208,7 @@ int conv_str_dec_to_dec(char *pSrc, uint8_t len) * * @param len : 转换数量,填0内部使用strlen()判断长度 * - * @retval 返回转换后的十进制整数 + * @retval 返回转换后的十进制整数,为0若非有意则可能返回的是错误 */ uint32_t conv_str_hex_to_dec(char *pSrc, uint8_t len) { @@ -202,7 +217,7 @@ uint32_t conv_str_hex_to_dec(char *pSrc, uint8_t len) if(len == 0) { - len = strlen(pSrc); + len = strlen(pSrc); /* 参数len是0则使用strlen获取长度 */ } ASSERT_PARAM(IS_VALID_POINT(pSrc)); @@ -210,21 +225,53 @@ uint32_t conv_str_hex_to_dec(char *pSrc, uint8_t len) for(cnt = 0; cnt < len; cnt++) { - tmp = toupper(pSrc[cnt]) - 0x30; + tmp = toupper(pSrc[cnt]) - '0'; /* 字符转大写减去字符'0' */ + /* 大于22说明超出十六进制字符范围 */ if(tmp > 22) { return 0; } + /* ABCDEF需要再减7,因为'9'到'A'之间有7个其他字符 */ if(tmp > 9) { tmp -= 7; } + /* 根据当前字符所在位置左移后累加 例:共两个字符,当前字符在第一个,则左移四位 */ ret |= (tmp << ((len - 1 - cnt) << 2)); } return ret; } +/** + * @brief 补码转十进制整数 + * + * @param complement : 补码 + * + * @param bitNum : 补码的位数(一般有8,16,32) + * + * @retval 返回转换后的十进制整数 + */ +int conv_complement_code_to_dec(uint32_t complement, uint8_t bitNum) +{ + ASSERT_PARAM(IS_VALID_COMP_DEC_BIT_NUM(bitNum)); + + complement &= ((1ul << bitNum) - 1); /* 置零有效位之外的位 */ + + /* 符号位为- */ + if(complement >> (bitNum - 1)) + { + complement = (~(complement - 1)) & ((1ul << (bitNum - 1)) - 1); /* 减1 取反 保留有效位(原码到补码的逆操作) */ + complement = 0 - complement; /* 负数 */ + } /* 符号位为+ */ + else + { + /* 正数的补码是其本身 */ + } + + return complement; +} + /** * @} */ diff --git a/drivers/modules/data_convert.h b/drivers/modules/data_convert.h index 163852e..7cb6df0 100644 --- a/drivers/modules/data_convert.h +++ b/drivers/modules/data_convert.h @@ -3,7 +3,7 @@ * @file data_convert.h * @author ashuai0110 * @version V2.1 - * @date 2023-09-19 + * @date 2023-12-11 * @brief 数据转换方法集合 * ****************************************************************************** @@ -12,6 +12,10 @@ * 版权声明:内容为编者(ashuai0110)原创,使用请注明出处,当然,你也可以不这样做^_^ * 出处链接:https://gitee.com/ashuai0110/mcu_reuse_development_module.git * + * Change Logs: + * Date Author Notes + * 2023-12-11 ashuai0110 增加conv_complement_code_to_dec函数,增加详细的代码注释 + * ****************************************************************************** */ @@ -50,6 +54,7 @@ extern "C" { uint32_t conv_str_split(char *pBuf[], char *pSrc, char flg, uint32_t num); int conv_str_dec_to_dec(char *pSrc, uint8_t len); uint32_t conv_str_hex_to_dec(char *pSrc, uint8_t len); +int conv_complement_code_to_dec(uint32_t complement, uint8_t bitNum); /** * @} -- Gitee From 7c54fb53c7ea646958d73cfd2a3512ec14bb02d1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=98=BF=E8=A1=B00110?= Date: Sat, 23 Dec 2023 17:48:34 +0800 Subject: [PATCH 07/66] =?UTF-8?q?=E6=96=B0=E5=A2=9Ebootloader=E7=BB=84?= =?UTF-8?q?=E4=BB=B6,xmodem=E5=8D=8F=E8=AE=AE=E7=BB=84=E4=BB=B6=E5=92=8C?= =?UTF-8?q?=E5=85=B6=E7=94=A8=E4=BE=8B(=E6=9C=AA=E5=AE=8C=E6=88=90)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- drivers/bootloader/bootloader.c | 116 ++++ drivers/bootloader/bootloader.h | 101 +++ drivers/bootloader/xmodem.c | 436 ++++++++++++ drivers/bootloader/xmodem.h | 182 +++++ examples/bootloader/MDK/use_example.uvoptx | 707 ++++++++++++++++++++ examples/bootloader/MDK/use_example.uvprojx | 622 +++++++++++++++++ examples/bootloader/README.txt | 44 ++ examples/bootloader/SRC/main.c | 159 +++++ 8 files changed, 2367 insertions(+) create mode 100644 drivers/bootloader/bootloader.c create mode 100644 drivers/bootloader/bootloader.h create mode 100644 drivers/bootloader/xmodem.c create mode 100644 drivers/bootloader/xmodem.h create mode 100644 examples/bootloader/MDK/use_example.uvoptx create mode 100644 examples/bootloader/MDK/use_example.uvprojx create mode 100644 examples/bootloader/README.txt create mode 100644 examples/bootloader/SRC/main.c diff --git a/drivers/bootloader/bootloader.c b/drivers/bootloader/bootloader.c new file mode 100644 index 0000000..5a25db1 --- /dev/null +++ b/drivers/bootloader/bootloader.c @@ -0,0 +1,116 @@ +/** + ****************************************************************************** + * @file bootloader.c + * @author ashuai0110 + * @version V1.0 + * @date 2023-12-3 + * @brief + * + ****************************************************************************** + * @attention + * + * 版权声明:内容为编者(ashuai0110)原创,使用请注明出处,当然,你也可以不这样做^_^ + * 出处链接:https://gitee.com/ashuai0110/mcu_reuse_development_module.git + * + ****************************************************************************** + */ + +/* 包含头文件-----------------------------------------------------------------*/ +#include "bootloader.h" + +/** + * @addtogroup modules + * @{ + */ + +/** + * @defgroup command_line command_line + * @{ + */ + +/* 私有宏定义-----------------------------------------------------------------*/ +/** + * @defgroup command_line_local_macros command line local macros + * @{ + */ + +/** + * @defgroup command_line_check_parameters_validity command line check parameters validity + * @{ + */ +/* 命令行回显标志有效性检查 */ +#define IS_VALID_ECHO_FLAG(x) \ +( ((x) == CMD_LINE_ECHO_ON) || \ + ((x) == CMD_LINE_ECHO_OFF)) + +/** + * @} + */ + +/** + * @} + */ + +/* 私有类型定义---------------------------------------------------------------*/ + +/* 私有变量-------------------------------------------------------------------*/ +/** + * @defgroup command_line_local_variables command line local variables + * @{ + */ + +static cmd_line_t *pCmdLineHead = NULL; /*!< 命令行链表头节点 */ + +/** + * @} + */ + +/* 全局变量-------------------------------------------------------------------*/ + +/* 私有函数原型---------------------------------------------------------------*/ +/** + * @defgroup command_line_local_functions command line local functions + * @{ + */ + +/** + * @brief help命令处理 + * + * @note 列举所有命令名称 + * + * @param _cmd : 命令行实例 + * + * @param argc : 参数个数 + * + * @param argv : 参数数据 + * + * @retval None + */ +static void cmd_line_help(cmd_line_t *_cmd, int argc, char *argv[]) +{ + +} + + +/** + * @} + */ + +/** + * @defgroup command_line_global_functions command line global functions + * @{ + */ + + + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ diff --git a/drivers/bootloader/bootloader.h b/drivers/bootloader/bootloader.h new file mode 100644 index 0000000..0749192 --- /dev/null +++ b/drivers/bootloader/bootloader.h @@ -0,0 +1,101 @@ +/** + ****************************************************************************** + * @file bootloader.h + * @author ashuai0110 + * @version V1.0 + * @date 2023-12-3 + * @brief + * + ****************************************************************************** + * @attention + * + * 版权声明:内容为编者(ashuai0110)原创,使用请注明出处,当然,你也可以不这样做^_^ + * 出处链接:https://gitee.com/ashuai0110/mcu_reuse_development_module.git + * + ****************************************************************************** + */ + +#ifndef __BOOTLOADER_H +#define __BOOTLOADER_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* 包含头文件-----------------------------------------------------------------*/ +#include "common_include.h" + +/** + * @addtogroup modules + * @{ + */ + +/** + * @addtogroup command_line + * @{ + */ + +/* 宏定义---------------------------------------------------------------------*/ +/** + * @defgroup command_line_global_macros command line global macros + * @{ + */ + +/** + * @defgroup cmd_line_run_flg command line run flag + * @{ + */ +#define CMD_LINE_RUN_STOP (1u) /*!< 不运行 */ +#define CMD_LINE_RUN_START (0u) /*!< 运行 */ +/** + * @} + */ + +/** + * @} + */ + +/* 类型定义-------------------------------------------------------------------*/ +/** + * @defgroup command_line_global_types command line global types + * @{ + */ + +/** + * @brief 命令行 structure definition + */ +typedef struct cmd_line { + char dataArr[1]; /*!< 数据暂存区 */ + struct cmd_line* pNext; /*!< 下一节点 */ +} cmd_line_t; + +/** + * @} + */ + +/* 全局变量-------------------------------------------------------------------*/ + +/* 函数原型-------------------------------------------------------------------*/ +/** + * @addtogroup command_line_global_functions + * @{ + */ + + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* bootloader.h */ diff --git a/drivers/bootloader/xmodem.c b/drivers/bootloader/xmodem.c new file mode 100644 index 0000000..6f35e12 --- /dev/null +++ b/drivers/bootloader/xmodem.c @@ -0,0 +1,436 @@ +/** + ****************************************************************************** + * @file xmodem.c + * @author ashuai0110 + * @version V1.0 + * @date 2023-12-3 + * @brief 串口xmodem协议 + * + ****************************************************************************** + * @attention + * + * 版权声明:内容为编者(ashuai0110)原创,使用请注明出处,当然,你也可以不这样做^_^ + * 出处链接:https://gitee.com/ashuai0110/mcu_reuse_development_module.git + * + ****************************************************************************** + */ + +/* 包含头文件-----------------------------------------------------------------*/ +#include "xmodem.h" + +/** + * @addtogroup modules + * @{ + */ + +/** + * @defgroup command_line command_line + * @{ + */ + +/* 私有宏定义-----------------------------------------------------------------*/ +/** + * @defgroup command_line_local_macros command line local macros + * @{ + */ + +/** + * @defgroup command_line_check_parameters_validity command line check parameters validity + * @{ + */ +/* xmodem接收标志有效性检查 */ +#define IS_VALID_RX_FLAG(x) \ +( ((x) == XMODEM_RX_FLAG_NAK) || \ + ((x) == XMODEM_RX_FLAG_CRC)) + +/** + * @} + */ + +/** + * @} + */ + +/* 私有类型定义---------------------------------------------------------------*/ + +/* 私有变量-------------------------------------------------------------------*/ +/** + * @defgroup command_line_local_variables command line local variables + * @{ + */ + + +/** + * @} + */ + +/* 全局变量-------------------------------------------------------------------*/ + +/* 私有函数原型---------------------------------------------------------------*/ +/** + * @defgroup command_line_local_functions command line local functions + * @{ + */ + +static uint16_t xmodem_check_crc16(const uint8_t *data, uint16_t len) +{ + uint8_t cnt; + uint16_t crc = 0; // Initial value + + while(len--) + { + crc ^= (uint16_t)(*data++) << 8; // crc ^= (uint16_t)(*data)<<8; data++; + for(cnt = 0; cnt < 8; ++cnt) + { + if(crc & 0x8000) + { + crc = (crc << 1) ^ 0x1021; + } + else + { + crc <<= 1; + } + } + } + + return crc; +} + +/** + * @brief xmodem校验累加和 + * + * @param pBuf : 校验数据 + * + * @param len : 校验数据长度 + * + * @retval 累加和 + */ +static uint8_t xmodem_check_sum(const uint8_t *data, uint16_t len) +{ + uint8_t sum = 0; + uint16_t cnt = 0; + + for(; cnt < len; cnt++) + { + sum += data[cnt]; + } + + return sum; +} + +/** + * @brief xmodem初始化 + * + * @param _xmodem : xmodem管理实例 + * + * @param pBuf : 数据缓存区 + * + * @param bufLen : 数据缓存区长度byte + * + * @param txEnFn : 串口发送前准备函数 + * + * @param rspTimeout : 回复超时时间ms + * + * @retval None + */ +void xmodem_init(xmodem_t *_xmodem, const void *pBuf, uint16_t bufLen, xmodem_tx_en_t txEnFn, uint16_t rspTimeout) +{ + ASSERT_PARAM(IS_VALID_POINT(_xmodem)); + ASSERT_PARAM(IS_VALID_POINT(pBuf)); + ASSERT_PARAM(IS_VALID_POINT(txEnFn)); + + _xmodem->dataBuf = (uint8_t *)pBuf; + _xmodem->dataBufLen = bufLen; + _xmodem->dataLen = 0; + _xmodem->readLen = 0; + _xmodem->txEnFn = txEnFn; + _xmodem->rspTimeout = rspTimeout; + _xmodem->rspTimeoutCnt = 0; + _xmodem->packetNum = 1; + _xmodem->state = XMODEM_RX_STATE_IDLE; + _xmodem->checkNum = 0; +} + +/** + * @brief xmodem接收轮询处理 + * + * @param _xmodem : xmodem管理实例 + * + * @retval None + */ +void xmodem_rx_poll(xmodem_t *_xmodem) +{ + ASSERT_PARAM(IS_VALID_POINT(_xmodem)); + + switch(_xmodem->state) + { + case XMODEM_RX_STATE_IDLE: + break; + case XMODEM_RX_STATE_WAIT: + /* 应答超时判断 */ + if(_xmodem->rspTimeoutCnt > _xmodem->rspTimeout) + { + _xmodem->rspTimeoutCnt = 0; + _xmodem->dataLen = 1; + _xmodem->txEnFn(1); + } + break; + case XMODEM_RX_STATE_CHECK_HEAD: + if(XMODEM_SOH == _xmodem->dataBuf[0] && (3 + 128 + _xmodem->checkNum) == _xmodem->dataLen) + { + _xmodem->state = XMODEM_RX_STATE_CHECK_DATA; + goto _check_data; + } + else if(XMODEM_STX == _xmodem->dataBuf[0] && (3 + 1024 + _xmodem->checkNum) == _xmodem->dataLen) + { + _xmodem->state = XMODEM_RX_STATE_CHECK_DATA; + goto _check_data; + } + else if(XMODEM_EOT == _xmodem->dataBuf[0]) + { + _xmodem->dataBuf[0] = XMODEM_ACK; + _xmodem->dataLen = 1; + _xmodem->state = XMODEM_RX_STATE_IDLE; + _xmodem->txEnFn(1); + } + else if(XMODEM_CAN == _xmodem->dataBuf[0]) + { + _xmodem->state = XMODEM_RX_STATE_IDLE; + } + break; + case XMODEM_RX_STATE_CHECK_DATA: +_check_data: + if(_xmodem->packetNum == _xmodem->dataBuf[1] && (_xmodem->dataBuf[1] + _xmodem->dataBuf[2]) == 0xFF) + { + uint16_t checkDataLen; + + if(1 == _xmodem->checkNum) + { + checkDataLen = _xmodem->dataLen - 3 - _xmodem->checkNum; + if(0 == (_xmodem->dataBuf[_xmodem->dataLen - 1] - xmodem_check_sum(&_xmodem->dataBuf[3], checkDataLen))) + { + xmodem_user_get_packet_cb(_xmodem->packetNum++, &_xmodem->dataBuf[3], checkDataLen); + _xmodem->dataBuf[0] = XMODEM_ACK; + } + else + { + _xmodem->dataBuf[0] = XMODEM_NAK; + } + } + else if(2 == _xmodem->checkNum) + { + checkDataLen = _xmodem->dataLen - 3; + if(0 == xmodem_check_crc16(&_xmodem->dataBuf[3], _xmodem->dataLen - 3)) + { + xmodem_user_get_packet_cb(_xmodem->packetNum++, &_xmodem->dataBuf[3], checkDataLen - _xmodem->checkNum); + _xmodem->dataBuf[0] = XMODEM_ACK; + } + else + { + _xmodem->dataBuf[0] = XMODEM_NAK; + } + } + } + else + { + _xmodem->dataBuf[0] = XMODEM_NAK; + } + _xmodem->dataLen = 1; + _xmodem->txEnFn(1); + _xmodem->state = XMODEM_RX_STATE_WAIT; + break; + default: + _xmodem->state = XMODEM_RX_STATE_IDLE; + break; + } +} + +/** + * @brief xmodem接收启动 + * + * @param _xmodem : xmodem管理实例 + * + * @param startFlag : 接收启动标志 @ref xmodem_rx_flag + * @arg XMODEM_RX_FLAG_NAK : 接收方发送XMODEM_NAK启动传输,发送方使用校验和 + * @arg XMODEM_RX_FLAG_CRC : 接收方发送'C'启动传输,发送方使用CRC校验 + * + * @retval None + */ +void xmodem_rx_start(xmodem_t *_xmodem, uint8_t startFlag) +{ + ASSERT_PARAM(IS_VALID_POINT(_xmodem)); + ASSERT_PARAM(IS_VALID_RX_FLAG(startFlag)); + + if(XMODEM_RX_STATE_IDLE == _xmodem->state) + { + _xmodem->dataBuf[0] = startFlag; + _xmodem->dataLen = 1; + _xmodem->checkNum = (startFlag == XMODEM_RX_FLAG_NAK) ? 1 : 2; + _xmodem->readLen = 0; + _xmodem->state = XMODEM_RX_STATE_WAIT; + _xmodem->txEnFn(1); + } +} + +/** + * @brief xmodem发送轮询处理 + * + * @param _xmodem : xmodem管理实例 + * + * @retval None + */ +void xmodem_tx_poll(xmodem_t *_xmodem) +{ + ASSERT_PARAM(IS_VALID_POINT(_xmodem)); + + switch(_xmodem->state) + { + + } +} + +/** + * @brief xmodem发送 启动 + * + * @param _xmodem : xmodem管理实例 + * + * @retval None + */ +void xmodem_rx_start(xmodem_t *_xmodem) +{ + ASSERT_PARAM(IS_VALID_POINT(_xmodem)); + + +} + +/** + * @brief xmodem 1s时基提供 + * + * @note 1s周期执行 + * + * @param _xmodem : xmodem管理实例 + * + * @retval None + */ +void xmodem_1s_tick_handler(xmodem_t *_xmodem) +{ + if(_xmodem->rspTimeoutCnt && XMODEM_RX_STATE_WAIT == _xmodem->state) + { + _xmodem->rspTimeoutCnt++; + } +} + +/** + * @brief 写入数据到接收缓冲区 + * + * @note 一般加入到(串口)接收中断 + * + * @param _xmodem : xmodem管理实例 + * + * @param pBuf : 数据缓存区 + * + * @param len : 写入长度byte + * + * @retval uint16_t + * @arg !0 : 成功写入的数据数量 + * @arg 0 : 失败(写入已满) + */ +uint16_t xmodem_write_rx_buf(xmodem_t *_xmodem, const void *pBuf, uint16_t len) +{ + uint16_t unusedLen; + + ASSERT_PARAM(IS_VALID_POINT(_xmodem)); + ASSERT_PARAM(IS_VALID_POINT(_xmodem->dataBuf)); + ASSERT_PARAM(IS_VALID_POINT(pBuf)); + + unusedLen = _xmodem->dataBufLen - _xmodem->dataLen; + len = (len > unusedLen) ? unusedLen : len; + + if(0 < len) + { + memcpy((void *)&_xmodem->dataBuf[_xmodem->dataLen], (void *)pBuf, len); + _xmodem->dataLen += len; + _xmodem->rspTimeoutCnt = 0; + if(XMODEM_RX_STATE_WAIT == _xmodem->state) + { + _xmodem->state = XMODEM_RX_STATE_CHECK_HEAD; + } + } + + return len; +} + +/** + * @brief 读出数据从发送缓冲区 + * + * @note 一般加入到(串口)发送中断 + * + * @param _xmodem : xmodem管理实例 + * + * @param pBuf : 数据存储区 + * + * @param len : 读出长度byte + * + * @retval uint16_t + * @arg !0 : 成功读出的数据数量 + * @arg 0 : 失败(无数据可读) + */ +uint16_t xmodem_read_tx_buf(xmodem_t *_xmodem, const void *pBuf, uint16_t len) +{ + uint16_t unreadLen; + + ASSERT_PARAM(IS_VALID_POINT(_xmodem)); + ASSERT_PARAM(IS_VALID_POINT(_xmodem->dataBuf)); + ASSERT_PARAM(IS_VALID_POINT(pBuf)); + + unreadLen = _xmodem->dataLen - _xmodem->readLen; + len = (len > unreadLen) ? unreadLen : len; + + if(0 < len) + { + memcpy((void *)pBuf, (void *)&_xmodem->dataBuf[_xmodem->readLen], len); + _xmodem->readLen += len; + if(_xmodem->readLen == _xmodem->dataLen) + { + _xmodem->dataLen = 0; + _xmodem->readLen = 0; + _xmodem->rspTimeoutCnt = 1; + } + } + + return len; +} + +__WEAK void xmodem_user_get_packet_cb(uint8_t packetNum, uint8_t *data, uint16_t len) +{ + PRINT_LOG("xmodem packet num:%d, len:%d, data: ", packetNum, len); + for(uint16_t i = 0; i < len; i++) + { + PRINT_LOG("%02X ", data[i]); + } + PRINT_LOG("\r\n"); +} + + +/** + * @} + */ + +/** + * @defgroup command_line_global_functions command line global functions + * @{ + */ + + + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ diff --git a/drivers/bootloader/xmodem.h b/drivers/bootloader/xmodem.h new file mode 100644 index 0000000..7db8d18 --- /dev/null +++ b/drivers/bootloader/xmodem.h @@ -0,0 +1,182 @@ +/** + ****************************************************************************** + * @file xmodem.h + * @author ashuai0110 + * @version V1.0 + * @date 2023-12-3 + * @brief + * + ****************************************************************************** + * @attention + * + * 版权声明:内容为编者(ashuai0110)原创,使用请注明出处,当然,你也可以不这样做^_^ + * 出处链接:https://gitee.com/ashuai0110/mcu_reuse_development_module.git + * + ****************************************************************************** + */ + +#ifndef __XMODEM_H +#define __XMODEM_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* 包含头文件-----------------------------------------------------------------*/ +#include "common_include.h" + +/** + * @addtogroup modules + * @{ + */ + +/** + * @addtogroup xmodem + * @{ + */ + +/* 宏定义---------------------------------------------------------------------*/ +/** + * @defgroup xmodem_global_macros xmodem global macros + * @{ + */ + +/** + * @defgroup xmodem_frame_head xmodem frame head + * @{ + */ +#define XMODEM_SOH (0x01u) /*!< 128byte数据 */ +#define XMODEM_STX (0x02u) /*!< 1024byte数据 */ +#define XMODEM_EOT (0x04u) /*!< 发送结束 */ +#define XMODEM_ACK (0x06u) /*!< 正确应答 */ +#define XMODEM_NAK (0x15u) /*!< 错误应答/校验方式累加和 */ +#define XMODEM_CAN (0x18u) /*!< 取消发送 */ +#define XMODEM_CTRLZ (0x1Au) /*!< 填充字节 */ +#define XMODEM_CRC16 ('C') /*!< 校验方式CRC16 */ +/** + * @} + */ + +/** + * @defgroup xmodem_rx_state xmodem rx state + * @{ + */ +#define XMODEM_RX_STATE_IDLE (0u) /*!< 空闲状态 */ +#define XMODEM_RX_STATE_WAIT (1u) /*!< 等待接收状态 */ +#define XMODEM_RX_STATE_CHECK_HEAD (2u) /*!< 校验数据头状态 */ +#define XMODEM_RX_STATE_CHECK_DATA (3u) /*!< 校验数据状态 */ +#define XMODEM_RX_STATE_ACK (4u) /*!< 回复状态 */ +/** + * @} + */ + +/** + * @defgroup xmodem_rx_flag xmodem rx flag + * @{ + */ +#define XMODEM_RX_FLAG_NAK (XMODEM_NAK) /*!< 接收方发送NAK启动传输,发送方使用累加和校验 */ +#define XMODEM_RX_FLAG_CRC (XMODEM_CRC16) /*!< 接收方发送'C'启动传输,发送方使用CRC16校验 */ +/** + * @} + */ + +/** + * @} + */ + +/* 类型定义-------------------------------------------------------------------*/ +/** + * @defgroup xmodem_global_types xmodem global types + * @{ + */ + +/** + * @brief xmodem发送前(串口)准备函数 + * + * @note 如:使用串口中断发送时需使能发送相关中断/使用串口DMA发送时需配置使能DMA + * + * @param enState : 0-关闭(失能) 1-开启(使能) + * + * @retval None + */ +typedef void (* xmodem_tx_en_t)(uint8_t enState); + +/** + * @brief xmodem获取/设置数据包函数 + * + * @note 获取数据包即本机接收对方传输来的数据, 设置数据包即本机提供将要发送的数据 + * + * @param packetNum : 从1开始,超出后回到0继续累加(1-255,0-255...) + * + * @param data : 获取数据包此参数包含有效数据/设置数据包此参数需用户写入有效数据 + * + * @param len : 有效数据长度 + * + * @retval None + */ +typedef void (* xmodem_user_packet_cb_t)(uint8_t packetNum, uint8_t *data, uint16_t *len); + +/** + * @brief xmodem structure definition + */ +typedef struct xmodem { + uint8_t *dataBuf; /*!< 数据缓冲区 */ + uint16_t dataBufLen; /*!< 数据缓冲区大小 */ + uint16_t dataLen; /*!< 存放数据数量 */ + uint16_t readLen; /*!< 数据读出数量 */ + + uint8_t packetNum; /*!< 包序号 */ + uint8_t rspTimeout; /*!< 回复超时时间1-254sec */ + uint8_t rspTimeoutCnt; /*!< 回复超时时间计数1-254sec */ + uint8_t rspTimeoutTimes; /*!< 回复超时次数 */ + + uint8_t state : 3; /*!< xmodem状态 */ + uint8_t checkNum : 2; /*!< 校验字节数 */ + + xmodem_tx_en_t txEnFn; /*!< 串口发送准备函数 */ + +} xmodem_t; + +/** + * @} + */ + +/* 全局变量-------------------------------------------------------------------*/ + +/* 函数原型-------------------------------------------------------------------*/ +/** + * @addtogroup xmodem_global_functions + * @{ + */ + +void xmodem_init(xmodem_t *_xmodem, const void *pBuf, uint16_t bufLen, xmodem_tx_en_t txEnFn, uint16_t rspTimeout); + +void xmodem_rx_poll(xmodem_t *_xmodem); + +void xmodem_rx_start(xmodem_t *_xmodem, uint8_t startFlag); + +void xmodem_1s_tick_handler(xmodem_t *_xmodem); + +uint16_t xmodem_write_rx_buf(xmodem_t *_xmodem, const void *pBuf, uint16_t len); +uint16_t xmodem_read_tx_buf(xmodem_t *_xmodem, const void *pBuf, uint16_t len); + +/* 弱定义函数 */ +void xmodem_user_get_packet_cb(uint8_t packetNum, uint8_t *data, uint16_t len); + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* xmodem.h */ diff --git a/examples/bootloader/MDK/use_example.uvoptx b/examples/bootloader/MDK/use_example.uvoptx new file mode 100644 index 0000000..733c4a7 --- /dev/null +++ b/examples/bootloader/MDK/use_example.uvoptx @@ -0,0 +1,707 @@ + + + + 1.0 + +
### uVision Project, (C) Keil Software
+ + + *.c + *.s*; *.src; *.a* + *.obj; *.o + *.lib + *.txt; *.h; *.inc; *.md + *.plm + *.cpp; *.cc; *.cxx + 0 + + + + 0 + 0 + + + + Target 1 + 0x4 + ARM-ADS + + 12000000 + + 1 + 1 + 0 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\Listings\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 18 + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 1 + 0 + 0 + 1 + 0 + 0 + 4 + + + + + + + + + + + Segger\JL2CM3.dll + + + + 0 + ARMRTXEVENTFLAGS + -L70 -Z18 -C0 -M0 -T1 + + + 0 + DLGTARM + (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0) + + + 0 + ARMDBGFLAGS + + + + 0 + DLGUARM + d + + + 0 + JL2CM3 + -U59522627 -O78 -S2 -ZTIFSpeedSel5000 -A0 -C0 -JU1 -JI127.0.0.1 -JP0 -RST0 -N00("ARM CoreSight SW-DP") -D00(1BA01477) -L00(0) -TO18 -TC10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -TB1 -TFE0 -FO15 -FD20000000 -FC1000 -FN1 -FF0STM32F10x_128.FLM -FS08000000 -FL020000 -FP0($$Device:STM32F103C8$Flash\STM32F10x_128.FLM) + + + 0 + UL2CM3 + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32F10x_128 -FS08000000 -FL020000 -FP0($$Device:STM32F103C8$Flash\STM32F10x_128.FLM)) + + + + + + 0 + 1 + usart1DmaRxBuf + + + + 0 + + + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + 0 + 0 + 0 + + + + + + + + + + 1 + 1 + 0 + 2 + 10000000 + + + + + + cmsis + 0 + 0 + 0 + 0 + + 1 + 1 + 1 + 0 + 0 + 0 + ..\..\[base_on_stm32f1]\stm32f1_lib\cmsis\core_cm3.c + core_cm3.c + 0 + 0 + + + 1 + 2 + 1 + 0 + 0 + 0 + ..\..\[base_on_stm32f1]\stm32f1_lib\cmsis\stm32f10x_it.c + stm32f10x_it.c + 0 + 0 + + + 1 + 3 + 1 + 0 + 0 + 0 + ..\..\[base_on_stm32f1]\stm32f1_lib\cmsis\system_stm32f10x.c + system_stm32f10x.c + 0 + 0 + + + 1 + 4 + 2 + 0 + 0 + 0 + ..\..\[base_on_stm32f1]\stm32f1_lib\cmsis\startup\startup_stm32f10x_md.s + startup_stm32f10x_md.s + 0 + 0 + + + + + libs + 0 + 0 + 0 + 0 + + 2 + 5 + 1 + 0 + 0 + 0 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\misc.c + misc.c + 0 + 0 + + + 2 + 6 + 1 + 0 + 0 + 0 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_adc.c + stm32f10x_adc.c + 0 + 0 + + + 2 + 7 + 1 + 0 + 0 + 0 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_bkp.c + stm32f10x_bkp.c + 0 + 0 + + + 2 + 8 + 1 + 0 + 0 + 0 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_can.c + stm32f10x_can.c + 0 + 0 + + + 2 + 9 + 1 + 0 + 0 + 0 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_cec.c + stm32f10x_cec.c + 0 + 0 + + + 2 + 10 + 1 + 0 + 0 + 0 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_crc.c + stm32f10x_crc.c + 0 + 0 + + + 2 + 11 + 1 + 0 + 0 + 0 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_dac.c + stm32f10x_dac.c + 0 + 0 + + + 2 + 12 + 1 + 0 + 0 + 0 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_dbgmcu.c + stm32f10x_dbgmcu.c + 0 + 0 + + + 2 + 13 + 1 + 0 + 0 + 0 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_dma.c + stm32f10x_dma.c + 0 + 0 + + + 2 + 14 + 1 + 0 + 0 + 0 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_exti.c + stm32f10x_exti.c + 0 + 0 + + + 2 + 15 + 1 + 0 + 0 + 0 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_flash.c + stm32f10x_flash.c + 0 + 0 + + + 2 + 16 + 1 + 0 + 0 + 0 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_fsmc.c + stm32f10x_fsmc.c + 0 + 0 + + + 2 + 17 + 1 + 0 + 0 + 0 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_gpio.c + stm32f10x_gpio.c + 0 + 0 + + + 2 + 18 + 1 + 0 + 0 + 0 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_i2c.c + stm32f10x_i2c.c + 0 + 0 + + + 2 + 19 + 1 + 0 + 0 + 0 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_iwdg.c + stm32f10x_iwdg.c + 0 + 0 + + + 2 + 20 + 1 + 0 + 0 + 0 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_pwr.c + stm32f10x_pwr.c + 0 + 0 + + + 2 + 21 + 1 + 0 + 0 + 0 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_rcc.c + stm32f10x_rcc.c + 0 + 0 + + + 2 + 22 + 1 + 0 + 0 + 0 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_rtc.c + stm32f10x_rtc.c + 0 + 0 + + + 2 + 23 + 1 + 0 + 0 + 0 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_sdio.c + stm32f10x_sdio.c + 0 + 0 + + + 2 + 24 + 1 + 0 + 0 + 0 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_spi.c + stm32f10x_spi.c + 0 + 0 + + + 2 + 25 + 1 + 0 + 0 + 0 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_tim.c + stm32f10x_tim.c + 0 + 0 + + + 2 + 26 + 1 + 0 + 0 + 0 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_usart.c + stm32f10x_usart.c + 0 + 0 + + + 2 + 27 + 1 + 0 + 0 + 0 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_wwdg.c + stm32f10x_wwdg.c + 0 + 0 + + + + + segger + 0 + 0 + 0 + 0 + + 3 + 28 + 1 + 0 + 0 + 0 + ..\..\..\drivers\segger_rtt\SEGGER_RTT.c + SEGGER_RTT.c + 0 + 0 + + + 3 + 29 + 1 + 0 + 0 + 0 + ..\..\..\drivers\segger_rtt\SEGGER_RTT_printf.c + SEGGER_RTT_printf.c + 0 + 0 + + + + + system + 1 + 0 + 0 + 0 + + 4 + 30 + 1 + 0 + 0 + 0 + ..\..\[base_on_stm32f1]\stm32f1_sys\usart_dma.c + usart_dma.c + 0 + 0 + + + 4 + 31 + 1 + 0 + 0 + 0 + ..\..\[base_on_stm32f1]\stm32f1_sys\tim.c + tim.c + 0 + 0 + + + + + source + 1 + 0 + 0 + 0 + + 5 + 32 + 1 + 0 + 0 + 0 + ..\SRC\main.c + main.c + 0 + 0 + + + + + readme + 1 + 0 + 0 + 0 + + 6 + 33 + 5 + 0 + 0 + 0 + ..\README.txt + README.txt + 0 + 0 + + + + + drivers/common + 1 + 0 + 0 + 0 + + 7 + 34 + 5 + 0 + 0 + 0 + ..\..\..\drivers\common\common_include.h + common_include.h + 0 + 0 + + + + + drivers/bootloader + 1 + 0 + 0 + 0 + + 8 + 35 + 1 + 0 + 0 + 0 + ..\..\..\drivers\bootloader\bootloader.c + bootloader.c + 0 + 0 + + + 8 + 36 + 1 + 0 + 0 + 0 + ..\..\..\drivers\bootloader\xmodem.c + xmodem.c + 0 + 0 + + + +
diff --git a/examples/bootloader/MDK/use_example.uvprojx b/examples/bootloader/MDK/use_example.uvprojx new file mode 100644 index 0000000..82e169d --- /dev/null +++ b/examples/bootloader/MDK/use_example.uvprojx @@ -0,0 +1,622 @@ + + + + 2.1 + +
### uVision Project, (C) Keil Software
+ + + + Target 1 + 0x4 + ARM-ADS + 5060960::V5.06 update 7 (build 960)::.\ARMCC + 0 + + + STM32F103C8 + STMicroelectronics + Keil.STM32F1xx_DFP.2.4.1 + https://www.keil.com/pack/ + IRAM(0x20000000,0x00005000) IROM(0x08000000,0x00010000) CPUTYPE("Cortex-M3") CLOCK(12000000) ELITTLE + + + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32F10x_128 -FS08000000 -FL020000 -FP0($$Device:STM32F103C8$Flash\STM32F10x_128.FLM)) + 0 + $$Device:STM32F103C8$Device\Include\stm32f10x.h + + + + + + + + + + $$Device:STM32F103C8$SVD\STM32F103xx.svd + 0 + 0 + + + + + + + 0 + 0 + 0 + 0 + 1 + + .\Objects\ + use_example + 1 + 0 + 1 + 1 + 1 + .\Listings\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 1 + 0 + fromelf.exe --bin -o "$L@L.bin" "#L" + + 0 + 0 + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + SARMCM3.DLL + -REMAP + DCM.DLL + -pCM3 + SARMCM3.DLL + + TCM.DLL + -pCM3 + + + + 1 + 0 + 0 + 0 + 16 + + + + + 1 + 0 + 0 + 1 + 1 + -1 + + 1 + BIN\UL2CM3.DLL + + + + + + 0 + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M3" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 8 + 1 + 0 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x5000 + + + 1 + 0x8000000 + 0x10000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x8000000 + 0x10000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x5000 + + + 0 + 0x0 + 0x0 + + + + + + 1 + 1 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + 0 + 1 + 0 + 0 + 3 + 3 + 1 + 1 + 0 + 0 + 0 + + + STM32F10X_MD,USE_STDPERIPH_DRIVER + + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\inc;..\..\[base_on_stm32f1]\stm32f1_lib\cmsis;..\..\[base_on_stm32f1]\stm32f1_sys;..\..\..\drivers\common;..\..\..\drivers\segger_rtt;..\..\..\drivers\bootloader + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + + + + + + + + + 1 + 0 + 0 + 0 + 1 + 0 + 0x08000000 + 0x20000000 + + + + + + + + + + + + + cmsis + + + core_cm3.c + 1 + ..\..\[base_on_stm32f1]\stm32f1_lib\cmsis\core_cm3.c + + + stm32f10x_it.c + 1 + ..\..\[base_on_stm32f1]\stm32f1_lib\cmsis\stm32f10x_it.c + + + system_stm32f10x.c + 1 + ..\..\[base_on_stm32f1]\stm32f1_lib\cmsis\system_stm32f10x.c + + + startup_stm32f10x_md.s + 2 + ..\..\[base_on_stm32f1]\stm32f1_lib\cmsis\startup\startup_stm32f10x_md.s + + + + + libs + + + misc.c + 1 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\misc.c + + + stm32f10x_adc.c + 1 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_adc.c + + + stm32f10x_bkp.c + 1 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_bkp.c + + + stm32f10x_can.c + 1 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_can.c + + + stm32f10x_cec.c + 1 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_cec.c + + + stm32f10x_crc.c + 1 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_crc.c + + + stm32f10x_dac.c + 1 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_dac.c + + + stm32f10x_dbgmcu.c + 1 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_dbgmcu.c + + + stm32f10x_dma.c + 1 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_dma.c + + + stm32f10x_exti.c + 1 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_exti.c + + + stm32f10x_flash.c + 1 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_flash.c + + + stm32f10x_fsmc.c + 1 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_fsmc.c + + + stm32f10x_gpio.c + 1 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_gpio.c + + + stm32f10x_i2c.c + 1 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_i2c.c + + + stm32f10x_iwdg.c + 1 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_iwdg.c + + + stm32f10x_pwr.c + 1 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_pwr.c + + + stm32f10x_rcc.c + 1 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_rcc.c + + + stm32f10x_rtc.c + 1 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_rtc.c + + + stm32f10x_sdio.c + 1 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_sdio.c + + + stm32f10x_spi.c + 1 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_spi.c + + + stm32f10x_tim.c + 1 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_tim.c + + + stm32f10x_usart.c + 1 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_usart.c + + + stm32f10x_wwdg.c + 1 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_wwdg.c + + + + + segger + + + SEGGER_RTT.c + 1 + ..\..\..\drivers\segger_rtt\SEGGER_RTT.c + + + SEGGER_RTT_printf.c + 1 + ..\..\..\drivers\segger_rtt\SEGGER_RTT_printf.c + + + + + system + + + usart_dma.c + 1 + ..\..\[base_on_stm32f1]\stm32f1_sys\usart_dma.c + + + tim.c + 1 + ..\..\[base_on_stm32f1]\stm32f1_sys\tim.c + + + + + source + + + main.c + 1 + ..\SRC\main.c + + + + + readme + + + README.txt + 5 + ..\README.txt + + + + + drivers/common + + + common_include.h + 5 + ..\..\..\drivers\common\common_include.h + + + + + drivers/bootloader + + + bootloader.c + 1 + ..\..\..\drivers\bootloader\bootloader.c + + + xmodem.c + 1 + ..\..\..\drivers\bootloader\xmodem.c + + + + + + + + + + + + + + + + + use_example + 1 + + + + +
diff --git a/examples/bootloader/README.txt b/examples/bootloader/README.txt new file mode 100644 index 0000000..e416d8a --- /dev/null +++ b/examples/bootloader/README.txt @@ -0,0 +1,44 @@ +================================================================================ + 用例使用说明 +================================================================================ +Date Author MDK MCU +2023-09-26 ashuai0110 5.35 STM32F1 + +================================================================================ +功能描述 +================================================================================ +本用例展示了xxx组件的使用方法。 + +================================================================================ +测试环境 +================================================================================ +测试用板: +--------------------- +任意开发板 + +辅助工具: +--------------------- +J-Link + +辅助软件: +--------------------- +J-Link RTT Viewer + +源码文件: +--------------------- +xxx.c +xxx.h + +================================================================================ +使用步骤 +================================================================================ +1)使用J-Link连接目标板; +2)打开工程,重新编译,启动调试或直接下载程序运行; +3)用J-Link RTT Viewer软件连接,查看打印消息。 + +================================================================================ +注意 +================================================================================ +1)用户根据需求可前往源码头文件修改宏定义参数 + +================================================================================ diff --git a/examples/bootloader/SRC/main.c b/examples/bootloader/SRC/main.c new file mode 100644 index 0000000..f3d3d52 --- /dev/null +++ b/examples/bootloader/SRC/main.c @@ -0,0 +1,159 @@ +/** + ****************************************************************************** + * @file main.c + * @author ashuai0110 + * @version V1.0 + * @date 2023-12-3 + * @brief 使用举例-bootloader + * + ****************************************************************************** + * @attention + * + * 版权声明:内容为编者(ashuai0110)原创,使用请注明出处,当然,你也可以不这样做^_^ + * 出处链接:https://gitee.com/ashuai0110/mcu_reuse_development_module + * + ****************************************************************************** + */ + +/* 包含头文件-----------------------------------------------------------------*/ +#include "stm32f10x.h" +#include "usart_dma.h" +#include "tim.h" + +#include "bootloader.h" +#include "xmodem.h" + +/* 私有宏定义-----------------------------------------------------------------*/ + +/* 私有类型定义---------------------------------------------------------------*/ + +/* 私有变量-------------------------------------------------------------------*/ +static uint8_t usart1DmaTxBuf[200]; /* 串口1dma发送缓存区 */ +static uint8_t usart1DmaRxBuf[200]; /* 串口1dma接收缓存区 */ + +xmodem_t xmodem; +static uint8_t xmodemBuf[1030]; + +/* 全局变量-------------------------------------------------------------------*/ + +/* 私有函数原型---------------------------------------------------------------*/ +void usart1_tx_en(uint8_t enState); + + +/** + * @brief 定时器1中断函数 + * + * @param None + * + * @retval None + */ +void TIM1_UP_IRQHandler(void) +{ + static uint16_t cnt = 0; + + if(TIM_GetITStatus(TIM1, TIM_IT_Update) != RESET) + { + cnt++; + if(cnt % 1000 == 0) + { + xmodem_1s_tick_handler(&xmodem); + cnt = 0; + } + + TIM_ClearITPendingBit(TIM1, TIM_FLAG_Update); + } +} + +/* 串口1中断 */ +void USART1_IRQHandler(void) +{ + /* 串口1空闲中断 */ + if(USART_GetITStatus(USART1,USART_IT_IDLE) != RESET) + { + USART1->SR; + USART1->DR; + + /* 这里写接收处理 */ + DEBUG_LOG("%d", sizeof(usart1DmaRxBuf) - DMA_GetCurrDataCounter(DMA1_Channel5)); + xmodem_write_rx_buf(&xmodem, usart1DmaRxBuf, sizeof(usart1DmaRxBuf) - DMA_GetCurrDataCounter(DMA1_Channel5)); + usart1_dma_rx_reconfig(sizeof(usart1DmaRxBuf)); + } +} + +/* 串口1接收的dma中断 */ +void DMA1_Channel5_IRQHandler(void) +{ + /* DMA传输完成中断 */ + if(DMA_GetITStatus(DMA1_IT_TC5) != RESET) + { + /* 这里写接收处理 */ + xmodem_write_rx_buf(&xmodem, usart1DmaRxBuf, sizeof(usart1DmaRxBuf)); + usart1_dma_rx_reconfig(sizeof(usart1DmaRxBuf)); + + DMA_ClearITPendingBit(DMA1_IT_TC5); + } +} + +/* 串口1发送的dma中断 */ +void DMA1_Channel4_IRQHandler(void) +{ + /* DMA传输完成中断 */ + if(DMA_GetITStatus(DMA1_IT_TC4) != RESET) + { + /* 这里写读取发送内容的处理 */ + usart1_tx_en(1); + + DMA_ClearITPendingBit(DMA1_IT_TC4); + } +} + +void usart1_tx_en(uint8_t enState) +{ + if(enState) + { + if(USART_GetFlagStatus(USART1, USART_FLAG_TC) != RESET) + { + uint16_t num; + num = xmodem_read_tx_buf(&xmodem, usart1DmaTxBuf, sizeof(usart1DmaTxBuf)); + if(0 < num) + { + usart1_dma_tx_reconfig(num); + } + else + { + DMA_Cmd(DMA1_Channel4, DISABLE); + } + } + } + else + { + DMA_Cmd(DMA1_Channel4, DISABLE); + } +} + +/** + * @brief + * + * @param None + * + * @retval None + */ +int main(int argc, char *argv[]) +{ + VERSION_LOG("example-bootloader", 1, 0, 0); + + usart1_dma_init_config(115200, usart1DmaTxBuf, sizeof(usart1DmaTxBuf), usart1DmaRxBuf, sizeof(usart1DmaRxBuf)); + + /* 定时器初始化 1ms */ + tim1_init_config(100-1, 720-1); + + xmodem_init(&xmodem, xmodemBuf, sizeof(xmodemBuf), usart1_tx_en, 3); + + xmodem_rx_start(&xmodem, XMODEM_RX_FLAG_CRC); + + while(1) + { + xmodem_rx_poll(&xmodem); + } +} + -- Gitee From 4e5f71769bc5a471cdf095bf23ca28439fbf1f86 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=98=BF=E8=A1=B00110?= Date: Sun, 24 Dec 2023 22:33:09 +0800 Subject: [PATCH 08/66] =?UTF-8?q?=E5=A2=9E=E5=8A=A0change=20logs=E4=BF=A1?= =?UTF-8?q?=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- drivers/common/common_include.h | 4 ++++ drivers/modbus/modbus_common.c | 4 ++++ drivers/modbus/modbus_host.c | 4 ++++ drivers/modbus/modbus_slave.c | 4 ++++ drivers/modules/command_line.c | 4 ++++ drivers/modules/data_check.c | 4 ++++ drivers/modules/data_convert.c | 3 ++- drivers/modules/data_convert.h | 4 ---- drivers/modules/delay_no_block.c | 4 ++++ drivers/modules/input_output.c | 4 ++++ drivers/modules/memory.c | 4 ++++ drivers/modules/message_queue.c | 4 ++++ drivers/modules/ring_buffer.c | 4 ++++ drivers/modules/ring_queue.c | 4 ++++ drivers/modules/sync_method.c | 4 ++++ drivers/modules/timer_software.c | 4 ++++ drivers/modules/uart_handler.c | 4 ++++ examples/[base_on_stm32f1]/stm32f1_sys/gpio.c | 11 ++++++++++- examples/[base_on_stm32f1]/stm32f1_sys/gpio.h | 2 +- examples/[base_on_stm32f1]/stm32f1_sys/tim.h | 2 +- examples/[base_on_stm32f1]/stm32f1_sys/usart.c | 1 - examples/[base_on_stm32f1]/stm32f1_sys/usart.h | 2 +- examples/[base_on_stm32f1]/stm32f1_sys/usart_dma.c | 1 - examples/[base_on_stm32f1]/stm32f1_sys/usart_dma.h | 6 +++--- 24 files changed, 78 insertions(+), 14 deletions(-) diff --git a/drivers/common/common_include.h b/drivers/common/common_include.h index a71ec8d..e8e8106 100644 --- a/drivers/common/common_include.h +++ b/drivers/common/common_include.h @@ -12,6 +12,10 @@ * 版权声明:内容为编者(ashuai0110)原创,使用请注明出处,当然,你也可以不这样做^_^ * 出处链接:https://gitee.com/ashuai0110/mcu_reuse_development_module.git * + * Change Logs: + * Date Author Notes + * 2023-10-27 ashuai0110 完成基本内容 + * ****************************************************************************** */ diff --git a/drivers/modbus/modbus_common.c b/drivers/modbus/modbus_common.c index ff6a4c4..2f72fc4 100644 --- a/drivers/modbus/modbus_common.c +++ b/drivers/modbus/modbus_common.c @@ -12,6 +12,10 @@ * 版权声明:内容为编者(ashuai0110)原创,使用请注明出处,当然,你也可以不这样做^_^ * 出处链接:https://gitee.com/ashuai0110/mcu_reuse_development_module.git * + * Change Logs: + * Date Author Notes + * 2023-10-27 ashuai0110 完成基本内容 + * ****************************************************************************** */ diff --git a/drivers/modbus/modbus_host.c b/drivers/modbus/modbus_host.c index 9d483fa..89fcd64 100644 --- a/drivers/modbus/modbus_host.c +++ b/drivers/modbus/modbus_host.c @@ -12,6 +12,10 @@ * 版权声明:内容为编者(ashuai0110)原创,使用请注明出处,当然,你也可以不这样做^_^ * 出处链接:https://gitee.com/ashuai0110/mcu_reuse_development_module.git * + * Change Logs: + * Date Author Notes + * 2023-10-27 ashuai0110 完成基本内容 + * ****************************************************************************** */ diff --git a/drivers/modbus/modbus_slave.c b/drivers/modbus/modbus_slave.c index 9f28450..3f1272d 100644 --- a/drivers/modbus/modbus_slave.c +++ b/drivers/modbus/modbus_slave.c @@ -12,6 +12,10 @@ * 版权声明:内容为编者(ashuai0110)原创,使用请注明出处,当然,你也可以不这样做^_^ * 出处链接:https://gitee.com/ashuai0110/mcu_reuse_development_module.git * + * Change Logs: + * Date Author Notes + * 2023-10-27 ashuai0110 完成基本内容 + * ****************************************************************************** */ diff --git a/drivers/modules/command_line.c b/drivers/modules/command_line.c index 42a902a..603f2a7 100644 --- a/drivers/modules/command_line.c +++ b/drivers/modules/command_line.c @@ -13,6 +13,10 @@ * 版权声明:内容为编者(ashuai0110)原创,使用请注明出处,当然,你也可以不这样做^_^ * 出处链接:https://gitee.com/ashuai0110/mcu_reuse_development_module.git * + * Change Logs: + * Date Author Notes + * 2023-10-27 ashuai0110 完成基本内容 + * ****************************************************************************** */ diff --git a/drivers/modules/data_check.c b/drivers/modules/data_check.c index 8b10ab0..5548e4d 100644 --- a/drivers/modules/data_check.c +++ b/drivers/modules/data_check.c @@ -12,6 +12,10 @@ * 版权声明:内容为编者(ashuai0110)原创,使用请注明出处,当然,你也可以不这样做^_^ * 出处链接:https://gitee.com/ashuai0110/mcu_reuse_development_module.git * + * Change Logs: + * Date Author Notes + * 2023-10-17 ashuai0110 完成基本内容 + * ****************************************************************************** */ diff --git a/drivers/modules/data_convert.c b/drivers/modules/data_convert.c index 3299d37..8a0d135 100644 --- a/drivers/modules/data_convert.c +++ b/drivers/modules/data_convert.c @@ -14,7 +14,8 @@ * * Change Logs: * Date Author Notes - * 2023-12-11 ashuai0110 增加conv_complement_code_to_dec函数,增加详细的代码注释 + * 2023-09-19 ashuai0110 完成基本内容 + * 2023-12-11 ashuai0110 新增conv_complement_code_to_dec函数,增加详细的代码注释 * ****************************************************************************** */ diff --git a/drivers/modules/data_convert.h b/drivers/modules/data_convert.h index 7cb6df0..7ac55cd 100644 --- a/drivers/modules/data_convert.h +++ b/drivers/modules/data_convert.h @@ -12,10 +12,6 @@ * 版权声明:内容为编者(ashuai0110)原创,使用请注明出处,当然,你也可以不这样做^_^ * 出处链接:https://gitee.com/ashuai0110/mcu_reuse_development_module.git * - * Change Logs: - * Date Author Notes - * 2023-12-11 ashuai0110 增加conv_complement_code_to_dec函数,增加详细的代码注释 - * ****************************************************************************** */ diff --git a/drivers/modules/delay_no_block.c b/drivers/modules/delay_no_block.c index 72d201f..f109bed 100644 --- a/drivers/modules/delay_no_block.c +++ b/drivers/modules/delay_no_block.c @@ -12,6 +12,10 @@ * 版权声明:内容为编者(ashuai0110)原创,使用请注明出处,当然,你也可以不这样做^_^ * 出处链接:https://gitee.com/ashuai0110/mcu_reuse_development_module.git * + * Change Logs: + * Date Author Notes + * 2023-10-27 ashuai0110 完成基本内容 + * ****************************************************************************** */ diff --git a/drivers/modules/input_output.c b/drivers/modules/input_output.c index b72745c..dd6ece3 100644 --- a/drivers/modules/input_output.c +++ b/drivers/modules/input_output.c @@ -13,6 +13,10 @@ * 版权声明:内容为编者(ashuai0110)原创,使用请注明出处,当然,你也可以不这样做^_^ * 出处链接:https://gitee.com/ashuai0110/mcu_reuse_development_module.git * + * Change Logs: + * Date Author Notes + * 2023-09-19 ashuai0110 完成基本内容 + * ****************************************************************************** */ diff --git a/drivers/modules/memory.c b/drivers/modules/memory.c index 8e22813..1beea1d 100644 --- a/drivers/modules/memory.c +++ b/drivers/modules/memory.c @@ -13,6 +13,10 @@ * 版权声明:内容为编者(ashuai0110)原创,使用请注明出处,当然,你也可以不这样做^_^ * 出处链接:https://gitee.com/ashuai0110/mcu_reuse_development_module.git * + * Change Logs: + * Date Author Notes + * 2023-10-27 ashuai0110 完成基本内容 + * ****************************************************************************** */ diff --git a/drivers/modules/message_queue.c b/drivers/modules/message_queue.c index 691fe61..9b94ebe 100644 --- a/drivers/modules/message_queue.c +++ b/drivers/modules/message_queue.c @@ -13,6 +13,10 @@ * 版权声明:内容为编者(ashuai0110)原创,使用请注明出处,当然,你也可以不这样做^_^ * 出处链接:https://gitee.com/ashuai0110/mcu_reuse_development_module.git * + * Change Logs: + * Date Author Notes + * 2023-10-27 ashuai0110 完成基本内容 + * ****************************************************************************** */ diff --git a/drivers/modules/ring_buffer.c b/drivers/modules/ring_buffer.c index ca81725..a23423d 100644 --- a/drivers/modules/ring_buffer.c +++ b/drivers/modules/ring_buffer.c @@ -13,6 +13,10 @@ * 版权声明:内容为编者(ashuai0110)原创,使用请注明出处,当然,你也可以不这样做^_^ * 出处链接:https://gitee.com/ashuai0110/mcu_reuse_development_module.git * + * Change Logs: + * Date Author Notes + * 2023-09-24 ashuai0110 完成基本内容 + * ****************************************************************************** */ diff --git a/drivers/modules/ring_queue.c b/drivers/modules/ring_queue.c index fc2791c..7b6e40d 100644 --- a/drivers/modules/ring_queue.c +++ b/drivers/modules/ring_queue.c @@ -13,6 +13,10 @@ * 版权声明:内容为编者(ashuai0110)原创,使用请注明出处,当然,你也可以不这样做^_^ * 出处链接:https://gitee.com/ashuai0110/mcu_reuse_development_module.git * + * Change Logs: + * Date Author Notes + * 2023-10-27 ashuai0110 完成基本内容 + * ****************************************************************************** */ diff --git a/drivers/modules/sync_method.c b/drivers/modules/sync_method.c index 0521e31..c91aa90 100644 --- a/drivers/modules/sync_method.c +++ b/drivers/modules/sync_method.c @@ -12,6 +12,10 @@ * 版权声明:内容为编者(ashuai0110)原创,使用请注明出处,当然,你也可以不这样做^_^ * 出处链接:https://gitee.com/ashuai0110/mcu_reuse_development_module.git * + * Change Logs: + * Date Author Notes + * 2023-09-26 ashuai0110 完成基本内容 + * ****************************************************************************** */ diff --git a/drivers/modules/timer_software.c b/drivers/modules/timer_software.c index e226be1..ac3b32a 100644 --- a/drivers/modules/timer_software.c +++ b/drivers/modules/timer_software.c @@ -12,6 +12,10 @@ * 版权声明:内容为编者(ashuai0110)原创,使用请注明出处,当然,你也可以不这样做^_^ * 出处链接:https://gitee.com/ashuai0110/mcu_reuse_development_module.git * + * Change Logs: + * Date Author Notes + * 2023-09-26 ashuai0110 完成基本内容 + * ****************************************************************************** */ diff --git a/drivers/modules/uart_handler.c b/drivers/modules/uart_handler.c index eabd271..eaddd7b 100644 --- a/drivers/modules/uart_handler.c +++ b/drivers/modules/uart_handler.c @@ -13,6 +13,10 @@ * 版权声明:内容为编者(ashuai0110)原创,使用请注明出处,当然,你也可以不这样做^_^ * 出处链接:https://gitee.com/woshiashuai/mcu_development_module.git * + * Change Logs: + * Date Author Notes + * 2023-10-27 ashuai0110 完成基本内容 + * ****************************************************************************** */ diff --git a/examples/[base_on_stm32f1]/stm32f1_sys/gpio.c b/examples/[base_on_stm32f1]/stm32f1_sys/gpio.c index 29fb38e..e9c6790 100644 --- a/examples/[base_on_stm32f1]/stm32f1_sys/gpio.c +++ b/examples/[base_on_stm32f1]/stm32f1_sys/gpio.c @@ -1,6 +1,7 @@ +/* 包含头文件-----------------------------------------------------------------*/ #include "gpio.h" - +/* 私有宏定义-----------------------------------------------------------------*/ /* GPIO使用到的时钟 */ #define GPIO_USED_CLK (RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB) /* GPIO基础操作API */ @@ -22,6 +23,14 @@ #define GPIO_2_GPIO_PORT (GPIOC) #define GPIO_2_GPIO_PIN (GPIO_Pin_1) +/* 私有类型定义---------------------------------------------------------------*/ + +/* 私有变量-------------------------------------------------------------------*/ + +/* 全局变量-------------------------------------------------------------------*/ + +/* 私有函数原型---------------------------------------------------------------*/ + /** * @brief gpio初始化配置 * @param None diff --git a/examples/[base_on_stm32f1]/stm32f1_sys/gpio.h b/examples/[base_on_stm32f1]/stm32f1_sys/gpio.h index c0f1a76..a0c073c 100644 --- a/examples/[base_on_stm32f1]/stm32f1_sys/gpio.h +++ b/examples/[base_on_stm32f1]/stm32f1_sys/gpio.h @@ -36,4 +36,4 @@ uint8_t gpio_read(uint8_t gpiox); } #endif -#endif +#endif /* gpio.h */ diff --git a/examples/[base_on_stm32f1]/stm32f1_sys/tim.h b/examples/[base_on_stm32f1]/stm32f1_sys/tim.h index 470b5de..10d0dac 100644 --- a/examples/[base_on_stm32f1]/stm32f1_sys/tim.h +++ b/examples/[base_on_stm32f1]/stm32f1_sys/tim.h @@ -23,4 +23,4 @@ void tim3_init_config(uint16_t arr, uint16_t psc); } #endif -#endif +#endif /* tim.h */ diff --git a/examples/[base_on_stm32f1]/stm32f1_sys/usart.c b/examples/[base_on_stm32f1]/stm32f1_sys/usart.c index 36dc4db..3497c94 100644 --- a/examples/[base_on_stm32f1]/stm32f1_sys/usart.c +++ b/examples/[base_on_stm32f1]/stm32f1_sys/usart.c @@ -1,6 +1,5 @@ /* 包含头文件-----------------------------------------------------------------*/ #include "usart.h" -#include /* 私有宏定义-----------------------------------------------------------------*/ diff --git a/examples/[base_on_stm32f1]/stm32f1_sys/usart.h b/examples/[base_on_stm32f1]/stm32f1_sys/usart.h index 6587bcd..1325f86 100644 --- a/examples/[base_on_stm32f1]/stm32f1_sys/usart.h +++ b/examples/[base_on_stm32f1]/stm32f1_sys/usart.h @@ -23,4 +23,4 @@ void usart3_init_config(uint32_t baudRate); } #endif -#endif +#endif /* usart.h */ diff --git a/examples/[base_on_stm32f1]/stm32f1_sys/usart_dma.c b/examples/[base_on_stm32f1]/stm32f1_sys/usart_dma.c index 1637331..f54872d 100644 --- a/examples/[base_on_stm32f1]/stm32f1_sys/usart_dma.c +++ b/examples/[base_on_stm32f1]/stm32f1_sys/usart_dma.c @@ -1,6 +1,5 @@ /* 包含头文件-----------------------------------------------------------------*/ #include "usart.h" -#include "common_include.h" /* 私有宏定义-----------------------------------------------------------------*/ diff --git a/examples/[base_on_stm32f1]/stm32f1_sys/usart_dma.h b/examples/[base_on_stm32f1]/stm32f1_sys/usart_dma.h index 1d54bd9..0249e29 100644 --- a/examples/[base_on_stm32f1]/stm32f1_sys/usart_dma.h +++ b/examples/[base_on_stm32f1]/stm32f1_sys/usart_dma.h @@ -1,5 +1,5 @@ -#ifndef __USART_AS_H -#define __USART_AS_H +#ifndef __USART_DMA_AS_H +#define __USART_DMA_AS_H #ifdef __cplusplus extern "C" { @@ -23,4 +23,4 @@ void usart1_dma_rx_reconfig(uint16_t num); } #endif -#endif +#endif /* usart_dma.h */ -- Gitee From 803a5063f324ad8e564148f832dacec13deacd25 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=98=BF=E8=A1=B00110?= Date: Sun, 24 Dec 2023 22:34:00 +0800 Subject: [PATCH 09/66] =?UTF-8?q?=E6=96=B0=E5=A2=9Ebootloader=E6=BA=90?= =?UTF-8?q?=E7=A0=81=E5=86=85=E5=AE=B9(=E6=9C=AA=E5=AE=8C=E6=88=90)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- drivers/bootloader/bootloader.c | 123 +++++++++++++++++++++++++------- drivers/bootloader/bootloader.h | 46 ++++++++---- 2 files changed, 132 insertions(+), 37 deletions(-) diff --git a/drivers/bootloader/bootloader.c b/drivers/bootloader/bootloader.c index 5a25db1..fe3db97 100644 --- a/drivers/bootloader/bootloader.c +++ b/drivers/bootloader/bootloader.c @@ -12,6 +12,10 @@ * 版权声明:内容为编者(ashuai0110)原创,使用请注明出处,当然,你也可以不这样做^_^ * 出处链接:https://gitee.com/ashuai0110/mcu_reuse_development_module.git * + * Change Logs: + * Date Author Notes + * 2023-xx-xx ashuai0110 完成基本内容 + * ****************************************************************************** */ @@ -19,29 +23,30 @@ #include "bootloader.h" /** - * @addtogroup modules + * @addtogroup bootloader * @{ */ /** - * @defgroup command_line command_line + * @defgroup bootloader bootloader * @{ */ /* 私有宏定义-----------------------------------------------------------------*/ /** - * @defgroup command_line_local_macros command line local macros + * @defgroup bootloader_local_macros bootloader local macros * @{ */ /** - * @defgroup command_line_check_parameters_validity command line check parameters validity + * @defgroup bootloader_check_parameters_validity bootloader check parameters validity * @{ */ -/* 命令行回显标志有效性检查 */ -#define IS_VALID_ECHO_FLAG(x) \ -( ((x) == CMD_LINE_ECHO_ON) || \ - ((x) == CMD_LINE_ECHO_OFF)) +/* FLASH地址有效性检查 */ +#define IS_VALID_APP_ADDR(x) \ +( ((x) >= FLASH_START_ADDR) && \ + ((x) < FLASH_END_ADDR) && \ + (((x) % FLASH_PAGE_SIZE) == 0)) /** * @} @@ -55,11 +60,11 @@ /* 私有变量-------------------------------------------------------------------*/ /** - * @defgroup command_line_local_variables command line local variables + * @defgroup bootloader_local_variables bootloader local variables * @{ */ -static cmd_line_t *pCmdLineHead = NULL; /*!< 命令行链表头节点 */ +static bootloader_t bootloaderInfo; /*!< */ /** * @} @@ -69,39 +74,107 @@ static cmd_line_t *pCmdLineHead = NULL; /*!< 命令行链表头节 /* 私有函数原型---------------------------------------------------------------*/ /** - * @defgroup command_line_local_functions command line local functions + * @defgroup bootloader_local_functions bootloader local functions + * @{ + */ + + + +/** + * @} + */ + +/** + * @defgroup bootloader_global_functions bootloader global functions * @{ */ /** - * @brief help命令处理 + * @brief * - * @note 列举所有命令名称 + * @param None * - * @param _cmd : 命令行实例 + * @retval None + */ +void boot_init(uint32_t appAddr,uint32_t factoryAddr) +{ + uint32_t addrTemp; + + ASSERT_PARAM(IS_VALID_APP_ADDR(bootloaderInfo.appAddr)); + ASSERT_PARAM(IS_VALID_APP_ADDR(bootloaderInfo.factoryAddr)); + + bootloaderInfo.appAddr = appAddr; + bootloaderInfo.factoryAddr = factoryAddr; + addrTemp = *(volatile uint32_t *)(appAddr + 4u); + bootloaderInfo.applicationFn = (boot_jump_fn_t)addrTemp; + addrTemp = *(volatile uint32_t *)(factoryAddr + 4u); + bootloaderInfo.restoreFactoryFn = (boot_jump_fn_t)addrTemp; +} + +/** + * @brief bootloader校验升级标志 * - * @param argc : 参数个数 + * @note 进入bootloader程序校验是否要升级 * - * @param argv : 参数数据 + * @param updataFlag : 升级标志 * * @retval None */ -static void cmd_line_help(cmd_line_t *_cmd, int argc, char *argv[]) +void boot_check_updata(uint32_t updataFlag) { - + if(BOOT_UPDATA_FLAG != updataFlag) + { + boot_to_application(); + } } - /** - * @} - */ + * @brief bootloader跳转应用程序 + * + * @param None + * + * @retval None + */ +void boot_to_application(void) +{ + /* 恢复bootloader使用的中断和外设 */ + boot_recover_all(); + /* 跳转应用程序 */ + bootloaderInfo.applicationFn(); +} /** - * @defgroup command_line_global_functions command line global functions - * @{ - */ - + * @brief bootloader跳转出厂程序(备份程序) + * + * @param None + * + * @retval None + */ +void boot_to_factory(void) +{ + /* 恢复bootloader使用的中断和外设 */ + boot_recover_all(); + /* 跳转出厂程序(备份程序) */ + bootloaderInfo.restoreFactoryFn(); +} +/** + * @brief 恢复/失能已使用的外设/中断(用户实现) + * + * @param None + * + * @retval None + */ +__WEAK void boot_recover_all(void) +{ + /* disable/deinit all used interrupt/peripheral */ + /* example: + timer_disable(); + timer_deinit(); + uart_disable(); + uart_deinit(); + */ +} /** * @} diff --git a/drivers/bootloader/bootloader.h b/drivers/bootloader/bootloader.h index 0749192..188c923 100644 --- a/drivers/bootloader/bootloader.h +++ b/drivers/bootloader/bootloader.h @@ -26,27 +26,32 @@ extern "C" { #include "common_include.h" /** - * @addtogroup modules + * @addtogroup bootloader * @{ */ /** - * @addtogroup command_line + * @addtogroup bootloader * @{ */ /* 宏定义---------------------------------------------------------------------*/ /** - * @defgroup command_line_global_macros command line global macros + * @defgroup bootloader_global_macros bootloader global macros * @{ */ /** - * @defgroup cmd_line_run_flg command line run flag + * @defgroup cmd_line_run_flg bootloader run flag * @{ */ -#define CMD_LINE_RUN_STOP (1u) /*!< 不运行 */ -#define CMD_LINE_RUN_START (0u) /*!< 运行 */ +/* 用户根据MCU型号修改 */ +#define FLASH_PAGE_SIZE (0x800u) /*!< mcu flash每页的大小 */ +#define FLASH_TOTAL_SIZE (0x40000u) /*!< mcu flash总大小 */ +#define FLASH_START_ADDR (0x8000000u) /*!< mcu flash起始地址 */ +#define FLASH_END_ADDR (FLASH_START_ADDR + FLASH_TOTAL_SIZE) /*!< mcu flash结束地址 */ + +#define BOOT_UPDATA_FLAG (0x55AA3CC3u) /*!< 内存中的升级标志 */ /** * @} */ @@ -57,17 +62,25 @@ extern "C" { /* 类型定义-------------------------------------------------------------------*/ /** - * @defgroup command_line_global_types command line global types + * @defgroup bootloader_global_types bootloader global types * @{ */ +typedef void (* boot_jump_fn_t)(void); + /** * @brief 命令行 structure definition */ -typedef struct cmd_line { - char dataArr[1]; /*!< 数据暂存区 */ - struct cmd_line* pNext; /*!< 下一节点 */ -} cmd_line_t; +typedef struct bootloader{ + uint32_t appAddr; /*!< 应用程序起始地址 */ + uint32_t appSizeMax; + uint32_t factoryAddr; /*!< 出厂程序起始地址(备份程序) */ + uint32_t factorySizeMax; + uint32_t infoAddr; /*!< 传输信息存放起始地址,用于记录 */ + + boot_jump_fn_t applicationFn; + boot_jump_fn_t restoreFactoryFn; +} bootloader_t; /** * @} @@ -77,10 +90,19 @@ typedef struct cmd_line { /* 函数原型-------------------------------------------------------------------*/ /** - * @addtogroup command_line_global_functions + * @addtogroup bootloader_global_functions * @{ */ +void boot_init(uint32_t appAddr,uint32_t factoryAddr); + +void boot_check_updata(uint32_t updataFlag); + +void boot_to_application(void); +void boot_to_factory(void); + +/* weak function */ +void boot_recover_all(); /** * @} -- Gitee From b0a296a1dba939769558f81d3aa8744a0a0cce5a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=98=BF=E8=A1=B00110?= Date: Sun, 24 Dec 2023 22:34:30 +0800 Subject: [PATCH 10/66] =?UTF-8?q?xmodem=E7=BB=84=E4=BB=B6=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0=E7=94=A8=E6=88=B7=E8=AF=BB=E5=86=99=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- drivers/bootloader/xmodem.c | 38 +++++++++++++++++++--------------- drivers/bootloader/xmodem.h | 8 ++++--- examples/bootloader/SRC/main.c | 2 +- 3 files changed, 27 insertions(+), 21 deletions(-) diff --git a/drivers/bootloader/xmodem.c b/drivers/bootloader/xmodem.c index 6f35e12..2b4999c 100644 --- a/drivers/bootloader/xmodem.c +++ b/drivers/bootloader/xmodem.c @@ -12,6 +12,10 @@ * 版权声明:内容为编者(ashuai0110)原创,使用请注明出处,当然,你也可以不这样做^_^ * 出处链接:https://gitee.com/ashuai0110/mcu_reuse_development_module.git * + * Change Logs: + * Date Author Notes + * 2023-xx-xx ashuai0110 完成基本内容 + * ****************************************************************************** */ @@ -118,6 +122,15 @@ static uint8_t xmodem_check_sum(const uint8_t *data, uint16_t len) return sum; } +/** + * @} + */ + +/** + * @defgroup command_line_global_functions command line global functions + * @{ + */ + /** * @brief xmodem初始化 * @@ -133,17 +146,20 @@ static uint8_t xmodem_check_sum(const uint8_t *data, uint16_t len) * * @retval None */ -void xmodem_init(xmodem_t *_xmodem, const void *pBuf, uint16_t bufLen, xmodem_tx_en_t txEnFn, uint16_t rspTimeout) +void xmodem_init(xmodem_t *_xmodem, const void *dataBuf, uint16_t bufLen, xmodem_tx_en_t txEnFn, + xmodem_user_packet_cb_t getPacketFn, xmodem_user_packet_cb_t setPacketFn, uint16_t rspTimeout) { ASSERT_PARAM(IS_VALID_POINT(_xmodem)); - ASSERT_PARAM(IS_VALID_POINT(pBuf)); + ASSERT_PARAM(IS_VALID_POINT(dataBuf)); ASSERT_PARAM(IS_VALID_POINT(txEnFn)); - _xmodem->dataBuf = (uint8_t *)pBuf; + _xmodem->dataBuf = (uint8_t *)dataBuf; _xmodem->dataBufLen = bufLen; _xmodem->dataLen = 0; _xmodem->readLen = 0; _xmodem->txEnFn = txEnFn; + _xmodem->getPacketFn = getPacketFn; + _xmodem->setPacketFn = setPacketFn; _xmodem->rspTimeout = rspTimeout; _xmodem->rspTimeoutCnt = 0; _xmodem->packetNum = 1; @@ -290,13 +306,13 @@ void xmodem_tx_poll(xmodem_t *_xmodem) } /** - * @brief xmodem发送 启动 + * @brief xmodem发送启动 * * @param _xmodem : xmodem管理实例 * * @retval None */ -void xmodem_rx_start(xmodem_t *_xmodem) +void xmodem_tx_start(xmodem_t *_xmodem) { ASSERT_PARAM(IS_VALID_POINT(_xmodem)); @@ -411,18 +427,6 @@ __WEAK void xmodem_user_get_packet_cb(uint8_t packetNum, uint8_t *data, uint16_t PRINT_LOG("\r\n"); } - -/** - * @} - */ - -/** - * @defgroup command_line_global_functions command line global functions - * @{ - */ - - - /** * @} */ diff --git a/drivers/bootloader/xmodem.h b/drivers/bootloader/xmodem.h index 7db8d18..f04beaf 100644 --- a/drivers/bootloader/xmodem.h +++ b/drivers/bootloader/xmodem.h @@ -110,7 +110,7 @@ typedef void (* xmodem_tx_en_t)(uint8_t enState); * * @param data : 获取数据包此参数包含有效数据/设置数据包此参数需用户写入有效数据 * - * @param len : 有效数据长度 + * @param len : 获取数据包此参数包含数据长度(包含填充数据)/设置数据包此参数需用户写入数据长度(不包含填充数据) * * @retval None */ @@ -134,7 +134,8 @@ typedef struct xmodem { uint8_t checkNum : 2; /*!< 校验字节数 */ xmodem_tx_en_t txEnFn; /*!< 串口发送准备函数 */ - + xmodem_user_packet_cb_t getPacketFn; /*!< 获取数据包回调函数 */ + xmodem_user_packet_cb_t setPacketFn; /*!< 设置数据包回调函数 */ } xmodem_t; /** @@ -149,7 +150,8 @@ typedef struct xmodem { * @{ */ -void xmodem_init(xmodem_t *_xmodem, const void *pBuf, uint16_t bufLen, xmodem_tx_en_t txEnFn, uint16_t rspTimeout); +void xmodem_init(xmodem_t *_xmodem, const void *dataBuf, uint16_t bufLen, xmodem_tx_en_t txEnFn, + xmodem_user_packet_cb_t getPacketFn, xmodem_user_packet_cb_t setPacketFn, uint16_t rspTimeout); void xmodem_rx_poll(xmodem_t *_xmodem); diff --git a/examples/bootloader/SRC/main.c b/examples/bootloader/SRC/main.c index f3d3d52..0b0153c 100644 --- a/examples/bootloader/SRC/main.c +++ b/examples/bootloader/SRC/main.c @@ -147,7 +147,7 @@ int main(int argc, char *argv[]) /* 定时器初始化 1ms */ tim1_init_config(100-1, 720-1); - xmodem_init(&xmodem, xmodemBuf, sizeof(xmodemBuf), usart1_tx_en, 3); + // xmodem_init(&xmodem, xmodemBuf, sizeof(xmodemBuf), usart1_tx_en, 3); xmodem_rx_start(&xmodem, XMODEM_RX_FLAG_CRC); -- Gitee From c1831238fb53a2062b066ac43ed989cbead16467 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=98=BF=E8=A1=B00110?= Date: Wed, 27 Dec 2023 20:42:10 +0800 Subject: [PATCH 11/66] =?UTF-8?q?=E5=88=A0=E9=99=A4ring=5Fqueue=E7=BB=84?= =?UTF-8?q?=E4=BB=B6=E5=86=85=E5=AE=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 - drivers/modules/ring_queue.c | 288 --------- drivers/modules/ring_queue.h | 96 --- examples/ring_queue/MDK/use_example.uvoptx | 640 -------------------- examples/ring_queue/MDK/use_example.uvprojx | 602 ------------------ examples/ring_queue/README.txt | 45 -- examples/ring_queue/SRC/main.c | 120 ---- 7 files changed, 1793 deletions(-) delete mode 100644 drivers/modules/ring_queue.c delete mode 100644 drivers/modules/ring_queue.h delete mode 100644 examples/ring_queue/MDK/use_example.uvoptx delete mode 100644 examples/ring_queue/MDK/use_example.uvprojx delete mode 100644 examples/ring_queue/README.txt delete mode 100644 examples/ring_queue/SRC/main.c diff --git a/README.md b/README.md index bf37a91..dc49d6d 100644 --- a/README.md +++ b/README.md @@ -36,8 +36,6 @@ message_queue.c/.h: 消息队列 ring_buffer.c/.h: 环形缓冲区 -ring_queue.c/.h: 环形队列 - sync_method.c/.h: 伪线程同步方法(信号量,互斥锁,事件集) timer_software.c/.h: 软件定时器 diff --git a/drivers/modules/ring_queue.c b/drivers/modules/ring_queue.c deleted file mode 100644 index 7b6e40d..0000000 --- a/drivers/modules/ring_queue.c +++ /dev/null @@ -1,288 +0,0 @@ -/** - ****************************************************************************** - * @file ring_queue.c - * @author ashuai0110 - * @version V2.1 - * @date 2023-10-27 - * @brief 环形队列 - * (适合定长或易分离出的数据,写入后必须读出才可再写,写满后新数据无法写入) - * - ****************************************************************************** - * @attention - * - * 版权声明:内容为编者(ashuai0110)原创,使用请注明出处,当然,你也可以不这样做^_^ - * 出处链接:https://gitee.com/ashuai0110/mcu_reuse_development_module.git - * - * Change Logs: - * Date Author Notes - * 2023-10-27 ashuai0110 完成基本内容 - * - ****************************************************************************** - */ - -/* 包含头文件-----------------------------------------------------------------*/ -#include "ring_queue.h" - -/** - * @addtogroup modules - * @{ - */ - -/** - * @defgroup ring_queue ring_queue - * @{ - */ - -/* 私有宏定义-----------------------------------------------------------------*/ -/** - * @defgroup ring_queue_local_macros ring queue local macros - * @{ - */ - -/** - * @defgroup ring_queue_check_parameters_validity ring queue check parameters validity - * @{ - */ -/* 环形队列数据存储区大小有效性检查 */ -#define IS_VALID_RQ_SIZE(x) \ -( (x) != 0u) -/** - * @} - */ - -/** - * @} - */ - -/* 私有类型定义---------------------------------------------------------------*/ - -/* 私有变量-------------------------------------------------------------------*/ - -/* 全局变量-------------------------------------------------------------------*/ - -/* 私有函数原型---------------------------------------------------------------*/ - -/** - * @defgroup ring_queue_global_functions ring queue global functions - * @{ - */ - -/** - * @brief 环形队列初始化 - * - * @note None - * - * @param _rq : 环形队列实例 - * - * @param pBuf : 数据存储区 - * - * @param size : 队列最大填充数量(数据存储区大小) - * - * @retval None - */ -void ring_queue_init(ring_queue_t *_rq, void *pBuf, uint32_t size) -{ - ASSERT_PARAM(IS_VALID_POINT(_rq)); - ASSERT_PARAM(IS_VALID_POINT(pBuf)); - ASSERT_PARAM(IS_VALID_RQ_SIZE(size)); - - _rq->pBuf = (char *)pBuf; - _rq->pHead = _rq->pBuf; - _rq->pTail = _rq->pBuf; - _rq->curCnt = 0; - _rq->maxCnt = size; -} - -/** - * @brief 环形队列取消初始化 - * - * @note 恢复默认 - * - * @param _rq : 环形队列实例 - * - * @retval None - */ -void ring_queue_de_init(ring_queue_t *_rq) -{ - ASSERT_PARAM(IS_VALID_POINT(_rq)); - - memset(_rq, 0, sizeof(ring_queue_t)); -} - -/** - * @brief 获取环形队列的大小 - * - * @note 缓冲区大小(byte) - * - * @param _rq : 环形队列实例 - * - * @retval 环形队列的大小 - */ -uint32_t ring_queue_total_size(ring_queue_t *_rq) -{ - ASSERT_PARAM(IS_VALID_POINT(_rq)); - - return _rq->maxCnt; -} - -/** - * @brief 获取环形队列的可读大小 - * - * @note 待读出数量(byte) - * - * @param _rq : 环形队列实例 - * - * @retval 环形队列的可读大小 - */ -uint32_t ring_queue_can_read(ring_queue_t *_rq) -{ - ASSERT_PARAM(IS_VALID_POINT(_rq)); - - return _rq->curCnt; -} - -/** - * @brief 获取环形队列的可写大小 - * - * @note 可写入数量(byte) - * - * @param _rq : 环形队列实例 - * - * @retval 环形队列的可写大小 - */ -uint32_t ring_queue_can_write(ring_queue_t *_rq) -{ - ASSERT_PARAM(IS_VALID_POINT(_rq)); - - return (_rq->maxCnt - _rq->curCnt); -} - -/** - * @brief 从环形队列读出数据 - * - * @note None - * - * @param _rq : 环形队列实例 - * - * @param pBuf : 读出数据的存储区 - * - * @param size : 读出数据大小 - * - * @retval uint8_t - * @arg RET_OK : 读出成功 - * @arg RET_ERR : 参数size为0或超出可读大小 - */ -uint8_t ring_queue_read(ring_queue_t *_rq, void *pBuf, uint32_t size) -{ - uint32_t readSize = 0; - - ASSERT_PARAM(IS_VALID_POINT(_rq)); - ASSERT_PARAM(IS_VALID_POINT(pBuf)); - - if(0 == size || size > ring_queue_can_read(_rq)) - { - return RET_ERR; - } - - if(_rq->pHead < _rq->pTail) - { - memcpy(pBuf, _rq->pHead, size); - _rq->pHead += size; - _rq->curCnt -= size; - } - else - { - readSize = ring_queue_total_size(_rq) - (_rq->pHead - _rq->pBuf); - if(size <= readSize) - { - memcpy(pBuf, _rq->pHead, size); - _rq->pHead += size; - _rq->curCnt -= size; - } - else - { - memcpy(pBuf, _rq->pHead, readSize); - _rq->pHead = _rq->pBuf; - _rq->curCnt -= readSize; - ring_queue_read(_rq, (void *)((char *)pBuf + readSize), size - readSize); - } - } - - if(_rq->pHead >= (_rq->pBuf + ring_queue_total_size(_rq))) - { - _rq->pHead = _rq->pBuf; - } - - return RET_OK; -} - -/** - * @brief 写入数据到环形队列 - * - * @note None - * - * @param _rq : 环形队列实例 - * - * @param pData : 写入数据的存储区 - * - * @param size : 写入数据的大小 - * - * @retval uint8_t - * @arg RET_OK : 写入成功 - * @arg RET_ERR : 参数size为0或超出可写大小 - */ -uint8_t ring_queue_write(ring_queue_t *_rq, void *pData, uint32_t size) -{ - uint32_t writeSize = 0; - - ASSERT_PARAM(IS_VALID_POINT(_rq)); - ASSERT_PARAM(IS_VALID_POINT(pData)); - - if(0 == size || size > ring_queue_can_write(_rq)) - { - return RET_ERR; - } - - if(_rq->pHead <= _rq->pTail) - { - writeSize = ring_queue_total_size(_rq) - (_rq->pTail - _rq->pBuf); - if(size <= writeSize) - { - memcpy(_rq->pTail, pData, size); - _rq->pTail += size; - _rq->curCnt += size; - } - else - { - memcpy(_rq->pTail, pData, writeSize); - _rq->pTail = _rq->pBuf; - _rq->curCnt += writeSize; - ring_queue_write(_rq, (void *)((char *)pData + writeSize), size - writeSize); - } - } - else - { - memcpy(_rq->pTail, pData, size); - _rq->pTail += size; - _rq->curCnt += size; - } - - if(_rq->pTail >= (_rq->pBuf + ring_queue_total_size(_rq))) - { - _rq->pTail = _rq->pBuf; - } - - return RET_OK; -} - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ diff --git a/drivers/modules/ring_queue.h b/drivers/modules/ring_queue.h deleted file mode 100644 index 978356d..0000000 --- a/drivers/modules/ring_queue.h +++ /dev/null @@ -1,96 +0,0 @@ -/** - ****************************************************************************** - * @file ring_queue.h - * @author ashuai0110 - * @version V2.1 - * @date 2023-10-27 - * @brief 环形队列 - * (适合定长或易分离出的数据,写入后必须读出才可再写,写满后新数据无法写入) - * - ****************************************************************************** - * @attention - * - * 版权声明:内容为编者(ashuai0110)原创,使用请注明出处,当然,你也可以不这样做^_^ - * 出处链接:https://gitee.com/ashuai0110/mcu_reuse_development_module.git - * - ****************************************************************************** - */ - -#ifndef __RING_QUEUE_H -#define __RING_QUEUE_H - -#ifdef __cplusplus -extern "C" { -#endif - -/* 包含头文件-----------------------------------------------------------------*/ -#include "common_include.h" - -/** - * @addtogroup modules - * @{ - */ - -/** - * @addtogroup ring_queue - * @{ - */ - -/* 宏定义---------------------------------------------------------------------*/ - -/* 类型定义-------------------------------------------------------------------*/ -/** - * @defgroup ring_queue_global_types ring queue global types - * @{ - */ - -/** - * @brief 环形队列 structure definition - */ -typedef struct ring_queue { - char *pHead; /*!< 环形队列头节点(开始读节点) */ - char *pTail; /*!< 环形队列尾节点(开始写节点) */ - char *pBuf; /*!< 环形队列数据缓存区 */ - volatile uint32_t curCnt; /*!< 环形队列数据当前存储数量(byte) */ - uint32_t maxCnt; /*!< 环形队列数据最大存储数量(byte) */ -} ring_queue_t; - -/** - * @} - */ - -/* 全局变量-------------------------------------------------------------------*/ - -/* 函数原型-------------------------------------------------------------------*/ -/** - * @addtogroup ring_queue_global_functions - * @{ - */ - -void ring_queue_init(ring_queue_t* _rq, void *pBuf, uint32_t size); -void ring_queue_de_init(ring_queue_t *_rq); - -uint32_t ring_queue_total_size(ring_queue_t *_rq); -uint32_t ring_queue_can_read(ring_queue_t *_rq); -uint32_t ring_queue_can_write(ring_queue_t *_rq); - -uint8_t ring_queue_read(ring_queue_t *_rq, void *pBuf, uint32_t size); -uint8_t ring_queue_write(ring_queue_t *_rq, void *pData, uint32_t size); - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* ring_queue.h */ diff --git a/examples/ring_queue/MDK/use_example.uvoptx b/examples/ring_queue/MDK/use_example.uvoptx deleted file mode 100644 index 8199edd..0000000 --- a/examples/ring_queue/MDK/use_example.uvoptx +++ /dev/null @@ -1,640 +0,0 @@ - - - - 1.0 - -
### uVision Project, (C) Keil Software
- - - *.c - *.s*; *.src; *.a* - *.obj; *.o - *.lib - *.txt; *.h; *.inc; *.md - *.plm - *.cpp; *.cc; *.cxx - 0 - - - - 0 - 0 - - - - Target 1 - 0x4 - ARM-ADS - - 12000000 - - 1 - 1 - 0 - 1 - 0 - - - 1 - 65535 - 0 - 0 - 0 - - - 79 - 66 - 8 - .\Listings\ - - - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 1 - 0 - 0 - 0 - 0 - - - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - - - 1 - 0 - 1 - - 18 - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 1 - 1 - 0 - 0 - 1 - 0 - 0 - 4 - - - - - - - - - - - Segger\JL2CM3.dll - - - - 0 - JL2CM3 - -U59522627 -O78 -S2 -ZTIFSpeedSel5000 -A0 -C0 -JU1 -JI127.0.0.1 -JP0 -RST0 -N00("ARM CoreSight SW-DP") -D00(1BA01477) -L00(0) -TO18 -TC10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -TB1 -TFE0 -FO15 -FD20000000 -FC1000 -FN1 -FF0STM32F10x_128.FLM -FS08000000 -FL020000 -FP0($$Device:STM32F103C8$Flash\STM32F10x_128.FLM) - - - 0 - UL2CM3 - UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32F10x_128 -FS08000000 -FL020000 -FP0($$Device:STM32F103C8$Flash\STM32F10x_128.FLM)) - - - - - 0 - - - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - - - 0 - 0 - 0 - - - - - - - - - - 1 - 1 - 0 - 2 - 10000000 - - - - - - cmsis - 0 - 0 - 0 - 0 - - 1 - 1 - 1 - 0 - 0 - 0 - ..\..\[base_on_stm32f1]\stm32f1_lib\cmsis\core_cm3.c - core_cm3.c - 0 - 0 - - - 1 - 2 - 1 - 0 - 0 - 0 - ..\..\[base_on_stm32f1]\stm32f1_lib\cmsis\stm32f10x_it.c - stm32f10x_it.c - 0 - 0 - - - 1 - 3 - 1 - 0 - 0 - 0 - ..\..\[base_on_stm32f1]\stm32f1_lib\cmsis\system_stm32f10x.c - system_stm32f10x.c - 0 - 0 - - - 1 - 4 - 2 - 0 - 0 - 0 - ..\..\[base_on_stm32f1]\stm32f1_lib\cmsis\startup\startup_stm32f10x_md.s - startup_stm32f10x_md.s - 0 - 0 - - - - - libs - 0 - 0 - 0 - 0 - - 2 - 5 - 1 - 0 - 0 - 0 - ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\misc.c - misc.c - 0 - 0 - - - 2 - 6 - 1 - 0 - 0 - 0 - ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_adc.c - stm32f10x_adc.c - 0 - 0 - - - 2 - 7 - 1 - 0 - 0 - 0 - ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_bkp.c - stm32f10x_bkp.c - 0 - 0 - - - 2 - 8 - 1 - 0 - 0 - 0 - ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_can.c - stm32f10x_can.c - 0 - 0 - - - 2 - 9 - 1 - 0 - 0 - 0 - ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_cec.c - stm32f10x_cec.c - 0 - 0 - - - 2 - 10 - 1 - 0 - 0 - 0 - ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_crc.c - stm32f10x_crc.c - 0 - 0 - - - 2 - 11 - 1 - 0 - 0 - 0 - ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_dac.c - stm32f10x_dac.c - 0 - 0 - - - 2 - 12 - 1 - 0 - 0 - 0 - ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_dbgmcu.c - stm32f10x_dbgmcu.c - 0 - 0 - - - 2 - 13 - 1 - 0 - 0 - 0 - ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_dma.c - stm32f10x_dma.c - 0 - 0 - - - 2 - 14 - 1 - 0 - 0 - 0 - ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_exti.c - stm32f10x_exti.c - 0 - 0 - - - 2 - 15 - 1 - 0 - 0 - 0 - ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_flash.c - stm32f10x_flash.c - 0 - 0 - - - 2 - 16 - 1 - 0 - 0 - 0 - ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_fsmc.c - stm32f10x_fsmc.c - 0 - 0 - - - 2 - 17 - 1 - 0 - 0 - 0 - ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_gpio.c - stm32f10x_gpio.c - 0 - 0 - - - 2 - 18 - 1 - 0 - 0 - 0 - ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_i2c.c - stm32f10x_i2c.c - 0 - 0 - - - 2 - 19 - 1 - 0 - 0 - 0 - ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_iwdg.c - stm32f10x_iwdg.c - 0 - 0 - - - 2 - 20 - 1 - 0 - 0 - 0 - ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_pwr.c - stm32f10x_pwr.c - 0 - 0 - - - 2 - 21 - 1 - 0 - 0 - 0 - ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_rcc.c - stm32f10x_rcc.c - 0 - 0 - - - 2 - 22 - 1 - 0 - 0 - 0 - ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_rtc.c - stm32f10x_rtc.c - 0 - 0 - - - 2 - 23 - 1 - 0 - 0 - 0 - ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_sdio.c - stm32f10x_sdio.c - 0 - 0 - - - 2 - 24 - 1 - 0 - 0 - 0 - ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_spi.c - stm32f10x_spi.c - 0 - 0 - - - 2 - 25 - 1 - 0 - 0 - 0 - ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_tim.c - stm32f10x_tim.c - 0 - 0 - - - 2 - 26 - 1 - 0 - 0 - 0 - ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_usart.c - stm32f10x_usart.c - 0 - 0 - - - 2 - 27 - 1 - 0 - 0 - 0 - ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_wwdg.c - stm32f10x_wwdg.c - 0 - 0 - - - - - segger - 0 - 0 - 0 - 0 - - 3 - 28 - 1 - 0 - 0 - 0 - ..\..\..\drivers\segger_rtt\SEGGER_RTT.c - SEGGER_RTT.c - 0 - 0 - - - 3 - 29 - 1 - 0 - 0 - 0 - ..\..\..\drivers\segger_rtt\SEGGER_RTT_printf.c - SEGGER_RTT_printf.c - 0 - 0 - - - - - system - 1 - 0 - 0 - 0 - - 4 - 30 - 1 - 0 - 0 - 0 - ..\..\[base_on_stm32f1]\stm32f1_sys\usart.c - usart.c - 0 - 0 - - - - - source - 1 - 0 - 0 - 0 - - 5 - 31 - 1 - 0 - 0 - 0 - ..\SRC\main.c - main.c - 0 - 0 - - - 5 - 32 - 1 - 0 - 0 - 0 - ..\..\..\drivers\modules\ring_queue.c - ring_queue.c - 0 - 0 - - - 5 - 33 - 1 - 0 - 0 - 0 - ..\..\..\drivers\modules\input_output.c - input_output.c - 0 - 0 - - - - - readme - 1 - 0 - 0 - 0 - - 6 - 34 - 5 - 0 - 0 - 0 - ..\README.txt - README.txt - 0 - 0 - - - -
diff --git a/examples/ring_queue/MDK/use_example.uvprojx b/examples/ring_queue/MDK/use_example.uvprojx deleted file mode 100644 index 561c734..0000000 --- a/examples/ring_queue/MDK/use_example.uvprojx +++ /dev/null @@ -1,602 +0,0 @@ - - - - 2.1 - -
### uVision Project, (C) Keil Software
- - - - Target 1 - 0x4 - ARM-ADS - 5060960::V5.06 update 7 (build 960)::.\ARMCC - 0 - - - STM32F103C8 - STMicroelectronics - Keil.STM32F1xx_DFP.2.4.1 - https://www.keil.com/pack/ - IRAM(0x20000000,0x00005000) IROM(0x08000000,0x00010000) CPUTYPE("Cortex-M3") CLOCK(12000000) ELITTLE - - - UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32F10x_128 -FS08000000 -FL020000 -FP0($$Device:STM32F103C8$Flash\STM32F10x_128.FLM)) - 0 - $$Device:STM32F103C8$Device\Include\stm32f10x.h - - - - - - - - - - $$Device:STM32F103C8$SVD\STM32F103xx.svd - 0 - 0 - - - - - - - 0 - 0 - 0 - 0 - 1 - - .\Objects\ - use_example - 1 - 0 - 1 - 1 - 1 - .\Listings\ - 1 - 0 - 0 - - 0 - 0 - - - 0 - 0 - 0 - 0 - - - 0 - 0 - - - 0 - 0 - 0 - 0 - - - 0 - 0 - - - 0 - 0 - 0 - 0 - - 0 - - - - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - 1 - - - SARMCM3.DLL - -REMAP - DCM.DLL - -pCM3 - SARMCM3.DLL - - TCM.DLL - -pCM3 - - - - 1 - 0 - 0 - 0 - 16 - - - - - 1 - 0 - 0 - 1 - 1 - -1 - - 1 - BIN\UL2CM3.DLL - - - - - - 0 - - - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 1 - 1 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - "Cortex-M3" - - 0 - 0 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 8 - 1 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x5000 - - - 1 - 0x8000000 - 0x10000 - - - 0 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x8000000 - 0x10000 - - - 1 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x5000 - - - 0 - 0x0 - 0x0 - - - - - - 1 - 1 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 2 - 0 - 0 - 1 - 0 - 0 - 3 - 3 - 1 - 1 - 0 - 0 - 0 - - - STM32F10X_MD,USE_STDPERIPH_DRIVER - - ..\..\[base_on_stm32f1]\stm32f1_lib\driver\inc;..\..\[base_on_stm32f1]\stm32f1_lib\cmsis;..\..\[base_on_stm32f1]\stm32f1_sys;..\..\..\drivers\common;..\..\..\drivers\modules;..\..\..\drivers\segger_rtt - - - - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - - - - - - - - - 1 - 0 - 0 - 0 - 1 - 0 - 0x08000000 - 0x20000000 - - - - - - - - - - - - - cmsis - - - core_cm3.c - 1 - ..\..\[base_on_stm32f1]\stm32f1_lib\cmsis\core_cm3.c - - - stm32f10x_it.c - 1 - ..\..\[base_on_stm32f1]\stm32f1_lib\cmsis\stm32f10x_it.c - - - system_stm32f10x.c - 1 - ..\..\[base_on_stm32f1]\stm32f1_lib\cmsis\system_stm32f10x.c - - - startup_stm32f10x_md.s - 2 - ..\..\[base_on_stm32f1]\stm32f1_lib\cmsis\startup\startup_stm32f10x_md.s - - - - - libs - - - misc.c - 1 - ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\misc.c - - - stm32f10x_adc.c - 1 - ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_adc.c - - - stm32f10x_bkp.c - 1 - ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_bkp.c - - - stm32f10x_can.c - 1 - ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_can.c - - - stm32f10x_cec.c - 1 - ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_cec.c - - - stm32f10x_crc.c - 1 - ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_crc.c - - - stm32f10x_dac.c - 1 - ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_dac.c - - - stm32f10x_dbgmcu.c - 1 - ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_dbgmcu.c - - - stm32f10x_dma.c - 1 - ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_dma.c - - - stm32f10x_exti.c - 1 - ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_exti.c - - - stm32f10x_flash.c - 1 - ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_flash.c - - - stm32f10x_fsmc.c - 1 - ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_fsmc.c - - - stm32f10x_gpio.c - 1 - ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_gpio.c - - - stm32f10x_i2c.c - 1 - ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_i2c.c - - - stm32f10x_iwdg.c - 1 - ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_iwdg.c - - - stm32f10x_pwr.c - 1 - ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_pwr.c - - - stm32f10x_rcc.c - 1 - ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_rcc.c - - - stm32f10x_rtc.c - 1 - ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_rtc.c - - - stm32f10x_sdio.c - 1 - ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_sdio.c - - - stm32f10x_spi.c - 1 - ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_spi.c - - - stm32f10x_tim.c - 1 - ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_tim.c - - - stm32f10x_usart.c - 1 - ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_usart.c - - - stm32f10x_wwdg.c - 1 - ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_wwdg.c - - - - - segger - - - SEGGER_RTT.c - 1 - ..\..\..\drivers\segger_rtt\SEGGER_RTT.c - - - SEGGER_RTT_printf.c - 1 - ..\..\..\drivers\segger_rtt\SEGGER_RTT_printf.c - - - - - system - - - usart.c - 1 - ..\..\[base_on_stm32f1]\stm32f1_sys\usart.c - - - - - source - - - main.c - 1 - ..\SRC\main.c - - - ring_queue.c - 1 - ..\..\..\drivers\modules\ring_queue.c - - - input_output.c - 1 - ..\..\..\drivers\modules\input_output.c - - - - - readme - - - README.txt - 5 - ..\README.txt - - - - - - - - - - - - - - - - - use_example - 1 - - - - -
diff --git a/examples/ring_queue/README.txt b/examples/ring_queue/README.txt deleted file mode 100644 index d187a70..0000000 --- a/examples/ring_queue/README.txt +++ /dev/null @@ -1,45 +0,0 @@ -================================================================================ - 用例使用说明 -================================================================================ -Date Author MDK MCU -2023-09-24 ashuai0110 5.35 STM32F1 - -================================================================================ -功能描述 -================================================================================ -本用例展示了环形队列组件的使用方法。 - -================================================================================ -测试环境 -================================================================================ -测试用板: ---------------------- -任意开发板 - -辅助工具: ---------------------- -J-Link - -辅助软件: ---------------------- -J-Link RTT Viewer -串口调试软件 - -源码文件: ---------------------- -ring_queue.c -ring_queue.h - -================================================================================ -使用步骤 -================================================================================ -1)使用J-Link连接目标板; -2)打开工程,重新编译,启动调试或直接下载程序运行; -3)用J-Link RTT Viewer软件连接,等待发送串口数据后查看打印消息; -3)打开串口调试软件,发送结尾是\r\n的任意数据。 - -================================================================================ -注意 -================================================================================ - -================================================================================ diff --git a/examples/ring_queue/SRC/main.c b/examples/ring_queue/SRC/main.c deleted file mode 100644 index 7d0debd..0000000 --- a/examples/ring_queue/SRC/main.c +++ /dev/null @@ -1,120 +0,0 @@ -/** - ****************************************************************************** - * @file main.c - * @author ashuai0110 - * @version V1.0 - * @date 2023-09-24 - * @brief 使用举例-环形队列 - * - ****************************************************************************** - * @attention - * - * 版权声明:内容为编者(ashuai0110)原创,使用请注明出处,当然,你也可以不这样做^_^ - * 出处链接:https://gitee.com/ashuai0110/mcu_reuse_development_module - * - ****************************************************************************** - */ - -/* 包含头文件-----------------------------------------------------------------*/ -#include "stm32f10x.h" -#include "usart.h" - -#include "ring_queue.h" - -/* 私有宏定义-----------------------------------------------------------------*/ - -/* 私有类型定义---------------------------------------------------------------*/ - -/* 私有变量-------------------------------------------------------------------*/ -static ring_queue_t testRQ; /* 测试环形队列实例 */ -static uint8_t testBuf[50]; /* 实际缓冲区 */ - -/* 全局变量-------------------------------------------------------------------*/ - -/* 私有函数原型---------------------------------------------------------------*/ - -/** - * @brief 串口中断函数 - * - * @param None - * - * @retval None - */ -void USART1_IRQHandler(void) -{ - static uint8_t data; - - if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) - { - data = USART_ReceiveData(USART1); - /* 环形队列写入数据 */ - ring_queue_write(&testRQ, &data, 1); - - USART_ClearITPendingBit(USART1, USART_IT_RXNE); - } -} - -/** - * @brief 环形队列测试读取 - * - * @param pBuf : 数据存储区 - * - * @param size : 期望读取大小 - * - * @retval 实际读取大小 - */ -uint32_t ring_queue_test_read(void *pBuf, uint32_t size) -{ - /* 超过可读大小则使用可读大小 */ - size = (size > ring_queue_can_read(&testRQ)) ? ring_queue_can_read(&testRQ) : size; - if(0 != size) - { - /* 从环形队列读取数据 */ - ring_queue_read(&testRQ, pBuf, size); - } - - return size; -} - -int main(int argc, char *argv[]) -{ - VERSION_LOG("example-ring_queue", 1, 0, 0); - - /* 串口初始化 */ - usart1_init_config(115200); - - /* 环形队列初始化 */ - ring_queue_init(&testRQ, testBuf, sizeof(testBuf)); - - while(1) - { - /* 解析出串口输入结尾是\r\n的数据 */ - static uint8_t recData[50]; - static uint8_t dataCnt = 0; - uint8_t buf[20]; - uint8_t len; - - len = ring_queue_test_read(buf, sizeof(buf)); - - /* 以实际读取数量逐个处理 */ - for(uint8_t cnt = 0; cnt < len; cnt++) - { - /* 遇结束符则打印消息 */ - if('\r' == buf[cnt] || '\n' == buf[cnt]) - { - recData[dataCnt] = '\0'; - if(0 < dataCnt) - { - DEBUG_LOG("rec:%s", recData); - } - dataCnt = 0; - } - else - { - recData[dataCnt++] = buf[cnt]; - if(dataCnt >= sizeof(recData)) { dataCnt = 0; } - } - } - } -} - -- Gitee From 29fe2b2f5564cc3fed7bdc95e5843ddf7535480c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=98=BF=E8=A1=B00110?= Date: Wed, 27 Dec 2023 20:44:22 +0800 Subject: [PATCH 12/66] =?UTF-8?q?#I8LFE8=20=E5=A2=9E=E5=8A=A0=E8=AF=A6?= =?UTF-8?q?=E7=BB=86=E7=9A=84=E4=BB=A3=E7=A0=81=E6=B3=A8=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- drivers/modules/message_queue.c | 27 ++++++++++++++++++--------- drivers/modules/message_queue.h | 2 +- drivers/modules/sync_method.c | 22 ++++++++++++++++------ drivers/modules/sync_method.h | 2 +- drivers/modules/timer_software.c | 25 +++++++++++++++++++------ drivers/modules/timer_software.h | 3 ++- 6 files changed, 57 insertions(+), 24 deletions(-) diff --git a/drivers/modules/message_queue.c b/drivers/modules/message_queue.c index 9b94ebe..4b49d26 100644 --- a/drivers/modules/message_queue.c +++ b/drivers/modules/message_queue.c @@ -16,6 +16,7 @@ * Change Logs: * Date Author Notes * 2023-10-27 ashuai0110 完成基本内容 + * 2023-12-27 ashuai0110 增加详细的代码注释 * ****************************************************************************** */ @@ -81,13 +82,14 @@ void mes_queue_init(mes_queue_t *_mq, uint32_t size) ASSERT_PARAM(IS_VALID_POINT(_mq)); ASSERT_PARAM(IS_VALID_QA_SIZE(size)); + /* 初始化各参数 */ _mq->pHead = _mq->pTail = NULL; _mq->maxCnt = size; _mq->curCnt = 0; } /** - * @brief 消息队列删除 + * @brief 消息队列取消初始化(删除) * * @note 将消息队列内所有消息占用内存释放 * @@ -95,16 +97,18 @@ void mes_queue_init(mes_queue_t *_mq, uint32_t size) * * @retval None */ -void mes_queue_delete(mes_queue_t *_mq) +void mes_queue_de_init(mes_queue_t *_mq) { ASSERT_PARAM(IS_VALID_POINT(_mq)); + /* 遍历链表 释放所有消息的内存 */ while(_mq->pHead != NULL) { _mq->pTail = _mq->pHead; _mq->pHead = _mq->pHead->pNext; MQ_FREE(_mq->pTail); } + /* 置零所有参数 */ memset(_mq, 0, sizeof(mes_queue_t)); } @@ -127,22 +131,25 @@ uint8_t mes_queue_write(mes_queue_t *_mq, void *pData, uint32_t size) ASSERT_PARAM(IS_VALID_POINT(pData)); ASSERT_PARAM(IS_VALID_QA_SIZE(size)); + /* 当前数量大于等于最大数量则说明消息队列已满 */ if(_mq->curCnt >= _mq->maxCnt) { return RET_ERR; } + /* 头节点为空则在头节点申请内存 */ if(NULL == _mq->pHead) { _mq->pHead = (mes_queue_item_t *)MQ_MALLOC(sizeof(mes_queue_item_t) + size); _mq->pTail = _mq->pHead; - } + } /* 否则则需在尾结点的下一节点申请内存 */ else { _mq->pTail->pNext = (mes_queue_item_t *)MQ_MALLOC(sizeof(mes_queue_item_t) + size); _mq->pTail = _mq->pTail->pNext; } + /* 将数据和数量拷贝到新节点 */ _mq->pTail->pNext = NULL; _mq->pTail->size = size; memcpy(_mq->pTail->data, pData, size); - _mq->curCnt = _mq->curCnt + 1; + _mq->curCnt = _mq->curCnt + 1; /* 计数+1 */ return RET_OK; } @@ -168,15 +175,17 @@ uint8_t mes_queue_read(mes_queue_t *_mq, void *pBuf, uint32_t *size) ASSERT_PARAM(IS_VALID_POINT(pBuf)); ASSERT_PARAM(IS_VALID_POINT(size)); + /* 头节点为空或当前计数值为0则表示消息队列为空 */ if(NULL == _mq->pHead || 0 == _mq->curCnt) { return RET_ERR; } - pTmp = _mq->pHead; + pTmp = _mq->pHead; /* 拿到头节点 */ + /* 将数据和数量拷贝到外部缓存区 */ *size = _mq->pHead->size; memcpy(pBuf, (void *)_mq->pHead->data, _mq->pHead->size); - _mq->pHead = _mq->pHead->pNext; - if(_mq->pHead == NULL) { _mq->pTail = NULL; } - MQ_FREE(pTmp); - _mq->curCnt = _mq->curCnt - 1; + _mq->pHead = _mq->pHead->pNext; /* 头节点指向下一节点 */ + if(_mq->pHead == NULL) { _mq->pTail = NULL; } /* 若头节点为空则尾结点也要赋值为空 */ + MQ_FREE(pTmp); /* 释放内存 */ + _mq->curCnt = _mq->curCnt - 1; /* 计数-1 */ return RET_OK; } diff --git a/drivers/modules/message_queue.h b/drivers/modules/message_queue.h index 9b84dc0..54bee6d 100644 --- a/drivers/modules/message_queue.h +++ b/drivers/modules/message_queue.h @@ -88,7 +88,7 @@ typedef struct mes_queue { */ void mes_queue_init(mes_queue_t *_mq, uint32_t size); -void mes_queue_delete(mes_queue_t *_mq); +void mes_queue_de_init(mes_queue_t *_mq); uint8_t mes_queue_write(mes_queue_t *_mq, void *pData, uint32_t size); uint8_t mes_queue_read(mes_queue_t *_mq, void *pBuf, uint32_t *size); diff --git a/drivers/modules/sync_method.c b/drivers/modules/sync_method.c index c91aa90..14ac3d8 100644 --- a/drivers/modules/sync_method.c +++ b/drivers/modules/sync_method.c @@ -3,7 +3,7 @@ * @file sync_method.c * @author ashuai0110 * @version V2.1 - * @date 2023-09-26 + * @date 2023-12-27 * @brief 伪线程同步方法(信号量,互斥锁,事件集) * ****************************************************************************** @@ -15,6 +15,7 @@ * Change Logs: * Date Author Notes * 2023-09-26 ashuai0110 完成基本内容 + * 2023-12-27 ashuai0110 增加详细的代码注释 * ****************************************************************************** */ @@ -88,7 +89,8 @@ void sync_sem_init(sync_sem_t *_sem, uint32_t value) { ASSERT_PARAM(IS_VALID_POINT(_sem)); - + + /* 信号量实质上是整型变量 */ *_sem = value; } @@ -103,6 +105,7 @@ void sync_sem_put(sync_sem_t *_sem) { ASSERT_PARAM(IS_VALID_POINT(_sem)); + /* 释放信号量即变量自增 */ if(0xFFFFFFFFul != *_sem) { *_sem = *_sem + 1; @@ -122,11 +125,12 @@ uint8_t sync_sem_get(sync_sem_t *_sem) { ASSERT_PARAM(IS_VALID_POINT(_sem)); + /* 变量为零说明无信号量 */ if(0 == *_sem) { return RET_ERR; } - + /* 否则则变量自减 */ *_sem = *_sem - 1; return RET_OK; @@ -158,6 +162,7 @@ void sync_mutex_init(sync_mutex_t *_mutex) { ASSERT_PARAM(IS_VALID_POINT(_mutex)); + /* 信号量实质上是二值变量 */ *_mutex = MUTEX_UNLOCK; } @@ -172,6 +177,7 @@ void sync_mutex_put(sync_mutex_t *_mutex) { ASSERT_PARAM(IS_VALID_POINT(_mutex)); + /* 解锁即变量赋值为0 */ *_mutex = MUTEX_UNLOCK; } @@ -188,11 +194,12 @@ uint8_t sync_mutex_get(sync_mutex_t *_mutex) { ASSERT_PARAM(IS_VALID_POINT(_mutex)); + /* 若已上锁则无法再次上锁返回错误 */ if(MUTEX_LOCK == *_mutex) { return RET_ERR; } - + /* 否则则变量赋值为1 */ *_mutex = MUTEX_LOCK; return RET_OK; @@ -210,6 +217,7 @@ void sync_event_init(sync_event_t *_event) { ASSERT_PARAM(IS_VALID_POINT(_event)); + /* 事件集实质上是32位无符号整型变量 */ *_event = 0; } @@ -227,6 +235,7 @@ void sync_event_put(sync_event_t *_event, uint32_t bits) ASSERT_PARAM(IS_VALID_POINT(_event)); ASSERT_PARAM(IS_VALID_EVENT_BITS(bits)); + /* 每个位都代表一个事件 */ *_event = *_event | bits; } @@ -258,13 +267,14 @@ uint8_t sync_event_get(sync_event_t *_event, uint32_t bits, uint8_t eventFlg, ui ASSERT_PARAM(IS_VALID_EVENT_FLAG(eventFlg)); ASSERT_PARAM(IS_VALID_EVENT_ACTION(eventAct)); + /* 标志是事件或则bits中任一事件触发(bits中任一个为1的位 事件集中也为1)就返回成功 */ if(EVENT_OR == eventFlg) { if((*_event) & bits) { ret = RET_OK; } - } + } /* 标志是事件与则bits中所有事件都触发(bits中所有为1的位 事件集中也都为1)才返回成功 */ else if(EVENT_AND == eventFlg) { if(((*_event) & bits) == bits) @@ -272,7 +282,7 @@ uint8_t sync_event_get(sync_event_t *_event, uint32_t bits, uint8_t eventFlg, ui ret = RET_OK; } } - + /* 动作是清除则置零参数bits中为1的位 */ if(EVENT_CLEAR == eventAct && RET_OK == ret) { *_event = *_event & (uint32_t)(~bits); diff --git a/drivers/modules/sync_method.h b/drivers/modules/sync_method.h index aee6268..8ff660c 100644 --- a/drivers/modules/sync_method.h +++ b/drivers/modules/sync_method.h @@ -3,7 +3,7 @@ * @file sync_method.h * @author ashuai0110 * @version V2.1 - * @date 2023-09-26 + * @date 2023-12-27 * @brief 伪线程同步方法(信号量,互斥锁,事件集) * ****************************************************************************** diff --git a/drivers/modules/timer_software.c b/drivers/modules/timer_software.c index ac3b32a..8bf1686 100644 --- a/drivers/modules/timer_software.c +++ b/drivers/modules/timer_software.c @@ -3,7 +3,7 @@ * @file timer_software.c * @author ashuai0110 * @version V2.1 - * @date 2023-09-26 + * @date 2023-12-27 * @brief 软件定时器 * ****************************************************************************** @@ -15,6 +15,7 @@ * Change Logs: * Date Author Notes * 2023-09-26 ashuai0110 完成基本内容 + * 2023-12-27 ashuai0110 增加详细的代码注释 * ****************************************************************************** */ @@ -102,11 +103,12 @@ uint8_t timer_s_init(timer_s_t *_ts, uint32_t targetTicks, void (* callbackFn)(v ASSERT_PARAM(IS_VALID_POINT(callbackFn)); ASSERT_PARAM(IS_VALID_TIMER_RUN(runFlg)); + /* 初始化各参数 */ _ts->curTicks = 0; _ts->targetTicks = targetTicks; _ts->callbackFn = callbackFn; _ts->runFlg = runFlg; - + /* 初始化时就插入链表 */ return timer_s_insert(_ts); } @@ -121,6 +123,7 @@ void timer_s_de_init(timer_s_t *_ts) { ASSERT_PARAM(IS_VALID_POINT(_ts)); + /* 取消初始化时从链表取下并将参数全部置零 */ timer_s_pending(_ts); memset(_ts, 0, sizeof(timer_s_t)); } @@ -136,15 +139,18 @@ void timer_s_de_init(timer_s_t *_ts) */ uint8_t timer_s_insert(timer_s_t *_ts) { - timer_s_t *tsTarget = pTimerTaskHead; + timer_s_t *tsTarget; ASSERT_PARAM(IS_VALID_POINT(_ts)); + tsTarget = pTimerTaskHead; /* 拿到链表头节点 */ + /* 遍历查重 重复则返回错误 */ while(tsTarget) { if(tsTarget == _ts) { return RET_ERR; } tsTarget = tsTarget->pNext; } + /* 否则使用头插法(后来居上)将此节点插入链表 */ _ts->pNext = pTimerTaskHead; pTimerTaskHead = _ts; @@ -162,14 +168,17 @@ uint8_t timer_s_insert(timer_s_t *_ts) */ uint8_t timer_s_pending(timer_s_t *_ts) { - timer_s_t *tsTarget = pTimerTaskHead; - timer_s_t *tsLast = NULL; + timer_s_t *tsTarget; + timer_s_t *tsLast; ASSERT_PARAM(IS_VALID_POINT(_ts)); + tsTarget = pTimerTaskHead; /* 拿到链表头节点 */ + tsLast = NULL; + /* 遍历查找 */ while(tsTarget) { - /* 查找任务是否存在 */ + /* 查找到此节点 */ if(tsTarget == _ts) { /* 是否在头节点 */ @@ -207,16 +216,20 @@ void timer_s_poll(void) { timer_s_t *tsTarget; + /* 遍历链表 */ for(tsTarget = pTimerTaskHead; tsTarget; tsTarget = tsTarget->pNext) { + /* 运行标志为开启运行才执行 */ if(TIMER_RUN_START == tsTarget->runFlg) { if(tsTarget->curTicks < tsTarget->targetTicks) { + /* 当前计数值未达到目标计数值则继续增加 */ tsTarget->curTicks++; } else { + /* 当前计数值达到目标计数值则执行回调函数并清零当前计数值 */ tsTarget->callbackFn(); tsTarget->curTicks = 0; } diff --git a/drivers/modules/timer_software.h b/drivers/modules/timer_software.h index 6271d49..de6248e 100644 --- a/drivers/modules/timer_software.h +++ b/drivers/modules/timer_software.h @@ -3,7 +3,7 @@ * @file timer_software.h * @author ashuai0110 * @version V2.1 - * @date 2023-09-26 + * @date 2023-12-27 * @brief 软件定时器 * ****************************************************************************** @@ -92,6 +92,7 @@ uint8_t timer_s_pending(timer_s_t *_ts); void timer_s_poll(void); +/* set/get interface */ void timer_s_set_cur_ticks(timer_s_t *_ts, uint32_t curTicks); uint32_t timer_s_get_cur_ticks(timer_s_t *_ts); void timer_s_set_target_ticks(timer_s_t *_ts, uint32_t targetTicks); -- Gitee From 792be3ed198868cf5982e6ccf1a55c0bbed5737b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=98=BF=E8=A1=B00110?= Date: Wed, 27 Dec 2023 20:44:45 +0800 Subject: [PATCH 13/66] =?UTF-8?q?=E4=BF=AE=E6=94=B9ring=5Fbuffer=E7=BB=84?= =?UTF-8?q?=E4=BB=B6=E7=9A=84=E8=AF=BB=E5=86=99=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- drivers/modules/ring_buffer.c | 142 +++++++++++++++----------------- drivers/modules/ring_buffer.h | 17 ++-- examples/bootloader/SRC/main.c | 85 +++++++++++++++---- examples/ring_buffer/README.txt | 2 +- examples/ring_buffer/SRC/main.c | 42 +++------- 5 files changed, 154 insertions(+), 134 deletions(-) diff --git a/drivers/modules/ring_buffer.c b/drivers/modules/ring_buffer.c index a23423d..b585e06 100644 --- a/drivers/modules/ring_buffer.c +++ b/drivers/modules/ring_buffer.c @@ -3,9 +3,9 @@ * @file ring_buffer.c * @author ashuai0110 * @version V2.1 - * @date 2023-09-24 + * @date 2023-12-26 * @brief 环形缓冲区 - * (适合定长或易分离出的数据,写满后再写会覆写旧数据无论其是否被读出处理过) + * (适合定长或易分离出的数据,写满后必须读出否则无法写入新数据) * ****************************************************************************** * @attention @@ -16,6 +16,7 @@ * Change Logs: * Date Author Notes * 2023-09-24 ashuai0110 完成基本内容 + * 2023-12-26 ashuai0110 修改读写接口取有效数量读写 * ****************************************************************************** */ @@ -70,26 +71,25 @@ /** * @brief 环形缓冲区初始化 * - * @note None + * @param _rb : 环形缓冲区实例 * - * @param _rb : 环形缓冲区实例 + * @param pBuf : 数据缓冲区 * - * @param pBuf : 数据存储区 - * - * @param size : 缓冲区最大填充数量(数据存储区大小byte) + * @param bufLen : 数据缓冲区长度byte * * @retval None */ -void ring_buffer_init(ring_buffer_t *_rb, void *pBuf, uint32_t size) +void ring_buffer_init(ring_buffer_t *_rb, void *pBuf, uint32_t bufLen) { ASSERT_PARAM(IS_VALID_POINT(_rb)); ASSERT_PARAM(IS_VALID_POINT(pBuf)); - ASSERT_PARAM(IS_VALID_RB_SIZE(size)); - + ASSERT_PARAM(IS_VALID_RB_SIZE(bufLen)); + + /* 初始化各参数 */ _rb->pBuf = (char *)pBuf; _rb->pHead = _rb->pBuf; _rb->pTail = _rb->pBuf; - _rb->size = size; + _rb->bufLen = bufLen; } /** @@ -105,161 +105,151 @@ void ring_buffer_de_init(ring_buffer_t *_rb) { ASSERT_PARAM(IS_VALID_POINT(_rb)); + /* 置零各参数 */ memset(_rb, 0, sizeof(ring_buffer_t)); } /** - * @brief 获取环形缓冲区的大小 - * - * @note 缓冲区大小(byte) - * - * @param _rb : 环形缓冲区实例 - * - * @retval 环形缓冲区的大小 - */ -uint32_t ring_buffer_total_size(ring_buffer_t *_rb) -{ - ASSERT_PARAM(IS_VALID_POINT(_rb)); - - return _rb->size; -} - -/** - * @brief 获取环形缓冲区的可读大小 + * @brief 获取环形缓冲区的可读数量 * - * @note 待读出数量(byte) + * @note 待读出数量byte * * @param _rb : 环形缓冲区实例 * - * @retval 环形缓冲区的可读大小 + * @retval 环形缓冲区的可读数量 */ uint32_t ring_buffer_can_read(ring_buffer_t *_rb) { ASSERT_PARAM(IS_VALID_POINT(_rb)); + /* 头大于尾则总长度-(头-尾) */ if(_rb->pHead > _rb->pTail) { - return (ring_buffer_total_size(_rb) - (_rb->pHead - _rb->pTail)); - } + return (_rb->bufLen - (_rb->pHead - _rb->pTail)); + } /* 头小于尾则尾-头 */ else if(_rb->pHead < _rb->pTail) { return (_rb->pTail - _rb->pHead); } - + /* 头等于尾则为0 */ return 0; } /** - * @brief 获取环形缓冲区的可写大小 + * @brief 获取环形缓冲区的可写数量 * - * @note 可写入数量(byte) + * @note 可写入数量byte * * @param _rb : 环形缓冲区实例 * - * @retval 环形缓冲区的可写大小 + * @retval 环形缓冲区的可写数量 */ uint32_t ring_buffer_can_write(ring_buffer_t *_rb) { ASSERT_PARAM(IS_VALID_POINT(_rb)); - return (ring_buffer_total_size(_rb) - ring_buffer_can_read(_rb)); + /* 总长度减去可读数量既是可写数量 */ + return (_rb->bufLen - ring_buffer_can_read(_rb)); } /** * @brief 从环形缓冲区读出数据 * - * @note None - * * @param _rb : 环形缓冲区实例 * * @param pBuf : 读出数据的存储区 * - * @param size : 读出数据大小 + * @param size : 读出数据的数量byte * - * @retval uint8_t - * @arg RET_OK : 读出成功 - * @arg RET_ERR : 参数size为0或超出可读大小 + * @retval 实际读出数据数量byte */ -uint8_t ring_buffer_read(ring_buffer_t *_rb, void *pBuf, uint32_t size) +uint32_t ring_buffer_read(ring_buffer_t *_rb, void *pBuf, uint32_t len) { uint32_t readSize = 0; ASSERT_PARAM(IS_VALID_POINT(_rb)); ASSERT_PARAM(IS_VALID_POINT(pBuf)); - if(0 == size && size > ring_buffer_total_size(_rb)) { return RET_ERR; } - + /* 读出数量超出可读数量则取可读数量 */ + len = (len > ring_buffer_can_read(_rb)) ? ring_buffer_can_read(_rb) : len; + if(0 == len) { return 0; } + + /* 头小于尾则说明写入数据未溢出从头写则无需拼接数据 */ if(_rb->pHead < _rb->pTail) { - memcpy(pBuf, _rb->pHead, size); - _rb->pHead += size; - } + memcpy(pBuf, _rb->pHead, len); + _rb->pHead += len; + } /* 否则说明写入数据溢出从头写则需拼接数据 */ else { - readSize = ring_buffer_total_size(_rb) - (_rb->pHead - _rb->pBuf); - if(size < readSize) + /* 不计入溢出的数量还剩多少可读出数据 */ + readSize = _rb->bufLen - (_rb->pHead - _rb->pBuf); + /* 若读出数量小于剩余可读出数量则直接读出 */ + if(len < readSize) { - memcpy(pBuf, _rb->pHead, size); - _rb->pHead += size; - } + memcpy(pBuf, _rb->pHead, len); + _rb->pHead += len; + } /* 否则需将剩余数量读完再从头读出余下的 */ else { memcpy(pBuf, _rb->pHead, readSize); _rb->pHead = _rb->pBuf; - ring_buffer_read(_rb, (void *)((char *)pBuf + readSize), size - readSize); + ring_buffer_read(_rb, (void *)((char *)pBuf + readSize), len - readSize); } } - return RET_OK; + return len; } /** * @brief 写入数据到环形缓冲区 * - * @note None - * * @param _rb : 环形缓冲区实例 * - * @param pData : 写入数据的存储区 + * @param pData : 写入数据的缓冲区 * - * @param size : 写入数据的大小 + * @param size : 写入数据的数量byte * - * @retval uint8_t - * @arg RET_OK : 写入成功 - * @arg RET_ERR : 参数size为0或超出可写大小 + * @retval 实际写入数据数量 */ -uint8_t ring_buffer_write(ring_buffer_t *_rb, void *pData, uint32_t size) +uint32_t ring_buffer_write(ring_buffer_t *_rb, void *pData, uint32_t len) { uint32_t writeSize = 0; ASSERT_PARAM(IS_VALID_POINT(_rb)); ASSERT_PARAM(IS_VALID_POINT(pData)); - if(0 == size || size > ring_buffer_total_size(_rb)) { return RET_ERR; } + /* 写入数量超出可写数量则取可写数量 */ + len = (len > ring_buffer_can_write(_rb)) ? ring_buffer_can_write(_rb) : len; + if(0 == len) { return 0; } + /* 头小于等于尾则说明写入数据可以溢出从头写则可能需分段写入 */ if(_rb->pHead <= _rb->pTail) { - writeSize = ring_buffer_total_size(_rb) - (_rb->pTail - _rb->pBuf); - if (size <= writeSize) + /* 不考虑溢出的数量还可以写入多少 */ + writeSize = _rb->bufLen - (_rb->pTail - _rb->pBuf); + /* 若写入数量小于等于剩余可写数量则直接写入 */ + if(len <= writeSize) { - memcpy(_rb->pTail, pData, size); - _rb->pTail += size; - if(_rb->pTail >= (_rb->pBuf + ring_buffer_total_size(_rb))) { _rb->pTail = _rb->pBuf; } - } + memcpy(_rb->pTail, pData, len); + _rb->pTail += len; + /* 写入数量已满则从头开始 */ + if(_rb->pTail >= (_rb->pBuf + _rb->bufLen)) { _rb->pTail = _rb->pBuf; } + } /* 否则需将剩余数量写完再从头写入余下的 */ else { memcpy(_rb->pTail, pData, writeSize); _rb->pTail = _rb->pBuf; - ring_buffer_write(_rb, (void *)((char *)pData + writeSize), size - writeSize); + ring_buffer_write(_rb, (void *)((char *)pData + writeSize), len - writeSize); } - } + } /* 否则则直接写入 */ else { - memcpy(_rb->pTail, pData, size); - _rb->pTail += size; + memcpy(_rb->pTail, pData, len); + _rb->pTail += len; } - return RET_OK; + return len; } /** diff --git a/drivers/modules/ring_buffer.h b/drivers/modules/ring_buffer.h index b30a27a..57d531f 100644 --- a/drivers/modules/ring_buffer.h +++ b/drivers/modules/ring_buffer.h @@ -3,7 +3,7 @@ * @file ring_buffer.h * @author ashuai0110 * @version V2.1 - * @date 2023-09-24 + * @date 2023-12-26 * @brief 环形缓冲区 * (适合定长或易分离出的数据,写满后再写会覆写旧数据无论其是否被读出处理过) * @@ -48,10 +48,10 @@ extern "C" { * @brief 环形缓冲区 structrue definition */ typedef struct ring_buffer { - char *pHead; /*!< 环形缓冲区头节点(开始读节点) */ - char *pTail; /*!< 环形缓冲区尾节点(开始写节点) */ - char *pBuf; /*!< 环形缓冲区数据缓冲区 */ - uint32_t size; /*!< 环形缓冲区数据最大存储数量(byte) */ + char *pHead; /*!< 头节点(开始读节点) */ + char *pTail; /*!< 尾节点(开始写节点) */ + char *pBuf; /*!< 数据缓冲区 */ + uint32_t bufLen; /*!< 数据缓冲区大小 */ } ring_buffer_t; /** @@ -66,15 +66,14 @@ typedef struct ring_buffer { * @{ */ -void ring_buffer_init(ring_buffer_t* _rb, void *pBuf, uint32_t size); +void ring_buffer_init(ring_buffer_t* _rb, void *pBuf, uint32_t bufLen); void ring_buffer_de_init(ring_buffer_t *_rb); -uint32_t ring_buffer_total_size(ring_buffer_t *_rb); uint32_t ring_buffer_can_read(ring_buffer_t *_rb); uint32_t ring_buffer_can_write(ring_buffer_t *_rb); -uint8_t ring_buffer_read(ring_buffer_t *_rb, void *pBuf, uint32_t size); -uint8_t ring_buffer_write(ring_buffer_t *_rb, void *pData, uint32_t size); +uint32_t ring_buffer_read(ring_buffer_t *_rb, void *pBuf, uint32_t len); +uint32_t ring_buffer_write(ring_buffer_t *_rb, void *pData, uint32_t len); /** * @} diff --git a/examples/bootloader/SRC/main.c b/examples/bootloader/SRC/main.c index 0b0153c..4bc6cb7 100644 --- a/examples/bootloader/SRC/main.c +++ b/examples/bootloader/SRC/main.c @@ -24,6 +24,7 @@ #include "xmodem.h" /* 私有宏定义-----------------------------------------------------------------*/ +#define TEST_TX_RX /* 私有类型定义---------------------------------------------------------------*/ @@ -31,8 +32,8 @@ static uint8_t usart1DmaTxBuf[200]; /* 串口1dma发送缓存区 */ static uint8_t usart1DmaRxBuf[200]; /* 串口1dma接收缓存区 */ -xmodem_t xmodem; -static uint8_t xmodemBuf[1030]; +xmodem_t xmodem; /* xmodem实例 */ +static uint8_t xmodemBuf[1029]; /* xmodem数据缓存区(128或1024+3+1或2) */ /* 全局变量-------------------------------------------------------------------*/ @@ -42,10 +43,6 @@ void usart1_tx_en(uint8_t enState); /** * @brief 定时器1中断函数 - * - * @param None - * - * @retval None */ void TIM1_UP_IRQHandler(void) { @@ -64,7 +61,9 @@ void TIM1_UP_IRQHandler(void) } } -/* 串口1中断 */ +/** + * @brief 串口1中断 + */ void USART1_IRQHandler(void) { /* 串口1空闲中断 */ @@ -74,13 +73,15 @@ void USART1_IRQHandler(void) USART1->DR; /* 这里写接收处理 */ - DEBUG_LOG("%d", sizeof(usart1DmaRxBuf) - DMA_GetCurrDataCounter(DMA1_Channel5)); xmodem_write_rx_buf(&xmodem, usart1DmaRxBuf, sizeof(usart1DmaRxBuf) - DMA_GetCurrDataCounter(DMA1_Channel5)); + /* dma重配置 */ usart1_dma_rx_reconfig(sizeof(usart1DmaRxBuf)); } } -/* 串口1接收的dma中断 */ +/** + * @brief 串口1接收的dma中断 + */ void DMA1_Channel5_IRQHandler(void) { /* DMA传输完成中断 */ @@ -88,13 +89,16 @@ void DMA1_Channel5_IRQHandler(void) { /* 这里写接收处理 */ xmodem_write_rx_buf(&xmodem, usart1DmaRxBuf, sizeof(usart1DmaRxBuf)); + /* dma重配置 */ usart1_dma_rx_reconfig(sizeof(usart1DmaRxBuf)); DMA_ClearITPendingBit(DMA1_IT_TC5); } } -/* 串口1发送的dma中断 */ +/** + * @brief 串口1发送的dma中断 + */ void DMA1_Channel4_IRQHandler(void) { /* DMA传输完成中断 */ @@ -107,21 +111,29 @@ void DMA1_Channel4_IRQHandler(void) } } +/** + * @brief 串口发送前准备函数 + * + * @param enState : 0失能 1使能 + * + * @retval None + */ void usart1_tx_en(uint8_t enState) { if(enState) { + /* 判断当前是否正在发送 发送完成标志置位则不是正在发送 */ if(USART_GetFlagStatus(USART1, USART_FLAG_TC) != RESET) { uint16_t num; - num = xmodem_read_tx_buf(&xmodem, usart1DmaTxBuf, sizeof(usart1DmaTxBuf)); + num = xmodem_read_tx_buf(&xmodem, usart1DmaTxBuf, sizeof(usart1DmaTxBuf)); /* 读出数据 */ if(0 < num) { - usart1_dma_tx_reconfig(num); + usart1_dma_tx_reconfig(num); /* dma重配置 */ } else { - DMA_Cmd(DMA1_Channel4, DISABLE); + DMA_Cmd(DMA1_Channel4, DISABLE); /* 关闭dma */ } } } @@ -132,23 +144,60 @@ void usart1_tx_en(uint8_t enState) } /** - * @brief + * @brief 获取xmodem数据包回调函数 + * + * @param packetNum : 数据包序号 首次从1开始 超出255回到0 + * + * @param data : 有效数据缓冲区(需读出数据) * - * @param None + * @param len : 有效数据长度(包含填充内容0x1A) * * @retval None */ +void xmodem_get_packet_callback(uint8_t packetNum, uint8_t *data, uint16_t *len) +{ + uint16_t lenTmp = *len; + + PRINT_LOG("xmodem packet num:%d, len:%d, data: ", packetNum, lenTmp); + for(uint16_t i = 0; i < lenTmp; i++) + { + PRINT_LOG("%02X ", data[i]); + } + PRINT_LOG("\r\n"); +} + +/** + * @brief 设置xmodem数据包回调函数 + * + * @param packetNum : 数据包序号 首次从1开始 超出255回到0 + * + * @param data : 有效数据存放区(需填充数据) + * + * @param len : 有效数据长度(不包含填充内容0x1A,组件自动填充) + * + * @retval None + */ +void xmodem_set_packet_callback(uint8_t packetNum, uint8_t *data, uint16_t *len) +{ + + +} + +/** + * @brief main + */ int main(int argc, char *argv[]) { VERSION_LOG("example-bootloader", 1, 0, 0); + /* 串口及其dma初始化 */ usart1_dma_init_config(115200, usart1DmaTxBuf, sizeof(usart1DmaTxBuf), usart1DmaRxBuf, sizeof(usart1DmaRxBuf)); - /* 定时器初始化 1ms */ tim1_init_config(100-1, 720-1); - // xmodem_init(&xmodem, xmodemBuf, sizeof(xmodemBuf), usart1_tx_en, 3); - + /* xmodem组件初始化 */ + xmodem_init(&xmodem, xmodemBuf, sizeof(xmodemBuf), usart1_tx_en, xmodem_get_packet_callback, xmodem_set_packet_callback, 2); + /* 启动xmodem接收 */ xmodem_rx_start(&xmodem, XMODEM_RX_FLAG_CRC); while(1) diff --git a/examples/ring_buffer/README.txt b/examples/ring_buffer/README.txt index ea36226..42d9fad 100644 --- a/examples/ring_buffer/README.txt +++ b/examples/ring_buffer/README.txt @@ -2,7 +2,7 @@ 用例使用说明 ================================================================================ Date Author MDK MCU -2023-09-24 ashuai0110 5.35 STM32F1 +2023-12-26 ashuai0110 5.35 STM32F1 ================================================================================ 功能描述 diff --git a/examples/ring_buffer/SRC/main.c b/examples/ring_buffer/SRC/main.c index 9c542c8..7adeedb 100644 --- a/examples/ring_buffer/SRC/main.c +++ b/examples/ring_buffer/SRC/main.c @@ -3,7 +3,7 @@ * @file main.c * @author ashuai0110 * @version V1.0 - * @date 2023-09-24 + * @date 2023-12-26 * @brief 使用举例-环形缓冲区 * ****************************************************************************** @@ -26,7 +26,7 @@ /* 私有类型定义---------------------------------------------------------------*/ /* 私有变量-------------------------------------------------------------------*/ -static ring_buffer_t testRB; /* 测试环形缓冲区实例 */ +static ring_buffer_t testRB; /* 环形缓冲区管理实例 */ static uint8_t testBuf[50]; /* 实际缓冲区 */ /* 全局变量-------------------------------------------------------------------*/ @@ -42,40 +42,22 @@ static uint8_t testBuf[50]; /* 实际缓冲区 */ */ void USART1_IRQHandler(void) { - static uint8_t data; + static uint8_t data, ret; if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) { data = USART_ReceiveData(USART1); - /* 环形缓冲区写入数据 */ - ring_buffer_write(&testRB, &data, 1); + /* 向环形缓冲区写入数据 */ + ret = ring_buffer_write(&testRB, &data, 1); + if(0 == ret) + { + WARN_LOG("ring buffer write full"); + } USART_ClearITPendingBit(USART1, USART_IT_RXNE); } } -/** - * @brief 环形缓冲区测试读取 - * - * @param pBuf : 数据存储区 - * - * @param size : 期望读取大小 - * - * @retval 实际读取大小 - */ -uint32_t ring_buffer_test_read(void *pBuf, uint32_t size) -{ - /* 超过可读大小则使用可读大小 */ - size = (size > ring_buffer_can_read(&testRB)) ? ring_buffer_can_read(&testRB) : size; - if(0 != size) - { - /* 从环形缓冲区读取数据 */ - ring_buffer_read(&testRB, pBuf, size); - } - - return size; -} - int main(int argc, char *argv[]) { VERSION_LOG("example-ring_buffer", 1, 0, 0); @@ -93,8 +75,8 @@ int main(int argc, char *argv[]) static uint8_t dataCnt = 0; uint8_t buf[20]; uint8_t len; - - len = ring_buffer_test_read(buf, sizeof(buf)); + /* 从环形缓冲区读取数据 */ + len = ring_buffer_read(&testRB, buf, sizeof(buf)); /* 以实际读取数量逐个处理 */ for(uint8_t cnt = 0; cnt < len; cnt++) @@ -108,7 +90,7 @@ int main(int argc, char *argv[]) DEBUG_LOG("rec:%s", recData); } dataCnt = 0; - } + } /* 否则继续存储 */ else { recData[dataCnt++] = buf[cnt]; -- Gitee From e6f1b53be6601ea77789c03240fb3a18253b3e6e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=98=BF=E8=A1=B00110?= Date: Thu, 28 Dec 2023 20:50:34 +0800 Subject: [PATCH 14/66] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E7=BB=84=E4=BB=B6?= =?UTF-8?q?=E8=AE=A1=E6=97=B6=E8=8A=82=E6=8B=8D=E7=BB=9F=E4=B8=80=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- drivers/common/common_include.c | 99 +++++++++++++++++++++++++++++++++ drivers/common/common_include.h | 19 +++++-- 2 files changed, 112 insertions(+), 6 deletions(-) create mode 100644 drivers/common/common_include.c diff --git a/drivers/common/common_include.c b/drivers/common/common_include.c new file mode 100644 index 0000000..9a0f585 --- /dev/null +++ b/drivers/common/common_include.c @@ -0,0 +1,99 @@ +/** + ****************************************************************************** + * @file common_include.c + * @author ashuai0110 + * @version V2.1 + * @date 2023-12-28 + * @brief 公共引用文件(所有组件都需包含此文件) + * + ****************************************************************************** + * @attention + * + * 版权声明:内容为编者(ashuai0110)原创,使用请注明出处,当然,你也可以不这样做^_^ + * 出处链接:https://gitee.com/ashuai0110/mcu_reuse_development_module.git + * + * Change Logs: + * Date Author Notes + * 2023-10-17 ashuai0110 完成基本内容 + * 2023-12-28 ashuai0110 新增组件计时节拍接口 + * + ****************************************************************************** + */ + +/* 包含头文件-----------------------------------------------------------------*/ +#include "common_include.h" + +/** + * @addtogroup common + * @{ + */ + +/** + * @defgroup common_include common_include + * @{ + */ + +/* 私有宏定义-----------------------------------------------------------------*/ + +/* 私有类型定义---------------------------------------------------------------*/ + +/* 私有变量-------------------------------------------------------------------*/ +/** + * @defgroup common_include_local_variables common include local variables + * @{ + */ + +static volatile uint32_t moduleTick; /* 组件计时节拍(计时溢出需49.7天,溢出后可能造成计时异常影响组件功能) */ + +/** + * @} + */ + +/* 全局变量-------------------------------------------------------------------*/ + +/* 私有函数原型---------------------------------------------------------------*/ + +/** + * @defgroup common_include_global_functions common include global functions + * @{ + */ + +/** + * @brief 组件计时节拍累计 + * + * @note 此接口全组件共用需用户对接底层systick或timer等,若使用的组件无需时基则无需对接 + * + * @param ticks : 累计时间ms(如轮询周期是10ms则填10,是1ms则填1) + * + * @retval None + */ +void module_tick_inc(uint32_t ticks) +{ + moduleTick += ticks; +} + +/** + * @brief 获取组件计时节拍 + * + * @note 此接口一般情况仅组件内部使用 + * + * @param None + * + * @retval 返回当前节拍数ms + */ +uint32_t module_tick_get(void) +{ + return moduleTick; +} + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ diff --git a/drivers/common/common_include.h b/drivers/common/common_include.h index e8e8106..aee421e 100644 --- a/drivers/common/common_include.h +++ b/drivers/common/common_include.h @@ -3,8 +3,8 @@ * @file common_include.h * @author ashuai0110 * @version V2.1 - * @date 2023-10-27 - * @brief 通用头文件(所有组件都需包含此文件) + * @date 2023-12-28 + * @brief 公共引用文件(所有组件都需包含此文件) * ****************************************************************************** * @attention @@ -12,10 +12,6 @@ * 版权声明:内容为编者(ashuai0110)原创,使用请注明出处,当然,你也可以不这样做^_^ * 出处链接:https://gitee.com/ashuai0110/mcu_reuse_development_module.git * - * Change Logs: - * Date Author Notes - * 2023-10-27 ashuai0110 完成基本内容 - * ****************************************************************************** */ @@ -318,6 +314,17 @@ extern "C" { /* 全局变量-------------------------------------------------------------------*/ /* 函数原型-------------------------------------------------------------------*/ +/** + * @addtogroup common_include_global_functions + * @{ + */ + +void module_tick_inc(uint32_t ticks); +uint32_t module_tick_get(void); + +/** + * @} + */ /** * @} -- Gitee From fd863389772989ab0d0037cb221ac7f972d7bf5e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=98=BF=E8=A1=B00110?= Date: Thu, 28 Dec 2023 20:51:19 +0800 Subject: [PATCH 15/66] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E4=BB=8E=E7=BB=84?= =?UTF-8?q?=E4=BB=B6=E8=AE=A1=E6=97=B6=E8=8A=82=E6=8B=8D=E6=8E=A5=E5=8F=A3?= =?UTF-8?q?=E8=8E=B7=E5=8F=96=E6=97=B6=E5=9F=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- drivers/modules/delay_no_block.c | 71 +++++-------------- drivers/modules/delay_no_block.h | 6 +- .../delay_no_block/MDK/use_example.uvoptx | 16 ++++- .../delay_no_block/MDK/use_example.uvprojx | 5 ++ examples/delay_no_block/README.txt | 2 +- examples/delay_no_block/SRC/main.c | 6 +- 6 files changed, 42 insertions(+), 64 deletions(-) diff --git a/drivers/modules/delay_no_block.c b/drivers/modules/delay_no_block.c index f109bed..805d855 100644 --- a/drivers/modules/delay_no_block.c +++ b/drivers/modules/delay_no_block.c @@ -3,7 +3,7 @@ * @file delay_no_block.c * @author ashuai0110 * @version V2.1 - * @date 2023-10-27 + * @date 2023-12-28 * @brief 非阻塞延时 * ****************************************************************************** @@ -15,6 +15,7 @@ * Change Logs: * Date Author Notes * 2023-10-27 ashuai0110 完成基本内容 + * 2023-12-28 ashuai0110 修改从组件计时节拍接口获取时基,增加详细注释 * ****************************************************************************** */ @@ -38,8 +39,6 @@ * @{ */ -#define DELAY_TICKS_MAX (0x7FFFFFFFul) /* 最大计数值(默认不改) */ - /** * @defgroup delay_no_block_check_parameters_validity delay no block check parameters validity * @{ @@ -50,8 +49,7 @@ /* 延时任务计数值有效性检查 */ #define IS_VALID_DELAY_TICKS(x) \ -( ((x) >= 1) && \ - ((x) <= DELAY_TICKS_MAX)) +( ((x) != 0u)) /** * @} */ @@ -68,8 +66,7 @@ * @{ */ -static delay_item_t delayTaskArr[DELAY_TASK_SIZE]; /* 延时任务工作数组 */ -volatile static uint32_t delayBaseTicks; /* 基本计数值 */ +static delay_item_t delayTaskArr[DELAY_TASK_SIZE]; /* 延时任务数组 */ /** * @} @@ -87,6 +84,8 @@ volatile static uint32_t delayBaseTicks; /* 基本计数值 */ /** * @brief 创建延时任务 * + * @note 若创建的任务ID为局部变量则需要初始化值为0 + * * @param _id : 延时任务ID 首次调用为新建,之后为更新参数 * * @param delayTicks : 延时任务计数值 例如延时500ms,轮询周期10ms,则delayTicks=500ms/10ms=50 @@ -103,23 +102,27 @@ uint8_t delay_init(delay_id_t *_id, uint32_t delayTicks) ASSERT_PARAM(IS_VALID_DELAY_ID(*_id)); ASSERT_PARAM(IS_VALID_DELAY_TICKS(delayTicks)); + /* id为0说明是新建任务 */ if(0 == *_id) { + /* 遍历任务数组 */ for(idCnt = 0; idCnt < DELAY_TASK_SIZE; idCnt++) { + /* 若某个任务的计数值为0且运行标志为不运行则说明则任务为空 */ if(0 == delayTaskArr[idCnt].ticks && 0 == delayTaskArr[idCnt].run) { - delayTaskArr[idCnt].ticks = delayBaseTicks + delayTicks; + /* 将延时参数存入空任务位置 */ + delayTaskArr[idCnt].ticks = module_tick_get() + delayTicks; delayTaskArr[idCnt].run = 1; - *_id = idCnt + 1; + *_id = idCnt + 1; /* 记录此任务 */ break; } } - } + } /* 不为0说明是旧任务更新延时时间 */ else { - delayTaskArr[*_id - 1].ticks = delayBaseTicks + delayTicks; + delayTaskArr[*_id - 1].ticks = module_tick_get() + delayTicks; delayTaskArr[*_id - 1].run = 1; } @@ -138,6 +141,7 @@ void delay_de_init(delay_id_t *_id) ASSERT_PARAM(IS_VALID_POINT(_id)); ASSERT_PARAM(IS_VALID_DELAY_ID(*_id)); + /* 延时任务参数置零 id置零 */ memset(&delayTaskArr[*_id - 1], 0, sizeof(delay_item_t)); *_id = 0; } @@ -157,12 +161,14 @@ uint8_t delay_wait(delay_id_t *_id) ASSERT_PARAM(IS_VALID_POINT(_id)); ASSERT_PARAM(IS_VALID_DELAY_ID(*_id)); + /* 若某个任务的计数值为0且运行标志为不运行则说明则任务为空返回错误 */ if(0 == delayTaskArr[*_id - 1].ticks || 0 == delayTaskArr[*_id - 1].run) { return RET_ERR; } - if(delayBaseTicks > delayTaskArr[*_id - 1].ticks) + /* 计时计数值超出延时时间说明延时结束 清零计数值并返回完成 */ + if(module_tick_get() > delayTaskArr[*_id - 1].ticks) { delayTaskArr[*_id - 1].ticks = 0; @@ -172,47 +178,6 @@ uint8_t delay_wait(delay_id_t *_id) return RET_ING; } -/** - * @brief 延时任务轮询处理 - * - * @note 此函数执行周期即是延时任务计数值累加周期 - * - * @param None - * - * @retval None - */ -void delay_poll(void) -{ - delayBaseTicks++; - - if(DELAY_TICKS_MAX < delayBaseTicks) - { - delayBaseTicks = 0; - - delay_id_t idCnt; - - for(idCnt = 0; idCnt < DELAY_TASK_SIZE; idCnt++) - { - if(DELAY_TICKS_MAX < delayTaskArr[idCnt].ticks) - { - delayTaskArr[idCnt].ticks = delayTaskArr[idCnt].ticks - DELAY_TICKS_MAX; - } - } - } -} - -/** - * @brief 读取基本计数值 - * - * @param None - * - * @retval 基本计数值 - */ -uint32_t delay_ticks(void) -{ - return delayBaseTicks; -} - /** * @} */ diff --git a/drivers/modules/delay_no_block.h b/drivers/modules/delay_no_block.h index 26cba37..988dd06 100644 --- a/drivers/modules/delay_no_block.h +++ b/drivers/modules/delay_no_block.h @@ -3,7 +3,7 @@ * @file delay_no_block.h * @author ashuai0110 * @version V2.1 - * @date 2023-10-27 + * @date 2023-12-28 * @brief 非阻塞延时 * ****************************************************************************** @@ -90,10 +90,6 @@ void delay_de_init(delay_id_t *_id); uint8_t delay_wait(delay_id_t *_id); -void delay_poll(void); - -uint32_t delay_ticks(void); - /** * @} */ diff --git a/examples/delay_no_block/MDK/use_example.uvoptx b/examples/delay_no_block/MDK/use_example.uvoptx index 5958fb9..5cf68c8 100644 --- a/examples/delay_no_block/MDK/use_example.uvoptx +++ b/examples/delay_no_block/MDK/use_example.uvoptx @@ -239,7 +239,7 @@ libs - 1 + 0 0 0 0 @@ -603,6 +603,18 @@ 0 0 + + 5 + 33 + 1 + 0 + 0 + 0 + ..\..\..\drivers\common\common_include.c + common_include.c + 0 + 0 + @@ -613,7 +625,7 @@ 0 6 - 33 + 34 5 0 0 diff --git a/examples/delay_no_block/MDK/use_example.uvprojx b/examples/delay_no_block/MDK/use_example.uvprojx index 6d78445..3b6c52d 100644 --- a/examples/delay_no_block/MDK/use_example.uvprojx +++ b/examples/delay_no_block/MDK/use_example.uvprojx @@ -563,6 +563,11 @@ 1 ..\..\..\drivers\modules\delay_no_block.c + + common_include.c + 1 + ..\..\..\drivers\common\common_include.c + diff --git a/examples/delay_no_block/README.txt b/examples/delay_no_block/README.txt index f783cf2..2a85733 100644 --- a/examples/delay_no_block/README.txt +++ b/examples/delay_no_block/README.txt @@ -2,7 +2,7 @@ 用例使用说明 ================================================================================ Date Author MDK MCU -2023-09-17 ashuai0110 5.35 STM32F1 +2023-12-28 ashuai0110 5.35 STM32F1 ================================================================================ 功能描述 diff --git a/examples/delay_no_block/SRC/main.c b/examples/delay_no_block/SRC/main.c index 233039a..216bc13 100644 --- a/examples/delay_no_block/SRC/main.c +++ b/examples/delay_no_block/SRC/main.c @@ -3,7 +3,7 @@ * @file main.c * @author ashuai0110 * @version V1.0 - * @date 2023-09-17 + * @date 2023-12-28 * @brief 使用举例-非阻塞延时 * ****************************************************************************** @@ -46,8 +46,8 @@ void TIM1_UP_IRQHandler(void) { if(TIM_GetITStatus(TIM1, TIM_IT_Update) != RESET) { - /* 延时轮询处理 */ - delay_poll(); + /* 组件计时节拍接口 */ + module_tick_inc(DELAY_TIM_PERIOD); TIM_ClearITPendingBit(TIM1, TIM_FLAG_Update); } -- Gitee From fe2dff13afe91d8657e2a9ebb9af7ab15ff46a86 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=98=BF=E8=A1=B00110?= Date: Thu, 28 Dec 2023 20:51:53 +0800 Subject: [PATCH 16/66] =?UTF-8?q?=E4=BF=AE=E6=94=B9dma=E5=8F=91=E9=80=81?= =?UTF-8?q?=E5=AE=8C=E6=88=90=E4=B8=AD=E6=96=AD=E7=9A=84=E6=A0=87=E5=BF=97?= =?UTF-8?q?=E4=B9=A6=E5=86=99=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- examples/[base_on_stm32f1]/stm32f1_sys/usart_dma.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/[base_on_stm32f1]/stm32f1_sys/usart_dma.c b/examples/[base_on_stm32f1]/stm32f1_sys/usart_dma.c index f54872d..7fe058b 100644 --- a/examples/[base_on_stm32f1]/stm32f1_sys/usart_dma.c +++ b/examples/[base_on_stm32f1]/stm32f1_sys/usart_dma.c @@ -45,7 +45,7 @@ // { // /* 这里写读取发送内容的处理 */ // -// DMA_ClearITPendingBit(DMA1_IT_TC5); +// DMA_ClearITPendingBit(DMA1_IT_TC4); // } //} -- Gitee From 5f9d322a8aff0072a8562e233895c46b6b66c9a8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=98=BF=E8=A1=B00110?= Date: Thu, 28 Dec 2023 20:53:05 +0800 Subject: [PATCH 17/66] =?UTF-8?q?#I8LFE8=20=E5=A2=9E=E5=8A=A0=E8=AF=A6?= =?UTF-8?q?=E7=BB=86=E6=B3=A8=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- drivers/modules/input_output.c | 104 +++++++++++++++++++++------------ drivers/modules/input_output.h | 10 ++-- 2 files changed, 72 insertions(+), 42 deletions(-) diff --git a/drivers/modules/input_output.c b/drivers/modules/input_output.c index dd6ece3..1e57492 100644 --- a/drivers/modules/input_output.c +++ b/drivers/modules/input_output.c @@ -3,7 +3,7 @@ * @file input_output.c * @author ashuai0110 * @version V2.1 - * @date 2023-09-19 + * @date 2023-12-28 * @brief IO输入输出操作 * (输入可以设置各边沿触发时间,输出可以设置各边沿保持时间) * @@ -16,6 +16,7 @@ * Change Logs: * Date Author Notes * 2023-09-19 ashuai0110 完成基本内容 + * 2023-12-28 ashuai0110 增加详细注释 * ****************************************************************************** */ @@ -97,48 +98,51 @@ static uint8_t io_input_handle(io_t *_io) uint8_t readLevel; ASSERT_PARAM(IS_VALID_POINT(_io)); - - readLevel = _io->rwFn(0); - if(_io->state > 0) { _io->ticks++; } + + if(_io->state > 0) { _io->ticks++; } /* 大于0说明边沿已变化需计时 */ + readLevel = _io->rwFn(0); /* 读取当前io电平 */ switch(_io->state) { - case 0: // 首次变化 - _io->ticks = 0; + case 0: /* 首次变化 */ + _io->ticks = 0; /* 未出现变化则置零计时计数值 */ + /* 当前io电平不等于默认电平说明出现变化 */ if(readLevel != _io->level) { - // 1 > 0 上升沿 0 < 1 下降沿 - _io->edge = (readLevel > _io->level) ? IN_EDGE_RISING : IN_EDGE_FALLING; - _io->level = readLevel; - _io->state = 1; + /* 当前io是1则出现上升沿 当前io是0则出现下降沿 */ + _io->edge = (readLevel == 1) ? IN_EDGE_RISING : IN_EDGE_FALLING; + _io->level = readLevel; /* 记录当前io电平 */ + _io->state = 1; /* 状态切换 */ goto checkTicks; } break; - case 1:// 边沿保持 + case 1: /* 边沿保持或二次变化 */ + /* 若电平不变化则goto */ if(readLevel == _io->level) { goto checkTicks; - } // 边沿变化 + } /* 若电平变化说明保持时间不足需更改为变化后的边沿类型继续 */ else { - _io->level = readLevel; - _io->edge = (_io->edge == IN_EDGE_RISING) ? IN_EDGE_FALLING : IN_EDGE_RISING; + _io->level = readLevel; /* 记录当前io电平 */ + _io->edge = (_io->edge == IN_EDGE_RISING) ? IN_EDGE_FALLING : IN_EDGE_RISING; /* 修改触发边沿 */ goto checkTicks; } default: break; } checkTicks: + /* 如果触发边沿是上升沿且达到上升沿触发时间则返回上升沿触发 */ if(IN_EDGE_RISING == _io->edge && _io->ticks >= _io->risingTicks) { - _io->state = 0; - _io->edge = IN_EDGE_NONE; + _io->state = 0; /* 状态复位 */ + _io->edge = IN_EDGE_NONE; /* 触发边沿复位 */ return IN_EDGE_RISING; - } + } /* 如果触发边沿是下降沿且达到下降沿触发时间则返回下降沿触发 */ else if(IN_EDGE_FALLING == _io->edge && _io->ticks >= _io->fallingTicks) { - _io->state = 0; - _io->edge = IN_EDGE_NONE; + _io->state = 0; /* 状态复位 */ + _io->edge = IN_EDGE_NONE; /* 触发边沿复位 */ return IN_EDGE_FALLING; } @@ -159,44 +163,50 @@ static uint8_t io_output_handle(io_t *_io) { ASSERT_PARAM(IS_VALID_POINT(_io)); - if(_io->state > 0) { _io->ticks++; } + if(_io->state > 0) { _io->ticks++; } /* 大于0说明边沿已变化需计时 */ + switch(_io->state) { - case 0: // 开始 + case 0: /* 输出开始,默认开始先输出高电平 */ + /* 若上升沿时间不为0则输出高电平 */ if(_io->risingTicks) { - _io->state = 1; + _io->state = 1; /* 切换状态 */ _io->rwFn(1); } else - { + { /* 否则查看下降沿时间不为0则输出低电平 */ if(_io->fallingTicks) { - _io->state = 2; + _io->state = 2; /* 切换状态 */ _io->rwFn(0); } } break; - case 1: // 上升沿保持 + case 1: /* 输出高电平保持 */ + /* 若计时超过上升沿时间 */ if(_io->ticks >= _io->risingTicks) { - _io->ticks = 0; + _io->ticks = 0; /* 清零计时计数值 */ + /* 查看下降沿时间不为0则输出低电平 */ if(_io->fallingTicks) { - _io->state = 2; + _io->state = 2; /* 切换状态 */ _io->rwFn(0); - } + } /* 否则认为输出一个周期结束 */ else { return OUT_CYCLE_END; } } break; - case 2: // 下降沿保持 + case 2: /* 输出低电平保持 */ + /* 若计时超过下降沿时间则认为输出一个周期结束 */ if(_io->ticks >= _io->fallingTicks) { - _io->ticks = 0; - _io->state = 0; + _io->ticks = 0; /* 清零计时计数值 */ + _io->state = 0; /* 状态复位 */ + return OUT_CYCLE_END; } break; @@ -245,17 +255,18 @@ uint8_t io_init(io_t *_io, io_rw_fn_t rwFn, io_cb_fn_t callbackFn, uint8_t dir, ASSERT_PARAM(IS_VALID_DIR(dir)); ASSERT_PARAM(IS_VALID_RUN_FLAG(run)); + /* 初始化各参数 */ _io->rwFn = rwFn; _io->dir = dir; _io->run = run; - _io->level = (_io->dir == IO_DIR_IN) ? (_io->rwFn(0)) : 0; + _io->level = (_io->dir == IO_DIR_IN) ? (_io->rwFn(0)) : 0; /* 默认电平由此时读到的电平决定 */ _io->ticks = 0; _io->risingTicks = 0; _io->fallingTicks = 0; _io->edge = IN_EDGE_NONE; _io->state = 0; _io->callbackFn = callbackFn; - + /* 初始化时就插入链表 */ return io_insert(_io); } @@ -270,6 +281,7 @@ void io_de_init(io_t *_io) { ASSERT_PARAM(IS_VALID_POINT(_io)); + /* 从链表取下并置零所有参数 */ io_pending(_io); memset(_io, 0, sizeof(io_t)); } @@ -285,15 +297,18 @@ void io_de_init(io_t *_io) */ uint8_t io_insert(io_t *_io) { - io_t *ioTarget = pIOTaskHead; + io_t *ioTarget; ASSERT_PARAM(IS_VALID_POINT(_io)); - + + ioTarget = pIOTaskHead; /* 拿到链表头节点 */ + /* 遍历查重 重复则返回错误 */ while(ioTarget) { if(ioTarget == _io) { return RET_ERR; } ioTarget = ioTarget->pNext; } + /* 否则使用头插法(后来居上)将此节点插入链表 */ _io->pNext = pIOTaskHead; pIOTaskHead = _io; @@ -311,21 +326,28 @@ uint8_t io_insert(io_t *_io) */ uint8_t io_pending(io_t *_io) { - io_t *ioTarget = pIOTaskHead; - io_t *ioLast = NULL; + io_t *ioTarget; + io_t *ioLast; ASSERT_PARAM(IS_VALID_POINT(_io)); + ioTarget = pIOTaskHead; /* 拿到链表头节点 */ + ioLast = NULL; + /* 遍历查找 */ while(ioTarget) { + /* 查找到此节点 */ if(ioTarget == _io) { + /* 是否在头节点 */ if(NULL == ioLast) { + /* 在头节点则将下一个节点作为新的头节点 */ pIOTaskHead = ioTarget->pNext; } else { + /* 不在头节点则将下一个节点链接到上一个节点 */ ioLast->pNext = ioTarget->pNext; pIOTaskHead = ioLast; } @@ -356,6 +378,7 @@ void io_update_ticks(io_t *_io, uint32_t risingTicks, uint32_t fallingTicks) { ASSERT_PARAM(IS_VALID_POINT(_io)); + /* 更新参数 */ _io->risingTicks = risingTicks; _io->fallingTicks = fallingTicks; } @@ -363,7 +386,7 @@ void io_update_ticks(io_t *_io, uint32_t risingTicks, uint32_t fallingTicks) /** * @brief IO操作轮询处理 * - * @note 此函数执行周期即是IO操作任务计数值累加周期 + * @note 此函数执行周期即是IO操作任务计数值累加周期,一般放入定时器中 * * @param None * @@ -374,13 +397,17 @@ void io_poll(void) static io_t *ioTarget; static uint8_t result; + /* 遍历链表 */ for(ioTarget = pIOTaskHead; ioTarget; ioTarget = ioTarget->pNext) { + /* 运行标志为开启运行才执行 */ if(IO_RUN_START == ioTarget->run) { + /* 根据io方向执行不同处理 */ if(IO_DIR_IN == ioTarget->dir) { result = io_input_handle(ioTarget); + /* 返回有效的输入触发边沿则执行用户回调函数 */ if(IN_EDGE_NONE != result) { ioTarget->callbackFn(result); @@ -389,6 +416,7 @@ void io_poll(void) else { result = io_output_handle(ioTarget); + /* 返回一个周期输出完成则执行用户回调函数 */ if(OUT_CYCLE_END == result) { ioTarget->callbackFn(0xFF); diff --git a/drivers/modules/input_output.h b/drivers/modules/input_output.h index 49aa355..4660525 100644 --- a/drivers/modules/input_output.h +++ b/drivers/modules/input_output.h @@ -3,7 +3,7 @@ * @file input_output.h * @author ashuai0110 * @version V2.1 - * @date 2023-09-19 + * @date 2023-12-28 * @brief IO输入输出操作 * (输入可以设置各边沿触发时间,输出可以设置各边沿保持时间) * @@ -143,13 +143,15 @@ typedef struct input_output{ uint8_t io_init(io_t *_io, io_rw_fn_t rwFn, io_cb_fn_t callbackFn, uint8_t dir, uint8_t run); void io_de_init(io_t *_io); -uint8_t io_insert(io_t *_io); -uint8_t io_pending(io_t *_io); - void io_update_ticks(io_t *_io, uint32_t risingTicks, uint32_t fallingTicks); void io_poll(void); +/* list interface */ +uint8_t io_insert(io_t *_io); +uint8_t io_pending(io_t *_io); + +/* set/get interface */ void io_set_rising_ticks(io_t *_io, uint32_t risingTicks); uint32_t io_get_rising_ticks(io_t *_io); void io_set_falling_ticks(io_t *_io, uint32_t fallingTicks); -- Gitee From ad3d19db3bde064783f55d11bfed4456b8b5ed6d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=98=BF=E8=A1=B00110?= Date: Fri, 29 Dec 2023 20:58:09 +0800 Subject: [PATCH 18/66] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E4=BB=8E=E7=BB=84?= =?UTF-8?q?=E4=BB=B6=E8=AE=A1=E6=97=B6=E8=8A=82=E6=8B=8D=E6=8E=A5=E5=8F=A3?= =?UTF-8?q?=E8=8E=B7=E5=8F=96=E6=97=B6=E5=9F=BA,=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E4=BD=BF=E7=94=A8ring=5Fbuffer=E7=BB=84=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- drivers/modules/uart_handler.c | 65 +++++++++---------- drivers/modules/uart_handler.h | 24 +++---- examples/uart_handler/MDK/use_example.uvoptx | 18 ++++- examples/uart_handler/MDK/use_example.uvprojx | 9 ++- examples/uart_handler/README.txt | 2 +- examples/uart_handler/SRC/main.c | 43 ++++++------ 6 files changed, 85 insertions(+), 76 deletions(-) diff --git a/drivers/modules/uart_handler.c b/drivers/modules/uart_handler.c index eaddd7b..6fefa95 100644 --- a/drivers/modules/uart_handler.c +++ b/drivers/modules/uart_handler.c @@ -3,9 +3,8 @@ * @file uart_handler.c * @author woshiashuai * @version V2.1 - * @date 2023-10-27 - * @brief 串口管理 - * (使用帧间隔分帧或现有的分帧方法) + * @date 2023-12-29 + * @brief 串口管理(使用帧间隔分帧或现有的分帧方法) * ****************************************************************************** * @attention @@ -16,6 +15,7 @@ * Change Logs: * Date Author Notes * 2023-10-27 ashuai0110 完成基本内容 + * 2023-12-29 ashuai0110 修改从组件计时节拍接口获取时基,修改使用ring_buffer组件 * ****************************************************************************** */ @@ -100,15 +100,17 @@ static uart_handler_t uartHandlerArr[UART_HANDLER_NUM]; /*!< 串口管理数组 * * @retval None */ -void uart_hr_init(uint8_t ch, void *txBuf, uint32_t txLen, void *rxBuf, uint32_t rxLen, uart_tx_en_fn_t txEnFn, uint32_t baud, uint16_t timeout) +void uart_hr_init(uint8_t ch, void *txBuf, uint32_t txLen, void *rxBuf, uint32_t rxLen, uart_tx_en_fn_t txEnFn, uint32_t baud, uint32_t timeout) { ASSERT_PARAM(IS_VALID_CH(ch)); ASSERT_PARAM(IS_VALID_POINT(txBuf)); ASSERT_PARAM(IS_VALID_POINT(rxBuf)); ASSERT_PARAM(IS_VALID_POINT(txEnFn)); - ring_queue_init(&uartHandlerArr[ch].txRingQueue, txBuf, txLen); - ring_queue_init(&uartHandlerArr[ch].rxRingQueue, rxBuf, rxLen); + /* 收发的环形缓冲区初始化 */ + ring_buffer_init(&uartHandlerArr[ch].txRingBuffer, txBuf, txLen); + ring_buffer_init(&uartHandlerArr[ch].rxRingBuffer, rxBuf, rxLen); + /* 初始化各参数 */ uartHandlerArr[ch].uartTxEnFn = txEnFn; uart_hr_set_frame_intv(ch, baud); uartHandlerArr[ch].recTimeout = timeout; @@ -129,17 +131,18 @@ uint8_t uart_hr_poll(uint8_t ch) ASSERT_PARAM(IS_VALID_CH(ch)); /* 帧间隔判断 */ - if(uartHandlerArr[ch].curFrameIntv && uartHandlerArr[ch].curFrameIntv++ > uartHandlerArr[ch].targetFrameIntv) + if(uartHandlerArr[ch].curFrameIntv && (module_tick_get() - uartHandlerArr[ch].curFrameIntv) > uartHandlerArr[ch].targetFrameIntv) { + /* 置零帧间隔和接收超时 */ uartHandlerArr[ch].curFrameIntv = 0; uartHandlerArr[ch].recTimeoutCnt = 0; return RET_OK; } /* 接收超时判断 */ - if(uartHandlerArr[ch].recTimeoutCnt && uartHandlerArr[ch].recTimeoutCnt++ > uartHandlerArr[ch].recTimeout) + if(uartHandlerArr[ch].recTimeoutCnt && (module_tick_get() - uartHandlerArr[ch].recTimeoutCnt) > uartHandlerArr[ch].recTimeout) { - uartHandlerArr[ch].recTimeoutCnt = 0; + uartHandlerArr[ch].recTimeoutCnt = 0; /* 置零接收超时 */ return RET_TIMEOUT; } @@ -163,11 +166,8 @@ uint32_t uart_hr_read_rx_buf(uint8_t ch, void *pBuf, uint32_t len) ASSERT_PARAM(IS_VALID_CH(ch)); ASSERT_PARAM(IS_VALID_POINT(pBuf)); - len = (len > ring_queue_can_read(&uartHandlerArr[ch].rxRingQueue)) ? ring_queue_can_read(&uartHandlerArr[ch].rxRingQueue) : len; - if(0 < len) - { - ring_queue_read(&uartHandlerArr[ch].rxRingQueue, pBuf, len); - } + /* 从环形缓冲区读出数据 */ + len = ring_buffer_read(&uartHandlerArr[ch].rxRingBuffer, pBuf, len); return len; } @@ -190,12 +190,10 @@ uint32_t uart_hr_write_rx_buf(uint8_t ch, void *pBuf, uint32_t len) ASSERT_PARAM(IS_VALID_CH(ch)); ASSERT_PARAM(IS_VALID_POINT(pBuf)); - len = (len > ring_queue_can_write(&uartHandlerArr[ch].rxRingQueue)) ? ring_queue_can_write(&uartHandlerArr[ch].rxRingQueue) : len; - if(0 < len) - { - ring_queue_write(&uartHandlerArr[ch].rxRingQueue, pBuf, len); - uartHandlerArr[ch].curFrameIntv = 1; - } + /* 向环形缓冲区写入数据 */ + len = ring_buffer_write(&uartHandlerArr[ch].rxRingBuffer, pBuf, len); + /* 若实际写入长度不为0则开启帧间隔计数 */ + if(len) { uartHandlerArr[ch].curFrameIntv = module_tick_get(); } return len; } @@ -218,15 +216,13 @@ uint32_t uart_hr_read_tx_buf(uint8_t ch, void *pBuf, uint32_t len) ASSERT_PARAM(IS_VALID_CH(ch)); ASSERT_PARAM(IS_VALID_POINT(pBuf)); - len = (len > ring_queue_can_read(&uartHandlerArr[ch].txRingQueue)) ? ring_queue_can_read(&uartHandlerArr[ch].txRingQueue) : len; - if(0 < len) - { - ring_queue_read(&uartHandlerArr[ch].txRingQueue, pBuf, len); - } - else + /* 从环形缓冲区读出数据 */ + len = ring_buffer_read(&uartHandlerArr[ch].txRingBuffer, pBuf, len);; + /* 若实际读出长度为0则关闭发送并开启接收超时计数 */ + if(0 == len) { uartHandlerArr[ch].uartTxEnFn(0); - uartHandlerArr[ch].recTimeoutCnt = 1; + uartHandlerArr[ch].recTimeoutCnt = module_tick_get(); } return len; @@ -248,12 +244,10 @@ uint32_t uart_hr_write_tx_buf(uint8_t ch, void *pBuf, uint32_t len) ASSERT_PARAM(IS_VALID_CH(ch)); ASSERT_PARAM(IS_VALID_POINT(pBuf)); - len = (len > ring_queue_can_write(&uartHandlerArr[ch].txRingQueue)) ? ring_queue_can_write(&uartHandlerArr[ch].txRingQueue) : len; - if(0 < len) - { - ring_queue_write(&uartHandlerArr[ch].txRingQueue, pBuf, len); - uartHandlerArr[ch].uartTxEnFn(1); - } + /* 向环形缓冲区写入数据 */ + len = ring_buffer_write(&uartHandlerArr[ch].txRingBuffer, pBuf, len); + /* 若实际写入长度不为0则开启发送 */ + if(len) { uartHandlerArr[ch].uartTxEnFn(1); } return len; } @@ -269,14 +263,15 @@ uint32_t uart_hr_write_tx_buf(uint8_t ch, void *pBuf, uint32_t len) */ void uart_hr_set_frame_intv(uint8_t ch, uint32_t baud) { + /* 波特率>9600则默认取3ms */ if(9600 < baud) { uartHandlerArr[ch].targetFrameIntv = 3; - } + } /* 波特率=9600则取0ms */ else if(0 == baud) { uartHandlerArr[ch].targetFrameIntv = 0; - } + } /* 波特率<=9600则取该波特率下传输3.5个字节的时间 */ else { uartHandlerArr[ch].targetFrameIntv = 10000 / baud * 3.5; diff --git a/drivers/modules/uart_handler.h b/drivers/modules/uart_handler.h index 966398e..15be47e 100644 --- a/drivers/modules/uart_handler.h +++ b/drivers/modules/uart_handler.h @@ -3,9 +3,8 @@ * @file uart_handler.h * @author woshiashuai * @version V2.1 - * @date 2023-10-27 - * @brief 串口管理 - * (使用帧间隔分帧或现有的分帧方法) + * @date 2023-12-29 + * @brief 串口管理(使用帧间隔分帧或现有的分帧方法) * ****************************************************************************** * @attention @@ -25,7 +24,7 @@ extern "C" { /* 包含头文件-----------------------------------------------------------------*/ #include "common_include.h" -#include "ring_queue.h" +#include "ring_buffer.h" /** * @addtogroup modules @@ -70,13 +69,13 @@ typedef void (* uart_tx_en_fn_t)(uint8_t enState); * @brief 串口管理 structure definition */ typedef struct uart_handler { - uint16_t targetFrameIntv; /*!< 目标帧间隔 */ - volatile uint16_t curFrameIntv; /*!< 当前帧间隔 */ - volatile uint16_t recTimeoutCnt; /*!< 接收超时计数 */ - uint16_t recTimeout; /*!< 接收超时时间 */ - ring_queue_t txRingQueue; /*!< 发送环形队列 */ - ring_queue_t rxRingQueue; /*!< 接收环形队列 */ - uart_tx_en_fn_t uartTxEnFn; /*!< 串口发送前准备函数 */ + uint8_t targetFrameIntv; /*!< 目标帧间隔 */ + uint32_t curFrameIntv; /*!< 当前帧间隔 */ + uint32_t recTimeoutCnt; /*!< 接收超时计数 */ + uint32_t recTimeout; /*!< 接收超时时间 */ + ring_buffer_t txRingBuffer; /*!< 发送环形队列 */ + ring_buffer_t rxRingBuffer; /*!< 接收环形队列 */ + uart_tx_en_fn_t uartTxEnFn; /*!< 串口发送前准备函数 */ } uart_handler_t; /** @@ -91,7 +90,7 @@ typedef struct uart_handler { * @{ */ -void uart_hr_init(uint8_t ch, void *txBuf, uint32_t txLen, void *rxBuf, uint32_t rxLen, uart_tx_en_fn_t txEnFn, uint32_t baud, uint16_t timeout); +void uart_hr_init(uint8_t ch, void *txBuf, uint32_t txLen, void *rxBuf, uint32_t rxLen, uart_tx_en_fn_t txEnFn, uint32_t baud, uint32_t timeout); uint8_t uart_hr_poll(uint8_t ch); @@ -101,6 +100,7 @@ uint32_t uart_hr_write_rx_buf(uint8_t ch, void *pBuf, uint32_t len); uint32_t uart_hr_read_tx_buf(uint8_t ch, void *pBuf, uint32_t len); uint32_t uart_hr_write_tx_buf(uint8_t ch, void *pBuf, uint32_t len); +/* set/get interface */ void uart_hr_set_frame_intv(uint8_t ch, uint32_t baud); uint16_t uart_hr_get_frame_intv(uint8_t ch); void uart_hr_set_rec_timeout(uint8_t ch, uint16_t timeout); diff --git a/examples/uart_handler/MDK/use_example.uvoptx b/examples/uart_handler/MDK/use_example.uvoptx index 6a61e91..deda777 100644 --- a/examples/uart_handler/MDK/use_example.uvoptx +++ b/examples/uart_handler/MDK/use_example.uvoptx @@ -622,8 +622,20 @@ 0 0 0 - ..\..\..\drivers\modules\ring_queue.c - ring_queue.c + ..\..\..\drivers\modules\ring_buffer.c + ring_buffer.c + 0 + 0 + + + 5 + 35 + 1 + 0 + 0 + 0 + ..\..\..\drivers\common\common_include.c + common_include.c 0 0 @@ -637,7 +649,7 @@ 0 6 - 35 + 36 5 0 0 diff --git a/examples/uart_handler/MDK/use_example.uvprojx b/examples/uart_handler/MDK/use_example.uvprojx index c4249e3..2aec182 100644 --- a/examples/uart_handler/MDK/use_example.uvprojx +++ b/examples/uart_handler/MDK/use_example.uvprojx @@ -569,9 +569,14 @@ ..\..\..\drivers\modules\uart_handler.c - ring_queue.c + ring_buffer.c 1 - ..\..\..\drivers\modules\ring_queue.c + ..\..\..\drivers\modules\ring_buffer.c + + + common_include.c + 1 + ..\..\..\drivers\common\common_include.c diff --git a/examples/uart_handler/README.txt b/examples/uart_handler/README.txt index 45c22f0..60b6c40 100644 --- a/examples/uart_handler/README.txt +++ b/examples/uart_handler/README.txt @@ -2,7 +2,7 @@ 用例使用说明 ================================================================================ Date Author MDK MCU -2023-10-21 ashuai0110 5.35 STM32F1 +2023-12-29 ashuai0110 5.35 STM32F1 ================================================================================ 功能描述 diff --git a/examples/uart_handler/SRC/main.c b/examples/uart_handler/SRC/main.c index e32d9d7..06917eb 100644 --- a/examples/uart_handler/SRC/main.c +++ b/examples/uart_handler/SRC/main.c @@ -3,7 +3,7 @@ * @file main.c * @author ashuai0110 * @version V1.0 - * @date 2023-10-21 + * @date 2023-12-29 * @brief 使用举例-串口管理 * ****************************************************************************** @@ -44,25 +44,10 @@ static uint8_t rxBuf[128]; /* 串口管理所需接收缓冲区 */ */ void TIM1_UP_IRQHandler(void) { - static uint8_t ret; - static uint8_t rxBufTmp[100]; - if(TIM_GetITStatus(TIM1, TIM_IT_Update) != RESET) { - /* 串口管理轮询处理 */ - ret = uart_hr_poll(USART1_UART_HR_CH); - /* 接收完成 */ - if(RET_OK == ret) - { - /* 串口管理读取数据 */ - uint16_t dataLen = uart_hr_read_rx_buf(USART1_UART_HR_CH, rxBufTmp, sizeof(rxBufTmp)); - rxBufTmp[dataLen] = '\0'; - DEBUG_LOG("uart rec:%s", rxBufTmp); - } /* 接收超时 无需求可忽略此返回值 */ - else if(RET_TIMEOUT == ret) - { - WARN_LOG("uart rec timeout"); - } + /* 组件计时节拍接口 */ + module_tick_inc(1); TIM_ClearITPendingBit(TIM1, TIM_FLAG_Update); } @@ -137,14 +122,26 @@ int main(int argc, char *argv[]) /* 串口管理初始化 */ uart_hr_init(USART1_UART_HR_CH, txBuf, sizeof(txBuf), rxBuf, sizeof(rxBuf), uart_tx_en, 115200, 2000); - - uint8_t mes[] = "uart handler"; - /* 串口管理发送数据 */ - uart_hr_write_tx_buf(USART1_UART_HR_CH, mes, sizeof(mes)); while(1) { - + static uint8_t ret; + static uint8_t rxBufTmp[100]; + /* 串口管理轮询处理 */ + ret = uart_hr_poll(USART1_UART_HR_CH); + /* 接收完成 */ + if(RET_OK == ret) + { + /* 串口管理读取数据 */ + uint16_t dataLen = uart_hr_read_rx_buf(USART1_UART_HR_CH, rxBufTmp, sizeof(rxBufTmp)); + /* 串口管理发送数据 */ + uart_hr_write_tx_buf(USART1_UART_HR_CH, rxBufTmp, dataLen); + DEBUG_LOG("uart rec complate"); + } /* 接收超时 无需求可忽略此返回值 */ + else if(RET_TIMEOUT == ret) + { + WARN_LOG("uart rec timeout"); + } } } -- Gitee From cc254e0fa1527c9920b06568e7946ec67e64b25e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=98=BF=E8=A1=B00110?= Date: Fri, 29 Dec 2023 20:59:11 +0800 Subject: [PATCH 19/66] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E4=BB=8E=E7=BB=84?= =?UTF-8?q?=E4=BB=B6=E8=AE=A1=E6=97=B6=E8=8A=82=E6=8B=8D=E6=8E=A5=E5=8F=A3?= =?UTF-8?q?=E8=8E=B7=E5=8F=96=E6=97=B6=E5=9F=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- drivers/modules/timer_software.c | 19 +++++++++---------- drivers/modules/timer_software.h | 17 +++++++++-------- .../timer_software/MDK/use_example.uvoptx | 14 +++++++++++++- .../timer_software/MDK/use_example.uvprojx | 5 +++++ examples/timer_software/README.txt | 2 +- examples/timer_software/SRC/main.c | 11 ++++++----- 6 files changed, 43 insertions(+), 25 deletions(-) diff --git a/drivers/modules/timer_software.c b/drivers/modules/timer_software.c index 8bf1686..b518450 100644 --- a/drivers/modules/timer_software.c +++ b/drivers/modules/timer_software.c @@ -3,7 +3,7 @@ * @file timer_software.c * @author ashuai0110 * @version V2.1 - * @date 2023-12-27 + * @date 2023-12-29 * @brief 软件定时器 * ****************************************************************************** @@ -15,7 +15,7 @@ * Change Logs: * Date Author Notes * 2023-09-26 ashuai0110 完成基本内容 - * 2023-12-27 ashuai0110 增加详细的代码注释 + * 2023-12-29 ashuai0110 修改从组件计时节拍接口获取时基 * ****************************************************************************** */ @@ -222,17 +222,16 @@ void timer_s_poll(void) /* 运行标志为开启运行才执行 */ if(TIMER_RUN_START == tsTarget->runFlg) { - if(tsTarget->curTicks < tsTarget->targetTicks) + if((module_tick_get() - tsTarget->curTicks) > tsTarget->targetTicks) { - /* 当前计数值未达到目标计数值则继续增加 */ - tsTarget->curTicks++; - } - else - { - /* 当前计数值达到目标计数值则执行回调函数并清零当前计数值 */ + /* 当前计数值达到目标计数值则执行回调函数并记录最新组件计时节拍 */ tsTarget->callbackFn(); - tsTarget->curTicks = 0; + tsTarget->curTicks = module_tick_get(); } + } /* 不开启运行则一直记录最新的组件计时节拍 */ + else + { + tsTarget->curTicks = module_tick_get(); } } } diff --git a/drivers/modules/timer_software.h b/drivers/modules/timer_software.h index de6248e..1a783fc 100644 --- a/drivers/modules/timer_software.h +++ b/drivers/modules/timer_software.h @@ -3,7 +3,7 @@ * @file timer_software.h * @author ashuai0110 * @version V2.1 - * @date 2023-12-27 + * @date 2023-12-29 * @brief 软件定时器 * ****************************************************************************** @@ -65,11 +65,11 @@ extern "C" { * @brief 软件定时器任务 structrue definition */ typedef struct timer_s { - volatile uint32_t curTicks; /*!< 当前计数值 */ - uint32_t targetTicks; /*!< 目标计数值 */ - uint8_t runFlg; /*!< 运行标志 @ref timer_run_flg */ - void(* callbackFn)(void); /*!< 回调函数 */ - struct timer_s *pNext; /*!< 下一节点 */ + uint32_t curTicks; /*!< 当前计数值 */ + uint32_t targetTicks; /*!< 目标计数值 */ + uint8_t runFlg; /*!< 运行标志 @ref timer_run_flg */ + void(* callbackFn)(void); /*!< 回调函数 */ + struct timer_s *pNext; /*!< 下一节点 */ } timer_s_t; /** @@ -87,11 +87,12 @@ typedef struct timer_s { uint8_t timer_s_init(timer_s_t *_ts, uint32_t targetTicks, void (* callbackFn)(void), uint8_t runFlg); void timer_s_de_init(timer_s_t *_ts); +void timer_s_poll(void); + +/* list interface */ uint8_t timer_s_insert(timer_s_t *_ts); uint8_t timer_s_pending(timer_s_t *_ts); -void timer_s_poll(void); - /* set/get interface */ void timer_s_set_cur_ticks(timer_s_t *_ts, uint32_t curTicks); uint32_t timer_s_get_cur_ticks(timer_s_t *_ts); diff --git a/examples/timer_software/MDK/use_example.uvoptx b/examples/timer_software/MDK/use_example.uvoptx index 1bf747b..efbd5da 100644 --- a/examples/timer_software/MDK/use_example.uvoptx +++ b/examples/timer_software/MDK/use_example.uvoptx @@ -615,6 +615,18 @@ 0 0 + + 5 + 34 + 1 + 0 + 0 + 0 + ..\..\..\drivers\common\common_include.c + common_include.c + 0 + 0 + @@ -625,7 +637,7 @@ 0 6 - 34 + 35 5 0 0 diff --git a/examples/timer_software/MDK/use_example.uvprojx b/examples/timer_software/MDK/use_example.uvprojx index eab5550..4016cf6 100644 --- a/examples/timer_software/MDK/use_example.uvprojx +++ b/examples/timer_software/MDK/use_example.uvprojx @@ -568,6 +568,11 @@ 1 ..\..\..\drivers\modules\timer_software.c + + common_include.c + 1 + ..\..\..\drivers\common\common_include.c + diff --git a/examples/timer_software/README.txt b/examples/timer_software/README.txt index 44d9b0e..4009c1f 100644 --- a/examples/timer_software/README.txt +++ b/examples/timer_software/README.txt @@ -2,7 +2,7 @@ 用例使用说明 ================================================================================ Date Author MDK MCU -2023-09-26 ashuai0110 5.35 STM32F1 +2023-12-29 ashuai0110 5.35 STM32F1 ================================================================================ 功能描述 diff --git a/examples/timer_software/SRC/main.c b/examples/timer_software/SRC/main.c index d52edff..4c7c528 100644 --- a/examples/timer_software/SRC/main.c +++ b/examples/timer_software/SRC/main.c @@ -3,7 +3,7 @@ * @file main.c * @author ashuai0110 * @version V1.0 - * @date 2023-09-26 + * @date 2023-12-29 * @brief 使用举例-软件定时器 * ****************************************************************************** @@ -23,7 +23,7 @@ #include "timer_software.h" /* 私有宏定义-----------------------------------------------------------------*/ -#define TIMER_S_PERIOD (1u) /* 软件定时器调度周期1ms */ +#define TIMER_S_PERIOD (1u) /* 软件定时器调度周期(定时器1ms) */ /* 私有类型定义---------------------------------------------------------------*/ @@ -46,8 +46,8 @@ void TIM1_UP_IRQHandler(void) { if(TIM_GetITStatus(TIM1, TIM_IT_Update) != RESET) { - /* 软件定时器轮询处理 */ - timer_s_poll(); + /* 组件计时节拍接口 */ + module_tick_inc(TIMER_S_PERIOD); TIM_ClearITPendingBit(TIM1, TIM_FLAG_Update); } @@ -104,7 +104,8 @@ int main(int argc, char *argv[]) while(1) { - + /* 软件定时器轮询处理 */ + timer_s_poll(); } } -- Gitee From 5ae21c04606ead06667a15f2ac45f07c41b923a1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=98=BF=E8=A1=B00110?= Date: Fri, 29 Dec 2023 20:59:25 +0800 Subject: [PATCH 20/66] =?UTF-8?q?=E6=9B=B4=E6=96=B0readme?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index dc49d6d..eea69ba 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ all_include.h: 所有组件头文件集合 -common_include.h: 通用头文件(所有组件都需包含此文件) +common_include.c.h: 公共引用文件(所有组件都需包含此文件) ### drivers/modbus -- Gitee From de57551d6163722fbc8877c0ac60287a4ec28db2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=98=BF=E8=A1=B00110?= Date: Fri, 29 Dec 2023 20:59:52 +0800 Subject: [PATCH 21/66] =?UTF-8?q?=E6=96=B0=E5=A2=9Esum,xor,crc=E6=A0=A1?= =?UTF-8?q?=E9=AA=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- drivers/modules/data_check.c | 844 +++++++++++++++++++++++++++++++---- drivers/modules/data_check.h | 26 +- 2 files changed, 784 insertions(+), 86 deletions(-) diff --git a/drivers/modules/data_check.c b/drivers/modules/data_check.c index 5548e4d..0e813f9 100644 --- a/drivers/modules/data_check.c +++ b/drivers/modules/data_check.c @@ -3,7 +3,7 @@ * @file data_check.c * @author ashuai0110 * @version V2.1 - * @date 2023-10-17 + * @date 2023-12-29 * @brief 数据校验方法集合 * ****************************************************************************** @@ -15,6 +15,7 @@ * Change Logs: * Date Author Notes * 2023-10-17 ashuai0110 完成基本内容 + * 2023-12-29 ashuai0110 新增sum,xor,crc校验 * ****************************************************************************** */ @@ -37,73 +38,6 @@ /* 私有类型定义---------------------------------------------------------------*/ /* 私有变量-------------------------------------------------------------------*/ -/** - * @defgroup data_check_local_variables data check local variables - * @{ - */ - -// CRC 高位字节值表 -static const uint8_t crcHiArr[] = { - 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, - 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, - 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, - 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, - 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, - 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, - 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, - 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, - 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, - 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, - 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, - 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, - 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, - 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, - 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, - 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, - 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, - 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, - 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, - 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, - 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, - 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, - 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, - 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, - 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, - 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40 -}; -// CRC 低位字节值表 -const uint8_t crcLoArr[] = { - 0x00, 0xC0, 0xC1, 0x01, 0xC3, 0x03, 0x02, 0xC2, 0xC6, 0x06, - 0x07, 0xC7, 0x05, 0xC5, 0xC4, 0x04, 0xCC, 0x0C, 0x0D, 0xCD, - 0x0F, 0xCF, 0xCE, 0x0E, 0x0A, 0xCA, 0xCB, 0x0B, 0xC9, 0x09, - 0x08, 0xC8, 0xD8, 0x18, 0x19, 0xD9, 0x1B, 0xDB, 0xDA, 0x1A, - 0x1E, 0xDE, 0xDF, 0x1F, 0xDD, 0x1D, 0x1C, 0xDC, 0x14, 0xD4, - 0xD5, 0x15, 0xD7, 0x17, 0x16, 0xD6, 0xD2, 0x12, 0x13, 0xD3, - 0x11, 0xD1, 0xD0, 0x10, 0xF0, 0x30, 0x31, 0xF1, 0x33, 0xF3, - 0xF2, 0x32, 0x36, 0xF6, 0xF7, 0x37, 0xF5, 0x35, 0x34, 0xF4, - 0x3C, 0xFC, 0xFD, 0x3D, 0xFF, 0x3F, 0x3E, 0xFE, 0xFA, 0x3A, - 0x3B, 0xFB, 0x39, 0xF9, 0xF8, 0x38, 0x28, 0xE8, 0xE9, 0x29, - 0xEB, 0x2B, 0x2A, 0xEA, 0xEE, 0x2E, 0x2F, 0xEF, 0x2D, 0xED, - 0xEC, 0x2C, 0xE4, 0x24, 0x25, 0xE5, 0x27, 0xE7, 0xE6, 0x26, - 0x22, 0xE2, 0xE3, 0x23, 0xE1, 0x21, 0x20, 0xE0, 0xA0, 0x60, - 0x61, 0xA1, 0x63, 0xA3, 0xA2, 0x62, 0x66, 0xA6, 0xA7, 0x67, - 0xA5, 0x65, 0x64, 0xA4, 0x6C, 0xAC, 0xAD, 0x6D, 0xAF, 0x6F, - 0x6E, 0xAE, 0xAA, 0x6A, 0x6B, 0xAB, 0x69, 0xA9, 0xA8, 0x68, - 0x78, 0xB8, 0xB9, 0x79, 0xBB, 0x7B, 0x7A, 0xBA, 0xBE, 0x7E, - 0x7F, 0xBF, 0x7D, 0xBD, 0xBC, 0x7C, 0xB4, 0x74, 0x75, 0xB5, - 0x77, 0xB7, 0xB6, 0x76, 0x72, 0xB2, 0xB3, 0x73, 0xB1, 0x71, - 0x70, 0xB0, 0x50, 0x90, 0x91, 0x51, 0x93, 0x53, 0x52, 0x92, - 0x96, 0x56, 0x57, 0x97, 0x55, 0x95, 0x94, 0x54, 0x9C, 0x5C, - 0x5D, 0x9D, 0x5F, 0x9F, 0x9E, 0x5E, 0x5A, 0x9A, 0x9B, 0x5B, - 0x99, 0x59, 0x58, 0x98, 0x88, 0x48, 0x49, 0x89, 0x4B, 0x8B, - 0x8A, 0x4A, 0x4E, 0x8E, 0x8F, 0x4F, 0x8D, 0x4D, 0x4C, 0x8C, - 0x44, 0x84, 0x85, 0x45, 0x87, 0x47, 0x46, 0x86, 0x82, 0x42, - 0x43, 0x83, 0x41, 0x81, 0x80, 0x40 -}; - -/** - * @} - */ /* 全局变量-------------------------------------------------------------------*/ @@ -114,53 +48,795 @@ const uint8_t crcLoArr[] = { */ /** - * @brief CRC16校验(MODBUS) + * @brief 累加和校验 * - * @param pBuf : 校验数据 + * @param data : 校验数据 * * @param len : 校验数据长度 * * @retval 校验结果 */ -uint16_t check_crc16_modbus(uint8_t *pBuf, uint16_t len) +uint8_t check_sum(uint8_t *data, uint16_t len) { - uint8_t crcHi = 0xFF; /* 高CRC字节初始化 */ - uint8_t crcLo = 0xFF; /* 低CRC 字节初始化 */ - uint16_t index; /* CRC循环中的索引 */ + uint8_t sum = 0; while(len--) { - index = crcHi ^ *pBuf++; /* 计算CRC */ - crcHi = crcLo ^ crcHiArr[index]; - crcLo = crcLoArr[index]; + sum += *data; + data++; } - - return ((uint16_t)crcHi << 8 | crcLo); + + return sum; +} + +/** + * @brief 异或和校验 + * + * @param data : 校验数据 + * + * @param len : 校验数据长度 + * + * @retval 校验结果 + */ +uint8_t check_xor(uint8_t *data, uint16_t len) +{ + uint8_t xor = 0; + + while(len--) + { + xor ^= *data; + data++; + } + + return xor; } /** * @brief LRC校验 * - * @param pBuf : 校验数据 + * @param data : 校验数据 * * @param len : 校验数据长度 * * @retval 校验结果 */ -uint8_t check_lrc(uint8_t *pBuf, uint16_t len) +uint8_t check_lrc(uint8_t *data, uint16_t len) { uint8_t lrc = 0; - for(uint16_t index = 0; index < len; index++) + while(len--) { - lrc += pBuf[index]; + lrc += *data; + data++; } - lrc = (~lrc) + 1; return lrc; } +/** + * @brief CRC4-ITU校验 + * + * @param data : 校验数据 + * + * @param len : 校验数据长度 + * + * @retval 校验结果 + */ +uint8_t check_crc4_itu(uint8_t *data, uint16_t len) +{ + uint8_t cnt = 0; + uint8_t crc = 0; + + while(len--) + { + crc ^= *data; + data++; + for(; cnt < 8; ++cnt) + { + if(crc & 0x01) + { + crc = (crc >> 1) ^ 0x0C; + } + else + { + crc >>= 1; + } + } + } + + return crc; +} + +/** + * @brief CRC5-EPC校验 + * + * @param data : 校验数据 + * + * @param len : 校验数据长度 + * + * @retval 校验结果 + */ +uint8_t check_crc5_epc(uint8_t *data, uint16_t len) +{ + uint8_t cnt = 0; + uint8_t crc = 0x48; + + while(len--) + { + crc ^= *data; + data++; + for(; cnt < 8; cnt++) + { + if(crc & 0x80) + { + crc = (crc << 1) ^ 0x48; + } + else + { + crc <<= 1; + } + } + } + crc >>= 3; + + return crc; +} + +/** + * @brief CRC5-ITU校验 + * + * @param data : 校验数据 + * + * @param len : 校验数据长度 + * + * @retval 校验结果 + */ +uint8_t check_crc5_itu(uint8_t *data, uint16_t len) +{ + uint8_t cnt = 0; + uint8_t crc = 0; + + while(len--) + { + crc ^= *data; + data++; + for(; cnt < 8; ++cnt) + { + if(crc & 0x01) + { + crc = (crc >> 1) ^ 0x15; + } + else + { + crc >>= 1; + } + } + } + + return crc; +} + +/** + * @brief CRC5-USB校验 + * + * @param data : 校验数据 + * + * @param len : 校验数据长度 + * + * @retval 校验结果 + */ +uint8_t check_crc5_usb(uint8_t *data, uint16_t len) +{ + uint8_t cnt = 0; + uint8_t crc = 0x1F; + + while(len--) + { + crc ^= *data; + data++; + for(; cnt < 8; ++cnt) + { + if(crc & 0x01) + { + crc = (crc >> 1) ^ 0x14; + } + else + { + crc >>= 1; + } + } + } + crc ^= 0x1F; + + return crc; +} + +/** + * @brief CRC6-ITU校验 + * + * @param data : 校验数据 + * + * @param len : 校验数据长度 + * + * @retval 校验结果 + */ +uint8_t check_crc6_itu(uint8_t *data, uint16_t len) +{ + uint8_t cnt = 0; + uint8_t crc = 0; + + while(len--) + { + crc ^= *data; + data++; + for(; cnt < 8; ++cnt) + { + if(crc & 0x01) + { + crc = (crc >> 1) ^ 0x30; + } + else + { + crc >>= 1; + } + } + } + + return crc; +} + +/** + * @brief CRC7-MMC校验 + * + * @param data : 校验数据 + * + * @param len : 校验数据长度 + * + * @retval 校验结果 + */ +uint8_t check_crc7_mmc(uint8_t *data, uint16_t len) +{ + uint8_t cnt = 0; + uint8_t crc = 0; + + while(len--) + { + crc ^= *data; + data++; + for(; cnt < 8; cnt++) + { + if(crc & 0x80) + { + crc = (crc << 1) ^ 0x12; + } + else + { + crc <<= 1; + } + } + } + crc >>= 1; + + return crc; +} + +/** + * @brief CRC8校验 + * + * @param data : 校验数据 + * + * @param len : 校验数据长度 + * + * @retval 校验结果 + */ +uint8_t check_crc8(uint8_t *data, uint16_t len) +{ + uint8_t cnt = 0; + uint8_t crc = 0; + + while(len--) + { + crc ^= *data; + data++; + for(; cnt < 8; cnt++) + { + if(crc & 0x80) + { + crc = (crc << 1) ^ 0x07; + } + else + { + crc <<= 1; + } + } + } + + return crc; +} + +/** + * @brief CRC8-ITU校验 + * + * @param data : 校验数据 + * + * @param len : 校验数据长度 + * + * @retval 校验结果 + */ +uint8_t check_crc8_itu(uint8_t *data, uint16_t len) +{ + uint8_t cnt = 0; + uint8_t crc = 0; + + while(len--) + { + crc ^= *data; + data++; + for(; cnt < 8; cnt++) + { + if(crc & 0x80) + { + crc = (crc << 1) ^ 0x07; + } + else + { + crc <<= 1; + } + } + } + crc ^= 0x55; + + return crc; +} + +/** + * @brief CRC8-ROHC校验 + * + * @param data : 校验数据 + * + * @param len : 校验数据长度 + * + * @retval 校验结果 + */ +uint8_t check_crc8_rohc(uint8_t *data, uint16_t len) +{ + uint8_t cnt = 0; + uint8_t crc = 0xFF; + + while(len--) + { + crc ^= *data; + data++; + for(; cnt < 8; ++cnt) + { + if(crc & 0x01) + { + crc = (crc >> 1) ^ 0xE0; + } + else + { + crc >>= 1; + } + } + } + + return crc; +} + +/** + * @brief CRC8-MAXIM校验 + * + * @param data : 校验数据 + * + * @param len : 校验数据长度 + * + * @retval 校验结果 + */ +uint8_t check_crc8_maxim(uint8_t *data, uint16_t len) +{ + uint8_t cnt = 0; + uint8_t crc = 0; + + while(len--) + { + crc ^= *data; + data++; + for(; cnt < 8; cnt++) + { + if(crc & 0x01) + { + crc = (crc >> 1) ^ 0x8C; + } + else + { + crc >>= 1; + } + } + } + + return crc; +} + +/** + * @brief CRC16-IBM校验 + * + * @param data : 校验数据 + * + * @param len : 校验数据长度 + * + * @retval 校验结果 + */ +uint16_t check_crc16_ibm(uint8_t *data, uint16_t len) +{ + uint8_t cnt = 0; + uint16_t crc = 0; + + while(len--) + { + crc ^= *data; + data++; + for(; cnt < 8; ++cnt) + { + if(crc & 0x01) + { + crc = (crc >> 1) ^ 0xA001; + } + else + { + crc >>= 1; + } + } + } + + return crc; +} + +/** + * @brief CRC16-MAXIM校验 + * + * @param data : 校验数据 + * + * @param len : 校验数据长度 + * + * @retval 校验结果 + */ +uint16_t check_crc16_maxim(uint8_t *data, uint16_t len) +{ + uint8_t cnt = 0; + uint16_t crc = 0; + + while(len--) + { + crc ^= *data; + data++; + for(; cnt < 8; ++cnt) + { + if(crc & 0x01) + { + crc = (crc >> 1) ^ 0xA001; + } + else + { + crc >>= 1; + } + } + } + crc = ~crc; + + return crc; +} + +/** + * @brief CRC16-USB校验 + * + * @param data : 校验数据 + * + * @param len : 校验数据长度 + * + * @retval 校验结果 + */ +uint16_t check_crc16_usb(uint8_t *data, uint16_t len) +{ + uint8_t cnt = 0; + uint16_t crc = 0xFFFF; + + while(len--) + { + crc ^= *data; + data++; + for(; cnt < 8; ++cnt) + { + if(crc & 0x01) + { + crc = (crc >> 1) ^ 0xA001; + } + else + { + crc >>= 1; + } + } + } + crc = ~crc; + + return crc; +} + +/** + * @brief CRC16-MODBUS校验 + * + * @param data : 校验数据 + * + * @param len : 校验数据长度 + * + * @retval 校验结果 + */ +uint16_t check_crc16_modbus(uint8_t *data, uint16_t len) +{ + uint8_t cnt = 0; + uint16_t crc = 0xFFFF; + + while(len--) + { + crc ^= *data; + data++; + for(; cnt < 8; ++cnt) + { + if(crc & 0x01) + { + crc = (crc >> 1) ^ 0xA001; + } + else + { + crc >>= 1; + } + } + } + + return crc; +} + +/** + * @brief CRC16-CCITT校验 + * + * @param data : 校验数据 + * + * @param len : 校验数据长度 + * + * @retval 校验结果 + */ +uint16_t check_crc16_ccitt(uint8_t *data, uint16_t len) +{ + uint8_t cnt = 0; + uint16_t crc = 0; + + while(len--) + { + crc ^= *data; + data++; + for(; cnt < 8; ++cnt) + { + if(crc & 0x01) + { + crc = (crc >> 1) ^ 0x8408; + } + else + { + crc >>= 1; + } + } + } + + return crc; +} + +/** + * @brief CRC16-CCITT-FALSE校验 + * + * @param data : 校验数据 + * + * @param len : 校验数据长度 + * + * @retval 校验结果 + */ +uint16_t check_crc16_ccitt_false(uint8_t *data, uint16_t len) +{ + uint8_t cnt = 0; + uint16_t crc = 0xFFFF; + + while(len--) + { + crc ^= (uint16_t)(*data) << 8; + data++; + for(; cnt < 8; ++cnt) + { + if(crc & 0x8000) + { + crc = (crc << 1) ^ 0x1021; + } + else + { + crc <<= 1; + } + } + } + + return crc; +} + +/** + * @brief CRC16-X25校验 + * + * @param data : 校验数据 + * + * @param len : 校验数据长度 + * + * @retval 校验结果 + */ +uint16_t check_crc16_x25(uint8_t *data, uint16_t len) +{ + uint8_t cnt = 0; + uint16_t crc = 0xFFFF; + + while(len--) + { + crc ^= *data; + data++; + for(; cnt < 8; ++cnt) + { + if (crc & 0x01) + { + crc = (crc >> 1) ^ 0x8408; + } + else + { + crc >>= 1; + } + } + } + crc = ~crc; + + return crc; +} + +/** + * @brief CRC16-XMODEM校验 + * + * @param data : 校验数据 + * + * @param len : 校验数据长度 + * + * @retval 校验结果 + */ +uint16_t check_crc16_xmodem(uint8_t *data, uint16_t len) +{ + uint8_t cnt = 0; + uint16_t crc = 0; + + while(len--) + { + crc ^= (uint16_t)(*data) << 8; + data++; + for(; cnt < 8; ++cnt) + { + if(crc & 0x8000) + { + crc = (crc << 1) ^ 0x1021; + } + else + { + crc <<= 1; + } + } + } + + return crc; +} + +/** + * @brief CRC16-DNP校验 + * + * @param data : 校验数据 + * + * @param len : 校验数据长度 + * + * @retval 校验结果 + */ +uint16_t check_crc16_dnp(uint8_t *data, uint16_t len) +{ + uint8_t cnt = 0; + uint16_t crc = 0; + + while(len--) + { + crc ^= *data; + data++; + for(; cnt < 8; ++cnt) + { + if(crc & 0x01) + { + crc = (crc >> 1) ^ 0xA6BC; + } + else + { + crc >>= 1; + } + } + } + crc = ~crc; + + return crc; +} + +/** + * @brief CRC32校验 + * + * @param data : 校验数据 + * + * @param len : 校验数据长度 + * + * @retval 校验结果 + */ +uint32_t check_crc32(uint8_t *data, uint16_t len) +{ + uint8_t cnt = 0; + uint32_t crc = 0xFFFFFFFF; + + while(len--) + { + crc ^= *data++; + data++; + for(; cnt < 8; ++cnt) + { + if(crc & 0x01) + { + crc = (crc >> 1) ^ 0xEDB88320; + } + else + { + crc >>= 1; + } + } + } + crc = ~crc; + + return crc; +} + +/** + * @brief CRC32-MPEG-2校验 + * + * @param data : 校验数据 + * + * @param len : 校验数据长度 + * + * @retval 校验结果 + */ +uint32_t check_crc32_mpeg_2(uint8_t *data, uint16_t len) +{ + uint8_t cnt = 0; + uint32_t crc = 0xFFFFFFFF; + + while(len--) + { + crc ^= (uint32_t)(*data) << 24; + data++; + for(; cnt < 8; ++cnt) + { + if(crc & 0x80000000) + { + crc = (crc << 1) ^ 0x04C11DB7; + } + else + { + crc <<= 1; + } + } + } + + return crc; +} + /** * @} */ diff --git a/drivers/modules/data_check.h b/drivers/modules/data_check.h index f437b82..4f339fb 100644 --- a/drivers/modules/data_check.h +++ b/drivers/modules/data_check.h @@ -3,7 +3,7 @@ * @file data_check.h * @author ashuai0110 * @version V2.1 - * @date 2023-10-17 + * @date 2023-12-29 * @brief 数据校验方法集合 * ****************************************************************************** @@ -47,8 +47,30 @@ extern "C" { * @{ */ -uint16_t check_crc16_modbus(uint8_t *pBuf, uint16_t len); +uint8_t check_sum(uint8_t *data, uint16_t len); +uint8_t check_xor(uint8_t *data, uint16_t len); uint8_t check_lrc(uint8_t *pBuf, uint16_t len); +uint8_t check_crc4_itu(uint8_t *data, uint16_t len); +uint8_t check_crc5_epc(uint8_t *data, uint16_t len); +uint8_t check_crc5_itu(uint8_t *data, uint16_t len); +uint8_t check_crc5_usb(uint8_t *data, uint16_t len); +uint8_t check_crc6_itu(uint8_t *data, uint16_t len); +uint8_t check_crc7_mmc(uint8_t *data, uint16_t len); +uint8_t check_crc8(uint8_t *data, uint16_t len); +uint8_t check_crc8_itu(uint8_t *data, uint16_t len); +uint8_t check_crc8_rohc(uint8_t *data, uint16_t len); +uint8_t check_crc8_maxim(uint8_t *data, uint16_t len); +uint16_t check_crc16_ibm(uint8_t *data, uint16_t len); +uint16_t check_crc16_maxim(uint8_t *data, uint16_t len); +uint16_t check_crc16_usb(uint8_t *data, uint16_t len); +uint16_t check_crc16_modbus(uint8_t *data, uint16_t len); +uint16_t check_crc16_ccitt(uint8_t *data, uint16_t len); +uint16_t check_crc16_ccitt_false(uint8_t *data, uint16_t len); +uint16_t check_crc16_x25(uint8_t *data, uint16_t len); +uint16_t check_crc16_xmodem(uint8_t *data, uint16_t len); +uint16_t check_crc16_dnp(uint8_t *data, uint16_t len); +uint32_t check_crc32(uint8_t *data, uint16_t len); +uint32_t check_crc32_mpeg_2(uint8_t *data, uint16_t len); /** * @} -- Gitee From 4f9ae2933d2df46dd429e21ba9128eb7825d00f3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=98=BF=E8=A1=B00110?= Date: Fri, 29 Dec 2023 21:02:05 +0800 Subject: [PATCH 22/66] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E6=96=87=E4=BB=B6?= =?UTF-8?q?=E5=86=85=E8=AE=B0=E5=BD=95=E7=9A=84=E4=BF=AE=E6=94=B9=E6=97=B6?= =?UTF-8?q?=E9=97=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- drivers/modules/data_convert.c | 8 +++----- drivers/modules/delay_no_block.c | 2 +- drivers/modules/input_output.c | 1 - drivers/modules/message_queue.c | 3 +-- drivers/modules/message_queue.h | 2 +- drivers/modules/sync_method.c | 1 - 6 files changed, 6 insertions(+), 11 deletions(-) diff --git a/drivers/modules/data_convert.c b/drivers/modules/data_convert.c index 8a0d135..3d2e77c 100644 --- a/drivers/modules/data_convert.c +++ b/drivers/modules/data_convert.c @@ -15,7 +15,7 @@ * Change Logs: * Date Author Notes * 2023-09-19 ashuai0110 完成基本内容 - * 2023-12-11 ashuai0110 新增conv_complement_code_to_dec函数,增加详细的代码注释 + * 2023-12-11 ashuai0110 新增conv_complement_code_to_dec函数 * ****************************************************************************** */ @@ -143,15 +143,13 @@ uint32_t conv_str_split(char *pBuf[], char *pSrc, char flg, uint32_t num) /* 若当前字符与参数flg相同 */ if(*pSrc == flg) { - /* 当前字符改为'\0' 代表字符串到此结束 */ - *pSrc = '\0'; + *pSrc = '\0'; /* 当前字符改为'\0' 代表字符串到此结束 */ /* 若分割数量达到参数num则break */ if(cnt >= num) { break; } - /* 缓存区存放下一个字符串首地址 */ - pBuf[cnt++] = pSrc + 1; + pBuf[cnt++] = pSrc + 1; /* 缓存区存放下一个字符串首地址 */ } /* 若当前字符与结束符'\r' '\n' '\0'相同则break, 结束符可自定义修改 */ else if(*pSrc == '\r' || *pSrc == '\n' || *pSrc == '\0') { diff --git a/drivers/modules/delay_no_block.c b/drivers/modules/delay_no_block.c index 805d855..089c179 100644 --- a/drivers/modules/delay_no_block.c +++ b/drivers/modules/delay_no_block.c @@ -15,7 +15,7 @@ * Change Logs: * Date Author Notes * 2023-10-27 ashuai0110 完成基本内容 - * 2023-12-28 ashuai0110 修改从组件计时节拍接口获取时基,增加详细注释 + * 2023-12-28 ashuai0110 修改从组件计时节拍接口获取时基 * ****************************************************************************** */ diff --git a/drivers/modules/input_output.c b/drivers/modules/input_output.c index 1e57492..861d419 100644 --- a/drivers/modules/input_output.c +++ b/drivers/modules/input_output.c @@ -16,7 +16,6 @@ * Change Logs: * Date Author Notes * 2023-09-19 ashuai0110 完成基本内容 - * 2023-12-28 ashuai0110 增加详细注释 * ****************************************************************************** */ diff --git a/drivers/modules/message_queue.c b/drivers/modules/message_queue.c index 4b49d26..5c0d2fd 100644 --- a/drivers/modules/message_queue.c +++ b/drivers/modules/message_queue.c @@ -3,7 +3,7 @@ * @file message_queue.c * @author ashuai0110 * @version V2.1 - * @date 2023-10-27 + * @date 2023-12-27 * @brief 消息队列 * (适合不定长数据和复杂数据,写入时动态申请内存) * @@ -16,7 +16,6 @@ * Change Logs: * Date Author Notes * 2023-10-27 ashuai0110 完成基本内容 - * 2023-12-27 ashuai0110 增加详细的代码注释 * ****************************************************************************** */ diff --git a/drivers/modules/message_queue.h b/drivers/modules/message_queue.h index 54bee6d..4e81791 100644 --- a/drivers/modules/message_queue.h +++ b/drivers/modules/message_queue.h @@ -3,7 +3,7 @@ * @file message_queue.h * @author ashuai0110 * @version V2.1 - * @date 2023-10-27 + * @date 2023-12-27 * @brief 消息队列 * (适合不定长数据和复杂数据,写入时动态申请内存) * diff --git a/drivers/modules/sync_method.c b/drivers/modules/sync_method.c index 14ac3d8..8030169 100644 --- a/drivers/modules/sync_method.c +++ b/drivers/modules/sync_method.c @@ -15,7 +15,6 @@ * Change Logs: * Date Author Notes * 2023-09-26 ashuai0110 完成基本内容 - * 2023-12-27 ashuai0110 增加详细的代码注释 * ****************************************************************************** */ -- Gitee From 0391253c3076bcd9137343b5def7d6a437d579e1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=98=BF=E8=A1=B00110?= Date: Fri, 29 Dec 2023 21:02:35 +0800 Subject: [PATCH 23/66] =?UTF-8?q?#I8LFE8=20=E6=B7=BB=E5=8A=A0=E8=AF=A6?= =?UTF-8?q?=E7=BB=86=E4=BB=A3=E7=A0=81=E6=B3=A8=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- drivers/modules/command_line.c | 63 ++++++++++++++++++++++++---------- drivers/modules/command_line.h | 23 +++++++------ 2 files changed, 56 insertions(+), 30 deletions(-) diff --git a/drivers/modules/command_line.c b/drivers/modules/command_line.c index 603f2a7..536cdf3 100644 --- a/drivers/modules/command_line.c +++ b/drivers/modules/command_line.c @@ -3,7 +3,7 @@ * @file command_line.c * @author ashuai0110 * @version V2.1 - * @date 2023-10-27 + * @date 2023-12-29 * @brief 命令行交互 * (类命令行,空格分割 比如:cmd arg1 arg2\r\n或AT+CMD= arg1 arg2\r\n) * @@ -148,24 +148,27 @@ static uint16_t cmd_line_split(char *pBuf[], char *pSrc, char flg, uint16_t num) ASSERT_PARAM(IS_VALID_POINT(pBuf)); ASSERT_PARAM(IS_VALID_POINT(pSrc)); + /* 缓存区先存放第一个字符串首地址 */ pBuf[cnt++] = pSrc; while(1) { + /* 若当前字符与参数flg相同 */ if(*pSrc == flg) { - *pSrc = '\0'; + *pSrc = '\0'; /* 当前字符改为'\0' 代表字符串到此结束 */ + /* 若分割数量达到参数num则break */ if(cnt >= num) { - return cnt; + break; } - pBuf[cnt++] = pSrc + 1; - } + pBuf[cnt++] = pSrc + 1; /* 缓存区存放下一个字符串首地址 */ + } /* 若当前字符与结束符1或结束符2或'\0'相同则break */ else if(CMD_LINE_END_SYMBOL1 == *pSrc || CMD_LINE_END_SYMBOL2 == *pSrc|| '\0' == *pSrc) { *pSrc = '\0'; break; } - pSrc++; + pSrc++; /* 当前字符地址自增 */ } return cnt; @@ -184,11 +187,14 @@ static uint16_t cmd_line_search(char *name, uint16_t size) { uint16_t cnt, len; + /* 遍历整个命令存放数组 */ for(cnt = 0; cnt < CMD_LINE_SAVE_MAX; cnt++) { + /* 获取命令名长度 长度不为0说明存有命令名 */ len = strlen(cmdNameArr[cnt].cmdName); if(len) { + /* 先比较长度 长度相同再对比字符串 */ if(len == size) { if(0 == strncmp(cmdNameArr[cnt].cmdName, name, size)) @@ -280,13 +286,14 @@ uint8_t cmd_line_init(cmd_line_t *_cmd, cmd_line_rw_fn_t writeFn, cmd_line_rw_fn ASSERT_PARAM(IS_VALID_POINT(readFn)); ASSERT_PARAM(IS_VALID_ECHO_FLAG(echoFlg)); + /* 初始化各参数 */ _cmd->writeFn = writeFn; _cmd->readFn = readFn; _cmd->echoFlg = echoFlg; _cmd->runFlg = runFlg; - + /* 默认注册一个help命令 */ cmd_line_register("help", cmd_line_help); - + /* 初始化时就插入链表 */ return cmd_line_insert(_cmd); } @@ -301,6 +308,7 @@ void cmd_line_de_init(cmd_line_t *_cmd) { ASSERT_PARAM(IS_VALID_POINT(_cmd)); + /* 从链表取下并置零所有参数 */ cmd_line_pending(_cmd); memset(_cmd, 0, sizeof(cmd_line_t)); } @@ -316,15 +324,18 @@ void cmd_line_de_init(cmd_line_t *_cmd) */ uint8_t cmd_line_insert(cmd_line_t *_cmd) { - cmd_line_t *cmdLineTarget = pCmdLineHead; + cmd_line_t *cmdLineTarget; ASSERT_PARAM(IS_VALID_POINT(_cmd)); + cmdLineTarget = pCmdLineHead; /* 拿到链表头节点 */ + /* 遍历查重 重复则返回错误 */ while(cmdLineTarget) { if(cmdLineTarget == _cmd) { return RET_ERR; } cmdLineTarget = cmdLineTarget->pNext; } + /* 否则使用头插法(后来居上)将此节点插入链表 */ _cmd->pNext = pCmdLineHead; pCmdLineHead = _cmd; @@ -342,21 +353,28 @@ uint8_t cmd_line_insert(cmd_line_t *_cmd) */ uint8_t cmd_line_pending(cmd_line_t *_cmd) { - cmd_line_t *cmdLineTarget = pCmdLineHead; - cmd_line_t *cmdLineLast = NULL; + cmd_line_t *cmdLineTarget; + cmd_line_t *cmdLineLast; ASSERT_PARAM(IS_VALID_POINT(_cmd)); + cmdLineTarget = pCmdLineHead; /* 拿到链表头节点 */ + cmdLineLast = NULL; + /* 遍历查找 */ while(cmdLineTarget) { + /* 查找到此节点 */ if(cmdLineTarget == _cmd) { + /* 是否在头节点 */ if(NULL == cmdLineLast) { + /* 在头节点则将下一个节点作为新的头节点 */ pCmdLineHead = cmdLineTarget->pNext; } else { + /* 不在头节点则将下一个节点链接到上一个节点 */ cmdLineLast->pNext = cmdLineTarget->pNext; pCmdLineHead = cmdLineLast; } @@ -391,19 +409,24 @@ uint8_t cmd_line_register(const char *name, cmd_line_callback_fn_t callback) ASSERT_PARAM(IS_VALID_NAME_LENGTH(strlen(name))); ASSERT_PARAM(IS_VALID_POINT(callback)); + /* 遍历整个命令存放数组 */ for(cnt = 0; cnt < CMD_LINE_SAVE_MAX; cnt++) { + /* 先获取当前命令存放地长度 */ len = strlen(cmdNameArr[cnt].cmdName); + /* 有长度需查重 */ if(len) { + /* 先对比长度是否符合 符合才比较字符串 */ if(len == strlen(name)) { + /* 字符串相同则返回重复错误 */ if(0 == strcmp(cmdNameArr[cnt].cmdName, name)) { return RET_ERR; } } - } + } /* 无长度便可直接存放 */ else { strcpy(cmdNameArr[cnt].cmdName, name); @@ -434,7 +457,7 @@ void cmd_line_printf(cmd_line_t *_cmd, const char *format, ...) va_start(args, format); len = vsnprintf(buf, sizeof(buf), format, args); va_end(args); - + /* 以上内容为printf固定写法 以下内容对接底层接口 */ _cmd->writeFn(buf, len); } @@ -453,24 +476,26 @@ void cmd_line_poll(void) static char buf[32] = {0}; static uint8_t cnt, len; - + /* 遍历链表 */ for(cmdLineTarget = pCmdLineHead; cmdLineTarget; cmdLineTarget = cmdLineTarget->pNext) { + /* 运行标志是开启运行的才执行 */ if(CMD_LINE_RUN_START == cmdLineTarget->runFlg) { - len = cmdLineTarget->readFn(buf, sizeof(buf)); - + len = cmdLineTarget->readFn(buf, sizeof(buf)); /* 读取数据并记录读出长度 */ + /* 逐字节判断 */ for(cnt = 0; cnt < len; cnt++) { + /* 遇到结束符1或结束符2或'\0'认为是完整的数据 */ if(CMD_LINE_END_SYMBOL1 == buf[cnt] || CMD_LINE_END_SYMBOL2 == buf[cnt] || '\0' == buf[cnt]) { - cmdLineTarget->dataArr[cmdLineTarget->dataCnt] = '\0'; + cmdLineTarget->dataArr[cmdLineTarget->dataCnt] = '\0'; /* 添加字符串结束符 */ if(1 < cmdLineTarget->dataCnt) { - cmd_line_handle(cmdLineTarget); + cmd_line_handle(cmdLineTarget); /* 执行处理 */ } cmdLineTarget->dataCnt = 0; - } + } /* 否则则循环写入数据暂存区 */ else { cmdLineTarget->dataArr[cmdLineTarget->dataCnt++] = buf[cnt]; diff --git a/drivers/modules/command_line.h b/drivers/modules/command_line.h index b7b08df..02a3e69 100644 --- a/drivers/modules/command_line.h +++ b/drivers/modules/command_line.h @@ -3,7 +3,7 @@ * @file command_line.h * @author ashuai0110 * @version V2.1 - * @date 2023-10-27 + * @date 2023-12-29 * @brief 命令行交互 * (类命令行,空格分割 比如:cmd arg1 arg2\r\n或AT+CMD= arg1 arg2\r\n) * @@ -61,8 +61,8 @@ extern "C" { * @defgroup cmd_line_echo_flg command line echo flag * @{ */ -#define CMD_LINE_ECHO_OFF (1u) /*!< 关闭回显 */ -#define CMD_LINE_ECHO_ON (0u) /*!< 开启回显 */ +#define CMD_LINE_ECHO_OFF (0u) /*!< 关闭回显 */ +#define CMD_LINE_ECHO_ON (1u) /*!< 开启回显 */ /** * @} */ @@ -71,8 +71,8 @@ extern "C" { * @defgroup cmd_line_run_flg command line run flag * @{ */ -#define CMD_LINE_RUN_STOP (1u) /*!< 不运行 */ -#define CMD_LINE_RUN_START (0u) /*!< 运行 */ +#define CMD_LINE_RUN_STOP (0u) /*!< 不运行 */ +#define CMD_LINE_RUN_START (1u) /*!< 运行 */ /** * @} */ @@ -128,8 +128,8 @@ typedef void (* cmd_line_callback_fn_t)(cmd_line_t *_cmd, int argc, char *argv[] * @brief 命令行 item structure definition */ typedef struct cmd_line_item{ - char cmdName[CMD_LINE_NAME_MAX + 1]; /* 命令名称 */ - cmd_line_callback_fn_t cmdCallbackFn; /* 命令处理函数 */ + char cmdName[CMD_LINE_NAME_MAX + 1]; /*!< 命令名称 */ + cmd_line_callback_fn_t cmdCallbackFn; /*!< 命令处理回调函数 */ } cmd_line_item_t; /** @@ -147,15 +147,16 @@ typedef struct cmd_line_item{ uint8_t cmd_line_init(cmd_line_t *_cmd, cmd_line_rw_fn_t writeFn, cmd_line_rw_fn_t readFn, uint8_t echoFlg, uint8_t runFlg); void cmd_line_de_init(cmd_line_t *_cmd); -uint8_t cmd_line_insert(cmd_line_t *_cmd); -uint8_t cmd_line_pending(cmd_line_t *_cmd); - uint8_t cmd_line_register(const char *name, cmd_line_callback_fn_t callback); - void cmd_line_printf(cmd_line_t *_cmd, const char *format, ...); void cmd_line_poll(void); +/* list interface */ +uint8_t cmd_line_insert(cmd_line_t *_cmd); +uint8_t cmd_line_pending(cmd_line_t *_cmd); + +/* set/get interface */ void cmd_line_set_echo_flg(cmd_line_t *_cmd, uint8_t echoFlg); uint8_t cmd_line_get_echo_flg(cmd_line_t *_cmd); void cmd_line_set_run_flg(cmd_line_t *_cmd, uint8_t echoFlg); -- Gitee From 949cd0b17e2b9f9985db0f117d3a416b7d97cf7b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=98=BF=E8=A1=B00110?= Date: Sat, 30 Dec 2023 13:50:47 +0800 Subject: [PATCH 24/66] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=86=85=E9=83=A8?= =?UTF-8?q?=E9=93=BE=E8=A1=A8=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- drivers/modules/message_queue.c | 63 +++++++++++++++++---------------- drivers/modules/message_queue.h | 3 +- 2 files changed, 33 insertions(+), 33 deletions(-) diff --git a/drivers/modules/message_queue.c b/drivers/modules/message_queue.c index 5c0d2fd..0a4ac52 100644 --- a/drivers/modules/message_queue.c +++ b/drivers/modules/message_queue.c @@ -3,7 +3,7 @@ * @file message_queue.c * @author ashuai0110 * @version V2.1 - * @date 2023-12-27 + * @date 2023-12-30 * @brief 消息队列 * (适合不定长数据和复杂数据,写入时动态申请内存) * @@ -16,6 +16,7 @@ * Change Logs: * Date Author Notes * 2023-10-27 ashuai0110 完成基本内容 + * 2023-12-30 ashuai0110 修改内部链表逻辑 * ****************************************************************************** */ @@ -82,9 +83,8 @@ void mes_queue_init(mes_queue_t *_mq, uint32_t size) ASSERT_PARAM(IS_VALID_QA_SIZE(size)); /* 初始化各参数 */ - _mq->pHead = _mq->pTail = NULL; + memset(_mq, 0, sizeof(mes_queue_t)); _mq->maxCnt = size; - _mq->curCnt = 0; } /** @@ -98,14 +98,16 @@ void mes_queue_init(mes_queue_t *_mq, uint32_t size) */ void mes_queue_de_init(mes_queue_t *_mq) { + mes_queue_item_t *pItem; + ASSERT_PARAM(IS_VALID_POINT(_mq)); /* 遍历链表 释放所有消息的内存 */ - while(_mq->pHead != NULL) + while(NULL != _mq->pHead) { - _mq->pTail = _mq->pHead; + pItem = _mq->pHead; _mq->pHead = _mq->pHead->pNext; - MQ_FREE(_mq->pTail); + MQ_FREE(pItem); } /* 置零所有参数 */ memset(_mq, 0, sizeof(mes_queue_t)); @@ -114,41 +116,41 @@ void mes_queue_de_init(mes_queue_t *_mq) /** * @brief 向消息队列写入数据 * - * @param _mq : 消息队列实例 + * @param _mq : 消息队列实例 * - * @param pData : 写入的数据 + * @param pData : 写入的数据 * - * @param size : 写入的数据大小byte + * @param size : 写入的数据大小byte * * @retval uint8_t - * @arg RET_OK : 成功 - * @arg RET_ERR : 消息队列已满(不可写) + * @arg RET_OK : 成功 + * @arg RET_ERR : 动态申请内存失败,写入失败 + * @arg RET_FULL : 消息队列已满(不可写) */ uint8_t mes_queue_write(mes_queue_t *_mq, void *pData, uint32_t size) { + mes_queue_item_t **pItem; + ASSERT_PARAM(IS_VALID_POINT(_mq)); ASSERT_PARAM(IS_VALID_POINT(pData)); ASSERT_PARAM(IS_VALID_QA_SIZE(size)); /* 当前数量大于等于最大数量则说明消息队列已满 */ - if(_mq->curCnt >= _mq->maxCnt) { return RET_ERR; } + if(_mq->curCnt >= _mq->maxCnt) { return RET_FULL; } - /* 头节点为空则在头节点申请内存 */ - if(NULL == _mq->pHead) - { - _mq->pHead = (mes_queue_item_t *)MQ_MALLOC(sizeof(mes_queue_item_t) + size); - _mq->pTail = _mq->pHead; - } /* 否则则需在尾结点的下一节点申请内存 */ - else + pItem = &_mq->pHead; /* 先拿到头节点的地址 */ + /* 遍历寻找空节点 */ + while(NULL != *pItem) { - _mq->pTail->pNext = (mes_queue_item_t *)MQ_MALLOC(sizeof(mes_queue_item_t) + size); - _mq->pTail = _mq->pTail->pNext; + pItem = &(*pItem)->pNext; } - /* 将数据和数量拷贝到新节点 */ - _mq->pTail->pNext = NULL; - _mq->pTail->size = size; - memcpy(_mq->pTail->data, pData, size); - _mq->curCnt = _mq->curCnt + 1; /* 计数+1 */ + *pItem = (mes_queue_item_t *)MQ_MALLOC(sizeof(mes_queue_item_t) + size); + if(NULL == *pItem) { return RET_ERR;} /* 若申请内存为空则返回失败 */ + /* 将数据和数量拷贝到尾结点 */ + (*pItem)->pNext = NULL; + (*pItem)->size = size; + memcpy((void *)(*pItem)->data, pData, size); + _mq->curCnt = _mq->curCnt + 1; /* 消息计数+1 */ return RET_OK; } @@ -168,7 +170,7 @@ uint8_t mes_queue_write(mes_queue_t *_mq, void *pData, uint32_t size) */ uint8_t mes_queue_read(mes_queue_t *_mq, void *pBuf, uint32_t *size) { - mes_queue_item_t *pTmp; + mes_queue_item_t *pItem; ASSERT_PARAM(IS_VALID_POINT(_mq)); ASSERT_PARAM(IS_VALID_POINT(pBuf)); @@ -177,14 +179,13 @@ uint8_t mes_queue_read(mes_queue_t *_mq, void *pBuf, uint32_t *size) /* 头节点为空或当前计数值为0则表示消息队列为空 */ if(NULL == _mq->pHead || 0 == _mq->curCnt) { return RET_ERR; } - pTmp = _mq->pHead; /* 拿到头节点 */ + pItem = _mq->pHead; /* 拿到头节点 */ /* 将数据和数量拷贝到外部缓存区 */ *size = _mq->pHead->size; memcpy(pBuf, (void *)_mq->pHead->data, _mq->pHead->size); _mq->pHead = _mq->pHead->pNext; /* 头节点指向下一节点 */ - if(_mq->pHead == NULL) { _mq->pTail = NULL; } /* 若头节点为空则尾结点也要赋值为空 */ - MQ_FREE(pTmp); /* 释放内存 */ - _mq->curCnt = _mq->curCnt - 1; /* 计数-1 */ + MQ_FREE(pItem); /* 释放内存 */ + _mq->curCnt = _mq->curCnt - 1; /* 消息计数-1 */ return RET_OK; } diff --git a/drivers/modules/message_queue.h b/drivers/modules/message_queue.h index 4e81791..6acf519 100644 --- a/drivers/modules/message_queue.h +++ b/drivers/modules/message_queue.h @@ -3,7 +3,7 @@ * @file message_queue.h * @author ashuai0110 * @version V2.1 - * @date 2023-12-27 + * @date 2023-12-30 * @brief 消息队列 * (适合不定长数据和复杂数据,写入时动态申请内存) * @@ -72,7 +72,6 @@ typedef struct mes_queue { uint16_t maxCnt; /*!< 消息数量 非消息长度而是消息项结构体(mes_queue_item_t)的个数 */ volatile uint16_t curCnt; /*!< 当前消息数量 */ mes_queue_item_t *pHead; /*!< 消息队列头节点 */ - mes_queue_item_t *pTail; /*!< 消息队列尾节点 */ } mes_queue_t; /** -- Gitee From a5135c721dcd94cb1f098b99e440d8b02e8e3d06 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=98=BF=E8=A1=B00110?= Date: Mon, 1 Jan 2024 23:00:11 +0800 Subject: [PATCH 25/66] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E9=93=BE=E8=A1=A8?= =?UTF-8?q?=E6=8C=82=E8=B5=B7=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- drivers/modules/command_line.c | 39 ++++++++-------------------- drivers/modules/command_line.h | 2 +- drivers/modules/input_output.c | 43 ++++++++----------------------- drivers/modules/input_output.h | 2 +- drivers/modules/timer_software.c | 44 ++++++++++---------------------- drivers/modules/timer_software.h | 2 +- 6 files changed, 38 insertions(+), 94 deletions(-) diff --git a/drivers/modules/command_line.c b/drivers/modules/command_line.c index 536cdf3..0454983 100644 --- a/drivers/modules/command_line.c +++ b/drivers/modules/command_line.c @@ -3,7 +3,7 @@ * @file command_line.c * @author ashuai0110 * @version V2.1 - * @date 2023-12-29 + * @date 2024-01-01 * @brief 命令行交互 * (类命令行,空格分割 比如:cmd arg1 arg2\r\n或AT+CMD= arg1 arg2\r\n) * @@ -16,6 +16,7 @@ * Change Logs: * Date Author Notes * 2023-10-27 ashuai0110 完成基本内容 + * 2024-01-01 ashuai0110 修改链表挂起逻辑 * ****************************************************************************** */ @@ -287,6 +288,7 @@ uint8_t cmd_line_init(cmd_line_t *_cmd, cmd_line_rw_fn_t writeFn, cmd_line_rw_fn ASSERT_PARAM(IS_VALID_ECHO_FLAG(echoFlg)); /* 初始化各参数 */ + memset(_cmd, 0, sizeof(cmd_line_t)); _cmd->writeFn = writeFn; _cmd->readFn = readFn; _cmd->echoFlg = echoFlg; @@ -353,39 +355,20 @@ uint8_t cmd_line_insert(cmd_line_t *_cmd) */ uint8_t cmd_line_pending(cmd_line_t *_cmd) { - cmd_line_t *cmdLineTarget; - cmd_line_t *cmdLineLast; + cmd_line_t **cmdLineTarget; ASSERT_PARAM(IS_VALID_POINT(_cmd)); - cmdLineTarget = pCmdLineHead; /* 拿到链表头节点 */ - cmdLineLast = NULL; - /* 遍历查找 */ - while(cmdLineTarget) + cmdLineTarget = &pCmdLineHead; /* 先拿到头节点的地址 */ + /* 遍历寻找此节点 */ + while(*cmdLineTarget != _cmd) { - /* 查找到此节点 */ - if(cmdLineTarget == _cmd) - { - /* 是否在头节点 */ - if(NULL == cmdLineLast) - { - /* 在头节点则将下一个节点作为新的头节点 */ - pCmdLineHead = cmdLineTarget->pNext; - } - else - { - /* 不在头节点则将下一个节点链接到上一个节点 */ - cmdLineLast->pNext = cmdLineTarget->pNext; - pCmdLineHead = cmdLineLast; - } - - return RET_OK; - } - cmdLineLast = cmdLineTarget; - cmdLineTarget = cmdLineTarget->pNext; + if(NULL == *cmdLineTarget) { return RET_ERR; } + cmdLineTarget = &(*cmdLineTarget)->pNext; } + *cmdLineTarget = _cmd->pNext; /* 将此节点指针改为下一节点指针 即移除此节点 */ - return RET_ERR; + return RET_OK; } /** diff --git a/drivers/modules/command_line.h b/drivers/modules/command_line.h index 02a3e69..a4e4d2c 100644 --- a/drivers/modules/command_line.h +++ b/drivers/modules/command_line.h @@ -3,7 +3,7 @@ * @file command_line.h * @author ashuai0110 * @version V2.1 - * @date 2023-12-29 + * @date 2024-01-01 * @brief 命令行交互 * (类命令行,空格分割 比如:cmd arg1 arg2\r\n或AT+CMD= arg1 arg2\r\n) * diff --git a/drivers/modules/input_output.c b/drivers/modules/input_output.c index 861d419..c7a2cdf 100644 --- a/drivers/modules/input_output.c +++ b/drivers/modules/input_output.c @@ -3,7 +3,7 @@ * @file input_output.c * @author ashuai0110 * @version V2.1 - * @date 2023-12-28 + * @date 2024-01-01 * @brief IO输入输出操作 * (输入可以设置各边沿触发时间,输出可以设置各边沿保持时间) * @@ -16,6 +16,7 @@ * Change Logs: * Date Author Notes * 2023-09-19 ashuai0110 完成基本内容 + * 2024-01-01 ashuai0110 修改链表挂起逻辑 * ****************************************************************************** */ @@ -255,15 +256,12 @@ uint8_t io_init(io_t *_io, io_rw_fn_t rwFn, io_cb_fn_t callbackFn, uint8_t dir, ASSERT_PARAM(IS_VALID_RUN_FLAG(run)); /* 初始化各参数 */ + memset(_io, 0, sizeof(io_t)); _io->rwFn = rwFn; _io->dir = dir; _io->run = run; _io->level = (_io->dir == IO_DIR_IN) ? (_io->rwFn(0)) : 0; /* 默认电平由此时读到的电平决定 */ - _io->ticks = 0; - _io->risingTicks = 0; - _io->fallingTicks = 0; _io->edge = IN_EDGE_NONE; - _io->state = 0; _io->callbackFn = callbackFn; /* 初始化时就插入链表 */ return io_insert(_io); @@ -325,39 +323,20 @@ uint8_t io_insert(io_t *_io) */ uint8_t io_pending(io_t *_io) { - io_t *ioTarget; - io_t *ioLast; + io_t **ioTarget; ASSERT_PARAM(IS_VALID_POINT(_io)); - ioTarget = pIOTaskHead; /* 拿到链表头节点 */ - ioLast = NULL; - /* 遍历查找 */ - while(ioTarget) + ioTarget = &pIOTaskHead; /* 先拿到头节点的地址 */ + /* 遍历寻找此节点 */ + while(*ioTarget != _io) { - /* 查找到此节点 */ - if(ioTarget == _io) - { - /* 是否在头节点 */ - if(NULL == ioLast) - { - /* 在头节点则将下一个节点作为新的头节点 */ - pIOTaskHead = ioTarget->pNext; - } - else - { - /* 不在头节点则将下一个节点链接到上一个节点 */ - ioLast->pNext = ioTarget->pNext; - pIOTaskHead = ioLast; - } - - return RET_OK; - } - ioLast = ioTarget; - ioTarget = ioTarget->pNext; + if(NULL == *ioTarget) { return RET_ERR; } + ioTarget = &(*ioTarget)->pNext; } + *ioTarget = _io->pNext; /* 将此节点指针改为下一节点指针 即移除此节点 */ - return RET_ERR; + return RET_OK; } /** diff --git a/drivers/modules/input_output.h b/drivers/modules/input_output.h index 4660525..fa8f7de 100644 --- a/drivers/modules/input_output.h +++ b/drivers/modules/input_output.h @@ -3,7 +3,7 @@ * @file input_output.h * @author ashuai0110 * @version V2.1 - * @date 2023-12-28 + * @date 2024-01-01 * @brief IO输入输出操作 * (输入可以设置各边沿触发时间,输出可以设置各边沿保持时间) * diff --git a/drivers/modules/timer_software.c b/drivers/modules/timer_software.c index b518450..3553ce3 100644 --- a/drivers/modules/timer_software.c +++ b/drivers/modules/timer_software.c @@ -3,7 +3,7 @@ * @file timer_software.c * @author ashuai0110 * @version V2.1 - * @date 2023-12-29 + * @date 2024-01-01 * @brief 软件定时器 * ****************************************************************************** @@ -16,6 +16,7 @@ * Date Author Notes * 2023-09-26 ashuai0110 完成基本内容 * 2023-12-29 ashuai0110 修改从组件计时节拍接口获取时基 + * 2024-01-01 ashuai0110 修改链表挂起逻辑 * ****************************************************************************** */ @@ -104,7 +105,7 @@ uint8_t timer_s_init(timer_s_t *_ts, uint32_t targetTicks, void (* callbackFn)(v ASSERT_PARAM(IS_VALID_TIMER_RUN(runFlg)); /* 初始化各参数 */ - _ts->curTicks = 0; + memset(_ts, 0, sizeof(timer_s_t)); _ts->targetTicks = targetTicks; _ts->callbackFn = callbackFn; _ts->runFlg = runFlg; @@ -145,7 +146,7 @@ uint8_t timer_s_insert(timer_s_t *_ts) tsTarget = pTimerTaskHead; /* 拿到链表头节点 */ /* 遍历查重 重复则返回错误 */ - while(tsTarget) + while(NULL != tsTarget) { if(tsTarget == _ts) { return RET_ERR; } tsTarget = tsTarget->pNext; @@ -168,39 +169,20 @@ uint8_t timer_s_insert(timer_s_t *_ts) */ uint8_t timer_s_pending(timer_s_t *_ts) { - timer_s_t *tsTarget; - timer_s_t *tsLast; + timer_s_t **tsTarget; ASSERT_PARAM(IS_VALID_POINT(_ts)); - tsTarget = pTimerTaskHead; /* 拿到链表头节点 */ - tsLast = NULL; - /* 遍历查找 */ - while(tsTarget) + tsTarget = &pTimerTaskHead; /* 先拿到头节点的地址 */ + /* 遍历寻找此节点 */ + while(*tsTarget != _ts) { - /* 查找到此节点 */ - if(tsTarget == _ts) - { - /* 是否在头节点 */ - if(NULL == tsLast) - { - /* 在头节点则将下一个节点作为新的头节点 */ - pTimerTaskHead = tsTarget->pNext; - } - else - { - /* 不在头节点则将下一个节点链接到上一个节点 */ - tsLast->pNext = tsTarget->pNext; - pTimerTaskHead = tsLast; - } - - return RET_OK; - } - tsLast = tsTarget; - tsTarget = tsTarget->pNext; + if(NULL == *tsTarget) { return RET_ERR; } + tsTarget = &(*tsTarget)->pNext; } - - return RET_ERR; + *tsTarget = _ts->pNext; /* 将此节点指针改为下一节点指针 即移除此节点 */ + + return RET_OK; } /** diff --git a/drivers/modules/timer_software.h b/drivers/modules/timer_software.h index 1a783fc..293c3b0 100644 --- a/drivers/modules/timer_software.h +++ b/drivers/modules/timer_software.h @@ -3,7 +3,7 @@ * @file timer_software.h * @author ashuai0110 * @version V2.1 - * @date 2023-12-29 + * @date 2024-01-01 * @brief 软件定时器 * ****************************************************************************** -- Gitee From 0933b13dd01c987b174b300b3c1ef6812e9597c7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=98=BF=E8=A1=B00110?= Date: Tue, 2 Jan 2024 14:45:30 +0800 Subject: [PATCH 26/66] =?UTF-8?q?#I8LFE8=20=E5=A2=9E=E5=8A=A0=E8=AF=A6?= =?UTF-8?q?=E7=BB=86=E6=B3=A8=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- drivers/modules/memory.c | 83 +++++++++++++++++++++++----------------- drivers/modules/memory.h | 24 +++--------- 2 files changed, 53 insertions(+), 54 deletions(-) diff --git a/drivers/modules/memory.c b/drivers/modules/memory.c index 1beea1d..1b8d70a 100644 --- a/drivers/modules/memory.c +++ b/drivers/modules/memory.c @@ -3,9 +3,8 @@ * @file memory.c * @author ashuai0110 * @version V2.1 - * @date 2023-10-27 - * @brief 内存管理-小内存管理算法 - * (参考rt-thread的mem,小内存管理算法<2MB) + * @date 2024-01-02 + * @brief 内存管理(rt-thread的mem,小内存管理算法<2MB) * ****************************************************************************** * @attention @@ -38,9 +37,6 @@ * @defgroup memory_local_macros memory local macros * @{ */ - -#define MEM_ALIGN_SIZE (4u) /*!< 最小对齐字节数(默认4字节) */ -#define MEM_CODE (0x1EA0) /*!< 内存管理标识(默认0x1EA0) */ /** * @defgroup memory_check_parameters_validity memory check parameters validity @@ -102,7 +98,7 @@ static void mem_check_free(mem_t *_mem) if(nmem != _mem && !nmem->used && nmem != tailMem) { if(freeMem == nmem) { freeMem = _mem; } - /* 合并 */ + /* 合并内存块 */ _mem->next = nmem->next; ((mem_t *)&memory[nmem->next])->prev = (char *)_mem - memory; #if _MEM_STATES @@ -116,7 +112,7 @@ static void mem_check_free(mem_t *_mem) if(pmem != _mem && !pmem->used) { if(freeMem == _mem) { freeMem = pmem; } - /* 合并 */ + /* 合并内存块 */ pmem->next = _mem->next; ((mem_t *)&memory[_mem->next])->prev = (char *)pmem - memory; #if _MEM_STATES @@ -181,6 +177,7 @@ void *mem_alloc(uint32_t size) /* 字节向上对齐 */ size = ALIGN_UP(size, MEM_ALIGN_SIZE); + /* 若申请内存超出可用内存则返回NULL */ if(size > (MEM_SIZE - sizeof(mem_t) * 2)) { return NULL; } /* 轮询查找管理者 */ @@ -188,25 +185,26 @@ void *mem_alloc(uint32_t size) offset < MEM_SIZE - sizeof(mem_t) * 2 - size; \ offset = ((mem_t *)&memory[offset])->next) { - mem = (mem_t *)&memory[offset]; + mem = (mem_t *)&memory[offset]; /* 找到管理者 */ /* 管理者管理的内存未使用且大于等于申请大小 */ if(!mem->used && (mem->next - offset - sizeof(mem_t)) >= size) { - /* 管理者管理的内存除去申请掉的还可以容纳一个管理者和最小空间 */ + /* 管理者管理的内存减去申请掉的还可以容纳一个管理者和最小空间 */ if((mem->next - offset - sizeof(mem_t)) >= (size + sizeof(mem_t) + MEM_ALIGN_SIZE)) { - /* 创建下一个管理者 */ - offset2 = offset + size + sizeof(mem_t); + offset2 = offset + size + sizeof(mem_t); /* 下一个管理者的偏移量 */ + /* 创建下一个管理者mem2 */ mem2 = (mem_t *)&memory[offset2]; mem2->code = MEM_CODE; mem2->used = 0; - mem2->next = mem->next; - mem2->prev = offset; - /* 当前管理者记录下一个管理者的偏移 */ + mem2->next = mem->next; /* 继承当前管理者mem的next */ + mem2->prev = offset; /* prev记录当前管理者mem的偏移量 */ + /* 当前管理者mem记录下一个管理者mem2的偏移 */ mem->next = offset2; + /* 若下一个管理者mem2的next不是末尾管理者的偏移则说明后面还有一个非末尾的管理者 */ if(mem2->next != (MEM_SIZE - sizeof(mem_t))) { - ((mem_t *)&memory[mem2->next])->prev = offset2; + ((mem_t *)&memory[mem2->next])->prev = offset2; /* 后面非末尾的管理者的prev记录mem2的偏移量 */ } #if _MEM_STATES memUsedSize += (size + sizeof(mem_t)); @@ -222,11 +220,14 @@ void *mem_alloc(uint32_t size) mem->used = 1; mem->code = MEM_CODE; /* 寻找并更新空闲管理者 */ - if(mem == freeMem) { + if(mem == freeMem) + { while(freeMem->used && freeMem != tailMem) + { freeMem = (mem_t *)&memory[freeMem->next]; + } } - mem_set((void *)((char *)mem + sizeof(mem_t)), 0, size); + mem_set((void *)((char *)mem + sizeof(mem_t)), 0, size); /* 清理申请到的内存 */ return (void *)((char *)mem + sizeof(mem_t)); } @@ -250,39 +251,44 @@ void *mem_realloc(void *pStr, uint32_t size) mem_t *mem, *mem2; void *pNewStr = pStr; - /* 字节向上对齐 */ + /* 字节向上整数对齐 */ size = ALIGN_UP(size, MEM_ALIGN_SIZE); + /* 若申请大小超出最大可申请大小则返回NULL */ if(size > (MEM_SIZE - sizeof(mem_t) * 2)) { return NULL; - } + } /* 若申请大小为0则释放该内存并返回NULL */ else if(0 == size) { mem_free(pStr); return NULL; } + /* 若要重新申请的内存本身为空 则使用mem_alloc为其申请内存 */ if(pStr == NULL) { return mem_alloc(size); } + /* 若要重新申请的内存不在内存管理的范围 则返回其自身无法重新申请 */ if((char *)pStr < memory || (char *)pStr >= (char *)(memory + MEM_SIZE)) { return pStr; } - mem = (mem_t *)((char *)pStr - sizeof(mem_t)); - offset = (char *)mem - memory; - oldsize = mem->next - offset - sizeof(mem_t); - if(oldsize == size) { return pStr; } + mem = (mem_t *)((char *)pStr - sizeof(mem_t)); /* 管理者的地址 */ + offset = (char *)mem - memory; /* 管理者的偏移 */ + oldsize = mem->next - offset - sizeof(mem_t); /* 原本的内存大小(下一个管理者的偏移-此内存管理者的偏移-管理者大小) */ + if(oldsize == size) { return pStr; } /* 若重新申请的内存大小等于原本的内存大小 则返回其自身不重新申请 */ /* 新分配大小+一个管理者+最小空间小于原有大小 */ if(oldsize > (size + sizeof(mem_t) + MEM_ALIGN_SIZE)) { - /* 创建下一个管理者 */ + /* 下一个管理者的偏移量 */ offset2 = offset + size + sizeof(mem_t); + /* 创建下一个管理者mem2 */ mem2 = (mem_t *)&memory[offset2]; mem2->code = MEM_CODE; mem2->used = 0; - mem2->next = mem->next; - mem2->prev = offset; - /* 当前管理者记录下一个管理者的偏移 */ + mem2->next = mem->next; /* 继承当前管理者mem的next */ + mem2->prev = offset; /* prev记录当前管理者mem的偏移量 */ + /* 当前管理者mem记录下一个管理者mem2的偏移 */ mem->next = offset2; + /* 若下一个管理者mem2的next不是末尾管理者的偏移则说明后面还有一个非末尾的管理者 */ if(mem2->next != (MEM_SIZE - sizeof(mem_t))) { - ((mem_t *)&memory[mem2->next])->prev = offset2; + ((mem_t *)&memory[mem2->next])->prev = offset2; /* 后面非末尾的管理者的prev记录mem2的偏移量 */ } #if _MEM_STATES memUsedSize -= (oldsize - size - sizeof(mem_t)); @@ -318,19 +324,22 @@ void mem_free(void *pStr) mem_t *mem; ASSERT_PARAM(IS_VALID_POINT(pStr)); - + /* 检查此内存地址是否是MEM_ALIGN_SIZE字节对齐 不是则退出 */ if(((uint32_t)pStr & (MEM_ALIGN_SIZE - 1)) != 0) { return ; } + /* 若此内存地址不在内存管理的范围 则退出 */ if((char *)pStr < memory || (char *)pStr >= (char *)(memory + MEM_SIZE)) { return ; } - mem = (mem_t *)((char *)pStr - sizeof(mem_t)); + mem = (mem_t *)((char *)pStr - sizeof(mem_t)); /* 管理者的地址 */ + /* 若此内存未使用或内存标志不对 则退出 */ if(!mem->used || mem->code != MEM_CODE) { return ; } + /* 标记此内存地址未使用 */ mem->used = 0; mem->code = MEM_CODE; #if _MEM_STATES memUsedSize -= (mem->next - ((char *)pStr - memory)); #endif - if(mem < freeMem) { freeMem = mem; } - mem_set(pStr, 0, mem->next - ((char *)pStr - memory)); + if(mem < freeMem) { freeMem = mem; } /* 若此内存管理者小于空闲管理者则更改空闲管理者地址 */ + mem_set(pStr, 0, mem->next - ((char *)pStr - memory)); /* 清理内存数据 */ /* 检查前后管理者管理的块是否未使用,将其合并 */ mem_check_free(mem); } @@ -350,6 +359,7 @@ void *mem_set(void *pStr, int c, uint32_t n) { char *s = (char *)pStr; + /* 循环设置填充值 */ while(n--) { *s++ = c; } return pStr; @@ -371,13 +381,16 @@ void *mem_copy(void *dest, const void *src, uint32_t n) char *d = (char *)dest, *s = (char *)src; uint32_t len; + /* 若目标地址小于等于源地址或大于源地址加上拷贝数量则说明目标地址不在源地址以及后续数据内 */ if(d <= s || d > (s + n)) { + /* 此时从前往后拷贝即可 */ while(n--) { *d++ = *s++; } - } + } /* 否则说明目标地址在源地址以及后续数据内(和源地址以及后续数据在相同内存地址) */ else { - for(len = n; len > 0; len --) + /* 此时从后往前拷贝 避免从前往后拷贝时后续数据被修改 */ + for(len = n; len > 0; len--) { d[len - 1] = s[len - 1]; } diff --git a/drivers/modules/memory.h b/drivers/modules/memory.h index 1b95118..795ae6e 100644 --- a/drivers/modules/memory.h +++ b/drivers/modules/memory.h @@ -3,9 +3,8 @@ * @file memory.h * @author ashuai0110 * @version V2.1 - * @date 2023-10-27 - * @brief 内存管理 - * (参考rt-thread的mem,小内存管理算法<2MB) + * @date 2024-01-02 + * @brief 内存管理(参考rt-thread的mem,小内存管理算法<2MB) * ****************************************************************************** * @attention @@ -42,23 +41,10 @@ extern "C" { * @{ */ -/** - * @defgroup memory_management_size memory management size - * @{ - */ #define MEM_SIZE (1024u) /*!< 内存管理总字节数(28至2MB) 用户按需修改 */ -/** - * @} - */ - -/** - * @defgroup memory_usage_state memory usage state - * @{ - */ -#define _MEM_STATES (1u) /*!< 内存用量统计 0:关闭 1:开启 */ -/** - * @} - */ +#define MEM_ALIGN_SIZE (4u) /*!< 最小对齐字节数(默认4字节) */ +#define MEM_CODE (0x1EA0u) /*!< 内存管理标识(默认0x1EA0) */ +#define _MEM_STATES (0u) /*!< 内存用量统计 0:关闭 1:开启 */ /** * @} -- Gitee From 186a58e129580fc1da8e9530398277c66db89ac8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=98=BF=E8=A1=B00110?= Date: Tue, 2 Jan 2024 20:21:21 +0800 Subject: [PATCH 27/66] =?UTF-8?q?=E4=BE=8B=E7=A8=8B=E7=BB=9F=E4=B8=80?= =?UTF-8?q?=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- examples/command_line/MDK/use_example.uvoptx | 14 +++- examples/command_line/MDK/use_example.uvprojx | 5 ++ examples/input_output/MDK/use_example.uvoptx | 14 +++- examples/input_output/MDK/use_example.uvprojx | 5 ++ examples/memory/MDK/use_example.uvoptx | 14 +++- examples/memory/MDK/use_example.uvprojx | 5 ++ examples/message_queue/MDK/use_example.uvoptx | 14 +++- .../message_queue/MDK/use_example.uvprojx | 5 ++ examples/modbus_host/MDK/use_example.uvoptx | 81 ++++--------------- examples/modbus_host/MDK/use_example.uvprojx | 5 ++ examples/modbus_host/README.txt | 2 +- examples/modbus_host/SRC/main.c | 44 +++++----- examples/modbus_slave/MDK/use_example.uvoptx | 49 ++++------- examples/modbus_slave/MDK/use_example.uvprojx | 5 ++ examples/modbus_slave/README.txt | 2 +- examples/modbus_slave/SRC/main.c | 36 ++++----- .../project_template/MDK/use_example.uvoptx | 58 ++++--------- .../project_template/MDK/use_example.uvprojx | 20 ++--- examples/ring_buffer/MDK/use_example.uvoptx | 14 +++- examples/ring_buffer/MDK/use_example.uvprojx | 5 ++ examples/sync_method/MDK/use_example.uvoptx | 14 +++- examples/sync_method/MDK/use_example.uvprojx | 5 ++ 22 files changed, 211 insertions(+), 205 deletions(-) diff --git a/examples/command_line/MDK/use_example.uvoptx b/examples/command_line/MDK/use_example.uvoptx index 2fec47e..11a306d 100644 --- a/examples/command_line/MDK/use_example.uvoptx +++ b/examples/command_line/MDK/use_example.uvoptx @@ -591,6 +591,18 @@ 0 0 + + 5 + 32 + 1 + 0 + 0 + 0 + ..\..\..\drivers\common\common_include.c + common_include.c + 0 + 0 + @@ -601,7 +613,7 @@ 0 6 - 32 + 33 5 0 0 diff --git a/examples/command_line/MDK/use_example.uvprojx b/examples/command_line/MDK/use_example.uvprojx index e0e1f1a..266a511 100644 --- a/examples/command_line/MDK/use_example.uvprojx +++ b/examples/command_line/MDK/use_example.uvprojx @@ -556,6 +556,11 @@ 1 ..\..\..\drivers\modules\command_line.c + + common_include.c + 1 + ..\..\..\drivers\common\common_include.c + diff --git a/examples/input_output/MDK/use_example.uvoptx b/examples/input_output/MDK/use_example.uvoptx index 2f453ac..3db0c71 100644 --- a/examples/input_output/MDK/use_example.uvoptx +++ b/examples/input_output/MDK/use_example.uvoptx @@ -615,6 +615,18 @@ 0 0 + + 5 + 34 + 1 + 0 + 0 + 0 + ..\..\..\drivers\common\common_include.c + common_include.c + 0 + 0 + @@ -625,7 +637,7 @@ 0 6 - 34 + 35 5 0 0 diff --git a/examples/input_output/MDK/use_example.uvprojx b/examples/input_output/MDK/use_example.uvprojx index a4c6265..b54df4e 100644 --- a/examples/input_output/MDK/use_example.uvprojx +++ b/examples/input_output/MDK/use_example.uvprojx @@ -568,6 +568,11 @@ 1 ..\..\..\drivers\modules\input_output.c + + common_include.c + 1 + ..\..\..\drivers\common\common_include.c + diff --git a/examples/memory/MDK/use_example.uvoptx b/examples/memory/MDK/use_example.uvoptx index c5fa07c..b3155d0 100644 --- a/examples/memory/MDK/use_example.uvoptx +++ b/examples/memory/MDK/use_example.uvoptx @@ -591,6 +591,18 @@ 0 0 + + 5 + 32 + 1 + 0 + 0 + 0 + ..\..\..\drivers\common\common_include.c + common_include.c + 0 + 0 + @@ -601,7 +613,7 @@ 0 6 - 32 + 33 5 0 0 diff --git a/examples/memory/MDK/use_example.uvprojx b/examples/memory/MDK/use_example.uvprojx index 667da16..9acda5c 100644 --- a/examples/memory/MDK/use_example.uvprojx +++ b/examples/memory/MDK/use_example.uvprojx @@ -556,6 +556,11 @@ 1 ..\..\..\drivers\modules\memory.c + + common_include.c + 1 + ..\..\..\drivers\common\common_include.c + diff --git a/examples/message_queue/MDK/use_example.uvoptx b/examples/message_queue/MDK/use_example.uvoptx index d982fc0..f4a6481 100644 --- a/examples/message_queue/MDK/use_example.uvoptx +++ b/examples/message_queue/MDK/use_example.uvoptx @@ -591,6 +591,18 @@ 0 0 + + 5 + 32 + 1 + 0 + 0 + 0 + ..\..\..\drivers\common\common_include.c + common_include.c + 0 + 0 + @@ -601,7 +613,7 @@ 0 6 - 32 + 33 5 0 0 diff --git a/examples/message_queue/MDK/use_example.uvprojx b/examples/message_queue/MDK/use_example.uvprojx index 24a50b1..a18b1cd 100644 --- a/examples/message_queue/MDK/use_example.uvprojx +++ b/examples/message_queue/MDK/use_example.uvprojx @@ -556,6 +556,11 @@ 1 ..\..\..\drivers\modules\message_queue.c + + common_include.c + 1 + ..\..\..\drivers\common\common_include.c + diff --git a/examples/modbus_host/MDK/use_example.uvoptx b/examples/modbus_host/MDK/use_example.uvoptx index 3063e39..366d570 100644 --- a/examples/modbus_host/MDK/use_example.uvoptx +++ b/examples/modbus_host/MDK/use_example.uvoptx @@ -148,72 +148,7 @@ UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32F10x_128 -FS08000000 -FL020000 -FP0($$Device:STM32F103C8$Flash\STM32F10x_128.FLM)) - - - 0 - 0 - 115 - 1 -
0
- 0 - 0 - 0 - 0 - 0 - 0 - ..\SRC\main.c - - -
- - 1 - 0 - 159 - 1 -
0
- 0 - 0 - 0 - 0 - 0 - 0 - ..\SRC\main.c - - -
- - 2 - 0 - 158 - 1 -
0
- 0 - 0 - 0 - 0 - 0 - 0 - ..\SRC\main.c - - -
- - 3 - 0 - 162 - 1 -
134222676
- 0 - 0 - 0 - 0 - 0 - 1 - ..\SRC\main.c - - \\use_example\../SRC/main.c\162 -
-
+ 0 @@ -712,6 +647,18 @@ 0 0 + + 5 + 35 + 1 + 0 + 0 + 0 + ..\..\..\drivers\common\common_include.c + common_include.c + 0 + 0 +
@@ -722,7 +669,7 @@ 0 6 - 35 + 36 5 0 0 diff --git a/examples/modbus_host/MDK/use_example.uvprojx b/examples/modbus_host/MDK/use_example.uvprojx index 02fb4f8..255512b 100644 --- a/examples/modbus_host/MDK/use_example.uvprojx +++ b/examples/modbus_host/MDK/use_example.uvprojx @@ -573,6 +573,11 @@ 1 ..\..\..\drivers\modbus\modbus_common.c + + common_include.c + 1 + ..\..\..\drivers\common\common_include.c + diff --git a/examples/modbus_host/README.txt b/examples/modbus_host/README.txt index 8bf433e..16db2f1 100644 --- a/examples/modbus_host/README.txt +++ b/examples/modbus_host/README.txt @@ -2,7 +2,7 @@ 用例使用说明 ================================================================================ Date Author MDK MCU -2023-10-25 ashuai0110 5.35 STM32F1 +2024-01-02 ashuai0110 5.35 STM32F1 ================================================================================ 功能描述 diff --git a/examples/modbus_host/SRC/main.c b/examples/modbus_host/SRC/main.c index 06cee9f..1d91e7b 100644 --- a/examples/modbus_host/SRC/main.c +++ b/examples/modbus_host/SRC/main.c @@ -3,7 +3,7 @@ * @file main.c * @author ashuai0110 * @version V1.0 - * @date 2023-10-25 + * @date 2024-01-02 * @brief 使用举例-MODBUS主机程序 * ****************************************************************************** @@ -62,24 +62,8 @@ void TIM1_UP_IRQHandler(void) if(TIM_GetITStatus(TIM1, TIM_IT_Update) != RESET) { - /* modbus主机轮询处理 */ - ret = mb_host_poll(USART1_MB_CH); - /* 处理中 */ - if(RET_ING == ret) - { - } /* 应答处理完成 */ - else if(RET_OK == ret) - { - DEBUG_LOG("response success"); - } /* 应答超时 */ - else if(RET_TIMEOUT == ret) - { - WARN_LOG("response timeout"); - } /* 应答错误 */ - else - { - ERROR_LOG("response error: %s", modbusErrorStr[ret - RET_LEN_ERR]); - } + /* 组件计时节拍接口 */ + module_tick_inc(1); TIM_ClearITPendingBit(TIM1, TIM_FLAG_Update); } @@ -156,7 +140,7 @@ int main(int argc, char *argv[]) mb_host_init(USART1_MB_CH, MB_RTU, modbusBuf, sizeof(modbusBuf), uart_tx_en, 9600, 500); /* 发送读取线圈命令 */ - mb_host_send_cmd(USART1_MB_CH, 0x1, 0x1, 0x2, 8, NULL); + mb_host_send_cmd(USART1_MB_CH, 0x1, 0x1, 0x0, 8, NULL); /* 发送读取离散输入命令 */ // mb_host_send_cmd(USART1_MB_CH, 0x1, 0x2, 0x0, 8, NULL); /* 发送读取保持寄存器命令 */ @@ -179,7 +163,25 @@ int main(int argc, char *argv[]) while(1) { - + uint8_t ret; + /* modbus主机轮询处理 */ + ret = mb_host_poll(USART1_MB_CH); + /* 处理中 */ + if(RET_ING == ret) + { + } /* 应答处理完成 */ + else if(RET_OK == ret) + { + DEBUG_LOG("response success"); + } /* 应答超时 */ + else if(RET_TIMEOUT == ret) + { + WARN_LOG("response timeout"); + } /* 应答错误 */ + else + { + ERROR_LOG("response error: %s", modbusErrorStr[ret - RET_LEN_ERR]); + } } } diff --git a/examples/modbus_slave/MDK/use_example.uvoptx b/examples/modbus_slave/MDK/use_example.uvoptx index c33b0c9..7acadbc 100644 --- a/examples/modbus_slave/MDK/use_example.uvoptx +++ b/examples/modbus_slave/MDK/use_example.uvoptx @@ -148,40 +148,7 @@ UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32F10x_128 -FS08000000 -FL020000 -FP0($$Device:STM32F103C8$Flash\STM32F10x_128.FLM)) - - - 0 - 0 - 94 - 1 -
0
- 0 - 0 - 0 - 0 - 0 - 0 - ..\SRC\main.c - - -
- - 1 - 0 - 368 - 1 -
0
- 0 - 0 - 0 - 0 - 0 - 0 - ..\..\..\drivers\modbus\modbus_slave.c - - -
-
+ 0 @@ -680,6 +647,18 @@ 0 0 + + 5 + 35 + 1 + 0 + 0 + 0 + ..\..\..\drivers\common\common_include.c + common_include.c + 0 + 0 +
@@ -690,7 +669,7 @@ 0 6 - 35 + 36 5 0 0 diff --git a/examples/modbus_slave/MDK/use_example.uvprojx b/examples/modbus_slave/MDK/use_example.uvprojx index 112bd42..10305c0 100644 --- a/examples/modbus_slave/MDK/use_example.uvprojx +++ b/examples/modbus_slave/MDK/use_example.uvprojx @@ -573,6 +573,11 @@ 1 ..\..\..\drivers\modbus\modbus_slave.c + + common_include.c + 1 + ..\..\..\drivers\common\common_include.c + diff --git a/examples/modbus_slave/README.txt b/examples/modbus_slave/README.txt index 34068c5..9b22906 100644 --- a/examples/modbus_slave/README.txt +++ b/examples/modbus_slave/README.txt @@ -2,7 +2,7 @@ 用例使用说明 ================================================================================ Date Author MDK MCU -2023-10-25 ashuai0110 5.35 STM32F1 +2024-01-02 ashuai0110 5.35 STM32F1 ================================================================================ 功能描述 diff --git a/examples/modbus_slave/SRC/main.c b/examples/modbus_slave/SRC/main.c index 75856af..aeed611 100644 --- a/examples/modbus_slave/SRC/main.c +++ b/examples/modbus_slave/SRC/main.c @@ -3,7 +3,7 @@ * @file main.c * @author ashuai0110 * @version V1.0 - * @date 2023-10-25 + * @date 2024-01-02 * @brief 使用举例-MODBUS从机程序 * ****************************************************************************** @@ -53,24 +53,10 @@ uint16_t inputRegister[8] = {0x555, 0x666, 0x777, 0x888}; /* 输入寄存器 */ void TIM1_UP_IRQHandler(void) { - static uint8_t ret; - if(TIM_GetITStatus(TIM1, TIM_IT_Update) != RESET) { - /* modbus从机轮询处理 */ - ret = mb_slave_poll(USART1_MB_CH); - /* 处理中 */ - if(RET_ING == ret) - { - } /* 请求处理完成 */ - else if(RET_OK == ret) - { - DEBUG_LOG("request success"); - } /* 请求错误 */ - else - { - ERROR_LOG("request error: %s", modbusErrorStr[ret - RET_LEN_ERR]); - } + /* 组件计时节拍接口 */ + module_tick_inc(1); TIM_ClearITPendingBit(TIM1, TIM_FLAG_Update); } @@ -148,7 +134,21 @@ int main(int argc, char *argv[]) while(1) { - + uint8_t ret; + /* modbus从机轮询处理 */ + ret = mb_slave_poll(USART1_MB_CH); + /* 处理中 */ + if(RET_ING == ret) + { + } /* 请求处理完成 */ + else if(RET_OK == ret) + { + DEBUG_LOG("request success"); + } /* 请求错误 */ + else + { + ERROR_LOG("request error: %s", modbusErrorStr[ret - RET_LEN_ERR]); + } } } diff --git a/examples/project_template/MDK/use_example.uvoptx b/examples/project_template/MDK/use_example.uvoptx index f262c89..72d00f9 100644 --- a/examples/project_template/MDK/use_example.uvoptx +++ b/examples/project_template/MDK/use_example.uvoptx @@ -610,24 +610,12 @@ 7 32 - 5 - 0 - 0 - 0 - ..\..\..\drivers\common\all_include.h - all_include.h - 0 - 0 - - - 7 - 33 - 5 + 1 0 0 0 - ..\..\..\drivers\common\common_include.h - common_include.h + ..\..\..\drivers\common\common_include.c + common_include.c 0 0 @@ -641,7 +629,7 @@ 0 8 - 34 + 33 1 0 0 @@ -653,7 +641,7 @@ 8 - 35 + 34 1 0 0 @@ -665,7 +653,7 @@ 8 - 36 + 35 1 0 0 @@ -685,7 +673,7 @@ 0 9 - 37 + 36 1 0 0 @@ -697,7 +685,7 @@ 9 - 38 + 37 1 0 0 @@ -709,7 +697,7 @@ 9 - 39 + 38 1 0 0 @@ -721,7 +709,7 @@ 9 - 40 + 39 1 0 0 @@ -733,7 +721,7 @@ 9 - 41 + 40 1 0 0 @@ -745,7 +733,7 @@ 9 - 42 + 41 1 0 0 @@ -757,7 +745,7 @@ 9 - 43 + 42 1 0 0 @@ -769,7 +757,7 @@ 9 - 44 + 43 1 0 0 @@ -781,19 +769,7 @@ 9 - 45 - 1 - 0 - 0 - 0 - ..\..\..\drivers\modules\ring_queue.c - ring_queue.c - 0 - 0 - - - 9 - 46 + 44 1 0 0 @@ -805,7 +781,7 @@ 9 - 47 + 45 1 0 0 @@ -817,7 +793,7 @@ 9 - 48 + 46 1 0 0 diff --git a/examples/project_template/MDK/use_example.uvprojx b/examples/project_template/MDK/use_example.uvprojx index 68ccfc9..281d9c3 100644 --- a/examples/project_template/MDK/use_example.uvprojx +++ b/examples/project_template/MDK/use_example.uvprojx @@ -16,8 +16,8 @@ STM32F103C8 STMicroelectronics - Keil.STM32F1xx_DFP.2.4.0 - http://www.keil.com/pack/ + Keil.STM32F1xx_DFP.2.4.1 + https://www.keil.com/pack/ IRAM(0x20000000,0x00005000) IROM(0x08000000,0x00010000) CPUTYPE("Cortex-M3") CLOCK(12000000) ELITTLE @@ -567,14 +567,9 @@ drivers/common - all_include.h - 5 - ..\..\..\drivers\common\all_include.h - - - common_include.h - 5 - ..\..\..\drivers\common\common_include.h + common_include.c + 1 + ..\..\..\drivers\common\common_include.c @@ -641,11 +636,6 @@ 1 ..\..\..\drivers\modules\ring_buffer.c - - ring_queue.c - 1 - ..\..\..\drivers\modules\ring_queue.c - sync_method.c 1 diff --git a/examples/ring_buffer/MDK/use_example.uvoptx b/examples/ring_buffer/MDK/use_example.uvoptx index 11547f7..4c8d44b 100644 --- a/examples/ring_buffer/MDK/use_example.uvoptx +++ b/examples/ring_buffer/MDK/use_example.uvoptx @@ -603,6 +603,18 @@ 0 0 + + 5 + 33 + 1 + 0 + 0 + 0 + ..\..\..\drivers\common\common_include.c + common_include.c + 0 + 0 + @@ -613,7 +625,7 @@ 0 6 - 33 + 34 5 0 0 diff --git a/examples/ring_buffer/MDK/use_example.uvprojx b/examples/ring_buffer/MDK/use_example.uvprojx index 6f13d6b..b08c80b 100644 --- a/examples/ring_buffer/MDK/use_example.uvprojx +++ b/examples/ring_buffer/MDK/use_example.uvprojx @@ -563,6 +563,11 @@ 1 ..\..\..\drivers\modules\ring_buffer.c + + common_include.c + 1 + ..\..\..\drivers\common\common_include.c + diff --git a/examples/sync_method/MDK/use_example.uvoptx b/examples/sync_method/MDK/use_example.uvoptx index 40ea031..dead219 100644 --- a/examples/sync_method/MDK/use_example.uvoptx +++ b/examples/sync_method/MDK/use_example.uvoptx @@ -603,6 +603,18 @@ 0 0 + + 5 + 33 + 1 + 0 + 0 + 0 + ..\..\..\drivers\common\common_include.c + common_include.c + 0 + 0 + @@ -613,7 +625,7 @@ 0 6 - 33 + 34 5 0 0 diff --git a/examples/sync_method/MDK/use_example.uvprojx b/examples/sync_method/MDK/use_example.uvprojx index f08b1f4..fb333ba 100644 --- a/examples/sync_method/MDK/use_example.uvprojx +++ b/examples/sync_method/MDK/use_example.uvprojx @@ -563,6 +563,11 @@ 1 ..\..\..\drivers\modules\sync_method.c + + common_include.c + 1 + ..\..\..\drivers\common\common_include.c + -- Gitee From a57b9076da8cc259d95cf64ac6c0f9638deb2bb7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=98=BF=E8=A1=B00110?= Date: Tue, 2 Jan 2024 20:23:50 +0800 Subject: [PATCH 28/66] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E4=BB=8E=E7=BB=84?= =?UTF-8?q?=E4=BB=B6=E8=AE=A1=E6=97=B6=E8=8A=82=E6=8B=8D=E6=8E=A5=E5=8F=A3?= =?UTF-8?q?=E8=8E=B7=E5=8F=96=E6=97=B6=E5=9F=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- drivers/modbus/modbus_host.c | 27 ++++++++++------------- drivers/modbus/modbus_host.h | 41 ++++++++++++++++++----------------- drivers/modbus/modbus_slave.c | 15 +++++-------- drivers/modbus/modbus_slave.h | 22 +++++++++---------- 4 files changed, 49 insertions(+), 56 deletions(-) diff --git a/drivers/modbus/modbus_host.c b/drivers/modbus/modbus_host.c index 89fcd64..64b0ec1 100644 --- a/drivers/modbus/modbus_host.c +++ b/drivers/modbus/modbus_host.c @@ -3,7 +3,7 @@ * @file modbus_host.c * @author ashuai0110 * @version V2.1 - * @date 2023-10-27 + * @date 2024-01-02 * @brief modbus主机程序(RTU ASCII) * ****************************************************************************** @@ -15,6 +15,7 @@ * Change Logs: * Date Author Notes * 2023-10-27 ashuai0110 完成基本内容 + * 2024-01-02 ashuai0110 修改从组件计时节拍接口获取时基 * ****************************************************************************** */ @@ -340,27 +341,21 @@ static void mb_host_cmd_10h(uint8_t ch, uint8_t slaveAddr, uint16_t reg, uint16_ * * @retval None */ -void mb_host_init(uint8_t ch, uint8_t protocol, void *pBuf, uint16_t bufLen, modbus_tx_en_t txEnFn, uint32_t baud, uint16_t rspTimeout) +void mb_host_init(uint8_t ch, uint8_t protocol, void *pBuf, uint16_t bufLen, modbus_tx_en_t txEnFn, uint32_t baud, uint32_t rspTimeout) { ASSERT_PARAM(IS_VALID_MBH_CH(ch)); ASSERT_PARAM(IS_VALID_MB_PROTOCOL(protocol)); ASSERT_PARAM(IS_VALID_POINT(pBuf)); ASSERT_PARAM(IS_VALID_POINT(txEnFn)); + /* 初始化各参数 */ + memset((void *)&mbHostArr[ch], 0, sizeof(mb_host_t)); mbHostArr[ch].dataBuf = (uint8_t *)pBuf; mbHostArr[ch].dataBufLen = bufLen; - mbHostArr[ch].dataLen = 0; - mbHostArr[ch].readLen = 0; - mbHostArr[ch].protocol = protocol; mbHostArr[ch].state = MB_TX_IDLE; - mbHostArr[ch].broadcast = 0; - mb_host_set_frame_intv(ch, baud); - mbHostArr[ch].curFrameIntv = 0; mbHostArr[ch].rspTimeout = rspTimeout; - mbHostArr[ch].rspTimeoutCnt = 0; - mbHostArr[ch].txEnFn = txEnFn; } @@ -392,14 +387,14 @@ uint8_t mb_host_poll(uint8_t ch) case MB_TX_BUSY: break; case MB_RX_IDLE: /* 应答超时判断 */ - if(mbHostArr[ch].rspTimeoutCnt && mbHostArr[ch].rspTimeoutCnt++ > mbHostArr[ch].rspTimeout) + if(mbHostArr[ch].rspTimeoutCnt && (module_tick_get() - mbHostArr[ch].rspTimeoutCnt) > mbHostArr[ch].rspTimeout) { mbHostArr[ch].rspTimeoutCnt = 0; ret = RET_TIMEOUT; /* 应答超时 */ goto rspErr; } /* 帧间隔超时判断 */ - if(mbHostArr[ch].curFrameIntv && mbHostArr[ch].curFrameIntv++ > mbHostArr[ch].targetFrameIntv) + if(mbHostArr[ch].curFrameIntv && (module_tick_get() - mbHostArr[ch].curFrameIntv) > mbHostArr[ch].targetFrameIntv) { mbHostArr[ch].curFrameIntv = 0; mbHostArr[ch].state = MB_RX_BUSY; /* 切换状态 */ @@ -609,7 +604,7 @@ uint16_t mb_host_write_rx_buf(uint8_t ch, void *pBuf, uint16_t len) { memcpy((void *)&mbHostArr[ch].dataBuf[mbHostArr[ch].dataLen], pBuf, len); mbHostArr[ch].dataLen += len; - mbHostArr[ch].curFrameIntv = 1; /* 开启帧间隔超时计数 */ + mbHostArr[ch].curFrameIntv = module_tick_get(); /* 开启帧间隔超时计数 */ mbHostArr[ch].rspTimeoutCnt = 0; /* 关闭应答超时计数 */ return len; @@ -660,7 +655,7 @@ uint16_t mb_host_read_tx_buf(uint8_t ch, void *pBuf, uint16_t len) } else { - mbHostArr[ch].rspTimeoutCnt = 1; /* 开启应答超时计数 */ + mbHostArr[ch].rspTimeoutCnt = module_tick_get(); /* 开启应答超时计数 */ mbHostArr[ch].state = MB_RX_IDLE; /* 切换状态 */ } } @@ -756,7 +751,7 @@ uint16_t mb_host_get_frame_intv(uint8_t ch) * * @retval None */ -void mb_host_set_rsp_timeout(uint8_t ch, uint16_t timeout) +void mb_host_set_rsp_timeout(uint8_t ch, uint32_t timeout) { ASSERT_PARAM(IS_VALID_MBH_CH(ch)); @@ -770,7 +765,7 @@ void mb_host_set_rsp_timeout(uint8_t ch, uint16_t timeout) * * @retval 应答超时时间ms */ -uint16_t mb_host_get_rsp_timeout(uint8_t ch) +uint32_t mb_host_get_rsp_timeout(uint8_t ch) { ASSERT_PARAM(IS_VALID_MBH_CH(ch)); diff --git a/drivers/modbus/modbus_host.h b/drivers/modbus/modbus_host.h index fb83d83..e3d7f88 100644 --- a/drivers/modbus/modbus_host.h +++ b/drivers/modbus/modbus_host.h @@ -3,7 +3,7 @@ * @file modbus_host.h * @author ashuai0110 * @version V2.1 - * @date 2023-10-27 + * @date 2024-01-02 * @brief modbus主机程序(RTU ASCII) * ****************************************************************************** @@ -59,24 +59,24 @@ extern "C" { * @brief modbus主机 structure definition */ typedef struct mb_host { - uint8_t *dataBuf; /*!< 数据缓存区 */ - uint16_t dataBufLen; /*!< 数据缓存区长度 */ - uint16_t dataLen; /*!< 数据长度 */ - uint16_t readLen; /*!< 读出数据长度 */ + uint8_t *dataBuf; /*!< 数据缓存区 */ + uint16_t dataBufLen; /*!< 数据缓存区长度 */ + uint16_t dataLen; /*!< 数据长度 */ + uint16_t readLen; /*!< 读出数据长度 */ - uint8_t protocol : 1; /*!< 协议类型 @ref modbus_common_protocol */ - uint8_t state : 2; /*!< 应答状态 @ref modbus_common_state */ - uint8_t broadcast : 1; /*!< 广播标志 0:非广播 1:广播 */ + uint8_t protocol : 1; /*!< 协议类型 @ref modbus_common_protocol */ + uint8_t state : 2; /*!< 应答状态 @ref modbus_common_state */ + uint8_t broadcast : 1; /*!< 广播标志 0:非广播 1:广播 */ - uint16_t targetFrameIntv; /*!< 目标帧间隔ms */ - uint16_t curFrameIntv; /*!< 当前帧间隔ms */ - uint16_t rspTimeoutCnt; /*!< 应答超时计数ms */ - uint16_t rspTimeout; /*!< 应答超时时间ms */ - uint8_t slaveTmp; /*!< 主机命令中的从机地址暂存 */ - uint16_t regTmp; /*!< 主机命令中的起始地址暂存 */ - uint16_t numTmp; /*!< 主机命令中的数量暂存 */ - - modbus_tx_en_t txEnFn; /*!< 主机发送前(串口)准备函数 */ + uint8_t targetFrameIntv; /*!< 目标帧间隔ms */ + uint32_t curFrameIntv; /*!< 当前帧间隔ms */ + uint32_t rspTimeoutCnt; /*!< 应答超时计数ms */ + uint32_t rspTimeout; /*!< 应答超时时间ms */ + uint8_t slaveTmp; /*!< 主机命令中的从机地址暂存 */ + uint16_t regTmp; /*!< 主机命令中的起始地址暂存 */ + uint16_t numTmp; /*!< 主机命令中的数量暂存 */ + + modbus_tx_en_t txEnFn; /*!< 主机发送前(串口)准备函数 */ } mb_host_t; /** @@ -91,7 +91,7 @@ typedef struct mb_host { * @{ */ -void mb_host_init(uint8_t ch, uint8_t protocol, void *pBuf, uint16_t bufLen, modbus_tx_en_t txEnFn, uint32_t baud, uint16_t rspTimeout); +void mb_host_init(uint8_t ch, uint8_t protocol, void *pBuf, uint16_t bufLen, modbus_tx_en_t txEnFn, uint32_t baud, uint32_t rspTimeout); uint8_t mb_host_poll(uint8_t ch); @@ -100,12 +100,13 @@ uint8_t mb_host_send_cmd(uint8_t ch, uint8_t slaveAddr, uint8_t funCode, uint16_ uint16_t mb_host_write_rx_buf(uint8_t ch, void *pBuf, uint16_t len); uint16_t mb_host_read_tx_buf(uint8_t ch, void *pBuf, uint16_t len); +/* set/get interface */ void mb_host_set_protocol(uint8_t ch, uint8_t protocol); uint8_t mb_host_get_protocol(uint8_t ch); void mb_host_set_frame_intv(uint8_t ch, uint32_t baud); uint16_t mb_host_get_frame_intv(uint8_t ch); -void mb_host_set_rsp_timeout(uint8_t ch, uint16_t timeout); -uint16_t mb_host_get_rsp_timeout(uint8_t ch); +void mb_host_set_rsp_timeout(uint8_t ch, uint32_t timeout); +uint32_t mb_host_get_rsp_timeout(uint8_t ch); /* 弱定义函数 */ void mb_host_rsp_01h(uint8_t ch, uint16_t reg, uint16_t num, uint8_t *pData); diff --git a/drivers/modbus/modbus_slave.c b/drivers/modbus/modbus_slave.c index 3f1272d..ff39bfa 100644 --- a/drivers/modbus/modbus_slave.c +++ b/drivers/modbus/modbus_slave.c @@ -3,7 +3,7 @@ * @file modbus_slave.c * @author ashuai0110 * @version V2.1 - * @date 2023-10-27 + * @date 2024-01-02 * @brief modbus从机程序(RTU ASCII) * ****************************************************************************** @@ -15,6 +15,7 @@ * Change Logs: * Date Author Notes * 2023-10-27 ashuai0110 完成基本内容 + * 2024-01-02 ashuai0110 修改从组件计时节拍接口获取时基 * ****************************************************************************** */ @@ -235,18 +236,14 @@ void mb_slave_init(uint8_t ch, uint8_t slaveAddr, uint8_t protocol, void *pBuf, ASSERT_PARAM(IS_VALID_POINT(pBuf)); ASSERT_PARAM(IS_VALID_POINT(txEnFn)); + /* 初始化各参数 */ + memset((void *)&mbSlaveArr[ch], 0, sizeof(mb_slave_t)); mbSlaveArr[ch].dataBuf = (uint8_t *)pBuf; mbSlaveArr[ch].dataBufLen = bufLen; - mbSlaveArr[ch].dataLen = 0; - mbSlaveArr[ch].readLen = 0; - mbSlaveArr[ch].slaveAddr = slaveAddr; mbSlaveArr[ch].protocol = protocol; mbSlaveArr[ch].state = MB_RX_IDLE; - mb_slave_set_frame_intv(ch, baud); - mbSlaveArr[ch].curFrameIntv = 0; - mbSlaveArr[ch].txEnFn = txEnFn; } @@ -277,7 +274,7 @@ uint8_t mb_slave_poll(uint8_t ch) case MB_TX_BUSY: break; case MB_RX_IDLE: /* 帧间隔超时判断 */ - if(mbSlaveArr[ch].curFrameIntv && mbSlaveArr[ch].curFrameIntv++ > mbSlaveArr[ch].targetFrameIntv) + if(mbSlaveArr[ch].curFrameIntv && (module_tick_get() - mbSlaveArr[ch].curFrameIntv) > mbSlaveArr[ch].targetFrameIntv) { mbSlaveArr[ch].curFrameIntv = 0; mbSlaveArr[ch].state = MB_RX_BUSY; /* 切换状态 */ @@ -410,7 +407,7 @@ uint16_t mb_slave_write_rx_buf(uint8_t ch, void *pBuf, uint16_t len) { memcpy((void *)&mbSlaveArr[ch].dataBuf[mbSlaveArr[ch].dataLen], pBuf, len); mbSlaveArr[ch].dataLen += len; - mbSlaveArr[ch].curFrameIntv = 1; /* 开启帧间隔超时计数 */ + mbSlaveArr[ch].curFrameIntv = module_tick_get(); /* 开启帧间隔超时计数 */ return len; } diff --git a/drivers/modbus/modbus_slave.h b/drivers/modbus/modbus_slave.h index 6104e85..7aef826 100644 --- a/drivers/modbus/modbus_slave.h +++ b/drivers/modbus/modbus_slave.h @@ -3,7 +3,7 @@ * @file modbus_slave.h * @author ashuai0110 * @version V2.1 - * @date 2023-10-27 + * @date 2024-01-02 * @brief modbus从机程序(RTU ASCII) * ****************************************************************************** @@ -59,19 +59,19 @@ extern "C" { * @brief modbus从机 structure definition */ typedef struct mb_slave { - uint8_t *dataBuf; /*!< 数据缓存区 */ - uint16_t dataBufLen; /*!< 数据缓存区长度 */ - uint16_t dataLen; /*!< 数据长度 */ - uint16_t readLen; /*!< 读出数据长度 */ + uint8_t *dataBuf; /*!< 数据缓存区 */ + uint16_t dataBufLen; /*!< 数据缓存区长度 */ + uint16_t dataLen; /*!< 数据长度 */ + uint16_t readLen; /*!< 读出数据长度 */ - uint8_t slaveAddr; /*!< 从机地址 1~247 */ - uint8_t protocol : 1; /*!< 协议类型 @ref modbus_common_protocol */ - uint8_t state : 2; /*!< 请求状态 @ref modbus_common_state */ + uint8_t slaveAddr; /*!< 从机地址 1~247 */ + uint8_t protocol : 1; /*!< 协议类型 @ref modbus_common_protocol */ + uint8_t state : 2; /*!< 请求状态 @ref modbus_common_state */ - uint16_t targetFrameIntv; /*!< 目标帧间隔ms */ - uint16_t curFrameIntv; /*!< 当前帧间隔ms */ + uint8_t targetFrameIntv; /*!< 目标帧间隔ms */ + uint32_t curFrameIntv; /*!< 当前帧间隔ms */ - modbus_tx_en_t txEnFn; /*!< 从机发送前(串口)准备函数 */ + modbus_tx_en_t txEnFn; /*!< 从机发送前(串口)准备函数 */ } mb_slave_t; /** -- Gitee From 4cfb893c4e7bf49f56a35d3ebbaa191af3fdcb66 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=98=BF=E8=A1=B00110?= Date: Tue, 2 Jan 2024 20:25:24 +0800 Subject: [PATCH 29/66] =?UTF-8?q?=E9=83=A8=E5=88=86=E5=86=85=E5=AE=B9?= =?UTF-8?q?=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- drivers/common/all_include.h | 7 +++---- drivers/modules/memory.h | 2 +- drivers/modules/uart_handler.c | 9 ++++++--- 3 files changed, 10 insertions(+), 8 deletions(-) diff --git a/drivers/common/all_include.h b/drivers/common/all_include.h index 9cfa636..3032125 100644 --- a/drivers/common/all_include.h +++ b/drivers/common/all_include.h @@ -3,7 +3,7 @@ * @file all_include.h * @author ashuai0110 * @version V2.1 - * @date 2023-10-21 + * @date 2024-01-02 * @brief 所有组件头文件集合 * ****************************************************************************** @@ -24,7 +24,7 @@ extern "C" { /* 包含头文件-----------------------------------------------------------------*/ /* common */ -#include "common_include.h" /*!< 通用接口 */ +#include "common_include.h" /*!< 公共引用文件(所有组件都需包含此文件) */ /* modbus */ #include "modbus_common.h" /*!< modbus通用文件 */ #include "modbus_host.h" /*!< modbus主机程序(RTU ASCII) */ @@ -35,10 +35,9 @@ extern "C" { #include "data_convert.h" /*!< 数据转换方法集合 */ #include "delay_no_block.h" /*!< 非阻塞延时 */ #include "input_output.h" /*!< IO输入输出操作 */ -#include "memory.h" /*!< 内存管理-小内存管理算法 */ +#include "memory.h" /*!< 内存管理 */ #include "message_queue.h" /*!< 消息队列 */ #include "ring_buffer.h" /*!< 环形缓冲区 */ -#include "ring_queue.h" /*!< 环形队列 */ #include "sync_method.h" /*!< 伪线程同步(信号量,互斥锁,事件集) */ #include "timer_software.h" /*!< 软件定时器 */ #include "uart_handler.h" /*!< 串口管理 */ diff --git a/drivers/modules/memory.h b/drivers/modules/memory.h index 795ae6e..4a8ffd4 100644 --- a/drivers/modules/memory.h +++ b/drivers/modules/memory.h @@ -44,7 +44,7 @@ extern "C" { #define MEM_SIZE (1024u) /*!< 内存管理总字节数(28至2MB) 用户按需修改 */ #define MEM_ALIGN_SIZE (4u) /*!< 最小对齐字节数(默认4字节) */ #define MEM_CODE (0x1EA0u) /*!< 内存管理标识(默认0x1EA0) */ -#define _MEM_STATES (0u) /*!< 内存用量统计 0:关闭 1:开启 */ +#define _MEM_STATES (1u) /*!< 内存用量统计 0:关闭 1:开启 */ /** * @} diff --git a/drivers/modules/uart_handler.c b/drivers/modules/uart_handler.c index 6fefa95..bde0a15 100644 --- a/drivers/modules/uart_handler.c +++ b/drivers/modules/uart_handler.c @@ -133,9 +133,8 @@ uint8_t uart_hr_poll(uint8_t ch) /* 帧间隔判断 */ if(uartHandlerArr[ch].curFrameIntv && (module_tick_get() - uartHandlerArr[ch].curFrameIntv) > uartHandlerArr[ch].targetFrameIntv) { - /* 置零帧间隔和接收超时 */ + /* 置零帧间隔计数 */ uartHandlerArr[ch].curFrameIntv = 0; - uartHandlerArr[ch].recTimeoutCnt = 0; return RET_OK; } @@ -193,7 +192,11 @@ uint32_t uart_hr_write_rx_buf(uint8_t ch, void *pBuf, uint32_t len) /* 向环形缓冲区写入数据 */ len = ring_buffer_write(&uartHandlerArr[ch].rxRingBuffer, pBuf, len); /* 若实际写入长度不为0则开启帧间隔计数 */ - if(len) { uartHandlerArr[ch].curFrameIntv = module_tick_get(); } + if(0 < len) + { + uartHandlerArr[ch].curFrameIntv = module_tick_get(); /* 开启帧间隔超时计数 */ + uartHandlerArr[ch].recTimeoutCnt = 0; /* 关闭接收超时计数 */ + } return len; } -- Gitee From dd3880a003f75ef98f5a5aed62be2c40f9cb5ce2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=98=BF=E8=A1=B00110?= Date: Thu, 4 Jan 2024 21:04:45 +0800 Subject: [PATCH 30/66] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E7=BB=84=E4=BB=B6?= =?UTF-8?q?=E8=AE=A1=E6=97=B6=E8=8A=82=E6=8B=8D=E5=88=9D=E5=80=BC=E4=B8=BA?= =?UTF-8?q?1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- drivers/common/common_include.c | 5 +++-- drivers/common/common_include.h | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/drivers/common/common_include.c b/drivers/common/common_include.c index 9a0f585..a8a5a40 100644 --- a/drivers/common/common_include.c +++ b/drivers/common/common_include.c @@ -3,7 +3,7 @@ * @file common_include.c * @author ashuai0110 * @version V2.1 - * @date 2023-12-28 + * @date 2024-01-04 * @brief 公共引用文件(所有组件都需包含此文件) * ****************************************************************************** @@ -16,6 +16,7 @@ * Date Author Notes * 2023-10-17 ashuai0110 完成基本内容 * 2023-12-28 ashuai0110 新增组件计时节拍接口 + * 2024-01-04 ashuai0110 修改组件计时节拍初值为1 * ****************************************************************************** */ @@ -43,7 +44,7 @@ * @{ */ -static volatile uint32_t moduleTick; /* 组件计时节拍(计时溢出需49.7天,溢出后可能造成计时异常影响组件功能) */ +static volatile uint32_t moduleTick = 1; /* 组件计时节拍(计时溢出需49.7天,溢出后可能造成计时异常影响组件功能) */ /** * @} diff --git a/drivers/common/common_include.h b/drivers/common/common_include.h index aee421e..db482e3 100644 --- a/drivers/common/common_include.h +++ b/drivers/common/common_include.h @@ -3,7 +3,7 @@ * @file common_include.h * @author ashuai0110 * @version V2.1 - * @date 2023-12-28 + * @date 2024-01-04 * @brief 公共引用文件(所有组件都需包含此文件) * ****************************************************************************** -- Gitee From 515da31270bbeca55ef96f78dcc4a8644608d61c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=98=BF=E8=A1=B00110?= Date: Thu, 4 Jan 2024 21:05:03 +0800 Subject: [PATCH 31/66] =?UTF-8?q?=E4=BC=98=E5=8C=96=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- drivers/modbus/modbus_host.c | 9 ++++++--- drivers/modbus/modbus_slave.c | 6 ++++-- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/drivers/modbus/modbus_host.c b/drivers/modbus/modbus_host.c index 64b0ec1..ebe4a96 100644 --- a/drivers/modbus/modbus_host.c +++ b/drivers/modbus/modbus_host.c @@ -376,6 +376,7 @@ void mb_host_init(uint8_t ch, uint8_t protocol, void *pBuf, uint16_t bufLen, mod */ uint8_t mb_host_poll(uint8_t ch) { + uint32_t tickTmp; uint16_t checkVal, startIndex, stopIndex; uint8_t ret = RET_ING; /* 进行中 */ @@ -386,15 +387,17 @@ uint8_t mb_host_poll(uint8_t ch) case MB_TX_IDLE: break; case MB_TX_BUSY: break; case MB_RX_IDLE: + tickTmp = mbHostArr[ch].rspTimeoutCnt; /* 应答超时判断 */ - if(mbHostArr[ch].rspTimeoutCnt && (module_tick_get() - mbHostArr[ch].rspTimeoutCnt) > mbHostArr[ch].rspTimeout) + if(tickTmp && (module_tick_get() - tickTmp) > mbHostArr[ch].rspTimeout) { mbHostArr[ch].rspTimeoutCnt = 0; ret = RET_TIMEOUT; /* 应答超时 */ goto rspErr; } + tickTmp = mbHostArr[ch].curFrameIntv; /* 帧间隔超时判断 */ - if(mbHostArr[ch].curFrameIntv && (module_tick_get() - mbHostArr[ch].curFrameIntv) > mbHostArr[ch].targetFrameIntv) + if(tickTmp && (module_tick_get() - tickTmp) > mbHostArr[ch].targetFrameIntv) { mbHostArr[ch].curFrameIntv = 0; mbHostArr[ch].state = MB_RX_BUSY; /* 切换状态 */ @@ -645,7 +648,7 @@ uint16_t mb_host_read_tx_buf(uint8_t ch, void *pBuf, uint16_t len) { memcpy(pBuf, (void *)&mbHostArr[ch].dataBuf[mbHostArr[ch].readLen], len); mbHostArr[ch].readLen += len; - if(0 >= (mbHostArr[ch].dataLen - mbHostArr[ch].readLen)) + if(mbHostArr[ch].dataLen == mbHostArr[ch].readLen) { mbHostArr[ch].dataLen = 0; mbHostArr[ch].readLen = 0; diff --git a/drivers/modbus/modbus_slave.c b/drivers/modbus/modbus_slave.c index ff39bfa..ffa99f5 100644 --- a/drivers/modbus/modbus_slave.c +++ b/drivers/modbus/modbus_slave.c @@ -263,6 +263,7 @@ void mb_slave_init(uint8_t ch, uint8_t slaveAddr, uint8_t protocol, void *pBuf, */ uint8_t mb_slave_poll(uint8_t ch) { + uint32_t tickTmp; uint16_t checkVal, startIndex, stopIndex; uint8_t ret = RET_ING; /* 进行中 */ @@ -273,8 +274,9 @@ uint8_t mb_slave_poll(uint8_t ch) case MB_TX_IDLE: break; case MB_TX_BUSY: break; case MB_RX_IDLE: + tickTmp = mbSlaveArr[ch].curFrameIntv; /* 帧间隔超时判断 */ - if(mbSlaveArr[ch].curFrameIntv && (module_tick_get() - mbSlaveArr[ch].curFrameIntv) > mbSlaveArr[ch].targetFrameIntv) + if(tickTmp && (module_tick_get() - tickTmp) > mbSlaveArr[ch].targetFrameIntv) { mbSlaveArr[ch].curFrameIntv = 0; mbSlaveArr[ch].state = MB_RX_BUSY; /* 切换状态 */ @@ -447,7 +449,7 @@ uint16_t mb_slave_read_tx_buf(uint8_t ch, void *pBuf, uint16_t len) { memcpy(pBuf, (void *)&mbSlaveArr[ch].dataBuf[mbSlaveArr[ch].readLen], len); mbSlaveArr[ch].readLen += len; - if(0 >= (mbSlaveArr[ch].dataLen - mbSlaveArr[ch].readLen)) + if(mbSlaveArr[ch].dataLen == mbSlaveArr[ch].readLen) { mbSlaveArr[ch].dataLen = 0; mbSlaveArr[ch].readLen = 0; -- Gitee From 027e89425e7cf1dad7b031321267a49194f84b91 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=98=BF=E8=A1=B00110?= Date: Thu, 4 Jan 2024 21:05:13 +0800 Subject: [PATCH 32/66] =?UTF-8?q?=E4=BF=AE=E5=A4=8Dcrc=E6=A0=A1=E9=AA=8C?= =?UTF-8?q?=E4=B8=AD=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- drivers/modules/data_check.c | 87 ++++++++++++++++++------------------ drivers/modules/data_check.h | 2 +- 2 files changed, 45 insertions(+), 44 deletions(-) diff --git a/drivers/modules/data_check.c b/drivers/modules/data_check.c index 0e813f9..3ef584e 100644 --- a/drivers/modules/data_check.c +++ b/drivers/modules/data_check.c @@ -3,7 +3,7 @@ * @file data_check.c * @author ashuai0110 * @version V2.1 - * @date 2023-12-29 + * @date 2024-01-04 * @brief 数据校验方法集合 * ****************************************************************************** @@ -16,6 +16,7 @@ * Date Author Notes * 2023-10-17 ashuai0110 完成基本内容 * 2023-12-29 ashuai0110 新增sum,xor,crc校验 + * 2024-01-04 ashuai0110 修复crc校验中的问题 * ****************************************************************************** */ @@ -125,14 +126,14 @@ uint8_t check_lrc(uint8_t *data, uint16_t len) */ uint8_t check_crc4_itu(uint8_t *data, uint16_t len) { - uint8_t cnt = 0; + uint8_t cnt; uint8_t crc = 0; while(len--) { crc ^= *data; data++; - for(; cnt < 8; ++cnt) + for(cnt = 0; cnt < 8; ++cnt) { if(crc & 0x01) { @@ -159,14 +160,14 @@ uint8_t check_crc4_itu(uint8_t *data, uint16_t len) */ uint8_t check_crc5_epc(uint8_t *data, uint16_t len) { - uint8_t cnt = 0; + uint8_t cnt; uint8_t crc = 0x48; while(len--) { crc ^= *data; data++; - for(; cnt < 8; cnt++) + for(cnt = 0; cnt < 8; cnt++) { if(crc & 0x80) { @@ -194,14 +195,14 @@ uint8_t check_crc5_epc(uint8_t *data, uint16_t len) */ uint8_t check_crc5_itu(uint8_t *data, uint16_t len) { - uint8_t cnt = 0; + uint8_t cnt; uint8_t crc = 0; while(len--) { crc ^= *data; data++; - for(; cnt < 8; ++cnt) + for(cnt = 0; cnt < 8; ++cnt) { if(crc & 0x01) { @@ -228,14 +229,14 @@ uint8_t check_crc5_itu(uint8_t *data, uint16_t len) */ uint8_t check_crc5_usb(uint8_t *data, uint16_t len) { - uint8_t cnt = 0; + uint8_t cnt; uint8_t crc = 0x1F; while(len--) { crc ^= *data; data++; - for(; cnt < 8; ++cnt) + for(cnt = 0; cnt < 8; ++cnt) { if(crc & 0x01) { @@ -263,14 +264,14 @@ uint8_t check_crc5_usb(uint8_t *data, uint16_t len) */ uint8_t check_crc6_itu(uint8_t *data, uint16_t len) { - uint8_t cnt = 0; + uint8_t cnt; uint8_t crc = 0; while(len--) { crc ^= *data; data++; - for(; cnt < 8; ++cnt) + for(cnt = 0; cnt < 8; ++cnt) { if(crc & 0x01) { @@ -297,14 +298,14 @@ uint8_t check_crc6_itu(uint8_t *data, uint16_t len) */ uint8_t check_crc7_mmc(uint8_t *data, uint16_t len) { - uint8_t cnt = 0; + uint8_t cnt; uint8_t crc = 0; while(len--) { crc ^= *data; data++; - for(; cnt < 8; cnt++) + for(cnt = 0; cnt < 8; cnt++) { if(crc & 0x80) { @@ -332,14 +333,14 @@ uint8_t check_crc7_mmc(uint8_t *data, uint16_t len) */ uint8_t check_crc8(uint8_t *data, uint16_t len) { - uint8_t cnt = 0; + uint8_t cnt; uint8_t crc = 0; while(len--) { crc ^= *data; data++; - for(; cnt < 8; cnt++) + for(cnt = 0; cnt < 8; cnt++) { if(crc & 0x80) { @@ -366,14 +367,14 @@ uint8_t check_crc8(uint8_t *data, uint16_t len) */ uint8_t check_crc8_itu(uint8_t *data, uint16_t len) { - uint8_t cnt = 0; + uint8_t cnt; uint8_t crc = 0; while(len--) { crc ^= *data; data++; - for(; cnt < 8; cnt++) + for(cnt = 0; cnt < 8; cnt++) { if(crc & 0x80) { @@ -401,14 +402,14 @@ uint8_t check_crc8_itu(uint8_t *data, uint16_t len) */ uint8_t check_crc8_rohc(uint8_t *data, uint16_t len) { - uint8_t cnt = 0; + uint8_t cnt; uint8_t crc = 0xFF; while(len--) { crc ^= *data; data++; - for(; cnt < 8; ++cnt) + for(cnt = 0; cnt < 8; ++cnt) { if(crc & 0x01) { @@ -435,14 +436,14 @@ uint8_t check_crc8_rohc(uint8_t *data, uint16_t len) */ uint8_t check_crc8_maxim(uint8_t *data, uint16_t len) { - uint8_t cnt = 0; + uint8_t cnt; uint8_t crc = 0; while(len--) { crc ^= *data; data++; - for(; cnt < 8; cnt++) + for(cnt = 0; cnt < 8; cnt++) { if(crc & 0x01) { @@ -469,14 +470,14 @@ uint8_t check_crc8_maxim(uint8_t *data, uint16_t len) */ uint16_t check_crc16_ibm(uint8_t *data, uint16_t len) { - uint8_t cnt = 0; + uint8_t cnt; uint16_t crc = 0; while(len--) { crc ^= *data; data++; - for(; cnt < 8; ++cnt) + for(cnt = 0; cnt < 8; ++cnt) { if(crc & 0x01) { @@ -503,14 +504,14 @@ uint16_t check_crc16_ibm(uint8_t *data, uint16_t len) */ uint16_t check_crc16_maxim(uint8_t *data, uint16_t len) { - uint8_t cnt = 0; + uint8_t cnt; uint16_t crc = 0; while(len--) { crc ^= *data; data++; - for(; cnt < 8; ++cnt) + for(cnt = 0; cnt < 8; ++cnt) { if(crc & 0x01) { @@ -538,14 +539,14 @@ uint16_t check_crc16_maxim(uint8_t *data, uint16_t len) */ uint16_t check_crc16_usb(uint8_t *data, uint16_t len) { - uint8_t cnt = 0; + uint8_t cnt; uint16_t crc = 0xFFFF; while(len--) { crc ^= *data; data++; - for(; cnt < 8; ++cnt) + for(cnt = 0; cnt < 8; ++cnt) { if(crc & 0x01) { @@ -573,14 +574,14 @@ uint16_t check_crc16_usb(uint8_t *data, uint16_t len) */ uint16_t check_crc16_modbus(uint8_t *data, uint16_t len) { - uint8_t cnt = 0; + uint8_t cnt; uint16_t crc = 0xFFFF; while(len--) { crc ^= *data; data++; - for(; cnt < 8; ++cnt) + for(cnt = 0; cnt < 8; ++cnt) { if(crc & 0x01) { @@ -607,14 +608,14 @@ uint16_t check_crc16_modbus(uint8_t *data, uint16_t len) */ uint16_t check_crc16_ccitt(uint8_t *data, uint16_t len) { - uint8_t cnt = 0; + uint8_t cnt; uint16_t crc = 0; while(len--) { crc ^= *data; data++; - for(; cnt < 8; ++cnt) + for(cnt = 0; cnt < 8; ++cnt) { if(crc & 0x01) { @@ -641,14 +642,14 @@ uint16_t check_crc16_ccitt(uint8_t *data, uint16_t len) */ uint16_t check_crc16_ccitt_false(uint8_t *data, uint16_t len) { - uint8_t cnt = 0; + uint8_t cnt; uint16_t crc = 0xFFFF; while(len--) { crc ^= (uint16_t)(*data) << 8; data++; - for(; cnt < 8; ++cnt) + for(cnt = 0; cnt < 8; ++cnt) { if(crc & 0x8000) { @@ -675,14 +676,14 @@ uint16_t check_crc16_ccitt_false(uint8_t *data, uint16_t len) */ uint16_t check_crc16_x25(uint8_t *data, uint16_t len) { - uint8_t cnt = 0; + uint8_t cnt; uint16_t crc = 0xFFFF; while(len--) { crc ^= *data; data++; - for(; cnt < 8; ++cnt) + for(cnt = 0; cnt < 8; ++cnt) { if (crc & 0x01) { @@ -710,14 +711,14 @@ uint16_t check_crc16_x25(uint8_t *data, uint16_t len) */ uint16_t check_crc16_xmodem(uint8_t *data, uint16_t len) { - uint8_t cnt = 0; + uint8_t cnt; uint16_t crc = 0; while(len--) { crc ^= (uint16_t)(*data) << 8; data++; - for(; cnt < 8; ++cnt) + for(cnt = 0; cnt < 8; ++cnt) { if(crc & 0x8000) { @@ -744,14 +745,14 @@ uint16_t check_crc16_xmodem(uint8_t *data, uint16_t len) */ uint16_t check_crc16_dnp(uint8_t *data, uint16_t len) { - uint8_t cnt = 0; + uint8_t cnt; uint16_t crc = 0; while(len--) { crc ^= *data; data++; - for(; cnt < 8; ++cnt) + for(cnt = 0; cnt < 8; ++cnt) { if(crc & 0x01) { @@ -779,14 +780,14 @@ uint16_t check_crc16_dnp(uint8_t *data, uint16_t len) */ uint32_t check_crc32(uint8_t *data, uint16_t len) { - uint8_t cnt = 0; + uint8_t cnt; uint32_t crc = 0xFFFFFFFF; while(len--) { crc ^= *data++; data++; - for(; cnt < 8; ++cnt) + for(cnt = 0; cnt < 8; ++cnt) { if(crc & 0x01) { @@ -814,14 +815,14 @@ uint32_t check_crc32(uint8_t *data, uint16_t len) */ uint32_t check_crc32_mpeg_2(uint8_t *data, uint16_t len) { - uint8_t cnt = 0; + uint8_t cnt; uint32_t crc = 0xFFFFFFFF; while(len--) { crc ^= (uint32_t)(*data) << 24; data++; - for(; cnt < 8; ++cnt) + for(cnt = 0; cnt < 8; ++cnt) { if(crc & 0x80000000) { diff --git a/drivers/modules/data_check.h b/drivers/modules/data_check.h index 4f339fb..70ecb66 100644 --- a/drivers/modules/data_check.h +++ b/drivers/modules/data_check.h @@ -3,7 +3,7 @@ * @file data_check.h * @author ashuai0110 * @version V2.1 - * @date 2023-12-29 + * @date 2024-01-04 * @brief 数据校验方法集合 * ****************************************************************************** -- Gitee From 5a818ee7f27ca066609dd047c15149a1189bc9c7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=98=BF=E8=A1=B00110?= Date: Thu, 4 Jan 2024 21:06:14 +0800 Subject: [PATCH 33/66] =?UTF-8?q?xmodem=E7=BB=84=E4=BB=B6=E6=9B=B4?= =?UTF-8?q?=E6=96=B0(=E6=9C=AA=E5=AE=8C=E6=88=90)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- drivers/bootloader/xmodem.c | 244 +++++++++++++------- drivers/bootloader/xmodem.h | 48 ++-- examples/bootloader/MDK/use_example.uvoptx | 111 +++++---- examples/bootloader/MDK/use_example.uvprojx | 40 ++-- examples/bootloader/SRC/main.c | 29 ++- 5 files changed, 288 insertions(+), 184 deletions(-) diff --git a/drivers/bootloader/xmodem.c b/drivers/bootloader/xmodem.c index 2b4999c..bb0d37e 100644 --- a/drivers/bootloader/xmodem.c +++ b/drivers/bootloader/xmodem.c @@ -76,14 +76,24 @@ * @{ */ -static uint16_t xmodem_check_crc16(const uint8_t *data, uint16_t len) +/** + * @brief CRC16-XMODEM校验 + * + * @param data : 校验数据 + * + * @param len : 校验数据长度 + * + * @retval 校验结果 + */ +static uint16_t xmodem_check_crc16(uint8_t *data, uint16_t len) { uint8_t cnt; - uint16_t crc = 0; // Initial value + uint16_t crc = 0; while(len--) { - crc ^= (uint16_t)(*data++) << 8; // crc ^= (uint16_t)(*data)<<8; data++; + crc ^= (uint16_t)(*data) << 8; + data++; for(cnt = 0; cnt < 8; ++cnt) { if(crc & 0x8000) @@ -101,15 +111,15 @@ static uint16_t xmodem_check_crc16(const uint8_t *data, uint16_t len) } /** - * @brief xmodem校验累加和 + * @brief 累加和校验 * - * @param pBuf : 校验数据 + * @param data : 校验数据 * * @param len : 校验数据长度 * * @retval 累加和 */ -static uint8_t xmodem_check_sum(const uint8_t *data, uint16_t len) +static uint8_t xmodem_check_sum(uint8_t *data, uint16_t len) { uint8_t sum = 0; uint16_t cnt = 0; @@ -134,37 +144,38 @@ static uint8_t xmodem_check_sum(const uint8_t *data, uint16_t len) /** * @brief xmodem初始化 * - * @param _xmodem : xmodem管理实例 + * @param _xmodem : xmodem管理实例 * - * @param pBuf : 数据缓存区 + * @param pBuf : 数据缓存区 * - * @param bufLen : 数据缓存区长度byte + * @param bufLen : 数据缓存区长度byte * - * @param txEnFn : 串口发送前准备函数 + * @param txEnFn : 串口发送前准备函数 * - * @param rspTimeout : 回复超时时间ms + * @param getPacketFn : 获取数据包回调函数(不用可填NULL) + * + * @param setPacketFn : 设置数据包回调函数(不用可填NULL) + * + * @param rspTimeout : 回复超时时间sec * * @retval None */ -void xmodem_init(xmodem_t *_xmodem, const void *dataBuf, uint16_t bufLen, xmodem_tx_en_t txEnFn, +void xmodem_init(xmodem_t *_xmodem, void *dataBuf, uint16_t bufLen, xmodem_tx_en_t txEnFn, xmodem_user_packet_cb_t getPacketFn, xmodem_user_packet_cb_t setPacketFn, uint16_t rspTimeout) { ASSERT_PARAM(IS_VALID_POINT(_xmodem)); ASSERT_PARAM(IS_VALID_POINT(dataBuf)); ASSERT_PARAM(IS_VALID_POINT(txEnFn)); + memset(_xmodem, 0, sizeof(xmodem_t)); _xmodem->dataBuf = (uint8_t *)dataBuf; _xmodem->dataBufLen = bufLen; - _xmodem->dataLen = 0; - _xmodem->readLen = 0; _xmodem->txEnFn = txEnFn; _xmodem->getPacketFn = getPacketFn; _xmodem->setPacketFn = setPacketFn; _xmodem->rspTimeout = rspTimeout; - _xmodem->rspTimeoutCnt = 0; _xmodem->packetNum = 1; - _xmodem->state = XMODEM_RX_STATE_IDLE; - _xmodem->checkNum = 0; + _xmodem->state = XMODEM_STATE_IDLE; } /** @@ -176,56 +187,71 @@ void xmodem_init(xmodem_t *_xmodem, const void *dataBuf, uint16_t bufLen, xmodem */ void xmodem_rx_poll(xmodem_t *_xmodem) { + uint32_t tickTmp; + ASSERT_PARAM(IS_VALID_POINT(_xmodem)); switch(_xmodem->state) { - case XMODEM_RX_STATE_IDLE: + case XMODEM_STATE_IDLE: break; - case XMODEM_RX_STATE_WAIT: + case XMODEM_STATE_WAIT: + tickTmp = _xmodem->rspTimeoutCnt; /* 应答超时判断 */ - if(_xmodem->rspTimeoutCnt > _xmodem->rspTimeout) + if(tickTmp && (module_tick_get() - tickTmp) > _xmodem->rspTimeout) { _xmodem->rspTimeoutCnt = 0; + /* 若回复超时次数达到预设值 则直接中断接收回到IDLE状态 */ + if(_xmodem->rspTimeoutTimes++ >= XMODEM_RSP_TIMES) + { + _xmodem->rspTimeoutTimes = 0; + _xmodem->packetNum = 1; + _xmodem->state = XMODEM_STATE_IDLE; + + return ; + } _xmodem->dataLen = 1; _xmodem->txEnFn(1); } break; - case XMODEM_RX_STATE_CHECK_HEAD: + case XMODEM_STATE_CHECK_HEAD: if(XMODEM_SOH == _xmodem->dataBuf[0] && (3 + 128 + _xmodem->checkNum) == _xmodem->dataLen) { - _xmodem->state = XMODEM_RX_STATE_CHECK_DATA; + _xmodem->state = XMODEM_STATE_CHECK_DATA; goto _check_data; } else if(XMODEM_STX == _xmodem->dataBuf[0] && (3 + 1024 + _xmodem->checkNum) == _xmodem->dataLen) { - _xmodem->state = XMODEM_RX_STATE_CHECK_DATA; + _xmodem->state = XMODEM_STATE_CHECK_DATA; goto _check_data; } else if(XMODEM_EOT == _xmodem->dataBuf[0]) { + _xmodem->packetNum = 1; + _xmodem->state = XMODEM_STATE_IDLE; _xmodem->dataBuf[0] = XMODEM_ACK; _xmodem->dataLen = 1; - _xmodem->state = XMODEM_RX_STATE_IDLE; _xmodem->txEnFn(1); + } else if(XMODEM_CAN == _xmodem->dataBuf[0]) { - _xmodem->state = XMODEM_RX_STATE_IDLE; + _xmodem->packetNum = 1; + _xmodem->state = XMODEM_STATE_IDLE; } break; - case XMODEM_RX_STATE_CHECK_DATA: + case XMODEM_STATE_CHECK_DATA: _check_data: if(_xmodem->packetNum == _xmodem->dataBuf[1] && (_xmodem->dataBuf[1] + _xmodem->dataBuf[2]) == 0xFF) { - uint16_t checkDataLen; + uint16_t checkDataLen = _xmodem->dataLen - 3;; if(1 == _xmodem->checkNum) { - checkDataLen = _xmodem->dataLen - 3 - _xmodem->checkNum; - if(0 == (_xmodem->dataBuf[_xmodem->dataLen - 1] - xmodem_check_sum(&_xmodem->dataBuf[3], checkDataLen))) + checkDataLen -= 1; + if(_xmodem->dataBuf[_xmodem->dataLen - 1] == xmodem_check_sum(&_xmodem->dataBuf[3], checkDataLen)) { - xmodem_user_get_packet_cb(_xmodem->packetNum++, &_xmodem->dataBuf[3], checkDataLen); + _xmodem->getPacketFn(_xmodem->packetNum++, &_xmodem->dataBuf[3], &checkDataLen); _xmodem->dataBuf[0] = XMODEM_ACK; } else @@ -235,10 +261,10 @@ _check_data: } else if(2 == _xmodem->checkNum) { - checkDataLen = _xmodem->dataLen - 3; - if(0 == xmodem_check_crc16(&_xmodem->dataBuf[3], _xmodem->dataLen - 3)) + if(0 == xmodem_check_crc16(&_xmodem->dataBuf[3], checkDataLen)) { - xmodem_user_get_packet_cb(_xmodem->packetNum++, &_xmodem->dataBuf[3], checkDataLen - _xmodem->checkNum); + checkDataLen -= 2; + _xmodem->getPacketFn(_xmodem->packetNum++, &_xmodem->dataBuf[3], &checkDataLen); _xmodem->dataBuf[0] = XMODEM_ACK; } else @@ -250,13 +276,14 @@ _check_data: else { _xmodem->dataBuf[0] = XMODEM_NAK; - } + } + _xmodem->rspTimeoutTimes = 0; + _xmodem->state = XMODEM_STATE_WAIT; _xmodem->dataLen = 1; _xmodem->txEnFn(1); - _xmodem->state = XMODEM_RX_STATE_WAIT; break; default: - _xmodem->state = XMODEM_RX_STATE_IDLE; + _xmodem->state = XMODEM_STATE_IDLE; break; } } @@ -277,13 +304,12 @@ void xmodem_rx_start(xmodem_t *_xmodem, uint8_t startFlag) ASSERT_PARAM(IS_VALID_POINT(_xmodem)); ASSERT_PARAM(IS_VALID_RX_FLAG(startFlag)); - if(XMODEM_RX_STATE_IDLE == _xmodem->state) + if(XMODEM_STATE_IDLE == _xmodem->state) { + _xmodem->state = XMODEM_STATE_WAIT; _xmodem->dataBuf[0] = startFlag; _xmodem->dataLen = 1; _xmodem->checkNum = (startFlag == XMODEM_RX_FLAG_NAK) ? 1 : 2; - _xmodem->readLen = 0; - _xmodem->state = XMODEM_RX_STATE_WAIT; _xmodem->txEnFn(1); } } @@ -301,38 +327,98 @@ void xmodem_tx_poll(xmodem_t *_xmodem) switch(_xmodem->state) { - - } -} - -/** - * @brief xmodem发送启动 - * - * @param _xmodem : xmodem管理实例 - * - * @retval None - */ -void xmodem_tx_start(xmodem_t *_xmodem) -{ - ASSERT_PARAM(IS_VALID_POINT(_xmodem)); - - -} - -/** - * @brief xmodem 1s时基提供 - * - * @note 1s周期执行 - * - * @param _xmodem : xmodem管理实例 - * - * @retval None - */ -void xmodem_1s_tick_handler(xmodem_t *_xmodem) -{ - if(_xmodem->rspTimeoutCnt && XMODEM_RX_STATE_WAIT == _xmodem->state) - { - _xmodem->rspTimeoutCnt++; + case XMODEM_STATE_IDLE: + if(1 == _xmodem->packetNum) + { + if(XMODEM_NAK == _xmodem->dataBuf[0]) + { + _xmodem->checkNum = 1; + _xmodem->state = XMODEM_STATE_CHECK_DATA; + } + else if(XMODEM_CRC16 == _xmodem->dataBuf[0]) + { + _xmodem->checkNum = 2; + _xmodem->state = XMODEM_STATE_CHECK_DATA; + } + } + break; + case XMODEM_STATE_WAIT: + /* 应答超时判断 */ + if((module_tick_get() - _xmodem->rspTimeoutCnt) > _xmodem->rspTimeout) + { + _xmodem->rspTimeoutCnt = 0; + _xmodem->dataLen = 1; + _xmodem->txEnFn(1); + } + break; + case XMODEM_STATE_CHECK_HEAD: + if(XMODEM_ACK == _xmodem->dataBuf[0]) + { + _xmodem->packetNum++; + _xmodem->state = XMODEM_STATE_CHECK_DATA; + } + else if(XMODEM_NAK == _xmodem->dataBuf[0]) + { + _xmodem->state = XMODEM_STATE_CHECK_DATA; + } + else + { + break; + } + case XMODEM_STATE_CHECK_DATA: + _xmodem->setPacketFn(_xmodem->packetNum, &_xmodem->dataBuf[3], &_xmodem->dataLen); + if(1024 <= _xmodem->dataLen) + { + _xmodem->dataBuf[0] = XMODEM_STX; + _xmodem->dataLen = 1024; + } + else if(128 == _xmodem->dataLen) + { + _xmodem->dataBuf[0] = XMODEM_SOH; + _xmodem->dataLen = 128; + } + else if(0 == _xmodem->dataLen) + { + _xmodem->packetNum = 1; + _xmodem->state = XMODEM_STATE_IDLE; + _xmodem->dataBuf[0] = XMODEM_EOT; + _xmodem->dataLen = 1; + _xmodem->txEnFn(1); + + return ; + } + else + { + if(128 < _xmodem->dataLen) + { + _xmodem->dataBuf[0] = XMODEM_STX; + memset(&_xmodem->dataBuf[3 + _xmodem->dataLen], XMODEM_CTRLZ, 1024 - _xmodem->dataLen); + _xmodem->dataLen = 1024; + } + else if(128 > _xmodem->dataLen) + { + _xmodem->dataBuf[0] = XMODEM_SOH; + memset(&_xmodem->dataBuf[3 + _xmodem->dataLen], XMODEM_CTRLZ, 128 - _xmodem->dataLen); + _xmodem->dataLen = 128; + } + } + if(1 == _xmodem->checkNum) + { + uint8_t sum = xmodem_check_sum(&_xmodem->dataBuf[3], _xmodem->dataLen); + _xmodem->dataBuf[_xmodem->dataLen + 3 + 1] = sum; + } + else if(2 == _xmodem->checkNum) + { + uint16_t crc16 = xmodem_check_crc16(&_xmodem->dataBuf[3], _xmodem->dataLen); + _xmodem->dataBuf[_xmodem->dataLen + 3 + 1] = crc16 >> 8; + _xmodem->dataBuf[_xmodem->dataLen + 3 + 2] = crc16 & 0xFF; + } + _xmodem->state = XMODEM_STATE_WAIT; + _xmodem->dataBuf[1] = _xmodem->packetNum; + _xmodem->dataBuf[2] = 0xFF - _xmodem->packetNum; + _xmodem->dataLen = _xmodem->dataLen + 3 + _xmodem->checkNum; + _xmodem->txEnFn(1); + break; } } @@ -367,9 +453,9 @@ uint16_t xmodem_write_rx_buf(xmodem_t *_xmodem, const void *pBuf, uint16_t len) memcpy((void *)&_xmodem->dataBuf[_xmodem->dataLen], (void *)pBuf, len); _xmodem->dataLen += len; _xmodem->rspTimeoutCnt = 0; - if(XMODEM_RX_STATE_WAIT == _xmodem->state) + if(XMODEM_STATE_WAIT == _xmodem->state) { - _xmodem->state = XMODEM_RX_STATE_CHECK_HEAD; + _xmodem->state = XMODEM_STATE_CHECK_HEAD; } } @@ -410,23 +496,13 @@ uint16_t xmodem_read_tx_buf(xmodem_t *_xmodem, const void *pBuf, uint16_t len) { _xmodem->dataLen = 0; _xmodem->readLen = 0; - _xmodem->rspTimeoutCnt = 1; + _xmodem->rspTimeoutCnt = module_tick_get(); } } return len; } -__WEAK void xmodem_user_get_packet_cb(uint8_t packetNum, uint8_t *data, uint16_t len) -{ - PRINT_LOG("xmodem packet num:%d, len:%d, data: ", packetNum, len); - for(uint16_t i = 0; i < len; i++) - { - PRINT_LOG("%02X ", data[i]); - } - PRINT_LOG("\r\n"); -} - /** * @} */ diff --git a/drivers/bootloader/xmodem.h b/drivers/bootloader/xmodem.h index f04beaf..6e37d1b 100644 --- a/drivers/bootloader/xmodem.h +++ b/drivers/bootloader/xmodem.h @@ -41,18 +41,24 @@ extern "C" { * @{ */ +#define XMODEM_RSP_TIMES (3u) /*!< 回复超时次数默认3次(0~255) */ + /** - * @defgroup xmodem_frame_head xmodem frame head + * @defgroup xmodem_command_symbol xmodem command symbol * @{ */ -#define XMODEM_SOH (0x01u) /*!< 128byte数据 */ -#define XMODEM_STX (0x02u) /*!< 1024byte数据 */ -#define XMODEM_EOT (0x04u) /*!< 发送结束 */ -#define XMODEM_ACK (0x06u) /*!< 正确应答 */ -#define XMODEM_NAK (0x15u) /*!< 错误应答/校验方式累加和 */ -#define XMODEM_CAN (0x18u) /*!< 取消发送 */ +/* xmodem协议格式 +命令符 | 包序号 | 包序号补码 | 有效数据 | 校验 + 1 | 1 | 1 | 128/1024 | 1/2 byte +*/ +#define XMODEM_SOH (0x01u) /*!< 命令符:128byte数据 */ +#define XMODEM_STX (0x02u) /*!< 命令符:1024byte数据 */ +#define XMODEM_EOT (0x04u) /*!< 命令符:发送结束 */ +#define XMODEM_ACK (0x06u) /*!< 命令符:正确应答 */ +#define XMODEM_NAK (0x15u) /*!< 命令符:错误应答/校验方式累加和 */ +#define XMODEM_CAN (0x18u) /*!< 命令符:取消发送 */ #define XMODEM_CTRLZ (0x1Au) /*!< 填充字节 */ -#define XMODEM_CRC16 ('C') /*!< 校验方式CRC16 */ +#define XMODEM_CRC16 ('C') /*!< 命令符:校验方式CRC16 */ /** * @} */ @@ -61,11 +67,11 @@ extern "C" { * @defgroup xmodem_rx_state xmodem rx state * @{ */ -#define XMODEM_RX_STATE_IDLE (0u) /*!< 空闲状态 */ -#define XMODEM_RX_STATE_WAIT (1u) /*!< 等待接收状态 */ -#define XMODEM_RX_STATE_CHECK_HEAD (2u) /*!< 校验数据头状态 */ -#define XMODEM_RX_STATE_CHECK_DATA (3u) /*!< 校验数据状态 */ -#define XMODEM_RX_STATE_ACK (4u) /*!< 回复状态 */ +#define XMODEM_STATE_IDLE (0u) /*!< 空闲状态 */ +#define XMODEM_STATE_WAIT (1u) /*!< 等待接收状态 */ +#define XMODEM_STATE_CHECK_HEAD (2u) /*!< 校验数据头状态 */ +#define XMODEM_STATE_CHECK_DATA (3u) /*!< 校验数据状态 */ +#define XMODEM_STATE_ACK (4u) /*!< 回复状态 */ /** * @} */ @@ -125,17 +131,17 @@ typedef struct xmodem { uint16_t dataLen; /*!< 存放数据数量 */ uint16_t readLen; /*!< 数据读出数量 */ - uint8_t packetNum; /*!< 包序号 */ - uint8_t rspTimeout; /*!< 回复超时时间1-254sec */ - uint8_t rspTimeoutCnt; /*!< 回复超时时间计数1-254sec */ + uint16_t rspTimeout; /*!< 回复超时时间ms */ + uint32_t rspTimeoutCnt; /*!< 回复超时时间计数 */ uint8_t rspTimeoutTimes; /*!< 回复超时次数 */ + uint8_t packetNum; /*!< 包序号 */ uint8_t state : 3; /*!< xmodem状态 */ uint8_t checkNum : 2; /*!< 校验字节数 */ xmodem_tx_en_t txEnFn; /*!< 串口发送准备函数 */ xmodem_user_packet_cb_t getPacketFn; /*!< 获取数据包回调函数 */ - xmodem_user_packet_cb_t setPacketFn; /*!< 设置数据包回调函数 */ + xmodem_user_packet_cb_t setPacketFn; /*!< 设置数据包回调函数 */ } xmodem_t; /** @@ -150,21 +156,17 @@ typedef struct xmodem { * @{ */ -void xmodem_init(xmodem_t *_xmodem, const void *dataBuf, uint16_t bufLen, xmodem_tx_en_t txEnFn, +void xmodem_init(xmodem_t *_xmodem, void *dataBuf, uint16_t bufLen, xmodem_tx_en_t txEnFn, xmodem_user_packet_cb_t getPacketFn, xmodem_user_packet_cb_t setPacketFn, uint16_t rspTimeout); void xmodem_rx_poll(xmodem_t *_xmodem); +void xmodem_tx_poll(xmodem_t *_xmodem); void xmodem_rx_start(xmodem_t *_xmodem, uint8_t startFlag); -void xmodem_1s_tick_handler(xmodem_t *_xmodem); - uint16_t xmodem_write_rx_buf(xmodem_t *_xmodem, const void *pBuf, uint16_t len); uint16_t xmodem_read_tx_buf(xmodem_t *_xmodem, const void *pBuf, uint16_t len); -/* 弱定义函数 */ -void xmodem_user_get_packet_cb(uint8_t packetNum, uint8_t *data, uint16_t len); - /** * @} */ diff --git a/examples/bootloader/MDK/use_example.uvoptx b/examples/bootloader/MDK/use_example.uvoptx index 733c4a7..139ac5a 100644 --- a/examples/bootloader/MDK/use_example.uvoptx +++ b/examples/bootloader/MDK/use_example.uvoptx @@ -148,13 +148,60 @@ UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32F10x_128 -FS08000000 -FL020000 -FP0($$Device:STM32F103C8$Flash\STM32F10x_128.FLM)) - + + + 0 + 0 + 218 + 1 +
134224324
+ 0 + 0 + 0 + 0 + 0 + 1 + ..\..\..\drivers\bootloader\xmodem.c + + \\use_example\../../../drivers/bootloader/xmodem.c\218 +
+
0 1 usart1DmaRxBuf + + 1 + 1 + dataBuf + + + 2 + 1 + len + + + 3 + 1 + tickTmp + + + 4 + 1 + moduleTick + + + 5 + 1 + xmodem + + + 6 + 1 + xmodemBuf + 0 @@ -630,75 +677,59 @@ 0 0 -
- - - readme - 1 - 0 - 0 - 0 - 6 + 5 33 - 5 + 1 0 0 0 - ..\README.txt - README.txt + ..\..\..\drivers\bootloader\bootloader.c + bootloader.c 0 0 - - - - drivers/common - 1 - 0 - 0 - 0 - 7 + 5 34 - 5 + 1 0 0 0 - ..\..\..\drivers\common\common_include.h - common_include.h + ..\..\..\drivers\bootloader\xmodem.c + xmodem.c 0 0 - - - - drivers/bootloader - 1 - 0 - 0 - 0 - 8 + 5 35 1 0 0 0 - ..\..\..\drivers\bootloader\bootloader.c - bootloader.c + ..\..\..\drivers\common\common_include.c + common_include.c 0 0 + + + + readme + 1 + 0 + 0 + 0 - 8 + 6 36 - 1 + 5 0 0 0 - ..\..\..\drivers\bootloader\xmodem.c - xmodem.c + ..\README.txt + README.txt 0 0 diff --git a/examples/bootloader/MDK/use_example.uvprojx b/examples/bootloader/MDK/use_example.uvprojx index 82e169d..bcb76ca 100644 --- a/examples/bootloader/MDK/use_example.uvprojx +++ b/examples/bootloader/MDK/use_example.uvprojx @@ -563,31 +563,6 @@ 1 ..\SRC\main.c - - - - readme - - - README.txt - 5 - ..\README.txt - - - - - drivers/common - - - common_include.h - 5 - ..\..\..\drivers\common\common_include.h - - - - - drivers/bootloader - bootloader.c 1 @@ -598,6 +573,21 @@ 1 ..\..\..\drivers\bootloader\xmodem.c + + common_include.c + 1 + ..\..\..\drivers\common\common_include.c + + + + + readme + + + README.txt + 5 + ..\README.txt + diff --git a/examples/bootloader/SRC/main.c b/examples/bootloader/SRC/main.c index 4bc6cb7..4c08baa 100644 --- a/examples/bootloader/SRC/main.c +++ b/examples/bootloader/SRC/main.c @@ -46,16 +46,10 @@ void usart1_tx_en(uint8_t enState); */ void TIM1_UP_IRQHandler(void) { - static uint16_t cnt = 0; - if(TIM_GetITStatus(TIM1, TIM_IT_Update) != RESET) { - cnt++; - if(cnt % 1000 == 0) - { - xmodem_1s_tick_handler(&xmodem); - cnt = 0; - } + /* 组件计时节拍接口 */ + module_tick_inc(1); TIM_ClearITPendingBit(TIM1, TIM_FLAG_Update); } @@ -179,8 +173,15 @@ void xmodem_get_packet_callback(uint8_t packetNum, uint8_t *data, uint16_t *len) */ void xmodem_set_packet_callback(uint8_t packetNum, uint8_t *data, uint16_t *len) { - - + if(packetNum > 100) + { + *len = 0; + } + else + { + *len = 1024; + memset(data, packetNum, 1024); + } } /** @@ -196,13 +197,17 @@ int main(int argc, char *argv[]) tim1_init_config(100-1, 720-1); /* xmodem组件初始化 */ - xmodem_init(&xmodem, xmodemBuf, sizeof(xmodemBuf), usart1_tx_en, xmodem_get_packet_callback, xmodem_set_packet_callback, 2); + xmodem_init(&xmodem, xmodemBuf, sizeof(xmodemBuf), usart1_tx_en, xmodem_get_packet_callback, xmodem_set_packet_callback, 2000); /* 启动xmodem接收 */ - xmodem_rx_start(&xmodem, XMODEM_RX_FLAG_CRC); +// xmodem_rx_start(&xmodem, XMODEM_RX_FLAG_CRC); while(1) { +#if 0 xmodem_rx_poll(&xmodem); +#else + xmodem_tx_poll(&xmodem); +#endif } } -- Gitee From 05ac82c11be8b53de445f3c7b4ca7f63606b8144 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=98=BF=E8=A1=B00110?= Date: Sun, 7 Jan 2024 22:25:22 +0800 Subject: [PATCH 34/66] =?UTF-8?q?=E6=96=B0=E5=A2=9Exmodem=E7=BB=84?= =?UTF-8?q?=E4=BB=B6=E4=BE=8B=E7=A8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- drivers/bootloader/xmodem.c | 225 +++--- drivers/bootloader/xmodem.h | 12 +- examples/xmodem/MDK/use_example.uvoptx | 871 ++++++++++++++++++++++++ examples/xmodem/MDK/use_example.uvprojx | 612 +++++++++++++++++ examples/xmodem/README.txt | 44 ++ examples/xmodem/SRC/main.c | 219 ++++++ 6 files changed, 1882 insertions(+), 101 deletions(-) create mode 100644 examples/xmodem/MDK/use_example.uvoptx create mode 100644 examples/xmodem/MDK/use_example.uvprojx create mode 100644 examples/xmodem/README.txt create mode 100644 examples/xmodem/SRC/main.c diff --git a/drivers/bootloader/xmodem.c b/drivers/bootloader/xmodem.c index bb0d37e..1ea697d 100644 --- a/drivers/bootloader/xmodem.c +++ b/drivers/bootloader/xmodem.c @@ -3,8 +3,8 @@ * @file xmodem.c * @author ashuai0110 * @version V1.0 - * @date 2023-12-3 - * @brief 串口xmodem协议 + * @date 2024-01-07 + * @brief xmodem协议 * ****************************************************************************** * @attention @@ -14,7 +14,7 @@ * * Change Logs: * Date Author Notes - * 2023-xx-xx ashuai0110 完成基本内容 + * 2024-01-07 ashuai0110 完成基本内容 * ****************************************************************************** */ @@ -132,6 +132,14 @@ static uint8_t xmodem_check_sum(uint8_t *data, uint16_t len) return sum; } +inline static void xmodem_init_state(xmodem_t *_xmodem) +{ + _xmodem->rspTimeoutCnt = 0; + _xmodem->rspTimeoutTimes = 0; + _xmodem->packetNum = 1; + _xmodem->state = XMODEM_STATE_IDLE; +} + /** * @} */ @@ -148,7 +156,7 @@ static uint8_t xmodem_check_sum(uint8_t *data, uint16_t len) * * @param pBuf : 数据缓存区 * - * @param bufLen : 数据缓存区长度byte + * @param bufLen : 数据缓存区长度byte(可根据xmodem.h:50行xmodem协议格式定义) * * @param txEnFn : 串口发送前准备函数 * @@ -167,6 +175,7 @@ void xmodem_init(xmodem_t *_xmodem, void *dataBuf, uint16_t bufLen, xmodem_tx_en ASSERT_PARAM(IS_VALID_POINT(dataBuf)); ASSERT_PARAM(IS_VALID_POINT(txEnFn)); + /* 初始化各参数 */ memset(_xmodem, 0, sizeof(xmodem_t)); _xmodem->dataBuf = (uint8_t *)dataBuf; _xmodem->dataBufLen = bufLen; @@ -181,6 +190,8 @@ void xmodem_init(xmodem_t *_xmodem, void *dataBuf, uint16_t bufLen, xmodem_tx_en /** * @brief xmodem接收轮询处理 * + * @note SecureCRT实测开启串口DMA接收1024byte数据包稳定8KB/sec + * * @param _xmodem : xmodem管理实例 * * @retval None @@ -193,8 +204,7 @@ void xmodem_rx_poll(xmodem_t *_xmodem) switch(_xmodem->state) { - case XMODEM_STATE_IDLE: - break; + case XMODEM_STATE_IDLE: break; case XMODEM_STATE_WAIT: tickTmp = _xmodem->rspTimeoutCnt; /* 应答超时判断 */ @@ -204,87 +214,91 @@ void xmodem_rx_poll(xmodem_t *_xmodem) /* 若回复超时次数达到预设值 则直接中断接收回到IDLE状态 */ if(_xmodem->rspTimeoutTimes++ >= XMODEM_RSP_TIMES) { - _xmodem->rspTimeoutTimes = 0; - _xmodem->packetNum = 1; - _xmodem->state = XMODEM_STATE_IDLE; - - return ; + xmodem_init_state(_xmodem); + break; } - _xmodem->dataLen = 1; + /* 重发当前包 */ + _xmodem->dataLen = _xmodem->dataLenTmp; _xmodem->txEnFn(1); } break; case XMODEM_STATE_CHECK_HEAD: - if(XMODEM_SOH == _xmodem->dataBuf[0] && (3 + 128 + _xmodem->checkNum) == _xmodem->dataLen) + /* 根据包头和数据长度进行初步检查 */ + /* SOH为包头 携带128byte数据 */ + if(XMODEM_SOH == _xmodem->dataBuf[0] && (3 + 128 + _xmodem->checkNum) <= _xmodem->dataLen) { - _xmodem->state = XMODEM_STATE_CHECK_DATA; - goto _check_data; - } - else if(XMODEM_STX == _xmodem->dataBuf[0] && (3 + 1024 + _xmodem->checkNum) == _xmodem->dataLen) + _xmodem->state = XMODEM_STATE_CHECK_DATA; /* 切换状态 */ + _xmodem->dataLenTmp = 128; + } /* STX为包头 携带1024byte数据 */ + else if(XMODEM_STX == _xmodem->dataBuf[0] && (3 + 1024 + _xmodem->checkNum) <= _xmodem->dataLen) { - _xmodem->state = XMODEM_STATE_CHECK_DATA; - goto _check_data; - } + _xmodem->state = XMODEM_STATE_CHECK_DATA; /* 切换状态 */ + _xmodem->dataLenTmp = 1024; + } /* EOT为包头 表示传输结束 */ else if(XMODEM_EOT == _xmodem->dataBuf[0]) { - _xmodem->packetNum = 1; - _xmodem->state = XMODEM_STATE_IDLE; + xmodem_init_state(_xmodem); + /* 回复ACK */ _xmodem->dataBuf[0] = XMODEM_ACK; _xmodem->dataLen = 1; _xmodem->txEnFn(1); - - } + break; + } /* CAN为包头 表示传输取消 */ else if(XMODEM_CAN == _xmodem->dataBuf[0]) { - _xmodem->packetNum = 1; - _xmodem->state = XMODEM_STATE_IDLE; + xmodem_init_state(_xmodem); + break; + } + else + { + _xmodem->state = XMODEM_STATE_WAIT; + break; } - break; case XMODEM_STATE_CHECK_DATA: -_check_data: + /* 包序号和包序号补码满足条件 */ if(_xmodem->packetNum == _xmodem->dataBuf[1] && (_xmodem->dataBuf[1] + _xmodem->dataBuf[2]) == 0xFF) { - uint16_t checkDataLen = _xmodem->dataLen - 3;; - + /* 1字节累加和校验 */ if(1 == _xmodem->checkNum) { - checkDataLen -= 1; - if(_xmodem->dataBuf[_xmodem->dataLen - 1] == xmodem_check_sum(&_xmodem->dataBuf[3], checkDataLen)) + /* 校验成功 */ + if(_xmodem->dataBuf[_xmodem->dataLenTmp + 3] == xmodem_check_sum(&_xmodem->dataBuf[3], _xmodem->dataLenTmp - 1)) { - _xmodem->getPacketFn(_xmodem->packetNum++, &_xmodem->dataBuf[3], &checkDataLen); - _xmodem->dataBuf[0] = XMODEM_ACK; - } + /* 用户get回调函数 */ + _xmodem->getPacketFn(_xmodem->packetNum++, &_xmodem->dataBuf[3], &_xmodem->dataLenTmp); + _xmodem->dataBuf[0] = XMODEM_ACK; /* 回复ACK */ + } /* 校验失败 */ else { - _xmodem->dataBuf[0] = XMODEM_NAK; + _xmodem->dataBuf[0] = XMODEM_NAK; /* 回复NAK */ } - } + } /* 2字节CRC16校验 */ else if(2 == _xmodem->checkNum) { - if(0 == xmodem_check_crc16(&_xmodem->dataBuf[3], checkDataLen)) + /* 校验成功 */ + if(0 == xmodem_check_crc16(&_xmodem->dataBuf[3], _xmodem->dataLenTmp + 2)) { - checkDataLen -= 2; - _xmodem->getPacketFn(_xmodem->packetNum++, &_xmodem->dataBuf[3], &checkDataLen); - _xmodem->dataBuf[0] = XMODEM_ACK; - } + _xmodem->getPacketFn(_xmodem->packetNum++, &_xmodem->dataBuf[3], &_xmodem->dataLenTmp); /* 用户回调函数 */ + _xmodem->dataBuf[0] = XMODEM_ACK; /* 回复ACK */ + } /* 校验失败 */ else { - _xmodem->dataBuf[0] = XMODEM_NAK; + _xmodem->dataBuf[0] = XMODEM_NAK; /* 回复NAK */ } } - } + } /* 否则回复NAK */ else { _xmodem->dataBuf[0] = XMODEM_NAK; } _xmodem->rspTimeoutTimes = 0; - _xmodem->state = XMODEM_STATE_WAIT; + _xmodem->state = XMODEM_STATE_WAIT; /* 切换状态 */ + /* 发送回复内容 */ _xmodem->dataLen = 1; + _xmodem->dataLenTmp = _xmodem->dataLen; _xmodem->txEnFn(1); break; - default: - _xmodem->state = XMODEM_STATE_IDLE; - break; + default: _xmodem->state = XMODEM_STATE_IDLE; break; } } @@ -306,10 +320,12 @@ void xmodem_rx_start(xmodem_t *_xmodem, uint8_t startFlag) if(XMODEM_STATE_IDLE == _xmodem->state) { - _xmodem->state = XMODEM_STATE_WAIT; + _xmodem->checkNum = (startFlag == XMODEM_RX_FLAG_NAK) ? 1 : 2; /* 记录校验方式 */ + _xmodem->state = XMODEM_STATE_WAIT; /* 切换状态 */ + /* 发送启动内容 */ _xmodem->dataBuf[0] = startFlag; _xmodem->dataLen = 1; - _xmodem->checkNum = (startFlag == XMODEM_RX_FLAG_NAK) ? 1 : 2; + _xmodem->dataLenTmp = _xmodem->dataLen; _xmodem->txEnFn(1); } } @@ -323,100 +339,119 @@ void xmodem_rx_start(xmodem_t *_xmodem, uint8_t startFlag) */ void xmodem_tx_poll(xmodem_t *_xmodem) { + uint16_t checkVal; + uint32_t tickTmp; + ASSERT_PARAM(IS_VALID_POINT(_xmodem)); switch(_xmodem->state) { case XMODEM_STATE_IDLE: + /* 首次收到的数据认为是启动发送的命令 */ if(1 == _xmodem->packetNum) { + /* 收到NAK则使用累加和校验 */ if(XMODEM_NAK == _xmodem->dataBuf[0]) { _xmodem->checkNum = 1; _xmodem->state = XMODEM_STATE_CHECK_DATA; - } + } /* 收到'C'则使用CRC16校验 */ else if(XMODEM_CRC16 == _xmodem->dataBuf[0]) { _xmodem->checkNum = 2; _xmodem->state = XMODEM_STATE_CHECK_DATA; + } /* 否则认为是无效数据 */ + else + { + _xmodem->dataLen = 0; } } break; case XMODEM_STATE_WAIT: + tickTmp = _xmodem->rspTimeoutCnt; /* 应答超时判断 */ - if((module_tick_get() - _xmodem->rspTimeoutCnt) > _xmodem->rspTimeout) + if(tickTmp && (module_tick_get() - tickTmp) > _xmodem->rspTimeout) { _xmodem->rspTimeoutCnt = 0; - _xmodem->dataLen = 1; + /* 若回复超时次数达到预设值 则直接中断接收回到IDLE状态 */ + if(_xmodem->rspTimeoutTimes++ >= XMODEM_RSP_TIMES) + { + xmodem_init_state(_xmodem); + break; + } + /* 重发当前包 */ + _xmodem->dataLen = _xmodem->dataLenTmp; _xmodem->txEnFn(1); } break; case XMODEM_STATE_CHECK_HEAD: + /* 收到ACK则继续发下一包 */ if(XMODEM_ACK == _xmodem->dataBuf[0]) { - _xmodem->packetNum++; - _xmodem->state = XMODEM_STATE_CHECK_DATA; - } + _xmodem->state = XMODEM_STATE_CHECK_DATA; /* 切换状态 */ + } /* 收到NAK则重发当前包 */ else if(XMODEM_NAK == _xmodem->dataBuf[0]) { - _xmodem->state = XMODEM_STATE_CHECK_DATA; - } + _xmodem->packetNum--; /* 包序号-1 */ + _xmodem->state = XMODEM_STATE_CHECK_DATA; /* 切换状态 */ + } /* 收到CAN则取消传输 */ + else if(XMODEM_CAN == _xmodem->dataBuf[0]) + { + xmodem_init_state(_xmodem); + break; + } /* 否则认为是无效数据 */ else { + _xmodem->dataLen = 0; + _xmodem->state = XMODEM_STATE_WAIT; break; } case XMODEM_STATE_CHECK_DATA: + /* 用户set回调函数 */ _xmodem->setPacketFn(_xmodem->packetNum, &_xmodem->dataBuf[3], &_xmodem->dataLen); - if(1024 <= _xmodem->dataLen) + /* 超过128但不超过1024的按1024byte */ + if(128 < _xmodem->dataLen && 1024 >= _xmodem->dataLen) { - _xmodem->dataBuf[0] = XMODEM_STX; + _xmodem->dataBuf[0] = XMODEM_STX; /* 包头STX携带1024byte数据 */ + memset(&_xmodem->dataBuf[3 + _xmodem->dataLen], XMODEM_CTRLZ, 1024 - _xmodem->dataLen); /* 填充字节 */ _xmodem->dataLen = 1024; - } - else if(128 == _xmodem->dataLen) + } /* 超过0但不超过128的按128byte */ + else if(0 < _xmodem->dataLen && 128 >= _xmodem->dataLen) { - _xmodem->dataBuf[0] = XMODEM_SOH; + _xmodem->dataBuf[0] = XMODEM_SOH; /* 包头STX携带128byte数据 */ + memset(&_xmodem->dataBuf[3 + _xmodem->dataLen], XMODEM_CTRLZ, 128 - _xmodem->dataLen); /* 填充字节 */ _xmodem->dataLen = 128; - } - else if(0 == _xmodem->dataLen) + } /* 其它认为是传输结束 */ + else { - _xmodem->packetNum = 1; - _xmodem->state = XMODEM_STATE_IDLE; + xmodem_init_state(_xmodem); + /* 回复EOT传输结束 */ _xmodem->dataBuf[0] = XMODEM_EOT; _xmodem->dataLen = 1; _xmodem->txEnFn(1); - - return ; - } - else - { - if(128 < _xmodem->dataLen) - { - _xmodem->dataBuf[0] = XMODEM_STX; - memset(&_xmodem->dataBuf[3 + _xmodem->dataLen], XMODEM_CTRLZ, 1024 - _xmodem->dataLen); - _xmodem->dataLen = 1024; - } - else if(128 > _xmodem->dataLen) - { - _xmodem->dataBuf[0] = XMODEM_SOH; - memset(&_xmodem->dataBuf[3 + _xmodem->dataLen], XMODEM_CTRLZ, 128 - _xmodem->dataLen); - _xmodem->dataLen = 128; - } + break; } + /* 1字节累加和校验 */ if(1 == _xmodem->checkNum) { - uint8_t sum = xmodem_check_sum(&_xmodem->dataBuf[3], _xmodem->dataLen); - _xmodem->dataBuf[_xmodem->dataLen + 3 + 1] = sum; - } - else if(2 == _xmodem->checkNum) + checkVal = xmodem_check_sum(&_xmodem->dataBuf[3], _xmodem->dataLen); + _xmodem->dataBuf[_xmodem->dataLen + 3] = checkVal; + } /* 2字节CRC16校验 */ + else { - uint16_t crc16 = xmodem_check_crc16(&_xmodem->dataBuf[3], _xmodem->dataLen); - _xmodem->dataBuf[_xmodem->dataLen + 3 + 1] = crc16 >> 8; - _xmodem->dataBuf[_xmodem->dataLen + 3 + 2] = crc16 & 0xFF; + checkVal = xmodem_check_crc16(&_xmodem->dataBuf[3], _xmodem->dataLen); + _xmodem->dataBuf[_xmodem->dataLen + 3] = checkVal >> 8; + _xmodem->dataBuf[_xmodem->dataLen + 4] = checkVal & 0xFF; } - _xmodem->state = XMODEM_STATE_WAIT; + _xmodem->rspTimeoutTimes = 0; + _xmodem->state = XMODEM_STATE_WAIT; /* 切换状态 */ + /* 设置包序号和其补码 */ _xmodem->dataBuf[1] = _xmodem->packetNum; _xmodem->dataBuf[2] = 0xFF - _xmodem->packetNum; + _xmodem->packetNum++; + /* 发送包内容 */ _xmodem->dataLen = _xmodem->dataLen + 3 + _xmodem->checkNum; + _xmodem->dataLenTmp = _xmodem->dataLen; _xmodem->txEnFn(1); break; } @@ -437,7 +472,7 @@ void xmodem_tx_poll(xmodem_t *_xmodem) * @arg !0 : 成功写入的数据数量 * @arg 0 : 失败(写入已满) */ -uint16_t xmodem_write_rx_buf(xmodem_t *_xmodem, const void *pBuf, uint16_t len) +uint16_t xmodem_write_rx_buf(xmodem_t *_xmodem, void *pBuf, uint16_t len) { uint16_t unusedLen; @@ -448,7 +483,7 @@ uint16_t xmodem_write_rx_buf(xmodem_t *_xmodem, const void *pBuf, uint16_t len) unusedLen = _xmodem->dataBufLen - _xmodem->dataLen; len = (len > unusedLen) ? unusedLen : len; - if(0 < len) + if(0 < len && XMODEM_STATE_WAIT >= _xmodem->state) { memcpy((void *)&_xmodem->dataBuf[_xmodem->dataLen], (void *)pBuf, len); _xmodem->dataLen += len; @@ -477,7 +512,7 @@ uint16_t xmodem_write_rx_buf(xmodem_t *_xmodem, const void *pBuf, uint16_t len) * @arg !0 : 成功读出的数据数量 * @arg 0 : 失败(无数据可读) */ -uint16_t xmodem_read_tx_buf(xmodem_t *_xmodem, const void *pBuf, uint16_t len) +uint16_t xmodem_read_tx_buf(xmodem_t *_xmodem, void *pBuf, uint16_t len) { uint16_t unreadLen; diff --git a/drivers/bootloader/xmodem.h b/drivers/bootloader/xmodem.h index 6e37d1b..c2af29c 100644 --- a/drivers/bootloader/xmodem.h +++ b/drivers/bootloader/xmodem.h @@ -3,8 +3,8 @@ * @file xmodem.h * @author ashuai0110 * @version V1.0 - * @date 2023-12-3 - * @brief + * @date 2024-01-07 + * @brief xmodem协议 * ****************************************************************************** * @attention @@ -47,7 +47,7 @@ extern "C" { * @defgroup xmodem_command_symbol xmodem command symbol * @{ */ -/* xmodem协议格式 +/* xmodem协议格式 (包长可能是132/133/1028/1029byte) 命令符 | 包序号 | 包序号补码 | 有效数据 | 校验 1 | 1 | 1 | 128/1024 | 1/2 byte */ @@ -71,7 +71,6 @@ extern "C" { #define XMODEM_STATE_WAIT (1u) /*!< 等待接收状态 */ #define XMODEM_STATE_CHECK_HEAD (2u) /*!< 校验数据头状态 */ #define XMODEM_STATE_CHECK_DATA (3u) /*!< 校验数据状态 */ -#define XMODEM_STATE_ACK (4u) /*!< 回复状态 */ /** * @} */ @@ -130,6 +129,7 @@ typedef struct xmodem { uint16_t dataBufLen; /*!< 数据缓冲区大小 */ uint16_t dataLen; /*!< 存放数据数量 */ uint16_t readLen; /*!< 数据读出数量 */ + uint16_t dataLenTmp; /*!< 存放数据数量暂存 */ uint16_t rspTimeout; /*!< 回复超时时间ms */ uint32_t rspTimeoutCnt; /*!< 回复超时时间计数 */ @@ -164,8 +164,8 @@ void xmodem_tx_poll(xmodem_t *_xmodem); void xmodem_rx_start(xmodem_t *_xmodem, uint8_t startFlag); -uint16_t xmodem_write_rx_buf(xmodem_t *_xmodem, const void *pBuf, uint16_t len); -uint16_t xmodem_read_tx_buf(xmodem_t *_xmodem, const void *pBuf, uint16_t len); +uint16_t xmodem_write_rx_buf(xmodem_t *_xmodem, void *pBuf, uint16_t len); +uint16_t xmodem_read_tx_buf(xmodem_t *_xmodem, void *pBuf, uint16_t len); /** * @} diff --git a/examples/xmodem/MDK/use_example.uvoptx b/examples/xmodem/MDK/use_example.uvoptx new file mode 100644 index 0000000..95a778e --- /dev/null +++ b/examples/xmodem/MDK/use_example.uvoptx @@ -0,0 +1,871 @@ + + + + 1.0 + +
### uVision Project, (C) Keil Software
+ + + *.c + *.s*; *.src; *.a* + *.obj; *.o + *.lib + *.txt; *.h; *.inc; *.md + *.plm + *.cpp; *.cc; *.cxx + 0 + + + + 0 + 0 + + + + Target 1 + 0x4 + ARM-ADS + + 12000000 + + 1 + 1 + 0 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\Listings\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 18 + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 1 + 0 + 0 + 1 + 0 + 0 + 4 + + + + + + + + + + + Segger\JL2CM3.dll + + + + 0 + ARMRTXEVENTFLAGS + -L70 -Z18 -C0 -M0 -T1 + + + 0 + DLGTARM + (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0) + + + 0 + ARMDBGFLAGS + + + + 0 + DLGUARM + d + + + 0 + JL2CM3 + -U59522627 -O78 -S2 -ZTIFSpeedSel5000 -A0 -C0 -JU1 -JI127.0.0.1 -JP0 -RST0 -N00("ARM CoreSight SW-DP") -D00(1BA01477) -L00(0) -TO18 -TC10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -TB1 -TFE0 -FO15 -FD20000000 -FC1000 -FN1 -FF0STM32F10x_128.FLM -FS08000000 -FL020000 -FP0($$Device:STM32F103C8$Flash\STM32F10x_128.FLM) + + + 0 + UL2CM3 + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32F10x_128 -FS08000000 -FL020000 -FP0($$Device:STM32F103C8$Flash\STM32F10x_128.FLM)) + + + + + 0 + 0 + 229 + 1 +
134224394
+ 0 + 0 + 0 + 0 + 0 + 1 + ..\..\..\drivers\bootloader\xmodem.c + + \\use_example\../../../drivers/bootloader/xmodem.c\229 +
+ + 1 + 0 + 234 + 1 +
134224434
+ 0 + 0 + 0 + 0 + 0 + 1 + ..\..\..\drivers\bootloader\xmodem.c + + \\use_example\../../../drivers/bootloader/xmodem.c\234 +
+ + 2 + 0 + 277 + 1 +
134224622
+ 0 + 0 + 0 + 0 + 0 + 1 + ..\..\..\drivers\bootloader\xmodem.c + + \\use_example\../../../drivers/bootloader/xmodem.c\277 +
+ + 3 + 0 + 205 + 1 +
134224320
+ 0 + 0 + 0 + 0 + 0 + 1 + ..\..\..\drivers\bootloader\xmodem.c + + \\use_example\../../../drivers/bootloader/xmodem.c\205 +
+ + 4 + 0 + 205 + 1 +
134224712
+ 0 + 0 + 0 + 0 + 0 + 1 + ..\..\..\drivers\bootloader\xmodem.c + + \\use_example\../../../drivers/bootloader/xmodem.c\205 +
+ + 5 + 0 + 207 + 1 +
0
+ 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\drivers\bootloader\xmodem.c + + +
+ + 6 + 0 + 230 + 1 +
0
+ 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\drivers\bootloader\xmodem.c + + +
+ + 7 + 0 + 235 + 1 +
0
+ 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\drivers\bootloader\xmodem.c + + +
+ + 8 + 0 + 279 + 1 +
0
+ 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\drivers\bootloader\xmodem.c + + +
+
+ + + 0 + 1 + usart1DmaRxBuf + + + 1 + 1 + dataBuf + + + 2 + 1 + len + + + 3 + 1 + tickTmp + + + 4 + 1 + moduleTick + + + 5 + 1 + xmodem + + + 6 + 1 + xmodemBuf + + + 7 + 1 + crc16 + + + + 0 + + + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + 0 + 0 + 0 + + + + + + + + + + 1 + 1 + 0 + 2 + 10000000 + +
+
+ + + cmsis + 0 + 0 + 0 + 0 + + 1 + 1 + 1 + 0 + 0 + 0 + ..\..\[base_on_stm32f1]\stm32f1_lib\cmsis\core_cm3.c + core_cm3.c + 0 + 0 + + + 1 + 2 + 1 + 0 + 0 + 0 + ..\..\[base_on_stm32f1]\stm32f1_lib\cmsis\stm32f10x_it.c + stm32f10x_it.c + 0 + 0 + + + 1 + 3 + 1 + 0 + 0 + 0 + ..\..\[base_on_stm32f1]\stm32f1_lib\cmsis\system_stm32f10x.c + system_stm32f10x.c + 0 + 0 + + + 1 + 4 + 2 + 0 + 0 + 0 + ..\..\[base_on_stm32f1]\stm32f1_lib\cmsis\startup\startup_stm32f10x_md.s + startup_stm32f10x_md.s + 0 + 0 + + + + + libs + 0 + 0 + 0 + 0 + + 2 + 5 + 1 + 0 + 0 + 0 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\misc.c + misc.c + 0 + 0 + + + 2 + 6 + 1 + 0 + 0 + 0 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_adc.c + stm32f10x_adc.c + 0 + 0 + + + 2 + 7 + 1 + 0 + 0 + 0 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_bkp.c + stm32f10x_bkp.c + 0 + 0 + + + 2 + 8 + 1 + 0 + 0 + 0 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_can.c + stm32f10x_can.c + 0 + 0 + + + 2 + 9 + 1 + 0 + 0 + 0 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_cec.c + stm32f10x_cec.c + 0 + 0 + + + 2 + 10 + 1 + 0 + 0 + 0 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_crc.c + stm32f10x_crc.c + 0 + 0 + + + 2 + 11 + 1 + 0 + 0 + 0 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_dac.c + stm32f10x_dac.c + 0 + 0 + + + 2 + 12 + 1 + 0 + 0 + 0 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_dbgmcu.c + stm32f10x_dbgmcu.c + 0 + 0 + + + 2 + 13 + 1 + 0 + 0 + 0 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_dma.c + stm32f10x_dma.c + 0 + 0 + + + 2 + 14 + 1 + 0 + 0 + 0 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_exti.c + stm32f10x_exti.c + 0 + 0 + + + 2 + 15 + 1 + 0 + 0 + 0 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_flash.c + stm32f10x_flash.c + 0 + 0 + + + 2 + 16 + 1 + 0 + 0 + 0 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_fsmc.c + stm32f10x_fsmc.c + 0 + 0 + + + 2 + 17 + 1 + 0 + 0 + 0 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_gpio.c + stm32f10x_gpio.c + 0 + 0 + + + 2 + 18 + 1 + 0 + 0 + 0 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_i2c.c + stm32f10x_i2c.c + 0 + 0 + + + 2 + 19 + 1 + 0 + 0 + 0 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_iwdg.c + stm32f10x_iwdg.c + 0 + 0 + + + 2 + 20 + 1 + 0 + 0 + 0 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_pwr.c + stm32f10x_pwr.c + 0 + 0 + + + 2 + 21 + 1 + 0 + 0 + 0 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_rcc.c + stm32f10x_rcc.c + 0 + 0 + + + 2 + 22 + 1 + 0 + 0 + 0 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_rtc.c + stm32f10x_rtc.c + 0 + 0 + + + 2 + 23 + 1 + 0 + 0 + 0 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_sdio.c + stm32f10x_sdio.c + 0 + 0 + + + 2 + 24 + 1 + 0 + 0 + 0 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_spi.c + stm32f10x_spi.c + 0 + 0 + + + 2 + 25 + 1 + 0 + 0 + 0 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_tim.c + stm32f10x_tim.c + 0 + 0 + + + 2 + 26 + 1 + 0 + 0 + 0 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_usart.c + stm32f10x_usart.c + 0 + 0 + + + 2 + 27 + 1 + 0 + 0 + 0 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_wwdg.c + stm32f10x_wwdg.c + 0 + 0 + + + + + segger + 0 + 0 + 0 + 0 + + 3 + 28 + 1 + 0 + 0 + 0 + ..\..\..\drivers\segger_rtt\SEGGER_RTT.c + SEGGER_RTT.c + 0 + 0 + + + 3 + 29 + 1 + 0 + 0 + 0 + ..\..\..\drivers\segger_rtt\SEGGER_RTT_printf.c + SEGGER_RTT_printf.c + 0 + 0 + + + + + system + 1 + 0 + 0 + 0 + + 4 + 30 + 1 + 0 + 0 + 0 + ..\..\[base_on_stm32f1]\stm32f1_sys\usart_dma.c + usart_dma.c + 0 + 0 + + + 4 + 31 + 1 + 0 + 0 + 0 + ..\..\[base_on_stm32f1]\stm32f1_sys\tim.c + tim.c + 0 + 0 + + + + + source + 1 + 0 + 0 + 0 + + 5 + 32 + 1 + 0 + 0 + 0 + ..\SRC\main.c + main.c + 0 + 0 + + + 5 + 33 + 1 + 0 + 0 + 0 + ..\..\..\drivers\bootloader\bootloader.c + bootloader.c + 0 + 0 + + + 5 + 34 + 1 + 0 + 0 + 0 + ..\..\..\drivers\bootloader\xmodem.c + xmodem.c + 0 + 0 + + + 5 + 35 + 1 + 0 + 0 + 0 + ..\..\..\drivers\common\common_include.c + common_include.c + 0 + 0 + + + + + readme + 1 + 0 + 0 + 0 + + 6 + 36 + 5 + 0 + 0 + 0 + ..\README.txt + README.txt + 0 + 0 + + + +
diff --git a/examples/xmodem/MDK/use_example.uvprojx b/examples/xmodem/MDK/use_example.uvprojx new file mode 100644 index 0000000..bcb76ca --- /dev/null +++ b/examples/xmodem/MDK/use_example.uvprojx @@ -0,0 +1,612 @@ + + + + 2.1 + +
### uVision Project, (C) Keil Software
+ + + + Target 1 + 0x4 + ARM-ADS + 5060960::V5.06 update 7 (build 960)::.\ARMCC + 0 + + + STM32F103C8 + STMicroelectronics + Keil.STM32F1xx_DFP.2.4.1 + https://www.keil.com/pack/ + IRAM(0x20000000,0x00005000) IROM(0x08000000,0x00010000) CPUTYPE("Cortex-M3") CLOCK(12000000) ELITTLE + + + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32F10x_128 -FS08000000 -FL020000 -FP0($$Device:STM32F103C8$Flash\STM32F10x_128.FLM)) + 0 + $$Device:STM32F103C8$Device\Include\stm32f10x.h + + + + + + + + + + $$Device:STM32F103C8$SVD\STM32F103xx.svd + 0 + 0 + + + + + + + 0 + 0 + 0 + 0 + 1 + + .\Objects\ + use_example + 1 + 0 + 1 + 1 + 1 + .\Listings\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 1 + 0 + fromelf.exe --bin -o "$L@L.bin" "#L" + + 0 + 0 + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + SARMCM3.DLL + -REMAP + DCM.DLL + -pCM3 + SARMCM3.DLL + + TCM.DLL + -pCM3 + + + + 1 + 0 + 0 + 0 + 16 + + + + + 1 + 0 + 0 + 1 + 1 + -1 + + 1 + BIN\UL2CM3.DLL + + + + + + 0 + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M3" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 8 + 1 + 0 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x5000 + + + 1 + 0x8000000 + 0x10000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x8000000 + 0x10000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x5000 + + + 0 + 0x0 + 0x0 + + + + + + 1 + 1 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + 0 + 1 + 0 + 0 + 3 + 3 + 1 + 1 + 0 + 0 + 0 + + + STM32F10X_MD,USE_STDPERIPH_DRIVER + + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\inc;..\..\[base_on_stm32f1]\stm32f1_lib\cmsis;..\..\[base_on_stm32f1]\stm32f1_sys;..\..\..\drivers\common;..\..\..\drivers\segger_rtt;..\..\..\drivers\bootloader + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + + + + + + + + + 1 + 0 + 0 + 0 + 1 + 0 + 0x08000000 + 0x20000000 + + + + + + + + + + + + + cmsis + + + core_cm3.c + 1 + ..\..\[base_on_stm32f1]\stm32f1_lib\cmsis\core_cm3.c + + + stm32f10x_it.c + 1 + ..\..\[base_on_stm32f1]\stm32f1_lib\cmsis\stm32f10x_it.c + + + system_stm32f10x.c + 1 + ..\..\[base_on_stm32f1]\stm32f1_lib\cmsis\system_stm32f10x.c + + + startup_stm32f10x_md.s + 2 + ..\..\[base_on_stm32f1]\stm32f1_lib\cmsis\startup\startup_stm32f10x_md.s + + + + + libs + + + misc.c + 1 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\misc.c + + + stm32f10x_adc.c + 1 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_adc.c + + + stm32f10x_bkp.c + 1 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_bkp.c + + + stm32f10x_can.c + 1 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_can.c + + + stm32f10x_cec.c + 1 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_cec.c + + + stm32f10x_crc.c + 1 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_crc.c + + + stm32f10x_dac.c + 1 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_dac.c + + + stm32f10x_dbgmcu.c + 1 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_dbgmcu.c + + + stm32f10x_dma.c + 1 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_dma.c + + + stm32f10x_exti.c + 1 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_exti.c + + + stm32f10x_flash.c + 1 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_flash.c + + + stm32f10x_fsmc.c + 1 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_fsmc.c + + + stm32f10x_gpio.c + 1 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_gpio.c + + + stm32f10x_i2c.c + 1 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_i2c.c + + + stm32f10x_iwdg.c + 1 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_iwdg.c + + + stm32f10x_pwr.c + 1 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_pwr.c + + + stm32f10x_rcc.c + 1 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_rcc.c + + + stm32f10x_rtc.c + 1 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_rtc.c + + + stm32f10x_sdio.c + 1 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_sdio.c + + + stm32f10x_spi.c + 1 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_spi.c + + + stm32f10x_tim.c + 1 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_tim.c + + + stm32f10x_usart.c + 1 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_usart.c + + + stm32f10x_wwdg.c + 1 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_wwdg.c + + + + + segger + + + SEGGER_RTT.c + 1 + ..\..\..\drivers\segger_rtt\SEGGER_RTT.c + + + SEGGER_RTT_printf.c + 1 + ..\..\..\drivers\segger_rtt\SEGGER_RTT_printf.c + + + + + system + + + usart_dma.c + 1 + ..\..\[base_on_stm32f1]\stm32f1_sys\usart_dma.c + + + tim.c + 1 + ..\..\[base_on_stm32f1]\stm32f1_sys\tim.c + + + + + source + + + main.c + 1 + ..\SRC\main.c + + + bootloader.c + 1 + ..\..\..\drivers\bootloader\bootloader.c + + + xmodem.c + 1 + ..\..\..\drivers\bootloader\xmodem.c + + + common_include.c + 1 + ..\..\..\drivers\common\common_include.c + + + + + readme + + + README.txt + 5 + ..\README.txt + + + + + + + + + + + + + + + + + use_example + 1 + + + + +
diff --git a/examples/xmodem/README.txt b/examples/xmodem/README.txt new file mode 100644 index 0000000..ec63bd0 --- /dev/null +++ b/examples/xmodem/README.txt @@ -0,0 +1,44 @@ +================================================================================ + 用例使用说明 +================================================================================ +Date Author MDK MCU +2024-01-07 ashuai0110 5.35 STM32F1 + +================================================================================ +功能描述 +================================================================================ +本用例展示了xmodem协议组件的使用方法。 + +================================================================================ +测试环境 +================================================================================ +测试用板: +--------------------- +任意开发板 + +辅助工具: +--------------------- +J-Link + +辅助软件: +--------------------- +J-Link RTT Viewer + +源码文件: +--------------------- +xxx.c +xxx.h + +================================================================================ +使用步骤 +================================================================================ +1)使用J-Link连接目标板; +2)打开工程,重新编译,启动调试或直接下载程序运行; +3)用J-Link RTT Viewer软件连接,查看打印消息。 + +================================================================================ +注意 +================================================================================ +1)用户根据需求可前往源码头文件修改宏定义参数 + +================================================================================ diff --git a/examples/xmodem/SRC/main.c b/examples/xmodem/SRC/main.c new file mode 100644 index 0000000..6ddb769 --- /dev/null +++ b/examples/xmodem/SRC/main.c @@ -0,0 +1,219 @@ +/** + ****************************************************************************** + * @file main.c + * @author ashuai0110 + * @version V1.0 + * @date 2024-01-07 + * @brief 使用举例-xmodem + * + ****************************************************************************** + * @attention + * + * 版权声明:内容为编者(ashuai0110)原创,使用请注明出处,当然,你也可以不这样做^_^ + * 出处链接:https://gitee.com/ashuai0110/mcu_reuse_development_module + * + ****************************************************************************** + */ + +/* 包含头文件-----------------------------------------------------------------*/ +#include "stm32f10x.h" +#include "usart_dma.h" +#include "tim.h" + +#include "bootloader.h" +#include "xmodem.h" + +/* 私有宏定义-----------------------------------------------------------------*/ +#define XMODEM_TX_RX_TEST (1u) /* 0:Tx test 1:Rx test */ + +/* 私有类型定义---------------------------------------------------------------*/ + +/* 私有变量-------------------------------------------------------------------*/ +static uint8_t usart1DmaTxBuf[200]; /* 串口1dma发送缓存区 */ +static uint8_t usart1DmaRxBuf[200]; /* 串口1dma接收缓存区 */ + +xmodem_t xmodem; /* xmodem实例 */ +static uint8_t xmodemBuf[1029]; /* xmodem数据缓存区 */ + +/* 全局变量-------------------------------------------------------------------*/ + +/* 私有函数原型---------------------------------------------------------------*/ +void usart1_tx_en(uint8_t enState); + + +/** + * @brief 定时器1中断函数 + */ +void TIM1_UP_IRQHandler(void) +{ + if(TIM_GetITStatus(TIM1, TIM_IT_Update) != RESET) + { + /* 组件计时节拍接口 */ + module_tick_inc(1); + + TIM_ClearITPendingBit(TIM1, TIM_FLAG_Update); + } +} + +/** + * @brief 串口1中断 + */ +void USART1_IRQHandler(void) +{ + /* 串口1空闲中断 */ + if(USART_GetITStatus(USART1,USART_IT_IDLE) != RESET) + { + USART1->SR; + USART1->DR; + + /* 这里写接收处理 */ + xmodem_write_rx_buf(&xmodem, usart1DmaRxBuf, sizeof(usart1DmaRxBuf) - DMA_GetCurrDataCounter(DMA1_Channel5)); + /* dma重配置 */ + usart1_dma_rx_reconfig(sizeof(usart1DmaRxBuf)); + } +} + +/** + * @brief 串口1接收的dma中断 + */ +void DMA1_Channel5_IRQHandler(void) +{ + /* DMA传输完成中断 */ + if(DMA_GetITStatus(DMA1_IT_TC5) != RESET) + { + /* 这里写接收处理 */ + xmodem_write_rx_buf(&xmodem, usart1DmaRxBuf, sizeof(usart1DmaRxBuf)); + /* dma重配置 */ + usart1_dma_rx_reconfig(sizeof(usart1DmaRxBuf)); + + DMA_ClearITPendingBit(DMA1_IT_TC5); + } +} + +/** + * @brief 串口1发送的dma中断 + */ +void DMA1_Channel4_IRQHandler(void) +{ + static uint16_t num; + + /* DMA传输完成中断 */ + if(DMA_GetITStatus(DMA1_IT_TC4) != RESET) + { + /* 这里写读取发送内容的处理 */ + num = xmodem_read_tx_buf(&xmodem, usart1DmaTxBuf, sizeof(usart1DmaTxBuf)); /* 读出数据 */ + usart1_dma_tx_reconfig(num); /* dma重配置 */ + + DMA_ClearITPendingBit(DMA1_IT_TC4); + } +} + +/** + * @brief 串口发送前准备函数 + * + * @param enState : 0失能 1使能 + * + * @retval None + */ +void usart1_tx_en(uint8_t enState) +{ + if(enState) + { + /* 判断当前是否正在发送 发送完成标志置位则不是正在发送 */ + if(USART_GetFlagStatus(USART1, USART_FLAG_TC) != RESET) + { + uint16_t num; + num = xmodem_read_tx_buf(&xmodem, usart1DmaTxBuf, sizeof(usart1DmaTxBuf)); /* 读出数据 */ + if(0 < num) + { + usart1_dma_tx_reconfig(num); /* dma重配置 */ + } + else + { + DMA_Cmd(DMA1_Channel4, DISABLE); /* 关闭dma */ + } + } + } + else + { + DMA_Cmd(DMA1_Channel4, DISABLE); + } +} + +/** + * @brief 获取xmodem数据包回调函数 + * + * @param packetNum : 数据包序号 首次从1开始 超出255回到0 + * + * @param data : 有效数据缓冲区(需读出数据) + * + * @param len : 有效数据长度(包含填充内容0x1A) + * + * @retval None + */ +void xmodem_get_packet_callback(uint8_t packetNum, uint8_t *data, uint16_t *len) +{ + uint16_t lenTmp = *len; + + PRINT_LOG("xmodem packet num:%d, len:%d, data: ", packetNum, lenTmp); + for(uint16_t i = 0; i < lenTmp; i++) + { + PRINT_LOG("%02X ", data[i]); + } + PRINT_LOG("\r\n"); +} + +/** + * @brief 设置xmodem数据包回调函数 + * + * @param packetNum : 数据包序号 首次从1开始 超出255回到0 + * + * @param data : 有效数据存放区(需填充数据) + * + * @param len : 有效数据长度(不包含填充内容0x1A,组件自动填充) + * + * @retval None + */ +void xmodem_set_packet_callback(uint8_t packetNum, uint8_t *data, uint16_t *len) +{ + /* 用户自行计算数据量并在发送完全后给len赋值0 */ + if(packetNum > 100) + { + *len = 0; + } /* 用户自行选择携带128或1024字节数据并将数据赋值给data */ + else + { + *len = 1024; + memset((void *)data, packetNum + '0', 1024); + } +} + +/** + * @brief main + */ +int main(int argc, char *argv[]) +{ + VERSION_LOG("example-xmodem", 1, 0, 0); + + /* 串口及其dma初始化 */ + usart1_dma_init_config(115200, usart1DmaTxBuf, sizeof(usart1DmaTxBuf), usart1DmaRxBuf, sizeof(usart1DmaRxBuf)); + /* 定时器初始化 1ms */ + tim1_init_config(100-1, 720-1); + + /* xmodem组件初始化 */ + xmodem_init(&xmodem, xmodemBuf, sizeof(xmodemBuf), usart1_tx_en, xmodem_get_packet_callback, xmodem_set_packet_callback, 2000); + /* 启动xmodem接收 */ +#if XMODEM_TX_RX_TEST + xmodem_rx_start(&xmodem, XMODEM_RX_FLAG_CRC); +#endif + + while(1) + { +#if XMODEM_TX_RX_TEST + xmodem_rx_poll(&xmodem); +#else + xmodem_tx_poll(&xmodem); +#endif + } +} + -- Gitee From a75bb22c29b3c79941afcbe6b8ccbc3f0b45f8ef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=98=BF=E8=A1=B00110?= Date: Sun, 7 Jan 2024 22:25:46 +0800 Subject: [PATCH 35/66] =?UTF-8?q?=E4=BC=98=E5=8C=96=E4=B8=B2=E5=8F=A3dma?= =?UTF-8?q?=E9=87=8D=E9=85=8D=E7=BD=AE=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- examples/[base_on_stm32f1]/stm32f1_sys/usart_dma.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/examples/[base_on_stm32f1]/stm32f1_sys/usart_dma.c b/examples/[base_on_stm32f1]/stm32f1_sys/usart_dma.c index 7fe058b..77aeacd 100644 --- a/examples/[base_on_stm32f1]/stm32f1_sys/usart_dma.c +++ b/examples/[base_on_stm32f1]/stm32f1_sys/usart_dma.c @@ -139,17 +139,17 @@ void usart1_dma_init_config(uint32_t baudRate, uint8_t *pTxBuf, uint16_t txBufLe /* Enable the USART1 Interrupt */ NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4); NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; - NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; + NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel4_IRQn; - NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; + NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel5_IRQn; - NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3; + NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); @@ -162,6 +162,8 @@ void usart1_dma_init_config(uint32_t baudRate, uint8_t *pTxBuf, uint16_t txBufLe */ void usart1_dma_tx_reconfig(uint16_t num) { + if(num == 0) { return ; } + DMA_Cmd(DMA1_Channel4, DISABLE); DMA_SetCurrDataCounter(DMA1_Channel4, num); DMA_Cmd(DMA1_Channel4, ENABLE); @@ -174,6 +176,8 @@ void usart1_dma_tx_reconfig(uint16_t num) */ void usart1_dma_rx_reconfig(uint16_t num) { + if(num == 0) { return ; } + DMA_Cmd(DMA1_Channel5, DISABLE); DMA_SetCurrDataCounter(DMA1_Channel5, num); DMA_Cmd(DMA1_Channel5, ENABLE); -- Gitee From c6b5a6fe8b7b9f967776180fd42f233c98124dfb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=98=BF=E8=A1=B00110?= Date: Mon, 8 Jan 2024 20:30:07 +0800 Subject: [PATCH 36/66] =?UTF-8?q?xmodem=E7=BB=84=E4=BB=B6=E6=BA=90?= =?UTF-8?q?=E7=A0=81=E5=8F=8A=E4=BE=8B=E7=A8=8B=E5=86=85=E5=AE=B9=E5=AE=8C?= =?UTF-8?q?=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- drivers/bootloader/xmodem.c | 59 +++++----- drivers/bootloader/xmodem.h | 10 +- examples/xmodem/MDK/use_example.uvoptx | 144 +++++++++++++++++++++--- examples/xmodem/MDK/use_example.uvprojx | 5 - examples/xmodem/README.txt | 11 +- examples/xmodem/SRC/main.c | 3 +- 6 files changed, 174 insertions(+), 58 deletions(-) diff --git a/drivers/bootloader/xmodem.c b/drivers/bootloader/xmodem.c index 1ea697d..3c6044d 100644 --- a/drivers/bootloader/xmodem.c +++ b/drivers/bootloader/xmodem.c @@ -3,7 +3,7 @@ * @file xmodem.c * @author ashuai0110 * @version V1.0 - * @date 2024-01-07 + * @date 2024-01-08 * @brief xmodem协议 * ****************************************************************************** @@ -23,23 +23,23 @@ #include "xmodem.h" /** - * @addtogroup modules + * @addtogroup bootloader * @{ */ /** - * @defgroup command_line command_line + * @defgroup xmodem xmodem * @{ */ /* 私有宏定义-----------------------------------------------------------------*/ /** - * @defgroup command_line_local_macros command line local macros + * @defgroup xmodem_local_macros xmodem local macros * @{ */ /** - * @defgroup command_line_check_parameters_validity command line check parameters validity + * @defgroup xmodem_check_parameters_validity xmodem check parameters validity * @{ */ /* xmodem接收标志有效性检查 */ @@ -58,21 +58,12 @@ /* 私有类型定义---------------------------------------------------------------*/ /* 私有变量-------------------------------------------------------------------*/ -/** - * @defgroup command_line_local_variables command line local variables - * @{ - */ - - -/** - * @} - */ /* 全局变量-------------------------------------------------------------------*/ /* 私有函数原型---------------------------------------------------------------*/ /** - * @defgroup command_line_local_functions command line local functions + * @defgroup xmodem_local_functions xmodem local functions * @{ */ @@ -145,7 +136,7 @@ inline static void xmodem_init_state(xmodem_t *_xmodem) */ /** - * @defgroup command_line_global_functions command line global functions + * @defgroup xmodem_global_functions xmodem global functions * @{ */ @@ -168,7 +159,7 @@ inline static void xmodem_init_state(xmodem_t *_xmodem) * * @retval None */ -void xmodem_init(xmodem_t *_xmodem, void *dataBuf, uint16_t bufLen, xmodem_tx_en_t txEnFn, +void xmodem_init(xmodem_t *_xmodem, void *dataBuf, uint16_t bufLen, xmodem_tx_en_t txEnFn, \ xmodem_user_packet_cb_t getPacketFn, xmodem_user_packet_cb_t setPacketFn, uint16_t rspTimeout) { ASSERT_PARAM(IS_VALID_POINT(_xmodem)); @@ -480,21 +471,29 @@ uint16_t xmodem_write_rx_buf(xmodem_t *_xmodem, void *pBuf, uint16_t len) ASSERT_PARAM(IS_VALID_POINT(_xmodem->dataBuf)); ASSERT_PARAM(IS_VALID_POINT(pBuf)); - unusedLen = _xmodem->dataBufLen - _xmodem->dataLen; - len = (len > unusedLen) ? unusedLen : len; - - if(0 < len && XMODEM_STATE_WAIT >= _xmodem->state) + /* 在IDLE和WAIT状态下可以接收数据 */ + if(XMODEM_STATE_WAIT >= _xmodem->state) { - memcpy((void *)&_xmodem->dataBuf[_xmodem->dataLen], (void *)pBuf, len); - _xmodem->dataLen += len; - _xmodem->rspTimeoutCnt = 0; - if(XMODEM_STATE_WAIT == _xmodem->state) + /* 计算可写数量 */ + unusedLen = _xmodem->dataBufLen - _xmodem->dataLen; + len = (len > unusedLen) ? unusedLen : len; + + if(0 < len) { - _xmodem->state = XMODEM_STATE_CHECK_HEAD; + /* 接续copy数据并记录数量 */ + memcpy((void *)&_xmodem->dataBuf[_xmodem->dataLen], (void *)pBuf, len); + _xmodem->dataLen += len; + _xmodem->rspTimeoutCnt = 0; /* 关闭回复超时计数 */ + if(XMODEM_STATE_WAIT == _xmodem->state) + { + _xmodem->state = XMODEM_STATE_CHECK_HEAD; /* 切换状态 */ + } + + return len; } } - return len; + return 0; } /** @@ -520,18 +519,22 @@ uint16_t xmodem_read_tx_buf(xmodem_t *_xmodem, void *pBuf, uint16_t len) ASSERT_PARAM(IS_VALID_POINT(_xmodem->dataBuf)); ASSERT_PARAM(IS_VALID_POINT(pBuf)); + /* 计算可读数量 */ unreadLen = _xmodem->dataLen - _xmodem->readLen; len = (len > unreadLen) ? unreadLen : len; if(0 < len) { + /* copy数据至外部存储区并记录数量 */ memcpy((void *)pBuf, (void *)&_xmodem->dataBuf[_xmodem->readLen], len); _xmodem->readLen += len; + /* 数据被全部copy出去 */ if(_xmodem->readLen == _xmodem->dataLen) { + /* 清零相关计数 */ _xmodem->dataLen = 0; _xmodem->readLen = 0; - _xmodem->rspTimeoutCnt = module_tick_get(); + _xmodem->rspTimeoutCnt = module_tick_get(); /*开启回复超时计数*/ } } diff --git a/drivers/bootloader/xmodem.h b/drivers/bootloader/xmodem.h index c2af29c..06eb751 100644 --- a/drivers/bootloader/xmodem.h +++ b/drivers/bootloader/xmodem.h @@ -3,7 +3,7 @@ * @file xmodem.h * @author ashuai0110 * @version V1.0 - * @date 2024-01-07 + * @date 2024-01-08 * @brief xmodem协议 * ****************************************************************************** @@ -26,7 +26,7 @@ extern "C" { #include "common_include.h" /** - * @addtogroup modules + * @addtogroup bootloader * @{ */ @@ -136,8 +136,8 @@ typedef struct xmodem { uint8_t rspTimeoutTimes; /*!< 回复超时次数 */ uint8_t packetNum; /*!< 包序号 */ - uint8_t state : 3; /*!< xmodem状态 */ - uint8_t checkNum : 2; /*!< 校验字节数 */ + uint8_t state : 3; /*!< xmodem状态 @ref xmodem_rx_state */ + uint8_t checkNum : 2; /*!< 校验字节数 1/2 */ xmodem_tx_en_t txEnFn; /*!< 串口发送准备函数 */ xmodem_user_packet_cb_t getPacketFn; /*!< 获取数据包回调函数 */ @@ -156,7 +156,7 @@ typedef struct xmodem { * @{ */ -void xmodem_init(xmodem_t *_xmodem, void *dataBuf, uint16_t bufLen, xmodem_tx_en_t txEnFn, +void xmodem_init(xmodem_t *_xmodem, void *dataBuf, uint16_t bufLen, xmodem_tx_en_t txEnFn, \ xmodem_user_packet_cb_t getPacketFn, xmodem_user_packet_cb_t setPacketFn, uint16_t rspTimeout); void xmodem_rx_poll(xmodem_t *_xmodem); diff --git a/examples/xmodem/MDK/use_example.uvoptx b/examples/xmodem/MDK/use_example.uvoptx index 95a778e..530288b 100644 --- a/examples/xmodem/MDK/use_example.uvoptx +++ b/examples/xmodem/MDK/use_example.uvoptx @@ -293,6 +293,134 @@ + + 9 + 0 + 196 + 1 +
0
+ 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\drivers\bootloader\xmodem.c + + +
+ + 10 + 0 + 198 + 1 +
0
+ 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\drivers\bootloader\xmodem.c + + +
+ + 11 + 0 + 220 + 1 +
0
+ 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\drivers\bootloader\xmodem.c + + +
+ + 12 + 0 + 221 + 1 +
0
+ 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\drivers\bootloader\xmodem.c + + +
+ + 13 + 0 + 225 + 1 +
0
+ 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\drivers\bootloader\xmodem.c + + +
+ + 14 + 0 + 226 + 1 +
0
+ 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\drivers\bootloader\xmodem.c + + +
+ + 15 + 0 + 268 + 1 +
0
+ 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\drivers\bootloader\xmodem.c + + +
+ + 16 + 0 + 270 + 1 +
0
+ 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\drivers\bootloader\xmodem.c + + +
@@ -817,18 +945,6 @@ 0 0 0 - ..\..\..\drivers\bootloader\bootloader.c - bootloader.c - 0 - 0 - - - 5 - 34 - 1 - 0 - 0 - 0 ..\..\..\drivers\bootloader\xmodem.c xmodem.c 0 @@ -836,7 +952,7 @@ 5 - 35 + 34 1 0 0 @@ -856,7 +972,7 @@ 0 6 - 36 + 35 5 0 0 diff --git a/examples/xmodem/MDK/use_example.uvprojx b/examples/xmodem/MDK/use_example.uvprojx index bcb76ca..f7d1d54 100644 --- a/examples/xmodem/MDK/use_example.uvprojx +++ b/examples/xmodem/MDK/use_example.uvprojx @@ -563,11 +563,6 @@ 1 ..\SRC\main.c - - bootloader.c - 1 - ..\..\..\drivers\bootloader\bootloader.c - xmodem.c 1 diff --git a/examples/xmodem/README.txt b/examples/xmodem/README.txt index ec63bd0..3795f34 100644 --- a/examples/xmodem/README.txt +++ b/examples/xmodem/README.txt @@ -2,7 +2,7 @@ 用例使用说明 ================================================================================ Date Author MDK MCU -2024-01-07 ashuai0110 5.35 STM32F1 +2024-01-08 ashuai0110 5.35 STM32F1 ================================================================================ 功能描述 @@ -23,18 +23,21 @@ J-Link 辅助软件: --------------------- J-Link RTT Viewer +SecureCRT串口软件 源码文件: --------------------- -xxx.c -xxx.h +xmodem.c +xmodem.h ================================================================================ 使用步骤 ================================================================================ 1)使用J-Link连接目标板; 2)打开工程,重新编译,启动调试或直接下载程序运行; -3)用J-Link RTT Viewer软件连接,查看打印消息。 +3)用J-Link RTT Viewer软件连接,查看打印消息; +4)用SecureCRT串口软件连接设备串口,点击工具栏Transfer->Send Xmodem + 或Transfer->Receive Xmodem选项开始传输 ================================================================================ 注意 diff --git a/examples/xmodem/SRC/main.c b/examples/xmodem/SRC/main.c index 6ddb769..bfe57c9 100644 --- a/examples/xmodem/SRC/main.c +++ b/examples/xmodem/SRC/main.c @@ -3,7 +3,7 @@ * @file main.c * @author ashuai0110 * @version V1.0 - * @date 2024-01-07 + * @date 2024-01-08 * @brief 使用举例-xmodem * ****************************************************************************** @@ -20,7 +20,6 @@ #include "usart_dma.h" #include "tim.h" -#include "bootloader.h" #include "xmodem.h" /* 私有宏定义-----------------------------------------------------------------*/ -- Gitee From 80ef87f9cea3ae80b40aee6e6b592a529a1fa316 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=98=BF=E8=A1=B00110?= Date: Mon, 8 Jan 2024 20:31:41 +0800 Subject: [PATCH 37/66] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=9F=A5=E8=A1=A8?= =?UTF-8?q?=E7=9A=84crc16=E4=B8=BA=E8=AE=A1=E7=AE=97=E7=9A=84=EF=BC=8C?= =?UTF-8?q?=E5=B9=B6=E4=BF=AE=E6=94=B9=E5=9B=A0=E6=AD=A4=E5=AF=BC=E8=87=B4?= =?UTF-8?q?=E7=9A=84=E4=B8=80=E4=BA=9B=E4=BD=8F=E4=BB=8E=E6=9C=BA=E7=A8=8B?= =?UTF-8?q?=E5=BA=8F=E9=80=BB=E8=BE=91=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- drivers/modbus/modbus_common.c | 101 +++++--------------- drivers/modbus/modbus_common.h | 11 +-- drivers/modbus/modbus_host.c | 36 +++++-- drivers/modbus/modbus_host.h | 2 +- drivers/modbus/modbus_slave.c | 29 ++++-- drivers/modbus/modbus_slave.h | 3 +- examples/modbus_host/MDK/use_example.uvoptx | 35 ++++++- examples/modbus_host/README.txt | 2 +- examples/modbus_host/SRC/main.c | 4 +- 9 files changed, 121 insertions(+), 102 deletions(-) diff --git a/drivers/modbus/modbus_common.c b/drivers/modbus/modbus_common.c index 2f72fc4..103aa2b 100644 --- a/drivers/modbus/modbus_common.c +++ b/drivers/modbus/modbus_common.c @@ -3,7 +3,7 @@ * @file modbus_common.c * @author ashuai0110 * @version V2.1 - * @date 2023-10-27 + * @date 2024-01-08 * @brief modbus通用文件 * ****************************************************************************** @@ -15,6 +15,7 @@ * Change Logs: * Date Author Notes * 2023-10-27 ashuai0110 完成基本内容 + * 2024-01-08 ashuai0110 修改查表的crc16为计算的 * ****************************************************************************** */ @@ -42,66 +43,7 @@ * @{ */ -/* CRC 高位字节值表 */ -static const uint8_t crcHiArr[] = { - 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, - 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, - 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, - 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, - 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, - 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, - 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, - 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, - 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, - 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, - 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, - 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, - 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, - 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, - 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, - 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, - 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, - 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, - 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, - 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, - 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, - 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, - 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, - 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, - 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, - 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40 -}; -/* CRC 低位字节值表 */ -static const uint8_t crcLoArr[] = { - 0x00, 0xC0, 0xC1, 0x01, 0xC3, 0x03, 0x02, 0xC2, 0xC6, 0x06, - 0x07, 0xC7, 0x05, 0xC5, 0xC4, 0x04, 0xCC, 0x0C, 0x0D, 0xCD, - 0x0F, 0xCF, 0xCE, 0x0E, 0x0A, 0xCA, 0xCB, 0x0B, 0xC9, 0x09, - 0x08, 0xC8, 0xD8, 0x18, 0x19, 0xD9, 0x1B, 0xDB, 0xDA, 0x1A, - 0x1E, 0xDE, 0xDF, 0x1F, 0xDD, 0x1D, 0x1C, 0xDC, 0x14, 0xD4, - 0xD5, 0x15, 0xD7, 0x17, 0x16, 0xD6, 0xD2, 0x12, 0x13, 0xD3, - 0x11, 0xD1, 0xD0, 0x10, 0xF0, 0x30, 0x31, 0xF1, 0x33, 0xF3, - 0xF2, 0x32, 0x36, 0xF6, 0xF7, 0x37, 0xF5, 0x35, 0x34, 0xF4, - 0x3C, 0xFC, 0xFD, 0x3D, 0xFF, 0x3F, 0x3E, 0xFE, 0xFA, 0x3A, - 0x3B, 0xFB, 0x39, 0xF9, 0xF8, 0x38, 0x28, 0xE8, 0xE9, 0x29, - 0xEB, 0x2B, 0x2A, 0xEA, 0xEE, 0x2E, 0x2F, 0xEF, 0x2D, 0xED, - 0xEC, 0x2C, 0xE4, 0x24, 0x25, 0xE5, 0x27, 0xE7, 0xE6, 0x26, - 0x22, 0xE2, 0xE3, 0x23, 0xE1, 0x21, 0x20, 0xE0, 0xA0, 0x60, - 0x61, 0xA1, 0x63, 0xA3, 0xA2, 0x62, 0x66, 0xA6, 0xA7, 0x67, - 0xA5, 0x65, 0x64, 0xA4, 0x6C, 0xAC, 0xAD, 0x6D, 0xAF, 0x6F, - 0x6E, 0xAE, 0xAA, 0x6A, 0x6B, 0xAB, 0x69, 0xA9, 0xA8, 0x68, - 0x78, 0xB8, 0xB9, 0x79, 0xBB, 0x7B, 0x7A, 0xBA, 0xBE, 0x7E, - 0x7F, 0xBF, 0x7D, 0xBD, 0xBC, 0x7C, 0xB4, 0x74, 0x75, 0xB5, - 0x77, 0xB7, 0xB6, 0x76, 0x72, 0xB2, 0xB3, 0x73, 0xB1, 0x71, - 0x70, 0xB0, 0x50, 0x90, 0x91, 0x51, 0x93, 0x53, 0x52, 0x92, - 0x96, 0x56, 0x57, 0x97, 0x55, 0x95, 0x94, 0x54, 0x9C, 0x5C, - 0x5D, 0x9D, 0x5F, 0x9F, 0x9E, 0x5E, 0x5A, 0x9A, 0x9B, 0x5B, - 0x99, 0x59, 0x58, 0x98, 0x88, 0x48, 0x49, 0x89, 0x4B, 0x8B, - 0x8A, 0x4A, 0x4E, 0x8E, 0x8F, 0x4F, 0x8D, 0x4D, 0x4C, 0x8C, - 0x44, 0x84, 0x85, 0x45, 0x87, 0x47, 0x46, 0x86, 0x82, 0x42, - 0x43, 0x83, 0x41, 0x81, 0x80, 0x40 -}; - -/* HEX转ASCII */ +/* HEX转ASCII表 */ static const char HEX_TO_ASCII[] = {0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0X41,0X42,0X43,0X44,0X45,0X46}; /** @@ -118,46 +60,55 @@ static const char HEX_TO_ASCII[] = {0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38 */ /** - * @brief CRC16校验(MODBUS) + * @brief CRC16-MODBUS校验 * - * @param pBuf : 校验数据 + * @param data : 校验数据 * * @param len : 校验数据长度 * * @retval 校验结果 */ -uint16_t mb_check_crc16(uint8_t *pBuf, uint16_t len) +uint16_t mb_check_crc16(uint8_t *data, uint16_t len) { - uint8_t crcHi = 0xFF; /* 高CRC字节初始化 */ - uint8_t crcLo = 0xFF; /* 低CRC 字节初始化 */ - uint16_t index; /* CRC循环中的索引 */ + uint8_t cnt; + uint16_t crc = 0xFFFF; while(len--) { - index = crcHi ^ *pBuf++; /* 计算CRC */ - crcHi = crcLo ^ crcHiArr[index]; - crcLo = crcLoArr[index]; + crc ^= *data; + data++; + for(cnt = 0; cnt < 8; ++cnt) + { + if(crc & 0x01) + { + crc = (crc >> 1) ^ 0xA001; + } + else + { + crc >>= 1; + } + } } - - return ((uint16_t)crcHi << 8 | crcLo); + + return crc; } /** * @brief LRC校验 * - * @param pBuf : 校验数据 + * @param data : 校验数据 * * @param len : 校验数据长度 * * @retval 校验结果 */ -uint8_t mb_check_lrc(uint8_t *pBuf, uint16_t len) +uint8_t mb_check_lrc(uint8_t *data, uint16_t len) { uint8_t lrc = 0; for(uint16_t index = 0; index < len; index++) { - lrc += pBuf[index]; + lrc += data[index]; } lrc = (~lrc) + 1; diff --git a/drivers/modbus/modbus_common.h b/drivers/modbus/modbus_common.h index 1e3c5b4..1786c14 100644 --- a/drivers/modbus/modbus_common.h +++ b/drivers/modbus/modbus_common.h @@ -3,7 +3,7 @@ * @file modbus_common.h * @author ashuai0110 * @version V2.1 - * @date 2023-10-27 + * @date 2024-01-08 * @brief modbus通用文件 * ****************************************************************************** @@ -81,10 +81,9 @@ extern "C" { */ #define MB_RTU (0u) /*!< RTU协议 */ #define MB_ASCII (1u) /*!< ASCII协议 */ -/* modbus协议类型有效性检查 */ #define IS_VALID_MB_PROTOCOL(x) \ -( (x) == MB_RTU || \ - (x) == MB_ASCII) +( ((x) == MB_RTU) || \ + ((x) == MB_ASCII)) /** * @} */ @@ -147,8 +146,8 @@ typedef void (* modbus_tx_en_t)(uint8_t enState); * @{ */ -uint16_t mb_check_crc16(uint8_t *pBuf, uint16_t len); -uint8_t mb_check_lrc(uint8_t *pBuf, uint16_t len); +uint16_t mb_check_crc16(uint8_t *data, uint16_t len); +uint8_t mb_check_lrc(uint8_t *data, uint16_t len); void mb_hex_to_ascii(uint8_t *pHex, uint16_t num, uint8_t *pAscii); void mb_ascii_to_hex(uint8_t *pAscii, uint16_t num, uint8_t *pHex); diff --git a/drivers/modbus/modbus_host.c b/drivers/modbus/modbus_host.c index ebe4a96..cf7c8e1 100644 --- a/drivers/modbus/modbus_host.c +++ b/drivers/modbus/modbus_host.c @@ -3,7 +3,7 @@ * @file modbus_host.c * @author ashuai0110 * @version V2.1 - * @date 2024-01-02 + * @date 2024-01-08 * @brief modbus主机程序(RTU ASCII) * ****************************************************************************** @@ -105,6 +105,8 @@ static void mb_host_rspProcess(uint8_t ch) /** * @brief 追加校验后发送 * + * @note modbus的地址和数据项采用大端序,CRC16校验采用小端序 + * * @param ch : modbus主机管理序号(即数组索引) * * @retval None @@ -122,6 +124,7 @@ static void mb_host_send_with_check(uint8_t ch) /* HEX转ASCII */ mb_hex_to_ascii(&mbHostArr[ch].dataBuf[0], mbHostArr[ch].dataLen, &mbHostArr[ch].dataBuf[0]); mbHostArr[ch].dataLen = (mbHostArr[ch].dataLen << 1) + 3; + /* 添加帧头帧尾标志符 */ mbHostArr[ch].dataBuf[0] = 0x3A; mbHostArr[ch].dataBuf[mbHostArr[ch].dataLen - 2] = 0x0D; mbHostArr[ch].dataBuf[mbHostArr[ch].dataLen - 1] = 0x0A; @@ -130,8 +133,8 @@ static void mb_host_send_with_check(uint8_t ch) { /* 追加CRC校验结果 */ checkVal = mb_check_crc16(mbHostArr[ch].dataBuf, mbHostArr[ch].dataLen); - mbHostArr[ch].dataBuf[mbHostArr[ch].dataLen++] = checkVal >> 8; mbHostArr[ch].dataBuf[mbHostArr[ch].dataLen++] = checkVal; + mbHostArr[ch].dataBuf[mbHostArr[ch].dataLen++] = checkVal >> 8; } #if _MBH_DEBUG PRINT_LOG("modbus host[%d] send: ", ch); @@ -165,6 +168,7 @@ static void mb_host_send_with_check(uint8_t ch) */ static void mb_host_cmd_01_04h(uint8_t ch, uint8_t slaveAddr, uint8_t funCode, uint16_t reg, uint16_t num) { + /* 根据协议对应填值 */ mbHostArr[ch].dataLen = 0; mbHostArr[ch].dataBuf[mbHostArr[ch].dataLen++] = slaveAddr; mbHostArr[ch].dataBuf[mbHostArr[ch].dataLen++] = funCode; @@ -194,6 +198,7 @@ static void mb_host_cmd_01_04h(uint8_t ch, uint8_t slaveAddr, uint8_t funCode, u */ static void mb_host_cmd_05h(uint8_t ch, uint8_t slaveAddr, uint16_t reg, uint8_t extend) { + /* 根据协议对应填值 */ mbHostArr[ch].dataLen = 0; mbHostArr[ch].dataBuf[mbHostArr[ch].dataLen++] = slaveAddr; mbHostArr[ch].dataBuf[mbHostArr[ch].dataLen++] = 0x05; @@ -223,6 +228,7 @@ static void mb_host_cmd_05h(uint8_t ch, uint8_t slaveAddr, uint16_t reg, uint8_t */ static void mb_host_cmd_06h(uint8_t ch, uint8_t slaveAddr, uint16_t reg, uint16_t extend) { + /* 根据协议对应填值 */ mbHostArr[ch].dataLen = 0; mbHostArr[ch].dataBuf[mbHostArr[ch].dataLen++] = slaveAddr; mbHostArr[ch].dataBuf[mbHostArr[ch].dataLen++] = 0x06; @@ -256,6 +262,7 @@ static void mb_host_cmd_0fh(uint8_t ch, uint8_t slaveAddr, uint16_t reg, uint16_ { uint16_t bytes = (num + 7) >> 3; + /* 根据协议对应填值 */ mbHostArr[ch].dataLen = 0; mbHostArr[ch].dataBuf[mbHostArr[ch].dataLen++] = slaveAddr; mbHostArr[ch].dataBuf[mbHostArr[ch].dataLen++] = 0x0F; @@ -294,6 +301,7 @@ static void mb_host_cmd_10h(uint8_t ch, uint8_t slaveAddr, uint16_t reg, uint16_ { uint16_t bytes = num << 1; + /* 根据协议对应填值 */ mbHostArr[ch].dataLen = 0; mbHostArr[ch].dataBuf[mbHostArr[ch].dataLen++] = slaveAddr; mbHostArr[ch].dataBuf[mbHostArr[ch].dataLen++] = 0x10; @@ -477,7 +485,7 @@ uint8_t mb_host_poll(uint8_t ch) { /* CRC校验判断 */ checkVal = mb_check_crc16(&mbHostArr[ch].dataBuf[0], mbHostArr[ch].dataLen - 2); - if(checkVal != ((mbHostArr[ch].dataBuf[mbHostArr[ch].dataLen - 2] << 8) | mbHostArr[ch].dataBuf[mbHostArr[ch].dataLen - 1])) + if(checkVal != ((mbHostArr[ch].dataBuf[mbHostArr[ch].dataLen - 2]) | mbHostArr[ch].dataBuf[mbHostArr[ch].dataLen - 1] << 8)) { ret = RET_CHECK_ERR; /* 应答数据校验错误 */ goto rspErr; @@ -524,11 +532,13 @@ uint8_t mb_host_send_cmd(uint8_t ch, uint8_t slaveAddr, uint8_t funCode, uint16_ { ASSERT_PARAM(IS_VALID_MBH_CH(ch)); + /* 在TX_IDLE状态可以发送数据 */ if(MB_TX_IDLE != mbHostArr[ch].state) { return RET_ERR; } - + /* 暂存参数 */ mbHostArr[ch].slaveTmp = slaveAddr; mbHostArr[ch].numTmp = num; mbHostArr[ch].regTmp = reg; + /* 从机地址为0则为广播发送,非0则非广播发送 */ if(slaveAddr) { mbHostArr[ch].broadcast = 0; } else { mbHostArr[ch].broadcast = 1; } @@ -598,13 +608,16 @@ uint16_t mb_host_write_rx_buf(uint8_t ch, void *pBuf, uint16_t len) ASSERT_PARAM(IS_VALID_MBH_CH(ch)); ASSERT_PARAM(IS_VALID_POINT(pBuf)); + /* 在RX_IDLE状态下可以接收数据 */ if(MB_RX_IDLE == mbHostArr[ch].state) { + /* 计算可写数量 */ unusedLen = mbHostArr[ch].dataBufLen - mbHostArr[ch].dataLen; len = (len > unusedLen) ? unusedLen : len; if(0 < len) { + /* 接续copy数据并记录数量 */ memcpy((void *)&mbHostArr[ch].dataBuf[mbHostArr[ch].dataLen], pBuf, len); mbHostArr[ch].dataLen += len; mbHostArr[ch].curFrameIntv = module_tick_get(); /* 开启帧间隔超时计数 */ @@ -639,23 +652,29 @@ uint16_t mb_host_read_tx_buf(uint8_t ch, void *pBuf, uint16_t len) ASSERT_PARAM(IS_VALID_MBH_CH(ch)); ASSERT_PARAM(IS_VALID_POINT(pBuf)); + /* 在TX_BUSY状态下可以发送数据 */ if(MB_TX_BUSY == mbHostArr[ch].state) { + /* 计算可读数量 */ unreadLen = mbHostArr[ch].dataLen - mbHostArr[ch].readLen; len = (len > unreadLen) ? unreadLen : len; if(0 < len) { + /* copy数据至外部存储区并记录数量 */ memcpy(pBuf, (void *)&mbHostArr[ch].dataBuf[mbHostArr[ch].readLen], len); mbHostArr[ch].readLen += len; + /* 数据被全部copy出去 */ if(mbHostArr[ch].dataLen == mbHostArr[ch].readLen) { + /* 清零相关计数 */ mbHostArr[ch].dataLen = 0; mbHostArr[ch].readLen = 0; + /* 以广播发出 */ if(mbHostArr[ch].broadcast) { mbHostArr[ch].state = MB_TX_IDLE; /* 切换状态 */ - } + } /* 非广播发出 */ else { mbHostArr[ch].rspTimeoutCnt = module_tick_get(); /* 开启应答超时计数 */ @@ -719,14 +738,15 @@ uint8_t mb_host_get_protocol(uint8_t ch) */ void mb_host_set_frame_intv(uint8_t ch, uint32_t baud) { + /* 波特率>9600则默认取3ms */ if(9600 < baud) { mbHostArr[ch].targetFrameIntv = 3; - } + } /* 波特率=0则取0ms */ else if(0 == baud) { mbHostArr[ch].targetFrameIntv = 0; - } + } /* 波特率<=9600则取该波特率下传输3.5个字节的时间 */ else { mbHostArr[ch].targetFrameIntv = 10000 / baud * 3.5; @@ -899,7 +919,7 @@ __WEAK void mb_host_rsp_04h(uint8_t ch, uint16_t reg, uint16_t num, uint8_t *pDa * @note 从机地址 | 功能码 | 起始地址 | 写入值/数量 | CRC16 * 1 | 1 | 2 | 2 | 2 (占用字节) * - * @param None + * @param ch : modbus主机管理序号(即数组索引) * * @retval None */ diff --git a/drivers/modbus/modbus_host.h b/drivers/modbus/modbus_host.h index e3d7f88..9e24b64 100644 --- a/drivers/modbus/modbus_host.h +++ b/drivers/modbus/modbus_host.h @@ -3,7 +3,7 @@ * @file modbus_host.h * @author ashuai0110 * @version V2.1 - * @date 2024-01-02 + * @date 2024-01-08 * @brief modbus主机程序(RTU ASCII) * ****************************************************************************** diff --git a/drivers/modbus/modbus_slave.c b/drivers/modbus/modbus_slave.c index ffa99f5..d785584 100644 --- a/drivers/modbus/modbus_slave.c +++ b/drivers/modbus/modbus_slave.c @@ -3,7 +3,7 @@ * @file modbus_slave.c * @author ashuai0110 * @version V2.1 - * @date 2024-01-02 + * @date 2024-01-08 * @brief modbus从机程序(RTU ASCII) * ****************************************************************************** @@ -84,6 +84,8 @@ static mb_slave_t mbSlaveArr[MBS_NUM]; /* modbus从机管理数组 */ /** * @brief 追加校验后发送 * + * @note modbus的地址和数据项采用大端序,CRC16校验采用小端序 + * * @param ch : modbus主机管理序号(即数组索引) * * @retval None @@ -101,6 +103,7 @@ static void mb_slave_send_with_check(uint8_t ch) /* HEX转ASCII */ mb_hex_to_ascii(&mbSlaveArr[ch].dataBuf[0], mbSlaveArr[ch].dataLen, &mbSlaveArr[ch].dataBuf[0]); mbSlaveArr[ch].dataLen = (mbSlaveArr[ch].dataLen << 1) + 3; + /* 添加帧头帧尾标志符 */ mbSlaveArr[ch].dataBuf[0] = 0x3A; mbSlaveArr[ch].dataBuf[mbSlaveArr[ch].dataLen - 2] = 0x0D; mbSlaveArr[ch].dataBuf[mbSlaveArr[ch].dataLen - 1] = 0x0A; @@ -109,8 +112,8 @@ static void mb_slave_send_with_check(uint8_t ch) { /* 追加CRC校验结果 */ checkVal = mb_check_crc16(mbSlaveArr[ch].dataBuf, mbSlaveArr[ch].dataLen); - mbSlaveArr[ch].dataBuf[mbSlaveArr[ch].dataLen++] = checkVal >> 8; mbSlaveArr[ch].dataBuf[mbSlaveArr[ch].dataLen++] = checkVal; + mbSlaveArr[ch].dataBuf[mbSlaveArr[ch].dataLen++] = checkVal >> 8; } #if _MBS_DEBUG PRINT_LOG("modbus slave[%d] send: ", ch); @@ -133,6 +136,7 @@ static void mb_slave_send_with_check(uint8_t ch) */ static void mb_slave_reqProcess(uint8_t ch) { + /* 从协议中计算出寄存器地址和数量 */ uint16_t reg = (mbSlaveArr[ch].dataBuf[MB_REG_ADDR_HI_OFF] << 8) | mbSlaveArr[ch].dataBuf[MB_REG_ADDR_LO_OFF]; uint16_t num = (mbSlaveArr[ch].dataBuf[MB_NUM_HI_OFF] << 8) | mbSlaveArr[ch].dataBuf[MB_NUM_LO_OFF]; uint8_t errCodeTmp = MB_ERRNO_OK; @@ -141,21 +145,25 @@ static void mb_slave_reqProcess(uint8_t ch) { case 0x01: /* 读线圈请求处理 */ errCodeTmp = mb_slave_req_01h(ch, reg, num, &mbSlaveArr[ch].dataBuf[MB_RSP_DATA_OFF]); + /* 计算回复的字节数 */ mbSlaveArr[ch].dataBuf[MB_RSP_BYTE_OFF] = (num + 7) >> 3; mbSlaveArr[ch].dataLen = 3 + mbSlaveArr[ch].dataBuf[MB_RSP_BYTE_OFF]; break; case 0x02: /* 读离散量输入请求处理 */ errCodeTmp = mb_slave_req_02h(ch, reg, num, &mbSlaveArr[ch].dataBuf[MB_RSP_DATA_OFF]); + /* 计算回复的字节数 */ mbSlaveArr[ch].dataBuf[MB_RSP_BYTE_OFF] = (num + 7) >> 3; mbSlaveArr[ch].dataLen = 3 + mbSlaveArr[ch].dataBuf[MB_RSP_BYTE_OFF]; break; case 0x03: /* 读保持寄存器请求处理 */ errCodeTmp = mb_slave_req_03h(ch, reg, num, &mbSlaveArr[ch].dataBuf[MB_RSP_DATA_OFF]); + /* 计算回复的字节数 */ mbSlaveArr[ch].dataBuf[MB_RSP_BYTE_OFF] = num << 1; mbSlaveArr[ch].dataLen = 3 + mbSlaveArr[ch].dataBuf[MB_RSP_BYTE_OFF]; break; case 0x04: /* 读输入寄存器请求处理 */ errCodeTmp = mb_slave_req_04h(ch, reg, num, &mbSlaveArr[ch].dataBuf[MB_RSP_DATA_OFF]); + /* 计算回复的字节数 */ mbSlaveArr[ch].dataBuf[MB_RSP_BYTE_OFF] = num << 1; mbSlaveArr[ch].dataLen = 3 + mbSlaveArr[ch].dataBuf[MB_RSP_BYTE_OFF]; break; @@ -188,7 +196,7 @@ static void mb_slave_reqProcess(uint8_t ch) errCodeTmp = MB_ERRNO_CODE; break; } - + /* 有错误则回复错误码 */ if(MB_ERRNO_OK != errCodeTmp) { mbSlaveArr[ch].dataBuf[MB_CODE_OFF] |= 0x80; @@ -356,7 +364,7 @@ uint8_t mb_slave_poll(uint8_t ch) { /* CRC校验判断 */ checkVal = mb_check_crc16(&mbSlaveArr[ch].dataBuf[0], mbSlaveArr[ch].dataLen - 2); - if(checkVal != ((mbSlaveArr[ch].dataBuf[mbSlaveArr[ch].dataLen - 2] << 8) | mbSlaveArr[ch].dataBuf[mbSlaveArr[ch].dataLen - 1])) + if(checkVal != ((mbSlaveArr[ch].dataBuf[mbSlaveArr[ch].dataLen - 2]) | mbSlaveArr[ch].dataBuf[mbSlaveArr[ch].dataLen - 1] << 8)) { ret = RET_CHECK_ERR; /* 请求数据校验错误 */ goto rspErr; @@ -400,13 +408,16 @@ uint16_t mb_slave_write_rx_buf(uint8_t ch, void *pBuf, uint16_t len) ASSERT_PARAM(IS_VALID_MBS_CH(ch)); ASSERT_PARAM(IS_VALID_POINT(pBuf)); + /* 在RX_IDLE状态下可以接收数据 */ if(MB_RX_IDLE == mbSlaveArr[ch].state) { + /* 计算可写数量 */ unusedLen = mbSlaveArr[ch].dataBufLen - mbSlaveArr[ch].dataLen; len = (len > unusedLen) ? unusedLen : len; if(0 < len) { + /* 接续copy数据并记录数量 */ memcpy((void *)&mbSlaveArr[ch].dataBuf[mbSlaveArr[ch].dataLen], pBuf, len); mbSlaveArr[ch].dataLen += len; mbSlaveArr[ch].curFrameIntv = module_tick_get(); /* 开启帧间隔超时计数 */ @@ -440,17 +451,22 @@ uint16_t mb_slave_read_tx_buf(uint8_t ch, void *pBuf, uint16_t len) ASSERT_PARAM(IS_VALID_MBS_CH(ch)); ASSERT_PARAM(IS_VALID_POINT(pBuf)); + /* 在TX_BUSY状态下可以发送数据 */ if(MB_TX_BUSY == mbSlaveArr[ch].state) { + /* 计算可读数量 */ unreadLen = mbSlaveArr[ch].dataLen - mbSlaveArr[ch].readLen; len = (len > unreadLen) ? unreadLen : len; if(0 < len) { + /* copy数据至外部存储区并记录数量 */ memcpy(pBuf, (void *)&mbSlaveArr[ch].dataBuf[mbSlaveArr[ch].readLen], len); mbSlaveArr[ch].readLen += len; + /* 数据被全部copy出去 */ if(mbSlaveArr[ch].dataLen == mbSlaveArr[ch].readLen) { + /* 清零相关计数 */ mbSlaveArr[ch].dataLen = 0; mbSlaveArr[ch].readLen = 0; mbSlaveArr[ch].state = MB_RX_IDLE; /* 切换状态 */ @@ -545,14 +561,15 @@ uint8_t mb_slave_get_protocol(uint8_t ch) */ void mb_slave_set_frame_intv(uint8_t ch, uint32_t baud) { + /* 波特率>9600则默认取3ms */ if(9600 < baud) { mbSlaveArr[ch].targetFrameIntv = 3; - } + } /* 波特率=0则取0ms */ else if(0 == baud) { mbSlaveArr[ch].targetFrameIntv = 0; - } + } /* 波特率<=9600则取该波特率下传输3.5个字节的时间 */ else { mbSlaveArr[ch].targetFrameIntv = 10000 / baud * 3.5; diff --git a/drivers/modbus/modbus_slave.h b/drivers/modbus/modbus_slave.h index 7aef826..e2f941e 100644 --- a/drivers/modbus/modbus_slave.h +++ b/drivers/modbus/modbus_slave.h @@ -3,7 +3,7 @@ * @file modbus_slave.h * @author ashuai0110 * @version V2.1 - * @date 2024-01-02 + * @date 2024-01-08 * @brief modbus从机程序(RTU ASCII) * ****************************************************************************** @@ -93,6 +93,7 @@ uint8_t mb_slave_poll(uint8_t ch); uint16_t mb_slave_write_rx_buf(uint8_t ch, void *pBuf, uint16_t len); uint16_t mb_slave_read_tx_buf(uint8_t ch, void *pBuf, uint16_t len); +/* set/get interface */ void mb_slave_set_slave_addr(uint8_t ch, uint8_t slaveAddr); uint8_t mb_slave_get_slave_addr(uint8_t ch); void mb_slave_set_protocol(uint8_t ch, uint8_t protocol); diff --git a/examples/modbus_host/MDK/use_example.uvoptx b/examples/modbus_host/MDK/use_example.uvoptx index 366d570..3d4ac98 100644 --- a/examples/modbus_host/MDK/use_example.uvoptx +++ b/examples/modbus_host/MDK/use_example.uvoptx @@ -148,7 +148,40 @@ UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32F10x_128 -FS08000000 -FL020000 -FP0($$Device:STM32F103C8$Flash\STM32F10x_128.FLM)) - + + + 0 + 0 + 534 + 1 +
134228346
+ 0 + 0 + 0 + 0 + 0 + 1 + ..\..\..\drivers\modbus\modbus_host.c + + \\use_example\../../../drivers/modbus/modbus_host.c\534 +
+ + 1 + 0 + 536 + 1 +
0
+ 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\drivers\modbus\modbus_host.c + + +
+
0 diff --git a/examples/modbus_host/README.txt b/examples/modbus_host/README.txt index 16db2f1..214be2d 100644 --- a/examples/modbus_host/README.txt +++ b/examples/modbus_host/README.txt @@ -2,7 +2,7 @@ 用例使用说明 ================================================================================ Date Author MDK MCU -2024-01-02 ashuai0110 5.35 STM32F1 +2024-01-08 ashuai0110 5.35 STM32F1 ================================================================================ 功能描述 diff --git a/examples/modbus_host/SRC/main.c b/examples/modbus_host/SRC/main.c index 1d91e7b..98824a1 100644 --- a/examples/modbus_host/SRC/main.c +++ b/examples/modbus_host/SRC/main.c @@ -3,7 +3,7 @@ * @file main.c * @author ashuai0110 * @version V1.0 - * @date 2024-01-02 + * @date 2024-01-08 * @brief 使用举例-MODBUS主机程序 * ****************************************************************************** @@ -58,8 +58,6 @@ uint16_t inputRegister[8]; /* 输入寄存器 共8*1=8个 地址0~7 */ */ void TIM1_UP_IRQHandler(void) { - static uint8_t ret; - if(TIM_GetITStatus(TIM1, TIM_IT_Update) != RESET) { /* 组件计时节拍接口 */ -- Gitee From eb452addbf8ee1ccf761c69af3c6e1448a8bef10 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=98=BF=E8=A1=B00110?= Date: Mon, 8 Jan 2024 20:32:16 +0800 Subject: [PATCH 38/66] =?UTF-8?q?=E9=9D=9E=E7=A8=8B=E5=BA=8F=E5=86=85?= =?UTF-8?q?=E5=AE=B9=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- drivers/modules/delay_no_block.c | 6 +++--- drivers/modules/delay_no_block.h | 2 +- drivers/modules/uart_handler.c | 4 ++-- drivers/modules/uart_handler.h | 2 +- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/drivers/modules/delay_no_block.c b/drivers/modules/delay_no_block.c index 089c179..84a9c30 100644 --- a/drivers/modules/delay_no_block.c +++ b/drivers/modules/delay_no_block.c @@ -3,7 +3,7 @@ * @file delay_no_block.c * @author ashuai0110 * @version V2.1 - * @date 2023-12-28 + * @date 2024-01-08 * @brief 非阻塞延时 * ****************************************************************************** @@ -45,11 +45,11 @@ */ /* 延时任务ID有效性检查 */ #define IS_VALID_DELAY_ID(x) \ -( (x) <= DELAY_TASK_SIZE) +( (x) <= DELAY_TASK_SIZE) /* 延时任务计数值有效性检查 */ #define IS_VALID_DELAY_TICKS(x) \ -( ((x) != 0u)) +( (x) != 0u) /** * @} */ diff --git a/drivers/modules/delay_no_block.h b/drivers/modules/delay_no_block.h index 988dd06..9d54b92 100644 --- a/drivers/modules/delay_no_block.h +++ b/drivers/modules/delay_no_block.h @@ -3,7 +3,7 @@ * @file delay_no_block.h * @author ashuai0110 * @version V2.1 - * @date 2023-12-28 + * @date 2024-01-08 * @brief 非阻塞延时 * ****************************************************************************** diff --git a/drivers/modules/uart_handler.c b/drivers/modules/uart_handler.c index bde0a15..13770cf 100644 --- a/drivers/modules/uart_handler.c +++ b/drivers/modules/uart_handler.c @@ -3,7 +3,7 @@ * @file uart_handler.c * @author woshiashuai * @version V2.1 - * @date 2023-12-29 + * @date 2024-01-08 * @brief 串口管理(使用帧间隔分帧或现有的分帧方法) * ****************************************************************************** @@ -270,7 +270,7 @@ void uart_hr_set_frame_intv(uint8_t ch, uint32_t baud) if(9600 < baud) { uartHandlerArr[ch].targetFrameIntv = 3; - } /* 波特率=9600则取0ms */ + } /* 波特率=0则取0ms */ else if(0 == baud) { uartHandlerArr[ch].targetFrameIntv = 0; diff --git a/drivers/modules/uart_handler.h b/drivers/modules/uart_handler.h index 15be47e..0f1bd93 100644 --- a/drivers/modules/uart_handler.h +++ b/drivers/modules/uart_handler.h @@ -3,7 +3,7 @@ * @file uart_handler.h * @author woshiashuai * @version V2.1 - * @date 2023-12-29 + * @date 2024-01-08 * @brief 串口管理(使用帧间隔分帧或现有的分帧方法) * ****************************************************************************** -- Gitee From 7109cef6e62969fac98aaf84c93c159ba229564d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=98=BF=E8=A1=B00110?= Date: Sun, 14 Jan 2024 22:30:18 +0800 Subject: [PATCH 39/66] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=8E=A5=E6=94=B6?= =?UTF-8?q?=E4=BD=BF=E7=94=A8=E6=A0=A1=E9=AA=8C=E5=92=8C=E7=9A=84=E9=80=BB?= =?UTF-8?q?=E8=BE=91=E9=94=99=E8=AF=AF,=E5=A2=9E=E5=8A=A0=E4=B8=80?= =?UTF-8?q?=E4=BA=9B=E5=8D=8F=E8=AE=AE=E4=BF=A1=E6=81=AF=E7=9A=84=E5=AE=8F?= =?UTF-8?q?=E5=AE=9A=E4=B9=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- drivers/bootloader/xmodem.c | 96 +++++---- drivers/bootloader/xmodem.h | 57 +++-- examples/xmodem/MDK/use_example.uvoptx | 275 +------------------------ 3 files changed, 89 insertions(+), 339 deletions(-) diff --git a/drivers/bootloader/xmodem.c b/drivers/bootloader/xmodem.c index 3c6044d..7b9d69c 100644 --- a/drivers/bootloader/xmodem.c +++ b/drivers/bootloader/xmodem.c @@ -3,7 +3,7 @@ * @file xmodem.c * @author ashuai0110 * @version V1.0 - * @date 2024-01-08 + * @date 2024-01-14 * @brief xmodem协议 * ****************************************************************************** @@ -15,6 +15,7 @@ * Change Logs: * Date Author Notes * 2024-01-07 ashuai0110 完成基本内容 + * 2024-01-14 ashuai0110 修改接收使用校验和的逻辑错误,增加一些协议信息的宏定义 * ****************************************************************************** */ @@ -123,6 +124,13 @@ static uint8_t xmodem_check_sum(uint8_t *data, uint16_t len) return sum; } +/** + * @brief xmodem初始状态 + * + * @param _xmodem : xmodem管理实例 + * + * @retval None + */ inline static void xmodem_init_state(xmodem_t *_xmodem) { _xmodem->rspTimeoutCnt = 0; @@ -216,26 +224,26 @@ void xmodem_rx_poll(xmodem_t *_xmodem) case XMODEM_STATE_CHECK_HEAD: /* 根据包头和数据长度进行初步检查 */ /* SOH为包头 携带128byte数据 */ - if(XMODEM_SOH == _xmodem->dataBuf[0] && (3 + 128 + _xmodem->checkNum) <= _xmodem->dataLen) + if(XMODEM_SOH == _xmodem->dataBuf[YMODEM_START_INDEX] && (YMODEM_HEADER_SIZE + YMODEM_DATA_SIZE + _xmodem->checkNum) <= _xmodem->dataLen) { _xmodem->state = XMODEM_STATE_CHECK_DATA; /* 切换状态 */ - _xmodem->dataLenTmp = 128; + _xmodem->dataLenTmp = YMODEM_DATA_SIZE; } /* STX为包头 携带1024byte数据 */ - else if(XMODEM_STX == _xmodem->dataBuf[0] && (3 + 1024 + _xmodem->checkNum) <= _xmodem->dataLen) + else if(XMODEM_STX == _xmodem->dataBuf[YMODEM_START_INDEX] && (YMODEM_HEADER_SIZE + YMODEM_DATA_1K_SIZE + _xmodem->checkNum) <= _xmodem->dataLen) { _xmodem->state = XMODEM_STATE_CHECK_DATA; /* 切换状态 */ - _xmodem->dataLenTmp = 1024; + _xmodem->dataLenTmp = YMODEM_DATA_1K_SIZE; } /* EOT为包头 表示传输结束 */ - else if(XMODEM_EOT == _xmodem->dataBuf[0]) + else if(XMODEM_EOT == _xmodem->dataBuf[YMODEM_START_INDEX]) { xmodem_init_state(_xmodem); /* 回复ACK */ - _xmodem->dataBuf[0] = XMODEM_ACK; + _xmodem->dataBuf[YMODEM_START_INDEX] = XMODEM_ACK; _xmodem->dataLen = 1; _xmodem->txEnFn(1); break; } /* CAN为包头 表示传输取消 */ - else if(XMODEM_CAN == _xmodem->dataBuf[0]) + else if(XMODEM_CAN == _xmodem->dataBuf[YMODEM_START_INDEX]) { xmodem_init_state(_xmodem); break; @@ -247,40 +255,40 @@ void xmodem_rx_poll(xmodem_t *_xmodem) } case XMODEM_STATE_CHECK_DATA: /* 包序号和包序号补码满足条件 */ - if(_xmodem->packetNum == _xmodem->dataBuf[1] && (_xmodem->dataBuf[1] + _xmodem->dataBuf[2]) == 0xFF) + if(_xmodem->packetNum == _xmodem->dataBuf[YMODEM_NUMBER_INDEX] && 0xFF == (_xmodem->dataBuf[YMODEM_NUMBER_INDEX] + _xmodem->dataBuf[YMODEM_CNUMBER_INDEX])) { /* 1字节累加和校验 */ if(1 == _xmodem->checkNum) { /* 校验成功 */ - if(_xmodem->dataBuf[_xmodem->dataLenTmp + 3] == xmodem_check_sum(&_xmodem->dataBuf[3], _xmodem->dataLenTmp - 1)) + if(_xmodem->dataBuf[_xmodem->dataLenTmp + YMODEM_HEADER_SIZE] == xmodem_check_sum(&_xmodem->dataBuf[YMODEM_DATA_INDEX], _xmodem->dataLenTmp)) { /* 用户get回调函数 */ - _xmodem->getPacketFn(_xmodem->packetNum++, &_xmodem->dataBuf[3], &_xmodem->dataLenTmp); - _xmodem->dataBuf[0] = XMODEM_ACK; /* 回复ACK */ + _xmodem->getPacketFn(_xmodem->packetNum++, &_xmodem->dataBuf[YMODEM_DATA_INDEX], &_xmodem->dataLenTmp); + _xmodem->dataBuf[YMODEM_START_INDEX] = XMODEM_ACK; /* 回复ACK */ } /* 校验失败 */ else { - _xmodem->dataBuf[0] = XMODEM_NAK; /* 回复NAK */ + _xmodem->dataBuf[YMODEM_START_INDEX] = XMODEM_NAK; /* 回复NAK */ } } /* 2字节CRC16校验 */ else if(2 == _xmodem->checkNum) { /* 校验成功 */ - if(0 == xmodem_check_crc16(&_xmodem->dataBuf[3], _xmodem->dataLenTmp + 2)) + if(0 == xmodem_check_crc16(&_xmodem->dataBuf[YMODEM_DATA_INDEX], _xmodem->dataLenTmp + _xmodem->checkNum)) { - _xmodem->getPacketFn(_xmodem->packetNum++, &_xmodem->dataBuf[3], &_xmodem->dataLenTmp); /* 用户回调函数 */ - _xmodem->dataBuf[0] = XMODEM_ACK; /* 回复ACK */ + _xmodem->getPacketFn(_xmodem->packetNum++, &_xmodem->dataBuf[YMODEM_DATA_INDEX], &_xmodem->dataLenTmp); /* 用户回调函数 */ + _xmodem->dataBuf[YMODEM_START_INDEX] = XMODEM_ACK; /* 回复ACK */ } /* 校验失败 */ else { - _xmodem->dataBuf[0] = XMODEM_NAK; /* 回复NAK */ + _xmodem->dataBuf[YMODEM_START_INDEX] = XMODEM_NAK; /* 回复NAK */ } } } /* 否则回复NAK */ else { - _xmodem->dataBuf[0] = XMODEM_NAK; + _xmodem->dataBuf[YMODEM_START_INDEX] = XMODEM_NAK; } _xmodem->rspTimeoutTimes = 0; _xmodem->state = XMODEM_STATE_WAIT; /* 切换状态 */ @@ -289,7 +297,7 @@ void xmodem_rx_poll(xmodem_t *_xmodem) _xmodem->dataLenTmp = _xmodem->dataLen; _xmodem->txEnFn(1); break; - default: _xmodem->state = XMODEM_STATE_IDLE; break; + default: xmodem_init_state(_xmodem); break; } } @@ -314,7 +322,7 @@ void xmodem_rx_start(xmodem_t *_xmodem, uint8_t startFlag) _xmodem->checkNum = (startFlag == XMODEM_RX_FLAG_NAK) ? 1 : 2; /* 记录校验方式 */ _xmodem->state = XMODEM_STATE_WAIT; /* 切换状态 */ /* 发送启动内容 */ - _xmodem->dataBuf[0] = startFlag; + _xmodem->dataBuf[YMODEM_START_INDEX] = startFlag; _xmodem->dataLen = 1; _xmodem->dataLenTmp = _xmodem->dataLen; _xmodem->txEnFn(1); @@ -342,12 +350,12 @@ void xmodem_tx_poll(xmodem_t *_xmodem) if(1 == _xmodem->packetNum) { /* 收到NAK则使用累加和校验 */ - if(XMODEM_NAK == _xmodem->dataBuf[0]) + if(XMODEM_NAK == _xmodem->dataBuf[YMODEM_START_INDEX]) { _xmodem->checkNum = 1; _xmodem->state = XMODEM_STATE_CHECK_DATA; } /* 收到'C'则使用CRC16校验 */ - else if(XMODEM_CRC16 == _xmodem->dataBuf[0]) + else if(XMODEM_CRC16 == _xmodem->dataBuf[YMODEM_START_INDEX]) { _xmodem->checkNum = 2; _xmodem->state = XMODEM_STATE_CHECK_DATA; @@ -377,16 +385,16 @@ void xmodem_tx_poll(xmodem_t *_xmodem) break; case XMODEM_STATE_CHECK_HEAD: /* 收到ACK则继续发下一包 */ - if(XMODEM_ACK == _xmodem->dataBuf[0]) + if(XMODEM_ACK == _xmodem->dataBuf[YMODEM_START_INDEX]) { _xmodem->state = XMODEM_STATE_CHECK_DATA; /* 切换状态 */ } /* 收到NAK则重发当前包 */ - else if(XMODEM_NAK == _xmodem->dataBuf[0]) + else if(XMODEM_NAK == _xmodem->dataBuf[YMODEM_START_INDEX]) { _xmodem->packetNum--; /* 包序号-1 */ _xmodem->state = XMODEM_STATE_CHECK_DATA; /* 切换状态 */ } /* 收到CAN则取消传输 */ - else if(XMODEM_CAN == _xmodem->dataBuf[0]) + else if(XMODEM_CAN == _xmodem->dataBuf[YMODEM_START_INDEX]) { xmodem_init_state(_xmodem); break; @@ -399,25 +407,25 @@ void xmodem_tx_poll(xmodem_t *_xmodem) } case XMODEM_STATE_CHECK_DATA: /* 用户set回调函数 */ - _xmodem->setPacketFn(_xmodem->packetNum, &_xmodem->dataBuf[3], &_xmodem->dataLen); + _xmodem->setPacketFn(_xmodem->packetNum, &_xmodem->dataBuf[YMODEM_DATA_INDEX], &_xmodem->dataLen); /* 超过128但不超过1024的按1024byte */ - if(128 < _xmodem->dataLen && 1024 >= _xmodem->dataLen) + if(YMODEM_DATA_SIZE < _xmodem->dataLen && YMODEM_DATA_1K_SIZE >= _xmodem->dataLen) { - _xmodem->dataBuf[0] = XMODEM_STX; /* 包头STX携带1024byte数据 */ - memset(&_xmodem->dataBuf[3 + _xmodem->dataLen], XMODEM_CTRLZ, 1024 - _xmodem->dataLen); /* 填充字节 */ - _xmodem->dataLen = 1024; + _xmodem->dataBuf[YMODEM_START_INDEX] = XMODEM_STX; /* 包头STX携带1024byte数据 */ + memset(&_xmodem->dataBuf[YMODEM_HEADER_SIZE + _xmodem->dataLen], XMODEM_CTRLZ, YMODEM_DATA_1K_SIZE - _xmodem->dataLen); /* 填充字节 */ + _xmodem->dataLen = YMODEM_DATA_1K_SIZE; } /* 超过0但不超过128的按128byte */ - else if(0 < _xmodem->dataLen && 128 >= _xmodem->dataLen) + else if(0 < _xmodem->dataLen && YMODEM_DATA_SIZE >= _xmodem->dataLen) { - _xmodem->dataBuf[0] = XMODEM_SOH; /* 包头STX携带128byte数据 */ - memset(&_xmodem->dataBuf[3 + _xmodem->dataLen], XMODEM_CTRLZ, 128 - _xmodem->dataLen); /* 填充字节 */ - _xmodem->dataLen = 128; + _xmodem->dataBuf[YMODEM_START_INDEX] = XMODEM_SOH; /* 包头STX携带128byte数据 */ + memset(&_xmodem->dataBuf[YMODEM_HEADER_SIZE + _xmodem->dataLen], XMODEM_CTRLZ, YMODEM_DATA_SIZE - _xmodem->dataLen); /* 填充字节 */ + _xmodem->dataLen = YMODEM_DATA_SIZE; } /* 其它认为是传输结束 */ else { xmodem_init_state(_xmodem); /* 回复EOT传输结束 */ - _xmodem->dataBuf[0] = XMODEM_EOT; + _xmodem->dataBuf[YMODEM_START_INDEX] = XMODEM_EOT; _xmodem->dataLen = 1; _xmodem->txEnFn(1); break; @@ -425,23 +433,23 @@ void xmodem_tx_poll(xmodem_t *_xmodem) /* 1字节累加和校验 */ if(1 == _xmodem->checkNum) { - checkVal = xmodem_check_sum(&_xmodem->dataBuf[3], _xmodem->dataLen); - _xmodem->dataBuf[_xmodem->dataLen + 3] = checkVal; + checkVal = xmodem_check_sum(&_xmodem->dataBuf[YMODEM_DATA_INDEX], _xmodem->dataLen); + _xmodem->dataBuf[_xmodem->dataLen + YMODEM_HEADER_SIZE] = checkVal; } /* 2字节CRC16校验 */ - else + else if(2 == _xmodem->checkNum) { - checkVal = xmodem_check_crc16(&_xmodem->dataBuf[3], _xmodem->dataLen); - _xmodem->dataBuf[_xmodem->dataLen + 3] = checkVal >> 8; - _xmodem->dataBuf[_xmodem->dataLen + 4] = checkVal & 0xFF; + checkVal = xmodem_check_crc16(&_xmodem->dataBuf[YMODEM_DATA_INDEX], _xmodem->dataLen); + _xmodem->dataBuf[_xmodem->dataLen + YMODEM_HEADER_SIZE] = checkVal >> 8; + _xmodem->dataBuf[_xmodem->dataLen + YMODEM_HEADER_SIZE + 1] = checkVal & 0xFF; } _xmodem->rspTimeoutTimes = 0; _xmodem->state = XMODEM_STATE_WAIT; /* 切换状态 */ /* 设置包序号和其补码 */ - _xmodem->dataBuf[1] = _xmodem->packetNum; - _xmodem->dataBuf[2] = 0xFF - _xmodem->packetNum; + _xmodem->dataBuf[YMODEM_NUMBER_INDEX] = _xmodem->packetNum; + _xmodem->dataBuf[YMODEM_CNUMBER_INDEX] = 0xFF - _xmodem->packetNum; _xmodem->packetNum++; /* 发送包内容 */ - _xmodem->dataLen = _xmodem->dataLen + 3 + _xmodem->checkNum; + _xmodem->dataLen = _xmodem->dataLen + YMODEM_HEADER_SIZE + _xmodem->checkNum; _xmodem->dataLenTmp = _xmodem->dataLen; _xmodem->txEnFn(1); break; diff --git a/drivers/bootloader/xmodem.h b/drivers/bootloader/xmodem.h index 06eb751..24d9b61 100644 --- a/drivers/bootloader/xmodem.h +++ b/drivers/bootloader/xmodem.h @@ -3,7 +3,7 @@ * @file xmodem.h * @author ashuai0110 * @version V1.0 - * @date 2024-01-08 + * @date 2024-01-14 * @brief xmodem协议 * ****************************************************************************** @@ -41,24 +41,39 @@ extern "C" { * @{ */ -#define XMODEM_RSP_TIMES (3u) /*!< 回复超时次数默认3次(0~255) */ +#define XMODEM_RSP_TIMES (3u) /*!< 回复超时次数默认3次(0~255) */ + +/** + * @defgroup xmodem_info xmodem info + * @{ + */ +/* /------------------xmodem协议格式------------------\ + * | 命令符 | 包序号 | 包序号反码 | 有效数据 | 校验 | + * | 1 | 1 | 1 | 128/1024 | 1/2 | + * \--------------------------------------------------/ */ +#define YMODEM_START_INDEX (0u) +#define YMODEM_NUMBER_INDEX (1u) +#define YMODEM_CNUMBER_INDEX (2u) +#define YMODEM_DATA_INDEX (3u) +#define YMODEM_HEADER_SIZE (3u) +#define YMODEM_DATA_SIZE (128u) +#define YMODEM_DATA_1K_SIZE (1024u) +/** + * @} + */ /** * @defgroup xmodem_command_symbol xmodem command symbol * @{ */ -/* xmodem协议格式 (包长可能是132/133/1028/1029byte) -命令符 | 包序号 | 包序号补码 | 有效数据 | 校验 - 1 | 1 | 1 | 128/1024 | 1/2 byte -*/ -#define XMODEM_SOH (0x01u) /*!< 命令符:128byte数据 */ -#define XMODEM_STX (0x02u) /*!< 命令符:1024byte数据 */ -#define XMODEM_EOT (0x04u) /*!< 命令符:发送结束 */ -#define XMODEM_ACK (0x06u) /*!< 命令符:正确应答 */ -#define XMODEM_NAK (0x15u) /*!< 命令符:错误应答/校验方式累加和 */ -#define XMODEM_CAN (0x18u) /*!< 命令符:取消发送 */ -#define XMODEM_CTRLZ (0x1Au) /*!< 填充字节 */ -#define XMODEM_CRC16 ('C') /*!< 命令符:校验方式CRC16 */ +#define XMODEM_SOH (0x01u) /*!< 命令符:128byte数据 */ +#define XMODEM_STX (0x02u) /*!< 命令符:1024byte数据 */ +#define XMODEM_EOT (0x04u) /*!< 命令符:发送结束 */ +#define XMODEM_ACK (0x06u) /*!< 命令符:正确应答 */ +#define XMODEM_NAK (0x15u) /*!< 命令符:错误应答/校验方式累加和 */ +#define XMODEM_CAN (0x18u) /*!< 命令符:取消发送 */ +#define XMODEM_CTRLZ (0x1Au) /*!< 填充字节 */ +#define XMODEM_CRC16 ('C') /*!< 命令符:校验方式CRC16 */ /** * @} */ @@ -67,10 +82,10 @@ extern "C" { * @defgroup xmodem_rx_state xmodem rx state * @{ */ -#define XMODEM_STATE_IDLE (0u) /*!< 空闲状态 */ -#define XMODEM_STATE_WAIT (1u) /*!< 等待接收状态 */ -#define XMODEM_STATE_CHECK_HEAD (2u) /*!< 校验数据头状态 */ -#define XMODEM_STATE_CHECK_DATA (3u) /*!< 校验数据状态 */ +#define XMODEM_STATE_IDLE (0u) /*!< 空闲状态 */ +#define XMODEM_STATE_WAIT (1u) /*!< 等待接收状态 */ +#define XMODEM_STATE_CHECK_HEAD (2u) /*!< 校验数据头状态 */ +#define XMODEM_STATE_CHECK_DATA (3u) /*!< 校验数据状态 */ /** * @} */ @@ -79,8 +94,8 @@ extern "C" { * @defgroup xmodem_rx_flag xmodem rx flag * @{ */ -#define XMODEM_RX_FLAG_NAK (XMODEM_NAK) /*!< 接收方发送NAK启动传输,发送方使用累加和校验 */ -#define XMODEM_RX_FLAG_CRC (XMODEM_CRC16) /*!< 接收方发送'C'启动传输,发送方使用CRC16校验 */ +#define XMODEM_RX_FLAG_NAK (XMODEM_NAK) /*!< 接收方发送NAK启动传输,发送方使用累加和校验 */ +#define XMODEM_RX_FLAG_CRC (XMODEM_CRC16) /*!< 接收方发送'C'启动传输,发送方使用CRC16校验 */ /** * @} */ @@ -137,7 +152,7 @@ typedef struct xmodem { uint8_t packetNum; /*!< 包序号 */ uint8_t state : 3; /*!< xmodem状态 @ref xmodem_rx_state */ - uint8_t checkNum : 2; /*!< 校验字节数 1/2 */ + uint8_t checkNum : 2; /*!< 校验字节数 1:累加和 2:CRC16 */ xmodem_tx_en_t txEnFn; /*!< 串口发送准备函数 */ xmodem_user_packet_cb_t getPacketFn; /*!< 获取数据包回调函数 */ diff --git a/examples/xmodem/MDK/use_example.uvoptx b/examples/xmodem/MDK/use_example.uvoptx index 530288b..b42cb56 100644 --- a/examples/xmodem/MDK/use_example.uvoptx +++ b/examples/xmodem/MDK/use_example.uvoptx @@ -148,280 +148,7 @@ UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32F10x_128 -FS08000000 -FL020000 -FP0($$Device:STM32F103C8$Flash\STM32F10x_128.FLM)) - - - 0 - 0 - 229 - 1 -
134224394
- 0 - 0 - 0 - 0 - 0 - 1 - ..\..\..\drivers\bootloader\xmodem.c - - \\use_example\../../../drivers/bootloader/xmodem.c\229 -
- - 1 - 0 - 234 - 1 -
134224434
- 0 - 0 - 0 - 0 - 0 - 1 - ..\..\..\drivers\bootloader\xmodem.c - - \\use_example\../../../drivers/bootloader/xmodem.c\234 -
- - 2 - 0 - 277 - 1 -
134224622
- 0 - 0 - 0 - 0 - 0 - 1 - ..\..\..\drivers\bootloader\xmodem.c - - \\use_example\../../../drivers/bootloader/xmodem.c\277 -
- - 3 - 0 - 205 - 1 -
134224320
- 0 - 0 - 0 - 0 - 0 - 1 - ..\..\..\drivers\bootloader\xmodem.c - - \\use_example\../../../drivers/bootloader/xmodem.c\205 -
- - 4 - 0 - 205 - 1 -
134224712
- 0 - 0 - 0 - 0 - 0 - 1 - ..\..\..\drivers\bootloader\xmodem.c - - \\use_example\../../../drivers/bootloader/xmodem.c\205 -
- - 5 - 0 - 207 - 1 -
0
- 0 - 0 - 0 - 0 - 0 - 0 - ..\..\..\drivers\bootloader\xmodem.c - - -
- - 6 - 0 - 230 - 1 -
0
- 0 - 0 - 0 - 0 - 0 - 0 - ..\..\..\drivers\bootloader\xmodem.c - - -
- - 7 - 0 - 235 - 1 -
0
- 0 - 0 - 0 - 0 - 0 - 0 - ..\..\..\drivers\bootloader\xmodem.c - - -
- - 8 - 0 - 279 - 1 -
0
- 0 - 0 - 0 - 0 - 0 - 0 - ..\..\..\drivers\bootloader\xmodem.c - - -
- - 9 - 0 - 196 - 1 -
0
- 0 - 0 - 0 - 0 - 0 - 0 - ..\..\..\drivers\bootloader\xmodem.c - - -
- - 10 - 0 - 198 - 1 -
0
- 0 - 0 - 0 - 0 - 0 - 0 - ..\..\..\drivers\bootloader\xmodem.c - - -
- - 11 - 0 - 220 - 1 -
0
- 0 - 0 - 0 - 0 - 0 - 0 - ..\..\..\drivers\bootloader\xmodem.c - - -
- - 12 - 0 - 221 - 1 -
0
- 0 - 0 - 0 - 0 - 0 - 0 - ..\..\..\drivers\bootloader\xmodem.c - - -
- - 13 - 0 - 225 - 1 -
0
- 0 - 0 - 0 - 0 - 0 - 0 - ..\..\..\drivers\bootloader\xmodem.c - - -
- - 14 - 0 - 226 - 1 -
0
- 0 - 0 - 0 - 0 - 0 - 0 - ..\..\..\drivers\bootloader\xmodem.c - - -
- - 15 - 0 - 268 - 1 -
0
- 0 - 0 - 0 - 0 - 0 - 0 - ..\..\..\drivers\bootloader\xmodem.c - - -
- - 16 - 0 - 270 - 1 -
0
- 0 - 0 - 0 - 0 - 0 - 0 - ..\..\..\drivers\bootloader\xmodem.c - - -
-
+ 0 -- Gitee From ebefe45ee1adb066c67119ba7d67d1d9cf7680af Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=98=BF=E8=A1=B00110?= Date: Sun, 14 Jan 2024 22:30:56 +0800 Subject: [PATCH 40/66] =?UTF-8?q?=E6=96=B0=E5=A2=9Eymodem=E6=BA=90?= =?UTF-8?q?=E7=A0=81=E5=92=8C=E4=BE=8B=E7=A8=8B(=E6=9C=AA=E5=AE=8C?= =?UTF-8?q?=E6=88=90)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- drivers/bootloader/ymodem.c | 619 +++++++++++++++ drivers/bootloader/ymodem.h | 214 +++++ examples/ymodem/MDK/use_example.uvoptx | 987 ++++++++++++++++++++++++ examples/ymodem/MDK/use_example.uvprojx | 607 +++++++++++++++ examples/ymodem/README.txt | 47 ++ examples/ymodem/SRC/main.c | 229 ++++++ 6 files changed, 2703 insertions(+) create mode 100644 drivers/bootloader/ymodem.c create mode 100644 drivers/bootloader/ymodem.h create mode 100644 examples/ymodem/MDK/use_example.uvoptx create mode 100644 examples/ymodem/MDK/use_example.uvprojx create mode 100644 examples/ymodem/README.txt create mode 100644 examples/ymodem/SRC/main.c diff --git a/drivers/bootloader/ymodem.c b/drivers/bootloader/ymodem.c new file mode 100644 index 0000000..a0cf47f --- /dev/null +++ b/drivers/bootloader/ymodem.c @@ -0,0 +1,619 @@ +/** + ****************************************************************************** + * @file ymodem.c + * @author ashuai0110 + * @version V1.0 + * @date 2024-01-13 + * @brief ymodem协议 + * + ****************************************************************************** + * @attention + * + * 版权声明:内容为编者(ashuai0110)原创,使用请注明出处,当然,你也可以不这样做^_^ + * 出处链接:https://gitee.com/ashuai0110/mcu_reuse_development_module.git + * + * Change Logs: + * Date Author Notes + * 2024-01-13 ashuai0110 完成基本内容 + * + ****************************************************************************** + */ + +/* 包含头文件-----------------------------------------------------------------*/ +#include "ymodem.h" + +/** + * @addtogroup bootloader + * @{ + */ + +/** + * @defgroup ymodem ymodem + * @{ + */ + +/* 私有宏定义-----------------------------------------------------------------*/ +/** + * @defgroup ymodem_local_macros ymodem local macros + * @{ + */ + +/** + * @defgroup ymodem_check_parameters_validity ymodem check parameters validity + * @{ + */ +/* ymodem接收标志有效性检查 */ +#define IS_VALID_RX_FLAG(x) \ +( ((x) == YMODEM_RX_FLAG_NAK) || \ + ((x) == YMODEM_RX_FLAG_CRC)) + +/** + * @} + */ + +/** + * @} + */ + +/* 私有类型定义---------------------------------------------------------------*/ + +/* 私有变量-------------------------------------------------------------------*/ + +/* 全局变量-------------------------------------------------------------------*/ + +/* 私有函数原型---------------------------------------------------------------*/ +/** + * @defgroup ymodem_local_functions ymodem local functions + * @{ + */ + +/** + * @brief CRC16-YMODEM校验 + * + * @param data : 校验数据 + * + * @param len : 校验数据长度 + * + * @retval 校验结果 + */ +static uint16_t ymodem_check_crc16(uint8_t *data, uint16_t len) +{ + uint8_t cnt; + uint16_t crc = 0; + + while(len--) + { + crc ^= (uint16_t)(*data) << 8; + data++; + for(cnt = 0; cnt < 8; ++cnt) + { + if(crc & 0x8000) + { + crc = (crc << 1) ^ 0x1021; + } + else + { + crc <<= 1; + } + } + } + + return crc; +} + +/** + * @brief 累加和校验 + * + * @param data : 校验数据 + * + * @param len : 校验数据长度 + * + * @retval 累加和 + */ +static uint8_t ymodem_check_sum(uint8_t *data, uint16_t len) +{ + uint8_t sum = 0; + uint16_t cnt = 0; + + for(; cnt < len; cnt++) + { + sum += data[cnt]; + } + + return sum; +} + +/** + * @brief ymodem初始状态 + * + * @param _ymodem : ymodem管理实例 + * + * @retval None + */ +inline static void ymodem_init_state(ymodem_t *_ymodem) +{ + _ymodem->dataLen = 0; + _ymodem->readLen = 0; + _ymodem->dataLenTmp = 0; + _ymodem->rspTimeoutCnt = 0; + _ymodem->rspTimeoutTimes = 0; + _ymodem->packetNum = 0; + _ymodem->state = YMODEM_STATE_IDLE; + _ymodem->fileFlag = 0; + _ymodem->eotFlag = 0; +} + +/** + * @} + */ + +/** + * @defgroup ymodem_global_functions ymodem global functions + * @{ + */ + +/** + * @brief ymodem初始化 + * + * @param _ymodem : ymodem管理实例 + * + * @param pBuf : 数据缓存区 + * + * @param bufLen : 数据缓存区长度byte(可根据ymodem.h:50行ymodem协议格式定义) + * + * @param txEnFn : 串口发送前准备函数 + * + * @param getPacketFn : 获取数据包回调函数(不用可填NULL) + * + * @param setPacketFn : 设置数据包回调函数(不用可填NULL) + * + * @param rspTimeout : 回复超时时间sec + * + * @retval None + */ +void ymodem_init(ymodem_t *_ymodem, void *dataBuf, uint16_t bufLen, ymodem_tx_en_t txEnFn, \ + ymodem_user_packet_cb_t getPacketFn, ymodem_user_packet_cb_t setPacketFn, uint16_t rspTimeout) +{ + ASSERT_PARAM(IS_VALID_POINT(_ymodem)); + ASSERT_PARAM(IS_VALID_POINT(dataBuf)); + ASSERT_PARAM(IS_VALID_POINT(txEnFn)); + + /* 初始化各参数 */ + memset(_ymodem, 0, sizeof(ymodem_t)); + _ymodem->dataBuf = (uint8_t *)dataBuf; + _ymodem->dataBufLen = bufLen; + _ymodem->txEnFn = txEnFn; + _ymodem->getPacketFn = getPacketFn; + _ymodem->setPacketFn = setPacketFn; + _ymodem->rspTimeout = rspTimeout; + _ymodem->state = YMODEM_STATE_IDLE; +} + +/** + * @brief ymodem接收轮询处理 + * + * @note SecureCRT实测开启串口DMA接收1024byte数据包稳定8KB/sec + * + * @param _ymodem : ymodem管理实例 + * + * @retval None + */ +void ymodem_rx_poll(ymodem_t *_ymodem) +{ + uint32_t tickTmp; + + ASSERT_PARAM(IS_VALID_POINT(_ymodem)); + + switch(_ymodem->state) + { + case YMODEM_STATE_IDLE: break; + case YMODEM_STATE_WAIT: + tickTmp = _ymodem->rspTimeoutCnt; + /* 应答超时判断 */ + if(tickTmp && (module_tick_get() - tickTmp) > _ymodem->rspTimeout) + { + _ymodem->rspTimeoutCnt = 0; + /* 若回复超时次数达到预设值 则直接中断接收回到IDLE状态 */ + if(_ymodem->rspTimeoutTimes++ >= YMODEM_RSP_TIMES) + { + ymodem_init_state(_ymodem); + break; + } + /* 重发当前包 */ + _ymodem->dataLen = _ymodem->dataLenTmp; + _ymodem->txEnFn(1); + } + /* 每次收到文件信息包后要重新回复启动内容 */ + if(_ymodem->fileFlag && _ymodem->packetNum) + { + _ymodem->fileFlag = 0; + /* 发送回复内容 */ + _ymodem->dataBuf[YMODEM_START_INDEX] = _ymodem->checkNum == 1 ? YMODEM_NAK : YMODEM_CRC16; + _ymodem->dataLen = 1; + _ymodem->dataLenTmp = _ymodem->dataLen; + _ymodem->txEnFn(1); + } + break; + case YMODEM_STATE_CHECK_HEAD: + /* 根据包头和数据长度进行初步检查 */ + /* SOH为包头 携带128byte数据 */ + if(YMODEM_SOH == _ymodem->dataBuf[YMODEM_START_INDEX] && (YMODEM_HEADER_SIZE + YMODEM_DATA_SIZE + _ymodem->checkNum) <= _ymodem->dataLen) + { + /* 结束包 数据是0 */ + if(0 == _ymodem->packetNum && 0 == _ymodem->dataBuf[YMODEM_DATA_INDEX]) + { + if(0 == ymodem_check_sum(&_ymodem->dataBuf[30], 100)) + { + ymodem_init_state(_ymodem); + /* 回复ACK */ + _ymodem->dataBuf[YMODEM_START_INDEX] = YMODEM_ACK; + _ymodem->dataLen = 1; + _ymodem->dataLenTmp = _ymodem->dataLen; + _ymodem->txEnFn(1); + break; + } + } + /* 数据包 */ + _ymodem->state = YMODEM_STATE_CHECK_DATA; /* 切换状态 */ + _ymodem->dataLenTmp = YMODEM_DATA_SIZE; + } /* STX为包头 携带1024byte数据 */ + else if(YMODEM_STX == _ymodem->dataBuf[YMODEM_START_INDEX] && (YMODEM_HEADER_SIZE + YMODEM_DATA_1K_SIZE + _ymodem->checkNum) <= _ymodem->dataLen) + { + _ymodem->state = YMODEM_STATE_CHECK_DATA; /* 切换状态 */ + _ymodem->dataLenTmp = YMODEM_DATA_1K_SIZE; + } /* EOT为包头 表示传输结束 */ + else if(YMODEM_EOT == _ymodem->dataBuf[YMODEM_START_INDEX]) + { + /* 非首次收到EOT则回复ACK */ + if(_ymodem->eotFlag) + { + _ymodem->eotFlag = 0; + _ymodem->dataBuf[YMODEM_START_INDEX] = YMODEM_ACK; /* 回复ACK */ + _ymodem->state = YMODEM_STATE_RESTART; + } /* 首次收到EOT回复NAK */ + else + { + _ymodem->eotFlag = 1; + _ymodem->dataBuf[YMODEM_START_INDEX] = YMODEM_NAK; /* 回复NAK */ + _ymodem->state = YMODEM_STATE_WAIT; + } + /* 发送回复内容 */ + _ymodem->dataLen = 1; + _ymodem->dataLenTmp = _ymodem->dataLen; + _ymodem->txEnFn(1); + break; + } /* CAN为包头 表示传输取消 */ + else if(YMODEM_CAN == _ymodem->dataBuf[YMODEM_START_INDEX]) + { + ymodem_init_state(_ymodem); + break; + } + else + { + _ymodem->state = YMODEM_STATE_WAIT; + break; + } + case YMODEM_STATE_CHECK_DATA: + /* 包序号和包序号补码满足条件 */ + if(_ymodem->packetNum == _ymodem->dataBuf[YMODEM_NUMBER_INDEX] && 0xFF == (_ymodem->dataBuf[YMODEM_NUMBER_INDEX] + _ymodem->dataBuf[YMODEM_CNUMBER_INDEX])) + { + /* 1字节累加和校验 */ + if(1 == _ymodem->checkNum) + { + /* 校验成功 */ + if(_ymodem->dataBuf[_ymodem->dataLenTmp + YMODEM_HEADER_SIZE] == ymodem_check_sum(&_ymodem->dataBuf[YMODEM_DATA_INDEX], _ymodem->dataLenTmp)) + { + /* 用户get回调函数 */ + _ymodem->getPacketFn(_ymodem->packetNum++, &_ymodem->dataBuf[YMODEM_DATA_INDEX], &_ymodem->dataLenTmp); + _ymodem->dataBuf[YMODEM_START_INDEX] = YMODEM_ACK; /* 回复ACK */ + } /* 校验失败 */ + else + { + _ymodem->dataBuf[YMODEM_START_INDEX] = YMODEM_NAK; /* 回复NAK */ + } + } /* 2字节CRC16校验 */ + else if(2 == _ymodem->checkNum) + { + /* 校验成功 */ + if(0 == ymodem_check_crc16(&_ymodem->dataBuf[YMODEM_DATA_INDEX], _ymodem->dataLenTmp + _ymodem->checkNum)) + { + _ymodem->getPacketFn(_ymodem->packetNum++, &_ymodem->dataBuf[YMODEM_DATA_INDEX], &_ymodem->dataLenTmp); /* 用户回调函数 */ + _ymodem->dataBuf[YMODEM_START_INDEX] = YMODEM_ACK; /* 回复ACK */ + } /* 校验失败 */ + else + { + _ymodem->dataBuf[YMODEM_START_INDEX] = YMODEM_NAK; /* 回复NAK */ + } + } + } /* 否则回复NAK */ + else + { + _ymodem->dataBuf[YMODEM_START_INDEX] = YMODEM_NAK; + } + _ymodem->rspTimeoutTimes = 0; + _ymodem->state = YMODEM_STATE_WAIT; /* 切换状态 */ + /* 发送回复内容 */ + _ymodem->dataLen = 1; + _ymodem->dataLenTmp = _ymodem->dataLen; + _ymodem->txEnFn(1); + break; + case YMODEM_STATE_RESTART: + ymodem_init_state(_ymodem); + ymodem_rx_start(_ymodem, _ymodem->checkNum == 1 ? YMODEM_NAK : YMODEM_CRC16); + break; + default: ymodem_init_state(_ymodem); break; + } +} + +/** + * @brief ymodem接收启动 + * + * @param _ymodem : ymodem管理实例 + * + * @param startFlag : 接收启动标志 @ref ymodem_rx_flag + * @arg YMODEM_RX_FLAG_NAK : 接收方发送YMODEM_NAK启动传输,发送方使用校验和 + * @arg YMODEM_RX_FLAG_CRC : 接收方发送'C'启动传输,发送方使用CRC校验 + * + * @retval None + */ +void ymodem_rx_start(ymodem_t *_ymodem, uint8_t startFlag) +{ + ASSERT_PARAM(IS_VALID_POINT(_ymodem)); + ASSERT_PARAM(IS_VALID_RX_FLAG(startFlag)); + + if(YMODEM_STATE_IDLE == _ymodem->state) + { + _ymodem->checkNum = (startFlag == YMODEM_RX_FLAG_NAK) ? 1 : 2; /* 记录校验方式 */ + _ymodem->fileFlag = 1; /* 置位文件标志 */ + _ymodem->state = YMODEM_STATE_WAIT; /* 切换状态 */ + /* 发送启动内容 */ + _ymodem->dataBuf[YMODEM_START_INDEX] = startFlag; + _ymodem->dataLen = 1; + _ymodem->dataLenTmp = _ymodem->dataLen; + _ymodem->txEnFn(1); + } +} + +/** + * @brief ymodem发送轮询处理 + * + * @param _ymodem : ymodem管理实例 + * + * @retval None + */ +void ymodem_tx_poll(ymodem_t *_ymodem) +{ + uint16_t checkVal; + uint32_t tickTmp; + + ASSERT_PARAM(IS_VALID_POINT(_ymodem)); + + switch(_ymodem->state) + { + case YMODEM_STATE_IDLE: + /* 首次收到的数据认为是启动发送的命令 */ + if(1 == _ymodem->packetNum) + { + /* 收到NAK则使用累加和校验 */ + if(YMODEM_NAK == _ymodem->dataBuf[0]) + { + _ymodem->checkNum = 1; + _ymodem->state = YMODEM_STATE_CHECK_DATA; + } /* 收到'C'则使用CRC16校验 */ + else if(YMODEM_CRC16 == _ymodem->dataBuf[0]) + { + _ymodem->checkNum = 2; + _ymodem->state = YMODEM_STATE_CHECK_DATA; + } /* 否则认为是无效数据 */ + else + { + _ymodem->dataLen = 0; + } + } + break; + case YMODEM_STATE_WAIT: + tickTmp = _ymodem->rspTimeoutCnt; + /* 应答超时判断 */ + if(tickTmp && (module_tick_get() - tickTmp) > _ymodem->rspTimeout) + { + _ymodem->rspTimeoutCnt = 0; + /* 若回复超时次数达到预设值 则直接中断接收回到IDLE状态 */ + if(_ymodem->rspTimeoutTimes++ >= YMODEM_RSP_TIMES) + { + ymodem_init_state(_ymodem); + break; + } + /* 重发当前包 */ + _ymodem->dataLen = _ymodem->dataLenTmp; + _ymodem->txEnFn(1); + } + break; + case YMODEM_STATE_CHECK_HEAD: + /* 收到ACK则继续发下一包 */ + if(YMODEM_ACK == _ymodem->dataBuf[0]) + { + _ymodem->state = YMODEM_STATE_CHECK_DATA; /* 切换状态 */ + } /* 收到NAK则重发当前包 */ + else if(YMODEM_NAK == _ymodem->dataBuf[0]) + { + _ymodem->packetNum--; /* 包序号-1 */ + _ymodem->state = YMODEM_STATE_CHECK_DATA; /* 切换状态 */ + } /* 收到CAN则取消传输 */ + else if(YMODEM_CAN == _ymodem->dataBuf[0]) + { + ymodem_init_state(_ymodem); + break; + } /* 否则认为是无效数据 */ + else + { + _ymodem->dataLen = 0; + _ymodem->state = YMODEM_STATE_WAIT; + break; + } + case YMODEM_STATE_CHECK_DATA: + /* 用户set回调函数 */ + _ymodem->setPacketFn(_ymodem->packetNum, &_ymodem->dataBuf[3], &_ymodem->dataLen); + /* 超过128但不超过1024的按1024byte */ + if(128 < _ymodem->dataLen && 1024 >= _ymodem->dataLen) + { + _ymodem->dataBuf[0] = YMODEM_STX; /* 包头STX携带1024byte数据 */ + memset(&_ymodem->dataBuf[3 + _ymodem->dataLen], YMODEM_CTRLZ, 1024 - _ymodem->dataLen); /* 填充字节 */ + _ymodem->dataLen = 1024; + } /* 超过0但不超过128的按128byte */ + else if(0 < _ymodem->dataLen && 128 >= _ymodem->dataLen) + { + _ymodem->dataBuf[0] = YMODEM_SOH; /* 包头STX携带128byte数据 */ + memset(&_ymodem->dataBuf[3 + _ymodem->dataLen], YMODEM_CTRLZ, 128 - _ymodem->dataLen); /* 填充字节 */ + _ymodem->dataLen = 128; + } /* 其它认为是传输结束 */ + else + { + ymodem_init_state(_ymodem); + /* 回复EOT传输结束 */ + _ymodem->dataBuf[0] = YMODEM_EOT; + _ymodem->dataLen = 1; + _ymodem->txEnFn(1); + break; + } + /* 1字节累加和校验 */ + if(1 == _ymodem->checkNum) + { + checkVal = ymodem_check_sum(&_ymodem->dataBuf[3], _ymodem->dataLen); + _ymodem->dataBuf[_ymodem->dataLen + 3] = checkVal; + } /* 2字节CRC16校验 */ + else + { + checkVal = ymodem_check_crc16(&_ymodem->dataBuf[3], _ymodem->dataLen); + _ymodem->dataBuf[_ymodem->dataLen + 3] = checkVal >> 8; + _ymodem->dataBuf[_ymodem->dataLen + 4] = checkVal & 0xFF; + } + _ymodem->rspTimeoutTimes = 0; + _ymodem->state = YMODEM_STATE_WAIT; /* 切换状态 */ + /* 设置包序号和其补码 */ + _ymodem->dataBuf[1] = _ymodem->packetNum; + _ymodem->dataBuf[2] = 0xFF - _ymodem->packetNum; + _ymodem->packetNum++; + /* 发送包内容 */ + _ymodem->dataLen = _ymodem->dataLen + 3 + _ymodem->checkNum; + _ymodem->dataLenTmp = _ymodem->dataLen; + _ymodem->txEnFn(1); + break; + } +} + +/** + * @brief 写入数据到接收缓冲区 + * + * @note 一般加入到(串口)接收中断 + * + * @param _ymodem : ymodem管理实例 + * + * @param pBuf : 数据缓存区 + * + * @param len : 写入长度byte + * + * @retval uint16_t + * @arg !0 : 成功写入的数据数量 + * @arg 0 : 失败(写入已满) + */ +uint16_t ymodem_write_rx_buf(ymodem_t *_ymodem, void *pBuf, uint16_t len) +{ + uint16_t unusedLen; + + ASSERT_PARAM(IS_VALID_POINT(_ymodem)); + ASSERT_PARAM(IS_VALID_POINT(_ymodem->dataBuf)); + ASSERT_PARAM(IS_VALID_POINT(pBuf)); + + /* 在IDLE和WAIT状态下可以接收数据 */ + if(YMODEM_STATE_WAIT >= _ymodem->state) + { + /* 计算可写数量 */ + unusedLen = _ymodem->dataBufLen - _ymodem->dataLen; + len = (len > unusedLen) ? unusedLen : len; + + if(0 < len) + { + /* 接续copy数据并记录数量 */ + memcpy((void *)&_ymodem->dataBuf[_ymodem->dataLen], (void *)pBuf, len); + _ymodem->dataLen += len; + _ymodem->rspTimeoutCnt = 0; /* 关闭回复超时计数 */ + if(YMODEM_STATE_WAIT == _ymodem->state) + { + _ymodem->state = YMODEM_STATE_CHECK_HEAD; /* 切换状态 */ + } + + return len; + } + } + + return 0; +} + +/** + * @brief 读出数据从发送缓冲区 + * + * @note 一般加入到(串口)发送中断 + * + * @param _ymodem : ymodem管理实例 + * + * @param pBuf : 数据存储区 + * + * @param len : 读出长度byte + * + * @retval uint16_t + * @arg !0 : 成功读出的数据数量 + * @arg 0 : 失败(无数据可读) + */ +uint16_t ymodem_read_tx_buf(ymodem_t *_ymodem, void *pBuf, uint16_t len) +{ + uint16_t unreadLen; + + ASSERT_PARAM(IS_VALID_POINT(_ymodem)); + ASSERT_PARAM(IS_VALID_POINT(_ymodem->dataBuf)); + ASSERT_PARAM(IS_VALID_POINT(pBuf)); + + /* 计算可读数量 */ + unreadLen = _ymodem->dataLen - _ymodem->readLen; + len = (len > unreadLen) ? unreadLen : len; + + if(0 < len) + { + /* copy数据至外部存储区并记录数量 */ + memcpy((void *)pBuf, (void *)&_ymodem->dataBuf[_ymodem->readLen], len); + _ymodem->readLen += len; + /* 数据被全部copy出去 */ + if(_ymodem->readLen == _ymodem->dataLen) + { + /* 清零相关计数 */ + _ymodem->dataLen = 0; + _ymodem->readLen = 0; + _ymodem->rspTimeoutCnt = module_tick_get(); /*开启回复超时计数*/ + } + } + + return len; +} + +void ymodem_file_info(file_info_t *_info, uint8_t *data) +{ + uint8_t cnt = 0; + + while((*data != 0) && (cnt < YMODEM_FILE_NAME_LEN)) + { + _info->fileName[cnt++] = *data++; + } + _info->fileName[cnt] = '\0'; + _info->fileSize = atoi((char *)++data); +} + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ diff --git a/drivers/bootloader/ymodem.h b/drivers/bootloader/ymodem.h new file mode 100644 index 0000000..73c6e29 --- /dev/null +++ b/drivers/bootloader/ymodem.h @@ -0,0 +1,214 @@ +/** + ****************************************************************************** + * @file ymodem.h + * @author ashuai0110 + * @version V1.0 + * @date 2024-01-08 + * @brief ymodem协议 + * + ****************************************************************************** + * @attention + * + * 版权声明:内容为编者(ashuai0110)原创,使用请注明出处,当然,你也可以不这样做^_^ + * 出处链接:https://gitee.com/ashuai0110/mcu_reuse_development_module.git + * + ****************************************************************************** + */ + +#ifndef __YMODEM_H +#define __YMODEM_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* 包含头文件-----------------------------------------------------------------*/ +#include "common_include.h" + +/** + * @addtogroup bootloader + * @{ + */ + +/** + * @addtogroup ymodem + * @{ + */ + +/* 宏定义---------------------------------------------------------------------*/ +/** + * @defgroup ymodem_global_macros ymodem global macros + * @{ + */ + +#define YMODEM_RSP_TIMES (3u) /*!< 回复超时次数默认3次(0~255) */ +#define YMODEM_FILE_NAME_LEN (32u) /*!< 文件名长度 用户根据需求更改 */ + +#define YMODEM_FILE_FLAG(x) ((x).fileFlag) /* 文件标志 用户通过此接口区分文件信息包和正常数据包 */ + +/** + * @defgroup ymodem_info ymodem info + * @{ + */ +/* /------------------ymodem协议格式------------------\ + * | 命令符 | 包序号 | 包序号反码 | 有效数据 | 校验 | + * | 1 | 1 | 1 | 128/1024 | 1/2 | + * \--------------------------------------------------/ */ +#define YMODEM_START_INDEX (0u) +#define YMODEM_NUMBER_INDEX (1u) +#define YMODEM_CNUMBER_INDEX (2u) +#define YMODEM_DATA_INDEX (3u) +#define YMODEM_HEADER_SIZE (3u) +#define YMODEM_DATA_SIZE (128u) +#define YMODEM_DATA_1K_SIZE (1024u) +/** + * @} + */ + +/** + * @defgroup ymodem_command_symbol ymodem command symbol + * @{ + */ +#define YMODEM_SOH (0x01u) /*!< 命令符:128byte数据 */ +#define YMODEM_STX (0x02u) /*!< 命令符:1024byte数据 */ +#define YMODEM_EOT (0x04u) /*!< 命令符:发送结束 */ +#define YMODEM_ACK (0x06u) /*!< 命令符:正确应答 */ +#define YMODEM_NAK (0x15u) /*!< 命令符:错误应答/校验方式累加和 */ +#define YMODEM_CAN (0x18u) /*!< 命令符:取消发送 */ +#define YMODEM_CTRLZ (0x1Au) /*!< 填充字节 */ +#define YMODEM_CRC16 ('C') /*!< 命令符:校验方式CRC16 */ +/** + * @} + */ + +/** + * @defgroup ymodem_rx_state ymodem rx state + * @{ + */ +#define YMODEM_STATE_IDLE (0u) /*!< 空闲状态 */ +#define YMODEM_STATE_WAIT (1u) /*!< 等待接收状态 */ +#define YMODEM_STATE_CHECK_HEAD (2u) /*!< 校验数据头状态 */ +#define YMODEM_STATE_CHECK_DATA (3u) /*!< 校验数据状态 */ +#define YMODEM_STATE_RESTART (4u) /*!< 重新启动状态 */ +/** + * @} + */ + +/** + * @defgroup ymodem_rx_flag ymodem rx flag + * @{ + */ +#define YMODEM_RX_FLAG_NAK (YMODEM_NAK) /*!< 接收方发送NAK启动传输,发送方使用累加和校验 */ +#define YMODEM_RX_FLAG_CRC (YMODEM_CRC16) /*!< 接收方发送'C'启动传输,发送方使用CRC16校验 */ +/** + * @} + */ + +/** + * @} + */ + +/* 类型定义-------------------------------------------------------------------*/ +/** + * @defgroup ymodem_global_types ymodem global types + * @{ + */ + +/** + * @brief ymodem发送前(串口)准备函数 + * + * @note 如:使用串口中断发送时需使能发送相关中断/使用串口DMA发送时需配置使能DMA + * + * @param enState : 0-关闭(失能) 1-开启(使能) + * + * @retval None + */ +typedef void (* ymodem_tx_en_t)(uint8_t enState); + +/** + * @brief ymodem获取/设置数据包函数 + * + * @note 获取数据包即本机接收对方传输来的数据, 设置数据包即本机提供将要发送的数据 + * + * @param packetNum : 从1开始,超出后回到0继续累加(1-255,0-255...) + * + * @param data : 获取数据包此参数包含有效数据/设置数据包此参数需用户写入有效数据 + * + * @param len : 获取数据包此参数包含数据长度(包含填充数据)/设置数据包此参数需用户写入数据长度(不包含填充数据) + * + * @retval None + */ +typedef void (* ymodem_user_packet_cb_t)(uint8_t packetNum, uint8_t *data, uint16_t *len); + +/** + * @brief ymodem structure definition + */ +typedef struct ymodem { + uint8_t *dataBuf; /*!< 数据缓冲区 */ + uint16_t dataBufLen; /*!< 数据缓冲区大小 */ + uint16_t dataLen; /*!< 存放数据数量 */ + uint16_t readLen; /*!< 数据读出数量 */ + uint16_t dataLenTmp; /*!< 存放数据数量暂存 */ + + uint16_t rspTimeout; /*!< 回复超时时间ms */ + uint32_t rspTimeoutCnt; /*!< 回复超时时间计数 */ + uint8_t rspTimeoutTimes; /*!< 回复超时次数 */ + uint8_t packetNum; /*!< 包序号 */ + + uint8_t state : 3; /*!< ymodem状态 @ref ymodem_rx_state */ + uint8_t checkNum : 2; /*!< 校验字节数 1:累加和 2:CRC16 */ + uint8_t fileFlag : 1; /*!< 文件信息标志 1:此包数据为文件信息 */ + uint8_t eotFlag : 1; /*!< 首次EOT标志 0:首次 1:非首次 */ + + ymodem_tx_en_t txEnFn; /*!< 串口发送准备函数 */ + ymodem_user_packet_cb_t getPacketFn; /*!< 获取数据包回调函数 */ + ymodem_user_packet_cb_t setPacketFn; /*!< 设置数据包回调函数 */ +} ymodem_t; + +typedef struct file_info { + char fileName[YMODEM_FILE_NAME_LEN]; /*!< 文件名 */ + uint32_t fileSize; /*!< 文件大小 */ +} file_info_t; + +/** + * @} + */ + +/* 全局变量-------------------------------------------------------------------*/ + +/* 函数原型-------------------------------------------------------------------*/ +/** + * @addtogroup ymodem_global_functions + * @{ + */ + +void ymodem_init(ymodem_t *_ymodem, void *dataBuf, uint16_t bufLen, ymodem_tx_en_t txEnFn, \ + ymodem_user_packet_cb_t getPacketFn, ymodem_user_packet_cb_t setPacketFn, uint16_t rspTimeout); + +void ymodem_rx_poll(ymodem_t *_ymodem); +void ymodem_tx_poll(ymodem_t *_ymodem); + +void ymodem_rx_start(ymodem_t *_ymodem, uint8_t startFlag); + +uint16_t ymodem_write_rx_buf(ymodem_t *_ymodem, void *pBuf, uint16_t len); +uint16_t ymodem_read_tx_buf(ymodem_t *_ymodem, void *pBuf, uint16_t len); + +void ymodem_file_info(file_info_t *_info, uint8_t *data); + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* ymodem.h */ diff --git a/examples/ymodem/MDK/use_example.uvoptx b/examples/ymodem/MDK/use_example.uvoptx new file mode 100644 index 0000000..d57c835 --- /dev/null +++ b/examples/ymodem/MDK/use_example.uvoptx @@ -0,0 +1,987 @@ + + + + 1.0 + +
### uVision Project, (C) Keil Software
+ + + *.c + *.s*; *.src; *.a* + *.obj; *.o + *.lib + *.txt; *.h; *.inc; *.md + *.plm + *.cpp; *.cc; *.cxx + 0 + + + + 0 + 0 + + + + Target 1 + 0x4 + ARM-ADS + + 12000000 + + 1 + 1 + 0 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\Listings\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 18 + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 1 + 0 + 0 + 1 + 0 + 0 + 4 + + + + + + + + + + + Segger\JL2CM3.dll + + + + 0 + ARMRTXEVENTFLAGS + -L70 -Z18 -C0 -M0 -T1 + + + 0 + DLGTARM + (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0) + + + 0 + ARMDBGFLAGS + + + + 0 + DLGUARM + d + + + 0 + JL2CM3 + -U59522627 -O78 -S2 -ZTIFSpeedSel5000 -A0 -C0 -JU1 -JI127.0.0.1 -JP0 -RST0 -N00("ARM CoreSight SW-DP") -D00(1BA01477) -L00(0) -TO18 -TC10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -TB1 -TFE0 -FO15 -FD20000000 -FC1000 -FN1 -FF0STM32F10x_128.FLM -FS08000000 -FL020000 -FP0($$Device:STM32F103C8$Flash\STM32F10x_128.FLM) + + + 0 + UL2CM3 + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32F10x_128 -FS08000000 -FL020000 -FP0($$Device:STM32F103C8$Flash\STM32F10x_128.FLM)) + + + + + 0 + 0 + 229 + 1 +
134224394
+ 0 + 0 + 0 + 0 + 0 + 1 + D:\ASProject\mcuProject\mcu_development_template\mcu_reuse_development_module\drivers\bootloader\xmodem.c + + \\use_example\../../../drivers/bootloader/xmodem.c\229 +
+ + 1 + 0 + 234 + 1 +
134224434
+ 0 + 0 + 0 + 0 + 0 + 1 + D:\ASProject\mcuProject\mcu_development_template\mcu_reuse_development_module\drivers\bootloader\xmodem.c + + \\use_example\../../../drivers/bootloader/xmodem.c\234 +
+ + 2 + 0 + 277 + 1 +
134224622
+ 0 + 0 + 0 + 0 + 0 + 1 + D:\ASProject\mcuProject\mcu_development_template\mcu_reuse_development_module\drivers\bootloader\xmodem.c + + \\use_example\../../../drivers/bootloader/xmodem.c\277 +
+ + 3 + 0 + 205 + 1 +
134224320
+ 0 + 0 + 0 + 0 + 0 + 1 + D:\ASProject\mcuProject\mcu_development_template\mcu_reuse_development_module\drivers\bootloader\xmodem.c + + \\use_example\../../../drivers/bootloader/xmodem.c\205 +
+ + 4 + 0 + 205 + 1 +
134224712
+ 0 + 0 + 0 + 0 + 0 + 1 + D:\ASProject\mcuProject\mcu_development_template\mcu_reuse_development_module\drivers\bootloader\xmodem.c + + \\use_example\../../../drivers/bootloader/xmodem.c\205 +
+ + 5 + 0 + 207 + 1 +
0
+ 0 + 0 + 0 + 0 + 0 + 0 + D:\ASProject\mcuProject\mcu_development_template\mcu_reuse_development_module\drivers\bootloader\xmodem.c + + +
+ + 6 + 0 + 230 + 1 +
0
+ 0 + 0 + 0 + 0 + 0 + 0 + D:\ASProject\mcuProject\mcu_development_template\mcu_reuse_development_module\drivers\bootloader\xmodem.c + + +
+ + 7 + 0 + 235 + 1 +
0
+ 0 + 0 + 0 + 0 + 0 + 0 + D:\ASProject\mcuProject\mcu_development_template\mcu_reuse_development_module\drivers\bootloader\xmodem.c + + +
+ + 8 + 0 + 279 + 1 +
0
+ 0 + 0 + 0 + 0 + 0 + 0 + D:\ASProject\mcuProject\mcu_development_template\mcu_reuse_development_module\drivers\bootloader\xmodem.c + + +
+ + 9 + 0 + 196 + 1 +
0
+ 0 + 0 + 0 + 0 + 0 + 0 + D:\ASProject\mcuProject\mcu_development_template\mcu_reuse_development_module\drivers\bootloader\xmodem.c + + +
+ + 10 + 0 + 198 + 1 +
0
+ 0 + 0 + 0 + 0 + 0 + 0 + D:\ASProject\mcuProject\mcu_development_template\mcu_reuse_development_module\drivers\bootloader\xmodem.c + + +
+ + 11 + 0 + 220 + 1 +
0
+ 0 + 0 + 0 + 0 + 0 + 0 + D:\ASProject\mcuProject\mcu_development_template\mcu_reuse_development_module\drivers\bootloader\xmodem.c + + +
+ + 12 + 0 + 221 + 1 +
0
+ 0 + 0 + 0 + 0 + 0 + 0 + D:\ASProject\mcuProject\mcu_development_template\mcu_reuse_development_module\drivers\bootloader\xmodem.c + + +
+ + 13 + 0 + 225 + 1 +
0
+ 0 + 0 + 0 + 0 + 0 + 0 + D:\ASProject\mcuProject\mcu_development_template\mcu_reuse_development_module\drivers\bootloader\xmodem.c + + +
+ + 14 + 0 + 226 + 1 +
0
+ 0 + 0 + 0 + 0 + 0 + 0 + D:\ASProject\mcuProject\mcu_development_template\mcu_reuse_development_module\drivers\bootloader\xmodem.c + + +
+ + 15 + 0 + 268 + 1 +
0
+ 0 + 0 + 0 + 0 + 0 + 0 + D:\ASProject\mcuProject\mcu_development_template\mcu_reuse_development_module\drivers\bootloader\xmodem.c + + +
+ + 16 + 0 + 270 + 1 +
0
+ 0 + 0 + 0 + 0 + 0 + 0 + D:\ASProject\mcuProject\mcu_development_template\mcu_reuse_development_module\drivers\bootloader\xmodem.c + + +
+
+ + + 0 + 1 + usart1DmaRxBuf + + + 1 + 1 + dataBuf + + + 2 + 1 + len + + + 3 + 1 + tickTmp + + + 4 + 1 + moduleTick + + + 5 + 1 + xmodem + + + 6 + 1 + xmodemBuf + + + 7 + 1 + crc16 + + + + 0 + + + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + 0 + 0 + 0 + + + + + + + + + + 1 + 1 + 0 + 2 + 10000000 + +
+
+ + + cmsis + 0 + 0 + 0 + 0 + + 1 + 1 + 1 + 0 + 0 + 0 + ..\..\[base_on_stm32f1]\stm32f1_lib\cmsis\core_cm3.c + core_cm3.c + 0 + 0 + + + 1 + 2 + 1 + 0 + 0 + 0 + ..\..\[base_on_stm32f1]\stm32f1_lib\cmsis\stm32f10x_it.c + stm32f10x_it.c + 0 + 0 + + + 1 + 3 + 1 + 0 + 0 + 0 + ..\..\[base_on_stm32f1]\stm32f1_lib\cmsis\system_stm32f10x.c + system_stm32f10x.c + 0 + 0 + + + 1 + 4 + 2 + 0 + 0 + 0 + ..\..\[base_on_stm32f1]\stm32f1_lib\cmsis\startup\startup_stm32f10x_md.s + startup_stm32f10x_md.s + 0 + 0 + + + + + libs + 0 + 0 + 0 + 0 + + 2 + 5 + 1 + 0 + 0 + 0 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\misc.c + misc.c + 0 + 0 + + + 2 + 6 + 1 + 0 + 0 + 0 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_adc.c + stm32f10x_adc.c + 0 + 0 + + + 2 + 7 + 1 + 0 + 0 + 0 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_bkp.c + stm32f10x_bkp.c + 0 + 0 + + + 2 + 8 + 1 + 0 + 0 + 0 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_can.c + stm32f10x_can.c + 0 + 0 + + + 2 + 9 + 1 + 0 + 0 + 0 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_cec.c + stm32f10x_cec.c + 0 + 0 + + + 2 + 10 + 1 + 0 + 0 + 0 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_crc.c + stm32f10x_crc.c + 0 + 0 + + + 2 + 11 + 1 + 0 + 0 + 0 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_dac.c + stm32f10x_dac.c + 0 + 0 + + + 2 + 12 + 1 + 0 + 0 + 0 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_dbgmcu.c + stm32f10x_dbgmcu.c + 0 + 0 + + + 2 + 13 + 1 + 0 + 0 + 0 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_dma.c + stm32f10x_dma.c + 0 + 0 + + + 2 + 14 + 1 + 0 + 0 + 0 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_exti.c + stm32f10x_exti.c + 0 + 0 + + + 2 + 15 + 1 + 0 + 0 + 0 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_flash.c + stm32f10x_flash.c + 0 + 0 + + + 2 + 16 + 1 + 0 + 0 + 0 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_fsmc.c + stm32f10x_fsmc.c + 0 + 0 + + + 2 + 17 + 1 + 0 + 0 + 0 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_gpio.c + stm32f10x_gpio.c + 0 + 0 + + + 2 + 18 + 1 + 0 + 0 + 0 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_i2c.c + stm32f10x_i2c.c + 0 + 0 + + + 2 + 19 + 1 + 0 + 0 + 0 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_iwdg.c + stm32f10x_iwdg.c + 0 + 0 + + + 2 + 20 + 1 + 0 + 0 + 0 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_pwr.c + stm32f10x_pwr.c + 0 + 0 + + + 2 + 21 + 1 + 0 + 0 + 0 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_rcc.c + stm32f10x_rcc.c + 0 + 0 + + + 2 + 22 + 1 + 0 + 0 + 0 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_rtc.c + stm32f10x_rtc.c + 0 + 0 + + + 2 + 23 + 1 + 0 + 0 + 0 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_sdio.c + stm32f10x_sdio.c + 0 + 0 + + + 2 + 24 + 1 + 0 + 0 + 0 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_spi.c + stm32f10x_spi.c + 0 + 0 + + + 2 + 25 + 1 + 0 + 0 + 0 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_tim.c + stm32f10x_tim.c + 0 + 0 + + + 2 + 26 + 1 + 0 + 0 + 0 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_usart.c + stm32f10x_usart.c + 0 + 0 + + + 2 + 27 + 1 + 0 + 0 + 0 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_wwdg.c + stm32f10x_wwdg.c + 0 + 0 + + + + + segger + 0 + 0 + 0 + 0 + + 3 + 28 + 1 + 0 + 0 + 0 + ..\..\..\drivers\segger_rtt\SEGGER_RTT.c + SEGGER_RTT.c + 0 + 0 + + + 3 + 29 + 1 + 0 + 0 + 0 + ..\..\..\drivers\segger_rtt\SEGGER_RTT_printf.c + SEGGER_RTT_printf.c + 0 + 0 + + + + + system + 1 + 0 + 0 + 0 + + 4 + 30 + 1 + 0 + 0 + 0 + ..\..\[base_on_stm32f1]\stm32f1_sys\usart_dma.c + usart_dma.c + 0 + 0 + + + 4 + 31 + 1 + 0 + 0 + 0 + ..\..\[base_on_stm32f1]\stm32f1_sys\tim.c + tim.c + 0 + 0 + + + + + source + 1 + 0 + 0 + 0 + + 5 + 32 + 1 + 0 + 0 + 0 + ..\SRC\main.c + main.c + 0 + 0 + + + 5 + 33 + 1 + 0 + 0 + 0 + ..\..\..\drivers\common\common_include.c + common_include.c + 0 + 0 + + + 5 + 34 + 1 + 0 + 0 + 0 + ..\..\..\drivers\bootloader\ymodem.c + ymodem.c + 0 + 0 + + + + + readme + 1 + 0 + 0 + 0 + + 6 + 35 + 5 + 0 + 0 + 0 + ..\README.txt + README.txt + 0 + 0 + + + +
diff --git a/examples/ymodem/MDK/use_example.uvprojx b/examples/ymodem/MDK/use_example.uvprojx new file mode 100644 index 0000000..d6020e4 --- /dev/null +++ b/examples/ymodem/MDK/use_example.uvprojx @@ -0,0 +1,607 @@ + + + + 2.1 + +
### uVision Project, (C) Keil Software
+ + + + Target 1 + 0x4 + ARM-ADS + 5060960::V5.06 update 7 (build 960)::.\ARMCC + 0 + + + STM32F103C8 + STMicroelectronics + Keil.STM32F1xx_DFP.2.4.1 + https://www.keil.com/pack/ + IRAM(0x20000000,0x00005000) IROM(0x08000000,0x00010000) CPUTYPE("Cortex-M3") CLOCK(12000000) ELITTLE + + + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32F10x_128 -FS08000000 -FL020000 -FP0($$Device:STM32F103C8$Flash\STM32F10x_128.FLM)) + 0 + $$Device:STM32F103C8$Device\Include\stm32f10x.h + + + + + + + + + + $$Device:STM32F103C8$SVD\STM32F103xx.svd + 0 + 0 + + + + + + + 0 + 0 + 0 + 0 + 1 + + .\Objects\ + use_example + 1 + 0 + 1 + 1 + 1 + .\Listings\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 1 + 0 + fromelf.exe --bin -o "$L@L.bin" "#L" + + 0 + 0 + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + SARMCM3.DLL + -REMAP + DCM.DLL + -pCM3 + SARMCM3.DLL + + TCM.DLL + -pCM3 + + + + 1 + 0 + 0 + 0 + 16 + + + + + 1 + 0 + 0 + 1 + 1 + -1 + + 1 + BIN\UL2CM3.DLL + + + + + + 0 + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M3" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 8 + 1 + 0 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x5000 + + + 1 + 0x8000000 + 0x10000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x8000000 + 0x10000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x5000 + + + 0 + 0x0 + 0x0 + + + + + + 1 + 1 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + 0 + 1 + 0 + 0 + 3 + 3 + 1 + 1 + 0 + 0 + 0 + + + STM32F10X_MD,USE_STDPERIPH_DRIVER + + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\inc;..\..\[base_on_stm32f1]\stm32f1_lib\cmsis;..\..\[base_on_stm32f1]\stm32f1_sys;..\..\..\drivers\common;..\..\..\drivers\segger_rtt;..\..\..\drivers\bootloader + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + + + + + + + + + 1 + 0 + 0 + 0 + 1 + 0 + 0x08000000 + 0x20000000 + + + + + + + + + + + + + cmsis + + + core_cm3.c + 1 + ..\..\[base_on_stm32f1]\stm32f1_lib\cmsis\core_cm3.c + + + stm32f10x_it.c + 1 + ..\..\[base_on_stm32f1]\stm32f1_lib\cmsis\stm32f10x_it.c + + + system_stm32f10x.c + 1 + ..\..\[base_on_stm32f1]\stm32f1_lib\cmsis\system_stm32f10x.c + + + startup_stm32f10x_md.s + 2 + ..\..\[base_on_stm32f1]\stm32f1_lib\cmsis\startup\startup_stm32f10x_md.s + + + + + libs + + + misc.c + 1 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\misc.c + + + stm32f10x_adc.c + 1 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_adc.c + + + stm32f10x_bkp.c + 1 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_bkp.c + + + stm32f10x_can.c + 1 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_can.c + + + stm32f10x_cec.c + 1 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_cec.c + + + stm32f10x_crc.c + 1 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_crc.c + + + stm32f10x_dac.c + 1 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_dac.c + + + stm32f10x_dbgmcu.c + 1 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_dbgmcu.c + + + stm32f10x_dma.c + 1 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_dma.c + + + stm32f10x_exti.c + 1 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_exti.c + + + stm32f10x_flash.c + 1 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_flash.c + + + stm32f10x_fsmc.c + 1 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_fsmc.c + + + stm32f10x_gpio.c + 1 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_gpio.c + + + stm32f10x_i2c.c + 1 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_i2c.c + + + stm32f10x_iwdg.c + 1 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_iwdg.c + + + stm32f10x_pwr.c + 1 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_pwr.c + + + stm32f10x_rcc.c + 1 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_rcc.c + + + stm32f10x_rtc.c + 1 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_rtc.c + + + stm32f10x_sdio.c + 1 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_sdio.c + + + stm32f10x_spi.c + 1 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_spi.c + + + stm32f10x_tim.c + 1 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_tim.c + + + stm32f10x_usart.c + 1 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_usart.c + + + stm32f10x_wwdg.c + 1 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_wwdg.c + + + + + segger + + + SEGGER_RTT.c + 1 + ..\..\..\drivers\segger_rtt\SEGGER_RTT.c + + + SEGGER_RTT_printf.c + 1 + ..\..\..\drivers\segger_rtt\SEGGER_RTT_printf.c + + + + + system + + + usart_dma.c + 1 + ..\..\[base_on_stm32f1]\stm32f1_sys\usart_dma.c + + + tim.c + 1 + ..\..\[base_on_stm32f1]\stm32f1_sys\tim.c + + + + + source + + + main.c + 1 + ..\SRC\main.c + + + common_include.c + 1 + ..\..\..\drivers\common\common_include.c + + + ymodem.c + 1 + ..\..\..\drivers\bootloader\ymodem.c + + + + + readme + + + README.txt + 5 + ..\README.txt + + + + + + + + + + + + + + + + + use_example + 1 + + + + +
diff --git a/examples/ymodem/README.txt b/examples/ymodem/README.txt new file mode 100644 index 0000000..d4c086e --- /dev/null +++ b/examples/ymodem/README.txt @@ -0,0 +1,47 @@ +================================================================================ + 用例使用说明 +================================================================================ +Date Author MDK MCU +2024-01-08 ashuai0110 5.35 STM32F1 + +================================================================================ +功能描述 +================================================================================ +本用例展示了ymodem协议组件的使用方法。 + +================================================================================ +测试环境 +================================================================================ +测试用板: +--------------------- +任意开发板 + +辅助工具: +--------------------- +J-Link + +辅助软件: +--------------------- +J-Link RTT Viewer +SecureCRT串口软件 + +源码文件: +--------------------- +ymodem.c +ymodem.h + +================================================================================ +使用步骤 +================================================================================ +1)使用J-Link连接目标板; +2)打开工程,重新编译,启动调试或直接下载程序运行; +3)用J-Link RTT Viewer软件连接,查看打印消息; +4)用SecureCRT串口软件连接设备串口,点击工具栏Transfer->Send Ymodem + 或Transfer->Receive Ymodem选项开始传输 + +================================================================================ +注意 +================================================================================ +1)用户根据需求可前往源码头文件修改宏定义参数 + +================================================================================ diff --git a/examples/ymodem/SRC/main.c b/examples/ymodem/SRC/main.c new file mode 100644 index 0000000..df059d8 --- /dev/null +++ b/examples/ymodem/SRC/main.c @@ -0,0 +1,229 @@ +/** + ****************************************************************************** + * @file main.c + * @author ashuai0110 + * @version V1.0 + * @date 2024-01-08 + * @brief 使用举例-ymodem + * + ****************************************************************************** + * @attention + * + * 版权声明:内容为编者(ashuai0110)原创,使用请注明出处,当然,你也可以不这样做^_^ + * 出处链接:https://gitee.com/ashuai0110/mcu_reuse_development_module + * + ****************************************************************************** + */ + +/* 包含头文件-----------------------------------------------------------------*/ +#include "stm32f10x.h" +#include "usart_dma.h" +#include "tim.h" + +#include "ymodem.h" + +/* 私有宏定义-----------------------------------------------------------------*/ +#define YMODEM_TX_RX_TEST (1u) /* 0:Tx test 1:Rx test */ + +/* 私有类型定义---------------------------------------------------------------*/ + +/* 私有变量-------------------------------------------------------------------*/ +static uint8_t usart1DmaTxBuf[200]; /* 串口1dma发送缓存区 */ +static uint8_t usart1DmaRxBuf[200]; /* 串口1dma接收缓存区 */ + +ymodem_t ymodem; /* ymodem实例 */ +static uint8_t ymodemBuf[1029]; /* ymodem数据缓存区 */ + +/* 全局变量-------------------------------------------------------------------*/ + +/* 私有函数原型---------------------------------------------------------------*/ +void usart1_tx_en(uint8_t enState); + + +/** + * @brief 定时器1中断函数 + */ +void TIM1_UP_IRQHandler(void) +{ + if(TIM_GetITStatus(TIM1, TIM_IT_Update) != RESET) + { + /* 组件计时节拍接口 */ + module_tick_inc(1); + + TIM_ClearITPendingBit(TIM1, TIM_FLAG_Update); + } +} + +/** + * @brief 串口1中断 + */ +void USART1_IRQHandler(void) +{ + /* 串口1空闲中断 */ + if(USART_GetITStatus(USART1,USART_IT_IDLE) != RESET) + { + USART1->SR; + USART1->DR; + + /* 这里写接收处理 */ + ymodem_write_rx_buf(&ymodem, usart1DmaRxBuf, sizeof(usart1DmaRxBuf) - DMA_GetCurrDataCounter(DMA1_Channel5)); + /* dma重配置 */ + usart1_dma_rx_reconfig(sizeof(usart1DmaRxBuf)); + } +} + +/** + * @brief 串口1接收的dma中断 + */ +void DMA1_Channel5_IRQHandler(void) +{ + /* DMA传输完成中断 */ + if(DMA_GetITStatus(DMA1_IT_TC5) != RESET) + { + /* 这里写接收处理 */ + ymodem_write_rx_buf(&ymodem, usart1DmaRxBuf, sizeof(usart1DmaRxBuf)); + /* dma重配置 */ + usart1_dma_rx_reconfig(sizeof(usart1DmaRxBuf)); + + DMA_ClearITPendingBit(DMA1_IT_TC5); + } +} + +/** + * @brief 串口1发送的dma中断 + */ +void DMA1_Channel4_IRQHandler(void) +{ + static uint16_t num; + + /* DMA传输完成中断 */ + if(DMA_GetITStatus(DMA1_IT_TC4) != RESET) + { + /* 这里写读取发送内容的处理 */ + num = ymodem_read_tx_buf(&ymodem, usart1DmaTxBuf, sizeof(usart1DmaTxBuf)); /* 读出数据 */ + usart1_dma_tx_reconfig(num); /* dma重配置 */ + + DMA_ClearITPendingBit(DMA1_IT_TC4); + } +} + +/** + * @brief 串口发送前准备函数 + * + * @param enState : 0失能 1使能 + * + * @retval None + */ +void usart1_tx_en(uint8_t enState) +{ + if(enState) + { + /* 判断当前是否正在发送 发送完成标志置位则不是正在发送 */ + if(USART_GetFlagStatus(USART1, USART_FLAG_TC) != RESET) + { + uint16_t num; + num = ymodem_read_tx_buf(&ymodem, usart1DmaTxBuf, sizeof(usart1DmaTxBuf)); /* 读出数据 */ + if(0 < num) + { + usart1_dma_tx_reconfig(num); /* dma重配置 */ + } + else + { + DMA_Cmd(DMA1_Channel4, DISABLE); /* 关闭dma */ + } + } + } + else + { + DMA_Cmd(DMA1_Channel4, DISABLE); + } +} + +/** + * @brief 获取ymodem数据包回调函数 + * + * @param packetNum : 数据包序号 首次从1开始 超出255回到0 + * + * @param data : 有效数据缓冲区(需读出数据) + * + * @param len : 有效数据长度(包含填充内容0x1A) + * + * @retval None + */ +void ymodem_get_packet_callback(uint8_t packetNum, uint8_t *data, uint16_t *len) +{ + uint16_t lenTmp = *len; + + /* 文件信息 */ + if(YMODEM_FILE_FLAG(ymodem)) + { + file_info_t fileInfo; + + ymodem_file_info(&fileInfo, data); + PRINT_LOG("ymodem rec file name:%s, size:%d Byte\r\n", fileInfo.fileName, fileInfo.fileSize); + } /* 数据 */ + else + { + PRINT_LOG("ymodem packet num:%d, len:%d, data: ", packetNum, lenTmp); + while(lenTmp--) + { + PRINT_LOG("%02X ", *data++); + } + PRINT_LOG("\r\n"); + } +} + +/** + * @brief 设置ymodem数据包回调函数 + * + * @param packetNum : 数据包序号 首次从1开始 超出255回到0 + * + * @param data : 有效数据存放区(需填充数据) + * + * @param len : 有效数据长度(不包含填充内容0x1A,组件自动填充) + * + * @retval None + */ +void ymodem_set_packet_callback(uint8_t packetNum, uint8_t *data, uint16_t *len) +{ + /* 用户自行计算数据量并在发送完全后给len赋值0 */ + if(packetNum > 100) + { + *len = 0; + } /* 用户自行选择携带128或1024字节数据并将数据赋值给data */ + else + { + *len = 1024; + memset((void *)data, packetNum + '0', 1024); + } +} + +/** + * @brief main + */ +int main(int argc, char *argv[]) +{ + VERSION_LOG("example-ymodem", 1, 0, 0); + + /* 串口及其dma初始化 */ + usart1_dma_init_config(115200, usart1DmaTxBuf, sizeof(usart1DmaTxBuf), usart1DmaRxBuf, sizeof(usart1DmaRxBuf)); + /* 定时器初始化 1ms */ + tim1_init_config(100-1, 720-1); + + /* ymodem组件初始化 */ + ymodem_init(&ymodem, ymodemBuf, sizeof(ymodemBuf), usart1_tx_en, ymodem_get_packet_callback, ymodem_set_packet_callback, 2000); + /* 启动ymodem接收 */ +#if YMODEM_TX_RX_TEST + ymodem_rx_start(&ymodem, YMODEM_RX_FLAG_CRC); +#endif + + while(1) + { +#if YMODEM_TX_RX_TEST + ymodem_rx_poll(&ymodem); +#else + ymodem_tx_poll(&ymodem); +#endif + } +} + -- Gitee From 0f70c1544fbd65989cf10055bfbc31aa601b79d1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=98=BF=E8=A1=B00110?= Date: Mon, 15 Jan 2024 22:22:54 +0800 Subject: [PATCH 41/66] =?UTF-8?q?=E4=BC=98=E5=8C=96ymodem=E6=8E=A5?= =?UTF-8?q?=E6=94=B6,=E5=8F=AF=E4=BB=A5=E5=A4=9A=E6=96=87=E4=BB=B6?= =?UTF-8?q?=E4=BC=A0=E8=BE=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- drivers/bootloader/ymodem.c | 23 +++++++++++++---------- drivers/bootloader/ymodem.h | 3 +-- 2 files changed, 14 insertions(+), 12 deletions(-) diff --git a/drivers/bootloader/ymodem.c b/drivers/bootloader/ymodem.c index a0cf47f..e4dfd2e 100644 --- a/drivers/bootloader/ymodem.c +++ b/drivers/bootloader/ymodem.c @@ -219,6 +219,13 @@ void ymodem_rx_poll(ymodem_t *_ymodem) ymodem_init_state(_ymodem); break; } + /* 第二次收到EOT应答超时后重新启动接收 */ + if(2 == _ymodem->eotFlag) + { + ymodem_init_state(_ymodem); + ymodem_rx_start(_ymodem, _ymodem->checkNum == 1 ? YMODEM_NAK : YMODEM_CRC16); + break; + } /* 重发当前包 */ _ymodem->dataLen = _ymodem->dataLenTmp; _ymodem->txEnFn(1); @@ -242,6 +249,7 @@ void ymodem_rx_poll(ymodem_t *_ymodem) /* 结束包 数据是0 */ if(0 == _ymodem->packetNum && 0 == _ymodem->dataBuf[YMODEM_DATA_INDEX]) { + /* 官方定义结束包的数据全是0 但有些工具并不是 此处为兼容大部分只判断一部分数据 */ if(0 == ymodem_check_sum(&_ymodem->dataBuf[30], 100)) { ymodem_init_state(_ymodem); @@ -264,19 +272,18 @@ void ymodem_rx_poll(ymodem_t *_ymodem) } /* EOT为包头 表示传输结束 */ else if(YMODEM_EOT == _ymodem->dataBuf[YMODEM_START_INDEX]) { - /* 非首次收到EOT则回复ACK */ - if(_ymodem->eotFlag) + /* 第二次收到EOT则回复ACK */ + if(1 == _ymodem->eotFlag) { - _ymodem->eotFlag = 0; + _ymodem->eotFlag = 2; _ymodem->dataBuf[YMODEM_START_INDEX] = YMODEM_ACK; /* 回复ACK */ - _ymodem->state = YMODEM_STATE_RESTART; - } /* 首次收到EOT回复NAK */ + } /* 第一次收到EOT回复NAK */ else { _ymodem->eotFlag = 1; _ymodem->dataBuf[YMODEM_START_INDEX] = YMODEM_NAK; /* 回复NAK */ - _ymodem->state = YMODEM_STATE_WAIT; } + _ymodem->state = YMODEM_STATE_WAIT; /* 发送回复内容 */ _ymodem->dataLen = 1; _ymodem->dataLenTmp = _ymodem->dataLen; @@ -337,10 +344,6 @@ void ymodem_rx_poll(ymodem_t *_ymodem) _ymodem->dataLenTmp = _ymodem->dataLen; _ymodem->txEnFn(1); break; - case YMODEM_STATE_RESTART: - ymodem_init_state(_ymodem); - ymodem_rx_start(_ymodem, _ymodem->checkNum == 1 ? YMODEM_NAK : YMODEM_CRC16); - break; default: ymodem_init_state(_ymodem); break; } } diff --git a/drivers/bootloader/ymodem.h b/drivers/bootloader/ymodem.h index 73c6e29..91ce99b 100644 --- a/drivers/bootloader/ymodem.h +++ b/drivers/bootloader/ymodem.h @@ -89,7 +89,6 @@ extern "C" { #define YMODEM_STATE_WAIT (1u) /*!< 等待接收状态 */ #define YMODEM_STATE_CHECK_HEAD (2u) /*!< 校验数据头状态 */ #define YMODEM_STATE_CHECK_DATA (3u) /*!< 校验数据状态 */ -#define YMODEM_STATE_RESTART (4u) /*!< 重新启动状态 */ /** * @} */ @@ -158,7 +157,7 @@ typedef struct ymodem { uint8_t state : 3; /*!< ymodem状态 @ref ymodem_rx_state */ uint8_t checkNum : 2; /*!< 校验字节数 1:累加和 2:CRC16 */ uint8_t fileFlag : 1; /*!< 文件信息标志 1:此包数据为文件信息 */ - uint8_t eotFlag : 1; /*!< 首次EOT标志 0:首次 1:非首次 */ + uint8_t eotFlag : 2; /*!< 首次EOT标志 0:首次 1:非首次 */ ymodem_tx_en_t txEnFn; /*!< 串口发送准备函数 */ ymodem_user_packet_cb_t getPacketFn; /*!< 获取数据包回调函数 */ -- Gitee From 31e54c7b6acc989d4c026da3efa763b8ec56313f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=98=BF=E8=A1=B00110?= Date: Wed, 17 Jan 2024 22:51:32 +0800 Subject: [PATCH 42/66] =?UTF-8?q?#I8WM1N=20xmodem=E5=92=8Cymodem=E4=B8=B2?= =?UTF-8?q?=E5=8F=A3=E5=8D=8F=E8=AE=AE=E7=BB=84=E4=BB=B6=E5=AE=8C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- drivers/bootloader/xmodem.c | 2 +- drivers/bootloader/ymodem.c | 114 +++++++++--- drivers/bootloader/ymodem.h | 10 +- examples/ymodem/MDK/use_example.uvoptx | 232 +++---------------------- examples/ymodem/README.txt | 2 +- examples/ymodem/SRC/main.c | 62 +++++-- 6 files changed, 164 insertions(+), 258 deletions(-) diff --git a/drivers/bootloader/xmodem.c b/drivers/bootloader/xmodem.c index 7b9d69c..a7ed215 100644 --- a/drivers/bootloader/xmodem.c +++ b/drivers/bootloader/xmodem.c @@ -254,7 +254,7 @@ void xmodem_rx_poll(xmodem_t *_xmodem) break; } case XMODEM_STATE_CHECK_DATA: - /* 包序号和包序号补码满足条件 */ + /* 包序号和包序号反码满足条件 */ if(_xmodem->packetNum == _xmodem->dataBuf[YMODEM_NUMBER_INDEX] && 0xFF == (_xmodem->dataBuf[YMODEM_NUMBER_INDEX] + _xmodem->dataBuf[YMODEM_CNUMBER_INDEX])) { /* 1字节累加和校验 */ diff --git a/drivers/bootloader/ymodem.c b/drivers/bootloader/ymodem.c index e4dfd2e..5206d37 100644 --- a/drivers/bootloader/ymodem.c +++ b/drivers/bootloader/ymodem.c @@ -3,7 +3,7 @@ * @file ymodem.c * @author ashuai0110 * @version V1.0 - * @date 2024-01-13 + * @date 2024-01-17 * @brief ymodem协议 * ****************************************************************************** @@ -14,7 +14,7 @@ * * Change Logs: * Date Author Notes - * 2024-01-13 ashuai0110 完成基本内容 + * 2024-01-17 ashuai0110 完成基本内容 * ****************************************************************************** */ @@ -273,7 +273,7 @@ void ymodem_rx_poll(ymodem_t *_ymodem) else if(YMODEM_EOT == _ymodem->dataBuf[YMODEM_START_INDEX]) { /* 第二次收到EOT则回复ACK */ - if(1 == _ymodem->eotFlag) + if(_ymodem->eotFlag) { _ymodem->eotFlag = 2; _ymodem->dataBuf[YMODEM_START_INDEX] = YMODEM_ACK; /* 回复ACK */ @@ -283,7 +283,7 @@ void ymodem_rx_poll(ymodem_t *_ymodem) _ymodem->eotFlag = 1; _ymodem->dataBuf[YMODEM_START_INDEX] = YMODEM_NAK; /* 回复NAK */ } - _ymodem->state = YMODEM_STATE_WAIT; + _ymodem->state = YMODEM_STATE_WAIT; /* 切换状态 */ /* 发送回复内容 */ _ymodem->dataLen = 1; _ymodem->dataLenTmp = _ymodem->dataLen; @@ -294,10 +294,10 @@ void ymodem_rx_poll(ymodem_t *_ymodem) { ymodem_init_state(_ymodem); break; - } + } /* 其它则回到等待状态 */ else { - _ymodem->state = YMODEM_STATE_WAIT; + _ymodem->state = YMODEM_STATE_WAIT; /* 切换状态 */ break; } case YMODEM_STATE_CHECK_DATA: @@ -394,24 +394,29 @@ void ymodem_tx_poll(ymodem_t *_ymodem) switch(_ymodem->state) { case YMODEM_STATE_IDLE: - /* 首次收到的数据认为是启动发送的命令 */ - if(1 == _ymodem->packetNum) + /* 逐字节查询启动命令 */ + if(_ymodem->readLen < _ymodem->dataLen) { /* 收到NAK则使用累加和校验 */ - if(YMODEM_NAK == _ymodem->dataBuf[0]) + if(YMODEM_NAK == _ymodem->dataBuf[_ymodem->readLen]) { _ymodem->checkNum = 1; - _ymodem->state = YMODEM_STATE_CHECK_DATA; } /* 收到'C'则使用CRC16校验 */ - else if(YMODEM_CRC16 == _ymodem->dataBuf[0]) + else if(YMODEM_CRC16 == _ymodem->dataBuf[_ymodem->readLen]) { _ymodem->checkNum = 2; - _ymodem->state = YMODEM_STATE_CHECK_DATA; } /* 否则认为是无效数据 */ else { - _ymodem->dataLen = 0; + _ymodem->readLen++; + break; } + /* 首次收到启动命令则回复文件信息包 */ + if(0 == _ymodem->packetNum) + { + _ymodem->fileFlag = 1; + } + _ymodem->state = YMODEM_STATE_CHECK_DATA; /* 切换状态 */ } break; case YMODEM_STATE_WAIT: @@ -435,7 +440,26 @@ void ymodem_tx_poll(ymodem_t *_ymodem) /* 收到ACK则继续发下一包 */ if(YMODEM_ACK == _ymodem->dataBuf[0]) { - _ymodem->state = YMODEM_STATE_CHECK_DATA; /* 切换状态 */ + /* 文件标志置位表明此前发出的是文件信息包 收到ACK则返回IDLE状态 */ + if(_ymodem->fileFlag) + { + _ymodem->fileFlag = 0; + _ymodem->dataLen = 0; + _ymodem->state = YMODEM_STATE_IDLE; /* 切换状态 */ + break; + } + else + { /* 传输结束标志置位表明此前发出的是EOT 收到ACK表明传输结束则回到初始状态 */ + if(_ymodem->eotFlag) + { + ymodem_init_state(_ymodem); + break; + } /* 其它是正常数据 切换到数据检验状态 */ + else + { + _ymodem->state = YMODEM_STATE_CHECK_DATA; /* 切换状态 */ + } + } } /* 收到NAK则重发当前包 */ else if(YMODEM_NAK == _ymodem->dataBuf[0]) { @@ -450,10 +474,13 @@ void ymodem_tx_poll(ymodem_t *_ymodem) else { _ymodem->dataLen = 0; - _ymodem->state = YMODEM_STATE_WAIT; + _ymodem->state = YMODEM_STATE_WAIT; /* 切换状态 */ break; } case YMODEM_STATE_CHECK_DATA: + _ymodem->readLen = 0; + _ymodem->rspTimeoutTimes = 0; + _ymodem->state = YMODEM_STATE_WAIT; /* 切换状态 */ /* 用户set回调函数 */ _ymodem->setPacketFn(_ymodem->packetNum, &_ymodem->dataBuf[3], &_ymodem->dataLen); /* 超过128但不超过1024的按1024byte */ @@ -471,10 +498,11 @@ void ymodem_tx_poll(ymodem_t *_ymodem) } /* 其它认为是传输结束 */ else { - ymodem_init_state(_ymodem); + _ymodem->eotFlag = 1; /* 回复EOT传输结束 */ _ymodem->dataBuf[0] = YMODEM_EOT; _ymodem->dataLen = 1; + _ymodem->dataLenTmp = _ymodem->dataLen; _ymodem->txEnFn(1); break; } @@ -490,9 +518,7 @@ void ymodem_tx_poll(ymodem_t *_ymodem) _ymodem->dataBuf[_ymodem->dataLen + 3] = checkVal >> 8; _ymodem->dataBuf[_ymodem->dataLen + 4] = checkVal & 0xFF; } - _ymodem->rspTimeoutTimes = 0; - _ymodem->state = YMODEM_STATE_WAIT; /* 切换状态 */ - /* 设置包序号和其补码 */ + /* 设置包序号和其反码 */ _ymodem->dataBuf[1] = _ymodem->packetNum; _ymodem->dataBuf[2] = 0xFF - _ymodem->packetNum; _ymodem->packetNum++; @@ -597,16 +623,52 @@ uint16_t ymodem_read_tx_buf(ymodem_t *_ymodem, void *pBuf, uint16_t len) return len; } -void ymodem_file_info(file_info_t *_info, uint8_t *data) +/** + * @brief 将文件信息写入包中 + * + * @param _info : 文件信息结构体 + * + * @param data : ymodem数据 + * + * @retval None + */ +void ymodem_set_file_info(ymodem_t *_ymodem, file_info_t *_info) { - uint8_t cnt = 0; - - while((*data != 0) && (cnt < YMODEM_FILE_NAME_LEN)) + uint8_t lenTmp; + /* 清零数据缓冲区 */ + memset((void *)_ymodem->dataBuf, 0, YMODEM_HEADER_SIZE + YMODEM_DATA_SIZE); + /* 文件大小为0则没有文件需要传输 */ + if(0 != _info->fileSize) { - _info->fileName[cnt++] = *data++; + lenTmp = strlen(_info->fileName); /* 获取文件名称长度 */ + /* 写入文件名称 */ + memcpy((void *)&_ymodem->dataBuf[YMODEM_DATA_INDEX], (void *)_info->fileName, lenTmp); + /* 写入文件大小 */ + sprintf((char *)&_ymodem->dataBuf[YMODEM_DATA_INDEX + lenTmp + 1], "%d", _info->fileSize); + _ymodem->dataLen = 128; } - _info->fileName[cnt] = '\0'; - _info->fileSize = atoi((char *)++data); +} + +/** + * @brief 从包中获取文件信息 + * + * @param _info : 文件信息结构体指针 + * + * @param data : ymodem数据 + * + * @retval None + */ +void ymodem_get_file_info(ymodem_t *_ymodem, file_info_t *_info) +{ + uint8_t lenTmp; + /* 获取文件名称长度 不能超出可存放长度 */ + lenTmp = strlen((char *)&_ymodem->dataBuf[YMODEM_DATA_INDEX]); + lenTmp = lenTmp > YMODEM_FILE_NAME_LEN ? YMODEM_FILE_NAME_LEN : lenTmp; + /* 读出文件名称 */ + memcpy((void *)_info->fileName, (void *)&_ymodem->dataBuf[YMODEM_DATA_INDEX], lenTmp); + _info->fileName[lenTmp] = '\0'; + /* 读出文件长度 */ + _info->fileSize = atoi((char *)&_ymodem->dataBuf[YMODEM_DATA_INDEX + lenTmp + 1]); } /** diff --git a/drivers/bootloader/ymodem.h b/drivers/bootloader/ymodem.h index 91ce99b..b48d117 100644 --- a/drivers/bootloader/ymodem.h +++ b/drivers/bootloader/ymodem.h @@ -3,7 +3,7 @@ * @file ymodem.h * @author ashuai0110 * @version V1.0 - * @date 2024-01-08 + * @date 2024-01-17 * @brief ymodem协议 * ****************************************************************************** @@ -164,8 +164,11 @@ typedef struct ymodem { ymodem_user_packet_cb_t setPacketFn; /*!< 设置数据包回调函数 */ } ymodem_t; +/** + * @brief ymodem file info structure definition + */ typedef struct file_info { - char fileName[YMODEM_FILE_NAME_LEN]; /*!< 文件名 */ + char fileName[YMODEM_FILE_NAME_LEN + 1]; /*!< 文件名 */ uint32_t fileSize; /*!< 文件大小 */ } file_info_t; @@ -192,7 +195,8 @@ void ymodem_rx_start(ymodem_t *_ymodem, uint8_t startFlag); uint16_t ymodem_write_rx_buf(ymodem_t *_ymodem, void *pBuf, uint16_t len); uint16_t ymodem_read_tx_buf(ymodem_t *_ymodem, void *pBuf, uint16_t len); -void ymodem_file_info(file_info_t *_info, uint8_t *data); +void ymodem_set_file_info(ymodem_t *_ymodem, file_info_t *_info); +void ymodem_get_file_info(ymodem_t *_ymodem, file_info_t *_info); /** * @} diff --git a/examples/ymodem/MDK/use_example.uvoptx b/examples/ymodem/MDK/use_example.uvoptx index d57c835..40d6662 100644 --- a/examples/ymodem/MDK/use_example.uvoptx +++ b/examples/ymodem/MDK/use_example.uvoptx @@ -152,274 +152,82 @@ 0 0 - 229 + 419 1 -
134224394
+
134225620
0 0 0 0 0 1 - D:\ASProject\mcuProject\mcu_development_template\mcu_reuse_development_module\drivers\bootloader\xmodem.c + ..\..\..\drivers\bootloader\ymodem.c - \\use_example\../../../drivers/bootloader/xmodem.c\229 + \\use_example\../../../drivers/bootloader/ymodem.c\419
1 0 - 234 + 427 1 -
134224434
+
134225648
0 0 0 0 0 1 - D:\ASProject\mcuProject\mcu_development_template\mcu_reuse_development_module\drivers\bootloader\xmodem.c + ..\..\..\drivers\bootloader\ymodem.c - \\use_example\../../../drivers/bootloader/xmodem.c\234 + \\use_example\../../../drivers/bootloader/ymodem.c\427
2 0 - 277 + 441 1 -
134224622
+
134225682
0 0 0 0 0 1 - D:\ASProject\mcuProject\mcu_development_template\mcu_reuse_development_module\drivers\bootloader\xmodem.c + ..\..\..\drivers\bootloader\ymodem.c - \\use_example\../../../drivers/bootloader/xmodem.c\277 + \\use_example\../../../drivers/bootloader/ymodem.c\441
3 0 - 205 + 481 1 -
134224320
+
134225806
0 0 0 0 0 1 - D:\ASProject\mcuProject\mcu_development_template\mcu_reuse_development_module\drivers\bootloader\xmodem.c + ..\..\..\drivers\bootloader\ymodem.c - \\use_example\../../../drivers/bootloader/xmodem.c\205 + \\use_example\../../../drivers/bootloader/ymodem.c\481
4 0 - 205 + 557 1 -
134224712
+
134226256
0 0 0 0 0 1 - D:\ASProject\mcuProject\mcu_development_template\mcu_reuse_development_module\drivers\bootloader\xmodem.c + ..\..\..\drivers\bootloader\ymodem.c - \\use_example\../../../drivers/bootloader/xmodem.c\205 -
- - 5 - 0 - 207 - 1 -
0
- 0 - 0 - 0 - 0 - 0 - 0 - D:\ASProject\mcuProject\mcu_development_template\mcu_reuse_development_module\drivers\bootloader\xmodem.c - - -
- - 6 - 0 - 230 - 1 -
0
- 0 - 0 - 0 - 0 - 0 - 0 - D:\ASProject\mcuProject\mcu_development_template\mcu_reuse_development_module\drivers\bootloader\xmodem.c - - -
- - 7 - 0 - 235 - 1 -
0
- 0 - 0 - 0 - 0 - 0 - 0 - D:\ASProject\mcuProject\mcu_development_template\mcu_reuse_development_module\drivers\bootloader\xmodem.c - - -
- - 8 - 0 - 279 - 1 -
0
- 0 - 0 - 0 - 0 - 0 - 0 - D:\ASProject\mcuProject\mcu_development_template\mcu_reuse_development_module\drivers\bootloader\xmodem.c - - -
- - 9 - 0 - 196 - 1 -
0
- 0 - 0 - 0 - 0 - 0 - 0 - D:\ASProject\mcuProject\mcu_development_template\mcu_reuse_development_module\drivers\bootloader\xmodem.c - - -
- - 10 - 0 - 198 - 1 -
0
- 0 - 0 - 0 - 0 - 0 - 0 - D:\ASProject\mcuProject\mcu_development_template\mcu_reuse_development_module\drivers\bootloader\xmodem.c - - -
- - 11 - 0 - 220 - 1 -
0
- 0 - 0 - 0 - 0 - 0 - 0 - D:\ASProject\mcuProject\mcu_development_template\mcu_reuse_development_module\drivers\bootloader\xmodem.c - - -
- - 12 - 0 - 221 - 1 -
0
- 0 - 0 - 0 - 0 - 0 - 0 - D:\ASProject\mcuProject\mcu_development_template\mcu_reuse_development_module\drivers\bootloader\xmodem.c - - -
- - 13 - 0 - 225 - 1 -
0
- 0 - 0 - 0 - 0 - 0 - 0 - D:\ASProject\mcuProject\mcu_development_template\mcu_reuse_development_module\drivers\bootloader\xmodem.c - - -
- - 14 - 0 - 226 - 1 -
0
- 0 - 0 - 0 - 0 - 0 - 0 - D:\ASProject\mcuProject\mcu_development_template\mcu_reuse_development_module\drivers\bootloader\xmodem.c - - -
- - 15 - 0 - 268 - 1 -
0
- 0 - 0 - 0 - 0 - 0 - 0 - D:\ASProject\mcuProject\mcu_development_template\mcu_reuse_development_module\drivers\bootloader\xmodem.c - - -
- - 16 - 0 - 270 - 1 -
0
- 0 - 0 - 0 - 0 - 0 - 0 - D:\ASProject\mcuProject\mcu_development_template\mcu_reuse_development_module\drivers\bootloader\xmodem.c - - + \\use_example\../../../drivers/bootloader/ymodem.c\557
diff --git a/examples/ymodem/README.txt b/examples/ymodem/README.txt index d4c086e..973d60f 100644 --- a/examples/ymodem/README.txt +++ b/examples/ymodem/README.txt @@ -2,7 +2,7 @@ 用例使用说明 ================================================================================ Date Author MDK MCU -2024-01-08 ashuai0110 5.35 STM32F1 +2024-01-17 ashuai0110 5.35 STM32F1 ================================================================================ 功能描述 diff --git a/examples/ymodem/SRC/main.c b/examples/ymodem/SRC/main.c index df059d8..61cd278 100644 --- a/examples/ymodem/SRC/main.c +++ b/examples/ymodem/SRC/main.c @@ -3,7 +3,7 @@ * @file main.c * @author ashuai0110 * @version V1.0 - * @date 2024-01-08 + * @date 2024-01-17 * @brief 使用举例-ymodem * ****************************************************************************** @@ -23,7 +23,7 @@ #include "ymodem.h" /* 私有宏定义-----------------------------------------------------------------*/ -#define YMODEM_TX_RX_TEST (1u) /* 0:Tx test 1:Rx test */ +#define YMODEM_TX_RX_TEST (0u) /* 0:Tx test 1:Rx test */ /* 私有类型定义---------------------------------------------------------------*/ @@ -33,6 +33,7 @@ static uint8_t usart1DmaRxBuf[200]; /* 串口1dma接收缓存区 */ ymodem_t ymodem; /* ymodem实例 */ static uint8_t ymodemBuf[1029]; /* ymodem数据缓存区 */ +file_info_t fileInfo; /* 全局变量-------------------------------------------------------------------*/ @@ -157,9 +158,7 @@ void ymodem_get_packet_callback(uint8_t packetNum, uint8_t *data, uint16_t *len) /* 文件信息 */ if(YMODEM_FILE_FLAG(ymodem)) { - file_info_t fileInfo; - - ymodem_file_info(&fileInfo, data); + ymodem_get_file_info(&ymodem, &fileInfo); /* 获取文件信息保存至fileInfo结构体 */ PRINT_LOG("ymodem rec file name:%s, size:%d Byte\r\n", fileInfo.fileName, fileInfo.fileSize); } /* 数据 */ else @@ -186,15 +185,48 @@ void ymodem_get_packet_callback(uint8_t packetNum, uint8_t *data, uint16_t *len) */ void ymodem_set_packet_callback(uint8_t packetNum, uint8_t *data, uint16_t *len) { - /* 用户自行计算数据量并在发送完全后给len赋值0 */ - if(packetNum > 100) + static uint8_t fileCnt = 0; /* 文件计数 */ + static uint32_t sendCnt = 0; /* 已发送字节 */ + + /* 文件信息 */ + if(YMODEM_FILE_FLAG(ymodem)) { - *len = 0; - } /* 用户自行选择携带128或1024字节数据并将数据赋值给data */ + /* 只发送一个文件 */ + if(fileCnt < 1) + { + fileCnt++; /* 文件计数自增 */ + strcpy(fileInfo.fileName, "test_ymodem.txt\0"); /* 文件名 */ + fileInfo.fileSize = 2048; /* 文件长度 */ + } /* 文件计数超出要发送的数量则设置文件长度为0 */ + else + { + fileInfo.fileSize = 0; + } + ymodem_set_file_info(&ymodem, &fileInfo); /* 设置文件信息从fileInfo结构体 */ + } /* 数据 */ else { - *len = 1024; - memset((void *)data, packetNum + '0', 1024); + /* 已发送字节小于文件长度时则设置发送内容 */ + if(sendCnt < fileInfo.fileSize) + { + /* 待发送内容超出1024则按照1024长度发送 */ + if((fileInfo.fileSize - sendCnt) >= 1024) + { + *len = 1024; /* 设置发送长度 */ + sendCnt += 1024; /* 计数已发送字节 */ + } /* 否则发送剩余长度 */ + else + { + *len = fileInfo.fileSize - sendCnt; + sendCnt = fileInfo.fileSize; + } + + memset((void *)data, packetNum + '0', *len); + } /* 否则说明发送完毕则设置发送长度为0 */ + else + { + *len = 0; + } } } @@ -211,18 +243,18 @@ int main(int argc, char *argv[]) tim1_init_config(100-1, 720-1); /* ymodem组件初始化 */ - ymodem_init(&ymodem, ymodemBuf, sizeof(ymodemBuf), usart1_tx_en, ymodem_get_packet_callback, ymodem_set_packet_callback, 2000); - /* 启动ymodem接收 */ + ymodem_init(&ymodem, ymodemBuf, sizeof(ymodemBuf), usart1_tx_en, ymodem_get_packet_callback, ymodem_set_packet_callback, 3000); #if YMODEM_TX_RX_TEST + /* 启动ymodem接收 */ ymodem_rx_start(&ymodem, YMODEM_RX_FLAG_CRC); #endif while(1) { #if YMODEM_TX_RX_TEST - ymodem_rx_poll(&ymodem); + ymodem_rx_poll(&ymodem); /* ymodem接收轮询处理 */ #else - ymodem_tx_poll(&ymodem); + ymodem_tx_poll(&ymodem); /* ymodem发送轮询处理 */ #endif } } -- Gitee From 016f8c95092ea983546e8dbd4afa81521c84a316 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=98=BF=E8=A1=B00110?= Date: Thu, 18 Jan 2024 21:56:38 +0800 Subject: [PATCH 43/66] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E9=83=A8=E5=88=86=E4=BE=8B=E7=A8=8B=E7=9A=84=E6=B3=A8=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- drivers/common/all_include.h | 14 +- examples/command_line/README.txt | 2 +- examples/command_line/SRC/main.c | 7 +- examples/input_output/README.txt | 2 +- examples/input_output/SRC/main.c | 11 +- examples/memory/README.txt | 2 +- examples/memory/SRC/main.c | 8 +- examples/message_queue/README.txt | 2 +- examples/message_queue/SRC/main.c | 12 +- examples/modbus_host/README.txt | 2 +- examples/modbus_host/SRC/main.c | 6 +- examples/modbus_slave/README.txt | 2 +- examples/modbus_slave/SRC/main.c | 5 +- .../project_template/MDK/use_example.uvoptx | 126 +++++++++++++++--- .../project_template/MDK/use_example.uvprojx | 44 +++++- examples/project_template/README.txt | 2 +- examples/project_template/SRC/main.c | 17 +-- examples/ring_buffer/README.txt | 2 +- examples/ring_buffer/SRC/main.c | 6 +- examples/sync_method/README.txt | 2 +- examples/sync_method/SRC/main.c | 7 +- examples/uart_handler/README.txt | 2 +- examples/uart_handler/SRC/main.c | 7 +- examples/xmodem/SRC/main.c | 8 +- examples/ymodem/SRC/main.c | 2 +- 25 files changed, 224 insertions(+), 76 deletions(-) diff --git a/drivers/common/all_include.h b/drivers/common/all_include.h index 3032125..4eb9139 100644 --- a/drivers/common/all_include.h +++ b/drivers/common/all_include.h @@ -3,7 +3,7 @@ * @file all_include.h * @author ashuai0110 * @version V2.1 - * @date 2024-01-02 + * @date 2024-01-18 * @brief 所有组件头文件集合 * ****************************************************************************** @@ -25,10 +25,6 @@ extern "C" { /* 包含头文件-----------------------------------------------------------------*/ /* common */ #include "common_include.h" /*!< 公共引用文件(所有组件都需包含此文件) */ -/* modbus */ -#include "modbus_common.h" /*!< modbus通用文件 */ -#include "modbus_host.h" /*!< modbus主机程序(RTU ASCII) */ -#include "modbus_slave.h" /*!< modbus从机程序(RTU ASCII) */ /* modules */ #include "command_line.h" /*!< 命令行交互 */ #include "data_check.h" /*!< 数据校验方法集合 */ @@ -41,6 +37,14 @@ extern "C" { #include "sync_method.h" /*!< 伪线程同步(信号量,互斥锁,事件集) */ #include "timer_software.h" /*!< 软件定时器 */ #include "uart_handler.h" /*!< 串口管理 */ +/* modbus */ +#include "modbus_common.h" /*!< modbus通用文件 */ +#include "modbus_host.h" /*!< modbus主机程序(RTU ASCII) */ +#include "modbus_slave.h" /*!< modbus从机程序(RTU ASCII) */ +/* bootloader */ +#include "bootloader.h" /*!< 程序升级引导 */ +#include "xmodem.h" /*!< xmodem协议 */ +#include "ymodem.h" /*!< ymodem协议 */ /* 宏定义---------------------------------------------------------------------*/ diff --git a/examples/command_line/README.txt b/examples/command_line/README.txt index 2e4d1ec..cddf29a 100644 --- a/examples/command_line/README.txt +++ b/examples/command_line/README.txt @@ -2,7 +2,7 @@ 用例使用说明 ================================================================================ Date Author MDK MCU -2023-09-17 ashuai0110 5.35 STM32F1 +2024-01-18 ashuai0110 5.35 STM32F1 ================================================================================ 功能描述 diff --git a/examples/command_line/SRC/main.c b/examples/command_line/SRC/main.c index a297692..93ce8f6 100644 --- a/examples/command_line/SRC/main.c +++ b/examples/command_line/SRC/main.c @@ -3,7 +3,7 @@ * @file main.c * @author ashuai0110 * @version V1.0 - * @date 2023-09-17 + * @date 2024-01-18 * @brief 使用举例-命令行交互 * ****************************************************************************** @@ -25,7 +25,7 @@ /* 私有类型定义---------------------------------------------------------------*/ /* 私有变量-------------------------------------------------------------------*/ -static cmd_line_t rttCmdLine; /* segger rtt的命令行实例0 */ +static cmd_line_t rttCmdLine; /* segger rtt的命令行实例 */ /* 全局变量-------------------------------------------------------------------*/ @@ -79,6 +79,9 @@ void test_cmd_callback(cmd_line_t *_cmd, int argc, char *argv[]) } } +/** + * @brief main + */ int main(int argc, char *argv[]) { VERSION_LOG("example-command_line", 1, 0, 0); diff --git a/examples/input_output/README.txt b/examples/input_output/README.txt index 07d0023..f99f6a1 100644 --- a/examples/input_output/README.txt +++ b/examples/input_output/README.txt @@ -2,7 +2,7 @@ 用例使用说明 ================================================================================ Date Author MDK MCU -2023-09-19 ashuai0110 5.35 STM32F1 +2024-01-18 ashuai0110 5.35 STM32F1 ================================================================================ 功能描述 diff --git a/examples/input_output/SRC/main.c b/examples/input_output/SRC/main.c index d19fd3a..f408305 100644 --- a/examples/input_output/SRC/main.c +++ b/examples/input_output/SRC/main.c @@ -3,7 +3,7 @@ * @file main.c * @author ashuai0110 * @version V1.0 - * @date 2023-09-19 + * @date 2024-01-18 * @brief 使用举例-IO输入输出操作 * ****************************************************************************** @@ -35,6 +35,7 @@ static io_t testInput; /* 测试输入io实例 */ /* 私有函数原型---------------------------------------------------------------*/ + /** * @brief 定时器中断函数 * @@ -46,7 +47,7 @@ void TIM1_UP_IRQHandler(void) { if(TIM_GetITStatus(TIM1, TIM_IT_Update) != RESET) { - io_poll(); + io_poll(); /* IO操作轮询处理 */ TIM_ClearITPendingBit(TIM1, TIM_FLAG_Update); } @@ -135,11 +136,7 @@ void test_input_callback(uint8_t edge) } /** - * @brief - * - * @param None - * - * @retval None + * @brief main */ int main(int argc, char *argv[]) { diff --git a/examples/memory/README.txt b/examples/memory/README.txt index 9f30782..fcc6320 100644 --- a/examples/memory/README.txt +++ b/examples/memory/README.txt @@ -2,7 +2,7 @@ 用例使用说明 ================================================================================ Date Author MDK MCU -2023-09-20 ashuai0110 5.35 STM32F1 +2024-01-18 ashuai0110 5.35 STM32F1 ================================================================================ 功能描述 diff --git a/examples/memory/SRC/main.c b/examples/memory/SRC/main.c index 789ceb7..ce40592 100644 --- a/examples/memory/SRC/main.c +++ b/examples/memory/SRC/main.c @@ -3,7 +3,7 @@ * @file main.c * @author ashuai0110 * @version V1.0 - * @date 2023-09-20 + * @date 2024-01-18 * @brief 使用举例-内存管理 * ****************************************************************************** @@ -39,11 +39,7 @@ typedef struct { /** - * @brief - * - * @param None - * - * @retval None + * @brief main */ int main(int argc, char *argv[]) { diff --git a/examples/message_queue/README.txt b/examples/message_queue/README.txt index 950d172..706c0a4 100644 --- a/examples/message_queue/README.txt +++ b/examples/message_queue/README.txt @@ -2,7 +2,7 @@ 用例使用说明 ================================================================================ Date Author MDK MCU -2023-09-20 ashuai0110 5.35 STM32F1 +2024-01-18 ashuai0110 5.35 STM32F1 ================================================================================ 功能描述 diff --git a/examples/message_queue/SRC/main.c b/examples/message_queue/SRC/main.c index 13aa2a9..e2e5cbd 100644 --- a/examples/message_queue/SRC/main.c +++ b/examples/message_queue/SRC/main.c @@ -3,7 +3,7 @@ * @file main.c * @author ashuai0110 * @version V1.0 - * @date 2023-09-20 + * @date 2024-01-18 * @brief 使用举例-消息队列 * ****************************************************************************** @@ -33,21 +33,17 @@ static mes_queue_t testMQ; /* 测试消息队列实例 */ /** - * @brief - * - * @param None - * - * @retval None + * @brief main */ int main(int argc, char *argv[]) { + VERSION_LOG("example-message_queue", 1, 0, 0); + uint8_t ret = 0; char testMes[] = "hello world!"; char mesBuf[20]; uint8_t mesLen = 0; uint8_t mesCnt = 0; - - VERSION_LOG("example-message_queue", 1, 0, 0); /* 消息队列初始化 10条消息 */ mes_queue_init(&testMQ, 10); diff --git a/examples/modbus_host/README.txt b/examples/modbus_host/README.txt index 214be2d..9c016c6 100644 --- a/examples/modbus_host/README.txt +++ b/examples/modbus_host/README.txt @@ -2,7 +2,7 @@ 用例使用说明 ================================================================================ Date Author MDK MCU -2024-01-08 ashuai0110 5.35 STM32F1 +2024-01-18 ashuai0110 5.35 STM32F1 ================================================================================ 功能描述 diff --git a/examples/modbus_host/SRC/main.c b/examples/modbus_host/SRC/main.c index 98824a1..16ada27 100644 --- a/examples/modbus_host/SRC/main.c +++ b/examples/modbus_host/SRC/main.c @@ -3,7 +3,7 @@ * @file main.c * @author ashuai0110 * @version V1.0 - * @date 2024-01-08 + * @date 2024-01-18 * @brief 使用举例-MODBUS主机程序 * ****************************************************************************** @@ -49,6 +49,7 @@ uint16_t inputRegister[8]; /* 输入寄存器 共8*1=8个 地址0~7 */ /* 私有函数原型---------------------------------------------------------------*/ + /** * @brief 定时器中断函数 * @@ -125,6 +126,9 @@ void uart_tx_en(uint8_t enState) } } +/** + * @brief main + */ int main(int argc, char *argv[]) { VERSION_LOG("example-modbus_host", 1, 0, 0); diff --git a/examples/modbus_slave/README.txt b/examples/modbus_slave/README.txt index 9b22906..186eba0 100644 --- a/examples/modbus_slave/README.txt +++ b/examples/modbus_slave/README.txt @@ -2,7 +2,7 @@ 用例使用说明 ================================================================================ Date Author MDK MCU -2024-01-02 ashuai0110 5.35 STM32F1 +2024-01-18 ashuai0110 5.35 STM32F1 ================================================================================ 功能描述 diff --git a/examples/modbus_slave/SRC/main.c b/examples/modbus_slave/SRC/main.c index aeed611..027cda1 100644 --- a/examples/modbus_slave/SRC/main.c +++ b/examples/modbus_slave/SRC/main.c @@ -3,7 +3,7 @@ * @file main.c * @author ashuai0110 * @version V1.0 - * @date 2024-01-02 + * @date 2024-01-18 * @brief 使用举例-MODBUS从机程序 * ****************************************************************************** @@ -120,6 +120,9 @@ void uart_tx_en(uint8_t enState) } } +/** + * @brief main + */ int main(int argc, char *argv[]) { VERSION_LOG("example-modbus_slave", 1, 0, 0); diff --git a/examples/project_template/MDK/use_example.uvoptx b/examples/project_template/MDK/use_example.uvoptx index 72d00f9..f8abcc6 100644 --- a/examples/project_template/MDK/use_example.uvoptx +++ b/examples/project_template/MDK/use_example.uvoptx @@ -559,6 +559,54 @@ 0 0 0 + + 4 + 30 + 1 + 0 + 0 + 0 + ..\..\[base_on_stm32f1]\stm32f1_sys\gpio.c + gpio.c + 0 + 0 + + + 4 + 31 + 1 + 0 + 0 + 0 + ..\..\[base_on_stm32f1]\stm32f1_sys\tim.c + tim.c + 0 + 0 + + + 4 + 32 + 1 + 0 + 0 + 0 + ..\..\[base_on_stm32f1]\stm32f1_sys\usart.c + usart.c + 0 + 0 + + + 4 + 33 + 1 + 0 + 0 + 0 + ..\..\[base_on_stm32f1]\stm32f1_sys\usart_dma.c + usart_dma.c + 0 + 0 + @@ -569,7 +617,7 @@ 0 5 - 30 + 34 1 0 0 @@ -589,7 +637,7 @@ 0 6 - 31 + 35 5 0 0 @@ -609,7 +657,7 @@ 0 7 - 32 + 36 1 0 0 @@ -629,7 +677,7 @@ 0 8 - 33 + 37 1 0 0 @@ -641,7 +689,7 @@ 8 - 34 + 38 1 0 0 @@ -653,7 +701,7 @@ 8 - 35 + 39 1 0 0 @@ -673,7 +721,7 @@ 0 9 - 36 + 40 1 0 0 @@ -685,7 +733,7 @@ 9 - 37 + 41 1 0 0 @@ -697,7 +745,7 @@ 9 - 38 + 42 1 0 0 @@ -709,7 +757,7 @@ 9 - 39 + 43 1 0 0 @@ -721,7 +769,7 @@ 9 - 40 + 44 1 0 0 @@ -733,7 +781,7 @@ 9 - 41 + 45 1 0 0 @@ -745,7 +793,7 @@ 9 - 42 + 46 1 0 0 @@ -757,7 +805,7 @@ 9 - 43 + 47 1 0 0 @@ -769,7 +817,7 @@ 9 - 44 + 48 1 0 0 @@ -781,7 +829,7 @@ 9 - 45 + 49 1 0 0 @@ -793,7 +841,7 @@ 9 - 46 + 50 1 0 0 @@ -805,4 +853,48 @@ + + drivers/bootloader + 1 + 0 + 0 + 0 + + 10 + 51 + 1 + 0 + 0 + 0 + ..\..\..\drivers\bootloader\bootloader.c + bootloader.c + 0 + 0 + + + 10 + 52 + 1 + 0 + 0 + 0 + ..\..\..\drivers\bootloader\xmodem.c + xmodem.c + 0 + 0 + + + 10 + 53 + 1 + 0 + 0 + 0 + ..\..\..\drivers\bootloader\ymodem.c + ymodem.c + 0 + 0 + + + diff --git a/examples/project_template/MDK/use_example.uvprojx b/examples/project_template/MDK/use_example.uvprojx index 281d9c3..6ec9a91 100644 --- a/examples/project_template/MDK/use_example.uvprojx +++ b/examples/project_template/MDK/use_example.uvprojx @@ -339,7 +339,7 @@ STM32F10X_MD,USE_STDPERIPH_DRIVER - ..\..\[base_on_stm32f1]\stm32f1_lib\driver\inc;..\..\[base_on_stm32f1]\stm32f1_lib\cmsis;..\..\[base_on_stm32f1]\stm32f1_sys;..\..\..\drivers\common;..\..\..\drivers\modules;..\..\..\drivers\segger_rtt;..\..\..\drivers\modbus + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\inc;..\..\[base_on_stm32f1]\stm32f1_lib\cmsis;..\..\[base_on_stm32f1]\stm32f1_sys;..\..\..\drivers\common;..\..\..\drivers\modules;..\..\..\drivers\segger_rtt;..\..\..\drivers\modbus;..\..\..\drivers\bootloader @@ -542,6 +542,28 @@ system + + + gpio.c + 1 + ..\..\[base_on_stm32f1]\stm32f1_sys\gpio.c + + + tim.c + 1 + ..\..\[base_on_stm32f1]\stm32f1_sys\tim.c + + + usart.c + 1 + ..\..\[base_on_stm32f1]\stm32f1_sys\usart.c + + + usart_dma.c + 1 + ..\..\[base_on_stm32f1]\stm32f1_sys\usart_dma.c + + source @@ -653,6 +675,26 @@
+ + drivers/bootloader + + + bootloader.c + 1 + ..\..\..\drivers\bootloader\bootloader.c + + + xmodem.c + 1 + ..\..\..\drivers\bootloader\xmodem.c + + + ymodem.c + 1 + ..\..\..\drivers\bootloader\ymodem.c + + + diff --git a/examples/project_template/README.txt b/examples/project_template/README.txt index e416d8a..3c0b24d 100644 --- a/examples/project_template/README.txt +++ b/examples/project_template/README.txt @@ -2,7 +2,7 @@ 用例使用说明 ================================================================================ Date Author MDK MCU -2023-09-26 ashuai0110 5.35 STM32F1 +2024-01-18 ashuai0110 5.35 STM32F1 ================================================================================ 功能描述 diff --git a/examples/project_template/SRC/main.c b/examples/project_template/SRC/main.c index 1a7c601..cc3ab89 100644 --- a/examples/project_template/SRC/main.c +++ b/examples/project_template/SRC/main.c @@ -3,8 +3,8 @@ * @file main.c * @author ashuai0110 * @version V1.0 - * @date 2023-10-21 - * @brief 使用举例-xxx + * @date 2024-01-18 + * @brief 使用举例-工程模版 * ****************************************************************************** * @attention @@ -18,6 +18,11 @@ /* 包含头文件-----------------------------------------------------------------*/ #include "stm32f10x.h" +#include "gpio.h" +#include "tim.h" +#include "usart.h" +#include "usart_dma.h" + #include "all_include.h" /* 私有宏定义-----------------------------------------------------------------*/ @@ -32,15 +37,11 @@ /** - * @brief - * - * @param None - * - * @retval None + * @brief main */ int main(int argc, char *argv[]) { - VERSION_LOG("example-xxx", 1, 0, 0); + VERSION_LOG("example-project_template", 1, 0, 0); while(1) { diff --git a/examples/ring_buffer/README.txt b/examples/ring_buffer/README.txt index 42d9fad..fddc5e3 100644 --- a/examples/ring_buffer/README.txt +++ b/examples/ring_buffer/README.txt @@ -2,7 +2,7 @@ 用例使用说明 ================================================================================ Date Author MDK MCU -2023-12-26 ashuai0110 5.35 STM32F1 +2024-01-18 ashuai0110 5.35 STM32F1 ================================================================================ 功能描述 diff --git a/examples/ring_buffer/SRC/main.c b/examples/ring_buffer/SRC/main.c index 7adeedb..a65e0e8 100644 --- a/examples/ring_buffer/SRC/main.c +++ b/examples/ring_buffer/SRC/main.c @@ -3,7 +3,7 @@ * @file main.c * @author ashuai0110 * @version V1.0 - * @date 2023-12-26 + * @date 2024-01-18 * @brief 使用举例-环形缓冲区 * ****************************************************************************** @@ -33,6 +33,7 @@ static uint8_t testBuf[50]; /* 实际缓冲区 */ /* 私有函数原型---------------------------------------------------------------*/ + /** * @brief 串口中断函数 * @@ -58,6 +59,9 @@ void USART1_IRQHandler(void) } } +/** + * @brief main + */ int main(int argc, char *argv[]) { VERSION_LOG("example-ring_buffer", 1, 0, 0); diff --git a/examples/sync_method/README.txt b/examples/sync_method/README.txt index c10e1a3..605c6a8 100644 --- a/examples/sync_method/README.txt +++ b/examples/sync_method/README.txt @@ -2,7 +2,7 @@ 用例使用说明 ================================================================================ Date Author MDK MCU -2023-09-24 ashuai0110 5.35 STM32F1 +2024-01-18 ashuai0110 5.35 STM32F1 ================================================================================ 功能描述 diff --git a/examples/sync_method/SRC/main.c b/examples/sync_method/SRC/main.c index b538af2..e9b0d2b 100644 --- a/examples/sync_method/SRC/main.c +++ b/examples/sync_method/SRC/main.c @@ -3,7 +3,7 @@ * @file main.c * @author ashuai0110 * @version V1.0 - * @date 2023-09-26 + * @date 2024-01-18 * @brief 使用举例-伪线程同步方法(信号量,互斥锁,事件集) * ****************************************************************************** @@ -30,7 +30,7 @@ /* 私有变量-------------------------------------------------------------------*/ static sync_sem_t testSem; /* 测试信号量实例 */ -static uint32_t testInt; +static uint32_t testInt; /* 测试用临界区 */ static sync_mutex_t testMutex; /* 测试互斥锁实例 */ static sync_event_t testEvent; /* 测试事件集实例 */ @@ -114,6 +114,9 @@ void TIM1_UP_IRQHandler(void) } } +/** + * @brief main + */ int main(int argc, char *argv[]) { VERSION_LOG("example-sync_method", 1, 0, 0); diff --git a/examples/uart_handler/README.txt b/examples/uart_handler/README.txt index 60b6c40..bc67741 100644 --- a/examples/uart_handler/README.txt +++ b/examples/uart_handler/README.txt @@ -2,7 +2,7 @@ 用例使用说明 ================================================================================ Date Author MDK MCU -2023-12-29 ashuai0110 5.35 STM32F1 +2024-01-18 ashuai0110 5.35 STM32F1 ================================================================================ 功能描述 diff --git a/examples/uart_handler/SRC/main.c b/examples/uart_handler/SRC/main.c index 06917eb..ef54bde 100644 --- a/examples/uart_handler/SRC/main.c +++ b/examples/uart_handler/SRC/main.c @@ -3,7 +3,7 @@ * @file main.c * @author ashuai0110 * @version V1.0 - * @date 2023-12-29 + * @date 2024-01-18 * @brief 使用举例-串口管理 * ****************************************************************************** @@ -111,6 +111,9 @@ void uart_tx_en(uint8_t enState) } } +/** + * @brief main + */ int main(int argc, char *argv[]) { VERSION_LOG("example-uart_handler", 1, 0, 0); @@ -120,7 +123,7 @@ int main(int argc, char *argv[]) /* 串口初始化 115200 */ usart1_init_config(115200); - /* 串口管理初始化 */ + /* 串口管理初始化 波特率115200bps 接收超时时间2000ms */ uart_hr_init(USART1_UART_HR_CH, txBuf, sizeof(txBuf), rxBuf, sizeof(rxBuf), uart_tx_en, 115200, 2000); while(1) diff --git a/examples/xmodem/SRC/main.c b/examples/xmodem/SRC/main.c index bfe57c9..da496f3 100644 --- a/examples/xmodem/SRC/main.c +++ b/examples/xmodem/SRC/main.c @@ -23,7 +23,7 @@ #include "xmodem.h" /* 私有宏定义-----------------------------------------------------------------*/ -#define XMODEM_TX_RX_TEST (1u) /* 0:Tx test 1:Rx test */ +#define XMODEM_TX_RX_TEST (1u) /* 0:测试发送 1:测试接收 */ /* 私有类型定义---------------------------------------------------------------*/ @@ -201,17 +201,17 @@ int main(int argc, char *argv[]) /* xmodem组件初始化 */ xmodem_init(&xmodem, xmodemBuf, sizeof(xmodemBuf), usart1_tx_en, xmodem_get_packet_callback, xmodem_set_packet_callback, 2000); - /* 启动xmodem接收 */ #if XMODEM_TX_RX_TEST + /* 启动xmodem接收 */ xmodem_rx_start(&xmodem, XMODEM_RX_FLAG_CRC); #endif while(1) { #if XMODEM_TX_RX_TEST - xmodem_rx_poll(&xmodem); + xmodem_rx_poll(&xmodem); /* xmodem接收轮询处理 */ #else - xmodem_tx_poll(&xmodem); + xmodem_tx_poll(&xmodem); /* xmodem发送轮询处理 */ #endif } } diff --git a/examples/ymodem/SRC/main.c b/examples/ymodem/SRC/main.c index 61cd278..38139c7 100644 --- a/examples/ymodem/SRC/main.c +++ b/examples/ymodem/SRC/main.c @@ -23,7 +23,7 @@ #include "ymodem.h" /* 私有宏定义-----------------------------------------------------------------*/ -#define YMODEM_TX_RX_TEST (0u) /* 0:Tx test 1:Rx test */ +#define YMODEM_TX_RX_TEST (0u) /* 0:测试发送 1:测试接收 */ /* 私有类型定义---------------------------------------------------------------*/ -- Gitee From 20fadd37d52c8cb5da80f43cbdfec7bb9fd72ca4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=98=BF=E8=A1=B00110?= Date: Thu, 18 Jan 2024 21:59:44 +0800 Subject: [PATCH 44/66] =?UTF-8?q?#I8X1HW=20=E4=BF=AE=E6=94=B9=E8=AE=A1?= =?UTF-8?q?=E6=95=B0=E5=80=BC=E7=9A=84=E6=B3=A8=E9=87=8A=E4=B8=BA=E6=AF=AB?= =?UTF-8?q?=E7=A7=92,=E9=81=BF=E5=85=8D=E5=BC=95=E8=B5=B7=E6=97=A0?= =?UTF-8?q?=E8=A7=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- drivers/modules/delay_no_block.c | 8 ++++---- drivers/modules/delay_no_block.h | 3 ++- drivers/modules/timer_software.c | 20 ++++++++++---------- drivers/modules/timer_software.h | 6 +++--- examples/delay_no_block/README.txt | 2 +- examples/delay_no_block/SRC/main.c | 14 ++++++++------ examples/timer_software/README.txt | 2 +- examples/timer_software/SRC/main.c | 15 +++++---------- 8 files changed, 34 insertions(+), 36 deletions(-) diff --git a/drivers/modules/delay_no_block.c b/drivers/modules/delay_no_block.c index 84a9c30..9f951c5 100644 --- a/drivers/modules/delay_no_block.c +++ b/drivers/modules/delay_no_block.c @@ -3,7 +3,7 @@ * @file delay_no_block.c * @author ashuai0110 * @version V2.1 - * @date 2024-01-08 + * @date 2024-01-18 * @brief 非阻塞延时 * ****************************************************************************** @@ -86,9 +86,9 @@ static delay_item_t delayTaskArr[DELAY_TASK_SIZE]; /* 延时任务数组 */ * * @note 若创建的任务ID为局部变量则需要初始化值为0 * - * @param _id : 延时任务ID 首次调用为新建,之后为更新参数 + * @param _id : 延时任务ID * - * @param delayTicks : 延时任务计数值 例如延时500ms,轮询周期10ms,则delayTicks=500ms/10ms=50 + * @param delayTicks : 延时时间ms * * @retval uint8_t * @arg RET_OK : 创建成功 @@ -130,7 +130,7 @@ uint8_t delay_init(delay_id_t *_id, uint32_t delayTicks) } /** - * @brief 延时任务取消初始化 + * @brief 取消延时任务 * * @param _id : 延时任务ID * diff --git a/drivers/modules/delay_no_block.h b/drivers/modules/delay_no_block.h index 9d54b92..568443f 100644 --- a/drivers/modules/delay_no_block.h +++ b/drivers/modules/delay_no_block.h @@ -3,7 +3,7 @@ * @file delay_no_block.h * @author ashuai0110 * @version V2.1 - * @date 2024-01-08 + * @date 2024-01-18 * @brief 非阻塞延时 * ****************************************************************************** @@ -86,6 +86,7 @@ typedef struct delay_item{ */ uint8_t delay_init(delay_id_t *_id, uint32_t delayTicks); + void delay_de_init(delay_id_t *_id); uint8_t delay_wait(delay_id_t *_id); diff --git a/drivers/modules/timer_software.c b/drivers/modules/timer_software.c index 3553ce3..83e2a65 100644 --- a/drivers/modules/timer_software.c +++ b/drivers/modules/timer_software.c @@ -3,7 +3,7 @@ * @file timer_software.c * @author ashuai0110 * @version V2.1 - * @date 2024-01-01 + * @date 2024-01-18 * @brief 软件定时器 * ****************************************************************************** @@ -86,7 +86,7 @@ static timer_s_t *pTimerTaskHead = NULL; /*!< 软件定时器工作链表头节 * * @param _ts : 软件定时器任务实例 * - * @param targetTicks : 目标计数值 例如定时任务为500ms,调度器周期10ms,则targetTicks=500ms/10ms=50 + * @param targetTicks : 定时时间ms * * @param callbackFn : 回调函数 * @@ -219,11 +219,11 @@ void timer_s_poll(void) } /** - * @brief 设置软件定时器任务的当前计数值 + * @brief 设置软件定时器任务的当前计数值ms * * @param _ts : 软件定时器任务实例 * - * @param curTicks : 当前计数值 + * @param curTicks : 当前计数值ms * * @retval None */ @@ -235,11 +235,11 @@ void timer_s_set_cur_ticks(timer_s_t *_ts, uint32_t curTicks) } /** - * @brief 获取软件定时器任务的当前计数值 + * @brief 获取软件定时器任务的当前计数值ms * * @param _ts : 软件定时器任务实例 * - * @retval 当前计数值 + * @retval 当前计数值ms */ uint32_t timer_s_get_cur_ticks(timer_s_t *_ts) { @@ -249,11 +249,11 @@ uint32_t timer_s_get_cur_ticks(timer_s_t *_ts) } /** - * @brief 设置软件定时器任务的目标计数值 + * @brief 设置软件定时器任务的目标计数值ms * * @param _ts : 软件定时器任务实例 * - * @param targetTicks : 目标计数值 + * @param targetTicks : 目标计数值ms * * @retval None */ @@ -265,11 +265,11 @@ void timer_s_set_target_ticks(timer_s_t *_ts, uint32_t targetTicks) } /** - * @brief 获取软件定时器任务的目标计数值 + * @brief 获取软件定时器任务的目标计数值ms * * @param _ts : 软件定时器任务实例 * - * @retval 目标计数值 + * @retval 目标计数值ms */ uint32_t timer_s_get_target_ticks(timer_s_t *_ts) { diff --git a/drivers/modules/timer_software.h b/drivers/modules/timer_software.h index 293c3b0..f94c92f 100644 --- a/drivers/modules/timer_software.h +++ b/drivers/modules/timer_software.h @@ -3,7 +3,7 @@ * @file timer_software.h * @author ashuai0110 * @version V2.1 - * @date 2024-01-01 + * @date 2024-01-18 * @brief 软件定时器 * ****************************************************************************** @@ -65,8 +65,8 @@ extern "C" { * @brief 软件定时器任务 structrue definition */ typedef struct timer_s { - uint32_t curTicks; /*!< 当前计数值 */ - uint32_t targetTicks; /*!< 目标计数值 */ + uint32_t curTicks; /*!< 当前计数值ms */ + uint32_t targetTicks; /*!< 目标计数值ms */ uint8_t runFlg; /*!< 运行标志 @ref timer_run_flg */ void(* callbackFn)(void); /*!< 回调函数 */ struct timer_s *pNext; /*!< 下一节点 */ diff --git a/examples/delay_no_block/README.txt b/examples/delay_no_block/README.txt index 2a85733..4ccdedf 100644 --- a/examples/delay_no_block/README.txt +++ b/examples/delay_no_block/README.txt @@ -2,7 +2,7 @@ 用例使用说明 ================================================================================ Date Author MDK MCU -2023-12-28 ashuai0110 5.35 STM32F1 +2024-01-18 ashuai0110 5.35 STM32F1 ================================================================================ 功能描述 diff --git a/examples/delay_no_block/SRC/main.c b/examples/delay_no_block/SRC/main.c index 216bc13..7196c3a 100644 --- a/examples/delay_no_block/SRC/main.c +++ b/examples/delay_no_block/SRC/main.c @@ -3,7 +3,7 @@ * @file main.c * @author ashuai0110 * @version V1.0 - * @date 2023-12-28 + * @date 2024-01-18 * @brief 使用举例-非阻塞延时 * ****************************************************************************** @@ -22,7 +22,6 @@ #include "delay_no_block.h" /* 私有宏定义-----------------------------------------------------------------*/ -#define DELAY_TIM_PERIOD (1u) /* 延时调度周期1ms */ /* 私有类型定义---------------------------------------------------------------*/ @@ -47,12 +46,15 @@ void TIM1_UP_IRQHandler(void) if(TIM_GetITStatus(TIM1, TIM_IT_Update) != RESET) { /* 组件计时节拍接口 */ - module_tick_inc(DELAY_TIM_PERIOD); + module_tick_inc(1); TIM_ClearITPendingBit(TIM1, TIM_FLAG_Update); } } +/** + * @brief main + */ int main(int argc, char *argv[]) { VERSION_LOG("example-delay_no_block", 1, 0, 0); @@ -62,9 +64,9 @@ int main(int argc, char *argv[]) uint8_t ret = 0; /* 延时初始化 500ms */ - ret = delay_init(&singleDelay, 500/DELAY_TIM_PERIOD); + ret = delay_init(&singleDelay, 500); if(RET_OK != ret) { ERROR_LOG("delay_init failure"); } - ret = delay_init(&cycleDelay, 500/DELAY_TIM_PERIOD); + ret = delay_init(&cycleDelay, 500); if(RET_OK != ret) { ERROR_LOG("delay_init failure"); } while(1) @@ -81,7 +83,7 @@ int main(int argc, char *argv[]) { PRINT_LOG("cycle delay\r\n"); /* 延时重新配置 */ - delay_init(&cycleDelay, 500/DELAY_TIM_PERIOD); + delay_init(&cycleDelay, 500); } } } diff --git a/examples/timer_software/README.txt b/examples/timer_software/README.txt index 4009c1f..9fcdbf3 100644 --- a/examples/timer_software/README.txt +++ b/examples/timer_software/README.txt @@ -2,7 +2,7 @@ 用例使用说明 ================================================================================ Date Author MDK MCU -2023-12-29 ashuai0110 5.35 STM32F1 +2024-01-18 ashuai0110 5.35 STM32F1 ================================================================================ 功能描述 diff --git a/examples/timer_software/SRC/main.c b/examples/timer_software/SRC/main.c index 4c7c528..7686e53 100644 --- a/examples/timer_software/SRC/main.c +++ b/examples/timer_software/SRC/main.c @@ -3,7 +3,7 @@ * @file main.c * @author ashuai0110 * @version V1.0 - * @date 2023-12-29 + * @date 2024-01-18 * @brief 使用举例-软件定时器 * ****************************************************************************** @@ -23,7 +23,6 @@ #include "timer_software.h" /* 私有宏定义-----------------------------------------------------------------*/ -#define TIMER_S_PERIOD (1u) /* 软件定时器调度周期(定时器1ms) */ /* 私有类型定义---------------------------------------------------------------*/ @@ -47,7 +46,7 @@ void TIM1_UP_IRQHandler(void) if(TIM_GetITStatus(TIM1, TIM_IT_Update) != RESET) { /* 组件计时节拍接口 */ - module_tick_inc(TIMER_S_PERIOD); + module_tick_inc(1); TIM_ClearITPendingBit(TIM1, TIM_FLAG_Update); } @@ -78,11 +77,7 @@ void print_callback(void) } /** - * @brief - * - * @param None - * - * @retval None + * @brief main */ int main(int argc, char *argv[]) { @@ -96,10 +91,10 @@ int main(int argc, char *argv[]) uint8_t ret = 0; /* 软件定时器初始化 */ /* led闪烁任务 500ms周期 */ - ret = timer_s_init(&ledBlinkTimerS, 500/TIMER_S_PERIOD, led_blink_callback, TIMER_RUN_START); + ret = timer_s_init(&ledBlinkTimerS, 500, led_blink_callback, TIMER_RUN_START); if(RET_OK != ret) { ERROR_LOG("timer_s_init failure"); } /* 打印任务 1000ms周期 */ - ret = timer_s_init(&printTimerS, 1000/TIMER_S_PERIOD, print_callback, TIMER_RUN_START); + ret = timer_s_init(&printTimerS, 1000, print_callback, TIMER_RUN_START); if(RET_OK != ret) { ERROR_LOG("timer_s_init failure"); } while(1) -- Gitee From d45ebdd3d0940d86e75da1e41da7fd7b6554a95d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=98=BF=E8=A1=B00110?= Date: Thu, 18 Jan 2024 22:04:31 +0800 Subject: [PATCH 45/66] =?UTF-8?q?#I8X0KR=20=E5=A2=9E=E5=8A=A0bootloader?= =?UTF-8?q?=E6=BA=90=E7=A0=81=E5=92=8C=E4=BE=8B=E7=A8=8B(=E6=9C=AA?= =?UTF-8?q?=E5=AE=8C=E6=88=90)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- drivers/bootloader/bootloader.c | 6 +- drivers/bootloader/bootloader.h | 6 +- examples/bootloader/MDK/use_example.uvoptx | 149 ++++++++++++++++++-- examples/bootloader/MDK/use_example.uvprojx | 8 +- examples/bootloader/README.txt | 8 +- examples/bootloader/SRC/main.c | 50 +++---- 6 files changed, 180 insertions(+), 47 deletions(-) diff --git a/drivers/bootloader/bootloader.c b/drivers/bootloader/bootloader.c index fe3db97..2fa351e 100644 --- a/drivers/bootloader/bootloader.c +++ b/drivers/bootloader/bootloader.c @@ -3,8 +3,8 @@ * @file bootloader.c * @author ashuai0110 * @version V1.0 - * @date 2023-12-3 - * @brief + * @date 2024-01-18 + * @brief 程序升级引导 * ****************************************************************************** * @attention @@ -14,7 +14,7 @@ * * Change Logs: * Date Author Notes - * 2023-xx-xx ashuai0110 完成基本内容 + * 2024-01-18 ashuai0110 完成基本内容 * ****************************************************************************** */ diff --git a/drivers/bootloader/bootloader.h b/drivers/bootloader/bootloader.h index 188c923..6ed8d4e 100644 --- a/drivers/bootloader/bootloader.h +++ b/drivers/bootloader/bootloader.h @@ -3,8 +3,8 @@ * @file bootloader.h * @author ashuai0110 * @version V1.0 - * @date 2023-12-3 - * @brief + * @date 2024-01-18 + * @brief 程序升级引导 * ****************************************************************************** * @attention @@ -102,7 +102,7 @@ void boot_to_application(void); void boot_to_factory(void); /* weak function */ -void boot_recover_all(); +void boot_recover_all(void); /** * @} diff --git a/examples/bootloader/MDK/use_example.uvoptx b/examples/bootloader/MDK/use_example.uvoptx index 139ac5a..7ea3b02 100644 --- a/examples/bootloader/MDK/use_example.uvoptx +++ b/examples/bootloader/MDK/use_example.uvoptx @@ -152,18 +152,146 @@ 0 0 - 218 + 229 1 -
134224324
+
134224394
0 0 0 0 0 1 - ..\..\..\drivers\bootloader\xmodem.c + D:\ASProject\mcuProject\mcu_development_template\mcu_reuse_development_module\drivers\bootloader\xmodem.c - \\use_example\../../../drivers/bootloader/xmodem.c\218 + \\use_example\../../../drivers/bootloader/xmodem.c\229 +
+ + 1 + 0 + 234 + 1 +
134224434
+ 0 + 0 + 0 + 0 + 0 + 1 + D:\ASProject\mcuProject\mcu_development_template\mcu_reuse_development_module\drivers\bootloader\xmodem.c + + \\use_example\../../../drivers/bootloader/xmodem.c\234 +
+ + 2 + 0 + 277 + 1 +
134224622
+ 0 + 0 + 0 + 0 + 0 + 1 + D:\ASProject\mcuProject\mcu_development_template\mcu_reuse_development_module\drivers\bootloader\xmodem.c + + \\use_example\../../../drivers/bootloader/xmodem.c\277 +
+ + 3 + 0 + 205 + 1 +
134224320
+ 0 + 0 + 0 + 0 + 0 + 1 + D:\ASProject\mcuProject\mcu_development_template\mcu_reuse_development_module\drivers\bootloader\xmodem.c + + \\use_example\../../../drivers/bootloader/xmodem.c\205 +
+ + 4 + 0 + 205 + 1 +
134224712
+ 0 + 0 + 0 + 0 + 0 + 1 + D:\ASProject\mcuProject\mcu_development_template\mcu_reuse_development_module\drivers\bootloader\xmodem.c + + \\use_example\../../../drivers/bootloader/xmodem.c\205 +
+ + 5 + 0 + 207 + 1 +
0
+ 0 + 0 + 0 + 0 + 0 + 0 + D:\ASProject\mcuProject\mcu_development_template\mcu_reuse_development_module\drivers\bootloader\xmodem.c + + +
+ + 6 + 0 + 230 + 1 +
0
+ 0 + 0 + 0 + 0 + 0 + 0 + D:\ASProject\mcuProject\mcu_development_template\mcu_reuse_development_module\drivers\bootloader\xmodem.c + + +
+ + 7 + 0 + 235 + 1 +
0
+ 0 + 0 + 0 + 0 + 0 + 0 + D:\ASProject\mcuProject\mcu_development_template\mcu_reuse_development_module\drivers\bootloader\xmodem.c + + +
+ + 8 + 0 + 279 + 1 +
0
+ 0 + 0 + 0 + 0 + 0 + 0 + D:\ASProject\mcuProject\mcu_development_template\mcu_reuse_development_module\drivers\bootloader\xmodem.c + +
@@ -202,6 +330,11 @@ 1 xmodemBuf
+ + 7 + 1 + crc16 +
0 @@ -696,8 +829,8 @@ 0 0 0 - ..\..\..\drivers\bootloader\xmodem.c - xmodem.c + ..\..\..\drivers\common\common_include.c + common_include.c 0 0 @@ -708,8 +841,8 @@ 0 0 0 - ..\..\..\drivers\common\common_include.c - common_include.c + ..\..\..\drivers\bootloader\ymodem.c + ymodem.c 0 0 diff --git a/examples/bootloader/MDK/use_example.uvprojx b/examples/bootloader/MDK/use_example.uvprojx index bcb76ca..51a65e5 100644 --- a/examples/bootloader/MDK/use_example.uvprojx +++ b/examples/bootloader/MDK/use_example.uvprojx @@ -569,14 +569,14 @@ ..\..\..\drivers\bootloader\bootloader.c - xmodem.c + common_include.c 1 - ..\..\..\drivers\bootloader\xmodem.c + ..\..\..\drivers\common\common_include.c - common_include.c + ymodem.c 1 - ..\..\..\drivers\common\common_include.c + ..\..\..\drivers\bootloader\ymodem.c diff --git a/examples/bootloader/README.txt b/examples/bootloader/README.txt index e416d8a..69f12c2 100644 --- a/examples/bootloader/README.txt +++ b/examples/bootloader/README.txt @@ -2,12 +2,12 @@ 用例使用说明 ================================================================================ Date Author MDK MCU -2023-09-26 ashuai0110 5.35 STM32F1 +2024-01-18 ashuai0110 5.35 STM32F1 ================================================================================ 功能描述 ================================================================================ -本用例展示了xxx组件的使用方法。 +本用例展示了bootloader组件的使用方法。 ================================================================================ 测试环境 @@ -26,8 +26,8 @@ J-Link RTT Viewer 源码文件: --------------------- -xxx.c -xxx.h +bootloader.c +bootloader.h ================================================================================ 使用步骤 diff --git a/examples/bootloader/SRC/main.c b/examples/bootloader/SRC/main.c index 4c08baa..17bb540 100644 --- a/examples/bootloader/SRC/main.c +++ b/examples/bootloader/SRC/main.c @@ -3,7 +3,7 @@ * @file main.c * @author ashuai0110 * @version V1.0 - * @date 2023-12-3 + * @date 2024-01-18 * @brief 使用举例-bootloader * ****************************************************************************** @@ -20,11 +20,10 @@ #include "usart_dma.h" #include "tim.h" +#include "ymodem.h" #include "bootloader.h" -#include "xmodem.h" /* 私有宏定义-----------------------------------------------------------------*/ -#define TEST_TX_RX /* 私有类型定义---------------------------------------------------------------*/ @@ -32,8 +31,8 @@ static uint8_t usart1DmaTxBuf[200]; /* 串口1dma发送缓存区 */ static uint8_t usart1DmaRxBuf[200]; /* 串口1dma接收缓存区 */ -xmodem_t xmodem; /* xmodem实例 */ -static uint8_t xmodemBuf[1029]; /* xmodem数据缓存区(128或1024+3+1或2) */ +ymodem_t ymodem; /* ymodem实例 */ +static uint8_t ymodemBuf[1029]; /* ymodem数据缓存区 */ /* 全局变量-------------------------------------------------------------------*/ @@ -67,7 +66,7 @@ void USART1_IRQHandler(void) USART1->DR; /* 这里写接收处理 */ - xmodem_write_rx_buf(&xmodem, usart1DmaRxBuf, sizeof(usart1DmaRxBuf) - DMA_GetCurrDataCounter(DMA1_Channel5)); + ymodem_write_rx_buf(&ymodem, usart1DmaRxBuf, sizeof(usart1DmaRxBuf) - DMA_GetCurrDataCounter(DMA1_Channel5)); /* dma重配置 */ usart1_dma_rx_reconfig(sizeof(usart1DmaRxBuf)); } @@ -82,7 +81,7 @@ void DMA1_Channel5_IRQHandler(void) if(DMA_GetITStatus(DMA1_IT_TC5) != RESET) { /* 这里写接收处理 */ - xmodem_write_rx_buf(&xmodem, usart1DmaRxBuf, sizeof(usart1DmaRxBuf)); + ymodem_write_rx_buf(&ymodem, usart1DmaRxBuf, sizeof(usart1DmaRxBuf)); /* dma重配置 */ usart1_dma_rx_reconfig(sizeof(usart1DmaRxBuf)); @@ -95,11 +94,14 @@ void DMA1_Channel5_IRQHandler(void) */ void DMA1_Channel4_IRQHandler(void) { + static uint16_t num; + /* DMA传输完成中断 */ if(DMA_GetITStatus(DMA1_IT_TC4) != RESET) { /* 这里写读取发送内容的处理 */ - usart1_tx_en(1); + num = ymodem_read_tx_buf(&ymodem, usart1DmaTxBuf, sizeof(usart1DmaTxBuf)); /* 读出数据 */ + usart1_dma_tx_reconfig(num); /* dma重配置 */ DMA_ClearITPendingBit(DMA1_IT_TC4); } @@ -120,7 +122,7 @@ void usart1_tx_en(uint8_t enState) if(USART_GetFlagStatus(USART1, USART_FLAG_TC) != RESET) { uint16_t num; - num = xmodem_read_tx_buf(&xmodem, usart1DmaTxBuf, sizeof(usart1DmaTxBuf)); /* 读出数据 */ + num = ymodem_read_tx_buf(&ymodem, usart1DmaTxBuf, sizeof(usart1DmaTxBuf)); /* 读出数据 */ if(0 < num) { usart1_dma_tx_reconfig(num); /* dma重配置 */ @@ -138,7 +140,7 @@ void usart1_tx_en(uint8_t enState) } /** - * @brief 获取xmodem数据包回调函数 + * @brief 获取ymodem数据包回调函数 * * @param packetNum : 数据包序号 首次从1开始 超出255回到0 * @@ -148,11 +150,11 @@ void usart1_tx_en(uint8_t enState) * * @retval None */ -void xmodem_get_packet_callback(uint8_t packetNum, uint8_t *data, uint16_t *len) +void ymodem_get_packet_callback(uint8_t packetNum, uint8_t *data, uint16_t *len) { uint16_t lenTmp = *len; - PRINT_LOG("xmodem packet num:%d, len:%d, data: ", packetNum, lenTmp); + PRINT_LOG("ymodem packet num:%d, len:%d, data: ", packetNum, lenTmp); for(uint16_t i = 0; i < lenTmp; i++) { PRINT_LOG("%02X ", data[i]); @@ -161,7 +163,7 @@ void xmodem_get_packet_callback(uint8_t packetNum, uint8_t *data, uint16_t *len) } /** - * @brief 设置xmodem数据包回调函数 + * @brief 设置ymodem数据包回调函数 * * @param packetNum : 数据包序号 首次从1开始 超出255回到0 * @@ -171,16 +173,17 @@ void xmodem_get_packet_callback(uint8_t packetNum, uint8_t *data, uint16_t *len) * * @retval None */ -void xmodem_set_packet_callback(uint8_t packetNum, uint8_t *data, uint16_t *len) +void ymodem_set_packet_callback(uint8_t packetNum, uint8_t *data, uint16_t *len) { + /* 用户自行计算数据量并在发送完全后给len赋值0 */ if(packetNum > 100) { *len = 0; - } + } /* 用户自行选择携带128或1024字节数据并将数据赋值给data */ else { *len = 1024; - memset(data, packetNum, 1024); + memset((void *)data, packetNum + '0', 1024); } } @@ -196,18 +199,15 @@ int main(int argc, char *argv[]) /* 定时器初始化 1ms */ tim1_init_config(100-1, 720-1); - /* xmodem组件初始化 */ - xmodem_init(&xmodem, xmodemBuf, sizeof(xmodemBuf), usart1_tx_en, xmodem_get_packet_callback, xmodem_set_packet_callback, 2000); - /* 启动xmodem接收 */ -// xmodem_rx_start(&xmodem, XMODEM_RX_FLAG_CRC); + /* ymodem组件初始化 */ + ymodem_init(&ymodem, ymodemBuf, sizeof(ymodemBuf), usart1_tx_en, ymodem_get_packet_callback, ymodem_set_packet_callback, 2000); + /* 启动ymodem接收 */ +// ymodem_rx_start(&ymodem, YMODEM_RX_FLAG_CRC); while(1) { -#if 0 - xmodem_rx_poll(&xmodem); -#else - xmodem_tx_poll(&xmodem); -#endif +// ymodem_rx_poll(&ymodem); +// ymodem_tx_poll(&ymodem); } } -- Gitee From 2d399b05618661dbd500fbb749f6b427d9d2b455 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=98=BF=E8=A1=B00110?= Date: Thu, 18 Jan 2024 22:12:42 +0800 Subject: [PATCH 46/66] =?UTF-8?q?#I8XAZ0=20=E4=BF=AE=E6=94=B9=E4=B8=B4?= =?UTF-8?q?=E7=95=8C=E5=8C=BA=E8=B5=84=E6=BA=90=E4=BD=BF=E7=94=A8=E4=B8=B4?= =?UTF-8?q?=E6=97=B6=E5=8F=98=E9=87=8F=E5=8F=96=E5=80=BC=E4=BD=BF=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- drivers/modules/uart_handler.c | 24 ++++++++++++++---------- drivers/modules/uart_handler.h | 10 +++++----- 2 files changed, 19 insertions(+), 15 deletions(-) diff --git a/drivers/modules/uart_handler.c b/drivers/modules/uart_handler.c index 13770cf..673f44b 100644 --- a/drivers/modules/uart_handler.c +++ b/drivers/modules/uart_handler.c @@ -3,7 +3,7 @@ * @file uart_handler.c * @author woshiashuai * @version V2.1 - * @date 2024-01-08 + * @date 2024-01-18 * @brief 串口管理(使用帧间隔分帧或现有的分帧方法) * ****************************************************************************** @@ -117,7 +117,7 @@ void uart_hr_init(uint8_t ch, void *txBuf, uint32_t txLen, void *rxBuf, uint32_t } /** - * @brief 串口管理轮询处理(1ms) + * @brief 串口管理轮询处理 * * @param ch : 串口管理序号(即数组索引) * @@ -128,18 +128,22 @@ void uart_hr_init(uint8_t ch, void *txBuf, uint32_t txLen, void *rxBuf, uint32_t */ uint8_t uart_hr_poll(uint8_t ch) { + uint32_t tickTmp; + ASSERT_PARAM(IS_VALID_CH(ch)); + tickTmp = uartHandlerArr[ch].curFrameIntv; /* 帧间隔判断 */ - if(uartHandlerArr[ch].curFrameIntv && (module_tick_get() - uartHandlerArr[ch].curFrameIntv) > uartHandlerArr[ch].targetFrameIntv) + if(tickTmp && (module_tick_get() - tickTmp) > uartHandlerArr[ch].targetFrameIntv) { /* 置零帧间隔计数 */ uartHandlerArr[ch].curFrameIntv = 0; return RET_OK; } + tickTmp = uartHandlerArr[ch].recTimeoutCnt; /* 接收超时判断 */ - if(uartHandlerArr[ch].recTimeoutCnt && (module_tick_get() - uartHandlerArr[ch].recTimeoutCnt) > uartHandlerArr[ch].recTimeout) + if(tickTmp && (module_tick_get() - tickTmp) > uartHandlerArr[ch].recTimeout) { uartHandlerArr[ch].recTimeoutCnt = 0; /* 置零接收超时 */ @@ -256,7 +260,7 @@ uint32_t uart_hr_write_tx_buf(uint8_t ch, void *pBuf, uint32_t len) } /** - * @brief 设置串口管理帧间隔超时时间 + * @brief 设置串口管理帧间隔超时时间ms * * @param ch : 串口管理序号(即数组索引) * @@ -282,7 +286,7 @@ void uart_hr_set_frame_intv(uint8_t ch, uint32_t baud) } /** - * @brief 获取串口管理帧间隔超时时间 + * @brief 获取串口管理帧间隔超时时间ms * * @param ch : 串口管理序号(即数组索引) * @@ -294,11 +298,11 @@ uint16_t uart_hr_get_frame_intv(uint8_t ch) } /** - * @brief 设置串口管理接收超时时间 + * @brief 设置串口管理接收超时时间ms * * @param ch : 串口管理序号(即数组索引) * - * @param timeout : 接收超时时间 + * @param timeout : 接收超时时间ms * * @retval None */ @@ -308,11 +312,11 @@ void uart_hr_set_rec_timeout(uint8_t ch, uint16_t timeout) } /** - * @brief 获取串口管理接收超时时间 + * @brief 获取串口管理接收超时时间ms * * @param ch : 串口管理序号(即数组索引) * - * @retval 串口管理接收超时时间 + * @retval 串口管理接收超时时间ms */ uint16_t uart_hr_get_rec_timeout(uint8_t ch) { diff --git a/drivers/modules/uart_handler.h b/drivers/modules/uart_handler.h index 0f1bd93..fcb6d76 100644 --- a/drivers/modules/uart_handler.h +++ b/drivers/modules/uart_handler.h @@ -3,7 +3,7 @@ * @file uart_handler.h * @author woshiashuai * @version V2.1 - * @date 2024-01-08 + * @date 2024-01-18 * @brief 串口管理(使用帧间隔分帧或现有的分帧方法) * ****************************************************************************** @@ -69,10 +69,10 @@ typedef void (* uart_tx_en_fn_t)(uint8_t enState); * @brief 串口管理 structure definition */ typedef struct uart_handler { - uint8_t targetFrameIntv; /*!< 目标帧间隔 */ - uint32_t curFrameIntv; /*!< 当前帧间隔 */ - uint32_t recTimeoutCnt; /*!< 接收超时计数 */ - uint32_t recTimeout; /*!< 接收超时时间 */ + uint8_t targetFrameIntv; /*!< 目标帧间隔ms */ + uint32_t curFrameIntv; /*!< 当前帧间隔ms */ + uint32_t recTimeoutCnt; /*!< 接收超时计数ms */ + uint32_t recTimeout; /*!< 接收超时时间ms */ ring_buffer_t txRingBuffer; /*!< 发送环形队列 */ ring_buffer_t rxRingBuffer; /*!< 接收环形队列 */ uart_tx_en_fn_t uartTxEnFn; /*!< 串口发送前准备函数 */ -- Gitee From ec6ab2844c7de67b2b4538e629e7d32047f2f4de Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=98=BF=E8=A1=B00110?= Date: Sun, 21 Jan 2024 23:12:12 +0800 Subject: [PATCH 47/66] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=BA=95=E5=B1=82flash?= =?UTF-8?q?=E6=93=8D=E4=BD=9C=E6=BA=90=E5=A4=B4=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../[base_on_stm32f1]/stm32f1_sys/flash.c | 103 ++++++++++++++++++ .../[base_on_stm32f1]/stm32f1_sys/flash.h | 27 +++++ 2 files changed, 130 insertions(+) create mode 100644 examples/[base_on_stm32f1]/stm32f1_sys/flash.c create mode 100644 examples/[base_on_stm32f1]/stm32f1_sys/flash.h diff --git a/examples/[base_on_stm32f1]/stm32f1_sys/flash.c b/examples/[base_on_stm32f1]/stm32f1_sys/flash.c new file mode 100644 index 0000000..89e684a --- /dev/null +++ b/examples/[base_on_stm32f1]/stm32f1_sys/flash.c @@ -0,0 +1,103 @@ +/* 包含头文件-----------------------------------------------------------------*/ +#include "flash.h" +#include + +/* 私有宏定义-----------------------------------------------------------------*/ +#define FLASH_PAGE_SIZE (1024u) /* FLASH页大小 */ +#define FLASH_PROGRAM_SIZE (4u) /* FLASH单次写入大小 */ + +/* 使能全局中断 */ +#define ENABLE_GIE() do { \ + __asm volatile ("cpsie i"); \ + }while(0) +/* 关闭全局中断 */ +#define DISABLE_GIE() do { \ + __asm volatile ("cpsid i"); \ + }while(0) + +/* 私有类型定义---------------------------------------------------------------*/ + +/* 私有变量-------------------------------------------------------------------*/ + +/* 全局变量-------------------------------------------------------------------*/ + +/* 私有函数原型---------------------------------------------------------------*/ + + +/** + * @brief 擦除flash + * @param startAddr : 起始地址 + * @param pageNum : 擦除页数量 + * @retval 0:擦除成功 1:擦除失败 + */ +uint8_t flash_erase(uint32_t startAddr, uint16_t pageNum) +{ + DISABLE_GIE(); + FLASH_Unlock(); + while(pageNum--) + { + if(FLASH_COMPLETE != FLASH_ErasePage(startAddr)) + { + FLASH_Lock(); + ENABLE_GIE(); + + return 1; + } + startAddr += FLASH_PAGE_SIZE; + } + FLASH_Lock(); + ENABLE_GIE(); + + return 0; +} + +/** + * @brief 读flash + * @param startAddr : 起始地址 + * @param pBuf : 数据存储区 + * @param len : 读取数量byte + * @retval 0:读取成功 + */ +uint8_t flash_read(uint32_t startAddr, void *pBuf, uint16_t len) +{ + DISABLE_GIE(); + memcpy(pBuf, (void *)startAddr, len); + ENABLE_GIE(); + + return 0; +} + +/** + * @brief 写flash + * @param startAddr : 起始地址 + * @param pBuf : 数据缓冲区 + * @param len : 写入数量byte + * @retval 0:写入成功 1:写入失败 + */ +uint8_t flash_write(uint32_t startAddr, void *pBuf, uint16_t len) +{ + uint32_t *dataTmp; + + dataTmp = (uint32_t *)pBuf; /* 类型转换为4字节类型 */ + /* 将写入数量除以单次写入大小计算写入次数并且不满4字节的写入也计入1次写入 */ + len = (len % FLASH_PROGRAM_SIZE == 0) ? (len / FLASH_PROGRAM_SIZE) : (len / FLASH_PROGRAM_SIZE + 1); + + DISABLE_GIE(); + FLASH_Unlock(); + while(len--) + { + if(FLASH_COMPLETE != FLASH_ProgramWord(startAddr, *dataTmp)) + { + FLASH_Lock(); + ENABLE_GIE(); + + return 1; + } + startAddr += 4; + dataTmp++; + } + FLASH_Lock(); + ENABLE_GIE(); + + return 0; +} diff --git a/examples/[base_on_stm32f1]/stm32f1_sys/flash.h b/examples/[base_on_stm32f1]/stm32f1_sys/flash.h new file mode 100644 index 0000000..970ed67 --- /dev/null +++ b/examples/[base_on_stm32f1]/stm32f1_sys/flash.h @@ -0,0 +1,27 @@ +#ifndef __FLASH_AS_H +#define __FLASH_AS_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* 包含头文件-----------------------------------------------------------------*/ +#include "stm32f10x.h" + +/* 宏定义---------------------------------------------------------------------*/ + +/* 类型定义-------------------------------------------------------------------*/ + +/* 全局变量-------------------------------------------------------------------*/ + +/* 函数原型-------------------------------------------------------------------*/ +uint8_t flash_erase(uint32_t startAddr, uint16_t pageNum); +uint8_t flash_read(uint32_t startAddr, void *pBuf, uint16_t len); +uint8_t flash_write(uint32_t startAddr, void *pBuf, uint16_t len); + + +#ifdef __cplusplus +} +#endif + +#endif /* flash.h */ -- Gitee From df412d4a90e87d903fa830e7457d1d5d2c66ef38 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=98=BF=E8=A1=B00110?= Date: Sun, 21 Jan 2024 23:12:39 +0800 Subject: [PATCH 48/66] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=94=B6=E5=8F=91?= =?UTF-8?q?=E8=BD=AE=E8=AF=A2=E5=A4=84=E7=90=86=E8=BF=94=E5=9B=9E=E7=8A=B6?= =?UTF-8?q?=E6=80=81,=E4=BC=98=E5=8C=96=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- drivers/bootloader/xmodem.c | 70 ++++++++++++++++++++++++++++--------- drivers/bootloader/xmodem.h | 7 ++-- drivers/bootloader/ymodem.c | 68 +++++++++++++++++++++++------------ drivers/bootloader/ymodem.h | 6 ++-- 4 files changed, 105 insertions(+), 46 deletions(-) diff --git a/drivers/bootloader/xmodem.c b/drivers/bootloader/xmodem.c index a7ed215..b3f6ca2 100644 --- a/drivers/bootloader/xmodem.c +++ b/drivers/bootloader/xmodem.c @@ -3,7 +3,7 @@ * @file xmodem.c * @author ashuai0110 * @version V1.0 - * @date 2024-01-14 + * @date 2024-01-21 * @brief xmodem协议 * ****************************************************************************** @@ -16,6 +16,7 @@ * Date Author Notes * 2024-01-07 ashuai0110 完成基本内容 * 2024-01-14 ashuai0110 修改接收使用校验和的逻辑错误,增加一些协议信息的宏定义 + * 2024-01-21 ashuai0110 增加收发轮询处理返回状态,优化逻辑 * ****************************************************************************** */ @@ -133,6 +134,7 @@ static uint8_t xmodem_check_sum(uint8_t *data, uint16_t len) */ inline static void xmodem_init_state(xmodem_t *_xmodem) { + _xmodem->eotFlag = 0; _xmodem->rspTimeoutCnt = 0; _xmodem->rspTimeoutTimes = 0; _xmodem->packetNum = 1; @@ -191,12 +193,17 @@ void xmodem_init(xmodem_t *_xmodem, void *dataBuf, uint16_t bufLen, xmodem_tx_en * * @note SecureCRT实测开启串口DMA接收1024byte数据包稳定8KB/sec * - * @param _xmodem : xmodem管理实例 + * @param _xmodem : xmodem管理实例 * - * @retval None + * @retval 接收轮询状态 + * @arg RET_OK : 传输完成 + * @arg RET_ERR : 传输错误 + * @arg RET_ING : 进行中(默认处于此状态) + * @arg RET_TIMEOUT : 回复超时 */ -void xmodem_rx_poll(xmodem_t *_xmodem) +uint8_t xmodem_rx_poll(xmodem_t *_xmodem) { + uint8_t ret = RET_ING; uint32_t tickTmp; ASSERT_PARAM(IS_VALID_POINT(_xmodem)); @@ -214,6 +221,7 @@ void xmodem_rx_poll(xmodem_t *_xmodem) if(_xmodem->rspTimeoutTimes++ >= XMODEM_RSP_TIMES) { xmodem_init_state(_xmodem); + ret = RET_TIMEOUT; /* 回复超时 */ break; } /* 重发当前包 */ @@ -241,11 +249,13 @@ void xmodem_rx_poll(xmodem_t *_xmodem) _xmodem->dataBuf[YMODEM_START_INDEX] = XMODEM_ACK; _xmodem->dataLen = 1; _xmodem->txEnFn(1); + ret = RET_OK; /* 传输完成 */ break; } /* CAN为包头 表示传输取消 */ else if(XMODEM_CAN == _xmodem->dataBuf[YMODEM_START_INDEX]) { xmodem_init_state(_xmodem); + ret = RET_ERR; /* 传输错误 */ break; } else @@ -297,8 +307,13 @@ void xmodem_rx_poll(xmodem_t *_xmodem) _xmodem->dataLenTmp = _xmodem->dataLen; _xmodem->txEnFn(1); break; - default: xmodem_init_state(_xmodem); break; + default: + xmodem_init_state(_xmodem); + ret = RET_ERR; /* 传输错误 */ + break; } + + return ret; } /** @@ -332,12 +347,17 @@ void xmodem_rx_start(xmodem_t *_xmodem, uint8_t startFlag) /** * @brief xmodem发送轮询处理 * - * @param _xmodem : xmodem管理实例 + * @param _xmodem : xmodem管理实例 * - * @retval None + * @retval 发送轮询状态 + * @arg RET_OK : 传输完成 + * @arg RET_ERR : 传输错误 + * @arg RET_ING : 进行中(默认处于此状态) + * @arg RET_TIMEOUT : 回复超时 */ -void xmodem_tx_poll(xmodem_t *_xmodem) +uint8_t xmodem_tx_poll(xmodem_t *_xmodem) { + uint8_t ret = RET_ING; uint16_t checkVal; uint32_t tickTmp; @@ -346,24 +366,24 @@ void xmodem_tx_poll(xmodem_t *_xmodem) switch(_xmodem->state) { case XMODEM_STATE_IDLE: - /* 首次收到的数据认为是启动发送的命令 */ - if(1 == _xmodem->packetNum) + /* 逐字节查询启动命令 */ + if(_xmodem->readLen < _xmodem->dataLen) { /* 收到NAK则使用累加和校验 */ - if(XMODEM_NAK == _xmodem->dataBuf[YMODEM_START_INDEX]) + if(XMODEM_NAK == _xmodem->dataBuf[_xmodem->readLen]) { _xmodem->checkNum = 1; - _xmodem->state = XMODEM_STATE_CHECK_DATA; } /* 收到'C'则使用CRC16校验 */ - else if(XMODEM_CRC16 == _xmodem->dataBuf[YMODEM_START_INDEX]) + else if(XMODEM_CRC16 == _xmodem->dataBuf[_xmodem->readLen]) { _xmodem->checkNum = 2; - _xmodem->state = XMODEM_STATE_CHECK_DATA; } /* 否则认为是无效数据 */ else { - _xmodem->dataLen = 0; + _xmodem->readLen++; + break; } + _xmodem->state = XMODEM_STATE_CHECK_DATA; /* 切换状态 */ } break; case XMODEM_STATE_WAIT: @@ -376,6 +396,7 @@ void xmodem_tx_poll(xmodem_t *_xmodem) if(_xmodem->rspTimeoutTimes++ >= XMODEM_RSP_TIMES) { xmodem_init_state(_xmodem); + ret = RET_TIMEOUT; /* 回复超时 */ break; } /* 重发当前包 */ @@ -387,6 +408,13 @@ void xmodem_tx_poll(xmodem_t *_xmodem) /* 收到ACK则继续发下一包 */ if(XMODEM_ACK == _xmodem->dataBuf[YMODEM_START_INDEX]) { + /* 发送EOT后收到ACK则认为是传输结束 */ + if(_xmodem->eotFlag) + { + xmodem_init_state(_xmodem); + ret = RET_OK; /* 传输完成 */ + break; + } _xmodem->state = XMODEM_STATE_CHECK_DATA; /* 切换状态 */ } /* 收到NAK则重发当前包 */ else if(XMODEM_NAK == _xmodem->dataBuf[YMODEM_START_INDEX]) @@ -397,6 +425,7 @@ void xmodem_tx_poll(xmodem_t *_xmodem) else if(XMODEM_CAN == _xmodem->dataBuf[YMODEM_START_INDEX]) { xmodem_init_state(_xmodem); + ret = RET_ERR; /* 传输错误 */ break; } /* 否则认为是无效数据 */ else @@ -423,10 +452,11 @@ void xmodem_tx_poll(xmodem_t *_xmodem) } /* 其它认为是传输结束 */ else { - xmodem_init_state(_xmodem); + _xmodem->eotFlag = 1; /* 回复EOT传输结束 */ _xmodem->dataBuf[YMODEM_START_INDEX] = XMODEM_EOT; _xmodem->dataLen = 1; + _xmodem->dataLenTmp = _xmodem->dataLen; _xmodem->txEnFn(1); break; } @@ -444,7 +474,7 @@ void xmodem_tx_poll(xmodem_t *_xmodem) } _xmodem->rspTimeoutTimes = 0; _xmodem->state = XMODEM_STATE_WAIT; /* 切换状态 */ - /* 设置包序号和其补码 */ + /* 设置包序号和其反码 */ _xmodem->dataBuf[YMODEM_NUMBER_INDEX] = _xmodem->packetNum; _xmodem->dataBuf[YMODEM_CNUMBER_INDEX] = 0xFF - _xmodem->packetNum; _xmodem->packetNum++; @@ -453,7 +483,13 @@ void xmodem_tx_poll(xmodem_t *_xmodem) _xmodem->dataLenTmp = _xmodem->dataLen; _xmodem->txEnFn(1); break; + default: + xmodem_init_state(_xmodem); + ret = RET_ERR; /* 传输错误 */ + break; } + + return ret; } /** diff --git a/drivers/bootloader/xmodem.h b/drivers/bootloader/xmodem.h index 24d9b61..e04fd07 100644 --- a/drivers/bootloader/xmodem.h +++ b/drivers/bootloader/xmodem.h @@ -3,7 +3,7 @@ * @file xmodem.h * @author ashuai0110 * @version V1.0 - * @date 2024-01-14 + * @date 2024-01-21 * @brief xmodem协议 * ****************************************************************************** @@ -153,6 +153,7 @@ typedef struct xmodem { uint8_t state : 3; /*!< xmodem状态 @ref xmodem_rx_state */ uint8_t checkNum : 2; /*!< 校验字节数 1:累加和 2:CRC16 */ + uint8_t eotFlag : 1; xmodem_tx_en_t txEnFn; /*!< 串口发送准备函数 */ xmodem_user_packet_cb_t getPacketFn; /*!< 获取数据包回调函数 */ @@ -174,8 +175,8 @@ typedef struct xmodem { void xmodem_init(xmodem_t *_xmodem, void *dataBuf, uint16_t bufLen, xmodem_tx_en_t txEnFn, \ xmodem_user_packet_cb_t getPacketFn, xmodem_user_packet_cb_t setPacketFn, uint16_t rspTimeout); -void xmodem_rx_poll(xmodem_t *_xmodem); -void xmodem_tx_poll(xmodem_t *_xmodem); +uint8_t xmodem_rx_poll(xmodem_t *_xmodem); +uint8_t xmodem_tx_poll(xmodem_t *_xmodem); void xmodem_rx_start(xmodem_t *_xmodem, uint8_t startFlag); diff --git a/drivers/bootloader/ymodem.c b/drivers/bootloader/ymodem.c index 5206d37..29c4bbe 100644 --- a/drivers/bootloader/ymodem.c +++ b/drivers/bootloader/ymodem.c @@ -3,7 +3,7 @@ * @file ymodem.c * @author ashuai0110 * @version V1.0 - * @date 2024-01-17 + * @date 2024-01-21 * @brief ymodem协议 * ****************************************************************************** @@ -15,6 +15,7 @@ * Change Logs: * Date Author Notes * 2024-01-17 ashuai0110 完成基本内容 + * 2024-01-21 ashuai0110 增加收发轮询处理返回状态 * ****************************************************************************** */ @@ -192,14 +193,17 @@ void ymodem_init(ymodem_t *_ymodem, void *dataBuf, uint16_t bufLen, ymodem_tx_en /** * @brief ymodem接收轮询处理 * - * @note SecureCRT实测开启串口DMA接收1024byte数据包稳定8KB/sec - * - * @param _ymodem : ymodem管理实例 + * @param _ymodem : ymodem管理实例 * - * @retval None + * @retval 接收轮询状态 + * @arg RET_OK : 传输完成 + * @arg RET_ERR : 传输错误 + * @arg RET_ING : 进行中(默认处于此状态) + * @arg RET_TIMEOUT : 回复超时 */ -void ymodem_rx_poll(ymodem_t *_ymodem) +uint8_t ymodem_rx_poll(ymodem_t *_ymodem) { + uint8_t ret = RET_ING; uint32_t tickTmp; ASSERT_PARAM(IS_VALID_POINT(_ymodem)); @@ -217,7 +221,8 @@ void ymodem_rx_poll(ymodem_t *_ymodem) if(_ymodem->rspTimeoutTimes++ >= YMODEM_RSP_TIMES) { ymodem_init_state(_ymodem); - break; + ret = RET_TIMEOUT; /* 回复超时 */ + break; } /* 第二次收到EOT应答超时后重新启动接收 */ if(2 == _ymodem->eotFlag) @@ -258,7 +263,8 @@ void ymodem_rx_poll(ymodem_t *_ymodem) _ymodem->dataLen = 1; _ymodem->dataLenTmp = _ymodem->dataLen; _ymodem->txEnFn(1); - break; + ret = RET_OK; /* 传输完成 */ + break; } } /* 数据包 */ @@ -293,6 +299,7 @@ void ymodem_rx_poll(ymodem_t *_ymodem) else if(YMODEM_CAN == _ymodem->dataBuf[YMODEM_START_INDEX]) { ymodem_init_state(_ymodem); + ret = RET_ERR; /* 传输错误 */ break; } /* 其它则回到等待状态 */ else @@ -344,8 +351,13 @@ void ymodem_rx_poll(ymodem_t *_ymodem) _ymodem->dataLenTmp = _ymodem->dataLen; _ymodem->txEnFn(1); break; - default: ymodem_init_state(_ymodem); break; + default: + ymodem_init_state(_ymodem); + ret = RET_ERR; /* 传输错误 */ + break; } + + return ret; } /** @@ -382,10 +394,15 @@ void ymodem_rx_start(ymodem_t *_ymodem, uint8_t startFlag) * * @param _ymodem : ymodem管理实例 * - * @retval None + * @retval 发送轮询状态 + * @arg RET_OK : 传输完成 + * @arg RET_ERR : 传输错误 + * @arg RET_ING : 进行中(默认处于此状态) + * @arg RET_TIMEOUT : 回复超时 */ -void ymodem_tx_poll(ymodem_t *_ymodem) +uint8_t ymodem_tx_poll(ymodem_t *_ymodem) { + uint8_t ret = RET_ING; uint16_t checkVal; uint32_t tickTmp; @@ -429,6 +446,7 @@ void ymodem_tx_poll(ymodem_t *_ymodem) if(_ymodem->rspTimeoutTimes++ >= YMODEM_RSP_TIMES) { ymodem_init_state(_ymodem); + ret = RET_TIMEOUT; /* 回复超时 */ break; } /* 重发当前包 */ @@ -448,18 +466,15 @@ void ymodem_tx_poll(ymodem_t *_ymodem) _ymodem->state = YMODEM_STATE_IDLE; /* 切换状态 */ break; } - else - { /* 传输结束标志置位表明此前发出的是EOT 收到ACK表明传输结束则回到初始状态 */ - if(_ymodem->eotFlag) - { - ymodem_init_state(_ymodem); - break; - } /* 其它是正常数据 切换到数据检验状态 */ - else - { - _ymodem->state = YMODEM_STATE_CHECK_DATA; /* 切换状态 */ - } - } + /* 传输结束标志置位表明此前发出的是EOT 收到ACK表明传输结束则回到初始状态 */ + if(_ymodem->eotFlag) + { + ymodem_init_state(_ymodem); + ret = RET_OK; /* 传输完成 */ + break; + } + /* 其它是正常数据 切换到数据检验状态 */ + _ymodem->state = YMODEM_STATE_CHECK_DATA; /* 切换状态 */ } /* 收到NAK则重发当前包 */ else if(YMODEM_NAK == _ymodem->dataBuf[0]) { @@ -469,6 +484,7 @@ void ymodem_tx_poll(ymodem_t *_ymodem) else if(YMODEM_CAN == _ymodem->dataBuf[0]) { ymodem_init_state(_ymodem); + ret = RET_ERR; /* 传输错误 */ break; } /* 否则认为是无效数据 */ else @@ -527,7 +543,13 @@ void ymodem_tx_poll(ymodem_t *_ymodem) _ymodem->dataLenTmp = _ymodem->dataLen; _ymodem->txEnFn(1); break; + default: + ymodem_init_state(_ymodem); + ret = RET_ERR; /* 传输错误 */ + break; } + + return ret; } /** diff --git a/drivers/bootloader/ymodem.h b/drivers/bootloader/ymodem.h index b48d117..3aa214b 100644 --- a/drivers/bootloader/ymodem.h +++ b/drivers/bootloader/ymodem.h @@ -3,7 +3,7 @@ * @file ymodem.h * @author ashuai0110 * @version V1.0 - * @date 2024-01-17 + * @date 2024-01-21 * @brief ymodem协议 * ****************************************************************************** @@ -187,8 +187,8 @@ typedef struct file_info { void ymodem_init(ymodem_t *_ymodem, void *dataBuf, uint16_t bufLen, ymodem_tx_en_t txEnFn, \ ymodem_user_packet_cb_t getPacketFn, ymodem_user_packet_cb_t setPacketFn, uint16_t rspTimeout); -void ymodem_rx_poll(ymodem_t *_ymodem); -void ymodem_tx_poll(ymodem_t *_ymodem); +uint8_t ymodem_rx_poll(ymodem_t *_ymodem); +uint8_t ymodem_tx_poll(ymodem_t *_ymodem); void ymodem_rx_start(ymodem_t *_ymodem, uint8_t startFlag); -- Gitee From a897086b30b2dd61df11180435fd8a8b681660ff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=98=BF=E8=A1=B00110?= Date: Sun, 21 Jan 2024 23:15:20 +0800 Subject: [PATCH 49/66] =?UTF-8?q?=E9=9D=9E=E7=A8=8B=E5=BA=8F=E5=86=85?= =?UTF-8?q?=E5=AE=B9=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- drivers/modules/memory.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/modules/memory.c b/drivers/modules/memory.c index 1b8d70a..ab8f2f2 100644 --- a/drivers/modules/memory.c +++ b/drivers/modules/memory.c @@ -386,7 +386,7 @@ void *mem_copy(void *dest, const void *src, uint32_t n) { /* 此时从前往后拷贝即可 */ while(n--) { *d++ = *s++; } - } /* 否则说明目标地址在源地址以及后续数据内(和源地址以及后续数据在相同内存地址) */ + } /* 否则说明目标地址在源地址以及后续数据内(和源地址以及后续数据的内存重叠) */ else { /* 此时从后往前拷贝 避免从前往后拷贝时后续数据被修改 */ -- Gitee From 7fc1872c60aa374bc66d50927f321009654bad5f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=98=BF=E8=A1=B00110?= Date: Sun, 21 Jan 2024 23:16:15 +0800 Subject: [PATCH 50/66] =?UTF-8?q?=E5=9B=A0=E6=BA=90=E7=A0=81=E6=9B=B4?= =?UTF-8?q?=E6=96=B0=E5=AF=BC=E8=87=B4=E7=9A=84=E4=BE=8B=E7=A8=8B=E6=9B=B4?= =?UTF-8?q?=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- examples/xmodem/README.txt | 2 +- examples/xmodem/SRC/main.c | 33 +++++++++-- examples/ymodem/MDK/use_example.uvoptx | 80 ++++++++++++++++++++++++++ examples/ymodem/README.txt | 2 +- examples/ymodem/SRC/main.c | 49 ++++++++++++---- 5 files changed, 148 insertions(+), 18 deletions(-) diff --git a/examples/xmodem/README.txt b/examples/xmodem/README.txt index 3795f34..a29bbda 100644 --- a/examples/xmodem/README.txt +++ b/examples/xmodem/README.txt @@ -2,7 +2,7 @@ 用例使用说明 ================================================================================ Date Author MDK MCU -2024-01-08 ashuai0110 5.35 STM32F1 +2024-01-21 ashuai0110 5.35 STM32F1 ================================================================================ 功能描述 diff --git a/examples/xmodem/SRC/main.c b/examples/xmodem/SRC/main.c index da496f3..3673a10 100644 --- a/examples/xmodem/SRC/main.c +++ b/examples/xmodem/SRC/main.c @@ -3,7 +3,7 @@ * @file main.c * @author ashuai0110 * @version V1.0 - * @date 2024-01-08 + * @date 2024-01-21 * @brief 使用举例-xmodem * ****************************************************************************** @@ -200,7 +200,7 @@ int main(int argc, char *argv[]) tim1_init_config(100-1, 720-1); /* xmodem组件初始化 */ - xmodem_init(&xmodem, xmodemBuf, sizeof(xmodemBuf), usart1_tx_en, xmodem_get_packet_callback, xmodem_set_packet_callback, 2000); + xmodem_init(&xmodem, xmodemBuf, sizeof(xmodemBuf), usart1_tx_en, xmodem_get_packet_callback, xmodem_set_packet_callback, 1000); #if XMODEM_TX_RX_TEST /* 启动xmodem接收 */ xmodem_rx_start(&xmodem, XMODEM_RX_FLAG_CRC); @@ -208,10 +208,35 @@ int main(int argc, char *argv[]) while(1) { + static uint8_t ret; #if XMODEM_TX_RX_TEST - xmodem_rx_poll(&xmodem); /* xmodem接收轮询处理 */ + ret = xmodem_rx_poll(&xmodem); /* xmodem接收轮询处理 */ + if(RET_OK == ret) + { + DEBUG_LOG("xmodem rx success"); + } + else if(RET_ERR == ret) + { + DEBUG_LOG("xmodem rx failed"); + } + else if(RET_TIMEOUT == ret) + { + DEBUG_LOG("xmodem rx timeout"); + } #else - xmodem_tx_poll(&xmodem); /* xmodem发送轮询处理 */ + ret = xmodem_tx_poll(&xmodem); /* xmodem发送轮询处理 */ + if(RET_OK == ret) + { + DEBUG_LOG("xmodem tx success"); + } + else if(RET_ERR == ret) + { + DEBUG_LOG("xmodem tx failed"); + } + else if(RET_TIMEOUT == ret) + { + DEBUG_LOG("xmodem tx timeout"); + } #endif } } diff --git a/examples/ymodem/MDK/use_example.uvoptx b/examples/ymodem/MDK/use_example.uvoptx index 40d6662..6860077 100644 --- a/examples/ymodem/MDK/use_example.uvoptx +++ b/examples/ymodem/MDK/use_example.uvoptx @@ -229,6 +229,86 @@ \\use_example\../../../drivers/bootloader/ymodem.c\557 + + 5 + 0 + 417 + 1 +
0
+ 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\drivers\bootloader\ymodem.c + + +
+ + 6 + 0 + 425 + 1 +
0
+ 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\drivers\bootloader\ymodem.c + + +
+ + 7 + 0 + 439 + 1 +
0
+ 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\drivers\bootloader\ymodem.c + + +
+ + 8 + 0 + 479 + 1 +
0
+ 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\drivers\bootloader\ymodem.c + + +
+ + 9 + 0 + 555 + 1 +
0
+ 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\drivers\bootloader\ymodem.c + + +
diff --git a/examples/ymodem/README.txt b/examples/ymodem/README.txt index 973d60f..261a1e0 100644 --- a/examples/ymodem/README.txt +++ b/examples/ymodem/README.txt @@ -2,7 +2,7 @@ 用例使用说明 ================================================================================ Date Author MDK MCU -2024-01-17 ashuai0110 5.35 STM32F1 +2024-01-21 ashuai0110 5.35 STM32F1 ================================================================================ 功能描述 diff --git a/examples/ymodem/SRC/main.c b/examples/ymodem/SRC/main.c index 38139c7..f04cdc6 100644 --- a/examples/ymodem/SRC/main.c +++ b/examples/ymodem/SRC/main.c @@ -3,7 +3,7 @@ * @file main.c * @author ashuai0110 * @version V1.0 - * @date 2024-01-17 + * @date 2024-01-21 * @brief 使用举例-ymodem * ****************************************************************************** @@ -23,7 +23,7 @@ #include "ymodem.h" /* 私有宏定义-----------------------------------------------------------------*/ -#define YMODEM_TX_RX_TEST (0u) /* 0:测试发送 1:测试接收 */ +#define YMODEM_TX_RX_TEST (1u) /* 0:测试发送 1:测试接收 */ /* 私有类型定义---------------------------------------------------------------*/ @@ -33,7 +33,7 @@ static uint8_t usart1DmaRxBuf[200]; /* 串口1dma接收缓存区 */ ymodem_t ymodem; /* ymodem实例 */ static uint8_t ymodemBuf[1029]; /* ymodem数据缓存区 */ -file_info_t fileInfo; +file_info_t fileInfo; /* 文件信息结构体 */ /* 全局变量-------------------------------------------------------------------*/ @@ -163,12 +163,12 @@ void ymodem_get_packet_callback(uint8_t packetNum, uint8_t *data, uint16_t *len) } /* 数据 */ else { - PRINT_LOG("ymodem packet num:%d, len:%d, data: ", packetNum, lenTmp); - while(lenTmp--) - { - PRINT_LOG("%02X ", *data++); - } - PRINT_LOG("\r\n"); +// PRINT_LOG("ymodem packet num:%d, len:%d, data: ", packetNum, lenTmp); +// while(lenTmp--) +// { +// PRINT_LOG("%02X ", *data++); +// } +// PRINT_LOG("\r\n"); } } @@ -243,7 +243,7 @@ int main(int argc, char *argv[]) tim1_init_config(100-1, 720-1); /* ymodem组件初始化 */ - ymodem_init(&ymodem, ymodemBuf, sizeof(ymodemBuf), usart1_tx_en, ymodem_get_packet_callback, ymodem_set_packet_callback, 3000); + ymodem_init(&ymodem, ymodemBuf, sizeof(ymodemBuf), usart1_tx_en, ymodem_get_packet_callback, ymodem_set_packet_callback, 1000); #if YMODEM_TX_RX_TEST /* 启动ymodem接收 */ ymodem_rx_start(&ymodem, YMODEM_RX_FLAG_CRC); @@ -251,10 +251,35 @@ int main(int argc, char *argv[]) while(1) { + static uint8_t ret; #if YMODEM_TX_RX_TEST - ymodem_rx_poll(&ymodem); /* ymodem接收轮询处理 */ + ret = ymodem_rx_poll(&ymodem); /* ymodem接收轮询处理 */ + if(RET_OK == ret) + { + DEBUG_LOG("ymodem rx success"); + } + else if(RET_ERR == ret) + { + DEBUG_LOG("ymodem rx failed"); + } + else if(RET_TIMEOUT == ret) + { + DEBUG_LOG("ymodem rx timeout"); + } #else - ymodem_tx_poll(&ymodem); /* ymodem发送轮询处理 */ + ret = ymodem_tx_poll(&ymodem); /* ymodem发送轮询处理 */ + if(RET_OK == ret) + { + DEBUG_LOG("ymodem tx success"); + } + else if(RET_ERR == ret) + { + DEBUG_LOG("ymodem tx failed"); + } + else if(RET_TIMEOUT == ret) + { + DEBUG_LOG("ymodem tx timeout"); + } #endif } } -- Gitee From 8addc95dfb2dae8b7ef00744f732bcb61a0a949d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=98=BF=E8=A1=B00110?= Date: Sun, 21 Jan 2024 23:20:37 +0800 Subject: [PATCH 51/66] =?UTF-8?q?=E9=9D=9E=E7=A8=8B=E5=BA=8F=E5=86=85?= =?UTF-8?q?=E5=AE=B9=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- drivers/bootloader/xmodem.c | 60 ++++++++++++++++++------------------- drivers/bootloader/xmodem.h | 2 +- drivers/bootloader/ymodem.c | 52 ++++++++++++++++---------------- examples/xmodem/SRC/main.c | 50 +++++++++++++++---------------- examples/ymodem/SRC/main.c | 50 +++++++++++++++---------------- 5 files changed, 107 insertions(+), 107 deletions(-) diff --git a/drivers/bootloader/xmodem.c b/drivers/bootloader/xmodem.c index b3f6ca2..25375ad 100644 --- a/drivers/bootloader/xmodem.c +++ b/drivers/bootloader/xmodem.c @@ -134,7 +134,7 @@ static uint8_t xmodem_check_sum(uint8_t *data, uint16_t len) */ inline static void xmodem_init_state(xmodem_t *_xmodem) { - _xmodem->eotFlag = 0; + _xmodem->eotFlag = 0; _xmodem->rspTimeoutCnt = 0; _xmodem->rspTimeoutTimes = 0; _xmodem->packetNum = 1; @@ -203,7 +203,7 @@ void xmodem_init(xmodem_t *_xmodem, void *dataBuf, uint16_t bufLen, xmodem_tx_en */ uint8_t xmodem_rx_poll(xmodem_t *_xmodem) { - uint8_t ret = RET_ING; + uint8_t ret = RET_ING; uint32_t tickTmp; ASSERT_PARAM(IS_VALID_POINT(_xmodem)); @@ -221,7 +221,7 @@ uint8_t xmodem_rx_poll(xmodem_t *_xmodem) if(_xmodem->rspTimeoutTimes++ >= XMODEM_RSP_TIMES) { xmodem_init_state(_xmodem); - ret = RET_TIMEOUT; /* 回复超时 */ + ret = RET_TIMEOUT; /* 回复超时 */ break; } /* 重发当前包 */ @@ -249,13 +249,13 @@ uint8_t xmodem_rx_poll(xmodem_t *_xmodem) _xmodem->dataBuf[YMODEM_START_INDEX] = XMODEM_ACK; _xmodem->dataLen = 1; _xmodem->txEnFn(1); - ret = RET_OK; /* 传输完成 */ + ret = RET_OK; /* 传输完成 */ break; } /* CAN为包头 表示传输取消 */ else if(XMODEM_CAN == _xmodem->dataBuf[YMODEM_START_INDEX]) { xmodem_init_state(_xmodem); - ret = RET_ERR; /* 传输错误 */ + ret = RET_ERR; /* 传输错误 */ break; } else @@ -308,12 +308,12 @@ uint8_t xmodem_rx_poll(xmodem_t *_xmodem) _xmodem->txEnFn(1); break; default: - xmodem_init_state(_xmodem); - ret = RET_ERR; /* 传输错误 */ - break; + xmodem_init_state(_xmodem); + ret = RET_ERR; /* 传输错误 */ + break; } - - return ret; + + return ret; } /** @@ -357,7 +357,7 @@ void xmodem_rx_start(xmodem_t *_xmodem, uint8_t startFlag) */ uint8_t xmodem_tx_poll(xmodem_t *_xmodem) { - uint8_t ret = RET_ING; + uint8_t ret = RET_ING; uint16_t checkVal; uint32_t tickTmp; @@ -381,9 +381,9 @@ uint8_t xmodem_tx_poll(xmodem_t *_xmodem) else { _xmodem->readLen++; - break; + break; } - _xmodem->state = XMODEM_STATE_CHECK_DATA; /* 切换状态 */ + _xmodem->state = XMODEM_STATE_CHECK_DATA; /* 切换状态 */ } break; case XMODEM_STATE_WAIT: @@ -396,7 +396,7 @@ uint8_t xmodem_tx_poll(xmodem_t *_xmodem) if(_xmodem->rspTimeoutTimes++ >= XMODEM_RSP_TIMES) { xmodem_init_state(_xmodem); - ret = RET_TIMEOUT; /* 回复超时 */ + ret = RET_TIMEOUT; /* 回复超时 */ break; } /* 重发当前包 */ @@ -408,13 +408,13 @@ uint8_t xmodem_tx_poll(xmodem_t *_xmodem) /* 收到ACK则继续发下一包 */ if(XMODEM_ACK == _xmodem->dataBuf[YMODEM_START_INDEX]) { - /* 发送EOT后收到ACK则认为是传输结束 */ - if(_xmodem->eotFlag) - { - xmodem_init_state(_xmodem); - ret = RET_OK; /* 传输完成 */ - break; - } + /* 发送EOT后收到ACK则认为是传输结束 */ + if(_xmodem->eotFlag) + { + xmodem_init_state(_xmodem); + ret = RET_OK; /* 传输完成 */ + break; + } _xmodem->state = XMODEM_STATE_CHECK_DATA; /* 切换状态 */ } /* 收到NAK则重发当前包 */ else if(XMODEM_NAK == _xmodem->dataBuf[YMODEM_START_INDEX]) @@ -425,7 +425,7 @@ uint8_t xmodem_tx_poll(xmodem_t *_xmodem) else if(XMODEM_CAN == _xmodem->dataBuf[YMODEM_START_INDEX]) { xmodem_init_state(_xmodem); - ret = RET_ERR; /* 传输错误 */ + ret = RET_ERR; /* 传输错误 */ break; } /* 否则认为是无效数据 */ else @@ -452,11 +452,11 @@ uint8_t xmodem_tx_poll(xmodem_t *_xmodem) } /* 其它认为是传输结束 */ else { - _xmodem->eotFlag = 1; + _xmodem->eotFlag = 1; /* 回复EOT传输结束 */ _xmodem->dataBuf[YMODEM_START_INDEX] = XMODEM_EOT; _xmodem->dataLen = 1; - _xmodem->dataLenTmp = _xmodem->dataLen; + _xmodem->dataLenTmp = _xmodem->dataLen; _xmodem->txEnFn(1); break; } @@ -483,13 +483,13 @@ uint8_t xmodem_tx_poll(xmodem_t *_xmodem) _xmodem->dataLenTmp = _xmodem->dataLen; _xmodem->txEnFn(1); break; - default: - xmodem_init_state(_xmodem); - ret = RET_ERR; /* 传输错误 */ - break; + default: + xmodem_init_state(_xmodem); + ret = RET_ERR; /* 传输错误 */ + break; } - - return ret; + + return ret; } /** diff --git a/drivers/bootloader/xmodem.h b/drivers/bootloader/xmodem.h index e04fd07..067189a 100644 --- a/drivers/bootloader/xmodem.h +++ b/drivers/bootloader/xmodem.h @@ -153,7 +153,7 @@ typedef struct xmodem { uint8_t state : 3; /*!< xmodem状态 @ref xmodem_rx_state */ uint8_t checkNum : 2; /*!< 校验字节数 1:累加和 2:CRC16 */ - uint8_t eotFlag : 1; + uint8_t eotFlag : 1; xmodem_tx_en_t txEnFn; /*!< 串口发送准备函数 */ xmodem_user_packet_cb_t getPacketFn; /*!< 获取数据包回调函数 */ diff --git a/drivers/bootloader/ymodem.c b/drivers/bootloader/ymodem.c index 29c4bbe..f6d98ce 100644 --- a/drivers/bootloader/ymodem.c +++ b/drivers/bootloader/ymodem.c @@ -203,7 +203,7 @@ void ymodem_init(ymodem_t *_ymodem, void *dataBuf, uint16_t bufLen, ymodem_tx_en */ uint8_t ymodem_rx_poll(ymodem_t *_ymodem) { - uint8_t ret = RET_ING; + uint8_t ret = RET_ING; uint32_t tickTmp; ASSERT_PARAM(IS_VALID_POINT(_ymodem)); @@ -221,8 +221,8 @@ uint8_t ymodem_rx_poll(ymodem_t *_ymodem) if(_ymodem->rspTimeoutTimes++ >= YMODEM_RSP_TIMES) { ymodem_init_state(_ymodem); - ret = RET_TIMEOUT; /* 回复超时 */ - break; + ret = RET_TIMEOUT; /* 回复超时 */ + break; } /* 第二次收到EOT应答超时后重新启动接收 */ if(2 == _ymodem->eotFlag) @@ -263,8 +263,8 @@ uint8_t ymodem_rx_poll(ymodem_t *_ymodem) _ymodem->dataLen = 1; _ymodem->dataLenTmp = _ymodem->dataLen; _ymodem->txEnFn(1); - ret = RET_OK; /* 传输完成 */ - break; + ret = RET_OK; /* 传输完成 */ + break; } } /* 数据包 */ @@ -299,7 +299,7 @@ uint8_t ymodem_rx_poll(ymodem_t *_ymodem) else if(YMODEM_CAN == _ymodem->dataBuf[YMODEM_START_INDEX]) { ymodem_init_state(_ymodem); - ret = RET_ERR; /* 传输错误 */ + ret = RET_ERR; /* 传输错误 */ break; } /* 其它则回到等待状态 */ else @@ -352,12 +352,12 @@ uint8_t ymodem_rx_poll(ymodem_t *_ymodem) _ymodem->txEnFn(1); break; default: - ymodem_init_state(_ymodem); - ret = RET_ERR; /* 传输错误 */ - break; + ymodem_init_state(_ymodem); + ret = RET_ERR; /* 传输错误 */ + break; } - - return ret; + + return ret; } /** @@ -402,7 +402,7 @@ void ymodem_rx_start(ymodem_t *_ymodem, uint8_t startFlag) */ uint8_t ymodem_tx_poll(ymodem_t *_ymodem) { - uint8_t ret = RET_ING; + uint8_t ret = RET_ING; uint16_t checkVal; uint32_t tickTmp; @@ -446,7 +446,7 @@ uint8_t ymodem_tx_poll(ymodem_t *_ymodem) if(_ymodem->rspTimeoutTimes++ >= YMODEM_RSP_TIMES) { ymodem_init_state(_ymodem); - ret = RET_TIMEOUT; /* 回复超时 */ + ret = RET_TIMEOUT; /* 回复超时 */ break; } /* 重发当前包 */ @@ -469,12 +469,12 @@ uint8_t ymodem_tx_poll(ymodem_t *_ymodem) /* 传输结束标志置位表明此前发出的是EOT 收到ACK表明传输结束则回到初始状态 */ if(_ymodem->eotFlag) { - ymodem_init_state(_ymodem); - ret = RET_OK; /* 传输完成 */ - break; - } - /* 其它是正常数据 切换到数据检验状态 */ - _ymodem->state = YMODEM_STATE_CHECK_DATA; /* 切换状态 */ + ymodem_init_state(_ymodem); + ret = RET_OK; /* 传输完成 */ + break; + } + /* 其它是正常数据 切换到数据检验状态 */ + _ymodem->state = YMODEM_STATE_CHECK_DATA; /* 切换状态 */ } /* 收到NAK则重发当前包 */ else if(YMODEM_NAK == _ymodem->dataBuf[0]) { @@ -484,7 +484,7 @@ uint8_t ymodem_tx_poll(ymodem_t *_ymodem) else if(YMODEM_CAN == _ymodem->dataBuf[0]) { ymodem_init_state(_ymodem); - ret = RET_ERR; /* 传输错误 */ + ret = RET_ERR; /* 传输错误 */ break; } /* 否则认为是无效数据 */ else @@ -543,13 +543,13 @@ uint8_t ymodem_tx_poll(ymodem_t *_ymodem) _ymodem->dataLenTmp = _ymodem->dataLen; _ymodem->txEnFn(1); break; - default: - ymodem_init_state(_ymodem); - ret = RET_ERR; /* 传输错误 */ - break; + default: + ymodem_init_state(_ymodem); + ret = RET_ERR; /* 传输错误 */ + break; } - - return ret; + + return ret; } /** diff --git a/examples/xmodem/SRC/main.c b/examples/xmodem/SRC/main.c index 3673a10..77d446f 100644 --- a/examples/xmodem/SRC/main.c +++ b/examples/xmodem/SRC/main.c @@ -208,35 +208,35 @@ int main(int argc, char *argv[]) while(1) { - static uint8_t ret; + static uint8_t ret; #if XMODEM_TX_RX_TEST ret = xmodem_rx_poll(&xmodem); /* xmodem接收轮询处理 */ - if(RET_OK == ret) - { - DEBUG_LOG("xmodem rx success"); - } - else if(RET_ERR == ret) - { - DEBUG_LOG("xmodem rx failed"); - } - else if(RET_TIMEOUT == ret) - { - DEBUG_LOG("xmodem rx timeout"); - } + if(RET_OK == ret) + { + DEBUG_LOG("xmodem rx success"); + } + else if(RET_ERR == ret) + { + DEBUG_LOG("xmodem rx failed"); + } + else if(RET_TIMEOUT == ret) + { + DEBUG_LOG("xmodem rx timeout"); + } #else ret = xmodem_tx_poll(&xmodem); /* xmodem发送轮询处理 */ - if(RET_OK == ret) - { - DEBUG_LOG("xmodem tx success"); - } - else if(RET_ERR == ret) - { - DEBUG_LOG("xmodem tx failed"); - } - else if(RET_TIMEOUT == ret) - { - DEBUG_LOG("xmodem tx timeout"); - } + if(RET_OK == ret) + { + DEBUG_LOG("xmodem tx success"); + } + else if(RET_ERR == ret) + { + DEBUG_LOG("xmodem tx failed"); + } + else if(RET_TIMEOUT == ret) + { + DEBUG_LOG("xmodem tx timeout"); + } #endif } } diff --git a/examples/ymodem/SRC/main.c b/examples/ymodem/SRC/main.c index f04cdc6..a6e060c 100644 --- a/examples/ymodem/SRC/main.c +++ b/examples/ymodem/SRC/main.c @@ -251,35 +251,35 @@ int main(int argc, char *argv[]) while(1) { - static uint8_t ret; + static uint8_t ret; #if YMODEM_TX_RX_TEST ret = ymodem_rx_poll(&ymodem); /* ymodem接收轮询处理 */ - if(RET_OK == ret) - { - DEBUG_LOG("ymodem rx success"); - } - else if(RET_ERR == ret) - { - DEBUG_LOG("ymodem rx failed"); - } - else if(RET_TIMEOUT == ret) - { - DEBUG_LOG("ymodem rx timeout"); - } + if(RET_OK == ret) + { + DEBUG_LOG("ymodem rx success"); + } + else if(RET_ERR == ret) + { + DEBUG_LOG("ymodem rx failed"); + } + else if(RET_TIMEOUT == ret) + { + DEBUG_LOG("ymodem rx timeout"); + } #else ret = ymodem_tx_poll(&ymodem); /* ymodem发送轮询处理 */ - if(RET_OK == ret) - { - DEBUG_LOG("ymodem tx success"); - } - else if(RET_ERR == ret) - { - DEBUG_LOG("ymodem tx failed"); - } - else if(RET_TIMEOUT == ret) - { - DEBUG_LOG("ymodem tx timeout"); - } + if(RET_OK == ret) + { + DEBUG_LOG("ymodem tx success"); + } + else if(RET_ERR == ret) + { + DEBUG_LOG("ymodem tx failed"); + } + else if(RET_TIMEOUT == ret) + { + DEBUG_LOG("ymodem tx timeout"); + } #endif } } -- Gitee From 606a3bac7466f72d92a1ae00d3a9a20fb6bbebd9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=98=BF=E8=A1=B00110?= Date: Sun, 21 Jan 2024 23:33:44 +0800 Subject: [PATCH 52/66] =?UTF-8?q?#I8X0KR=20bootloader=E7=BB=84=E4=BB=B6?= =?UTF-8?q?=E6=BA=90=E7=A0=81=E5=AE=8C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- drivers/bootloader/bootloader.c | 165 +++++++++++++++++++++++++------- drivers/bootloader/bootloader.h | 105 ++++++++++++++++---- 2 files changed, 215 insertions(+), 55 deletions(-) diff --git a/drivers/bootloader/bootloader.c b/drivers/bootloader/bootloader.c index 2fa351e..f768284 100644 --- a/drivers/bootloader/bootloader.c +++ b/drivers/bootloader/bootloader.c @@ -3,8 +3,8 @@ * @file bootloader.c * @author ashuai0110 * @version V1.0 - * @date 2024-01-18 - * @brief 程序升级引导 + * @date 2024-01-21 + * @brief 升级引导程序 * ****************************************************************************** * @attention @@ -14,7 +14,7 @@ * * Change Logs: * Date Author Notes - * 2024-01-18 ashuai0110 完成基本内容 + * 2024-01-21 ashuai0110 完成基本内容 * ****************************************************************************** */ @@ -42,11 +42,11 @@ * @defgroup bootloader_check_parameters_validity bootloader check parameters validity * @{ */ -/* FLASH地址有效性检查 */ -#define IS_VALID_APP_ADDR(x) \ -( ((x) >= FLASH_START_ADDR) && \ - ((x) < FLASH_END_ADDR) && \ - (((x) % FLASH_PAGE_SIZE) == 0)) +/* 升级标志有效性检查 */ +#define IS_VALID_UPDATA_FLAG(x) \ +( ((x) == BOOT_UPDATA_FLAG) || \ + ((x) == BOOT_TO_APP_FLAG) || \ + ((x) == BOOT_TO_FACTORY_FLAG)) /** * @} @@ -64,7 +64,7 @@ * @{ */ -static bootloader_t bootloaderInfo; /*!< */ +static bootloader_t bootCtrl; /*!< bootloader管理实例 */ /** * @} @@ -79,7 +79,6 @@ static bootloader_t bootloaderInfo; /*!< */ */ - /** * @} */ @@ -90,42 +89,128 @@ static bootloader_t bootloaderInfo; /*!< */ */ /** - * @brief + * @brief bootloader初始化 * - * @param None + * @param flashErase : 对接flash擦除接口(用户实现) + * + * @param flashRead : 对接flash读取接口(用户实现) + * + * @param flashWrite : 对接flash写入接口(用户实现) * * @retval None */ -void boot_init(uint32_t appAddr,uint32_t factoryAddr) +void boot_init(boot_flash_erase_fn_t flashErase, boot_flash_rw_fn_t flashRead, boot_flash_rw_fn_t flashWrite) { - uint32_t addrTemp; - - ASSERT_PARAM(IS_VALID_APP_ADDR(bootloaderInfo.appAddr)); - ASSERT_PARAM(IS_VALID_APP_ADDR(bootloaderInfo.factoryAddr)); + ASSERT_PARAM(IS_VALID_POINT(flashErase)); + ASSERT_PARAM(IS_VALID_POINT(flashRead)); + ASSERT_PARAM(IS_VALID_POINT(flashWrite)); - bootloaderInfo.appAddr = appAddr; - bootloaderInfo.factoryAddr = factoryAddr; - addrTemp = *(volatile uint32_t *)(appAddr + 4u); - bootloaderInfo.applicationFn = (boot_jump_fn_t)addrTemp; - addrTemp = *(volatile uint32_t *)(factoryAddr + 4u); - bootloaderInfo.restoreFactoryFn = (boot_jump_fn_t)addrTemp; + /* 初始化各参数 */ + bootCtrl.flashEraseFn = flashErase; + bootCtrl.flashReadFn = flashRead; + bootCtrl.flashWriteFn = flashWrite; + /* 读取FLASH中的内存参数 */ + bootCtrl.flashReadFn(BOOT_FLASH_START_ADDR + BOOT_INFO_ADDR_OFFSET, (void *)&bootCtrl.bootInfo, sizeof(boot_info_t)); + if(0xFFFF == bootCtrl.bootInfo.appVersion) { bootCtrl.bootInfo.appVersion = 0; } + if(0xFFFF == bootCtrl.bootInfo.bootVersion) { bootCtrl.bootInfo.bootVersion = BOOT_VERSION; } } /** * @brief bootloader校验升级标志 * - * @note 进入bootloader程序校验是否要升级 + * @note 进入bootloader程序检查是升级还是直接跳转 * - * @param updataFlag : 升级标志 + * @param None * * @retval None */ -void boot_check_updata(uint32_t updataFlag) +void boot_check_updata_flag(void) { - if(BOOT_UPDATA_FLAG != updataFlag) + switch(bootCtrl.bootInfo.updataFlag) { - boot_to_application(); + case BOOT_UPDATA_FLAG: /* 升级则不跳转 */ + break; + case BOOT_TO_APP_FLAG: /* 跳转到应用程序 */ + boot_to_application(); + break; + case BOOT_TO_FACTORY_FLAG: /* 跳转到备份(出厂)程序 */ + boot_to_factory(); + break; + default: /* 无标志则默认跳转到应用程序 */ + boot_to_application(); + break; } + +} + +/** + * @brief 擦除应用程序FLASH区域 + * + * @param appSize : 应用程序大小 + * + * @retval 0:擦除成功 1:擦除失败 2:参数有误 + */ +uint8_t boot_erase_application(uint32_t appSize) +{ + uint8_t ret; + + if(4 >= appSize || BOOT_APP_SIZE_MAX < appSize) { return 2; } + + /* 擦除应用程序FLASH区域 */ + ret = bootCtrl.flashEraseFn(BOOT_FLASH_START_ADDR + BOOT_APP_ADDR_OFFSET, ALIGN_UP(appSize, BOOT_FLASH_PAGE_SIZE) / BOOT_FLASH_PAGE_SIZE); + + return ret; +} + +/** + * @brief 编程应用程序FLASH区域 + * + * @param appSize : 应用程序大小 + * + * @retval 0:擦除成功 1:擦除失败 + */ +uint8_t boot_program_application(void *data, uint16_t len) +{ + uint8_t ret; + + ret = bootCtrl.flashWriteFn(BOOT_FLASH_START_ADDR + BOOT_APP_ADDR_OFFSET + bootCtrl.writedSize, data, len); /* 编程应用程序FLASH区域 */ + bootCtrl.writedSize += len; /* 记录已写入大小 */ + + return ret; +} + +/** + * @brief 编程升级信息中的升级标志 + * + * @note 需要升级且在MCU复位前(APP中设置)设置,以便复位后bootloader可以检测到升级标志从而启动升级 + * + * @param updataFlag : 升级标志 @ref boot_updata_flag + * + * @retval None + */ +void boot_program_updata_flag(uint32_t updataFlag) +{ + ASSERT_PARAM(IS_VALID_UPDATA_FLAG(updataFlag)); + + bootCtrl.bootInfo.updataFlag = updataFlag; + bootCtrl.flashEraseFn(BOOT_FLASH_START_ADDR + BOOT_INFO_ADDR_OFFSET, 1); + bootCtrl.flashWriteFn(BOOT_FLASH_START_ADDR + BOOT_INFO_ADDR_OFFSET, (void *)&bootCtrl.bootInfo, sizeof(boot_info_t)); +} + +/** + * @brief 编程升级信息中的应用程序版本 + * + * @note 一般在APP中设置 + * + * @param appVersion : 应用程序版本 + * + * @retval None + */ +void boot_program_app_version(uint16_t appVersion) +{ + bootCtrl.bootInfo.appVersion = appVersion; + bootCtrl.flashEraseFn(BOOT_FLASH_START_ADDR + BOOT_INFO_ADDR_OFFSET, 1); + bootCtrl.flashWriteFn(BOOT_FLASH_START_ADDR + BOOT_INFO_ADDR_OFFSET, (void *)&bootCtrl.bootInfo, sizeof(boot_info_t)); } /** @@ -137,14 +222,20 @@ void boot_check_updata(uint32_t updataFlag) */ void boot_to_application(void) { - /* 恢复bootloader使用的中断和外设 */ + /* 写入跳转应用程序标志 */ + boot_program_updata_flag(BOOT_TO_APP_FLAG); + /* 恢复已使用的中断和外设 */ boot_recover_all(); + /* 将应用程序地址+4后强转为函数指针 */ + bootCtrl.jumpFn = (boot_jump_fn_t)*(volatile uint32_t *)(BOOT_FLASH_START_ADDR + BOOT_APP_ADDR_OFFSET + 4u); + /* 设置栈顶指针 */ +// __set_MSP(*(volatile uint32_t *)(BOOT_FLASH_START_ADDR + BOOT_APP_ADDR_OFFSET)); /* 跳转应用程序 */ - bootloaderInfo.applicationFn(); + bootCtrl.jumpFn(); } /** - * @brief bootloader跳转出厂程序(备份程序) + * @brief bootloader跳转备份(出厂)程序 * * @param None * @@ -152,10 +243,16 @@ void boot_to_application(void) */ void boot_to_factory(void) { - /* 恢复bootloader使用的中断和外设 */ + /* 写入跳转备份(出厂)程序标志 */ + boot_program_updata_flag(BOOT_TO_FACTORY_FLAG); + /* 恢复已使用的中断和外设 */ boot_recover_all(); - /* 跳转出厂程序(备份程序) */ - bootloaderInfo.restoreFactoryFn(); + /* 将备份(出厂)程序地址+4后强转为函数指针 */ + bootCtrl.jumpFn = (boot_jump_fn_t)*(volatile uint32_t *)(BOOT_FLASH_START_ADDR + BOOT_FACTORY_ADDR_OFFSET + 4u); + /* 设置栈顶指针 */ +// __set_MSP(*(volatile uint32_t *)(BOOT_FLASH_START_ADDR + BOOT_FACTORY_ADDR_OFFSET)); + /* 跳转备份(出厂)程序 */ + bootCtrl.jumpFn(); } /** diff --git a/drivers/bootloader/bootloader.h b/drivers/bootloader/bootloader.h index 6ed8d4e..a71057a 100644 --- a/drivers/bootloader/bootloader.h +++ b/drivers/bootloader/bootloader.h @@ -3,8 +3,8 @@ * @file bootloader.h * @author ashuai0110 * @version V1.0 - * @date 2024-01-18 - * @brief 程序升级引导 + * @date 2024-01-21 + * @brief 升级引导程序 * ****************************************************************************** * @attention @@ -42,16 +42,33 @@ extern "C" { */ /** - * @defgroup cmd_line_run_flg bootloader run flag + * @defgroup boot_mcu_info bootloader mcu info + * @brief MCU FLASH及升级参数(用户根据情况修改) * @{ */ -/* 用户根据MCU型号修改 */ -#define FLASH_PAGE_SIZE (0x800u) /*!< mcu flash每页的大小 */ -#define FLASH_TOTAL_SIZE (0x40000u) /*!< mcu flash总大小 */ -#define FLASH_START_ADDR (0x8000000u) /*!< mcu flash起始地址 */ -#define FLASH_END_ADDR (FLASH_START_ADDR + FLASH_TOTAL_SIZE) /*!< mcu flash结束地址 */ +#define BOOT_FLASH_PAGE_SIZE (0x400) /*!< mcu flash每页的大小 */ +#define BOOT_FLASH_TOTAL_SIZE (0x8000) /*!< mcu flash总大小 */ +#define BOOT_FLASH_START_ADDR (0x8000000) /*!< mcu flash起始地址 */ +#define BOOT_FLASH_END_ADDR (BOOT_FLASH_START_ADDR + BOOT_FLASH_TOTAL_SIZE) /*!< mcu flash结束地址 */ +/* flash分区: bootloader + application + factory + info */ +#define BOOT_APP_ADDR_OFFSET (0x2C00) /*!< 应用程序起始地址偏移 */ +#define BOOT_APP_SIZE_MAX (0x2800) /*!< 应用程序最大大小 */ +#define BOOT_FACTORY_ADDR_OFFSET (BOOT_APP_ADDR_OFFSET + BOOT_APP_SIZE_MAX) /*!< 备份(出厂)程序起始地址偏移 */ +#define BOOT_FACTORY_SIZE_MAX (0x2800) /*!< 备份(出厂)程序最大大小 */ +/* 升级信息存放起始地址偏移(应处于BOOT,APP,FACTORY存储之外的FLASH页,保证不会被意外擦除或改写) */ +#define BOOT_INFO_ADDR_OFFSET (BOOT_FACTORY_ADDR_OFFSET + BOOT_FACTORY_SIZE_MAX) +#define BOOT_VERSION (100) /*!< bootloader版本 */ +/** + * @} + */ -#define BOOT_UPDATA_FLAG (0x55AA3CC3u) /*!< 内存中的升级标志 */ +/** + * @defgroup boot_updata_flag bootloader updata flag + * @{ + */ +#define BOOT_UPDATA_FLAG (0x02468ACE) /*!< 需要升级标志 */ +#define BOOT_TO_APP_FLAG (0x55555555) /*!< 跳转APP/升级成功标志 */ +#define BOOT_TO_FACTORY_FLAG (0xAAAAAAAA) /*!< 跳转FACTORY/升级失败标志 */ /** * @} */ @@ -66,20 +83,61 @@ extern "C" { * @{ */ +/** + * @brief 程序跳转函数 + * + * @param None + * + * @retval None + */ typedef void (* boot_jump_fn_t)(void); +/** + * @brief 读/写flash + * + * @param startAddr : 起始地址 + * + * @param pBuf : 数据缓冲区 + * + * @param len : 读/写数量byte + * + * @retval 0:读/写成功 1:读/写失败 + */ +typedef uint8_t (* boot_flash_rw_fn_t)(uint32_t startAddr, void *pBuf, uint16_t len); + +/** + * @brief 擦除flash + * + * @param startAddr : 起始地址 + * + * @param pageNum : 擦除页数量 + * + * @retval 0:擦除成功 1:擦除失败 + */ +typedef uint8_t (* boot_flash_erase_fn_t)(uint32_t startAddr, uint16_t pageNum); + /** - * @brief 命令行 structure definition + * @brief 升级参数 structure definition */ -typedef struct bootloader{ - uint32_t appAddr; /*!< 应用程序起始地址 */ - uint32_t appSizeMax; - uint32_t factoryAddr; /*!< 出厂程序起始地址(备份程序) */ - uint32_t factorySizeMax; - uint32_t infoAddr; /*!< 传输信息存放起始地址,用于记录 */ +typedef struct boot_info { + uint32_t updataFlag; /*!< 升级标志 @ref boot_updata_flag */ + uint16_t bootVersion; /*!< bootloader版本 100代表V1.0.0 */ + uint16_t appVersion; /*!< application版本 100代表V1.0.0 */ +} boot_info_t; + +/** + * @brief 升级引导程序 structure definition + */ +typedef struct bootloader { + uint32_t writedSize; /*!< 已写入数据大小 */ + boot_info_t bootInfo; /*!< 升级参数 */ + + boot_jump_fn_t jumpFn; /*!< 跳转应用程序函数 */ - boot_jump_fn_t applicationFn; - boot_jump_fn_t restoreFactoryFn; + void (*mcuRebootFn)(void); /*!< MCU重启接口 */ + boot_flash_erase_fn_t flashEraseFn; /*!< 擦除FLASH接口 */ + boot_flash_rw_fn_t flashReadFn; /*!< 读取FLASH接口 */ + boot_flash_rw_fn_t flashWriteFn; /*!< 写入FLASH接口 */ } bootloader_t; /** @@ -94,14 +152,19 @@ typedef struct bootloader{ * @{ */ -void boot_init(uint32_t appAddr,uint32_t factoryAddr); +void boot_init(boot_flash_erase_fn_t flashErase, boot_flash_rw_fn_t flashRead, boot_flash_rw_fn_t flashWrite); + +void boot_check_updata_flag(void); -void boot_check_updata(uint32_t updataFlag); +uint8_t boot_erase_application(uint32_t appSize); +uint8_t boot_program_application(void *data, uint16_t len); +void boot_program_updata_flag(uint32_t updataFlag); +void boot_program_app_version(uint16_t appVersion); void boot_to_application(void); void boot_to_factory(void); -/* weak function */ +/* 弱定义函数 */ void boot_recover_all(void); /** -- Gitee From 27ace2506b67b97f8124b56927ee91a32f8a27a9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=98=BF=E8=A1=B00110?= Date: Sun, 21 Jan 2024 23:34:10 +0800 Subject: [PATCH 53/66] =?UTF-8?q?#I8X0KR=20bootloader=E4=BE=8B=E7=A8=8B?= =?UTF-8?q?=E5=9F=BA=E6=9C=AC=E5=AE=8C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- examples/bootloader/MDK/use_example.uvoptx | 194 ++++---------------- examples/bootloader/MDK/use_example.uvprojx | 17 +- examples/bootloader/README.txt | 2 +- examples/bootloader/SRC/main.c | 55 +++++- 4 files changed, 94 insertions(+), 174 deletions(-) diff --git a/examples/bootloader/MDK/use_example.uvoptx b/examples/bootloader/MDK/use_example.uvoptx index 7ea3b02..d523001 100644 --- a/examples/bootloader/MDK/use_example.uvoptx +++ b/examples/bootloader/MDK/use_example.uvoptx @@ -148,152 +148,7 @@ UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32F10x_128 -FS08000000 -FL020000 -FP0($$Device:STM32F103C8$Flash\STM32F10x_128.FLM)) - - - 0 - 0 - 229 - 1 -
134224394
- 0 - 0 - 0 - 0 - 0 - 1 - D:\ASProject\mcuProject\mcu_development_template\mcu_reuse_development_module\drivers\bootloader\xmodem.c - - \\use_example\../../../drivers/bootloader/xmodem.c\229 -
- - 1 - 0 - 234 - 1 -
134224434
- 0 - 0 - 0 - 0 - 0 - 1 - D:\ASProject\mcuProject\mcu_development_template\mcu_reuse_development_module\drivers\bootloader\xmodem.c - - \\use_example\../../../drivers/bootloader/xmodem.c\234 -
- - 2 - 0 - 277 - 1 -
134224622
- 0 - 0 - 0 - 0 - 0 - 1 - D:\ASProject\mcuProject\mcu_development_template\mcu_reuse_development_module\drivers\bootloader\xmodem.c - - \\use_example\../../../drivers/bootloader/xmodem.c\277 -
- - 3 - 0 - 205 - 1 -
134224320
- 0 - 0 - 0 - 0 - 0 - 1 - D:\ASProject\mcuProject\mcu_development_template\mcu_reuse_development_module\drivers\bootloader\xmodem.c - - \\use_example\../../../drivers/bootloader/xmodem.c\205 -
- - 4 - 0 - 205 - 1 -
134224712
- 0 - 0 - 0 - 0 - 0 - 1 - D:\ASProject\mcuProject\mcu_development_template\mcu_reuse_development_module\drivers\bootloader\xmodem.c - - \\use_example\../../../drivers/bootloader/xmodem.c\205 -
- - 5 - 0 - 207 - 1 -
0
- 0 - 0 - 0 - 0 - 0 - 0 - D:\ASProject\mcuProject\mcu_development_template\mcu_reuse_development_module\drivers\bootloader\xmodem.c - - -
- - 6 - 0 - 230 - 1 -
0
- 0 - 0 - 0 - 0 - 0 - 0 - D:\ASProject\mcuProject\mcu_development_template\mcu_reuse_development_module\drivers\bootloader\xmodem.c - - -
- - 7 - 0 - 235 - 1 -
0
- 0 - 0 - 0 - 0 - 0 - 0 - D:\ASProject\mcuProject\mcu_development_template\mcu_reuse_development_module\drivers\bootloader\xmodem.c - - -
- - 8 - 0 - 279 - 1 -
0
- 0 - 0 - 0 - 0 - 0 - 0 - D:\ASProject\mcuProject\mcu_development_template\mcu_reuse_development_module\drivers\bootloader\xmodem.c - - -
-
+ 0 @@ -335,7 +190,20 @@ 1 crc16 + + 8 + 1 + bootCtrl + + + + 1 + 0 + 0x8004000 + 0 + + 0 @@ -790,6 +658,18 @@ 0 0 + + 4 + 32 + 1 + 0 + 0 + 0 + ..\..\[base_on_stm32f1]\stm32f1_sys\flash.c + flash.c + 0 + 0 + @@ -800,43 +680,43 @@ 0 5 - 32 + 33 1 0 0 0 - ..\SRC\main.c - main.c + ..\..\..\drivers\bootloader\bootloader.c + bootloader.c 0 0 5 - 33 + 34 1 0 0 0 - ..\..\..\drivers\bootloader\bootloader.c - bootloader.c + ..\..\..\drivers\common\common_include.c + common_include.c 0 0 5 - 34 + 35 1 0 0 0 - ..\..\..\drivers\common\common_include.c - common_include.c + ..\SRC\main.c + main.c 0 0 5 - 35 + 36 1 0 0 @@ -856,7 +736,7 @@ 0 6 - 36 + 37 5 0 0 diff --git a/examples/bootloader/MDK/use_example.uvprojx b/examples/bootloader/MDK/use_example.uvprojx index 51a65e5..d2ee26c 100644 --- a/examples/bootloader/MDK/use_example.uvprojx +++ b/examples/bootloader/MDK/use_example.uvprojx @@ -276,7 +276,7 @@ 1 0x8000000 - 0x10000 + 0x2c00 1 @@ -553,16 +553,16 @@ 1 ..\..\[base_on_stm32f1]\stm32f1_sys\tim.c + + flash.c + 1 + ..\..\[base_on_stm32f1]\stm32f1_sys\flash.c + source - - main.c - 1 - ..\SRC\main.c - bootloader.c 1 @@ -573,6 +573,11 @@ 1 ..\..\..\drivers\common\common_include.c + + main.c + 1 + ..\SRC\main.c + ymodem.c 1 diff --git a/examples/bootloader/README.txt b/examples/bootloader/README.txt index 69f12c2..6ffda2a 100644 --- a/examples/bootloader/README.txt +++ b/examples/bootloader/README.txt @@ -34,7 +34,7 @@ bootloader.h ================================================================================ 1)使用J-Link连接目标板; 2)打开工程,重新编译,启动调试或直接下载程序运行; -3)用J-Link RTT Viewer软件连接,查看打印消息。 +3)第一次烧写应全片擦除一次,用户可更换通信协议,将组件接口对接好即可使用。 ================================================================================ 注意 diff --git a/examples/bootloader/SRC/main.c b/examples/bootloader/SRC/main.c index 17bb540..33e9584 100644 --- a/examples/bootloader/SRC/main.c +++ b/examples/bootloader/SRC/main.c @@ -19,6 +19,7 @@ #include "stm32f10x.h" #include "usart_dma.h" #include "tim.h" +#include "flash.h" #include "ymodem.h" #include "bootloader.h" @@ -33,11 +34,11 @@ static uint8_t usart1DmaRxBuf[200]; /* 串口1dma接收缓存区 */ ymodem_t ymodem; /* ymodem实例 */ static uint8_t ymodemBuf[1029]; /* ymodem数据缓存区 */ +file_info_t fileInfo; /* 文件信息结构体 */ /* 全局变量-------------------------------------------------------------------*/ /* 私有函数原型---------------------------------------------------------------*/ -void usart1_tx_en(uint8_t enState); /** @@ -152,14 +153,17 @@ void usart1_tx_en(uint8_t enState) */ void ymodem_get_packet_callback(uint8_t packetNum, uint8_t *data, uint16_t *len) { - uint16_t lenTmp = *len; - - PRINT_LOG("ymodem packet num:%d, len:%d, data: ", packetNum, lenTmp); - for(uint16_t i = 0; i < lenTmp; i++) + /* 文件信息 */ + if(YMODEM_FILE_FLAG(ymodem)) + { + ymodem_get_file_info(&ymodem, &fileInfo); /* 获取文件信息保存至fileInfo结构体 */ + PRINT_LOG("ymodem rec file name:%s, size:%d Byte\r\n", fileInfo.fileName, fileInfo.fileSize); + boot_erase_application(fileInfo.fileSize); /* 擦除应用程序FLASH区域 */ + } /* 数据 */ + else { - PRINT_LOG("%02X ", data[i]); + boot_program_application((void *)data, *len); /* 编程应用程序FLASH区域 */ } - PRINT_LOG("\r\n"); } /** @@ -187,6 +191,22 @@ void ymodem_set_packet_callback(uint8_t packetNum, uint8_t *data, uint16_t *len) } } +/** + * @brief 恢复所有外设及中断 + * + * @param None + * + * @retval None + */ +void boot_recover_all(void) +{ + GPIO_DeInit(GPIOA); + TIM_DeInit(TIM1); + USART_DeInit(USART1); + DMA_DeInit(DMA1_Channel4); + DMA_DeInit(DMA1_Channel5); +} + /** * @brief main */ @@ -194,6 +214,11 @@ int main(int argc, char *argv[]) { VERSION_LOG("example-bootloader", 1, 0, 0); + /* bootloader初始化 对接MCU FLASH操作接口 */ + boot_init(flash_erase, flash_read, flash_write); + /* 检查是升级还是跳转APP */ + boot_check_updata_flag(); + /* 串口及其dma初始化 */ usart1_dma_init_config(115200, usart1DmaTxBuf, sizeof(usart1DmaTxBuf), usart1DmaRxBuf, sizeof(usart1DmaRxBuf)); /* 定时器初始化 1ms */ @@ -202,12 +227,22 @@ int main(int argc, char *argv[]) /* ymodem组件初始化 */ ymodem_init(&ymodem, ymodemBuf, sizeof(ymodemBuf), usart1_tx_en, ymodem_get_packet_callback, ymodem_set_packet_callback, 2000); /* 启动ymodem接收 */ -// ymodem_rx_start(&ymodem, YMODEM_RX_FLAG_CRC); + ymodem_rx_start(&ymodem, YMODEM_RX_FLAG_CRC); while(1) { -// ymodem_rx_poll(&ymodem); -// ymodem_tx_poll(&ymodem); + static uint8_t ret; + ret = ymodem_rx_poll(&ymodem); + if(RET_OK == ret) + { + DEBUG_LOG("boot jump to application"); + boot_to_application(); + } + else if(RET_ERR == ret || RET_TIMEOUT == ret) + { + DEBUG_LOG("boot jump to factory"); + boot_to_factory(); + } } } -- Gitee From 6daa03ee731db32e02d8e12d42f484f4ec192ce1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=98=BF=E8=A1=B00110?= Date: Sun, 21 Jan 2024 23:34:53 +0800 Subject: [PATCH 54/66] =?UTF-8?q?#I8X0KR=20bootloader=5Fapp(=E5=BA=94?= =?UTF-8?q?=E7=94=A8=E7=A8=8B=E5=BA=8F)=E4=BE=8B=E7=A8=8B=E5=9F=BA?= =?UTF-8?q?=E6=9C=AC=E5=AE=8C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bootloader_app/MDK/use_example.uvoptx | 746 ++++++++++++++++++ .../bootloader_app/MDK/use_example.uvprojx | 617 +++++++++++++++ examples/bootloader_app/README.txt | 49 ++ examples/bootloader_app/SRC/main.c | 105 +++ 4 files changed, 1517 insertions(+) create mode 100644 examples/bootloader_app/MDK/use_example.uvoptx create mode 100644 examples/bootloader_app/MDK/use_example.uvprojx create mode 100644 examples/bootloader_app/README.txt create mode 100644 examples/bootloader_app/SRC/main.c diff --git a/examples/bootloader_app/MDK/use_example.uvoptx b/examples/bootloader_app/MDK/use_example.uvoptx new file mode 100644 index 0000000..f6855f6 --- /dev/null +++ b/examples/bootloader_app/MDK/use_example.uvoptx @@ -0,0 +1,746 @@ + + + + 1.0 + +
### uVision Project, (C) Keil Software
+ + + *.c + *.s*; *.src; *.a* + *.obj; *.o + *.lib + *.txt; *.h; *.inc; *.md + *.plm + *.cpp; *.cc; *.cxx + 0 + + + + 0 + 0 + + + + Target 1 + 0x4 + ARM-ADS + + 12000000 + + 1 + 1 + 0 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\Listings\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 18 + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 1 + 0 + 0 + 1 + 0 + 0 + 4 + + + + + + + + + + + Segger\JL2CM3.dll + + + + 0 + ARMRTXEVENTFLAGS + -L70 -Z18 -C0 -M0 -T1 + + + 0 + DLGTARM + (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0) + + + 0 + ARMDBGFLAGS + + + + 0 + DLGUARM + d + + + 0 + JL2CM3 + -U59522627 -O78 -S2 -ZTIFSpeedSel5000 -A0 -C0 -JU1 -JI127.0.0.1 -JP0 -RST0 -N00("ARM CoreSight SW-DP") -D00(1BA01477) -L00(0) -TO18 -TC10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -TB1 -TFE0 -FO15 -FD20000000 -FC1000 -FN1 -FF0STM32F10x_128.FLM -FS08000000 -FL020000 -FP0($$Device:STM32F103C8$Flash\STM32F10x_128.FLM) + + + 0 + UL2CM3 + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32F10x_128 -FS08000000 -FL020000 -FP0($$Device:STM32F103C8$Flash\STM32F10x_128.FLM)) + + + + + + 0 + 1 + usart1DmaRxBuf + + + 1 + 1 + dataBuf + + + 2 + 1 + len + + + 3 + 1 + tickTmp + + + 4 + 1 + moduleTick + + + 5 + 1 + xmodem + + + 6 + 1 + xmodemBuf + + + 7 + 1 + crc16 + + + + + 1 + 0 + 0x8004000 + 0 + + + + 0 + + + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + 0 + 0 + 0 + + + + + + + + + + 1 + 1 + 0 + 2 + 10000000 + + + + + + cmsis + 1 + 0 + 0 + 0 + + 1 + 1 + 1 + 0 + 0 + 0 + ..\..\[base_on_stm32f1]\stm32f1_lib\cmsis\core_cm3.c + core_cm3.c + 0 + 0 + + + 1 + 2 + 1 + 0 + 0 + 0 + ..\..\[base_on_stm32f1]\stm32f1_lib\cmsis\stm32f10x_it.c + stm32f10x_it.c + 0 + 0 + + + 1 + 3 + 1 + 0 + 0 + 0 + ..\..\[base_on_stm32f1]\stm32f1_lib\cmsis\system_stm32f10x.c + system_stm32f10x.c + 0 + 0 + + + 1 + 4 + 2 + 0 + 0 + 0 + ..\..\[base_on_stm32f1]\stm32f1_lib\cmsis\startup\startup_stm32f10x_md.s + startup_stm32f10x_md.s + 0 + 0 + + + + + libs + 0 + 0 + 0 + 0 + + 2 + 5 + 1 + 0 + 0 + 0 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\misc.c + misc.c + 0 + 0 + + + 2 + 6 + 1 + 0 + 0 + 0 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_adc.c + stm32f10x_adc.c + 0 + 0 + + + 2 + 7 + 1 + 0 + 0 + 0 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_bkp.c + stm32f10x_bkp.c + 0 + 0 + + + 2 + 8 + 1 + 0 + 0 + 0 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_can.c + stm32f10x_can.c + 0 + 0 + + + 2 + 9 + 1 + 0 + 0 + 0 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_cec.c + stm32f10x_cec.c + 0 + 0 + + + 2 + 10 + 1 + 0 + 0 + 0 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_crc.c + stm32f10x_crc.c + 0 + 0 + + + 2 + 11 + 1 + 0 + 0 + 0 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_dac.c + stm32f10x_dac.c + 0 + 0 + + + 2 + 12 + 1 + 0 + 0 + 0 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_dbgmcu.c + stm32f10x_dbgmcu.c + 0 + 0 + + + 2 + 13 + 1 + 0 + 0 + 0 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_dma.c + stm32f10x_dma.c + 0 + 0 + + + 2 + 14 + 1 + 0 + 0 + 0 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_exti.c + stm32f10x_exti.c + 0 + 0 + + + 2 + 15 + 1 + 0 + 0 + 0 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_flash.c + stm32f10x_flash.c + 0 + 0 + + + 2 + 16 + 1 + 0 + 0 + 0 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_fsmc.c + stm32f10x_fsmc.c + 0 + 0 + + + 2 + 17 + 1 + 0 + 0 + 0 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_gpio.c + stm32f10x_gpio.c + 0 + 0 + + + 2 + 18 + 1 + 0 + 0 + 0 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_i2c.c + stm32f10x_i2c.c + 0 + 0 + + + 2 + 19 + 1 + 0 + 0 + 0 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_iwdg.c + stm32f10x_iwdg.c + 0 + 0 + + + 2 + 20 + 1 + 0 + 0 + 0 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_pwr.c + stm32f10x_pwr.c + 0 + 0 + + + 2 + 21 + 1 + 0 + 0 + 0 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_rcc.c + stm32f10x_rcc.c + 0 + 0 + + + 2 + 22 + 1 + 0 + 0 + 0 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_rtc.c + stm32f10x_rtc.c + 0 + 0 + + + 2 + 23 + 1 + 0 + 0 + 0 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_sdio.c + stm32f10x_sdio.c + 0 + 0 + + + 2 + 24 + 1 + 0 + 0 + 0 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_spi.c + stm32f10x_spi.c + 0 + 0 + + + 2 + 25 + 1 + 0 + 0 + 0 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_tim.c + stm32f10x_tim.c + 0 + 0 + + + 2 + 26 + 1 + 0 + 0 + 0 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_usart.c + stm32f10x_usart.c + 0 + 0 + + + 2 + 27 + 1 + 0 + 0 + 0 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_wwdg.c + stm32f10x_wwdg.c + 0 + 0 + + + + + segger + 0 + 0 + 0 + 0 + + 3 + 28 + 1 + 0 + 0 + 0 + ..\..\..\drivers\segger_rtt\SEGGER_RTT.c + SEGGER_RTT.c + 0 + 0 + + + 3 + 29 + 1 + 0 + 0 + 0 + ..\..\..\drivers\segger_rtt\SEGGER_RTT_printf.c + SEGGER_RTT_printf.c + 0 + 0 + + + + + system + 1 + 0 + 0 + 0 + + 4 + 30 + 1 + 0 + 0 + 0 + ..\..\[base_on_stm32f1]\stm32f1_sys\tim.c + tim.c + 0 + 0 + + + 4 + 31 + 1 + 0 + 0 + 0 + ..\..\[base_on_stm32f1]\stm32f1_sys\flash.c + flash.c + 0 + 0 + + + 4 + 32 + 1 + 0 + 0 + 0 + ..\..\[base_on_stm32f1]\stm32f1_sys\usart.c + usart.c + 0 + 0 + + + 4 + 33 + 1 + 0 + 0 + 0 + ..\..\[base_on_stm32f1]\stm32f1_sys\gpio.c + gpio.c + 0 + 0 + + + + + source + 1 + 0 + 0 + 0 + + 5 + 34 + 1 + 0 + 0 + 0 + ..\..\..\drivers\bootloader\bootloader.c + bootloader.c + 0 + 0 + + + 5 + 35 + 1 + 0 + 0 + 0 + ..\..\..\drivers\common\common_include.c + common_include.c + 0 + 0 + + + 5 + 36 + 1 + 0 + 0 + 0 + ..\SRC\main.c + main.c + 0 + 0 + + + + + readme + 1 + 0 + 0 + 0 + + 6 + 37 + 5 + 0 + 0 + 0 + ..\README.txt + README.txt + 0 + 0 + + + +
diff --git a/examples/bootloader_app/MDK/use_example.uvprojx b/examples/bootloader_app/MDK/use_example.uvprojx new file mode 100644 index 0000000..ff4b562 --- /dev/null +++ b/examples/bootloader_app/MDK/use_example.uvprojx @@ -0,0 +1,617 @@ + + + + 2.1 + +
### uVision Project, (C) Keil Software
+ + + + Target 1 + 0x4 + ARM-ADS + 5060960::V5.06 update 7 (build 960)::.\ARMCC + 0 + + + STM32F103C8 + STMicroelectronics + Keil.STM32F1xx_DFP.2.4.1 + https://www.keil.com/pack/ + IRAM(0x20000000,0x00005000) IROM(0x08000000,0x00010000) CPUTYPE("Cortex-M3") CLOCK(12000000) ELITTLE + + + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32F10x_128 -FS08000000 -FL020000 -FP0($$Device:STM32F103C8$Flash\STM32F10x_128.FLM)) + 0 + $$Device:STM32F103C8$Device\Include\stm32f10x.h + + + + + + + + + + $$Device:STM32F103C8$SVD\STM32F103xx.svd + 0 + 0 + + + + + + + 0 + 0 + 0 + 0 + 1 + + .\Objects\ + use_example + 1 + 0 + 1 + 1 + 1 + .\Listings\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 1 + 0 + fromelf.exe --bin -o "$L@L.bin" "#L" + + 0 + 0 + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + SARMCM3.DLL + -REMAP + DCM.DLL + -pCM3 + SARMCM3.DLL + + TCM.DLL + -pCM3 + + + + 1 + 0 + 0 + 0 + 16 + + + + + 1 + 0 + 0 + 1 + 1 + -1 + + 1 + BIN\UL2CM3.DLL + + + + + + 0 + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M3" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 8 + 1 + 0 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x5000 + + + 1 + 0x8000000 + 0x10000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x8002c00 + 0x2800 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x5000 + + + 0 + 0x0 + 0x0 + + + + + + 1 + 1 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + 0 + 1 + 0 + 0 + 3 + 3 + 1 + 1 + 0 + 0 + 0 + + + STM32F10X_MD,USE_STDPERIPH_DRIVER + + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\inc;..\..\[base_on_stm32f1]\stm32f1_lib\cmsis;..\..\[base_on_stm32f1]\stm32f1_sys;..\..\..\drivers\common;..\..\..\drivers\segger_rtt;..\..\..\drivers\bootloader + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + + + + + + + + + 1 + 0 + 0 + 0 + 1 + 0 + 0x08000000 + 0x20000000 + + + + + + + + + + + + + cmsis + + + core_cm3.c + 1 + ..\..\[base_on_stm32f1]\stm32f1_lib\cmsis\core_cm3.c + + + stm32f10x_it.c + 1 + ..\..\[base_on_stm32f1]\stm32f1_lib\cmsis\stm32f10x_it.c + + + system_stm32f10x.c + 1 + ..\..\[base_on_stm32f1]\stm32f1_lib\cmsis\system_stm32f10x.c + + + startup_stm32f10x_md.s + 2 + ..\..\[base_on_stm32f1]\stm32f1_lib\cmsis\startup\startup_stm32f10x_md.s + + + + + libs + + + misc.c + 1 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\misc.c + + + stm32f10x_adc.c + 1 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_adc.c + + + stm32f10x_bkp.c + 1 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_bkp.c + + + stm32f10x_can.c + 1 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_can.c + + + stm32f10x_cec.c + 1 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_cec.c + + + stm32f10x_crc.c + 1 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_crc.c + + + stm32f10x_dac.c + 1 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_dac.c + + + stm32f10x_dbgmcu.c + 1 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_dbgmcu.c + + + stm32f10x_dma.c + 1 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_dma.c + + + stm32f10x_exti.c + 1 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_exti.c + + + stm32f10x_flash.c + 1 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_flash.c + + + stm32f10x_fsmc.c + 1 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_fsmc.c + + + stm32f10x_gpio.c + 1 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_gpio.c + + + stm32f10x_i2c.c + 1 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_i2c.c + + + stm32f10x_iwdg.c + 1 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_iwdg.c + + + stm32f10x_pwr.c + 1 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_pwr.c + + + stm32f10x_rcc.c + 1 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_rcc.c + + + stm32f10x_rtc.c + 1 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_rtc.c + + + stm32f10x_sdio.c + 1 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_sdio.c + + + stm32f10x_spi.c + 1 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_spi.c + + + stm32f10x_tim.c + 1 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_tim.c + + + stm32f10x_usart.c + 1 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_usart.c + + + stm32f10x_wwdg.c + 1 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_wwdg.c + + + + + segger + + + SEGGER_RTT.c + 1 + ..\..\..\drivers\segger_rtt\SEGGER_RTT.c + + + SEGGER_RTT_printf.c + 1 + ..\..\..\drivers\segger_rtt\SEGGER_RTT_printf.c + + + + + system + + + tim.c + 1 + ..\..\[base_on_stm32f1]\stm32f1_sys\tim.c + + + flash.c + 1 + ..\..\[base_on_stm32f1]\stm32f1_sys\flash.c + + + usart.c + 1 + ..\..\[base_on_stm32f1]\stm32f1_sys\usart.c + + + gpio.c + 1 + ..\..\[base_on_stm32f1]\stm32f1_sys\gpio.c + + + + + source + + + bootloader.c + 1 + ..\..\..\drivers\bootloader\bootloader.c + + + common_include.c + 1 + ..\..\..\drivers\common\common_include.c + + + main.c + 1 + ..\SRC\main.c + + + + + readme + + + README.txt + 5 + ..\README.txt + + + + + + + + + + + + + + + + + use_example + 1 + + + + +
diff --git a/examples/bootloader_app/README.txt b/examples/bootloader_app/README.txt new file mode 100644 index 0000000..1a15c68 --- /dev/null +++ b/examples/bootloader_app/README.txt @@ -0,0 +1,49 @@ +================================================================================ + 用例使用说明 +================================================================================ +Date Author MDK MCU +2024-01-21 ashuai0110 5.35 STM32F1 + +================================================================================ +功能描述 +================================================================================ +本用例展示了bootloader_app例程的使用方法,正常情况下,设备执行的是此程序。 + +================================================================================ +测试环境 +================================================================================ +测试用板: +--------------------- +任意开发板 + +辅助工具: +--------------------- +J-Link +串口工具 + +辅助软件: +--------------------- +J-Link RTT Viewer +串口上位机(需支持ymodem协议) + +源码文件: +--------------------- +bootloader.c +bootloader.h + +================================================================================ +使用步骤 +================================================================================ +1)使用J-Link连接目标板; +2)打开工程,重新编译,启动调试或直接下载程序运行; +3)该程序现象为设备led指示灯以1s周期翻转; +4)使用串口上位机先发送'@'字符再以ymodem协议发送升级bin文件; +5)查看用户设置的升级程序现象,出现预期现象则表明升级成功,若升级失败则执行备份 + (出厂)程序。 + +================================================================================ +注意 +================================================================================ +1)用户根据需求可前往源码头文件修改宏定义参数 + +================================================================================ diff --git a/examples/bootloader_app/SRC/main.c b/examples/bootloader_app/SRC/main.c new file mode 100644 index 0000000..712e6d3 --- /dev/null +++ b/examples/bootloader_app/SRC/main.c @@ -0,0 +1,105 @@ +/** + ****************************************************************************** + * @file main.c + * @author ashuai0110 + * @version V1.0 + * @date 2024-01-21 + * @brief 使用举例-bootloader_app + * + ****************************************************************************** + * @attention + * + * 版权声明:内容为编者(ashuai0110)原创,使用请注明出处,当然,你也可以不这样做^_^ + * 出处链接:https://gitee.com/ashuai0110/mcu_reuse_development_module + * + ****************************************************************************** + */ + +/* 包含头文件-----------------------------------------------------------------*/ +#include "stm32f10x.h" +#include "gpio.h" +#include "usart.h" +#include "tim.h" +#include "flash.h" + +#include "bootloader.h" + +/* 私有宏定义-----------------------------------------------------------------*/ + +/* 私有类型定义---------------------------------------------------------------*/ + +/* 私有变量-------------------------------------------------------------------*/ +uint8_t updataFlag; + +/* 全局变量-------------------------------------------------------------------*/ + +/* 私有函数原型---------------------------------------------------------------*/ + + +/** + * @brief 定时器1中断函数 + */ +void TIM1_UP_IRQHandler(void) +{ + static uint16_t cnt = 0; + + if(TIM_GetITStatus(TIM1, TIM_IT_Update) != RESET) + { + cnt++; + if(1000 < cnt) + { + cnt = 0; + gpio_toggle(LED_RUN); /* 1s周期翻转led */ + } + + TIM_ClearITPendingBit(TIM1, TIM_FLAG_Update); + } +} + +/** + * @brief 串口1中断 + */ +void USART1_IRQHandler(void) +{ + static uint8_t data; + + /* 串口1接收中断 */ + if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) { + data = USART_ReceiveData(USART1); + if('@' == data) { updataFlag = 1; } + + USART_ClearITPendingBit(USART1, USART_IT_RXNE); + } +} + +/** + * @brief main + */ +int main(int argc, char *argv[]) +{ + /* 设置向量表偏移 */ + NVIC_SetVectorTable(NVIC_VectTab_FLASH, BOOT_APP_ADDR_OFFSET); + + VERSION_LOG("example-bootloader_app", 1, 0, 0); + + /* bootloader初始化 对接MCU FLASH操作接口 */ + boot_init(flash_erase, flash_read, flash_write); + + /* led端口初始化 */ + gpio_init_config(); + /* 串口初始化 115200bps */ + usart1_init_config(115200); + /* 定时器初始化 1ms */ + tim1_init_config(100-1, 720-1); + + while(1) + { + if(updataFlag) + { + updataFlag = 0; + boot_program_updata_flag(BOOT_UPDATA_FLAG); /* 设置需升级标志 */ + NVIC_SystemReset(); /* MCU重启 */ + } + } +} + -- Gitee From c39fabee5bc4e347d8280d3da2fabf06fd964dc6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=98=BF=E8=A1=B00110?= Date: Sun, 21 Jan 2024 23:35:06 +0800 Subject: [PATCH 55/66] =?UTF-8?q?#I8X0KR=20bootloader=5Ffactory(=E5=A4=87?= =?UTF-8?q?=E4=BB=BD=E7=A8=8B=E5=BA=8F)=E4=BE=8B=E7=A8=8B=E5=9F=BA?= =?UTF-8?q?=E6=9C=AC=E5=AE=8C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bootloader_factory/MDK/use_example.uvoptx | 746 ++++++++++++++++++ .../MDK/use_example.uvprojx | 617 +++++++++++++++ examples/bootloader_factory/README.txt | 49 ++ examples/bootloader_factory/SRC/main.c | 105 +++ 4 files changed, 1517 insertions(+) create mode 100644 examples/bootloader_factory/MDK/use_example.uvoptx create mode 100644 examples/bootloader_factory/MDK/use_example.uvprojx create mode 100644 examples/bootloader_factory/README.txt create mode 100644 examples/bootloader_factory/SRC/main.c diff --git a/examples/bootloader_factory/MDK/use_example.uvoptx b/examples/bootloader_factory/MDK/use_example.uvoptx new file mode 100644 index 0000000..f6855f6 --- /dev/null +++ b/examples/bootloader_factory/MDK/use_example.uvoptx @@ -0,0 +1,746 @@ + + + + 1.0 + +
### uVision Project, (C) Keil Software
+ + + *.c + *.s*; *.src; *.a* + *.obj; *.o + *.lib + *.txt; *.h; *.inc; *.md + *.plm + *.cpp; *.cc; *.cxx + 0 + + + + 0 + 0 + + + + Target 1 + 0x4 + ARM-ADS + + 12000000 + + 1 + 1 + 0 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\Listings\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 18 + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 1 + 0 + 0 + 1 + 0 + 0 + 4 + + + + + + + + + + + Segger\JL2CM3.dll + + + + 0 + ARMRTXEVENTFLAGS + -L70 -Z18 -C0 -M0 -T1 + + + 0 + DLGTARM + (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0) + + + 0 + ARMDBGFLAGS + + + + 0 + DLGUARM + d + + + 0 + JL2CM3 + -U59522627 -O78 -S2 -ZTIFSpeedSel5000 -A0 -C0 -JU1 -JI127.0.0.1 -JP0 -RST0 -N00("ARM CoreSight SW-DP") -D00(1BA01477) -L00(0) -TO18 -TC10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -TB1 -TFE0 -FO15 -FD20000000 -FC1000 -FN1 -FF0STM32F10x_128.FLM -FS08000000 -FL020000 -FP0($$Device:STM32F103C8$Flash\STM32F10x_128.FLM) + + + 0 + UL2CM3 + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32F10x_128 -FS08000000 -FL020000 -FP0($$Device:STM32F103C8$Flash\STM32F10x_128.FLM)) + + + + + + 0 + 1 + usart1DmaRxBuf + + + 1 + 1 + dataBuf + + + 2 + 1 + len + + + 3 + 1 + tickTmp + + + 4 + 1 + moduleTick + + + 5 + 1 + xmodem + + + 6 + 1 + xmodemBuf + + + 7 + 1 + crc16 + + + + + 1 + 0 + 0x8004000 + 0 + + + + 0 + + + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + 0 + 0 + 0 + + + + + + + + + + 1 + 1 + 0 + 2 + 10000000 + + + + + + cmsis + 1 + 0 + 0 + 0 + + 1 + 1 + 1 + 0 + 0 + 0 + ..\..\[base_on_stm32f1]\stm32f1_lib\cmsis\core_cm3.c + core_cm3.c + 0 + 0 + + + 1 + 2 + 1 + 0 + 0 + 0 + ..\..\[base_on_stm32f1]\stm32f1_lib\cmsis\stm32f10x_it.c + stm32f10x_it.c + 0 + 0 + + + 1 + 3 + 1 + 0 + 0 + 0 + ..\..\[base_on_stm32f1]\stm32f1_lib\cmsis\system_stm32f10x.c + system_stm32f10x.c + 0 + 0 + + + 1 + 4 + 2 + 0 + 0 + 0 + ..\..\[base_on_stm32f1]\stm32f1_lib\cmsis\startup\startup_stm32f10x_md.s + startup_stm32f10x_md.s + 0 + 0 + + + + + libs + 0 + 0 + 0 + 0 + + 2 + 5 + 1 + 0 + 0 + 0 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\misc.c + misc.c + 0 + 0 + + + 2 + 6 + 1 + 0 + 0 + 0 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_adc.c + stm32f10x_adc.c + 0 + 0 + + + 2 + 7 + 1 + 0 + 0 + 0 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_bkp.c + stm32f10x_bkp.c + 0 + 0 + + + 2 + 8 + 1 + 0 + 0 + 0 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_can.c + stm32f10x_can.c + 0 + 0 + + + 2 + 9 + 1 + 0 + 0 + 0 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_cec.c + stm32f10x_cec.c + 0 + 0 + + + 2 + 10 + 1 + 0 + 0 + 0 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_crc.c + stm32f10x_crc.c + 0 + 0 + + + 2 + 11 + 1 + 0 + 0 + 0 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_dac.c + stm32f10x_dac.c + 0 + 0 + + + 2 + 12 + 1 + 0 + 0 + 0 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_dbgmcu.c + stm32f10x_dbgmcu.c + 0 + 0 + + + 2 + 13 + 1 + 0 + 0 + 0 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_dma.c + stm32f10x_dma.c + 0 + 0 + + + 2 + 14 + 1 + 0 + 0 + 0 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_exti.c + stm32f10x_exti.c + 0 + 0 + + + 2 + 15 + 1 + 0 + 0 + 0 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_flash.c + stm32f10x_flash.c + 0 + 0 + + + 2 + 16 + 1 + 0 + 0 + 0 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_fsmc.c + stm32f10x_fsmc.c + 0 + 0 + + + 2 + 17 + 1 + 0 + 0 + 0 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_gpio.c + stm32f10x_gpio.c + 0 + 0 + + + 2 + 18 + 1 + 0 + 0 + 0 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_i2c.c + stm32f10x_i2c.c + 0 + 0 + + + 2 + 19 + 1 + 0 + 0 + 0 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_iwdg.c + stm32f10x_iwdg.c + 0 + 0 + + + 2 + 20 + 1 + 0 + 0 + 0 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_pwr.c + stm32f10x_pwr.c + 0 + 0 + + + 2 + 21 + 1 + 0 + 0 + 0 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_rcc.c + stm32f10x_rcc.c + 0 + 0 + + + 2 + 22 + 1 + 0 + 0 + 0 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_rtc.c + stm32f10x_rtc.c + 0 + 0 + + + 2 + 23 + 1 + 0 + 0 + 0 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_sdio.c + stm32f10x_sdio.c + 0 + 0 + + + 2 + 24 + 1 + 0 + 0 + 0 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_spi.c + stm32f10x_spi.c + 0 + 0 + + + 2 + 25 + 1 + 0 + 0 + 0 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_tim.c + stm32f10x_tim.c + 0 + 0 + + + 2 + 26 + 1 + 0 + 0 + 0 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_usart.c + stm32f10x_usart.c + 0 + 0 + + + 2 + 27 + 1 + 0 + 0 + 0 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_wwdg.c + stm32f10x_wwdg.c + 0 + 0 + + + + + segger + 0 + 0 + 0 + 0 + + 3 + 28 + 1 + 0 + 0 + 0 + ..\..\..\drivers\segger_rtt\SEGGER_RTT.c + SEGGER_RTT.c + 0 + 0 + + + 3 + 29 + 1 + 0 + 0 + 0 + ..\..\..\drivers\segger_rtt\SEGGER_RTT_printf.c + SEGGER_RTT_printf.c + 0 + 0 + + + + + system + 1 + 0 + 0 + 0 + + 4 + 30 + 1 + 0 + 0 + 0 + ..\..\[base_on_stm32f1]\stm32f1_sys\tim.c + tim.c + 0 + 0 + + + 4 + 31 + 1 + 0 + 0 + 0 + ..\..\[base_on_stm32f1]\stm32f1_sys\flash.c + flash.c + 0 + 0 + + + 4 + 32 + 1 + 0 + 0 + 0 + ..\..\[base_on_stm32f1]\stm32f1_sys\usart.c + usart.c + 0 + 0 + + + 4 + 33 + 1 + 0 + 0 + 0 + ..\..\[base_on_stm32f1]\stm32f1_sys\gpio.c + gpio.c + 0 + 0 + + + + + source + 1 + 0 + 0 + 0 + + 5 + 34 + 1 + 0 + 0 + 0 + ..\..\..\drivers\bootloader\bootloader.c + bootloader.c + 0 + 0 + + + 5 + 35 + 1 + 0 + 0 + 0 + ..\..\..\drivers\common\common_include.c + common_include.c + 0 + 0 + + + 5 + 36 + 1 + 0 + 0 + 0 + ..\SRC\main.c + main.c + 0 + 0 + + + + + readme + 1 + 0 + 0 + 0 + + 6 + 37 + 5 + 0 + 0 + 0 + ..\README.txt + README.txt + 0 + 0 + + + +
diff --git a/examples/bootloader_factory/MDK/use_example.uvprojx b/examples/bootloader_factory/MDK/use_example.uvprojx new file mode 100644 index 0000000..8c6d6ad --- /dev/null +++ b/examples/bootloader_factory/MDK/use_example.uvprojx @@ -0,0 +1,617 @@ + + + + 2.1 + +
### uVision Project, (C) Keil Software
+ + + + Target 1 + 0x4 + ARM-ADS + 5060960::V5.06 update 7 (build 960)::.\ARMCC + 0 + + + STM32F103C8 + STMicroelectronics + Keil.STM32F1xx_DFP.2.4.1 + https://www.keil.com/pack/ + IRAM(0x20000000,0x00005000) IROM(0x08000000,0x00010000) CPUTYPE("Cortex-M3") CLOCK(12000000) ELITTLE + + + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32F10x_128 -FS08000000 -FL020000 -FP0($$Device:STM32F103C8$Flash\STM32F10x_128.FLM)) + 0 + $$Device:STM32F103C8$Device\Include\stm32f10x.h + + + + + + + + + + $$Device:STM32F103C8$SVD\STM32F103xx.svd + 0 + 0 + + + + + + + 0 + 0 + 0 + 0 + 1 + + .\Objects\ + use_example + 1 + 0 + 1 + 1 + 1 + .\Listings\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 1 + 0 + fromelf.exe --bin -o "$L@L.bin" "#L" + + 0 + 0 + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + SARMCM3.DLL + -REMAP + DCM.DLL + -pCM3 + SARMCM3.DLL + + TCM.DLL + -pCM3 + + + + 1 + 0 + 0 + 0 + 16 + + + + + 1 + 0 + 0 + 1 + 1 + -1 + + 1 + BIN\UL2CM3.DLL + + + + + + 0 + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M3" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 8 + 1 + 0 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x5000 + + + 1 + 0x8000000 + 0x10000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x8005400 + 0x2800 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x5000 + + + 0 + 0x0 + 0x0 + + + + + + 1 + 1 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + 0 + 1 + 0 + 0 + 3 + 3 + 1 + 1 + 0 + 0 + 0 + + + STM32F10X_MD,USE_STDPERIPH_DRIVER + + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\inc;..\..\[base_on_stm32f1]\stm32f1_lib\cmsis;..\..\[base_on_stm32f1]\stm32f1_sys;..\..\..\drivers\common;..\..\..\drivers\segger_rtt;..\..\..\drivers\bootloader + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + + + + + + + + + 1 + 0 + 0 + 0 + 1 + 0 + 0x08000000 + 0x20000000 + + + + + + + + + + + + + cmsis + + + core_cm3.c + 1 + ..\..\[base_on_stm32f1]\stm32f1_lib\cmsis\core_cm3.c + + + stm32f10x_it.c + 1 + ..\..\[base_on_stm32f1]\stm32f1_lib\cmsis\stm32f10x_it.c + + + system_stm32f10x.c + 1 + ..\..\[base_on_stm32f1]\stm32f1_lib\cmsis\system_stm32f10x.c + + + startup_stm32f10x_md.s + 2 + ..\..\[base_on_stm32f1]\stm32f1_lib\cmsis\startup\startup_stm32f10x_md.s + + + + + libs + + + misc.c + 1 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\misc.c + + + stm32f10x_adc.c + 1 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_adc.c + + + stm32f10x_bkp.c + 1 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_bkp.c + + + stm32f10x_can.c + 1 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_can.c + + + stm32f10x_cec.c + 1 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_cec.c + + + stm32f10x_crc.c + 1 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_crc.c + + + stm32f10x_dac.c + 1 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_dac.c + + + stm32f10x_dbgmcu.c + 1 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_dbgmcu.c + + + stm32f10x_dma.c + 1 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_dma.c + + + stm32f10x_exti.c + 1 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_exti.c + + + stm32f10x_flash.c + 1 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_flash.c + + + stm32f10x_fsmc.c + 1 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_fsmc.c + + + stm32f10x_gpio.c + 1 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_gpio.c + + + stm32f10x_i2c.c + 1 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_i2c.c + + + stm32f10x_iwdg.c + 1 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_iwdg.c + + + stm32f10x_pwr.c + 1 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_pwr.c + + + stm32f10x_rcc.c + 1 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_rcc.c + + + stm32f10x_rtc.c + 1 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_rtc.c + + + stm32f10x_sdio.c + 1 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_sdio.c + + + stm32f10x_spi.c + 1 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_spi.c + + + stm32f10x_tim.c + 1 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_tim.c + + + stm32f10x_usart.c + 1 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_usart.c + + + stm32f10x_wwdg.c + 1 + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\src\stm32f10x_wwdg.c + + + + + segger + + + SEGGER_RTT.c + 1 + ..\..\..\drivers\segger_rtt\SEGGER_RTT.c + + + SEGGER_RTT_printf.c + 1 + ..\..\..\drivers\segger_rtt\SEGGER_RTT_printf.c + + + + + system + + + tim.c + 1 + ..\..\[base_on_stm32f1]\stm32f1_sys\tim.c + + + flash.c + 1 + ..\..\[base_on_stm32f1]\stm32f1_sys\flash.c + + + usart.c + 1 + ..\..\[base_on_stm32f1]\stm32f1_sys\usart.c + + + gpio.c + 1 + ..\..\[base_on_stm32f1]\stm32f1_sys\gpio.c + + + + + source + + + bootloader.c + 1 + ..\..\..\drivers\bootloader\bootloader.c + + + common_include.c + 1 + ..\..\..\drivers\common\common_include.c + + + main.c + 1 + ..\SRC\main.c + + + + + readme + + + README.txt + 5 + ..\README.txt + + + + + + + + + + + + + + + + + use_example + 1 + + + + +
diff --git a/examples/bootloader_factory/README.txt b/examples/bootloader_factory/README.txt new file mode 100644 index 0000000..7ce348e --- /dev/null +++ b/examples/bootloader_factory/README.txt @@ -0,0 +1,49 @@ +================================================================================ + 用例使用说明 +================================================================================ +Date Author MDK MCU +2024-01-21 ashuai0110 5.35 STM32F1 + +================================================================================ +功能描述 +================================================================================ +本用例展示了bootloader_factory例程的使用方法,该例程为备份(出厂)程序,升级失败后会 +跳转到此程序执行。 + +================================================================================ +测试环境 +================================================================================ +测试用板: +--------------------- +任意开发板 + +辅助工具: +--------------------- +J-Link +串口工具 + +辅助软件: +--------------------- +J-Link RTT Viewer +串口上位机(需支持ymodem协议) + +源码文件: +--------------------- +bootloader.c +bootloader.h + +================================================================================ +使用步骤 +================================================================================ +1)使用J-Link连接目标板; +2)打开工程,重新编译,启动调试或直接下载程序运行; +3)该程序现象为设备led指示灯以500ms周期翻转; +4)使用串口上位机先发送'@'字符再以ymodem协议发送升级bin文件; +5)查看用户设置的升级程序现象,出现预期现象则表明升级成功。 + +================================================================================ +注意 +================================================================================ +1)用户根据需求可前往源码头文件修改宏定义参数 + +================================================================================ diff --git a/examples/bootloader_factory/SRC/main.c b/examples/bootloader_factory/SRC/main.c new file mode 100644 index 0000000..c4481bc --- /dev/null +++ b/examples/bootloader_factory/SRC/main.c @@ -0,0 +1,105 @@ +/** + ****************************************************************************** + * @file main.c + * @author ashuai0110 + * @version V1.0 + * @date 2024-01-21 + * @brief 使用举例-bootloader_factory + * + ****************************************************************************** + * @attention + * + * 版权声明:内容为编者(ashuai0110)原创,使用请注明出处,当然,你也可以不这样做^_^ + * 出处链接:https://gitee.com/ashuai0110/mcu_reuse_development_module + * + ****************************************************************************** + */ + +/* 包含头文件-----------------------------------------------------------------*/ +#include "stm32f10x.h" +#include "gpio.h" +#include "usart.h" +#include "tim.h" +#include "flash.h" + +#include "bootloader.h" + +/* 私有宏定义-----------------------------------------------------------------*/ + +/* 私有类型定义---------------------------------------------------------------*/ + +/* 私有变量-------------------------------------------------------------------*/ +uint8_t updataFlag; + +/* 全局变量-------------------------------------------------------------------*/ + +/* 私有函数原型---------------------------------------------------------------*/ + + +/** + * @brief 定时器1中断函数 + */ +void TIM1_UP_IRQHandler(void) +{ + static uint16_t cnt = 0; + + if(TIM_GetITStatus(TIM1, TIM_IT_Update) != RESET) + { + cnt++; + if(500 < cnt) + { + cnt = 0; + gpio_toggle(LED_RUN); /* 500ms周期翻转led */ + } + + TIM_ClearITPendingBit(TIM1, TIM_FLAG_Update); + } +} + +/** + * @brief 串口1中断 + */ +void USART1_IRQHandler(void) +{ + static uint8_t data; + + /* 串口1接收中断 */ + if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) { + data = USART_ReceiveData(USART1); + if('@' == data) { updataFlag = 1; } + + USART_ClearITPendingBit(USART1, USART_IT_RXNE); + } +} + +/** + * @brief main + */ +int main(int argc, char *argv[]) +{ + /* 设置向量表偏移 */ + NVIC_SetVectorTable(NVIC_VectTab_FLASH, BOOT_FACTORY_ADDR_OFFSET); + + VERSION_LOG("example-bootloader_factory", 1, 0, 0); + + /* bootloader初始化 对接MCU FLASH操作接口 */ + boot_init(flash_erase, flash_read, flash_write); + + /* led端口初始化 */ + gpio_init_config(); + /* 串口初始化 115200bps */ + usart1_init_config(115200); + /* 定时器初始化 1ms */ + tim1_init_config(100-1, 720-1); + + while(1) + { + if(updataFlag) + { + updataFlag = 0; + boot_program_updata_flag(BOOT_UPDATA_FLAG); /* 设置需升级标志 */ + NVIC_SystemReset(); /* MCU重启 */ + } + } +} + -- Gitee From fe203405f493974904b2840feb31a6e51d6cb645 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=98=BF=E8=A1=B00110?= Date: Mon, 22 Jan 2024 22:12:52 +0800 Subject: [PATCH 56/66] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E4=B8=B2=E5=8F=A3?= =?UTF-8?q?=E7=AE=A1=E7=90=86=E4=BE=8B=E7=A8=8B,=E6=97=A0=E5=85=B3?= =?UTF-8?q?=E7=B4=A7=E8=A6=81=E7=9A=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- examples/uart_handler/README.txt | 2 +- examples/uart_handler/SRC/main.c | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/examples/uart_handler/README.txt b/examples/uart_handler/README.txt index bc67741..e03e65f 100644 --- a/examples/uart_handler/README.txt +++ b/examples/uart_handler/README.txt @@ -2,7 +2,7 @@ 用例使用说明 ================================================================================ Date Author MDK MCU -2024-01-18 ashuai0110 5.35 STM32F1 +2024-01-22 ashuai0110 5.35 STM32F1 ================================================================================ 功能描述 diff --git a/examples/uart_handler/SRC/main.c b/examples/uart_handler/SRC/main.c index ef54bde..798067f 100644 --- a/examples/uart_handler/SRC/main.c +++ b/examples/uart_handler/SRC/main.c @@ -3,7 +3,7 @@ * @file main.c * @author ashuai0110 * @version V1.0 - * @date 2024-01-18 + * @date 2024-01-22 * @brief 使用举例-串口管理 * ****************************************************************************** @@ -81,7 +81,7 @@ void USART1_IRQHandler(void) { /* 读出发送缓存 */ ret = uart_hr_read_tx_buf(USART1_UART_HR_CH, &txData, 1); - if(0 != ret) + if(1 == ret) { USART_SendData(USART1, txData); } -- Gitee From 5868d699d68e28fb6fc498662f6f1e60835697b5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=98=BF=E8=A1=B00110?= Date: Mon, 22 Jan 2024 22:14:05 +0800 Subject: [PATCH 57/66] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=8F=91=E9=80=81?= =?UTF-8?q?=E7=BC=93=E5=AD=98=E8=AF=BB=E5=87=BA=E5=AE=8C=E6=AF=95=E5=85=B3?= =?UTF-8?q?=E9=97=AD=E5=8F=91=E9=80=81=E4=B8=AD=E6=96=AD=E7=9A=84=E5=A4=84?= =?UTF-8?q?=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- drivers/bootloader/xmodem.c | 7 ++++++- drivers/bootloader/xmodem.h | 2 +- drivers/bootloader/ymodem.c | 7 ++++++- drivers/bootloader/ymodem.h | 2 +- 4 files changed, 14 insertions(+), 4 deletions(-) diff --git a/drivers/bootloader/xmodem.c b/drivers/bootloader/xmodem.c index 25375ad..4b1bc50 100644 --- a/drivers/bootloader/xmodem.c +++ b/drivers/bootloader/xmodem.c @@ -3,7 +3,7 @@ * @file xmodem.c * @author ashuai0110 * @version V1.0 - * @date 2024-01-21 + * @date 2024-01-22 * @brief xmodem协议 * ****************************************************************************** @@ -17,6 +17,7 @@ * 2024-01-07 ashuai0110 完成基本内容 * 2024-01-14 ashuai0110 修改接收使用校验和的逻辑错误,增加一些协议信息的宏定义 * 2024-01-21 ashuai0110 增加收发轮询处理返回状态,优化逻辑 + * 2024-01-22 ashuai0110 增加发送缓存读出完毕关闭发送中断的处理 * ****************************************************************************** */ @@ -581,6 +582,10 @@ uint16_t xmodem_read_tx_buf(xmodem_t *_xmodem, void *pBuf, uint16_t len) _xmodem->rspTimeoutCnt = module_tick_get(); /*开启回复超时计数*/ } } + else + { + _xmodem->txEnFn(0); /* 关闭发送中断 */ + } return len; } diff --git a/drivers/bootloader/xmodem.h b/drivers/bootloader/xmodem.h index 067189a..1e9490b 100644 --- a/drivers/bootloader/xmodem.h +++ b/drivers/bootloader/xmodem.h @@ -3,7 +3,7 @@ * @file xmodem.h * @author ashuai0110 * @version V1.0 - * @date 2024-01-21 + * @date 2024-01-22 * @brief xmodem协议 * ****************************************************************************** diff --git a/drivers/bootloader/ymodem.c b/drivers/bootloader/ymodem.c index f6d98ce..e6ed7c2 100644 --- a/drivers/bootloader/ymodem.c +++ b/drivers/bootloader/ymodem.c @@ -3,7 +3,7 @@ * @file ymodem.c * @author ashuai0110 * @version V1.0 - * @date 2024-01-21 + * @date 2024-01-22 * @brief ymodem协议 * ****************************************************************************** @@ -16,6 +16,7 @@ * Date Author Notes * 2024-01-17 ashuai0110 完成基本内容 * 2024-01-21 ashuai0110 增加收发轮询处理返回状态 + * 2024-01-22 ashuai0110 增加发送缓存读出完毕关闭发送中断的处理 * ****************************************************************************** */ @@ -641,6 +642,10 @@ uint16_t ymodem_read_tx_buf(ymodem_t *_ymodem, void *pBuf, uint16_t len) _ymodem->rspTimeoutCnt = module_tick_get(); /*开启回复超时计数*/ } } + else + { + _ymodem->txEnFn(0); /* 关闭发送中断 */ + } return len; } diff --git a/drivers/bootloader/ymodem.h b/drivers/bootloader/ymodem.h index 3aa214b..8415649 100644 --- a/drivers/bootloader/ymodem.h +++ b/drivers/bootloader/ymodem.h @@ -3,7 +3,7 @@ * @file ymodem.h * @author ashuai0110 * @version V1.0 - * @date 2024-01-21 + * @date 2024-01-22 * @brief ymodem协议 * ****************************************************************************** -- Gitee From 80e628dfedd5aa8017aab61b9652b7c45292dbcc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=98=BF=E8=A1=B00110?= Date: Mon, 22 Jan 2024 22:14:27 +0800 Subject: [PATCH 58/66] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=BC=80=E5=85=B3?= =?UTF-8?q?=E5=AE=8F=E5=AE=9A=E4=B9=89=E6=B3=A8=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- drivers/common/common_include.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/drivers/common/common_include.h b/drivers/common/common_include.h index db482e3..9db146e 100644 --- a/drivers/common/common_include.h +++ b/drivers/common/common_include.h @@ -54,7 +54,7 @@ extern "C" { #define RET_ERR (1u) /*!< 失败,错误 */ #define RET_ING (2u) /*!< 进行中 */ #define RET_TIMEOUT (3u) /*!< 超时 */ -#define RET_FULL (4u) /*!< 已满 */ +#define RET_FULL (4u) /*!< 已满/溢出 */ #define RET_LEN_ERR (5u) /*!< 长度错误 */ #define RET_CHECK_ERR (6u) /*!< 校验错误 */ #define RET_FRAME_ERR (7u) /*!< 格式错误 */ @@ -66,7 +66,7 @@ extern "C" { * @defgroup print_log_macros print log macros * @{ */ -#define _USE_PRINT_LOG (1u) +#define _USE_PRINT_LOG (1u) /*!< 打印接口开关 0:关闭 1:打开 */ #if _USE_PRINT_LOG #include "SEGGER_RTT.h" /* 普通级别日志输出 */ @@ -259,7 +259,7 @@ extern "C" { * @defgroup parameter_check_macros parameter check macros * @{ */ -#define _USE_ASSERT_PARAM (1u) +#define _USE_ASSERT_PARAM (1u) /*!< 参数检查开关 0:关闭 1:打开 */ #if _USE_ASSERT_PARAM /* 参数检查 */ #ifndef ASSERT_PARAM -- Gitee From a354bb65fe071e0e2b366f07565ff3ec2a82598d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=98=BF=E8=A1=B00110?= Date: Mon, 22 Jan 2024 22:21:02 +0800 Subject: [PATCH 59/66] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=B3=A8=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- drivers/bootloader/bootloader.c | 31 ++++++++++++++++++++------ drivers/bootloader/bootloader.h | 2 +- examples/bootloader/README.txt | 2 +- examples/bootloader_app/SRC/main.c | 7 +++--- examples/bootloader_factory/SRC/main.c | 7 +++--- 5 files changed, 34 insertions(+), 15 deletions(-) diff --git a/drivers/bootloader/bootloader.c b/drivers/bootloader/bootloader.c index f768284..2c45c1f 100644 --- a/drivers/bootloader/bootloader.c +++ b/drivers/bootloader/bootloader.c @@ -3,7 +3,7 @@ * @file bootloader.c * @author ashuai0110 * @version V1.0 - * @date 2024-01-21 + * @date 2024-01-22 * @brief 升级引导程序 * ****************************************************************************** @@ -111,6 +111,7 @@ void boot_init(boot_flash_erase_fn_t flashErase, boot_flash_rw_fn_t flashRead, b bootCtrl.flashWriteFn = flashWrite; /* 读取FLASH中的内存参数 */ bootCtrl.flashReadFn(BOOT_FLASH_START_ADDR + BOOT_INFO_ADDR_OFFSET, (void *)&bootCtrl.bootInfo, sizeof(boot_info_t)); + /* 未写入过则写入初值 */ if(0xFFFF == bootCtrl.bootInfo.appVersion) { bootCtrl.bootInfo.appVersion = 0; } if(0xFFFF == bootCtrl.bootInfo.bootVersion) { bootCtrl.bootInfo.bootVersion = BOOT_VERSION; } } @@ -148,13 +149,17 @@ void boot_check_updata_flag(void) * * @param appSize : 应用程序大小 * - * @retval 0:擦除成功 1:擦除失败 2:参数有误 + * @retval 擦除状态 + * @arg RET_OK : 擦除成功 + * @arg RET_ERR : 擦除失败 + * @arg RET_FULL : 超出APP大小 */ uint8_t boot_erase_application(uint32_t appSize) { uint8_t ret; - if(4 >= appSize || BOOT_APP_SIZE_MAX < appSize) { return 2; } + /* 参数若超出应用程序最大大小则返回RET_FULL */ + if(4 >= appSize || BOOT_APP_SIZE_MAX < appSize) { return RET_FULL; } /* 擦除应用程序FLASH区域 */ ret = bootCtrl.flashEraseFn(BOOT_FLASH_START_ADDR + BOOT_APP_ADDR_OFFSET, ALIGN_UP(appSize, BOOT_FLASH_PAGE_SIZE) / BOOT_FLASH_PAGE_SIZE); @@ -165,14 +170,22 @@ uint8_t boot_erase_application(uint32_t appSize) /** * @brief 编程应用程序FLASH区域 * - * @param appSize : 应用程序大小 + * @param data : 数据缓冲区 + * + * @param len : 写入数量byte * - * @retval 0:擦除成功 1:擦除失败 + * @retval 编程状态 + * @arg RET_OK : 编程成功 + * @arg RET_ERR : 编程失败 + * @arg RET_FULL : 超出APP大小 */ uint8_t boot_program_application(void *data, uint16_t len) { uint8_t ret; + /* 写入数量若超出应用程序最大大小则返回RET_FULL */ + if(BOOT_APP_SIZE_MAX < (bootCtrl.writedSize + len)) { return RET_FULL; } + ret = bootCtrl.flashWriteFn(BOOT_FLASH_START_ADDR + BOOT_APP_ADDR_OFFSET + bootCtrl.writedSize, data, len); /* 编程应用程序FLASH区域 */ bootCtrl.writedSize += len; /* 记录已写入大小 */ @@ -192,8 +205,10 @@ void boot_program_updata_flag(uint32_t updataFlag) { ASSERT_PARAM(IS_VALID_UPDATA_FLAG(updataFlag)); - bootCtrl.bootInfo.updataFlag = updataFlag; + bootCtrl.bootInfo.updataFlag = updataFlag; /* 赋值升级标志 */ + /* 先擦除升级信息FLASH区域 */ bootCtrl.flashEraseFn(BOOT_FLASH_START_ADDR + BOOT_INFO_ADDR_OFFSET, 1); + /* 再编程升级信息FLASH区域 */ bootCtrl.flashWriteFn(BOOT_FLASH_START_ADDR + BOOT_INFO_ADDR_OFFSET, (void *)&bootCtrl.bootInfo, sizeof(boot_info_t)); } @@ -208,8 +223,10 @@ void boot_program_updata_flag(uint32_t updataFlag) */ void boot_program_app_version(uint16_t appVersion) { - bootCtrl.bootInfo.appVersion = appVersion; + bootCtrl.bootInfo.appVersion = appVersion; /* 赋值应用程序版本 */ + /* 先擦除升级信息FLASH区域 */ bootCtrl.flashEraseFn(BOOT_FLASH_START_ADDR + BOOT_INFO_ADDR_OFFSET, 1); + /* 再编程升级信息FLASH区域 */ bootCtrl.flashWriteFn(BOOT_FLASH_START_ADDR + BOOT_INFO_ADDR_OFFSET, (void *)&bootCtrl.bootInfo, sizeof(boot_info_t)); } diff --git a/drivers/bootloader/bootloader.h b/drivers/bootloader/bootloader.h index a71057a..9c252d7 100644 --- a/drivers/bootloader/bootloader.h +++ b/drivers/bootloader/bootloader.h @@ -3,7 +3,7 @@ * @file bootloader.h * @author ashuai0110 * @version V1.0 - * @date 2024-01-21 + * @date 2024-01-22 * @brief 升级引导程序 * ****************************************************************************** diff --git a/examples/bootloader/README.txt b/examples/bootloader/README.txt index 6ffda2a..e14e932 100644 --- a/examples/bootloader/README.txt +++ b/examples/bootloader/README.txt @@ -2,7 +2,7 @@ 用例使用说明 ================================================================================ Date Author MDK MCU -2024-01-18 ashuai0110 5.35 STM32F1 +2024-01-22 ashuai0110 5.35 STM32F1 ================================================================================ 功能描述 diff --git a/examples/bootloader_app/SRC/main.c b/examples/bootloader_app/SRC/main.c index 712e6d3..fd8cc5d 100644 --- a/examples/bootloader_app/SRC/main.c +++ b/examples/bootloader_app/SRC/main.c @@ -29,7 +29,7 @@ /* 私有类型定义---------------------------------------------------------------*/ /* 私有变量-------------------------------------------------------------------*/ -uint8_t updataFlag; +uint8_t updataFlag; /* 升级标志变量 */ /* 全局变量-------------------------------------------------------------------*/ @@ -66,7 +66,7 @@ void USART1_IRQHandler(void) /* 串口1接收中断 */ if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) { data = USART_ReceiveData(USART1); - if('@' == data) { updataFlag = 1; } + if('@' == data) { updataFlag = 1; } /* 收到@字符将升级标志变量置位 */ USART_ClearITPendingBit(USART1, USART_IT_RXNE); } @@ -94,10 +94,11 @@ int main(int argc, char *argv[]) while(1) { + /* 升级标志变量置位则跳转到bootloader进行升级 */ if(updataFlag) { updataFlag = 0; - boot_program_updata_flag(BOOT_UPDATA_FLAG); /* 设置需升级标志 */ + boot_program_updata_flag(BOOT_UPDATA_FLAG); /* 设置bootloader升级标志 */ NVIC_SystemReset(); /* MCU重启 */ } } diff --git a/examples/bootloader_factory/SRC/main.c b/examples/bootloader_factory/SRC/main.c index c4481bc..d15565c 100644 --- a/examples/bootloader_factory/SRC/main.c +++ b/examples/bootloader_factory/SRC/main.c @@ -29,7 +29,7 @@ /* 私有类型定义---------------------------------------------------------------*/ /* 私有变量-------------------------------------------------------------------*/ -uint8_t updataFlag; +uint8_t updataFlag; /* 升级标志变量 */ /* 全局变量-------------------------------------------------------------------*/ @@ -66,7 +66,7 @@ void USART1_IRQHandler(void) /* 串口1接收中断 */ if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) { data = USART_ReceiveData(USART1); - if('@' == data) { updataFlag = 1; } + if('@' == data) { updataFlag = 1; } /* 收到@字符将升级标志变量置位 */ USART_ClearITPendingBit(USART1, USART_IT_RXNE); } @@ -94,10 +94,11 @@ int main(int argc, char *argv[]) while(1) { + /* 升级标志变量置位则跳转到bootloader进行升级 */ if(updataFlag) { updataFlag = 0; - boot_program_updata_flag(BOOT_UPDATA_FLAG); /* 设置需升级标志 */ + boot_program_updata_flag(BOOT_UPDATA_FLAG); /* 设置bootloader升级标志 */ NVIC_SystemReset(); /* MCU重启 */ } } -- Gitee From 5b2c02dd5d8e9db348f5f8053419b16e6e59d518 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=98=BF=E8=A1=B00110?= Date: Mon, 22 Jan 2024 22:23:01 +0800 Subject: [PATCH 60/66] =?UTF-8?q?=E4=BF=AE=E6=94=B9bootloader=E4=BE=8B?= =?UTF-8?q?=E7=A8=8B=E4=BD=BF=E7=94=A8=E4=B8=B2=E5=8F=A3=E4=B8=AD=E6=96=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- examples/bootloader/MDK/use_example.uvoptx | 12 +- examples/bootloader/MDK/use_example.uvprojx | 10 +- examples/bootloader/SRC/main.c | 141 ++++++-------------- 3 files changed, 55 insertions(+), 108 deletions(-) diff --git a/examples/bootloader/MDK/use_example.uvoptx b/examples/bootloader/MDK/use_example.uvoptx index d523001..345c97b 100644 --- a/examples/bootloader/MDK/use_example.uvoptx +++ b/examples/bootloader/MDK/use_example.uvoptx @@ -641,8 +641,8 @@ 0 0 0 - ..\..\[base_on_stm32f1]\stm32f1_sys\usart_dma.c - usart_dma.c + ..\..\[base_on_stm32f1]\stm32f1_sys\tim.c + tim.c 0 0
@@ -653,8 +653,8 @@ 0 0 0 - ..\..\[base_on_stm32f1]\stm32f1_sys\tim.c - tim.c + ..\..\[base_on_stm32f1]\stm32f1_sys\flash.c + flash.c 0 0 @@ -665,8 +665,8 @@ 0 0 0 - ..\..\[base_on_stm32f1]\stm32f1_sys\flash.c - flash.c + ..\..\[base_on_stm32f1]\stm32f1_sys\usart.c + usart.c 0 0 diff --git a/examples/bootloader/MDK/use_example.uvprojx b/examples/bootloader/MDK/use_example.uvprojx index d2ee26c..f2ee88b 100644 --- a/examples/bootloader/MDK/use_example.uvprojx +++ b/examples/bootloader/MDK/use_example.uvprojx @@ -543,11 +543,6 @@ system - - usart_dma.c - 1 - ..\..\[base_on_stm32f1]\stm32f1_sys\usart_dma.c - tim.c 1 @@ -558,6 +553,11 @@ 1 ..\..\[base_on_stm32f1]\stm32f1_sys\flash.c + + usart.c + 1 + ..\..\[base_on_stm32f1]\stm32f1_sys\usart.c + diff --git a/examples/bootloader/SRC/main.c b/examples/bootloader/SRC/main.c index 33e9584..f217ea2 100644 --- a/examples/bootloader/SRC/main.c +++ b/examples/bootloader/SRC/main.c @@ -3,8 +3,8 @@ * @file main.c * @author ashuai0110 * @version V1.0 - * @date 2024-01-18 - * @brief 使用举例-bootloader + * @date 2024-01-22 + * @brief 使用举例-bootloader(基于ymodem协议传输升级文件) * ****************************************************************************** * @attention @@ -17,7 +17,7 @@ /* 包含头文件-----------------------------------------------------------------*/ #include "stm32f10x.h" -#include "usart_dma.h" +#include "usart.h" #include "tim.h" #include "flash.h" @@ -29,9 +29,6 @@ /* 私有类型定义---------------------------------------------------------------*/ /* 私有变量-------------------------------------------------------------------*/ -static uint8_t usart1DmaTxBuf[200]; /* 串口1dma发送缓存区 */ -static uint8_t usart1DmaRxBuf[200]; /* 串口1dma接收缓存区 */ - ymodem_t ymodem; /* ymodem实例 */ static uint8_t ymodemBuf[1029]; /* ymodem数据缓存区 */ file_info_t fileInfo; /* 文件信息结构体 */ @@ -60,51 +57,32 @@ void TIM1_UP_IRQHandler(void) */ void USART1_IRQHandler(void) { - /* 串口1空闲中断 */ - if(USART_GetITStatus(USART1,USART_IT_IDLE) != RESET) - { - USART1->SR; - USART1->DR; - - /* 这里写接收处理 */ - ymodem_write_rx_buf(&ymodem, usart1DmaRxBuf, sizeof(usart1DmaRxBuf) - DMA_GetCurrDataCounter(DMA1_Channel5)); - /* dma重配置 */ - usart1_dma_rx_reconfig(sizeof(usart1DmaRxBuf)); - } -} - -/** - * @brief 串口1接收的dma中断 - */ -void DMA1_Channel5_IRQHandler(void) -{ - /* DMA传输完成中断 */ - if(DMA_GetITStatus(DMA1_IT_TC5) != RESET) + static uint8_t rxData, txData, ret; + + /* 串口接收中断 */ + if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) { - /* 这里写接收处理 */ - ymodem_write_rx_buf(&ymodem, usart1DmaRxBuf, sizeof(usart1DmaRxBuf)); - /* dma重配置 */ - usart1_dma_rx_reconfig(sizeof(usart1DmaRxBuf)); + rxData = USART_ReceiveData(USART1); + /* 写入接收缓存 */ + ret = ymodem_write_rx_buf(&ymodem, &rxData, 1); + if(0 == ret) + { + WARN_LOG("ymodem_write_rx_buf failure"); + } - DMA_ClearITPendingBit(DMA1_IT_TC5); + USART_ClearITPendingBit(USART1, USART_IT_RXNE); } -} - -/** - * @brief 串口1发送的dma中断 - */ -void DMA1_Channel4_IRQHandler(void) -{ - static uint16_t num; - - /* DMA传输完成中断 */ - if(DMA_GetITStatus(DMA1_IT_TC4) != RESET) + /* 串口发送中断 */ + if(USART_GetITStatus(USART1, USART_IT_TXE) != RESET) { - /* 这里写读取发送内容的处理 */ - num = ymodem_read_tx_buf(&ymodem, usart1DmaTxBuf, sizeof(usart1DmaTxBuf)); /* 读出数据 */ - usart1_dma_tx_reconfig(num); /* dma重配置 */ + /* 读出发送缓存 */ + ret = ymodem_read_tx_buf(&ymodem, &txData, 1); + if(1 == ret) + { + USART_SendData(USART1, txData); + } - DMA_ClearITPendingBit(DMA1_IT_TC4); + USART_ClearITPendingBit(USART1, USART_IT_TXE); } } @@ -119,24 +97,13 @@ void usart1_tx_en(uint8_t enState) { if(enState) { - /* 判断当前是否正在发送 发送完成标志置位则不是正在发送 */ - if(USART_GetFlagStatus(USART1, USART_FLAG_TC) != RESET) - { - uint16_t num; - num = ymodem_read_tx_buf(&ymodem, usart1DmaTxBuf, sizeof(usart1DmaTxBuf)); /* 读出数据 */ - if(0 < num) - { - usart1_dma_tx_reconfig(num); /* dma重配置 */ - } - else - { - DMA_Cmd(DMA1_Channel4, DISABLE); /* 关闭dma */ - } - } + /* 使能发送中断 */ + USART_ITConfig(USART1, USART_IT_TXE, ENABLE); } else { - DMA_Cmd(DMA1_Channel4, DISABLE); + /* 关闭发送中断 */ + USART_ITConfig(USART1, USART_IT_TXE, DISABLE); } } @@ -157,8 +124,13 @@ void ymodem_get_packet_callback(uint8_t packetNum, uint8_t *data, uint16_t *len) if(YMODEM_FILE_FLAG(ymodem)) { ymodem_get_file_info(&ymodem, &fileInfo); /* 获取文件信息保存至fileInfo结构体 */ - PRINT_LOG("ymodem rec file name:%s, size:%d Byte\r\n", fileInfo.fileName, fileInfo.fileSize); - boot_erase_application(fileInfo.fileSize); /* 擦除应用程序FLASH区域 */ + /* 用户可以自行校验文件名称 不再举例 */ + DEBUG_LOG("ymodem rec file name:%s, size:%d Byte", fileInfo.fileName, fileInfo.fileSize); + /* 擦除应用程序FLASH区域 */ + if(0 != boot_erase_application(fileInfo.fileSize)) + { + ERROR_LOG("bootloader erase application error!"); + } } /* 数据 */ else { @@ -166,31 +138,6 @@ void ymodem_get_packet_callback(uint8_t packetNum, uint8_t *data, uint16_t *len) } } -/** - * @brief 设置ymodem数据包回调函数 - * - * @param packetNum : 数据包序号 首次从1开始 超出255回到0 - * - * @param data : 有效数据存放区(需填充数据) - * - * @param len : 有效数据长度(不包含填充内容0x1A,组件自动填充) - * - * @retval None - */ -void ymodem_set_packet_callback(uint8_t packetNum, uint8_t *data, uint16_t *len) -{ - /* 用户自行计算数据量并在发送完全后给len赋值0 */ - if(packetNum > 100) - { - *len = 0; - } /* 用户自行选择携带128或1024字节数据并将数据赋值给data */ - else - { - *len = 1024; - memset((void *)data, packetNum + '0', 1024); - } -} - /** * @brief 恢复所有外设及中断 * @@ -203,8 +150,6 @@ void boot_recover_all(void) GPIO_DeInit(GPIOA); TIM_DeInit(TIM1); USART_DeInit(USART1); - DMA_DeInit(DMA1_Channel4); - DMA_DeInit(DMA1_Channel5); } /** @@ -219,29 +164,31 @@ int main(int argc, char *argv[]) /* 检查是升级还是跳转APP */ boot_check_updata_flag(); - /* 串口及其dma初始化 */ - usart1_dma_init_config(115200, usart1DmaTxBuf, sizeof(usart1DmaTxBuf), usart1DmaRxBuf, sizeof(usart1DmaRxBuf)); + /* 串口初始化 */ + usart1_init_config(115200); /* 定时器初始化 1ms */ tim1_init_config(100-1, 720-1); /* ymodem组件初始化 */ - ymodem_init(&ymodem, ymodemBuf, sizeof(ymodemBuf), usart1_tx_en, ymodem_get_packet_callback, ymodem_set_packet_callback, 2000); + ymodem_init(&ymodem, ymodemBuf, sizeof(ymodemBuf), usart1_tx_en, ymodem_get_packet_callback, NULL, 2000); /* 启动ymodem接收 */ ymodem_rx_start(&ymodem, YMODEM_RX_FLAG_CRC); while(1) { static uint8_t ret; - ret = ymodem_rx_poll(&ymodem); + + ret = ymodem_rx_poll(&ymodem); /* ymodem接收轮询处理 */ + /* 传输完成则跳转到应用程序 */ if(RET_OK == ret) { DEBUG_LOG("boot jump to application"); - boot_to_application(); - } + boot_to_application(); /* 跳转到应用程序 */ + } /* 传输失败或传输超时则跳转到备份(出厂)程序 */ else if(RET_ERR == ret || RET_TIMEOUT == ret) { DEBUG_LOG("boot jump to factory"); - boot_to_factory(); + boot_to_factory(); /* 跳转到备份(出厂)程序 */ } } } -- Gitee From 73c39f3a32e6f4f39a36af17ea756552159aaaf7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=98=BF=E8=A1=B00110?= Date: Sat, 27 Jan 2024 20:43:12 +0800 Subject: [PATCH 61/66] =?UTF-8?q?=E6=9B=B4=E6=96=B0README?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 96 ++++++++++--------- ...3\345\215\260\350\276\223\345\207\272.txt" | 0 2 files changed, 49 insertions(+), 47 deletions(-) create mode 100644 "drivers/segger_rtt/\344\273\205\347\224\250\344\275\234\344\275\277\347\224\250jlink\346\211\223\345\215\260\350\276\223\345\207\272.txt" diff --git a/README.md b/README.md index eea69ba..2c53146 100644 --- a/README.md +++ b/README.md @@ -1,47 +1,49 @@ -# 单片机可复用,可通用开发组件 - -* ./documents/存放组件使用文档 -* ./drivers/存放所有组件源程序 -* ./examples/存放所有组件的使用举例(使用必看) - -### drivers/common - -all_include.h: 所有组件头文件集合 - -common_include.c.h: 公共引用文件(所有组件都需包含此文件) - -### drivers/modbus - -modbus_common.c/.h: modbus通用文件 - -modbus_host.c/.h: modbus主机程序(RTU ASCII) - -modbus_slave.c/.h: modbus从机程序(RTU ASCII) - -### drivers/modules - -command_line.c/.h: 命令行交互 - -data_check.c/.h: 数据校验方法集合 - -data_convert.c/.h: 数据转换方法集合 - -delay_no_block.c/.h: 非阻塞延时 - -input_output.c/.h: IO输入输出操作 - -memory.c/.h: 内存管理-小内存管理算法 - -message_queue.c/.h: 消息队列 - -ring_buffer.c/.h: 环形缓冲区 - -sync_method.c/.h: 伪线程同步方法(信号量,互斥锁,事件集) - -timer_software.c/.h: 软件定时器 - -uart_handler.c/.h: 串口管理 - -### drivers/segger_rtt - -SEGGER_RTT官方文件,SEGGER_RTT.c:89行有固定输出地址方法 \ No newline at end of file +# mcu_reuse_development_module + +单片机可复用、可通用开发组件,是以中间件思想开发的一套功能模块,将具有代表性或使用次数较多的功能和协议栈封装为独立的组件供开发者使用,开发者仅需通过组件提供的接口对接驱动层和应用层即可使用组件功能,从而减少重复工作、缩短开发周期,并且具备跨平台特性。 + +## 代码结构 + +本组件处在中间件层,向上提供应用层的功能模块接口,向下调用底层驱动接口。 + +![](https://gitee.com/ashuai0110/image_saves/raw/master/mrdm_images/MRDM_Hierarchy.jpg) + +## 文件目录 + +* ./documents/存放组件使用手册 +* ./drivers/存放所有组件源代码 +* ./examples/存放所有组件的使用举例程序(使用必看) + +## 使用说明 + +- MCU开发项目编译器需要勾选C99 +- 使用前请先查看例程,例程项目和组件名称相同 +- 所有组件都应包含common_include.c.h文件 + +## 组件说明 + +| 组件名称 | 组件描述 | +| ----- | --- | +| | **drivers/bootloader文件夹内容↓↓↓** | +| bootloader | 升级引导程序 | +| xmodem | xmodem协议 | +| ymodem | ymodem协议 | +| | **drivers/common文件夹内容↓↓↓** | +| all_include | 所有组件头文件集合 | +| common_include | 公共引用文件(所有组件都需包含此文件) | +| | **drivers/modules文件夹内容↓↓↓** | +| modbus_common | modbus通用文件(modbus主从机都需包含此文件) | +| modbus_host | modbus主机程序(RTU ASCII) | +| modbus_slave | modbus从机程序(RTU ASCII) | +| | **drivers/modules文件夹内容↓↓↓** | +| command_line | 命令行交互 | +| data_check | 数据校验方法集合 | +| data_convert | 数据转换方法集合 | +| delay_no_block | 非阻塞延时 | +| input_output | IO输入输出操作 | +| memory | 内存管理(小内存管理算法<2MB) | +| message_queue | 消息队列 | +| ring_buffer | 环形缓冲区 | +| sync_method | 伪线程同步方法(信号量,互斥锁,事件集) | +| timer_software | 软件定时器 | +| uart_handler | 串口管理 | diff --git "a/drivers/segger_rtt/\344\273\205\347\224\250\344\275\234\344\275\277\347\224\250jlink\346\211\223\345\215\260\350\276\223\345\207\272.txt" "b/drivers/segger_rtt/\344\273\205\347\224\250\344\275\234\344\275\277\347\224\250jlink\346\211\223\345\215\260\350\276\223\345\207\272.txt" new file mode 100644 index 0000000..e69de29 -- Gitee From 3799154f899b8209a088832334e10a6bfae0f641 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=98=BF=E8=A1=B00110?= Date: Sat, 27 Jan 2024 20:54:38 +0800 Subject: [PATCH 62/66] =?UTF-8?q?=E6=9B=B4=E6=96=B0README?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 2c53146..5342eb4 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ 本组件处在中间件层,向上提供应用层的功能模块接口,向下调用底层驱动接口。 -![](https://gitee.com/ashuai0110/image_saves/raw/master/mrdm_images/MRDM_Hierarchy.jpg) +![](https://gitee.com/ashuai0110/image_saves/raw/master/mrdm_images/MRDM_Hierarchy.png) ## 文件目录 @@ -31,7 +31,7 @@ | | **drivers/common文件夹内容↓↓↓** | | all_include | 所有组件头文件集合 | | common_include | 公共引用文件(所有组件都需包含此文件) | -| | **drivers/modules文件夹内容↓↓↓** | +| | **drivers/modbus文件夹内容↓↓↓** | | modbus_common | modbus通用文件(modbus主从机都需包含此文件) | | modbus_host | modbus主机程序(RTU ASCII) | | modbus_slave | modbus从机程序(RTU ASCII) | -- Gitee From 047f75ffb7d98e5ffb14749b2cb9bebaf92c6f46 Mon Sep 17 00:00:00 2001 From: ashuai0110 Date: Sun, 28 Jan 2024 17:00:27 +0800 Subject: [PATCH 63/66] =?UTF-8?q?=E6=9B=B4=E6=96=B0README?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 5342eb4..376c4e9 100644 --- a/README.md +++ b/README.md @@ -11,31 +11,31 @@ ## 文件目录 * ./documents/存放组件使用手册 -* ./drivers/存放所有组件源代码 -* ./examples/存放所有组件的使用举例程序(使用必看) +* ./src/存放所有组件源代码 +* ./examples/存放所有组件的使用例程(用前必看) ## 使用说明 - MCU开发项目编译器需要勾选C99 - 使用前请先查看例程,例程项目和组件名称相同 -- 所有组件都应包含common_include.c.h文件 +- 所有组件都必须包含common_include.c.h文件 ## 组件说明 | 组件名称 | 组件描述 | | ----- | --- | -| | **drivers/bootloader文件夹内容↓↓↓** | +| | **src/bootloader文件夹内容↓↓↓** | | bootloader | 升级引导程序 | | xmodem | xmodem协议 | | ymodem | ymodem协议 | -| | **drivers/common文件夹内容↓↓↓** | +| | **src/common文件夹内容↓↓↓** | | all_include | 所有组件头文件集合 | | common_include | 公共引用文件(所有组件都需包含此文件) | -| | **drivers/modbus文件夹内容↓↓↓** | +| | **src/modbus文件夹内容↓↓↓** | | modbus_common | modbus通用文件(modbus主从机都需包含此文件) | | modbus_host | modbus主机程序(RTU ASCII) | | modbus_slave | modbus从机程序(RTU ASCII) | -| | **drivers/modules文件夹内容↓↓↓** | +| | **src/modules文件夹内容↓↓↓** | | command_line | 命令行交互 | | data_check | 数据校验方法集合 | | data_convert | 数据转换方法集合 | -- Gitee From e4ad275ae76bf03ceb7f47a361fc2a5f081956ee Mon Sep 17 00:00:00 2001 From: ashuai0110 Date: Sun, 28 Jan 2024 17:02:06 +0800 Subject: [PATCH 64/66] =?UTF-8?q?#I8WMCO=20=E6=9B=B4=E6=96=B0V2.2=E7=89=88?= =?UTF-8?q?=E6=9C=AC=E5=8F=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- drivers/modules/command_line.c | 43 ++++++++++++++++---------------- drivers/modules/command_line.h | 10 ++++---- drivers/modules/data_check.c | 4 +-- drivers/modules/data_check.h | 4 +-- drivers/modules/data_convert.c | 4 +-- drivers/modules/data_convert.h | 4 +-- drivers/modules/delay_no_block.c | 4 +-- drivers/modules/delay_no_block.h | 10 ++++---- drivers/modules/input_output.c | 10 ++++---- drivers/modules/input_output.h | 6 ++--- drivers/modules/memory.c | 4 +-- drivers/modules/memory.h | 8 +++--- drivers/modules/message_queue.c | 4 +-- drivers/modules/message_queue.h | 4 +-- drivers/modules/ring_buffer.c | 4 +-- drivers/modules/ring_buffer.h | 12 ++++----- drivers/modules/sync_method.c | 4 +-- drivers/modules/sync_method.h | 6 ++--- drivers/modules/timer_software.c | 4 +-- drivers/modules/timer_software.h | 14 +++++------ drivers/modules/uart_handler.c | 4 +-- drivers/modules/uart_handler.h | 18 ++++++------- 22 files changed, 92 insertions(+), 93 deletions(-) diff --git a/drivers/modules/command_line.c b/drivers/modules/command_line.c index 0454983..16288d6 100644 --- a/drivers/modules/command_line.c +++ b/drivers/modules/command_line.c @@ -2,8 +2,8 @@ ****************************************************************************** * @file command_line.c * @author ashuai0110 - * @version V2.1 - * @date 2024-01-01 + * @version V2.2 + * @date 2024-01-28 * @brief 命令行交互 * (类命令行,空格分割 比如:cmd arg1 arg2\r\n或AT+CMD= arg1 arg2\r\n) * @@ -463,29 +463,28 @@ void cmd_line_poll(void) for(cmdLineTarget = pCmdLineHead; cmdLineTarget; cmdLineTarget = cmdLineTarget->pNext) { /* 运行标志是开启运行的才执行 */ - if(CMD_LINE_RUN_START == cmdLineTarget->runFlg) + if(CMD_LINE_RUN_START != cmdLineTarget->runFlg) { continue; } + /* 读取数据并记录读出长度 */ + len = cmdLineTarget->readFn(buf, sizeof(buf)); + /* 逐字节判断 */ + for(cnt = 0; cnt < len; cnt++) { - len = cmdLineTarget->readFn(buf, sizeof(buf)); /* 读取数据并记录读出长度 */ - /* 逐字节判断 */ - for(cnt = 0; cnt < len; cnt++) + /* 遇到结束符1或结束符2或'\0'认为是完整的数据 */ + if(CMD_LINE_END_SYMBOL1 == buf[cnt] || CMD_LINE_END_SYMBOL2 == buf[cnt] || '\0' == buf[cnt]) { - /* 遇到结束符1或结束符2或'\0'认为是完整的数据 */ - if(CMD_LINE_END_SYMBOL1 == buf[cnt] || CMD_LINE_END_SYMBOL2 == buf[cnt] || '\0' == buf[cnt]) + cmdLineTarget->dataArr[cmdLineTarget->dataCnt] = '\0'; /* 添加字符串结束符 */ + if(1 < cmdLineTarget->dataCnt) { - cmdLineTarget->dataArr[cmdLineTarget->dataCnt] = '\0'; /* 添加字符串结束符 */ - if(1 < cmdLineTarget->dataCnt) - { - cmd_line_handle(cmdLineTarget); /* 执行处理 */ - } - cmdLineTarget->dataCnt = 0; - } /* 否则则循环写入数据暂存区 */ - else + cmd_line_handle(cmdLineTarget); /* 执行处理 */ + } + cmdLineTarget->dataCnt = 0; + } /* 否则则循环写入数据暂存区 */ + else + { + cmdLineTarget->dataArr[cmdLineTarget->dataCnt++] = buf[cnt]; + if(CMD_LINE_LEN_MAX <= cmdLineTarget->dataCnt) { - cmdLineTarget->dataArr[cmdLineTarget->dataCnt++] = buf[cnt]; - if(CMD_LINE_LEN_MAX <= cmdLineTarget->dataCnt) - { - cmdLineTarget->dataCnt = 0; - } + cmdLineTarget->dataCnt = 0; } } } @@ -529,7 +528,7 @@ uint8_t cmd_line_get_echo_flg(cmd_line_t *_cmd) * * @param _cmd : 命令行实例 * - * @param echoFlg : 运行标志 @ref cmd_line_run_flg + * @param runFlg : 运行标志 @ref cmd_line_run_flg * @arg CMD_LINE_RUN_START : 运行 * @arg CMD_LINE_RUN_STOP : 不运行 * diff --git a/drivers/modules/command_line.h b/drivers/modules/command_line.h index a4e4d2c..1cbca93 100644 --- a/drivers/modules/command_line.h +++ b/drivers/modules/command_line.h @@ -2,8 +2,8 @@ ****************************************************************************** * @file command_line.h * @author ashuai0110 - * @version V2.1 - * @date 2024-01-01 + * @version V2.2 + * @date 2024-01-28 * @brief 命令行交互 * (类命令行,空格分割 比如:cmd arg1 arg2\r\n或AT+CMD= arg1 arg2\r\n) * @@ -103,7 +103,7 @@ typedef uint32_t (* cmd_line_rw_fn_t)(void *pBuf, uint32_t size); */ typedef struct cmd_line { char dataArr[CMD_LINE_LEN_MAX]; /*!< 数据暂存区 */ - uint16_t dataCnt; /*!< 数据计数 */ + volatile uint16_t dataCnt; /*!< 数据计数 */ uint8_t echoFlg : 1; /*!< 回显标志 @ref cmd_line_echo_flg */ uint8_t runFlg : 1; /*!< 运行标志 @ref cmd_line_run_flg */ cmd_line_rw_fn_t readFn; /*!< 数据读函数 */ @@ -125,7 +125,7 @@ typedef struct cmd_line { typedef void (* cmd_line_callback_fn_t)(cmd_line_t *_cmd, int argc, char *argv[]); /** - * @brief 命令行 item structure definition + * @brief 命令项 structure definition */ typedef struct cmd_line_item{ char cmdName[CMD_LINE_NAME_MAX + 1]; /*!< 命令名称 */ @@ -159,7 +159,7 @@ uint8_t cmd_line_pending(cmd_line_t *_cmd); /* set/get interface */ void cmd_line_set_echo_flg(cmd_line_t *_cmd, uint8_t echoFlg); uint8_t cmd_line_get_echo_flg(cmd_line_t *_cmd); -void cmd_line_set_run_flg(cmd_line_t *_cmd, uint8_t echoFlg); +void cmd_line_set_run_flg(cmd_line_t *_cmd, uint8_t runFlg); uint8_t cmd_line_get_run_flg(cmd_line_t *_cmd); /** diff --git a/drivers/modules/data_check.c b/drivers/modules/data_check.c index 3ef584e..c3753ac 100644 --- a/drivers/modules/data_check.c +++ b/drivers/modules/data_check.c @@ -2,8 +2,8 @@ ****************************************************************************** * @file data_check.c * @author ashuai0110 - * @version V2.1 - * @date 2024-01-04 + * @version V2.2 + * @date 2024-01-28 * @brief 数据校验方法集合 * ****************************************************************************** diff --git a/drivers/modules/data_check.h b/drivers/modules/data_check.h index 70ecb66..879fe92 100644 --- a/drivers/modules/data_check.h +++ b/drivers/modules/data_check.h @@ -2,8 +2,8 @@ ****************************************************************************** * @file data_check.h * @author ashuai0110 - * @version V2.1 - * @date 2024-01-04 + * @version V2.2 + * @date 2024-01-28 * @brief 数据校验方法集合 * ****************************************************************************** diff --git a/drivers/modules/data_convert.c b/drivers/modules/data_convert.c index 3d2e77c..d591c03 100644 --- a/drivers/modules/data_convert.c +++ b/drivers/modules/data_convert.c @@ -2,8 +2,8 @@ ****************************************************************************** * @file data_convert.c * @author ashuai0110 - * @version V2.1 - * @date 2023-12-11 + * @version V2.2 + * @date 2024-01-28 * @brief 数据转换方法集合 * ****************************************************************************** diff --git a/drivers/modules/data_convert.h b/drivers/modules/data_convert.h index 7ac55cd..4790583 100644 --- a/drivers/modules/data_convert.h +++ b/drivers/modules/data_convert.h @@ -2,8 +2,8 @@ ****************************************************************************** * @file data_convert.h * @author ashuai0110 - * @version V2.1 - * @date 2023-12-11 + * @version V2.2 + * @date 2024-01-28 * @brief 数据转换方法集合 * ****************************************************************************** diff --git a/drivers/modules/delay_no_block.c b/drivers/modules/delay_no_block.c index 9f951c5..04ed19b 100644 --- a/drivers/modules/delay_no_block.c +++ b/drivers/modules/delay_no_block.c @@ -2,8 +2,8 @@ ****************************************************************************** * @file delay_no_block.c * @author ashuai0110 - * @version V2.1 - * @date 2024-01-18 + * @version V2.2 + * @date 2024-01-28 * @brief 非阻塞延时 * ****************************************************************************** diff --git a/drivers/modules/delay_no_block.h b/drivers/modules/delay_no_block.h index 568443f..0592046 100644 --- a/drivers/modules/delay_no_block.h +++ b/drivers/modules/delay_no_block.h @@ -2,8 +2,8 @@ ****************************************************************************** * @file delay_no_block.h * @author ashuai0110 - * @version V2.1 - * @date 2024-01-18 + * @version V2.2 + * @date 2024-01-28 * @brief 非阻塞延时 * ****************************************************************************** @@ -68,9 +68,9 @@ typedef unsigned short delay_id_t; /** * @brief 延时任务 structure definition */ -typedef struct delay_item{ - uint32_t ticks; /* 延时任务计数值 */ - uint8_t run; /* 延时任务运行状态 0:不运行(未创建) 1:运行中(被创建) */ +typedef struct delay_item { + volatile uint32_t ticks; /* 延时任务计数值 */ + uint8_t run : 1; /* 延时任务运行状态 0:不运行(未创建) 1:运行中(被创建) */ } delay_item_t; /** diff --git a/drivers/modules/input_output.c b/drivers/modules/input_output.c index c7a2cdf..6486d46 100644 --- a/drivers/modules/input_output.c +++ b/drivers/modules/input_output.c @@ -2,8 +2,8 @@ ****************************************************************************** * @file input_output.c * @author ashuai0110 - * @version V2.1 - * @date 2024-01-01 + * @version V2.2 + * @date 2024-01-28 * @brief IO输入输出操作 * (输入可以设置各边沿触发时间,输出可以设置各边沿保持时间) * @@ -469,17 +469,17 @@ uint32_t io_get_falling_ticks(io_t *_io) * * @param _io : IO操作实例 * - * @param run : 运行标志 @ref io_run_flg + * @param runFlg : 运行标志 @ref io_run_flg * @arg IO_RUN_STOP : 不运行 * @arg IO_RUN_START : 运行 * * @retval None */ -void io_set_run(io_t *_io, uint8_t run) +void io_set_run(io_t *_io, uint8_t runFlg) { ASSERT_PARAM(IS_VALID_POINT(_io)); - _io->run = run; + _io->run = runFlg; } /** diff --git a/drivers/modules/input_output.h b/drivers/modules/input_output.h index fa8f7de..a9f6d5e 100644 --- a/drivers/modules/input_output.h +++ b/drivers/modules/input_output.h @@ -2,8 +2,8 @@ ****************************************************************************** * @file input_output.h * @author ashuai0110 - * @version V2.1 - * @date 2024-01-01 + * @version V2.2 + * @date 2024-01-28 * @brief IO输入输出操作 * (输入可以设置各边沿触发时间,输出可以设置各边沿保持时间) * @@ -156,7 +156,7 @@ void io_set_rising_ticks(io_t *_io, uint32_t risingTicks); uint32_t io_get_rising_ticks(io_t *_io); void io_set_falling_ticks(io_t *_io, uint32_t fallingTicks); uint32_t io_get_falling_ticks(io_t *_io); -void io_set_run(io_t *_io, uint8_t run); +void io_set_run(io_t *_io, uint8_t runFlg); uint8_t io_get_run(io_t *_io); /** diff --git a/drivers/modules/memory.c b/drivers/modules/memory.c index ab8f2f2..6ecbe4d 100644 --- a/drivers/modules/memory.c +++ b/drivers/modules/memory.c @@ -2,8 +2,8 @@ ****************************************************************************** * @file memory.c * @author ashuai0110 - * @version V2.1 - * @date 2024-01-02 + * @version V2.2 + * @date 2024-01-28 * @brief 内存管理(rt-thread的mem,小内存管理算法<2MB) * ****************************************************************************** diff --git a/drivers/modules/memory.h b/drivers/modules/memory.h index 4a8ffd4..cf7303a 100644 --- a/drivers/modules/memory.h +++ b/drivers/modules/memory.h @@ -2,8 +2,8 @@ ****************************************************************************** * @file memory.h * @author ashuai0110 - * @version V2.1 - * @date 2024-01-02 + * @version V2.2 + * @date 2024-01-28 * @brief 内存管理(参考rt-thread的mem,小内存管理算法<2MB) * ****************************************************************************** @@ -60,8 +60,8 @@ extern "C" { * @brief 内存管理 structure definition */ typedef struct memory{ - uint16_t code; /*!< 内存管理标识 */ - uint8_t used; /*!< 内存使用标志 0未使用 1已使用 */ + uint16_t code; /*!< 内存管理标识 */ + uint8_t used : 1; /*!< 内存使用标志 0:未使用 1:已使用 */ volatile uint32_t next; /*!< 下一个管理者的偏移(基于内存首地址) */ volatile uint32_t prev; /*!< 上一个管理者的偏移(基于内存首地址) */ } mem_t; diff --git a/drivers/modules/message_queue.c b/drivers/modules/message_queue.c index 0a4ac52..69989fb 100644 --- a/drivers/modules/message_queue.c +++ b/drivers/modules/message_queue.c @@ -2,8 +2,8 @@ ****************************************************************************** * @file message_queue.c * @author ashuai0110 - * @version V2.1 - * @date 2023-12-30 + * @version V2.2 + * @date 2024-01-28 * @brief 消息队列 * (适合不定长数据和复杂数据,写入时动态申请内存) * diff --git a/drivers/modules/message_queue.h b/drivers/modules/message_queue.h index 6acf519..e83a782 100644 --- a/drivers/modules/message_queue.h +++ b/drivers/modules/message_queue.h @@ -2,8 +2,8 @@ ****************************************************************************** * @file message_queue.h * @author ashuai0110 - * @version V2.1 - * @date 2023-12-30 + * @version V2.2 + * @date 2024-01-28 * @brief 消息队列 * (适合不定长数据和复杂数据,写入时动态申请内存) * diff --git a/drivers/modules/ring_buffer.c b/drivers/modules/ring_buffer.c index b585e06..3f45f68 100644 --- a/drivers/modules/ring_buffer.c +++ b/drivers/modules/ring_buffer.c @@ -2,8 +2,8 @@ ****************************************************************************** * @file ring_buffer.c * @author ashuai0110 - * @version V2.1 - * @date 2023-12-26 + * @version V2.2 + * @date 2024-01-28 * @brief 环形缓冲区 * (适合定长或易分离出的数据,写满后必须读出否则无法写入新数据) * diff --git a/drivers/modules/ring_buffer.h b/drivers/modules/ring_buffer.h index 57d531f..36c9585 100644 --- a/drivers/modules/ring_buffer.h +++ b/drivers/modules/ring_buffer.h @@ -2,8 +2,8 @@ ****************************************************************************** * @file ring_buffer.h * @author ashuai0110 - * @version V2.1 - * @date 2023-12-26 + * @version V2.2 + * @date 2024-01-28 * @brief 环形缓冲区 * (适合定长或易分离出的数据,写满后再写会覆写旧数据无论其是否被读出处理过) * @@ -48,10 +48,10 @@ extern "C" { * @brief 环形缓冲区 structrue definition */ typedef struct ring_buffer { - char *pHead; /*!< 头节点(开始读节点) */ - char *pTail; /*!< 尾节点(开始写节点) */ - char *pBuf; /*!< 数据缓冲区 */ - uint32_t bufLen; /*!< 数据缓冲区大小 */ + volatile char *pHead; /*!< 头节点(开始读节点) */ + volatile char *pTail; /*!< 尾节点(开始写节点) */ + char *pBuf; /*!< 数据缓冲区 */ + uint32_t bufLen; /*!< 数据缓冲区大小 */ } ring_buffer_t; /** diff --git a/drivers/modules/sync_method.c b/drivers/modules/sync_method.c index 8030169..d2385f5 100644 --- a/drivers/modules/sync_method.c +++ b/drivers/modules/sync_method.c @@ -2,8 +2,8 @@ ****************************************************************************** * @file sync_method.c * @author ashuai0110 - * @version V2.1 - * @date 2023-12-27 + * @version V2.2 + * @date 2024-01-28 * @brief 伪线程同步方法(信号量,互斥锁,事件集) * ****************************************************************************** diff --git a/drivers/modules/sync_method.h b/drivers/modules/sync_method.h index 8ff660c..9b6d872 100644 --- a/drivers/modules/sync_method.h +++ b/drivers/modules/sync_method.h @@ -2,8 +2,8 @@ ****************************************************************************** * @file sync_method.h * @author ashuai0110 - * @version V2.1 - * @date 2023-12-27 + * @version V2.2 + * @date 2024-01-28 * @brief 伪线程同步方法(信号量,互斥锁,事件集) * ****************************************************************************** @@ -45,7 +45,7 @@ extern "C" { * @defgroup sync_mutex_flg sync mutex flag * @{ */ -#define MUTEX_UNLOCK (0u) /*!< 互斥锁-未锁 */ +#define MUTEX_UNLOCK (0u) /*!< 互斥锁-未上锁 */ #define MUTEX_LOCK (1u) /*!< 互斥锁-上锁 */ /** * @} diff --git a/drivers/modules/timer_software.c b/drivers/modules/timer_software.c index 83e2a65..a9e6583 100644 --- a/drivers/modules/timer_software.c +++ b/drivers/modules/timer_software.c @@ -2,8 +2,8 @@ ****************************************************************************** * @file timer_software.c * @author ashuai0110 - * @version V2.1 - * @date 2024-01-18 + * @version V2.2 + * @date 2024-01-28 * @brief 软件定时器 * ****************************************************************************** diff --git a/drivers/modules/timer_software.h b/drivers/modules/timer_software.h index f94c92f..be8ff97 100644 --- a/drivers/modules/timer_software.h +++ b/drivers/modules/timer_software.h @@ -2,8 +2,8 @@ ****************************************************************************** * @file timer_software.h * @author ashuai0110 - * @version V2.1 - * @date 2024-01-18 + * @version V2.2 + * @date 2024-01-28 * @brief 软件定时器 * ****************************************************************************** @@ -65,11 +65,11 @@ extern "C" { * @brief 软件定时器任务 structrue definition */ typedef struct timer_s { - uint32_t curTicks; /*!< 当前计数值ms */ - uint32_t targetTicks; /*!< 目标计数值ms */ - uint8_t runFlg; /*!< 运行标志 @ref timer_run_flg */ - void(* callbackFn)(void); /*!< 回调函数 */ - struct timer_s *pNext; /*!< 下一节点 */ + volatile uint32_t curTicks; /*!< 当前计数值ms */ + uint32_t targetTicks; /*!< 目标计数值ms */ + uint8_t runFlg : 1; /*!< 运行标志 @ref timer_run_flg */ + void(* callbackFn)(void); /*!< 回调函数 */ + struct timer_s *pNext; /*!< 下一节点 */ } timer_s_t; /** diff --git a/drivers/modules/uart_handler.c b/drivers/modules/uart_handler.c index 673f44b..ed59e9a 100644 --- a/drivers/modules/uart_handler.c +++ b/drivers/modules/uart_handler.c @@ -2,8 +2,8 @@ ****************************************************************************** * @file uart_handler.c * @author woshiashuai - * @version V2.1 - * @date 2024-01-18 + * @version V2.2 + * @date 2024-01-28 * @brief 串口管理(使用帧间隔分帧或现有的分帧方法) * ****************************************************************************** diff --git a/drivers/modules/uart_handler.h b/drivers/modules/uart_handler.h index fcb6d76..979b333 100644 --- a/drivers/modules/uart_handler.h +++ b/drivers/modules/uart_handler.h @@ -2,8 +2,8 @@ ****************************************************************************** * @file uart_handler.h * @author woshiashuai - * @version V2.1 - * @date 2024-01-18 + * @version V2.2 + * @date 2024-01-28 * @brief 串口管理(使用帧间隔分帧或现有的分帧方法) * ****************************************************************************** @@ -69,13 +69,13 @@ typedef void (* uart_tx_en_fn_t)(uint8_t enState); * @brief 串口管理 structure definition */ typedef struct uart_handler { - uint8_t targetFrameIntv; /*!< 目标帧间隔ms */ - uint32_t curFrameIntv; /*!< 当前帧间隔ms */ - uint32_t recTimeoutCnt; /*!< 接收超时计数ms */ - uint32_t recTimeout; /*!< 接收超时时间ms */ - ring_buffer_t txRingBuffer; /*!< 发送环形队列 */ - ring_buffer_t rxRingBuffer; /*!< 接收环形队列 */ - uart_tx_en_fn_t uartTxEnFn; /*!< 串口发送前准备函数 */ + uint8_t targetFrameIntv; /*!< 目标帧间隔ms */ + volatile uint32_t curFrameIntv; /*!< 当前帧间隔ms */ + volatile uint32_t recTimeoutCnt; /*!< 接收超时计数ms */ + uint32_t recTimeout; /*!< 接收超时时间ms */ + ring_buffer_t txRingBuffer; /*!< 发送环形队列 */ + ring_buffer_t rxRingBuffer; /*!< 接收环形队列 */ + uart_tx_en_fn_t uartTxEnFn; /*!< 串口发送前准备函数 */ } uart_handler_t; /** -- Gitee From a99a9e6f00e5fc27a6e93921a622d68eb3eb6192 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=98=BF=E8=A1=B00110?= Date: Sun, 28 Jan 2024 22:04:49 +0800 Subject: [PATCH 65/66] =?UTF-8?q?#I8WMCO=20=E6=9B=B4=E6=96=B0=E8=87=B3V2.2?= =?UTF-8?q?=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../[base_on_stm32f1]/stm32f1_sys/flash.c | 10 +- .../[base_on_stm32f1]/stm32f1_sys/flash.h | 6 +- examples/bootloader/MDK/use_example.uvoptx | 20 +- examples/bootloader/MDK/use_example.uvprojx | 22 +- examples/bootloader/README.txt | 5 +- examples/bootloader/SRC/main.c | 10 +- .../MDK/use_example.uvguix.yansj | 1887 +++++++++++++++++ .../bootloader_app/MDK/use_example.uvoptx | 18 +- .../bootloader_app/MDK/use_example.uvprojx | 18 +- examples/bootloader_app/README.txt | 2 +- examples/bootloader_app/SRC/main.c | 2 +- .../MDK/use_example.uvguix.yansj | 1887 +++++++++++++++++ .../bootloader_factory/MDK/use_example.uvoptx | 18 +- .../MDK/use_example.uvprojx | 18 +- examples/bootloader_factory/README.txt | 2 +- examples/bootloader_factory/SRC/main.c | 2 +- examples/command_line/MDK/use_example.uvoptx | 12 +- examples/command_line/MDK/use_example.uvprojx | 14 +- examples/command_line/README.txt | 2 +- examples/command_line/SRC/main.c | 2 +- .../delay_no_block/MDK/use_example.uvoptx | 14 +- .../delay_no_block/MDK/use_example.uvprojx | 14 +- examples/delay_no_block/README.txt | 2 +- examples/delay_no_block/SRC/main.c | 2 +- examples/input_output/MDK/use_example.uvoptx | 14 +- examples/input_output/MDK/use_example.uvprojx | 14 +- examples/input_output/README.txt | 2 +- examples/input_output/SRC/main.c | 2 +- examples/memory/MDK/use_example.uvoptx | 14 +- examples/memory/MDK/use_example.uvprojx | 14 +- examples/memory/README.txt | 2 +- examples/memory/SRC/main.c | 2 +- examples/message_queue/MDK/use_example.uvoptx | 14 +- .../message_queue/MDK/use_example.uvprojx | 14 +- examples/message_queue/README.txt | 2 +- examples/message_queue/SRC/main.c | 2 +- examples/modbus_host/MDK/use_example.uvoptx | 20 +- examples/modbus_host/MDK/use_example.uvprojx | 16 +- examples/modbus_host/README.txt | 2 +- examples/modbus_host/SRC/main.c | 2 +- examples/modbus_slave/MDK/use_example.uvoptx | 18 +- examples/modbus_slave/MDK/use_example.uvprojx | 18 +- examples/modbus_slave/README.txt | 2 +- examples/modbus_slave/SRC/main.c | 2 +- .../project_template/MDK/use_example.uvoptx | 132 +- .../project_template/MDK/use_example.uvprojx | 82 +- examples/project_template/README.txt | 2 +- examples/project_template/SRC/main.c | 7 +- examples/ring_buffer/MDK/use_example.uvoptx | 14 +- examples/ring_buffer/MDK/use_example.uvprojx | 14 +- examples/ring_buffer/README.txt | 2 +- examples/ring_buffer/SRC/main.c | 2 +- examples/sync_method/MDK/use_example.uvoptx | 14 +- examples/sync_method/MDK/use_example.uvprojx | 14 +- examples/sync_method/README.txt | 2 +- examples/sync_method/SRC/main.c | 2 +- .../timer_software/MDK/use_example.uvoptx | 14 +- .../timer_software/MDK/use_example.uvprojx | 14 +- examples/timer_software/README.txt | 2 +- examples/timer_software/SRC/main.c | 2 +- examples/uart_handler/MDK/use_example.uvoptx | 18 +- examples/uart_handler/MDK/use_example.uvprojx | 18 +- examples/uart_handler/README.txt | 2 +- examples/uart_handler/SRC/main.c | 2 +- examples/xmodem/MDK/use_example.uvoptx | 14 +- examples/xmodem/MDK/use_example.uvprojx | 14 +- examples/xmodem/README.txt | 2 +- examples/xmodem/SRC/main.c | 2 +- examples/ymodem/MDK/use_example.uvoptx | 30 +- examples/ymodem/MDK/use_example.uvprojx | 10 +- examples/ymodem/README.txt | 2 +- examples/ymodem/SRC/main.c | 14 +- {drivers => src}/bootloader/bootloader.c | 56 +- {drivers => src}/bootloader/bootloader.h | 47 +- {drivers => src}/bootloader/xmodem.c | 4 +- {drivers => src}/bootloader/xmodem.h | 30 +- {drivers => src}/bootloader/ymodem.c | 4 +- {drivers => src}/bootloader/ymodem.h | 32 +- {drivers => src}/common/all_include.h | 6 +- {drivers => src}/common/common_include.c | 4 +- {drivers => src}/common/common_include.h | 4 +- {drivers => src}/modbus/modbus_common.c | 4 +- {drivers => src}/modbus/modbus_common.h | 5 +- {drivers => src}/modbus/modbus_host.c | 4 +- {drivers => src}/modbus/modbus_host.h | 8 +- {drivers => src}/modbus/modbus_slave.c | 4 +- {drivers => src}/modbus/modbus_slave.h | 8 +- {drivers => src}/modules/command_line.c | 0 {drivers => src}/modules/command_line.h | 0 {drivers => src}/modules/data_check.c | 0 {drivers => src}/modules/data_check.h | 0 {drivers => src}/modules/data_convert.c | 0 {drivers => src}/modules/data_convert.h | 0 {drivers => src}/modules/delay_no_block.c | 0 {drivers => src}/modules/delay_no_block.h | 0 {drivers => src}/modules/input_output.c | 0 {drivers => src}/modules/input_output.h | 0 {drivers => src}/modules/memory.c | 0 {drivers => src}/modules/memory.h | 0 {drivers => src}/modules/message_queue.c | 0 {drivers => src}/modules/message_queue.h | 0 {drivers => src}/modules/ring_buffer.c | 0 {drivers => src}/modules/ring_buffer.h | 8 +- {drivers => src}/modules/sync_method.c | 0 {drivers => src}/modules/sync_method.h | 0 {drivers => src}/modules/timer_software.c | 0 {drivers => src}/modules/timer_software.h | 0 {drivers => src}/modules/uart_handler.c | 0 {drivers => src}/modules/uart_handler.h | 0 {drivers => src}/segger_rtt/SEGGER_RTT.c | 0 {drivers => src}/segger_rtt/SEGGER_RTT.h | 0 {drivers => src}/segger_rtt/SEGGER_RTT_Conf.h | 0 .../segger_rtt/SEGGER_RTT_printf.c | 0 ...3\345\215\260\350\276\223\345\207\272.txt" | 0 114 files changed, 4314 insertions(+), 526 deletions(-) create mode 100644 examples/bootloader_app/MDK/use_example.uvguix.yansj create mode 100644 examples/bootloader_factory/MDK/use_example.uvguix.yansj rename {drivers => src}/bootloader/bootloader.c (78%) rename {drivers => src}/bootloader/bootloader.h (66%) rename {drivers => src}/bootloader/xmodem.c (99%) rename {drivers => src}/bootloader/xmodem.h (86%) rename {drivers => src}/bootloader/ymodem.c (99%) rename {drivers => src}/bootloader/ymodem.h (86%) rename {drivers => src}/common/all_include.h (95%) rename {drivers => src}/common/common_include.c (98%) rename {drivers => src}/common/common_include.h (99%) rename {drivers => src}/modbus/modbus_common.c (99%) rename {drivers => src}/modbus/modbus_common.h (98%) rename {drivers => src}/modbus/modbus_host.c (99%) rename {drivers => src}/modbus/modbus_host.h (95%) rename {drivers => src}/modbus/modbus_slave.c (99%) rename {drivers => src}/modbus/modbus_slave.h (95%) rename {drivers => src}/modules/command_line.c (100%) rename {drivers => src}/modules/command_line.h (100%) rename {drivers => src}/modules/data_check.c (100%) rename {drivers => src}/modules/data_check.h (100%) rename {drivers => src}/modules/data_convert.c (100%) rename {drivers => src}/modules/data_convert.h (100%) rename {drivers => src}/modules/delay_no_block.c (100%) rename {drivers => src}/modules/delay_no_block.h (100%) rename {drivers => src}/modules/input_output.c (100%) rename {drivers => src}/modules/input_output.h (100%) rename {drivers => src}/modules/memory.c (100%) rename {drivers => src}/modules/memory.h (100%) rename {drivers => src}/modules/message_queue.c (100%) rename {drivers => src}/modules/message_queue.h (100%) rename {drivers => src}/modules/ring_buffer.c (100%) rename {drivers => src}/modules/ring_buffer.h (90%) rename {drivers => src}/modules/sync_method.c (100%) rename {drivers => src}/modules/sync_method.h (100%) rename {drivers => src}/modules/timer_software.c (100%) rename {drivers => src}/modules/timer_software.h (100%) rename {drivers => src}/modules/uart_handler.c (100%) rename {drivers => src}/modules/uart_handler.h (100%) rename {drivers => src}/segger_rtt/SEGGER_RTT.c (100%) rename {drivers => src}/segger_rtt/SEGGER_RTT.h (100%) rename {drivers => src}/segger_rtt/SEGGER_RTT_Conf.h (100%) rename {drivers => src}/segger_rtt/SEGGER_RTT_printf.c (100%) rename "drivers/segger_rtt/\344\273\205\347\224\250\344\275\234\344\275\277\347\224\250jlink\346\211\223\345\215\260\350\276\223\345\207\272.txt" => "src/segger_rtt/\344\273\205\347\224\250\344\275\234\344\275\277\347\224\250jlink\346\211\223\345\215\260\350\276\223\345\207\272.txt" (100%) diff --git a/examples/[base_on_stm32f1]/stm32f1_sys/flash.c b/examples/[base_on_stm32f1]/stm32f1_sys/flash.c index 89e684a..eff34c5 100644 --- a/examples/[base_on_stm32f1]/stm32f1_sys/flash.c +++ b/examples/[base_on_stm32f1]/stm32f1_sys/flash.c @@ -27,11 +27,13 @@ /** * @brief 擦除flash * @param startAddr : 起始地址 - * @param pageNum : 擦除页数量 + * @param bytes : 擦除总字节数量 * @retval 0:擦除成功 1:擦除失败 */ -uint8_t flash_erase(uint32_t startAddr, uint16_t pageNum) +uint8_t flash_erase(uint32_t startAddr, uint32_t bytes) { + uint8_t pageNum = (bytes % FLASH_PAGE_SIZE == 0) ? (bytes / FLASH_PAGE_SIZE) : (bytes / FLASH_PAGE_SIZE + 1); + DISABLE_GIE(); FLASH_Unlock(); while(pageNum--) @@ -58,7 +60,7 @@ uint8_t flash_erase(uint32_t startAddr, uint16_t pageNum) * @param len : 读取数量byte * @retval 0:读取成功 */ -uint8_t flash_read(uint32_t startAddr, void *pBuf, uint16_t len) +uint8_t flash_read(uint32_t startAddr, void *pBuf, uint32_t len) { DISABLE_GIE(); memcpy(pBuf, (void *)startAddr, len); @@ -74,7 +76,7 @@ uint8_t flash_read(uint32_t startAddr, void *pBuf, uint16_t len) * @param len : 写入数量byte * @retval 0:写入成功 1:写入失败 */ -uint8_t flash_write(uint32_t startAddr, void *pBuf, uint16_t len) +uint8_t flash_write(uint32_t startAddr, void *pBuf, uint32_t len) { uint32_t *dataTmp; diff --git a/examples/[base_on_stm32f1]/stm32f1_sys/flash.h b/examples/[base_on_stm32f1]/stm32f1_sys/flash.h index 970ed67..f72276b 100644 --- a/examples/[base_on_stm32f1]/stm32f1_sys/flash.h +++ b/examples/[base_on_stm32f1]/stm32f1_sys/flash.h @@ -15,9 +15,9 @@ extern "C" { /* 全局变量-------------------------------------------------------------------*/ /* 函数原型-------------------------------------------------------------------*/ -uint8_t flash_erase(uint32_t startAddr, uint16_t pageNum); -uint8_t flash_read(uint32_t startAddr, void *pBuf, uint16_t len); -uint8_t flash_write(uint32_t startAddr, void *pBuf, uint16_t len); +uint8_t flash_erase(uint32_t startAddr, uint32_t bytes); +uint8_t flash_read(uint32_t startAddr, void *pBuf, uint32_t len); +uint8_t flash_write(uint32_t startAddr, void *pBuf, uint32_t len); #ifdef __cplusplus diff --git a/examples/bootloader/MDK/use_example.uvoptx b/examples/bootloader/MDK/use_example.uvoptx index 345c97b..2eb10c7 100644 --- a/examples/bootloader/MDK/use_example.uvoptx +++ b/examples/bootloader/MDK/use_example.uvoptx @@ -609,7 +609,7 @@ 0 0 0 - ..\..\..\drivers\segger_rtt\SEGGER_RTT.c + ..\..\..\src\segger_rtt\SEGGER_RTT.c SEGGER_RTT.c 0 0 @@ -621,7 +621,7 @@ 0 0 0 - ..\..\..\drivers\segger_rtt\SEGGER_RTT_printf.c + ..\..\..\src\segger_rtt\SEGGER_RTT_printf.c SEGGER_RTT_printf.c 0 0 @@ -685,8 +685,8 @@ 0 0 0 - ..\..\..\drivers\bootloader\bootloader.c - bootloader.c + ..\SRC\main.c + main.c 0 0 @@ -697,8 +697,8 @@ 0 0 0 - ..\..\..\drivers\common\common_include.c - common_include.c + ..\..\..\src\bootloader\bootloader.c + bootloader.c 0 0 @@ -709,8 +709,8 @@ 0 0 0 - ..\SRC\main.c - main.c + ..\..\..\src\bootloader\ymodem.c + ymodem.c 0 0 @@ -721,8 +721,8 @@ 0 0 0 - ..\..\..\drivers\bootloader\ymodem.c - ymodem.c + ..\..\..\src\common\common_include.c + common_include.c 0 0 diff --git a/examples/bootloader/MDK/use_example.uvprojx b/examples/bootloader/MDK/use_example.uvprojx index f2ee88b..4e6529d 100644 --- a/examples/bootloader/MDK/use_example.uvprojx +++ b/examples/bootloader/MDK/use_example.uvprojx @@ -339,7 +339,7 @@ STM32F10X_MD,USE_STDPERIPH_DRIVER - ..\..\[base_on_stm32f1]\stm32f1_lib\driver\inc;..\..\[base_on_stm32f1]\stm32f1_lib\cmsis;..\..\[base_on_stm32f1]\stm32f1_sys;..\..\..\drivers\common;..\..\..\drivers\segger_rtt;..\..\..\drivers\bootloader + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\inc;..\..\[base_on_stm32f1]\stm32f1_lib\cmsis;..\..\[base_on_stm32f1]\stm32f1_sys;..\..\..\src\bootloader;..\..\..\src\common;..\..\..\src\segger_rtt @@ -531,12 +531,12 @@ SEGGER_RTT.c 1 - ..\..\..\drivers\segger_rtt\SEGGER_RTT.c + ..\..\..\src\segger_rtt\SEGGER_RTT.c SEGGER_RTT_printf.c 1 - ..\..\..\drivers\segger_rtt\SEGGER_RTT_printf.c + ..\..\..\src\segger_rtt\SEGGER_RTT_printf.c
@@ -564,24 +564,24 @@ source - bootloader.c + main.c 1 - ..\..\..\drivers\bootloader\bootloader.c + ..\SRC\main.c - common_include.c + bootloader.c 1 - ..\..\..\drivers\common\common_include.c + ..\..\..\src\bootloader\bootloader.c - main.c + ymodem.c 1 - ..\SRC\main.c + ..\..\..\src\bootloader\ymodem.c - ymodem.c + common_include.c 1 - ..\..\..\drivers\bootloader\ymodem.c + ..\..\..\src\common\common_include.c diff --git a/examples/bootloader/README.txt b/examples/bootloader/README.txt index e14e932..8bf28eb 100644 --- a/examples/bootloader/README.txt +++ b/examples/bootloader/README.txt @@ -2,7 +2,7 @@ 用例使用说明 ================================================================================ Date Author MDK MCU -2024-01-22 ashuai0110 5.35 STM32F1 +2024-01-28 ashuai0110 5.35 STM32F103 ================================================================================ 功能描述 @@ -34,7 +34,8 @@ bootloader.h ================================================================================ 1)使用J-Link连接目标板; 2)打开工程,重新编译,启动调试或直接下载程序运行; -3)第一次烧写应全片擦除一次,用户可更换通信协议,将组件接口对接好即可使用。 +3)第一次烧写应全片擦除一次,然后按顺序烧写bootloader,application,factory程序; +3)用户可更换通信协议,将组件接口对接好即可使用。 ================================================================================ 注意 diff --git a/examples/bootloader/SRC/main.c b/examples/bootloader/SRC/main.c index f217ea2..bd502fc 100644 --- a/examples/bootloader/SRC/main.c +++ b/examples/bootloader/SRC/main.c @@ -3,7 +3,7 @@ * @file main.c * @author ashuai0110 * @version V1.0 - * @date 2024-01-22 + * @date 2024-01-28 * @brief 使用举例-bootloader(基于ymodem协议传输升级文件) * ****************************************************************************** @@ -88,7 +88,7 @@ void USART1_IRQHandler(void) /** * @brief 串口发送前准备函数 - * + * * @param enState : 0失能 1使能 * * @retval None @@ -109,7 +109,7 @@ void usart1_tx_en(uint8_t enState) /** * @brief 获取ymodem数据包回调函数 - * + * * @param packetNum : 数据包序号 首次从1开始 超出255回到0 * * @param data : 有效数据缓冲区(需读出数据) @@ -139,8 +139,8 @@ void ymodem_get_packet_callback(uint8_t packetNum, uint8_t *data, uint16_t *len) } /** - * @brief 恢复所有外设及中断 - * + * @brief 恢复/失能已使用的外设/中断 + * * @param None * * @retval None diff --git a/examples/bootloader_app/MDK/use_example.uvguix.yansj b/examples/bootloader_app/MDK/use_example.uvguix.yansj new file mode 100644 index 0000000..bceadac --- /dev/null +++ b/examples/bootloader_app/MDK/use_example.uvguix.yansj @@ -0,0 +1,1887 @@ + + + + -6.1 + +
### uVision Project, (C) Keil Software
+ + + + + + + + + + 38003 + Registers + 140 90 + + + 346 + Code Coverage + 1010 160 + + + 204 + Performance Analyzer + 1170 + + + + + + 35141 + Event Statistics + + 200 50 700 + + + 1506 + Symbols + + 80 80 80 + + + 1936 + Watch 1 + + 200 133 133 + + + 1937 + Watch 2 + + 200 133 133 + + + 1935 + Call Stack + Locals + + 200 133 133 + + + 2506 + Trace Data + + 75 135 130 95 70 230 200 150 + + + 466 + Source Browser + 500 + 300 + + + + + + + + 1 + 1 + 0 + 0 + -1 + + + + + + + 44 + 2 + 3 + + -1 + -1 + + + -1 + -1 + + + 0 + 703 + 1793 + 970 + + + + 0 + + 448 + 01000000040000000100000001000000010000000100000000000000020000000000000001000000010000000000000028000000280000000100000002000000010000000100000070443A5C415350726F6A6563745C6D637550726F6A6563745C6D63755F646576656C6F706D656E745F74656D706C6174655C6D63755F72657573655F646576656C6F706D656E745F6D6F64756C655C6578616D706C65735C626F6F746C6F616465725F6170705C5352435C6D61696E2E6300000000066D61696E2E6300000000FFDC7800FFFFFFFF70443A5C415350726F6A6563745C6D637550726F6A6563745C6D63755F646576656C6F706D656E745F74656D706C6174655C6D63755F72657573655F646576656C6F706D656E745F6D6F64756C655C6578616D706C65735C626F6F746C6F616465725F6170705C524541444D452E747874000000000A524541444D452E74787400000000FFDC7800FFFFFFFF0100000010000000C5D4F200FFDC7800BECEA100F0A0A100BCA8E1009CC1B600F7B88600D9ADC200A5C2D700B3A6BE00EAD6A300F6FA7D00B5E99D005FC3CF00C1838300CACAD500010000000000000002000000F4000000660000008007000063030000 + + + + 0 + Build + + -1 + -1 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + F40000004F00000090050000DD000000 + + + 16 + 3C0000005300000004030000E1000000 + + + + 1005 + 1005 + 1 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000066000000ED00000033030000 + + + 16 + 3C000000530000002C0100001C010000 + + + + 109 + 109 + 1 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000066000000ED00000033030000 + + + 16 + 3C00000053000000580100008F020000 + + + + 1465 + 1465 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 000000002902000090050000B7020000 + + + 16 + 3C0000005300000004030000E1000000 + + + + 1466 + 1466 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 030000002C0200008D0500008A020000 + + + 16 + 3C0000005300000004030000E1000000 + + + + 1467 + 1467 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 030000002C0200008D0500008A020000 + + + 16 + 3C0000005300000004030000E1000000 + + + + 1468 + 1468 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 030000002C0200008D0500008A020000 + + + 16 + 3C0000005300000004030000E1000000 + + + + 1506 + 1506 + 0 + 0 + 0 + 0 + 32767 + 0 + 16384 + 0 + + 16 + A3040000660000008D050000FF000000 + + + 16 + 3C000000530000002C0100001C010000 + + + + 1913 + 1913 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + F7000000660000008D050000C4000000 + + + 16 + 3C0000005300000004030000E1000000 + + + + 1935 + 1935 + 0 + 0 + 0 + 0 + 32767 + 0 + 32768 + 0 + + 16 + 030000002C0200008D0500009E020000 + + + 16 + 3C000000530000002C0100001C010000 + + + + 1936 + 1936 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 030000002C0200008D0500008A020000 + + + 16 + 3C000000530000002C0100001C010000 + + + + 1937 + 1937 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 030000002C0200008D0500008A020000 + + + 16 + 3C000000530000002C0100001C010000 + + + + 1939 + 1939 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 030000002C0200008D0500008A020000 + + + 16 + 3C0000005300000004030000E1000000 + + + + 1940 + 1940 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 030000002C0200008D0500008A020000 + + + 16 + 3C0000005300000004030000E1000000 + + + + 1941 + 1941 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 030000002C0200008D0500008A020000 + + + 16 + 3C0000005300000004030000E1000000 + + + + 1942 + 1942 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 030000002C0200008D0500008A020000 + + + 16 + 3C0000005300000004030000E1000000 + + + + 195 + 195 + 1 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000066000000ED00000033030000 + + + 16 + 3C00000053000000580100008F020000 + + + + 196 + 196 + 1 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000066000000ED00000033030000 + + + 16 + 3C00000053000000580100008F020000 + + + + 197 + 197 + 1 + 0 + 0 + 0 + 32767 + 0 + 32768 + 0 + + 16 + 000000006403000080070000DE030000 + + + 16 + 3C0000005300000004030000E1000000 + + + + 198 + 198 + 0 + 0 + 0 + 0 + 32767 + 0 + 32768 + 0 + + 16 + 000000001502000090050000B7020000 + + + 16 + 3C0000005300000004030000E1000000 + + + + 199 + 199 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 03000000670300008D050000C5030000 + + + 16 + 3C0000005300000004030000E1000000 + + + + 203 + 203 + 0 + 0 + 0 + 0 + 32767 + 0 + 8192 + 0 + + 16 + F40000006300000090050000DD000000 + + + 16 + 3C0000005300000004030000E1000000 + + + + 204 + 204 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + F7000000660000008D050000C4000000 + + + 16 + 3C0000005300000004030000E1000000 + + + + 221 + 221 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 00000000000000000000000000000000 + + + 16 + 0A0000000A0000006E0000006E000000 + + + + 2506 + 2506 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + A0040000630000009005000025020000 + + + 16 + 3C000000530000002C0100001C010000 + + + + 2507 + 2507 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 000000002902000090050000A3020000 + + + 16 + 3C0000005300000004030000E1000000 + + + + 343 + 343 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + F7000000660000008D050000C4000000 + + + 16 + 3C0000005300000004030000E1000000 + + + + 346 + 346 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + F7000000660000008D050000C4000000 + + + 16 + 3C0000005300000004030000E1000000 + + + + 35141 + 35141 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + F40000006300000090050000DD000000 + + + 16 + 3C000000530000002C0100001C010000 + + + + 35824 + 35824 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + F7000000660000008D050000C4000000 + + + 16 + 3C0000005300000004030000E1000000 + + + + 35885 + 35885 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + A3040000660000008D0500007A010000 + + + 16 + 3C000000530000002C0100001C010000 + + + + 35886 + 35886 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + A3040000660000008D0500007A010000 + + + 16 + 3C000000530000002C0100001C010000 + + + + 35887 + 35887 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + A3040000660000008D0500007A010000 + + + 16 + 3C000000530000002C0100001C010000 + + + + 35888 + 35888 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + A3040000660000008D0500007A010000 + + + 16 + 3C000000530000002C0100001C010000 + + + + 35889 + 35889 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + A3040000660000008D0500007A010000 + + + 16 + 3C000000530000002C0100001C010000 + + + + 35890 + 35890 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + A3040000660000008D0500007A010000 + + + 16 + 3C000000530000002C0100001C010000 + + + + 35891 + 35891 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + A3040000660000008D0500007A010000 + + + 16 + 3C000000530000002C0100001C010000 + + + + 35892 + 35892 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + A3040000660000008D0500007A010000 + + + 16 + 3C000000530000002C0100001C010000 + + + + 35893 + 35893 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + A3040000660000008D0500007A010000 + + + 16 + 3C000000530000002C0100001C010000 + + + + 35894 + 35894 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + A3040000660000008D0500007A010000 + + + 16 + 3C000000530000002C0100001C010000 + + + + 35895 + 35895 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + A3040000660000008D0500007A010000 + + + 16 + 3C000000530000002C0100001C010000 + + + + 35896 + 35896 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + A3040000660000008D0500007A010000 + + + 16 + 3C000000530000002C0100001C010000 + + + + 35897 + 35897 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + A3040000660000008D0500007A010000 + + + 16 + 3C000000530000002C0100001C010000 + + + + 35898 + 35898 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + A3040000660000008D0500007A010000 + + + 16 + 3C000000530000002C0100001C010000 + + + + 35899 + 35899 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + A3040000660000008D0500007A010000 + + + 16 + 3C000000530000002C0100001C010000 + + + + 35900 + 35900 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + A3040000660000008D0500007A010000 + + + 16 + 3C000000530000002C0100001C010000 + + + + 35901 + 35901 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + A3040000660000008D0500007A010000 + + + 16 + 3C000000530000002C0100001C010000 + + + + 35902 + 35902 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + A3040000660000008D0500007A010000 + + + 16 + 3C000000530000002C0100001C010000 + + + + 35903 + 35903 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + A3040000660000008D0500007A010000 + + + 16 + 3C000000530000002C0100001C010000 + + + + 35904 + 35904 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + A3040000660000008D0500007A010000 + + + 16 + 3C000000530000002C0100001C010000 + + + + 35905 + 35905 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + A3040000660000008D0500007A010000 + + + 16 + 3C000000530000002C0100001C010000 + + + + 38003 + 38003 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000066000000ED0000009E020000 + + + 16 + 3C00000053000000580100008F020000 + + + + 38007 + 38007 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 000000006403000090050000DE030000 + + + 16 + 3C0000005300000004030000E1000000 + + + + 436 + 436 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 03000000670300008D050000C5030000 + + + 16 + 3C00000053000000580100008F020000 + + + + 437 + 437 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 030000002C0200008D0500008A020000 + + + 16 + 3C000000530000002C0100001C010000 + + + + 440 + 440 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 030000002C0200008D0500008A020000 + + + 16 + 3C000000530000002C0100001C010000 + + + + 463 + 463 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 03000000670300008D050000C5030000 + + + 16 + 3C00000053000000580100008F020000 + + + + 466 + 466 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 03000000670300008D050000C5030000 + + + 16 + 3C00000053000000580100008F020000 + + + + 470 + 470 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + F7000000660000008D050000C4000000 + + + 16 + 3C0000005300000004030000E1000000 + + + + 50000 + 50000 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + A3040000660000008D0500007A010000 + + + 16 + 3C000000530000002C0100001C010000 + + + + 50001 + 50001 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + A3040000660000008D0500007A010000 + + + 16 + 3C000000530000002C0100001C010000 + + + + 50002 + 50002 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + A3040000660000008D0500007A010000 + + + 16 + 3C000000530000002C0100001C010000 + + + + 50003 + 50003 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + A3040000660000008D0500007A010000 + + + 16 + 3C000000530000002C0100001C010000 + + + + 50004 + 50004 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + A3040000660000008D0500007A010000 + + + 16 + 3C000000530000002C0100001C010000 + + + + 50005 + 50005 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + A3040000660000008D0500007A010000 + + + 16 + 3C000000530000002C0100001C010000 + + + + 50006 + 50006 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + A3040000660000008D0500007A010000 + + + 16 + 3C000000530000002C0100001C010000 + + + + 50007 + 50007 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + A3040000660000008D0500007A010000 + + + 16 + 3C000000530000002C0100001C010000 + + + + 50008 + 50008 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + A3040000660000008D0500007A010000 + + + 16 + 3C000000530000002C0100001C010000 + + + + 50009 + 50009 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + A3040000660000008D0500007A010000 + + + 16 + 3C000000530000002C0100001C010000 + + + + 50010 + 50010 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + A3040000660000008D0500007A010000 + + + 16 + 3C000000530000002C0100001C010000 + + + + 50011 + 50011 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + A3040000660000008D0500007A010000 + + + 16 + 3C000000530000002C0100001C010000 + + + + 50012 + 50012 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + A3040000660000008D0500007A010000 + + + 16 + 3C000000530000002C0100001C010000 + + + + 50013 + 50013 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + A3040000660000008D0500007A010000 + + + 16 + 3C000000530000002C0100001C010000 + + + + 50014 + 50014 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + A3040000660000008D0500007A010000 + + + 16 + 3C000000530000002C0100001C010000 + + + + 50015 + 50015 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + A3040000660000008D0500007A010000 + + + 16 + 3C000000530000002C0100001C010000 + + + + 50016 + 50016 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + A3040000660000008D0500007A010000 + + + 16 + 3C000000530000002C0100001C010000 + + + + 50017 + 50017 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + A3040000660000008D0500007A010000 + + + 16 + 3C000000530000002C0100001C010000 + + + + 50018 + 50018 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + A3040000660000008D0500007A010000 + + + 16 + 3C000000530000002C0100001C010000 + + + + 50019 + 50019 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + A3040000660000008D0500007A010000 + + + 16 + 3C000000530000002C0100001C010000 + + + + 59392 + 59392 + 1 + 0 + 0 + 0 + 32767 + 0 + 8192 + 0 + + 16 + 0000000000000000D10300001C000000 + + + 16 + 0A0000000A0000006E0000006E000000 + + + + 59393 + 0 + 1 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 00000000DE03000080070000F1030000 + + + 16 + 0A0000000A0000006E0000006E000000 + + + + 59399 + 59399 + 1 + 0 + 0 + 0 + 32767 + 0 + 8192 + 1 + + 16 + 000000001C000000E701000038000000 + + + 16 + 0A0000000A0000006E0000006E000000 + + + + 59400 + 59400 + 0 + 0 + 0 + 0 + 32767 + 0 + 8192 + 2 + + 16 + 00000000380000006F02000054000000 + + + 16 + 0A0000000A0000006E0000006E000000 + + + + 824 + 824 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 030000002C0200008D0500008A020000 + + + 16 + 3C000000530000002C0100001C010000 + + + + 3312 + 000000000B000000000000000020000000000000FFFFFFFFFFFFFFFFF4000000DD00000090050000E1000000000000000100001004000000010000000000000000000000FFFFFFFF08000000CB00000057010000CC000000F08B00005A01000079070000D601000045890000FFFF02000B004354616262656450616E6500200000000000003C0000005300000004030000E1000000F40000004F00000090050000DD0000000000000040280046080000000B446973617373656D626C7900000000CB00000001000000FFFFFFFFFFFFFFFF14506572666F726D616E636520416E616C797A6572000000005701000001000000FFFFFFFFFFFFFFFF14506572666F726D616E636520416E616C797A657200000000CC00000001000000FFFFFFFFFFFFFFFF0E4C6F67696320416E616C797A657200000000F08B000001000000FFFFFFFFFFFFFFFF0D436F646520436F766572616765000000005A01000001000000FFFFFFFFFFFFFFFF11496E737472756374696F6E205472616365000000007907000001000000FFFFFFFFFFFFFFFF0F53797374656D20416E616C797A657200000000D601000001000000FFFFFFFFFFFFFFFF104576656E742053746174697374696373000000004589000001000000FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000001000000FFFFFFFFCB00000001000000FFFFFFFFCB000000000000000040000000000000FFFFFFFFFFFFFFFF9C0400004F000000A004000025020000000000000200001004000000010000000000000000000000FFFFFFFF2B000000E2050000CA0900002D8C00002E8C00002F8C0000308C0000318C0000328C0000338C0000348C0000358C0000368C0000378C0000388C0000398C00003A8C00003B8C00003C8C00003D8C00003E8C00003F8C0000408C0000418C000050C3000051C3000052C3000053C3000054C3000055C3000056C3000057C3000058C3000059C300005AC300005BC300005CC300005DC300005EC300005FC3000060C3000061C3000062C3000063C30000018000400000000000003C000000530000002C0100001C010000A00400004F000000900500002502000000000000404100462B0000000753796D626F6C7300000000E205000001000000FFFFFFFFFFFFFFFF0A5472616365204461746100000000CA09000001000000FFFFFFFFFFFFFFFF00000000002D8C000001000000FFFFFFFFFFFFFFFF00000000002E8C000001000000FFFFFFFFFFFFFFFF00000000002F8C000001000000FFFFFFFFFFFFFFFF0000000000308C000001000000FFFFFFFFFFFFFFFF0000000000318C000001000000FFFFFFFFFFFFFFFF0000000000328C000001000000FFFFFFFFFFFFFFFF0000000000338C000001000000FFFFFFFFFFFFFFFF0000000000348C000001000000FFFFFFFFFFFFFFFF0000000000358C000001000000FFFFFFFFFFFFFFFF0000000000368C000001000000FFFFFFFFFFFFFFFF0000000000378C000001000000FFFFFFFFFFFFFFFF0000000000388C000001000000FFFFFFFFFFFFFFFF0000000000398C000001000000FFFFFFFFFFFFFFFF00000000003A8C000001000000FFFFFFFFFFFFFFFF00000000003B8C000001000000FFFFFFFFFFFFFFFF00000000003C8C000001000000FFFFFFFFFFFFFFFF00000000003D8C000001000000FFFFFFFFFFFFFFFF00000000003E8C000001000000FFFFFFFFFFFFFFFF00000000003F8C000001000000FFFFFFFFFFFFFFFF0000000000408C000001000000FFFFFFFFFFFFFFFF0000000000418C000001000000FFFFFFFFFFFFFFFF000000000050C3000001000000FFFFFFFFFFFFFFFF000000000051C3000001000000FFFFFFFFFFFFFFFF000000000052C3000001000000FFFFFFFFFFFFFFFF000000000053C3000001000000FFFFFFFFFFFFFFFF000000000054C3000001000000FFFFFFFFFFFFFFFF000000000055C3000001000000FFFFFFFFFFFFFFFF000000000056C3000001000000FFFFFFFFFFFFFFFF000000000057C3000001000000FFFFFFFFFFFFFFFF000000000058C3000001000000FFFFFFFFFFFFFFFF000000000059C3000001000000FFFFFFFFFFFFFFFF00000000005AC3000001000000FFFFFFFFFFFFFFFF00000000005BC3000001000000FFFFFFFFFFFFFFFF00000000005CC3000001000000FFFFFFFFFFFFFFFF00000000005DC3000001000000FFFFFFFFFFFFFFFF00000000005EC3000001000000FFFFFFFFFFFFFFFF00000000005FC3000001000000FFFFFFFFFFFFFFFF000000000060C3000001000000FFFFFFFFFFFFFFFF000000000061C3000001000000FFFFFFFFFFFFFFFF000000000062C3000001000000FFFFFFFFFFFFFFFF000000000063C3000001000000FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000001000000FFFFFFFFE205000001000000FFFFFFFFE2050000000000000010000001000000FFFFFFFFFFFFFFFFF00000004F000000F40000004C030000010000000200001004000000010000000000000000000000FFFFFFFF05000000ED0300006D000000C3000000C400000073940000018000100000010000003C000000530000002C0100001C010000000000004F000000F00000004C0300000000000040410056050000000750726F6A65637401000000ED03000001000000FFFFFFFFFFFFFFFF05426F6F6B73010000006D00000001000000FFFFFFFFFFFFFFFF0946756E6374696F6E7301000000C300000001000000FFFFFFFFFFFFFFFF0954656D706C6174657301000000C400000001000000FFFFFFFFFFFFFFFF09526567697374657273000000007394000001000000FFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000001000000FFFFFFFFED03000001000000FFFFFFFFED030000000000000080000000000000FFFFFFFFFFFFFFFF0000000011020000900500001502000000000000010000100400000001000000000000000000000000000000000000000000000001000000C6000000FFFFFFFF0F0000008F070000930700009407000095070000960700009007000091070000B5010000B801000038030000B9050000BA050000BB050000BC050000CB090000018000800000000000003C000000530000002C0100001C010000000000001502000090050000B702000000000000404100460F0000001343616C6C20537461636B202B204C6F63616C73000000008F07000001000000FFFFFFFFFFFFFFFF0755415254202331000000009307000001000000FFFFFFFFFFFFFFFF0755415254202332000000009407000001000000FFFFFFFFFFFFFFFF0755415254202333000000009507000001000000FFFFFFFFFFFFFFFF15446562756720287072696E74662920566965776572000000009607000001000000FFFFFFFFFFFFFFFF0757617463682031000000009007000001000000FFFFFFFFFFFFFFFF0757617463682032000000009107000001000000FFFFFFFFFFFFFFFF10547261636520457863657074696F6E7300000000B501000001000000FFFFFFFFFFFFFFFF0E4576656E7420436F756E7465727300000000B801000001000000FFFFFFFFFFFFFFFF09554C494E4B706C7573000000003803000001000000FFFFFFFFFFFFFFFF084D656D6F7279203100000000B905000001000000FFFFFFFFFFFFFFFF084D656D6F7279203200000000BA05000001000000FFFFFFFFFFFFFFFF084D656D6F7279203300000000BB05000001000000FFFFFFFFFFFFFFFF084D656D6F7279203400000000BC05000001000000FFFFFFFFFFFFFFFF105472616365204E617669676174696F6E00000000CB09000001000000FFFFFFFFFFFFFFFFFFFFFFFF0000000001000000000000000000000001000000FFFFFFFFC802000015020000CC020000B702000000000000020000000400000000000000000000000000000000000000000000000000000002000000C6000000FFFFFFFF8F07000001000000FFFFFFFF8F07000001000000C6000000000000000080000001000000FFFFFFFFFFFFFFFF000000004C0300008007000050030000010000000100001004000000010000000000000000000000FFFFFFFF06000000C5000000C7000000B4010000D2010000CF01000077940000018000800000010000003C0000005300000004030000E1000000000000005003000080070000DE0300000000000040820056060000000C4275696C64204F757470757401000000C500000001000000FFFFFFFFFFFFFFFF0D46696E6420496E2046696C657300000000C700000001000000FFFFFFFFFFFFFFFF0A4572726F72204C69737400000000B401000001000000FFFFFFFFFFFFFFFF0E536F757263652042726F7773657200000000D201000001000000FFFFFFFFFFFFFFFF0E416C6C205265666572656E63657300000000CF01000001000000FFFFFFFFFFFFFFFF0742726F77736572000000007794000001000000FFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000001000000FFFFFFFFC500000001000000FFFFFFFFC5000000000000000000000000000000 + + + 59392 + File + + 2876 + 00200000010000002800FFFF01001100434D4643546F6F6C426172427574746F6E00E100000000000000000000000000000000000000000000000100000001000000018001E100000000000001000000000000000000000000000000000100000001000000018003E1000000000000020000000000000000000000000000000001000000010000000180CD7F0000000000000300000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018023E100000000000004000000000000000000000000000000000100000001000000018022E100000000000005000000000000000000000000000000000100000001000000018025E10000000000000600000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001802BE10000000004000700000000000000000000000000000000010000000100000001802CE10000000004000800000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001807A8A0000000000000900000000000000000000000000000000010000000100000001807B8A0000000004000A00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180D3B00000000000000B000000000000000000000000000000000100000001000000018015B10000000004000C0000000000000000000000000000000001000000010000000180F4B00000000004000D000000000000000000000000000000000100000001000000018036B10000000004000E00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180FF88000000000000460000000000000000000000000000000001000000010000000180FE880000000000004500000000000000000000000000000000010000000100000001800B810000000000001300000000000000000000000000000000010000000100000001800C810000000000001400000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180F0880000020000000F000000000000000000000000000000000100000001000000FFFF0100120043555646696E64436F6D626F427574746F6EE8030000000000000000000000000000000000000000000000010000000100000096000000020020500000000015424F4F545F464C4153485F53544152545F414444529600000000000000130015424F4F545F464C4153485F53544152545F4144445208626F6F74496E666F0E626F6F746C6F61646572496E666F0D6170706C69636174696F6E466E06584D4F44454D1048414C5F554152545F52656365697665085F5F696E6C696E650B5245545F4C454E5F4552520C6375724672616D65496E74760B747852696E6751756575650B727852696E6751756575650C747852696E674275666665720F72696E675F71756575655F696E69740D6173736572745F6661696C65640E64656C6179426173655469636B731B72696E675F6275666665725F746F74616C5F73697A65285F726229055F6E616D65034E414B0343414E00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000018024E10000000000001100000000000000000000000000000000010000000100000001800A810000000000001200000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000FFFF01001500434D4643546F6F6C4261724D656E75427574746F6E2280000002000000150000002153746172742F53746F70202644656275672053657373696F6E094374726C2B46350000000000000000000000000100000001000000000000000000000001000000020021802280000000000000150000002153746172742F53746F70202644656275672053657373696F6E094374726C2B4635000000000000000000000000010000000100000000000000000000000100000000002180E0010000000000007500000021456E65726779204D6561737572656D656E742026776974686F75742044656275670000000000000000000000000100000001000000000000000000000001000000000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180C488000000000000160000000000000000000000000000000001000000010000000180C988000000000400180000000000000000000000000000000001000000010000000180C788000000000000190000000000000000000000000000000001000000010000002180C8880000000000001700000027264B696C6C20416C6C20427265616B706F696E747320696E2043757272656E7420546172676574000000000000000000000000010000000100000000000000000000000100000003002180C8880000000000001700000027264B696C6C20416C6C20427265616B706F696E747320696E2043757272656E7420546172676574000000000000000000000000010000000100000000000000000000000100000000002180E50100000000000078000000264B696C6C20416C6C20427265616B706F696E747320696E204163746976652050726F6A656374000000000000000000000000010000000100000000000000000000000100000000002180E601000000000000790000002F4B696C6C20416C6C20427265616B706F696E747320696E204D756C74692D50726F6A65637420576F726B73706163650000000000000000000000000100000001000000000000000000000001000000000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000021804C010000020001001A0000000F2650726F6A6563742057696E646F77000000000000000000000000010000000100000000000000000000000100000008002180DD880000000000001A0000000750726F6A656374000000000000000000000000010000000100000000000000000000000100000000002180DC8B0000000000003A00000005426F6F6B73000000000000000000000000010000000100000000000000000000000100000000002180E18B0000000000003B0000000946756E6374696F6E73000000000000000000000000010000000100000000000000000000000100000000002180E28B000000000000400000000954656D706C6174657300000000000000000000000001000000010000000000000000000000010000000000218018890000000000003D0000000E536F757263652042726F777365720000000000000000000000000100000001000000000000000000000001000000000021800000000000000400FFFFFFFF00000000000000000000000000010000000100000000000000000000000100000000002180D988000000000000390000000C4275696C64204F7574707574000000000000000000000000010000000100000000000000000000000100000000002180E38B000000000000410000000B46696E64204F75747075740000000000000000000000000100000001000000000000000000000001000000000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180FB7F0000000000001B000000000000000000000000000000000100000001000000000000000446696C65FF7F0000 + + + 1423 + 2800FFFF01001100434D4643546F6F6C426172427574746F6E00E1000000000000FFFFFFFF000100000000000000010000000000000001000000018001E1000000000000FFFFFFFF000100000000000000010000000000000001000000018003E1000000000000FFFFFFFF0001000000000000000100000000000000010000000180CD7F000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF000000000000000000010000000000000001000000018023E1000000000000FFFFFFFF000100000000000000010000000000000001000000018022E1000000000000FFFFFFFF000100000000000000010000000000000001000000018025E1000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001802BE1000000000000FFFFFFFF00010000000000000001000000000000000100000001802CE1000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001807A8A000000000000FFFFFFFF00010000000000000001000000000000000100000001807B8A000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180D3B0000000000000FFFFFFFF000100000000000000010000000000000001000000018015B1000000000000FFFFFFFF0001000000000000000100000000000000010000000180F4B0000000000000FFFFFFFF000100000000000000010000000000000001000000018036B1000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180FF88000000000000FFFFFFFF0001000000000000000100000000000000010000000180FE88000000000000FFFFFFFF00010000000000000001000000000000000100000001800B81000000000000FFFFFFFF00010000000000000001000000000000000100000001800C81000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180F088000000000000FFFFFFFF0001000000000000000100000000000000010000000180EE7F000000000000FFFFFFFF000100000000000000010000000000000001000000018024E1000000000000FFFFFFFF00010000000000000001000000000000000100000001800A81000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001802280000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180C488000000000000FFFFFFFF0001000000000000000100000000000000010000000180C988000000000000FFFFFFFF0001000000000000000100000000000000010000000180C788000000000000FFFFFFFF0001000000000000000100000000000000010000000180C888000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180DD88000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180FB7F000000000000FFFFFFFF000100000000000000010000000000000001000000 + + + 1423 + 2800FFFF01001100434D4643546F6F6C426172427574746F6E00E100000000000000000000000000000000000000000000000100000001000000018001E100000000000001000000000000000000000000000000000100000001000000018003E1000000000000020000000000000000000000000000000001000000010000000180CD7F0000000000000300000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018023E100000000000004000000000000000000000000000000000100000001000000018022E100000000000005000000000000000000000000000000000100000001000000018025E10000000000000600000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001802BE10000000000000700000000000000000000000000000000010000000100000001802CE10000000000000800000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001807A8A0000000000000900000000000000000000000000000000010000000100000001807B8A0000000000000A00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180D3B00000000000000B000000000000000000000000000000000100000001000000018015B10000000000000C0000000000000000000000000000000001000000010000000180F4B00000000000000D000000000000000000000000000000000100000001000000018036B10000000000000E00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180FF880000000000000F0000000000000000000000000000000001000000010000000180FE880000000000001000000000000000000000000000000000010000000100000001800B810000000000001100000000000000000000000000000000010000000100000001800C810000000000001200000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180F088000000000000130000000000000000000000000000000001000000010000000180EE7F00000000000014000000000000000000000000000000000100000001000000018024E10000000000001500000000000000000000000000000000010000000100000001800A810000000000001600000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018022800000000000001700000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180C488000000000000180000000000000000000000000000000001000000010000000180C988000000000000190000000000000000000000000000000001000000010000000180C7880000000000001A0000000000000000000000000000000001000000010000000180C8880000000000001B00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180DD880000000000001C00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180FB7F0000000000001D000000000000000000000000000000000100000001000000 + + + + 59399 + Build + + 976 + 00200000010000001000FFFF01001100434D4643546F6F6C426172427574746F6ECF7F0000000004001C0000000000000000000000000000000001000000010000000180D07F0000000000001D000000000000000000000000000000000100000001000000018030800000000000001E000000000000000000000000000000000100000001000000FFFF01001500434D4643546F6F6C4261724D656E75427574746F6EC7040000000000006A0000000C4261746368204275696C2664000000000000000000000000010000000100000000000000000000000100000004000580C7040000000000006A0000000C4261746368204275696C266400000000000000000000000001000000010000000000000000000000010000000000058046070000000000006B0000000D42617463682052656275696C640000000000000000000000000100000001000000000000000000000001000000000005804707000000000000FFFFFFFF0B426174636820436C65616E0100000000000000000000000100000001000000000000000000000001000000000005809E8A0000000000001F0000000F4261746326682053657475702E2E2E000000000000000000000000010000000100000000000000000000000100000000000180D17F0000000004002000000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001804C8A0000000000002100000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000FFFF01001900434D4643546F6F6C426172436F6D626F426F78427574746F6EBA000000000000000000000000000000000000000000000000010000000100000096000000030020500000000008546172676574203196000000000000000100085461726765742031000000000180EB880000000000002200000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180C07F000000000000230000000000000000000000000000000001000000010000000180B08A000000000400240000000000000000000000000000000001000000010000000180A8010000000000004E00000000000000000000000000000000010000000100000001807202000000000000530000000000000000000000000000000001000000010000000180BE010000000000005000000000000000000000000000000000010000000100000000000000054275696C64FF7F0000 + + + 583 + 1000FFFF01001100434D4643546F6F6C426172427574746F6ECF7F000000000000FFFFFFFF0001000000000000000100000000000000010000000180D07F000000000000FFFFFFFF00010000000000000001000000000000000100000001803080000000000000FFFFFFFF00010000000000000001000000000000000100000001809E8A000000000000FFFFFFFF0001000000000000000100000000000000010000000180D17F000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001804C8A000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001806680000000000000FFFFFFFF0001000000000000000100000000000000010000000180EB88000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180C07F000000000000FFFFFFFF0001000000000000000100000000000000010000000180B08A000000000000FFFFFFFF0001000000000000000100000000000000010000000180A801000000000000FFFFFFFF00010000000000000001000000000000000100000001807202000000000000FFFFFFFF0001000000000000000100000000000000010000000180BE01000000000000FFFFFFFF000100000000000000010000000000000001000000 + + + 583 + 1000FFFF01001100434D4643546F6F6C426172427574746F6ECF7F000000000000000000000000000000000000000000000001000000010000000180D07F00000000000001000000000000000000000000000000000100000001000000018030800000000000000200000000000000000000000000000000010000000100000001809E8A000000000000030000000000000000000000000000000001000000010000000180D17F0000000000000400000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001804C8A0000000000000500000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001806680000000000000060000000000000000000000000000000001000000010000000180EB880000000000000700000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180C07F000000000000080000000000000000000000000000000001000000010000000180B08A000000000000090000000000000000000000000000000001000000010000000180A8010000000000000A000000000000000000000000000000000100000001000000018072020000000000000B0000000000000000000000000000000001000000010000000180BE010000000000000C000000000000000000000000000000000100000001000000 + + + + 59400 + Debug + + 2373 + 00200000000000001900FFFF01001100434D4643546F6F6C426172427574746F6ECC880000000000002500000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018017800000000000002600000000000000000000000000000000010000000100000001801D800000000000002700000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001801A800000000000002800000000000000000000000000000000010000000100000001801B80000000000000290000000000000000000000000000000001000000010000000180E57F0000000000002A00000000000000000000000000000000010000000100000001801C800000000000002B00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018000890000000000002C00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180E48B0000000000002D0000000000000000000000000000000001000000010000000180F07F0000000000002E0000000000000000000000000000000001000000010000000180E8880000000000003700000000000000000000000000000000010000000100000001803B010000000000002F0000000000000000000000000000000001000000010000000180BB8A00000000000030000000000000000000000000000000000100000001000000FFFF01001500434D4643546F6F6C4261724D656E75427574746F6E0E01000000000000310000000D57617463682057696E646F7773000000000000000000000000010000000100000000000000000000000100000003001380D88B00000000000031000000085761746368202631000000000000000000000000010000000100000000000000000000000100000000001380D98B00000000000031000000085761746368202632000000000000000000000000010000000100000000000000000000000100000000001380CE01000000000000FFFFFFFF0C576174636820416E63686F720100000000000000000000000100000001000000000000000000000001000000000013800F01000000000000320000000E4D656D6F72792057696E646F7773000000000000000000000000010000000100000000000000000000000100000004001380D28B00000000000032000000094D656D6F7279202631000000000000000000000000010000000100000000000000000000000100000000001380D38B00000000000032000000094D656D6F7279202632000000000000000000000000010000000100000000000000000000000100000000001380D48B00000000000032000000094D656D6F7279202633000000000000000000000000010000000100000000000000000000000100000000001380D58B00000000000032000000094D656D6F72792026340000000000000000000000000100000001000000000000000000000001000000000013801001000000000000330000000E53657269616C2057696E646F77730000000000000000000000000100000001000000000000000000000001000000040013809307000000000000330000000855415254202326310000000000000000000000000100000001000000000000000000000001000000000013809407000000000000330000000855415254202326320000000000000000000000000100000001000000000000000000000001000000000013809507000000000000330000000855415254202326330000000000000000000000000100000001000000000000000000000001000000000013809607000000000000330000001626446562756720287072696E746629205669657765720000000000000000000000000100000001000000000000000000000001000000000013803C010000000000007200000010416E616C797369732057696E646F7773000000000000000000000000010000000100000000000000000000000100000004001380658A000000000000340000000F264C6F67696320416E616C797A6572000000000000000000000000010000000100000000000000000000000100000000001380DC7F0000000000003E0000001526506572666F726D616E636520416E616C797A6572000000000000000000000000010000000100000000000000000000000100000000001380E788000000000000380000000E26436F646520436F766572616765000000000000000000000000010000000100000000000000000000000100000000001380CD01000000000000FFFFFFFF0F416E616C7973697320416E63686F7201000000000000000000000001000000010000000000000000000000010000000000138053010000000000003F0000000D54726163652057696E646F77730000000000000000000000000100000001000000000000000000000001000000010013805401000000000000FFFFFFFF115472616365204D656E7520416E63686F720100000000000000000000000100000001000000000000000000000001000000000013802901000000000000350000001553797374656D205669657765722057696E646F77730000000000000000000000000100000001000000000000000000000001000000010013804B01000000000000FFFFFFFF1453797374656D2056696577657220416E63686F720100000000000000000000000100000001000000000000000000000001000000000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000013800189000000000000360000000F26546F6F6C626F782057696E646F7700000000000000000000000001000000010000000000000000000000010000000300138044C5000000000000FFFFFFFF0E5570646174652057696E646F77730100000000000000000000000100000001000000000000000000000001000000000013800000000000000400FFFFFFFF000000000000000000000000000100000001000000000000000000000001000000000013805B01000000000000FFFFFFFF12546F6F6C626F78204D656E75416E63686F720100000000000000000000000100000001000000000000000000000001000000000000000000054465627567FF7F0000 + + + 898 + 1900FFFF01001100434D4643546F6F6C426172427574746F6ECC88000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001801780000000000000FFFFFFFF00010000000000000001000000000000000100000001801D80000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001801A80000000000000FFFFFFFF00010000000000000001000000000000000100000001801B80000000000000FFFFFFFF0001000000000000000100000000000000010000000180E57F000000000000FFFFFFFF00010000000000000001000000000000000100000001801C80000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001800089000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180E48B000000000000FFFFFFFF0001000000000000000100000000000000010000000180F07F000000000000FFFFFFFF0001000000000000000100000000000000010000000180E888000000000000FFFFFFFF00010000000000000001000000000000000100000001803B01000000000000FFFFFFFF0001000000000000000100000000000000010000000180BB8A000000000000FFFFFFFF0001000000000000000100000000000000010000000180D88B000000000000FFFFFFFF0001000000000000000100000000000000010000000180D28B000000000000FFFFFFFF00010000000000000001000000000000000100000001809307000000000000FFFFFFFF0001000000000000000100000000000000010000000180658A000000000000FFFFFFFF0001000000000000000100000000000000010000000180C18A000000000000FFFFFFFF0001000000000000000100000000000000010000000180EE8B000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001800189000000000000FFFFFFFF000100000000000000010000000000000001000000 + + + 898 + 1900FFFF01001100434D4643546F6F6C426172427574746F6ECC880000000000000000000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018017800000000000000100000000000000000000000000000000010000000100000001801D800000000000000200000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001801A800000000000000300000000000000000000000000000000010000000100000001801B80000000000000040000000000000000000000000000000001000000010000000180E57F0000000000000500000000000000000000000000000000010000000100000001801C800000000000000600000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018000890000000000000700000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180E48B000000000000080000000000000000000000000000000001000000010000000180F07F000000000000090000000000000000000000000000000001000000010000000180E8880000000000000A00000000000000000000000000000000010000000100000001803B010000000000000B0000000000000000000000000000000001000000010000000180BB8A0000000000000C0000000000000000000000000000000001000000010000000180D88B0000000000000D0000000000000000000000000000000001000000010000000180D28B0000000000000E000000000000000000000000000000000100000001000000018093070000000000000F0000000000000000000000000000000001000000010000000180658A000000000000100000000000000000000000000000000001000000010000000180C18A000000000000110000000000000000000000000000000001000000010000000180EE8B0000000000001200000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180018900000000000013000000000000000000000000000000000100000001000000 + + + + 0 + 1920 + 1080 + + + + + + 1 + 0 + + 100 + 1 + + ..\SRC\main.c + 21 + 1 + 6 + 1 + + 0 + + + ..\README.txt + 0 + 1 + 5 + 0 + + 0 + + + + +
diff --git a/examples/bootloader_app/MDK/use_example.uvoptx b/examples/bootloader_app/MDK/use_example.uvoptx index f6855f6..b67c79a 100644 --- a/examples/bootloader_app/MDK/use_example.uvoptx +++ b/examples/bootloader_app/MDK/use_example.uvoptx @@ -593,7 +593,7 @@ segger - 0 + 1 0 0 0 @@ -604,7 +604,7 @@ 0 0 0 - ..\..\..\drivers\segger_rtt\SEGGER_RTT.c + ..\..\..\src\segger_rtt\SEGGER_RTT.c SEGGER_RTT.c 0 0 @@ -616,7 +616,7 @@ 0 0 0 - ..\..\..\drivers\segger_rtt\SEGGER_RTT_printf.c + ..\..\..\src\segger_rtt\SEGGER_RTT_printf.c SEGGER_RTT_printf.c 0 0 @@ -692,8 +692,8 @@ 0 0 0 - ..\..\..\drivers\bootloader\bootloader.c - bootloader.c + ..\SRC\main.c + main.c 0 0 @@ -704,8 +704,8 @@ 0 0 0 - ..\..\..\drivers\common\common_include.c - common_include.c + ..\..\..\src\bootloader\bootloader.c + bootloader.c 0 0 @@ -716,8 +716,8 @@ 0 0 0 - ..\SRC\main.c - main.c + ..\..\..\src\common\common_include.c + common_include.c 0 0 diff --git a/examples/bootloader_app/MDK/use_example.uvprojx b/examples/bootloader_app/MDK/use_example.uvprojx index ff4b562..8ad9f49 100644 --- a/examples/bootloader_app/MDK/use_example.uvprojx +++ b/examples/bootloader_app/MDK/use_example.uvprojx @@ -339,7 +339,7 @@ STM32F10X_MD,USE_STDPERIPH_DRIVER - ..\..\[base_on_stm32f1]\stm32f1_lib\driver\inc;..\..\[base_on_stm32f1]\stm32f1_lib\cmsis;..\..\[base_on_stm32f1]\stm32f1_sys;..\..\..\drivers\common;..\..\..\drivers\segger_rtt;..\..\..\drivers\bootloader + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\inc;..\..\[base_on_stm32f1]\stm32f1_lib\cmsis;..\..\[base_on_stm32f1]\stm32f1_sys;..\..\..\src\bootloader;..\..\..\src\common;..\..\..\src\segger_rtt @@ -531,12 +531,12 @@ SEGGER_RTT.c 1 - ..\..\..\drivers\segger_rtt\SEGGER_RTT.c + ..\..\..\src\segger_rtt\SEGGER_RTT.c SEGGER_RTT_printf.c 1 - ..\..\..\drivers\segger_rtt\SEGGER_RTT_printf.c + ..\..\..\src\segger_rtt\SEGGER_RTT_printf.c @@ -569,19 +569,19 @@ source - bootloader.c + main.c 1 - ..\..\..\drivers\bootloader\bootloader.c + ..\SRC\main.c - common_include.c + bootloader.c 1 - ..\..\..\drivers\common\common_include.c + ..\..\..\src\bootloader\bootloader.c - main.c + common_include.c 1 - ..\SRC\main.c + ..\..\..\src\common\common_include.c diff --git a/examples/bootloader_app/README.txt b/examples/bootloader_app/README.txt index 1a15c68..a8124c4 100644 --- a/examples/bootloader_app/README.txt +++ b/examples/bootloader_app/README.txt @@ -2,7 +2,7 @@ 用例使用说明 ================================================================================ Date Author MDK MCU -2024-01-21 ashuai0110 5.35 STM32F1 +2024-01-28 ashuai0110 5.35 STM32F103 ================================================================================ 功能描述 diff --git a/examples/bootloader_app/SRC/main.c b/examples/bootloader_app/SRC/main.c index fd8cc5d..2f45ec0 100644 --- a/examples/bootloader_app/SRC/main.c +++ b/examples/bootloader_app/SRC/main.c @@ -3,7 +3,7 @@ * @file main.c * @author ashuai0110 * @version V1.0 - * @date 2024-01-21 + * @date 2024-01-28 * @brief 使用举例-bootloader_app * ****************************************************************************** diff --git a/examples/bootloader_factory/MDK/use_example.uvguix.yansj b/examples/bootloader_factory/MDK/use_example.uvguix.yansj new file mode 100644 index 0000000..622c316 --- /dev/null +++ b/examples/bootloader_factory/MDK/use_example.uvguix.yansj @@ -0,0 +1,1887 @@ + + + + -6.1 + +
### uVision Project, (C) Keil Software
+ + + + + + + + + + 38003 + Registers + 140 90 + + + 346 + Code Coverage + 1010 160 + + + 204 + Performance Analyzer + 1170 + + + + + + 35141 + Event Statistics + + 200 50 700 + + + 1506 + Symbols + + 80 80 80 + + + 1936 + Watch 1 + + 200 133 133 + + + 1937 + Watch 2 + + 200 133 133 + + + 1935 + Call Stack + Locals + + 200 133 133 + + + 2506 + Trace Data + + 75 135 130 95 70 230 200 150 + + + 466 + Source Browser + 500 + 300 + + + + + + + + 1 + 1 + 0 + 0 + -1 + + + + + + + 44 + 0 + 1 + + -32000 + -32000 + + + -1 + -1 + + + 53 + 784 + 1874 + 1023 + + + + 0 + + 456 + 01000000040000000100000001000000010000000100000000000000020000000000000001000000010000000000000028000000280000000100000002000000000000000100000074443A5C415350726F6A6563745C6D637550726F6A6563745C6D63755F646576656C6F706D656E745F74656D706C6174655C6D63755F72657573655F646576656C6F706D656E745F6D6F64756C655C6578616D706C65735C626F6F746C6F616465725F666163746F72795C524541444D452E747874000000000A524541444D452E74787400000000C5D4F200FFFFFFFF74443A5C415350726F6A6563745C6D637550726F6A6563745C6D63755F646576656C6F706D656E745F74656D706C6174655C6D63755F72657573655F646576656C6F706D656E745F6D6F64756C655C6578616D706C65735C626F6F746C6F616465725F666163746F72795C5352435C6D61696E2E6300000000066D61696E2E6300000000FFDC7800FFFFFFFF0100000010000000C5D4F200FFDC7800BECEA100F0A0A100BCA8E1009CC1B600F7B88600D9ADC200A5C2D700B3A6BE00EAD6A300F6FA7D00B5E99D005FC3CF00C1838300CACAD5000100000000000000020000000C040000A30000004A07000052030000 + + + + 0 + Build + + -1 + -1 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + F40000004F00000090050000DD000000 + + + 16 + 2200000039000000EA020000C7000000 + + + + 1005 + 1005 + 1 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000066000000ED000000E5020000 + + + 16 + 22000000390000001201000002010000 + + + + 109 + 109 + 1 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000066000000ED000000E5020000 + + + 16 + 22000000390000003E01000075020000 + + + + 1465 + 1465 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 000000002902000090050000B7020000 + + + 16 + 2200000039000000EA020000C7000000 + + + + 1466 + 1466 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 030000002C0200008D0500008A020000 + + + 16 + 2200000039000000EA020000C7000000 + + + + 1467 + 1467 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 030000002C0200008D0500008A020000 + + + 16 + 2200000039000000EA020000C7000000 + + + + 1468 + 1468 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 030000002C0200008D0500008A020000 + + + 16 + 2200000039000000EA020000C7000000 + + + + 1506 + 1506 + 0 + 0 + 0 + 0 + 32767 + 0 + 16384 + 0 + + 16 + A3040000660000008D050000FF000000 + + + 16 + 22000000390000001201000002010000 + + + + 1913 + 1913 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + F7000000660000008D050000C4000000 + + + 16 + 2200000039000000EA020000C7000000 + + + + 1935 + 1935 + 0 + 0 + 0 + 0 + 32767 + 0 + 32768 + 0 + + 16 + 030000002C0200008D0500009E020000 + + + 16 + 22000000390000001201000002010000 + + + + 1936 + 1936 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 030000002C0200008D0500008A020000 + + + 16 + 22000000390000001201000002010000 + + + + 1937 + 1937 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 030000002C0200008D0500008A020000 + + + 16 + 22000000390000001201000002010000 + + + + 1939 + 1939 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 030000002C0200008D0500008A020000 + + + 16 + 2200000039000000EA020000C7000000 + + + + 1940 + 1940 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 030000002C0200008D0500008A020000 + + + 16 + 2200000039000000EA020000C7000000 + + + + 1941 + 1941 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 030000002C0200008D0500008A020000 + + + 16 + 2200000039000000EA020000C7000000 + + + + 1942 + 1942 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 030000002C0200008D0500008A020000 + + + 16 + 2200000039000000EA020000C7000000 + + + + 195 + 195 + 1 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000066000000ED000000E5020000 + + + 16 + 22000000390000003E01000075020000 + + + + 196 + 196 + 1 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000066000000ED000000E5020000 + + + 16 + 22000000390000003E01000075020000 + + + + 197 + 197 + 1 + 0 + 0 + 0 + 32767 + 0 + 32768 + 0 + + 16 + 00000000160300003204000090030000 + + + 16 + 2200000039000000EA020000C7000000 + + + + 198 + 198 + 0 + 0 + 0 + 0 + 32767 + 0 + 32768 + 0 + + 16 + 000000001502000090050000B7020000 + + + 16 + 2200000039000000EA020000C7000000 + + + + 199 + 199 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 03000000190300008D05000077030000 + + + 16 + 2200000039000000EA020000C7000000 + + + + 203 + 203 + 0 + 0 + 0 + 0 + 32767 + 0 + 8192 + 0 + + 16 + F40000006300000090050000DD000000 + + + 16 + 2200000039000000EA020000C7000000 + + + + 204 + 204 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + F7000000660000008D050000C4000000 + + + 16 + 2200000039000000EA020000C7000000 + + + + 221 + 221 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 00000000000000000000000000000000 + + + 16 + 0A0000000A0000006E0000006E000000 + + + + 2506 + 2506 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + A0040000630000009005000025020000 + + + 16 + 22000000390000001201000002010000 + + + + 2507 + 2507 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 000000002902000090050000A3020000 + + + 16 + 2200000039000000EA020000C7000000 + + + + 343 + 343 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + F7000000660000008D050000C4000000 + + + 16 + 2200000039000000EA020000C7000000 + + + + 346 + 346 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + F7000000660000008D050000C4000000 + + + 16 + 2200000039000000EA020000C7000000 + + + + 35141 + 35141 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + F40000006300000090050000DD000000 + + + 16 + 22000000390000001201000002010000 + + + + 35824 + 35824 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + F7000000660000008D050000C4000000 + + + 16 + 2200000039000000EA020000C7000000 + + + + 35885 + 35885 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + A3040000660000008D0500007A010000 + + + 16 + 22000000390000001201000002010000 + + + + 35886 + 35886 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + A3040000660000008D0500007A010000 + + + 16 + 22000000390000001201000002010000 + + + + 35887 + 35887 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + A3040000660000008D0500007A010000 + + + 16 + 22000000390000001201000002010000 + + + + 35888 + 35888 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + A3040000660000008D0500007A010000 + + + 16 + 22000000390000001201000002010000 + + + + 35889 + 35889 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + A3040000660000008D0500007A010000 + + + 16 + 22000000390000001201000002010000 + + + + 35890 + 35890 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + A3040000660000008D0500007A010000 + + + 16 + 22000000390000001201000002010000 + + + + 35891 + 35891 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + A3040000660000008D0500007A010000 + + + 16 + 22000000390000001201000002010000 + + + + 35892 + 35892 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + A3040000660000008D0500007A010000 + + + 16 + 22000000390000001201000002010000 + + + + 35893 + 35893 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + A3040000660000008D0500007A010000 + + + 16 + 22000000390000001201000002010000 + + + + 35894 + 35894 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + A3040000660000008D0500007A010000 + + + 16 + 22000000390000001201000002010000 + + + + 35895 + 35895 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + A3040000660000008D0500007A010000 + + + 16 + 22000000390000001201000002010000 + + + + 35896 + 35896 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + A3040000660000008D0500007A010000 + + + 16 + 22000000390000001201000002010000 + + + + 35897 + 35897 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + A3040000660000008D0500007A010000 + + + 16 + 22000000390000001201000002010000 + + + + 35898 + 35898 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + A3040000660000008D0500007A010000 + + + 16 + 22000000390000001201000002010000 + + + + 35899 + 35899 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + A3040000660000008D0500007A010000 + + + 16 + 22000000390000001201000002010000 + + + + 35900 + 35900 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + A3040000660000008D0500007A010000 + + + 16 + 22000000390000001201000002010000 + + + + 35901 + 35901 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + A3040000660000008D0500007A010000 + + + 16 + 22000000390000001201000002010000 + + + + 35902 + 35902 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + A3040000660000008D0500007A010000 + + + 16 + 22000000390000001201000002010000 + + + + 35903 + 35903 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + A3040000660000008D0500007A010000 + + + 16 + 22000000390000001201000002010000 + + + + 35904 + 35904 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + A3040000660000008D0500007A010000 + + + 16 + 22000000390000001201000002010000 + + + + 35905 + 35905 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + A3040000660000008D0500007A010000 + + + 16 + 22000000390000001201000002010000 + + + + 38003 + 38003 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000066000000ED0000009E020000 + + + 16 + 22000000390000003E01000075020000 + + + + 38007 + 38007 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 00000000160300009005000090030000 + + + 16 + 2200000039000000EA020000C7000000 + + + + 436 + 436 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 03000000190300008D05000077030000 + + + 16 + 22000000390000003E01000075020000 + + + + 437 + 437 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 030000002C0200008D0500008A020000 + + + 16 + 22000000390000001201000002010000 + + + + 440 + 440 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 030000002C0200008D0500008A020000 + + + 16 + 22000000390000001201000002010000 + + + + 463 + 463 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 03000000190300008D05000077030000 + + + 16 + 22000000390000003E01000075020000 + + + + 466 + 466 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 03000000190300008D05000077030000 + + + 16 + 22000000390000003E01000075020000 + + + + 470 + 470 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + F7000000660000008D050000C4000000 + + + 16 + 2200000039000000EA020000C7000000 + + + + 50000 + 50000 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + A3040000660000008D0500007A010000 + + + 16 + 22000000390000001201000002010000 + + + + 50001 + 50001 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + A3040000660000008D0500007A010000 + + + 16 + 22000000390000001201000002010000 + + + + 50002 + 50002 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + A3040000660000008D0500007A010000 + + + 16 + 22000000390000001201000002010000 + + + + 50003 + 50003 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + A3040000660000008D0500007A010000 + + + 16 + 22000000390000001201000002010000 + + + + 50004 + 50004 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + A3040000660000008D0500007A010000 + + + 16 + 22000000390000001201000002010000 + + + + 50005 + 50005 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + A3040000660000008D0500007A010000 + + + 16 + 22000000390000001201000002010000 + + + + 50006 + 50006 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + A3040000660000008D0500007A010000 + + + 16 + 22000000390000001201000002010000 + + + + 50007 + 50007 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + A3040000660000008D0500007A010000 + + + 16 + 22000000390000001201000002010000 + + + + 50008 + 50008 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + A3040000660000008D0500007A010000 + + + 16 + 22000000390000001201000002010000 + + + + 50009 + 50009 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + A3040000660000008D0500007A010000 + + + 16 + 22000000390000001201000002010000 + + + + 50010 + 50010 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + A3040000660000008D0500007A010000 + + + 16 + 22000000390000001201000002010000 + + + + 50011 + 50011 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + A3040000660000008D0500007A010000 + + + 16 + 22000000390000001201000002010000 + + + + 50012 + 50012 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + A3040000660000008D0500007A010000 + + + 16 + 22000000390000001201000002010000 + + + + 50013 + 50013 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + A3040000660000008D0500007A010000 + + + 16 + 22000000390000001201000002010000 + + + + 50014 + 50014 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + A3040000660000008D0500007A010000 + + + 16 + 22000000390000001201000002010000 + + + + 50015 + 50015 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + A3040000660000008D0500007A010000 + + + 16 + 22000000390000001201000002010000 + + + + 50016 + 50016 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + A3040000660000008D0500007A010000 + + + 16 + 22000000390000001201000002010000 + + + + 50017 + 50017 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + A3040000660000008D0500007A010000 + + + 16 + 22000000390000001201000002010000 + + + + 50018 + 50018 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + A3040000660000008D0500007A010000 + + + 16 + 22000000390000001201000002010000 + + + + 50019 + 50019 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + A3040000660000008D0500007A010000 + + + 16 + 22000000390000001201000002010000 + + + + 59392 + 59392 + 1 + 0 + 0 + 0 + 32767 + 0 + 8192 + 0 + + 16 + 0000000000000000D10300001C000000 + + + 16 + 0A0000000A0000006E0000006E000000 + + + + 59393 + 0 + 1 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 000000009003000032040000A3030000 + + + 16 + 0A0000000A0000006E0000006E000000 + + + + 59399 + 59399 + 1 + 0 + 0 + 0 + 32767 + 0 + 8192 + 1 + + 16 + 000000001C000000E701000038000000 + + + 16 + 0A0000000A0000006E0000006E000000 + + + + 59400 + 59400 + 0 + 0 + 0 + 0 + 32767 + 0 + 8192 + 2 + + 16 + 00000000380000006F02000054000000 + + + 16 + 0A0000000A0000006E0000006E000000 + + + + 824 + 824 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 030000002C0200008D0500008A020000 + + + 16 + 22000000390000001201000002010000 + + + + 3312 + 000000000B000000000000000020000000000000FFFFFFFFFFFFFFFFF4000000DD00000090050000E1000000000000000100001004000000010000000000000000000000FFFFFFFF08000000CB00000057010000CC000000F08B00005A01000079070000D601000045890000FFFF02000B004354616262656450616E6500200000000000002200000039000000EA020000C7000000F40000004F00000090050000DD0000000000000040280046080000000B446973617373656D626C7900000000CB00000001000000FFFFFFFFFFFFFFFF14506572666F726D616E636520416E616C797A6572000000005701000001000000FFFFFFFFFFFFFFFF14506572666F726D616E636520416E616C797A657200000000CC00000001000000FFFFFFFFFFFFFFFF0E4C6F67696320416E616C797A657200000000F08B000001000000FFFFFFFFFFFFFFFF0D436F646520436F766572616765000000005A01000001000000FFFFFFFFFFFFFFFF11496E737472756374696F6E205472616365000000007907000001000000FFFFFFFFFFFFFFFF0F53797374656D20416E616C797A657200000000D601000001000000FFFFFFFFFFFFFFFF104576656E742053746174697374696373000000004589000001000000FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000001000000FFFFFFFFCB00000001000000FFFFFFFFCB000000000000000040000000000000FFFFFFFFFFFFFFFF9C0400004F000000A004000025020000000000000200001004000000010000000000000000000000FFFFFFFF2B000000E2050000CA0900002D8C00002E8C00002F8C0000308C0000318C0000328C0000338C0000348C0000358C0000368C0000378C0000388C0000398C00003A8C00003B8C00003C8C00003D8C00003E8C00003F8C0000408C0000418C000050C3000051C3000052C3000053C3000054C3000055C3000056C3000057C3000058C3000059C300005AC300005BC300005CC300005DC300005EC300005FC3000060C3000061C3000062C3000063C300000180004000000000000022000000390000001201000002010000A00400004F000000900500002502000000000000404100462B0000000753796D626F6C7300000000E205000001000000FFFFFFFFFFFFFFFF0A5472616365204461746100000000CA09000001000000FFFFFFFFFFFFFFFF00000000002D8C000001000000FFFFFFFFFFFFFFFF00000000002E8C000001000000FFFFFFFFFFFFFFFF00000000002F8C000001000000FFFFFFFFFFFFFFFF0000000000308C000001000000FFFFFFFFFFFFFFFF0000000000318C000001000000FFFFFFFFFFFFFFFF0000000000328C000001000000FFFFFFFFFFFFFFFF0000000000338C000001000000FFFFFFFFFFFFFFFF0000000000348C000001000000FFFFFFFFFFFFFFFF0000000000358C000001000000FFFFFFFFFFFFFFFF0000000000368C000001000000FFFFFFFFFFFFFFFF0000000000378C000001000000FFFFFFFFFFFFFFFF0000000000388C000001000000FFFFFFFFFFFFFFFF0000000000398C000001000000FFFFFFFFFFFFFFFF00000000003A8C000001000000FFFFFFFFFFFFFFFF00000000003B8C000001000000FFFFFFFFFFFFFFFF00000000003C8C000001000000FFFFFFFFFFFFFFFF00000000003D8C000001000000FFFFFFFFFFFFFFFF00000000003E8C000001000000FFFFFFFFFFFFFFFF00000000003F8C000001000000FFFFFFFFFFFFFFFF0000000000408C000001000000FFFFFFFFFFFFFFFF0000000000418C000001000000FFFFFFFFFFFFFFFF000000000050C3000001000000FFFFFFFFFFFFFFFF000000000051C3000001000000FFFFFFFFFFFFFFFF000000000052C3000001000000FFFFFFFFFFFFFFFF000000000053C3000001000000FFFFFFFFFFFFFFFF000000000054C3000001000000FFFFFFFFFFFFFFFF000000000055C3000001000000FFFFFFFFFFFFFFFF000000000056C3000001000000FFFFFFFFFFFFFFFF000000000057C3000001000000FFFFFFFFFFFFFFFF000000000058C3000001000000FFFFFFFFFFFFFFFF000000000059C3000001000000FFFFFFFFFFFFFFFF00000000005AC3000001000000FFFFFFFFFFFFFFFF00000000005BC3000001000000FFFFFFFFFFFFFFFF00000000005CC3000001000000FFFFFFFFFFFFFFFF00000000005DC3000001000000FFFFFFFFFFFFFFFF00000000005EC3000001000000FFFFFFFFFFFFFFFF00000000005FC3000001000000FFFFFFFFFFFFFFFF000000000060C3000001000000FFFFFFFFFFFFFFFF000000000061C3000001000000FFFFFFFFFFFFFFFF000000000062C3000001000000FFFFFFFFFFFFFFFF000000000063C3000001000000FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000001000000FFFFFFFFE205000001000000FFFFFFFFE2050000000000000010000001000000FFFFFFFFFFFFFFFFF00000004F000000F4000000FE020000010000000200001004000000010000000000000000000000FFFFFFFF05000000ED0300006D000000C3000000C4000000739400000180001000000100000022000000390000001201000002010000000000004F000000F0000000FE0200000000000040410056050000000750726F6A65637401000000ED03000001000000FFFFFFFFFFFFFFFF05426F6F6B73010000006D00000001000000FFFFFFFFFFFFFFFF0946756E6374696F6E7301000000C300000001000000FFFFFFFFFFFFFFFF0954656D706C6174657301000000C400000001000000FFFFFFFFFFFFFFFF09526567697374657273000000007394000001000000FFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000001000000FFFFFFFFED03000001000000FFFFFFFFED030000000000000080000000000000FFFFFFFFFFFFFFFF0000000011020000900500001502000000000000010000100400000001000000000000000000000000000000000000000000000001000000C6000000FFFFFFFF0F0000008F070000930700009407000095070000960700009007000091070000B5010000B801000038030000B9050000BA050000BB050000BC050000CB0900000180008000000000000022000000390000001201000002010000000000001502000090050000B702000000000000404100460F0000001343616C6C20537461636B202B204C6F63616C73000000008F07000001000000FFFFFFFFFFFFFFFF0755415254202331000000009307000001000000FFFFFFFFFFFFFFFF0755415254202332000000009407000001000000FFFFFFFFFFFFFFFF0755415254202333000000009507000001000000FFFFFFFFFFFFFFFF15446562756720287072696E74662920566965776572000000009607000001000000FFFFFFFFFFFFFFFF0757617463682031000000009007000001000000FFFFFFFFFFFFFFFF0757617463682032000000009107000001000000FFFFFFFFFFFFFFFF10547261636520457863657074696F6E7300000000B501000001000000FFFFFFFFFFFFFFFF0E4576656E7420436F756E7465727300000000B801000001000000FFFFFFFFFFFFFFFF09554C494E4B706C7573000000003803000001000000FFFFFFFFFFFFFFFF084D656D6F7279203100000000B905000001000000FFFFFFFFFFFFFFFF084D656D6F7279203200000000BA05000001000000FFFFFFFFFFFFFFFF084D656D6F7279203300000000BB05000001000000FFFFFFFFFFFFFFFF084D656D6F7279203400000000BC05000001000000FFFFFFFFFFFFFFFF105472616365204E617669676174696F6E00000000CB09000001000000FFFFFFFFFFFFFFFFFFFFFFFF0000000001000000000000000000000001000000FFFFFFFFC802000015020000CC020000B702000000000000020000000400000000000000000000000000000000000000000000000000000002000000C6000000FFFFFFFF8F07000001000000FFFFFFFF8F07000001000000C6000000000000000080000001000000FFFFFFFFFFFFFFFF00000000FE0200003204000002030000010000000100001004000000010000000000000000000000FFFFFFFF06000000C5000000C7000000B4010000D2010000CF01000077940000018000800000010000002200000039000000EA020000C7000000000000000203000032040000900300000000000040820056060000000C4275696C64204F757470757401000000C500000001000000FFFFFFFFFFFFFFFF0D46696E6420496E2046696C657300000000C700000001000000FFFFFFFFFFFFFFFF0A4572726F72204C69737400000000B401000001000000FFFFFFFFFFFFFFFF0E536F757263652042726F7773657200000000D201000001000000FFFFFFFFFFFFFFFF0E416C6C205265666572656E63657300000000CF01000001000000FFFFFFFFFFFFFFFF0742726F77736572000000007794000001000000FFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000001000000FFFFFFFFC500000001000000FFFFFFFFC5000000000000000000000000000000 + + + 59392 + File + + 2862 + 00200000010000002800FFFF01001100434D4643546F6F6C426172427574746F6E00E100000000000000000000000000000000000000000000000100000001000000018001E100000000000001000000000000000000000000000000000100000001000000018003E1000000000000020000000000000000000000000000000001000000010000000180CD7F0000000000000300000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018023E100000000000004000000000000000000000000000000000100000001000000018022E100000000000005000000000000000000000000000000000100000001000000018025E10000000000000600000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001802BE10000000000000700000000000000000000000000000000010000000100000001802CE10000000004000800000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001807A8A0000000000000900000000000000000000000000000000010000000100000001807B8A0000000004000A00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180D3B00000000000000B000000000000000000000000000000000100000001000000018015B10000000004000C0000000000000000000000000000000001000000010000000180F4B00000000004000D000000000000000000000000000000000100000001000000018036B10000000004000E00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180FF88000000000000460000000000000000000000000000000001000000010000000180FE880000000000004500000000000000000000000000000000010000000100000001800B810000000000001300000000000000000000000000000000010000000100000001800C810000000000001400000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180F0880000020000000F000000000000000000000000000000000100000001000000FFFF0100120043555646696E64436F6D626F427574746F6EE80300000000000000000000000000000000000000000000000100000001000000960000000200205000000000055F5F41534D96000000000000001300055F5F41534D15424F4F545F464C4153485F53544152545F4144445208626F6F74496E666F0E626F6F746C6F61646572496E666F0D6170706C69636174696F6E466E06584D4F44454D1048414C5F554152545F52656365697665085F5F696E6C696E650B5245545F4C454E5F4552520C6375724672616D65496E74760B747852696E6751756575650B727852696E6751756575650C747852696E674275666665720F72696E675F71756575655F696E69740D6173736572745F6661696C65640E64656C6179426173655469636B731B72696E675F6275666665725F746F74616C5F73697A65285F726229055F6E616D65034E414B00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000018024E10000000000001100000000000000000000000000000000010000000100000001800A810000000000001200000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000FFFF01001500434D4643546F6F6C4261724D656E75427574746F6E2280000002000000150000002153746172742F53746F70202644656275672053657373696F6E094374726C2B46350000000000000000000000000100000001000000000000000000000001000000020021802280000000000000150000002153746172742F53746F70202644656275672053657373696F6E094374726C2B4635000000000000000000000000010000000100000000000000000000000100000000002180E0010000000000007500000021456E65726779204D6561737572656D656E742026776974686F75742044656275670000000000000000000000000100000001000000000000000000000001000000000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180C488000000000000160000000000000000000000000000000001000000010000000180C988000000000400180000000000000000000000000000000001000000010000000180C788000000000000190000000000000000000000000000000001000000010000002180C8880000000000001700000027264B696C6C20416C6C20427265616B706F696E747320696E2043757272656E7420546172676574000000000000000000000000010000000100000000000000000000000100000003002180C8880000000000001700000027264B696C6C20416C6C20427265616B706F696E747320696E2043757272656E7420546172676574000000000000000000000000010000000100000000000000000000000100000000002180E50100000000000078000000264B696C6C20416C6C20427265616B706F696E747320696E204163746976652050726F6A656374000000000000000000000000010000000100000000000000000000000100000000002180E601000000000000790000002F4B696C6C20416C6C20427265616B706F696E747320696E204D756C74692D50726F6A65637420576F726B73706163650000000000000000000000000100000001000000000000000000000001000000000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000021804C010000020001001A0000000F2650726F6A6563742057696E646F77000000000000000000000000010000000100000000000000000000000100000008002180DD880000000000001A0000000750726F6A656374000000000000000000000000010000000100000000000000000000000100000000002180DC8B0000000000003A00000005426F6F6B73000000000000000000000000010000000100000000000000000000000100000000002180E18B0000000000003B0000000946756E6374696F6E73000000000000000000000000010000000100000000000000000000000100000000002180E28B000000000000400000000954656D706C6174657300000000000000000000000001000000010000000000000000000000010000000000218018890000000000003D0000000E536F757263652042726F777365720000000000000000000000000100000001000000000000000000000001000000000021800000000000000400FFFFFFFF00000000000000000000000000010000000100000000000000000000000100000000002180D988000000000000390000000C4275696C64204F7574707574000000000000000000000000010000000100000000000000000000000100000000002180E38B000000000000410000000B46696E64204F75747075740000000000000000000000000100000001000000000000000000000001000000000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180FB7F0000000000001B000000000000000000000000000000000100000001000000000000000446696C65FF7F0000 + + + 1423 + 2800FFFF01001100434D4643546F6F6C426172427574746F6E00E1000000000000FFFFFFFF000100000000000000010000000000000001000000018001E1000000000000FFFFFFFF000100000000000000010000000000000001000000018003E1000000000000FFFFFFFF0001000000000000000100000000000000010000000180CD7F000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF000000000000000000010000000000000001000000018023E1000000000000FFFFFFFF000100000000000000010000000000000001000000018022E1000000000000FFFFFFFF000100000000000000010000000000000001000000018025E1000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001802BE1000000000000FFFFFFFF00010000000000000001000000000000000100000001802CE1000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001807A8A000000000000FFFFFFFF00010000000000000001000000000000000100000001807B8A000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180D3B0000000000000FFFFFFFF000100000000000000010000000000000001000000018015B1000000000000FFFFFFFF0001000000000000000100000000000000010000000180F4B0000000000000FFFFFFFF000100000000000000010000000000000001000000018036B1000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180FF88000000000000FFFFFFFF0001000000000000000100000000000000010000000180FE88000000000000FFFFFFFF00010000000000000001000000000000000100000001800B81000000000000FFFFFFFF00010000000000000001000000000000000100000001800C81000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180F088000000000000FFFFFFFF0001000000000000000100000000000000010000000180EE7F000000000000FFFFFFFF000100000000000000010000000000000001000000018024E1000000000000FFFFFFFF00010000000000000001000000000000000100000001800A81000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001802280000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180C488000000000000FFFFFFFF0001000000000000000100000000000000010000000180C988000000000000FFFFFFFF0001000000000000000100000000000000010000000180C788000000000000FFFFFFFF0001000000000000000100000000000000010000000180C888000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180DD88000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180FB7F000000000000FFFFFFFF000100000000000000010000000000000001000000 + + + 1423 + 2800FFFF01001100434D4643546F6F6C426172427574746F6E00E100000000000000000000000000000000000000000000000100000001000000018001E100000000000001000000000000000000000000000000000100000001000000018003E1000000000000020000000000000000000000000000000001000000010000000180CD7F0000000000000300000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018023E100000000000004000000000000000000000000000000000100000001000000018022E100000000000005000000000000000000000000000000000100000001000000018025E10000000000000600000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001802BE10000000000000700000000000000000000000000000000010000000100000001802CE10000000000000800000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001807A8A0000000000000900000000000000000000000000000000010000000100000001807B8A0000000000000A00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180D3B00000000000000B000000000000000000000000000000000100000001000000018015B10000000000000C0000000000000000000000000000000001000000010000000180F4B00000000000000D000000000000000000000000000000000100000001000000018036B10000000000000E00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180FF880000000000000F0000000000000000000000000000000001000000010000000180FE880000000000001000000000000000000000000000000000010000000100000001800B810000000000001100000000000000000000000000000000010000000100000001800C810000000000001200000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180F088000000000000130000000000000000000000000000000001000000010000000180EE7F00000000000014000000000000000000000000000000000100000001000000018024E10000000000001500000000000000000000000000000000010000000100000001800A810000000000001600000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018022800000000000001700000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180C488000000000000180000000000000000000000000000000001000000010000000180C988000000000000190000000000000000000000000000000001000000010000000180C7880000000000001A0000000000000000000000000000000001000000010000000180C8880000000000001B00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180DD880000000000001C00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180FB7F0000000000001D000000000000000000000000000000000100000001000000 + + + + 59399 + Build + + 976 + 00200000010000001000FFFF01001100434D4643546F6F6C426172427574746F6ECF7F0000000004001C0000000000000000000000000000000001000000010000000180D07F0000000000001D000000000000000000000000000000000100000001000000018030800000000000001E000000000000000000000000000000000100000001000000FFFF01001500434D4643546F6F6C4261724D656E75427574746F6EC7040000000000006A0000000C4261746368204275696C2664000000000000000000000000010000000100000000000000000000000100000004000580C7040000000000006A0000000C4261746368204275696C266400000000000000000000000001000000010000000000000000000000010000000000058046070000000000006B0000000D42617463682052656275696C640000000000000000000000000100000001000000000000000000000001000000000005804707000000000000FFFFFFFF0B426174636820436C65616E0100000000000000000000000100000001000000000000000000000001000000000005809E8A0000000000001F0000000F4261746326682053657475702E2E2E000000000000000000000000010000000100000000000000000000000100000000000180D17F0000000004002000000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001804C8A0000000000002100000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000FFFF01001900434D4643546F6F6C426172436F6D626F426F78427574746F6EBA000000000000000000000000000000000000000000000000010000000100000096000000030020500000000008546172676574203196000000000000000100085461726765742031000000000180EB880000000000002200000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180C07F000000000000230000000000000000000000000000000001000000010000000180B08A000000000400240000000000000000000000000000000001000000010000000180A8010000000000004E00000000000000000000000000000000010000000100000001807202000000000000530000000000000000000000000000000001000000010000000180BE010000000000005000000000000000000000000000000000010000000100000000000000054275696C64FF7F0000 + + + 583 + 1000FFFF01001100434D4643546F6F6C426172427574746F6ECF7F000000000000FFFFFFFF0001000000000000000100000000000000010000000180D07F000000000000FFFFFFFF00010000000000000001000000000000000100000001803080000000000000FFFFFFFF00010000000000000001000000000000000100000001809E8A000000000000FFFFFFFF0001000000000000000100000000000000010000000180D17F000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001804C8A000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001806680000000000000FFFFFFFF0001000000000000000100000000000000010000000180EB88000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180C07F000000000000FFFFFFFF0001000000000000000100000000000000010000000180B08A000000000000FFFFFFFF0001000000000000000100000000000000010000000180A801000000000000FFFFFFFF00010000000000000001000000000000000100000001807202000000000000FFFFFFFF0001000000000000000100000000000000010000000180BE01000000000000FFFFFFFF000100000000000000010000000000000001000000 + + + 583 + 1000FFFF01001100434D4643546F6F6C426172427574746F6ECF7F000000000000000000000000000000000000000000000001000000010000000180D07F00000000000001000000000000000000000000000000000100000001000000018030800000000000000200000000000000000000000000000000010000000100000001809E8A000000000000030000000000000000000000000000000001000000010000000180D17F0000000000000400000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001804C8A0000000000000500000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001806680000000000000060000000000000000000000000000000001000000010000000180EB880000000000000700000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180C07F000000000000080000000000000000000000000000000001000000010000000180B08A000000000000090000000000000000000000000000000001000000010000000180A8010000000000000A000000000000000000000000000000000100000001000000018072020000000000000B0000000000000000000000000000000001000000010000000180BE010000000000000C000000000000000000000000000000000100000001000000 + + + + 59400 + Debug + + 2373 + 00200000000000001900FFFF01001100434D4643546F6F6C426172427574746F6ECC880000000000002500000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018017800000000000002600000000000000000000000000000000010000000100000001801D800000000000002700000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001801A800000000000002800000000000000000000000000000000010000000100000001801B80000000000000290000000000000000000000000000000001000000010000000180E57F0000000000002A00000000000000000000000000000000010000000100000001801C800000000000002B00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018000890000000000002C00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180E48B0000000000002D0000000000000000000000000000000001000000010000000180F07F0000000000002E0000000000000000000000000000000001000000010000000180E8880000000000003700000000000000000000000000000000010000000100000001803B010000000000002F0000000000000000000000000000000001000000010000000180BB8A00000000000030000000000000000000000000000000000100000001000000FFFF01001500434D4643546F6F6C4261724D656E75427574746F6E0E01000000000000310000000D57617463682057696E646F7773000000000000000000000000010000000100000000000000000000000100000003001380D88B00000000000031000000085761746368202631000000000000000000000000010000000100000000000000000000000100000000001380D98B00000000000031000000085761746368202632000000000000000000000000010000000100000000000000000000000100000000001380CE01000000000000FFFFFFFF0C576174636820416E63686F720100000000000000000000000100000001000000000000000000000001000000000013800F01000000000000320000000E4D656D6F72792057696E646F7773000000000000000000000000010000000100000000000000000000000100000004001380D28B00000000000032000000094D656D6F7279202631000000000000000000000000010000000100000000000000000000000100000000001380D38B00000000000032000000094D656D6F7279202632000000000000000000000000010000000100000000000000000000000100000000001380D48B00000000000032000000094D656D6F7279202633000000000000000000000000010000000100000000000000000000000100000000001380D58B00000000000032000000094D656D6F72792026340000000000000000000000000100000001000000000000000000000001000000000013801001000000000000330000000E53657269616C2057696E646F77730000000000000000000000000100000001000000000000000000000001000000040013809307000000000000330000000855415254202326310000000000000000000000000100000001000000000000000000000001000000000013809407000000000000330000000855415254202326320000000000000000000000000100000001000000000000000000000001000000000013809507000000000000330000000855415254202326330000000000000000000000000100000001000000000000000000000001000000000013809607000000000000330000001626446562756720287072696E746629205669657765720000000000000000000000000100000001000000000000000000000001000000000013803C010000000000007200000010416E616C797369732057696E646F7773000000000000000000000000010000000100000000000000000000000100000004001380658A000000000000340000000F264C6F67696320416E616C797A6572000000000000000000000000010000000100000000000000000000000100000000001380DC7F0000000000003E0000001526506572666F726D616E636520416E616C797A6572000000000000000000000000010000000100000000000000000000000100000000001380E788000000000000380000000E26436F646520436F766572616765000000000000000000000000010000000100000000000000000000000100000000001380CD01000000000000FFFFFFFF0F416E616C7973697320416E63686F7201000000000000000000000001000000010000000000000000000000010000000000138053010000000000003F0000000D54726163652057696E646F77730000000000000000000000000100000001000000000000000000000001000000010013805401000000000000FFFFFFFF115472616365204D656E7520416E63686F720100000000000000000000000100000001000000000000000000000001000000000013802901000000000000350000001553797374656D205669657765722057696E646F77730000000000000000000000000100000001000000000000000000000001000000010013804B01000000000000FFFFFFFF1453797374656D2056696577657220416E63686F720100000000000000000000000100000001000000000000000000000001000000000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000013800189000000000000360000000F26546F6F6C626F782057696E646F7700000000000000000000000001000000010000000000000000000000010000000300138044C5000000000000FFFFFFFF0E5570646174652057696E646F77730100000000000000000000000100000001000000000000000000000001000000000013800000000000000400FFFFFFFF000000000000000000000000000100000001000000000000000000000001000000000013805B01000000000000FFFFFFFF12546F6F6C626F78204D656E75416E63686F720100000000000000000000000100000001000000000000000000000001000000000000000000054465627567FF7F0000 + + + 898 + 1900FFFF01001100434D4643546F6F6C426172427574746F6ECC88000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001801780000000000000FFFFFFFF00010000000000000001000000000000000100000001801D80000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001801A80000000000000FFFFFFFF00010000000000000001000000000000000100000001801B80000000000000FFFFFFFF0001000000000000000100000000000000010000000180E57F000000000000FFFFFFFF00010000000000000001000000000000000100000001801C80000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001800089000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180E48B000000000000FFFFFFFF0001000000000000000100000000000000010000000180F07F000000000000FFFFFFFF0001000000000000000100000000000000010000000180E888000000000000FFFFFFFF00010000000000000001000000000000000100000001803B01000000000000FFFFFFFF0001000000000000000100000000000000010000000180BB8A000000000000FFFFFFFF0001000000000000000100000000000000010000000180D88B000000000000FFFFFFFF0001000000000000000100000000000000010000000180D28B000000000000FFFFFFFF00010000000000000001000000000000000100000001809307000000000000FFFFFFFF0001000000000000000100000000000000010000000180658A000000000000FFFFFFFF0001000000000000000100000000000000010000000180C18A000000000000FFFFFFFF0001000000000000000100000000000000010000000180EE8B000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001800189000000000000FFFFFFFF000100000000000000010000000000000001000000 + + + 898 + 1900FFFF01001100434D4643546F6F6C426172427574746F6ECC880000000000000000000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018017800000000000000100000000000000000000000000000000010000000100000001801D800000000000000200000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001801A800000000000000300000000000000000000000000000000010000000100000001801B80000000000000040000000000000000000000000000000001000000010000000180E57F0000000000000500000000000000000000000000000000010000000100000001801C800000000000000600000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018000890000000000000700000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180E48B000000000000080000000000000000000000000000000001000000010000000180F07F000000000000090000000000000000000000000000000001000000010000000180E8880000000000000A00000000000000000000000000000000010000000100000001803B010000000000000B0000000000000000000000000000000001000000010000000180BB8A0000000000000C0000000000000000000000000000000001000000010000000180D88B0000000000000D0000000000000000000000000000000001000000010000000180D28B0000000000000E000000000000000000000000000000000100000001000000018093070000000000000F0000000000000000000000000000000001000000010000000180658A000000000000100000000000000000000000000000000001000000010000000180C18A000000000000110000000000000000000000000000000001000000010000000180EE8B0000000000001200000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180018900000000000013000000000000000000000000000000000100000001000000 + + + + 0 + 1920 + 1080 + + + + + + 1 + 0 + + 100 + 0 + + ..\README.txt + 0 + 1 + 5 + 0 + + 0 + + + ..\SRC\main.c + 23 + 1 + 6 + 1 + + 0 + + + + +
diff --git a/examples/bootloader_factory/MDK/use_example.uvoptx b/examples/bootloader_factory/MDK/use_example.uvoptx index f6855f6..b67c79a 100644 --- a/examples/bootloader_factory/MDK/use_example.uvoptx +++ b/examples/bootloader_factory/MDK/use_example.uvoptx @@ -593,7 +593,7 @@ segger - 0 + 1 0 0 0 @@ -604,7 +604,7 @@ 0 0 0 - ..\..\..\drivers\segger_rtt\SEGGER_RTT.c + ..\..\..\src\segger_rtt\SEGGER_RTT.c SEGGER_RTT.c 0 0 @@ -616,7 +616,7 @@ 0 0 0 - ..\..\..\drivers\segger_rtt\SEGGER_RTT_printf.c + ..\..\..\src\segger_rtt\SEGGER_RTT_printf.c SEGGER_RTT_printf.c 0 0 @@ -692,8 +692,8 @@ 0 0 0 - ..\..\..\drivers\bootloader\bootloader.c - bootloader.c + ..\SRC\main.c + main.c 0 0 @@ -704,8 +704,8 @@ 0 0 0 - ..\..\..\drivers\common\common_include.c - common_include.c + ..\..\..\src\bootloader\bootloader.c + bootloader.c 0 0 @@ -716,8 +716,8 @@ 0 0 0 - ..\SRC\main.c - main.c + ..\..\..\src\common\common_include.c + common_include.c 0 0 diff --git a/examples/bootloader_factory/MDK/use_example.uvprojx b/examples/bootloader_factory/MDK/use_example.uvprojx index 8c6d6ad..c7efa5a 100644 --- a/examples/bootloader_factory/MDK/use_example.uvprojx +++ b/examples/bootloader_factory/MDK/use_example.uvprojx @@ -339,7 +339,7 @@ STM32F10X_MD,USE_STDPERIPH_DRIVER - ..\..\[base_on_stm32f1]\stm32f1_lib\driver\inc;..\..\[base_on_stm32f1]\stm32f1_lib\cmsis;..\..\[base_on_stm32f1]\stm32f1_sys;..\..\..\drivers\common;..\..\..\drivers\segger_rtt;..\..\..\drivers\bootloader + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\inc;..\..\[base_on_stm32f1]\stm32f1_lib\cmsis;..\..\[base_on_stm32f1]\stm32f1_sys;..\..\..\src\bootloader;..\..\..\src\common;..\..\..\src\segger_rtt @@ -531,12 +531,12 @@ SEGGER_RTT.c 1 - ..\..\..\drivers\segger_rtt\SEGGER_RTT.c + ..\..\..\src\segger_rtt\SEGGER_RTT.c SEGGER_RTT_printf.c 1 - ..\..\..\drivers\segger_rtt\SEGGER_RTT_printf.c + ..\..\..\src\segger_rtt\SEGGER_RTT_printf.c @@ -569,19 +569,19 @@ source - bootloader.c + main.c 1 - ..\..\..\drivers\bootloader\bootloader.c + ..\SRC\main.c - common_include.c + bootloader.c 1 - ..\..\..\drivers\common\common_include.c + ..\..\..\src\bootloader\bootloader.c - main.c + common_include.c 1 - ..\SRC\main.c + ..\..\..\src\common\common_include.c diff --git a/examples/bootloader_factory/README.txt b/examples/bootloader_factory/README.txt index 7ce348e..859be2d 100644 --- a/examples/bootloader_factory/README.txt +++ b/examples/bootloader_factory/README.txt @@ -2,7 +2,7 @@ 用例使用说明 ================================================================================ Date Author MDK MCU -2024-01-21 ashuai0110 5.35 STM32F1 +2024-01-28 ashuai0110 5.35 STM32F103 ================================================================================ 功能描述 diff --git a/examples/bootloader_factory/SRC/main.c b/examples/bootloader_factory/SRC/main.c index d15565c..3a15822 100644 --- a/examples/bootloader_factory/SRC/main.c +++ b/examples/bootloader_factory/SRC/main.c @@ -3,7 +3,7 @@ * @file main.c * @author ashuai0110 * @version V1.0 - * @date 2024-01-21 + * @date 2024-01-28 * @brief 使用举例-bootloader_factory * ****************************************************************************** diff --git a/examples/command_line/MDK/use_example.uvoptx b/examples/command_line/MDK/use_example.uvoptx index 11a306d..88efe2a 100644 --- a/examples/command_line/MDK/use_example.uvoptx +++ b/examples/command_line/MDK/use_example.uvoptx @@ -534,7 +534,7 @@ 0 0 0 - ..\..\..\drivers\segger_rtt\SEGGER_RTT.c + ..\..\..\src\segger_rtt\SEGGER_RTT.c SEGGER_RTT.c 0 0 @@ -546,7 +546,7 @@ 0 0 0 - ..\..\..\drivers\segger_rtt\SEGGER_RTT_printf.c + ..\..\..\src\segger_rtt\SEGGER_RTT_printf.c SEGGER_RTT_printf.c 0 0 @@ -586,8 +586,8 @@ 0 0 0 - ..\..\..\drivers\modules\command_line.c - command_line.c + ..\..\..\src\common\common_include.c + common_include.c 0 0 @@ -598,8 +598,8 @@ 0 0 0 - ..\..\..\drivers\common\common_include.c - common_include.c + ..\..\..\src\modules\command_line.c + command_line.c 0 0 diff --git a/examples/command_line/MDK/use_example.uvprojx b/examples/command_line/MDK/use_example.uvprojx index 266a511..b95bede 100644 --- a/examples/command_line/MDK/use_example.uvprojx +++ b/examples/command_line/MDK/use_example.uvprojx @@ -339,7 +339,7 @@ STM32F10X_MD,USE_STDPERIPH_DRIVER - ..\..\[base_on_stm32f1]\stm32f1_lib\driver\inc;..\..\[base_on_stm32f1]\stm32f1_lib\cmsis;..\..\[base_on_stm32f1]\stm32f1_sys;..\..\..\drivers\common;..\..\..\drivers\modules;..\..\..\drivers\segger_rtt + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\inc;..\..\[base_on_stm32f1]\stm32f1_lib\cmsis;..\..\[base_on_stm32f1]\stm32f1_sys;..\..\..\src\common;..\..\..\src\modules;..\..\..\src\segger_rtt @@ -531,12 +531,12 @@ SEGGER_RTT.c 1 - ..\..\..\drivers\segger_rtt\SEGGER_RTT.c + ..\..\..\src\segger_rtt\SEGGER_RTT.c SEGGER_RTT_printf.c 1 - ..\..\..\drivers\segger_rtt\SEGGER_RTT_printf.c + ..\..\..\src\segger_rtt\SEGGER_RTT_printf.c @@ -552,14 +552,14 @@ ..\SRC\main.c - command_line.c + common_include.c 1 - ..\..\..\drivers\modules\command_line.c + ..\..\..\src\common\common_include.c - common_include.c + command_line.c 1 - ..\..\..\drivers\common\common_include.c + ..\..\..\src\modules\command_line.c diff --git a/examples/command_line/README.txt b/examples/command_line/README.txt index cddf29a..d9ea961 100644 --- a/examples/command_line/README.txt +++ b/examples/command_line/README.txt @@ -2,7 +2,7 @@ 用例使用说明 ================================================================================ Date Author MDK MCU -2024-01-18 ashuai0110 5.35 STM32F1 +2024-01-28 ashuai0110 5.35 STM32F103 ================================================================================ 功能描述 diff --git a/examples/command_line/SRC/main.c b/examples/command_line/SRC/main.c index 93ce8f6..a690dc8 100644 --- a/examples/command_line/SRC/main.c +++ b/examples/command_line/SRC/main.c @@ -3,7 +3,7 @@ * @file main.c * @author ashuai0110 * @version V1.0 - * @date 2024-01-18 + * @date 2024-01-28 * @brief 使用举例-命令行交互 * ****************************************************************************** diff --git a/examples/delay_no_block/MDK/use_example.uvoptx b/examples/delay_no_block/MDK/use_example.uvoptx index 5cf68c8..a95f4b1 100644 --- a/examples/delay_no_block/MDK/use_example.uvoptx +++ b/examples/delay_no_block/MDK/use_example.uvoptx @@ -523,7 +523,7 @@ segger - 0 + 1 0 0 0 @@ -534,7 +534,7 @@ 0 0 0 - ..\..\..\drivers\segger_rtt\SEGGER_RTT.c + ..\..\..\src\segger_rtt\SEGGER_RTT.c SEGGER_RTT.c 0 0 @@ -546,7 +546,7 @@ 0 0 0 - ..\..\..\drivers\segger_rtt\SEGGER_RTT_printf.c + ..\..\..\src\segger_rtt\SEGGER_RTT_printf.c SEGGER_RTT_printf.c 0 0 @@ -598,8 +598,8 @@ 0 0 0 - ..\..\..\drivers\modules\delay_no_block.c - delay_no_block.c + ..\..\..\src\common\common_include.c + common_include.c 0 0 @@ -610,8 +610,8 @@ 0 0 0 - ..\..\..\drivers\common\common_include.c - common_include.c + ..\..\..\src\modules\delay_no_block.c + delay_no_block.c 0 0 diff --git a/examples/delay_no_block/MDK/use_example.uvprojx b/examples/delay_no_block/MDK/use_example.uvprojx index 3b6c52d..c11e377 100644 --- a/examples/delay_no_block/MDK/use_example.uvprojx +++ b/examples/delay_no_block/MDK/use_example.uvprojx @@ -339,7 +339,7 @@ STM32F10X_MD,USE_STDPERIPH_DRIVER - ..\..\[base_on_stm32f1]\stm32f1_lib\driver\inc;..\..\[base_on_stm32f1]\stm32f1_lib\cmsis;..\..\[base_on_stm32f1]\stm32f1_sys;..\..\..\drivers\common;..\..\..\drivers\modules;..\..\..\drivers\segger_rtt + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\inc;..\..\[base_on_stm32f1]\stm32f1_lib\cmsis;..\..\[base_on_stm32f1]\stm32f1_sys;..\..\..\src\common;..\..\..\src\modules;..\..\..\src\segger_rtt @@ -531,12 +531,12 @@ SEGGER_RTT.c 1 - ..\..\..\drivers\segger_rtt\SEGGER_RTT.c + ..\..\..\src\segger_rtt\SEGGER_RTT.c SEGGER_RTT_printf.c 1 - ..\..\..\drivers\segger_rtt\SEGGER_RTT_printf.c + ..\..\..\src\segger_rtt\SEGGER_RTT_printf.c @@ -559,14 +559,14 @@ ..\SRC\main.c - delay_no_block.c + common_include.c 1 - ..\..\..\drivers\modules\delay_no_block.c + ..\..\..\src\common\common_include.c - common_include.c + delay_no_block.c 1 - ..\..\..\drivers\common\common_include.c + ..\..\..\src\modules\delay_no_block.c diff --git a/examples/delay_no_block/README.txt b/examples/delay_no_block/README.txt index 4ccdedf..0b80116 100644 --- a/examples/delay_no_block/README.txt +++ b/examples/delay_no_block/README.txt @@ -2,7 +2,7 @@ 用例使用说明 ================================================================================ Date Author MDK MCU -2024-01-18 ashuai0110 5.35 STM32F1 +2024-01-28 ashuai0110 5.35 STM32F103 ================================================================================ 功能描述 diff --git a/examples/delay_no_block/SRC/main.c b/examples/delay_no_block/SRC/main.c index 7196c3a..6ad78b8 100644 --- a/examples/delay_no_block/SRC/main.c +++ b/examples/delay_no_block/SRC/main.c @@ -3,7 +3,7 @@ * @file main.c * @author ashuai0110 * @version V1.0 - * @date 2024-01-18 + * @date 2024-01-28 * @brief 使用举例-非阻塞延时 * ****************************************************************************** diff --git a/examples/input_output/MDK/use_example.uvoptx b/examples/input_output/MDK/use_example.uvoptx index 3db0c71..6a70bc4 100644 --- a/examples/input_output/MDK/use_example.uvoptx +++ b/examples/input_output/MDK/use_example.uvoptx @@ -523,7 +523,7 @@ segger - 0 + 1 0 0 0 @@ -534,7 +534,7 @@ 0 0 0 - ..\..\..\drivers\segger_rtt\SEGGER_RTT.c + ..\..\..\src\segger_rtt\SEGGER_RTT.c SEGGER_RTT.c 0 0 @@ -546,7 +546,7 @@ 0 0 0 - ..\..\..\drivers\segger_rtt\SEGGER_RTT_printf.c + ..\..\..\src\segger_rtt\SEGGER_RTT_printf.c SEGGER_RTT_printf.c 0 0 @@ -610,8 +610,8 @@ 0 0 0 - ..\..\..\drivers\modules\input_output.c - input_output.c + ..\..\..\src\common\common_include.c + common_include.c 0 0 @@ -622,8 +622,8 @@ 0 0 0 - ..\..\..\drivers\common\common_include.c - common_include.c + ..\..\..\src\modules\input_output.c + input_output.c 0 0 diff --git a/examples/input_output/MDK/use_example.uvprojx b/examples/input_output/MDK/use_example.uvprojx index b54df4e..5786f4d 100644 --- a/examples/input_output/MDK/use_example.uvprojx +++ b/examples/input_output/MDK/use_example.uvprojx @@ -339,7 +339,7 @@ STM32F10X_MD,USE_STDPERIPH_DRIVER - ..\..\[base_on_stm32f1]\stm32f1_lib\driver\inc;..\..\[base_on_stm32f1]\stm32f1_lib\cmsis;..\..\[base_on_stm32f1]\stm32f1_sys;..\..\..\drivers\common;..\..\..\drivers\modules;..\..\..\drivers\segger_rtt + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\inc;..\..\[base_on_stm32f1]\stm32f1_lib\cmsis;..\..\[base_on_stm32f1]\stm32f1_sys;..\..\..\src\common;..\..\..\src\modules;..\..\..\src\segger_rtt @@ -531,12 +531,12 @@ SEGGER_RTT.c 1 - ..\..\..\drivers\segger_rtt\SEGGER_RTT.c + ..\..\..\src\segger_rtt\SEGGER_RTT.c SEGGER_RTT_printf.c 1 - ..\..\..\drivers\segger_rtt\SEGGER_RTT_printf.c + ..\..\..\src\segger_rtt\SEGGER_RTT_printf.c @@ -564,14 +564,14 @@ ..\SRC\main.c - input_output.c + common_include.c 1 - ..\..\..\drivers\modules\input_output.c + ..\..\..\src\common\common_include.c - common_include.c + input_output.c 1 - ..\..\..\drivers\common\common_include.c + ..\..\..\src\modules\input_output.c diff --git a/examples/input_output/README.txt b/examples/input_output/README.txt index f99f6a1..85f7c57 100644 --- a/examples/input_output/README.txt +++ b/examples/input_output/README.txt @@ -2,7 +2,7 @@ 用例使用说明 ================================================================================ Date Author MDK MCU -2024-01-18 ashuai0110 5.35 STM32F1 +2024-01-28 ashuai0110 5.35 STM32F103 ================================================================================ 功能描述 diff --git a/examples/input_output/SRC/main.c b/examples/input_output/SRC/main.c index f408305..8f84dcd 100644 --- a/examples/input_output/SRC/main.c +++ b/examples/input_output/SRC/main.c @@ -3,7 +3,7 @@ * @file main.c * @author ashuai0110 * @version V1.0 - * @date 2024-01-18 + * @date 2024-01-28 * @brief 使用举例-IO输入输出操作 * ****************************************************************************** diff --git a/examples/memory/MDK/use_example.uvoptx b/examples/memory/MDK/use_example.uvoptx index b3155d0..e06cc73 100644 --- a/examples/memory/MDK/use_example.uvoptx +++ b/examples/memory/MDK/use_example.uvoptx @@ -523,7 +523,7 @@ segger - 0 + 1 0 0 0 @@ -534,7 +534,7 @@ 0 0 0 - ..\..\..\drivers\segger_rtt\SEGGER_RTT.c + ..\..\..\src\segger_rtt\SEGGER_RTT.c SEGGER_RTT.c 0 0 @@ -546,7 +546,7 @@ 0 0 0 - ..\..\..\drivers\segger_rtt\SEGGER_RTT_printf.c + ..\..\..\src\segger_rtt\SEGGER_RTT_printf.c SEGGER_RTT_printf.c 0 0 @@ -586,8 +586,8 @@ 0 0 0 - ..\..\..\drivers\modules\memory.c - memory.c + ..\..\..\src\common\common_include.c + common_include.c 0 0 @@ -598,8 +598,8 @@ 0 0 0 - ..\..\..\drivers\common\common_include.c - common_include.c + ..\..\..\src\modules\memory.c + memory.c 0 0 diff --git a/examples/memory/MDK/use_example.uvprojx b/examples/memory/MDK/use_example.uvprojx index 9acda5c..167c562 100644 --- a/examples/memory/MDK/use_example.uvprojx +++ b/examples/memory/MDK/use_example.uvprojx @@ -339,7 +339,7 @@ STM32F10X_MD,USE_STDPERIPH_DRIVER - ..\..\[base_on_stm32f1]\stm32f1_lib\driver\inc;..\..\[base_on_stm32f1]\stm32f1_lib\cmsis;..\..\[base_on_stm32f1]\stm32f1_sys;..\..\..\drivers\common;..\..\..\drivers\modules;..\..\..\drivers\segger_rtt + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\inc;..\..\[base_on_stm32f1]\stm32f1_lib\cmsis;..\..\[base_on_stm32f1]\stm32f1_sys;..\..\..\src\common;..\..\..\src\modules;..\..\..\src\segger_rtt @@ -531,12 +531,12 @@ SEGGER_RTT.c 1 - ..\..\..\drivers\segger_rtt\SEGGER_RTT.c + ..\..\..\src\segger_rtt\SEGGER_RTT.c SEGGER_RTT_printf.c 1 - ..\..\..\drivers\segger_rtt\SEGGER_RTT_printf.c + ..\..\..\src\segger_rtt\SEGGER_RTT_printf.c @@ -552,14 +552,14 @@ ..\SRC\main.c - memory.c + common_include.c 1 - ..\..\..\drivers\modules\memory.c + ..\..\..\src\common\common_include.c - common_include.c + memory.c 1 - ..\..\..\drivers\common\common_include.c + ..\..\..\src\modules\memory.c diff --git a/examples/memory/README.txt b/examples/memory/README.txt index fcc6320..a4edbae 100644 --- a/examples/memory/README.txt +++ b/examples/memory/README.txt @@ -2,7 +2,7 @@ 用例使用说明 ================================================================================ Date Author MDK MCU -2024-01-18 ashuai0110 5.35 STM32F1 +2024-01-28 ashuai0110 5.35 STM32F103 ================================================================================ 功能描述 diff --git a/examples/memory/SRC/main.c b/examples/memory/SRC/main.c index ce40592..425e906 100644 --- a/examples/memory/SRC/main.c +++ b/examples/memory/SRC/main.c @@ -3,7 +3,7 @@ * @file main.c * @author ashuai0110 * @version V1.0 - * @date 2024-01-18 + * @date 2024-01-28 * @brief 使用举例-内存管理 * ****************************************************************************** diff --git a/examples/message_queue/MDK/use_example.uvoptx b/examples/message_queue/MDK/use_example.uvoptx index f4a6481..9bc473e 100644 --- a/examples/message_queue/MDK/use_example.uvoptx +++ b/examples/message_queue/MDK/use_example.uvoptx @@ -523,7 +523,7 @@ segger - 0 + 1 0 0 0 @@ -534,7 +534,7 @@ 0 0 0 - ..\..\..\drivers\segger_rtt\SEGGER_RTT.c + ..\..\..\src\segger_rtt\SEGGER_RTT.c SEGGER_RTT.c 0 0 @@ -546,7 +546,7 @@ 0 0 0 - ..\..\..\drivers\segger_rtt\SEGGER_RTT_printf.c + ..\..\..\src\segger_rtt\SEGGER_RTT_printf.c SEGGER_RTT_printf.c 0 0 @@ -586,8 +586,8 @@ 0 0 0 - ..\..\..\drivers\modules\message_queue.c - message_queue.c + ..\..\..\src\common\common_include.c + common_include.c 0 0 @@ -598,8 +598,8 @@ 0 0 0 - ..\..\..\drivers\common\common_include.c - common_include.c + ..\..\..\src\modules\message_queue.c + message_queue.c 0 0 diff --git a/examples/message_queue/MDK/use_example.uvprojx b/examples/message_queue/MDK/use_example.uvprojx index a18b1cd..1a8acfd 100644 --- a/examples/message_queue/MDK/use_example.uvprojx +++ b/examples/message_queue/MDK/use_example.uvprojx @@ -339,7 +339,7 @@ STM32F10X_MD,USE_STDPERIPH_DRIVER - ..\..\[base_on_stm32f1]\stm32f1_lib\driver\inc;..\..\[base_on_stm32f1]\stm32f1_lib\cmsis;..\..\[base_on_stm32f1]\stm32f1_sys;..\..\..\drivers\common;..\..\..\drivers\modules;..\..\..\drivers\segger_rtt + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\inc;..\..\[base_on_stm32f1]\stm32f1_lib\cmsis;..\..\[base_on_stm32f1]\stm32f1_sys;..\..\..\src\common;..\..\..\src\modules;..\..\..\src\segger_rtt @@ -531,12 +531,12 @@ SEGGER_RTT.c 1 - ..\..\..\drivers\segger_rtt\SEGGER_RTT.c + ..\..\..\src\segger_rtt\SEGGER_RTT.c SEGGER_RTT_printf.c 1 - ..\..\..\drivers\segger_rtt\SEGGER_RTT_printf.c + ..\..\..\src\segger_rtt\SEGGER_RTT_printf.c @@ -552,14 +552,14 @@ ..\SRC\main.c - message_queue.c + common_include.c 1 - ..\..\..\drivers\modules\message_queue.c + ..\..\..\src\common\common_include.c - common_include.c + message_queue.c 1 - ..\..\..\drivers\common\common_include.c + ..\..\..\src\modules\message_queue.c diff --git a/examples/message_queue/README.txt b/examples/message_queue/README.txt index 706c0a4..395b642 100644 --- a/examples/message_queue/README.txt +++ b/examples/message_queue/README.txt @@ -2,7 +2,7 @@ 用例使用说明 ================================================================================ Date Author MDK MCU -2024-01-18 ashuai0110 5.35 STM32F1 +2024-01-28 ashuai0110 5.35 STM32F103 ================================================================================ 功能描述 diff --git a/examples/message_queue/SRC/main.c b/examples/message_queue/SRC/main.c index e2e5cbd..5d5a50a 100644 --- a/examples/message_queue/SRC/main.c +++ b/examples/message_queue/SRC/main.c @@ -3,7 +3,7 @@ * @file main.c * @author ashuai0110 * @version V1.0 - * @date 2024-01-18 + * @date 2024-01-28 * @brief 使用举例-消息队列 * ****************************************************************************** diff --git a/examples/modbus_host/MDK/use_example.uvoptx b/examples/modbus_host/MDK/use_example.uvoptx index 3d4ac98..4da9e30 100644 --- a/examples/modbus_host/MDK/use_example.uvoptx +++ b/examples/modbus_host/MDK/use_example.uvoptx @@ -161,7 +161,7 @@ 0 0 1 - ..\..\..\drivers\modbus\modbus_host.c + D:\ASProject\mcuProject\mcu_development_template\mcu_reuse_development_module\drivers\modbus\modbus_host.c \\use_example\../../../drivers/modbus/modbus_host.c\534 @@ -177,7 +177,7 @@ 0 0 0 - ..\..\..\drivers\modbus\modbus_host.c + D:\ASProject\mcuProject\mcu_development_template\mcu_reuse_development_module\drivers\modbus\modbus_host.c @@ -576,7 +576,7 @@ segger - 0 + 1 0 0 0 @@ -587,7 +587,7 @@ 0 0 0 - ..\..\..\drivers\segger_rtt\SEGGER_RTT.c + ..\..\..\src\segger_rtt\SEGGER_RTT.c SEGGER_RTT.c 0 0 @@ -599,7 +599,7 @@ 0 0 0 - ..\..\..\drivers\segger_rtt\SEGGER_RTT_printf.c + ..\..\..\src\segger_rtt\SEGGER_RTT_printf.c SEGGER_RTT_printf.c 0 0 @@ -663,8 +663,8 @@ 0 0 0 - ..\..\..\drivers\modbus\modbus_host.c - modbus_host.c + ..\..\..\src\common\common_include.c + common_include.c 0 0 @@ -675,7 +675,7 @@ 0 0 0 - ..\..\..\drivers\modbus\modbus_common.c + ..\..\..\src\modbus\modbus_common.c modbus_common.c 0 0 @@ -687,8 +687,8 @@ 0 0 0 - ..\..\..\drivers\common\common_include.c - common_include.c + ..\..\..\src\modbus\modbus_host.c + modbus_host.c 0 0 diff --git a/examples/modbus_host/MDK/use_example.uvprojx b/examples/modbus_host/MDK/use_example.uvprojx index 255512b..8dfde4b 100644 --- a/examples/modbus_host/MDK/use_example.uvprojx +++ b/examples/modbus_host/MDK/use_example.uvprojx @@ -339,7 +339,7 @@ STM32F10X_MD,USE_STDPERIPH_DRIVER - ..\..\[base_on_stm32f1]\stm32f1_lib\driver\inc;..\..\[base_on_stm32f1]\stm32f1_lib\cmsis;..\..\[base_on_stm32f1]\stm32f1_sys;..\..\..\drivers\common;..\..\..\drivers\modules;..\..\..\drivers\segger_rtt;..\..\..\drivers\modbus + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\inc;..\..\[base_on_stm32f1]\stm32f1_lib\cmsis;..\..\[base_on_stm32f1]\stm32f1_sys;..\..\..\src\common;..\..\..\src\segger_rtt;..\..\..\src\modbus @@ -531,12 +531,12 @@ SEGGER_RTT.c 1 - ..\..\..\drivers\segger_rtt\SEGGER_RTT.c + ..\..\..\src\segger_rtt\SEGGER_RTT.c SEGGER_RTT_printf.c 1 - ..\..\..\drivers\segger_rtt\SEGGER_RTT_printf.c + ..\..\..\src\segger_rtt\SEGGER_RTT_printf.c @@ -564,19 +564,19 @@ ..\SRC\main.c - modbus_host.c + common_include.c 1 - ..\..\..\drivers\modbus\modbus_host.c + ..\..\..\src\common\common_include.c modbus_common.c 1 - ..\..\..\drivers\modbus\modbus_common.c + ..\..\..\src\modbus\modbus_common.c - common_include.c + modbus_host.c 1 - ..\..\..\drivers\common\common_include.c + ..\..\..\src\modbus\modbus_host.c diff --git a/examples/modbus_host/README.txt b/examples/modbus_host/README.txt index 9c016c6..f385645 100644 --- a/examples/modbus_host/README.txt +++ b/examples/modbus_host/README.txt @@ -2,7 +2,7 @@ 用例使用说明 ================================================================================ Date Author MDK MCU -2024-01-18 ashuai0110 5.35 STM32F1 +2024-01-28 ashuai0110 5.35 STM32F103 ================================================================================ 功能描述 diff --git a/examples/modbus_host/SRC/main.c b/examples/modbus_host/SRC/main.c index 16ada27..cffa335 100644 --- a/examples/modbus_host/SRC/main.c +++ b/examples/modbus_host/SRC/main.c @@ -3,7 +3,7 @@ * @file main.c * @author ashuai0110 * @version V1.0 - * @date 2024-01-18 + * @date 2024-01-28 * @brief 使用举例-MODBUS主机程序 * ****************************************************************************** diff --git a/examples/modbus_slave/MDK/use_example.uvoptx b/examples/modbus_slave/MDK/use_example.uvoptx index 7acadbc..5bfab9c 100644 --- a/examples/modbus_slave/MDK/use_example.uvoptx +++ b/examples/modbus_slave/MDK/use_example.uvoptx @@ -543,7 +543,7 @@ segger - 0 + 1 0 0 0 @@ -554,7 +554,7 @@ 0 0 0 - ..\..\..\drivers\segger_rtt\SEGGER_RTT.c + ..\..\..\src\segger_rtt\SEGGER_RTT.c SEGGER_RTT.c 0 0 @@ -566,7 +566,7 @@ 0 0 0 - ..\..\..\drivers\segger_rtt\SEGGER_RTT_printf.c + ..\..\..\src\segger_rtt\SEGGER_RTT_printf.c SEGGER_RTT_printf.c 0 0 @@ -630,8 +630,8 @@ 0 0 0 - ..\..\..\drivers\modbus\modbus_common.c - modbus_common.c + ..\..\..\src\common\common_include.c + common_include.c 0 0 @@ -642,8 +642,8 @@ 0 0 0 - ..\..\..\drivers\modbus\modbus_slave.c - modbus_slave.c + ..\..\..\src\modbus\modbus_common.c + modbus_common.c 0 0 @@ -654,8 +654,8 @@ 0 0 0 - ..\..\..\drivers\common\common_include.c - common_include.c + ..\..\..\src\modbus\modbus_slave.c + modbus_slave.c 0 0 diff --git a/examples/modbus_slave/MDK/use_example.uvprojx b/examples/modbus_slave/MDK/use_example.uvprojx index 10305c0..065a0b5 100644 --- a/examples/modbus_slave/MDK/use_example.uvprojx +++ b/examples/modbus_slave/MDK/use_example.uvprojx @@ -339,7 +339,7 @@ STM32F10X_MD,USE_STDPERIPH_DRIVER - ..\..\[base_on_stm32f1]\stm32f1_lib\driver\inc;..\..\[base_on_stm32f1]\stm32f1_lib\cmsis;..\..\[base_on_stm32f1]\stm32f1_sys;..\..\..\drivers\common;..\..\..\drivers\modules;..\..\..\drivers\segger_rtt;..\..\..\drivers\modbus + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\inc;..\..\[base_on_stm32f1]\stm32f1_lib\cmsis;..\..\[base_on_stm32f1]\stm32f1_sys;..\..\..\src\common;..\..\..\src\segger_rtt;..\..\..\src\modbus @@ -531,12 +531,12 @@ SEGGER_RTT.c 1 - ..\..\..\drivers\segger_rtt\SEGGER_RTT.c + ..\..\..\src\segger_rtt\SEGGER_RTT.c SEGGER_RTT_printf.c 1 - ..\..\..\drivers\segger_rtt\SEGGER_RTT_printf.c + ..\..\..\src\segger_rtt\SEGGER_RTT_printf.c @@ -564,19 +564,19 @@ ..\SRC\main.c - modbus_common.c + common_include.c 1 - ..\..\..\drivers\modbus\modbus_common.c + ..\..\..\src\common\common_include.c - modbus_slave.c + modbus_common.c 1 - ..\..\..\drivers\modbus\modbus_slave.c + ..\..\..\src\modbus\modbus_common.c - common_include.c + modbus_slave.c 1 - ..\..\..\drivers\common\common_include.c + ..\..\..\src\modbus\modbus_slave.c diff --git a/examples/modbus_slave/README.txt b/examples/modbus_slave/README.txt index 186eba0..160f085 100644 --- a/examples/modbus_slave/README.txt +++ b/examples/modbus_slave/README.txt @@ -2,7 +2,7 @@ 用例使用说明 ================================================================================ Date Author MDK MCU -2024-01-18 ashuai0110 5.35 STM32F1 +2024-01-28 ashuai0110 5.35 STM32F103 ================================================================================ 功能描述 diff --git a/examples/modbus_slave/SRC/main.c b/examples/modbus_slave/SRC/main.c index 027cda1..29938f3 100644 --- a/examples/modbus_slave/SRC/main.c +++ b/examples/modbus_slave/SRC/main.c @@ -3,7 +3,7 @@ * @file main.c * @author ashuai0110 * @version V1.0 - * @date 2024-01-18 + * @date 2024-01-28 * @brief 使用举例-MODBUS从机程序 * ****************************************************************************** diff --git a/examples/project_template/MDK/use_example.uvoptx b/examples/project_template/MDK/use_example.uvoptx index f8abcc6..07a9259 100644 --- a/examples/project_template/MDK/use_example.uvoptx +++ b/examples/project_template/MDK/use_example.uvoptx @@ -534,7 +534,7 @@ 0 0 0 - ..\..\..\drivers\segger_rtt\SEGGER_RTT.c + ..\..\..\src\segger_rtt\SEGGER_RTT.c SEGGER_RTT.c 0 0 @@ -546,7 +546,7 @@ 0 0 0 - ..\..\..\drivers\segger_rtt\SEGGER_RTT_printf.c + ..\..\..\src\segger_rtt\SEGGER_RTT_printf.c SEGGER_RTT_printf.c 0 0 @@ -650,7 +650,7 @@ - drivers/common + bootloader 1 0 0 @@ -662,43 +662,43 @@ 0 0 0 - ..\..\..\drivers\common\common_include.c - common_include.c + ..\..\..\src\bootloader\bootloader.c + bootloader.c 0 0 - - - - drivers/modbus - 1 - 0 - 0 - 0 - 8 + 7 37 1 0 0 0 - ..\..\..\drivers\modbus\modbus_common.c - modbus_common.c + ..\..\..\src\bootloader\xmodem.c + xmodem.c 0 0 - 8 + 7 38 1 0 0 0 - ..\..\..\drivers\modbus\modbus_host.c - modbus_host.c + ..\..\..\src\bootloader\ymodem.c + ymodem.c 0 0 + + + + common + 1 + 0 + 0 + 0 8 39 @@ -706,15 +706,15 @@ 0 0 0 - ..\..\..\drivers\modbus\modbus_slave.c - modbus_slave.c + ..\..\..\src\common\common_include.c + common_include.c 0 0 - drivers/modules + modbus 1 0 0 @@ -726,8 +726,8 @@ 0 0 0 - ..\..\..\drivers\modules\command_line.c - command_line.c + ..\..\..\src\modbus\modbus_common.c + modbus_common.c 0 0 @@ -738,8 +738,8 @@ 0 0 0 - ..\..\..\drivers\modules\data_check.c - data_check.c + ..\..\..\src\modbus\modbus_host.c + modbus_host.c 0 0 @@ -750,115 +750,115 @@ 0 0 0 - ..\..\..\drivers\modules\data_convert.c - data_convert.c + ..\..\..\src\modbus\modbus_slave.c + modbus_slave.c 0 0 + + + + modules + 1 + 0 + 0 + 0 - 9 + 10 43 1 0 0 0 - ..\..\..\drivers\modules\delay_no_block.c - delay_no_block.c + ..\..\..\src\modules\command_line.c + command_line.c 0 0 - 9 + 10 44 1 0 0 0 - ..\..\..\drivers\modules\input_output.c - input_output.c + ..\..\..\src\modules\data_check.c + data_check.c 0 0 - 9 + 10 45 1 0 0 0 - ..\..\..\drivers\modules\memory.c - memory.c + ..\..\..\src\modules\data_convert.c + data_convert.c 0 0 - 9 + 10 46 1 0 0 0 - ..\..\..\drivers\modules\message_queue.c - message_queue.c + ..\..\..\src\modules\delay_no_block.c + delay_no_block.c 0 0 - 9 + 10 47 1 0 0 0 - ..\..\..\drivers\modules\ring_buffer.c - ring_buffer.c + ..\..\..\src\modules\input_output.c + input_output.c 0 0 - 9 + 10 48 1 0 0 0 - ..\..\..\drivers\modules\sync_method.c - sync_method.c + ..\..\..\src\modules\memory.c + memory.c 0 0 - 9 + 10 49 1 0 0 0 - ..\..\..\drivers\modules\timer_software.c - timer_software.c + ..\..\..\src\modules\message_queue.c + message_queue.c 0 0 - 9 + 10 50 1 0 0 0 - ..\..\..\drivers\modules\uart_handler.c - uart_handler.c + ..\..\..\src\modules\ring_buffer.c + ring_buffer.c 0 0 - - - - drivers/bootloader - 1 - 0 - 0 - 0 10 51 @@ -866,8 +866,8 @@ 0 0 0 - ..\..\..\drivers\bootloader\bootloader.c - bootloader.c + ..\..\..\src\modules\sync_method.c + sync_method.c 0 0 @@ -878,8 +878,8 @@ 0 0 0 - ..\..\..\drivers\bootloader\xmodem.c - xmodem.c + ..\..\..\src\modules\timer_software.c + timer_software.c 0 0 @@ -890,8 +890,8 @@ 0 0 0 - ..\..\..\drivers\bootloader\ymodem.c - ymodem.c + ..\..\..\src\modules\uart_handler.c + uart_handler.c 0 0 diff --git a/examples/project_template/MDK/use_example.uvprojx b/examples/project_template/MDK/use_example.uvprojx index 6ec9a91..cd27116 100644 --- a/examples/project_template/MDK/use_example.uvprojx +++ b/examples/project_template/MDK/use_example.uvprojx @@ -339,7 +339,7 @@ STM32F10X_MD,USE_STDPERIPH_DRIVER - ..\..\[base_on_stm32f1]\stm32f1_lib\driver\inc;..\..\[base_on_stm32f1]\stm32f1_lib\cmsis;..\..\[base_on_stm32f1]\stm32f1_sys;..\..\..\drivers\common;..\..\..\drivers\modules;..\..\..\drivers\segger_rtt;..\..\..\drivers\modbus;..\..\..\drivers\bootloader + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\inc;..\..\[base_on_stm32f1]\stm32f1_lib\cmsis;..\..\[base_on_stm32f1]\stm32f1_sys;..\..\..\src\common;..\..\..\src\modules;..\..\..\src\segger_rtt;..\..\..\src\modbus;..\..\..\src\bootloader @@ -531,12 +531,12 @@ SEGGER_RTT.c 1 - ..\..\..\drivers\segger_rtt\SEGGER_RTT.c + ..\..\..\src\segger_rtt\SEGGER_RTT.c SEGGER_RTT_printf.c 1 - ..\..\..\drivers\segger_rtt\SEGGER_RTT_printf.c + ..\..\..\src\segger_rtt\SEGGER_RTT_printf.c @@ -586,112 +586,112 @@ - drivers/common + bootloader + + + bootloader.c + 1 + ..\..\..\src\bootloader\bootloader.c + + + xmodem.c + 1 + ..\..\..\src\bootloader\xmodem.c + + + ymodem.c + 1 + ..\..\..\src\bootloader\ymodem.c + + + + + common common_include.c 1 - ..\..\..\drivers\common\common_include.c + ..\..\..\src\common\common_include.c - drivers/modbus + modbus modbus_common.c 1 - ..\..\..\drivers\modbus\modbus_common.c + ..\..\..\src\modbus\modbus_common.c modbus_host.c 1 - ..\..\..\drivers\modbus\modbus_host.c + ..\..\..\src\modbus\modbus_host.c modbus_slave.c 1 - ..\..\..\drivers\modbus\modbus_slave.c + ..\..\..\src\modbus\modbus_slave.c - drivers/modules + modules command_line.c 1 - ..\..\..\drivers\modules\command_line.c + ..\..\..\src\modules\command_line.c data_check.c 1 - ..\..\..\drivers\modules\data_check.c + ..\..\..\src\modules\data_check.c data_convert.c 1 - ..\..\..\drivers\modules\data_convert.c + ..\..\..\src\modules\data_convert.c delay_no_block.c 1 - ..\..\..\drivers\modules\delay_no_block.c + ..\..\..\src\modules\delay_no_block.c input_output.c 1 - ..\..\..\drivers\modules\input_output.c + ..\..\..\src\modules\input_output.c memory.c 1 - ..\..\..\drivers\modules\memory.c + ..\..\..\src\modules\memory.c message_queue.c 1 - ..\..\..\drivers\modules\message_queue.c + ..\..\..\src\modules\message_queue.c ring_buffer.c 1 - ..\..\..\drivers\modules\ring_buffer.c + ..\..\..\src\modules\ring_buffer.c sync_method.c 1 - ..\..\..\drivers\modules\sync_method.c + ..\..\..\src\modules\sync_method.c timer_software.c 1 - ..\..\..\drivers\modules\timer_software.c + ..\..\..\src\modules\timer_software.c uart_handler.c 1 - ..\..\..\drivers\modules\uart_handler.c - - - - - drivers/bootloader - - - bootloader.c - 1 - ..\..\..\drivers\bootloader\bootloader.c - - - xmodem.c - 1 - ..\..\..\drivers\bootloader\xmodem.c - - - ymodem.c - 1 - ..\..\..\drivers\bootloader\ymodem.c + ..\..\..\src\modules\uart_handler.c diff --git a/examples/project_template/README.txt b/examples/project_template/README.txt index 3c0b24d..6f300a0 100644 --- a/examples/project_template/README.txt +++ b/examples/project_template/README.txt @@ -2,7 +2,7 @@ 用例使用说明 ================================================================================ Date Author MDK MCU -2024-01-18 ashuai0110 5.35 STM32F1 +2024-01-28 ashuai0110 5.35 STM32F103 ================================================================================ 功能描述 diff --git a/examples/project_template/SRC/main.c b/examples/project_template/SRC/main.c index cc3ab89..4180ed0 100644 --- a/examples/project_template/SRC/main.c +++ b/examples/project_template/SRC/main.c @@ -3,7 +3,7 @@ * @file main.c * @author ashuai0110 * @version V1.0 - * @date 2024-01-18 + * @date 2024-01-28 * @brief 使用举例-工程模版 * ****************************************************************************** @@ -18,11 +18,6 @@ /* 包含头文件-----------------------------------------------------------------*/ #include "stm32f10x.h" -#include "gpio.h" -#include "tim.h" -#include "usart.h" -#include "usart_dma.h" - #include "all_include.h" /* 私有宏定义-----------------------------------------------------------------*/ diff --git a/examples/ring_buffer/MDK/use_example.uvoptx b/examples/ring_buffer/MDK/use_example.uvoptx index 4c8d44b..45338ac 100644 --- a/examples/ring_buffer/MDK/use_example.uvoptx +++ b/examples/ring_buffer/MDK/use_example.uvoptx @@ -523,7 +523,7 @@ segger - 0 + 1 0 0 0 @@ -534,7 +534,7 @@ 0 0 0 - ..\..\..\drivers\segger_rtt\SEGGER_RTT.c + ..\..\..\src\segger_rtt\SEGGER_RTT.c SEGGER_RTT.c 0 0 @@ -546,7 +546,7 @@ 0 0 0 - ..\..\..\drivers\segger_rtt\SEGGER_RTT_printf.c + ..\..\..\src\segger_rtt\SEGGER_RTT_printf.c SEGGER_RTT_printf.c 0 0 @@ -598,8 +598,8 @@ 0 0 0 - ..\..\..\drivers\modules\ring_buffer.c - ring_buffer.c + ..\..\..\src\common\common_include.c + common_include.c 0 0 @@ -610,8 +610,8 @@ 0 0 0 - ..\..\..\drivers\common\common_include.c - common_include.c + ..\..\..\src\modules\ring_buffer.c + ring_buffer.c 0 0 diff --git a/examples/ring_buffer/MDK/use_example.uvprojx b/examples/ring_buffer/MDK/use_example.uvprojx index b08c80b..e11f29b 100644 --- a/examples/ring_buffer/MDK/use_example.uvprojx +++ b/examples/ring_buffer/MDK/use_example.uvprojx @@ -339,7 +339,7 @@ STM32F10X_MD,USE_STDPERIPH_DRIVER - ..\..\[base_on_stm32f1]\stm32f1_lib\driver\inc;..\..\[base_on_stm32f1]\stm32f1_lib\cmsis;..\..\[base_on_stm32f1]\stm32f1_sys;..\..\..\drivers\common;..\..\..\drivers\modules;..\..\..\drivers\segger_rtt + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\inc;..\..\[base_on_stm32f1]\stm32f1_lib\cmsis;..\..\[base_on_stm32f1]\stm32f1_sys;..\..\..\src\common;..\..\..\src\modules;..\..\..\src\segger_rtt @@ -531,12 +531,12 @@ SEGGER_RTT.c 1 - ..\..\..\drivers\segger_rtt\SEGGER_RTT.c + ..\..\..\src\segger_rtt\SEGGER_RTT.c SEGGER_RTT_printf.c 1 - ..\..\..\drivers\segger_rtt\SEGGER_RTT_printf.c + ..\..\..\src\segger_rtt\SEGGER_RTT_printf.c @@ -559,14 +559,14 @@ ..\SRC\main.c - ring_buffer.c + common_include.c 1 - ..\..\..\drivers\modules\ring_buffer.c + ..\..\..\src\common\common_include.c - common_include.c + ring_buffer.c 1 - ..\..\..\drivers\common\common_include.c + ..\..\..\src\modules\ring_buffer.c diff --git a/examples/ring_buffer/README.txt b/examples/ring_buffer/README.txt index fddc5e3..76cb791 100644 --- a/examples/ring_buffer/README.txt +++ b/examples/ring_buffer/README.txt @@ -2,7 +2,7 @@ 用例使用说明 ================================================================================ Date Author MDK MCU -2024-01-18 ashuai0110 5.35 STM32F1 +2024-01-28 ashuai0110 5.35 STM32F103 ================================================================================ 功能描述 diff --git a/examples/ring_buffer/SRC/main.c b/examples/ring_buffer/SRC/main.c index a65e0e8..5afc1be 100644 --- a/examples/ring_buffer/SRC/main.c +++ b/examples/ring_buffer/SRC/main.c @@ -3,7 +3,7 @@ * @file main.c * @author ashuai0110 * @version V1.0 - * @date 2024-01-18 + * @date 2024-01-28 * @brief 使用举例-环形缓冲区 * ****************************************************************************** diff --git a/examples/sync_method/MDK/use_example.uvoptx b/examples/sync_method/MDK/use_example.uvoptx index dead219..52290d8 100644 --- a/examples/sync_method/MDK/use_example.uvoptx +++ b/examples/sync_method/MDK/use_example.uvoptx @@ -523,7 +523,7 @@ segger - 0 + 1 0 0 0 @@ -534,7 +534,7 @@ 0 0 0 - ..\..\..\drivers\segger_rtt\SEGGER_RTT.c + ..\..\..\src\segger_rtt\SEGGER_RTT.c SEGGER_RTT.c 0 0 @@ -546,7 +546,7 @@ 0 0 0 - ..\..\..\drivers\segger_rtt\SEGGER_RTT_printf.c + ..\..\..\src\segger_rtt\SEGGER_RTT_printf.c SEGGER_RTT_printf.c 0 0 @@ -598,8 +598,8 @@ 0 0 0 - ..\..\..\drivers\modules\sync_method.c - sync_method.c + ..\..\..\src\common\common_include.c + common_include.c 0 0 @@ -610,8 +610,8 @@ 0 0 0 - ..\..\..\drivers\common\common_include.c - common_include.c + ..\..\..\src\modules\sync_method.c + sync_method.c 0 0 diff --git a/examples/sync_method/MDK/use_example.uvprojx b/examples/sync_method/MDK/use_example.uvprojx index fb333ba..7a18c85 100644 --- a/examples/sync_method/MDK/use_example.uvprojx +++ b/examples/sync_method/MDK/use_example.uvprojx @@ -339,7 +339,7 @@ STM32F10X_MD,USE_STDPERIPH_DRIVER - ..\..\[base_on_stm32f1]\stm32f1_lib\driver\inc;..\..\[base_on_stm32f1]\stm32f1_lib\cmsis;..\..\[base_on_stm32f1]\stm32f1_sys;..\..\..\drivers\common;..\..\..\drivers\modules;..\..\..\drivers\segger_rtt + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\inc;..\..\[base_on_stm32f1]\stm32f1_lib\cmsis;..\..\[base_on_stm32f1]\stm32f1_sys;..\..\..\src\common;..\..\..\src\modules;..\..\..\src\segger_rtt @@ -531,12 +531,12 @@ SEGGER_RTT.c 1 - ..\..\..\drivers\segger_rtt\SEGGER_RTT.c + ..\..\..\src\segger_rtt\SEGGER_RTT.c SEGGER_RTT_printf.c 1 - ..\..\..\drivers\segger_rtt\SEGGER_RTT_printf.c + ..\..\..\src\segger_rtt\SEGGER_RTT_printf.c @@ -559,14 +559,14 @@ ..\SRC\main.c - sync_method.c + common_include.c 1 - ..\..\..\drivers\modules\sync_method.c + ..\..\..\src\common\common_include.c - common_include.c + sync_method.c 1 - ..\..\..\drivers\common\common_include.c + ..\..\..\src\modules\sync_method.c diff --git a/examples/sync_method/README.txt b/examples/sync_method/README.txt index 605c6a8..c07a291 100644 --- a/examples/sync_method/README.txt +++ b/examples/sync_method/README.txt @@ -2,7 +2,7 @@ 用例使用说明 ================================================================================ Date Author MDK MCU -2024-01-18 ashuai0110 5.35 STM32F1 +2024-01-28 ashuai0110 5.35 STM32F103 ================================================================================ 功能描述 diff --git a/examples/sync_method/SRC/main.c b/examples/sync_method/SRC/main.c index e9b0d2b..bed58c9 100644 --- a/examples/sync_method/SRC/main.c +++ b/examples/sync_method/SRC/main.c @@ -3,7 +3,7 @@ * @file main.c * @author ashuai0110 * @version V1.0 - * @date 2024-01-18 + * @date 2024-01-28 * @brief 使用举例-伪线程同步方法(信号量,互斥锁,事件集) * ****************************************************************************** diff --git a/examples/timer_software/MDK/use_example.uvoptx b/examples/timer_software/MDK/use_example.uvoptx index efbd5da..dc3b7c3 100644 --- a/examples/timer_software/MDK/use_example.uvoptx +++ b/examples/timer_software/MDK/use_example.uvoptx @@ -523,7 +523,7 @@ segger - 0 + 1 0 0 0 @@ -534,7 +534,7 @@ 0 0 0 - ..\..\..\drivers\segger_rtt\SEGGER_RTT.c + ..\..\..\src\segger_rtt\SEGGER_RTT.c SEGGER_RTT.c 0 0 @@ -546,7 +546,7 @@ 0 0 0 - ..\..\..\drivers\segger_rtt\SEGGER_RTT_printf.c + ..\..\..\src\segger_rtt\SEGGER_RTT_printf.c SEGGER_RTT_printf.c 0 0 @@ -610,8 +610,8 @@ 0 0 0 - ..\..\..\drivers\modules\timer_software.c - timer_software.c + ..\..\..\src\common\common_include.c + common_include.c 0 0 @@ -622,8 +622,8 @@ 0 0 0 - ..\..\..\drivers\common\common_include.c - common_include.c + ..\..\..\src\modules\timer_software.c + timer_software.c 0 0 diff --git a/examples/timer_software/MDK/use_example.uvprojx b/examples/timer_software/MDK/use_example.uvprojx index 4016cf6..d488f01 100644 --- a/examples/timer_software/MDK/use_example.uvprojx +++ b/examples/timer_software/MDK/use_example.uvprojx @@ -339,7 +339,7 @@ STM32F10X_MD,USE_STDPERIPH_DRIVER - ..\..\[base_on_stm32f1]\stm32f1_lib\driver\inc;..\..\[base_on_stm32f1]\stm32f1_lib\cmsis;..\..\[base_on_stm32f1]\stm32f1_sys;..\..\..\drivers\common;..\..\..\drivers\modules;..\..\..\drivers\segger_rtt + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\inc;..\..\[base_on_stm32f1]\stm32f1_lib\cmsis;..\..\[base_on_stm32f1]\stm32f1_sys;..\..\..\src\common;..\..\..\src\modules;..\..\..\src\segger_rtt @@ -531,12 +531,12 @@ SEGGER_RTT.c 1 - ..\..\..\drivers\segger_rtt\SEGGER_RTT.c + ..\..\..\src\segger_rtt\SEGGER_RTT.c SEGGER_RTT_printf.c 1 - ..\..\..\drivers\segger_rtt\SEGGER_RTT_printf.c + ..\..\..\src\segger_rtt\SEGGER_RTT_printf.c @@ -564,14 +564,14 @@ ..\SRC\main.c - timer_software.c + common_include.c 1 - ..\..\..\drivers\modules\timer_software.c + ..\..\..\src\common\common_include.c - common_include.c + timer_software.c 1 - ..\..\..\drivers\common\common_include.c + ..\..\..\src\modules\timer_software.c diff --git a/examples/timer_software/README.txt b/examples/timer_software/README.txt index 9fcdbf3..720f378 100644 --- a/examples/timer_software/README.txt +++ b/examples/timer_software/README.txt @@ -2,7 +2,7 @@ 用例使用说明 ================================================================================ Date Author MDK MCU -2024-01-18 ashuai0110 5.35 STM32F1 +2024-01-28 ashuai0110 5.35 STM32F103 ================================================================================ 功能描述 diff --git a/examples/timer_software/SRC/main.c b/examples/timer_software/SRC/main.c index 7686e53..d492f35 100644 --- a/examples/timer_software/SRC/main.c +++ b/examples/timer_software/SRC/main.c @@ -3,7 +3,7 @@ * @file main.c * @author ashuai0110 * @version V1.0 - * @date 2024-01-18 + * @date 2024-01-28 * @brief 使用举例-软件定时器 * ****************************************************************************** diff --git a/examples/uart_handler/MDK/use_example.uvoptx b/examples/uart_handler/MDK/use_example.uvoptx index deda777..a2cac30 100644 --- a/examples/uart_handler/MDK/use_example.uvoptx +++ b/examples/uart_handler/MDK/use_example.uvoptx @@ -523,7 +523,7 @@ segger - 0 + 1 0 0 0 @@ -534,7 +534,7 @@ 0 0 0 - ..\..\..\drivers\segger_rtt\SEGGER_RTT.c + ..\..\..\src\segger_rtt\SEGGER_RTT.c SEGGER_RTT.c 0 0 @@ -546,7 +546,7 @@ 0 0 0 - ..\..\..\drivers\segger_rtt\SEGGER_RTT_printf.c + ..\..\..\src\segger_rtt\SEGGER_RTT_printf.c SEGGER_RTT_printf.c 0 0 @@ -610,8 +610,8 @@ 0 0 0 - ..\..\..\drivers\modules\uart_handler.c - uart_handler.c + ..\..\..\src\common\common_include.c + common_include.c 0 0 @@ -622,8 +622,8 @@ 0 0 0 - ..\..\..\drivers\modules\ring_buffer.c - ring_buffer.c + ..\..\..\src\modules\uart_handler.c + uart_handler.c 0 0 @@ -634,8 +634,8 @@ 0 0 0 - ..\..\..\drivers\common\common_include.c - common_include.c + ..\..\..\src\modules\ring_buffer.c + ring_buffer.c 0 0 diff --git a/examples/uart_handler/MDK/use_example.uvprojx b/examples/uart_handler/MDK/use_example.uvprojx index 2aec182..48ab2c0 100644 --- a/examples/uart_handler/MDK/use_example.uvprojx +++ b/examples/uart_handler/MDK/use_example.uvprojx @@ -339,7 +339,7 @@ STM32F10X_MD,USE_STDPERIPH_DRIVER - ..\..\[base_on_stm32f1]\stm32f1_lib\driver\inc;..\..\[base_on_stm32f1]\stm32f1_lib\cmsis;..\..\[base_on_stm32f1]\stm32f1_sys;..\..\..\drivers\common;..\..\..\drivers\modules;..\..\..\drivers\segger_rtt + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\inc;..\..\[base_on_stm32f1]\stm32f1_lib\cmsis;..\..\[base_on_stm32f1]\stm32f1_sys;..\..\..\src\common;..\..\..\src\modules;..\..\..\src\segger_rtt @@ -531,12 +531,12 @@ SEGGER_RTT.c 1 - ..\..\..\drivers\segger_rtt\SEGGER_RTT.c + ..\..\..\src\segger_rtt\SEGGER_RTT.c SEGGER_RTT_printf.c 1 - ..\..\..\drivers\segger_rtt\SEGGER_RTT_printf.c + ..\..\..\src\segger_rtt\SEGGER_RTT_printf.c @@ -564,19 +564,19 @@ ..\SRC\main.c - uart_handler.c + common_include.c 1 - ..\..\..\drivers\modules\uart_handler.c + ..\..\..\src\common\common_include.c - ring_buffer.c + uart_handler.c 1 - ..\..\..\drivers\modules\ring_buffer.c + ..\..\..\src\modules\uart_handler.c - common_include.c + ring_buffer.c 1 - ..\..\..\drivers\common\common_include.c + ..\..\..\src\modules\ring_buffer.c diff --git a/examples/uart_handler/README.txt b/examples/uart_handler/README.txt index e03e65f..e33e5c2 100644 --- a/examples/uart_handler/README.txt +++ b/examples/uart_handler/README.txt @@ -2,7 +2,7 @@ 用例使用说明 ================================================================================ Date Author MDK MCU -2024-01-22 ashuai0110 5.35 STM32F1 +2024-01-28 ashuai0110 5.35 STM32F103 ================================================================================ 功能描述 diff --git a/examples/uart_handler/SRC/main.c b/examples/uart_handler/SRC/main.c index 798067f..ce6fee7 100644 --- a/examples/uart_handler/SRC/main.c +++ b/examples/uart_handler/SRC/main.c @@ -3,7 +3,7 @@ * @file main.c * @author ashuai0110 * @version V1.0 - * @date 2024-01-22 + * @date 2024-01-28 * @brief 使用举例-串口管理 * ****************************************************************************** diff --git a/examples/xmodem/MDK/use_example.uvoptx b/examples/xmodem/MDK/use_example.uvoptx index b42cb56..20466c1 100644 --- a/examples/xmodem/MDK/use_example.uvoptx +++ b/examples/xmodem/MDK/use_example.uvoptx @@ -585,7 +585,7 @@ segger - 0 + 1 0 0 0 @@ -596,7 +596,7 @@ 0 0 0 - ..\..\..\drivers\segger_rtt\SEGGER_RTT.c + ..\..\..\src\segger_rtt\SEGGER_RTT.c SEGGER_RTT.c 0 0 @@ -608,7 +608,7 @@ 0 0 0 - ..\..\..\drivers\segger_rtt\SEGGER_RTT_printf.c + ..\..\..\src\segger_rtt\SEGGER_RTT_printf.c SEGGER_RTT_printf.c 0 0 @@ -672,8 +672,8 @@ 0 0 0 - ..\..\..\drivers\bootloader\xmodem.c - xmodem.c + ..\..\..\src\common\common_include.c + common_include.c 0 0 @@ -684,8 +684,8 @@ 0 0 0 - ..\..\..\drivers\common\common_include.c - common_include.c + ..\..\..\src\bootloader\xmodem.c + xmodem.c 0 0 diff --git a/examples/xmodem/MDK/use_example.uvprojx b/examples/xmodem/MDK/use_example.uvprojx index f7d1d54..b674a1b 100644 --- a/examples/xmodem/MDK/use_example.uvprojx +++ b/examples/xmodem/MDK/use_example.uvprojx @@ -339,7 +339,7 @@ STM32F10X_MD,USE_STDPERIPH_DRIVER - ..\..\[base_on_stm32f1]\stm32f1_lib\driver\inc;..\..\[base_on_stm32f1]\stm32f1_lib\cmsis;..\..\[base_on_stm32f1]\stm32f1_sys;..\..\..\drivers\common;..\..\..\drivers\segger_rtt;..\..\..\drivers\bootloader + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\inc;..\..\[base_on_stm32f1]\stm32f1_lib\cmsis;..\..\[base_on_stm32f1]\stm32f1_sys;..\..\..\src\common;..\..\..\src\segger_rtt;..\..\..\src\bootloader @@ -531,12 +531,12 @@ SEGGER_RTT.c 1 - ..\..\..\drivers\segger_rtt\SEGGER_RTT.c + ..\..\..\src\segger_rtt\SEGGER_RTT.c SEGGER_RTT_printf.c 1 - ..\..\..\drivers\segger_rtt\SEGGER_RTT_printf.c + ..\..\..\src\segger_rtt\SEGGER_RTT_printf.c @@ -564,14 +564,14 @@ ..\SRC\main.c - xmodem.c + common_include.c 1 - ..\..\..\drivers\bootloader\xmodem.c + ..\..\..\src\common\common_include.c - common_include.c + xmodem.c 1 - ..\..\..\drivers\common\common_include.c + ..\..\..\src\bootloader\xmodem.c diff --git a/examples/xmodem/README.txt b/examples/xmodem/README.txt index a29bbda..2b29fc0 100644 --- a/examples/xmodem/README.txt +++ b/examples/xmodem/README.txt @@ -2,7 +2,7 @@ 用例使用说明 ================================================================================ Date Author MDK MCU -2024-01-21 ashuai0110 5.35 STM32F1 +2024-01-28 ashuai0110 5.35 STM32F103 ================================================================================ 功能描述 diff --git a/examples/xmodem/SRC/main.c b/examples/xmodem/SRC/main.c index 77d446f..70d502a 100644 --- a/examples/xmodem/SRC/main.c +++ b/examples/xmodem/SRC/main.c @@ -3,7 +3,7 @@ * @file main.c * @author ashuai0110 * @version V1.0 - * @date 2024-01-21 + * @date 2024-01-28 * @brief 使用举例-xmodem * ****************************************************************************** diff --git a/examples/ymodem/MDK/use_example.uvoptx b/examples/ymodem/MDK/use_example.uvoptx index 6860077..b1f3971 100644 --- a/examples/ymodem/MDK/use_example.uvoptx +++ b/examples/ymodem/MDK/use_example.uvoptx @@ -161,7 +161,7 @@ 0 0 1 - ..\..\..\drivers\bootloader\ymodem.c + D:\ASProject\mcuProject\mcu_development_template\mcu_reuse_development_module\drivers\bootloader\ymodem.c \\use_example\../../../drivers/bootloader/ymodem.c\419 @@ -177,7 +177,7 @@ 0 0 1 - ..\..\..\drivers\bootloader\ymodem.c + D:\ASProject\mcuProject\mcu_development_template\mcu_reuse_development_module\drivers\bootloader\ymodem.c \\use_example\../../../drivers/bootloader/ymodem.c\427 @@ -193,7 +193,7 @@ 0 0 1 - ..\..\..\drivers\bootloader\ymodem.c + D:\ASProject\mcuProject\mcu_development_template\mcu_reuse_development_module\drivers\bootloader\ymodem.c \\use_example\../../../drivers/bootloader/ymodem.c\441 @@ -209,7 +209,7 @@ 0 0 1 - ..\..\..\drivers\bootloader\ymodem.c + D:\ASProject\mcuProject\mcu_development_template\mcu_reuse_development_module\drivers\bootloader\ymodem.c \\use_example\../../../drivers/bootloader/ymodem.c\481 @@ -225,7 +225,7 @@ 0 0 1 - ..\..\..\drivers\bootloader\ymodem.c + D:\ASProject\mcuProject\mcu_development_template\mcu_reuse_development_module\drivers\bootloader\ymodem.c \\use_example\../../../drivers/bootloader/ymodem.c\557 @@ -241,7 +241,7 @@ 0 0 0 - ..\..\..\drivers\bootloader\ymodem.c + D:\ASProject\mcuProject\mcu_development_template\mcu_reuse_development_module\drivers\bootloader\ymodem.c @@ -257,7 +257,7 @@ 0 0 0 - ..\..\..\drivers\bootloader\ymodem.c + D:\ASProject\mcuProject\mcu_development_template\mcu_reuse_development_module\drivers\bootloader\ymodem.c @@ -273,7 +273,7 @@ 0 0 0 - ..\..\..\drivers\bootloader\ymodem.c + D:\ASProject\mcuProject\mcu_development_template\mcu_reuse_development_module\drivers\bootloader\ymodem.c @@ -289,7 +289,7 @@ 0 0 0 - ..\..\..\drivers\bootloader\ymodem.c + D:\ASProject\mcuProject\mcu_development_template\mcu_reuse_development_module\drivers\bootloader\ymodem.c @@ -305,7 +305,7 @@ 0 0 0 - ..\..\..\drivers\bootloader\ymodem.c + D:\ASProject\mcuProject\mcu_development_template\mcu_reuse_development_module\drivers\bootloader\ymodem.c @@ -746,7 +746,7 @@ segger - 0 + 1 0 0 0 @@ -757,7 +757,7 @@ 0 0 0 - ..\..\..\drivers\segger_rtt\SEGGER_RTT.c + ..\..\..\src\segger_rtt\SEGGER_RTT.c SEGGER_RTT.c 0 0 @@ -769,7 +769,7 @@ 0 0 0 - ..\..\..\drivers\segger_rtt\SEGGER_RTT_printf.c + ..\..\..\src\segger_rtt\SEGGER_RTT_printf.c SEGGER_RTT_printf.c 0 0 @@ -833,7 +833,7 @@ 0 0 0 - ..\..\..\drivers\common\common_include.c + ..\..\..\src\common\common_include.c common_include.c 0 0 @@ -845,7 +845,7 @@ 0 0 0 - ..\..\..\drivers\bootloader\ymodem.c + ..\..\..\src\bootloader\ymodem.c ymodem.c 0 0 diff --git a/examples/ymodem/MDK/use_example.uvprojx b/examples/ymodem/MDK/use_example.uvprojx index d6020e4..d9d6d7c 100644 --- a/examples/ymodem/MDK/use_example.uvprojx +++ b/examples/ymodem/MDK/use_example.uvprojx @@ -339,7 +339,7 @@ STM32F10X_MD,USE_STDPERIPH_DRIVER - ..\..\[base_on_stm32f1]\stm32f1_lib\driver\inc;..\..\[base_on_stm32f1]\stm32f1_lib\cmsis;..\..\[base_on_stm32f1]\stm32f1_sys;..\..\..\drivers\common;..\..\..\drivers\segger_rtt;..\..\..\drivers\bootloader + ..\..\[base_on_stm32f1]\stm32f1_lib\driver\inc;..\..\[base_on_stm32f1]\stm32f1_lib\cmsis;..\..\[base_on_stm32f1]\stm32f1_sys;..\..\..\src\common;..\..\..\src\segger_rtt;..\..\..\src\bootloader @@ -531,12 +531,12 @@ SEGGER_RTT.c 1 - ..\..\..\drivers\segger_rtt\SEGGER_RTT.c + ..\..\..\src\segger_rtt\SEGGER_RTT.c SEGGER_RTT_printf.c 1 - ..\..\..\drivers\segger_rtt\SEGGER_RTT_printf.c + ..\..\..\src\segger_rtt\SEGGER_RTT_printf.c @@ -566,12 +566,12 @@ common_include.c 1 - ..\..\..\drivers\common\common_include.c + ..\..\..\src\common\common_include.c ymodem.c 1 - ..\..\..\drivers\bootloader\ymodem.c + ..\..\..\src\bootloader\ymodem.c diff --git a/examples/ymodem/README.txt b/examples/ymodem/README.txt index 261a1e0..8261eaa 100644 --- a/examples/ymodem/README.txt +++ b/examples/ymodem/README.txt @@ -2,7 +2,7 @@ 用例使用说明 ================================================================================ Date Author MDK MCU -2024-01-21 ashuai0110 5.35 STM32F1 +2024-01-28 ashuai0110 5.35 STM32F103 ================================================================================ 功能描述 diff --git a/examples/ymodem/SRC/main.c b/examples/ymodem/SRC/main.c index a6e060c..551c91f 100644 --- a/examples/ymodem/SRC/main.c +++ b/examples/ymodem/SRC/main.c @@ -3,7 +3,7 @@ * @file main.c * @author ashuai0110 * @version V1.0 - * @date 2024-01-21 + * @date 2024-01-28 * @brief 使用举例-ymodem * ****************************************************************************** @@ -163,12 +163,12 @@ void ymodem_get_packet_callback(uint8_t packetNum, uint8_t *data, uint16_t *len) } /* 数据 */ else { -// PRINT_LOG("ymodem packet num:%d, len:%d, data: ", packetNum, lenTmp); -// while(lenTmp--) -// { -// PRINT_LOG("%02X ", *data++); -// } -// PRINT_LOG("\r\n"); + PRINT_LOG("ymodem packet num:%d, len:%d, data: ", packetNum, lenTmp); + while(lenTmp--) + { + PRINT_LOG("%02X ", *data++); + } + PRINT_LOG("\r\n"); } } diff --git a/drivers/bootloader/bootloader.c b/src/bootloader/bootloader.c similarity index 78% rename from drivers/bootloader/bootloader.c rename to src/bootloader/bootloader.c index 2c45c1f..cc17e64 100644 --- a/drivers/bootloader/bootloader.c +++ b/src/bootloader/bootloader.c @@ -2,8 +2,8 @@ ****************************************************************************** * @file bootloader.c * @author ashuai0110 - * @version V1.0 - * @date 2024-01-22 + * @version V2.2 + * @date 2024-01-28 * @brief 升级引导程序 * ****************************************************************************** @@ -110,7 +110,7 @@ void boot_init(boot_flash_erase_fn_t flashErase, boot_flash_rw_fn_t flashRead, b bootCtrl.flashReadFn = flashRead; bootCtrl.flashWriteFn = flashWrite; /* 读取FLASH中的内存参数 */ - bootCtrl.flashReadFn(BOOT_FLASH_START_ADDR + BOOT_INFO_ADDR_OFFSET, (void *)&bootCtrl.bootInfo, sizeof(boot_info_t)); + bootCtrl.flashReadFn(BOOT_ROM_START_ADDR + BOOT_INFO_ADDR_OFFSET, (void *)&bootCtrl.bootInfo, sizeof(boot_info_t)); /* 未写入过则写入初值 */ if(0xFFFF == bootCtrl.bootInfo.appVersion) { bootCtrl.bootInfo.appVersion = 0; } if(0xFFFF == bootCtrl.bootInfo.bootVersion) { bootCtrl.bootInfo.bootVersion = BOOT_VERSION; } @@ -162,7 +162,7 @@ uint8_t boot_erase_application(uint32_t appSize) if(4 >= appSize || BOOT_APP_SIZE_MAX < appSize) { return RET_FULL; } /* 擦除应用程序FLASH区域 */ - ret = bootCtrl.flashEraseFn(BOOT_FLASH_START_ADDR + BOOT_APP_ADDR_OFFSET, ALIGN_UP(appSize, BOOT_FLASH_PAGE_SIZE) / BOOT_FLASH_PAGE_SIZE); + ret = bootCtrl.flashEraseFn(BOOT_ROM_START_ADDR + BOOT_APP_ADDR_OFFSET, appSize); return ret; } @@ -185,8 +185,8 @@ uint8_t boot_program_application(void *data, uint16_t len) /* 写入数量若超出应用程序最大大小则返回RET_FULL */ if(BOOT_APP_SIZE_MAX < (bootCtrl.writedSize + len)) { return RET_FULL; } - - ret = bootCtrl.flashWriteFn(BOOT_FLASH_START_ADDR + BOOT_APP_ADDR_OFFSET + bootCtrl.writedSize, data, len); /* 编程应用程序FLASH区域 */ + /* 编程应用程序FLASH区域 */ + ret = bootCtrl.flashWriteFn(BOOT_ROM_START_ADDR + BOOT_APP_ADDR_OFFSET + bootCtrl.writedSize, data, len); bootCtrl.writedSize += len; /* 记录已写入大小 */ return ret; @@ -207,9 +207,9 @@ void boot_program_updata_flag(uint32_t updataFlag) bootCtrl.bootInfo.updataFlag = updataFlag; /* 赋值升级标志 */ /* 先擦除升级信息FLASH区域 */ - bootCtrl.flashEraseFn(BOOT_FLASH_START_ADDR + BOOT_INFO_ADDR_OFFSET, 1); + bootCtrl.flashEraseFn(BOOT_ROM_START_ADDR + BOOT_INFO_ADDR_OFFSET, sizeof(boot_info_t)); /* 再编程升级信息FLASH区域 */ - bootCtrl.flashWriteFn(BOOT_FLASH_START_ADDR + BOOT_INFO_ADDR_OFFSET, (void *)&bootCtrl.bootInfo, sizeof(boot_info_t)); + bootCtrl.flashWriteFn(BOOT_ROM_START_ADDR + BOOT_INFO_ADDR_OFFSET, (void *)&bootCtrl.bootInfo, sizeof(boot_info_t)); } /** @@ -225,9 +225,9 @@ void boot_program_app_version(uint16_t appVersion) { bootCtrl.bootInfo.appVersion = appVersion; /* 赋值应用程序版本 */ /* 先擦除升级信息FLASH区域 */ - bootCtrl.flashEraseFn(BOOT_FLASH_START_ADDR + BOOT_INFO_ADDR_OFFSET, 1); + bootCtrl.flashEraseFn(BOOT_ROM_START_ADDR + BOOT_INFO_ADDR_OFFSET, sizeof(boot_info_t)); /* 再编程升级信息FLASH区域 */ - bootCtrl.flashWriteFn(BOOT_FLASH_START_ADDR + BOOT_INFO_ADDR_OFFSET, (void *)&bootCtrl.bootInfo, sizeof(boot_info_t)); + bootCtrl.flashWriteFn(BOOT_ROM_START_ADDR + BOOT_INFO_ADDR_OFFSET, (void *)&bootCtrl.bootInfo, sizeof(boot_info_t)); } /** @@ -239,16 +239,26 @@ void boot_program_app_version(uint16_t appVersion) */ void boot_to_application(void) { - /* 写入跳转应用程序标志 */ - boot_program_updata_flag(BOOT_TO_APP_FLAG); - /* 恢复已使用的中断和外设 */ - boot_recover_all(); - /* 将应用程序地址+4后强转为函数指针 */ - bootCtrl.jumpFn = (boot_jump_fn_t)*(volatile uint32_t *)(BOOT_FLASH_START_ADDR + BOOT_APP_ADDR_OFFSET + 4u); - /* 设置栈顶指针 */ -// __set_MSP(*(volatile uint32_t *)(BOOT_FLASH_START_ADDR + BOOT_APP_ADDR_OFFSET)); - /* 跳转应用程序 */ - bootCtrl.jumpFn(); + uint32_t stackTop = *(volatile uint32_t *)(BOOT_ROM_START_ADDR + BOOT_APP_ADDR_OFFSET); + + /* 检查栈顶指针合法性 合法则跳转应用程序 */ + if((stackTop >= BOOT_RAM_START_ADDR) && (stackTop < (BOOT_RAM_START_ADDR + BOOT_RAM_TOTAL_SIZE))) + { + /* 写入跳转应用程序标志 */ + boot_program_updata_flag(BOOT_TO_APP_FLAG); + /* 恢复已使用的中断和外设 */ + boot_recover_all(); + /* 将应用程序地址+4后强转为函数指针 */ + bootCtrl.jumpFn = (boot_jump_fn_t)*(volatile uint32_t *)(BOOT_ROM_START_ADDR + BOOT_APP_ADDR_OFFSET + 4u); + /* 设置用户应用程序栈顶指针 */ + BOOT_SET_STACK_POINT(stackTop); + /* 跳转应用程序 */ + bootCtrl.jumpFn(); + } /* 不合法则跳转备份(出厂)程序 */ + else + { + boot_to_factory(); + } } /** @@ -265,9 +275,9 @@ void boot_to_factory(void) /* 恢复已使用的中断和外设 */ boot_recover_all(); /* 将备份(出厂)程序地址+4后强转为函数指针 */ - bootCtrl.jumpFn = (boot_jump_fn_t)*(volatile uint32_t *)(BOOT_FLASH_START_ADDR + BOOT_FACTORY_ADDR_OFFSET + 4u); - /* 设置栈顶指针 */ -// __set_MSP(*(volatile uint32_t *)(BOOT_FLASH_START_ADDR + BOOT_FACTORY_ADDR_OFFSET)); + bootCtrl.jumpFn = (boot_jump_fn_t)*(volatile uint32_t *)(BOOT_ROM_START_ADDR + BOOT_FACTORY_ADDR_OFFSET + 4u); + /* 设置用户应用程序栈顶指针 */ + BOOT_SET_STACK_POINT(*(volatile uint32_t *)(BOOT_ROM_START_ADDR + BOOT_FACTORY_ADDR_OFFSET)); /* 跳转备份(出厂)程序 */ bootCtrl.jumpFn(); } diff --git a/drivers/bootloader/bootloader.h b/src/bootloader/bootloader.h similarity index 66% rename from drivers/bootloader/bootloader.h rename to src/bootloader/bootloader.h index 9c252d7..02d6cf4 100644 --- a/drivers/bootloader/bootloader.h +++ b/src/bootloader/bootloader.h @@ -2,8 +2,8 @@ ****************************************************************************** * @file bootloader.h * @author ashuai0110 - * @version V1.0 - * @date 2024-01-22 + * @version V2.2 + * @date 2024-01-28 * @brief 升级引导程序 * ****************************************************************************** @@ -41,23 +41,28 @@ extern "C" { * @{ */ +/* 设置栈顶指针接口(不适配时用户需自行更换) */ +#define BOOT_SET_STACK_POINT(addr) ( __set_MSP((addr)) ) + /** * @defgroup boot_mcu_info bootloader mcu info - * @brief MCU FLASH及升级参数(用户根据情况修改) + * @brief MCU ROM,RAM,升级参数设置(用户按需修改) * @{ */ -#define BOOT_FLASH_PAGE_SIZE (0x400) /*!< mcu flash每页的大小 */ -#define BOOT_FLASH_TOTAL_SIZE (0x8000) /*!< mcu flash总大小 */ -#define BOOT_FLASH_START_ADDR (0x8000000) /*!< mcu flash起始地址 */ -#define BOOT_FLASH_END_ADDR (BOOT_FLASH_START_ADDR + BOOT_FLASH_TOTAL_SIZE) /*!< mcu flash结束地址 */ -/* flash分区: bootloader + application + factory + info */ -#define BOOT_APP_ADDR_OFFSET (0x2C00) /*!< 应用程序起始地址偏移 */ -#define BOOT_APP_SIZE_MAX (0x2800) /*!< 应用程序最大大小 */ -#define BOOT_FACTORY_ADDR_OFFSET (BOOT_APP_ADDR_OFFSET + BOOT_APP_SIZE_MAX) /*!< 备份(出厂)程序起始地址偏移 */ -#define BOOT_FACTORY_SIZE_MAX (0x2800) /*!< 备份(出厂)程序最大大小 */ -/* 升级信息存放起始地址偏移(应处于BOOT,APP,FACTORY存储之外的FLASH页,保证不会被意外擦除或改写) */ -#define BOOT_INFO_ADDR_OFFSET (BOOT_FACTORY_ADDR_OFFSET + BOOT_FACTORY_SIZE_MAX) -#define BOOT_VERSION (100) /*!< bootloader版本 */ +#define BOOT_ROM_START_ADDR (0x8000000) /*!< MCU ROM起始地址 */ +#define BOOT_RAM_START_ADDR (0x20000000) /*!< MCU RAM起始地址 */ +#define BOOT_RAM_TOTAL_SIZE (0x2800) /*!< MCU RAM总大小 */ +/* /-------------------flash分区规划------------------\ + * | bootloader | application | factory | updata info | + * | xxx | xxx | xxx | 8 | + * \--------------------------------------------------/ */ +#define BOOT_APP_ADDR_OFFSET (0x2C00) /*!< 应用程序起始地址偏移量 */ +#define BOOT_APP_SIZE_MAX (0x2800) /*!< 应用程序最大大小 */ +#define BOOT_FACTORY_ADDR_OFFSET (BOOT_APP_ADDR_OFFSET + BOOT_APP_SIZE_MAX + 0u) /*!< 备份(出厂)程序起始地址偏移量 */ +#define BOOT_FACTORY_SIZE_MAX (0x2800) /*!< 备份(出厂)程序最大大小 */ +/* 升级信息存放起始地址偏移量 (应处于BOOT,APP,FACTORY存储之外的FLASH扇区,保证不会被意外擦除或改写) */ +#define BOOT_INFO_ADDR_OFFSET (BOOT_FACTORY_ADDR_OFFSET + BOOT_FACTORY_SIZE_MAX + 0u) +#define BOOT_VERSION (100u) /*!< bootloader版本号 100 = V1.0.0 */ /** * @} */ @@ -66,9 +71,9 @@ extern "C" { * @defgroup boot_updata_flag bootloader updata flag * @{ */ -#define BOOT_UPDATA_FLAG (0x02468ACE) /*!< 需要升级标志 */ -#define BOOT_TO_APP_FLAG (0x55555555) /*!< 跳转APP/升级成功标志 */ -#define BOOT_TO_FACTORY_FLAG (0xAAAAAAAA) /*!< 跳转FACTORY/升级失败标志 */ +#define BOOT_UPDATA_FLAG (0x02468ACE) /*!< 需要升级标志 */ +#define BOOT_TO_APP_FLAG (0x55555555) /*!< 跳转APP/升级成功标志 */ +#define BOOT_TO_FACTORY_FLAG (0xAAAAAAAA) /*!< 跳转FACTORY/升级失败标志 */ /** * @} */ @@ -103,18 +108,18 @@ typedef void (* boot_jump_fn_t)(void); * * @retval 0:读/写成功 1:读/写失败 */ -typedef uint8_t (* boot_flash_rw_fn_t)(uint32_t startAddr, void *pBuf, uint16_t len); +typedef uint8_t (* boot_flash_rw_fn_t)(uint32_t startAddr, void *pBuf, uint32_t len); /** * @brief 擦除flash * * @param startAddr : 起始地址 * - * @param pageNum : 擦除页数量 + * @param bytes : 擦除总字节数量 * * @retval 0:擦除成功 1:擦除失败 */ -typedef uint8_t (* boot_flash_erase_fn_t)(uint32_t startAddr, uint16_t pageNum); +typedef uint8_t (* boot_flash_erase_fn_t)(uint32_t startAddr, uint32_t bytes); /** * @brief 升级参数 structure definition diff --git a/drivers/bootloader/xmodem.c b/src/bootloader/xmodem.c similarity index 99% rename from drivers/bootloader/xmodem.c rename to src/bootloader/xmodem.c index 4b1bc50..44a7f2b 100644 --- a/drivers/bootloader/xmodem.c +++ b/src/bootloader/xmodem.c @@ -2,8 +2,8 @@ ****************************************************************************** * @file xmodem.c * @author ashuai0110 - * @version V1.0 - * @date 2024-01-22 + * @version V2.2 + * @date 2024-01-28 * @brief xmodem协议 * ****************************************************************************** diff --git a/drivers/bootloader/xmodem.h b/src/bootloader/xmodem.h similarity index 86% rename from drivers/bootloader/xmodem.h rename to src/bootloader/xmodem.h index 1e9490b..07575ad 100644 --- a/drivers/bootloader/xmodem.h +++ b/src/bootloader/xmodem.h @@ -2,8 +2,8 @@ ****************************************************************************** * @file xmodem.h * @author ashuai0110 - * @version V1.0 - * @date 2024-01-22 + * @version V2.2 + * @date 2024-01-28 * @brief xmodem协议 * ****************************************************************************** @@ -140,22 +140,22 @@ typedef void (* xmodem_user_packet_cb_t)(uint8_t packetNum, uint8_t *data, uint1 * @brief xmodem structure definition */ typedef struct xmodem { - uint8_t *dataBuf; /*!< 数据缓冲区 */ - uint16_t dataBufLen; /*!< 数据缓冲区大小 */ - uint16_t dataLen; /*!< 存放数据数量 */ - uint16_t readLen; /*!< 数据读出数量 */ - uint16_t dataLenTmp; /*!< 存放数据数量暂存 */ + uint8_t *dataBuf; /*!< 数据缓冲区 */ + uint16_t dataBufLen; /*!< 数据缓冲区大小 */ + volatile uint16_t dataLen; /*!< 存放数据数量 */ + volatile uint16_t readLen; /*!< 数据读出数量 */ + uint16_t dataLenTmp; /*!< 存放数据数量暂存 */ - uint16_t rspTimeout; /*!< 回复超时时间ms */ - uint32_t rspTimeoutCnt; /*!< 回复超时时间计数 */ - uint8_t rspTimeoutTimes; /*!< 回复超时次数 */ - uint8_t packetNum; /*!< 包序号 */ + uint16_t rspTimeout; /*!< 回复超时时间ms */ + uint32_t rspTimeoutCnt; /*!< 回复超时时间计数 */ + uint8_t rspTimeoutTimes; /*!< 回复超时次数 */ + uint8_t packetNum; /*!< 包序号 */ - uint8_t state : 3; /*!< xmodem状态 @ref xmodem_rx_state */ - uint8_t checkNum : 2; /*!< 校验字节数 1:累加和 2:CRC16 */ - uint8_t eotFlag : 1; + uint8_t state : 3; /*!< xmodem状态 @ref xmodem_rx_state */ + uint8_t checkNum : 2; /*!< 校验字节数 1:累加和 2:CRC16 */ + uint8_t eotFlag : 1; /*!< 传输结束标志 */ - xmodem_tx_en_t txEnFn; /*!< 串口发送准备函数 */ + xmodem_tx_en_t txEnFn; /*!< 串口发送准备函数 */ xmodem_user_packet_cb_t getPacketFn; /*!< 获取数据包回调函数 */ xmodem_user_packet_cb_t setPacketFn; /*!< 设置数据包回调函数 */ } xmodem_t; diff --git a/drivers/bootloader/ymodem.c b/src/bootloader/ymodem.c similarity index 99% rename from drivers/bootloader/ymodem.c rename to src/bootloader/ymodem.c index e6ed7c2..ad08fed 100644 --- a/drivers/bootloader/ymodem.c +++ b/src/bootloader/ymodem.c @@ -2,8 +2,8 @@ ****************************************************************************** * @file ymodem.c * @author ashuai0110 - * @version V1.0 - * @date 2024-01-22 + * @version V2.2 + * @date 2024-01-28 * @brief ymodem协议 * ****************************************************************************** diff --git a/drivers/bootloader/ymodem.h b/src/bootloader/ymodem.h similarity index 86% rename from drivers/bootloader/ymodem.h rename to src/bootloader/ymodem.h index 8415649..294b71d 100644 --- a/drivers/bootloader/ymodem.h +++ b/src/bootloader/ymodem.h @@ -2,8 +2,8 @@ ****************************************************************************** * @file ymodem.h * @author ashuai0110 - * @version V1.0 - * @date 2024-01-22 + * @version V2.2 + * @date 2024-01-28 * @brief ymodem协议 * ****************************************************************************** @@ -143,23 +143,23 @@ typedef void (* ymodem_user_packet_cb_t)(uint8_t packetNum, uint8_t *data, uint1 * @brief ymodem structure definition */ typedef struct ymodem { - uint8_t *dataBuf; /*!< 数据缓冲区 */ - uint16_t dataBufLen; /*!< 数据缓冲区大小 */ - uint16_t dataLen; /*!< 存放数据数量 */ - uint16_t readLen; /*!< 数据读出数量 */ - uint16_t dataLenTmp; /*!< 存放数据数量暂存 */ + uint8_t *dataBuf; /*!< 数据缓冲区 */ + uint16_t dataBufLen; /*!< 数据缓冲区大小 */ + volatile uint16_t dataLen; /*!< 存放数据数量 */ + volatile uint16_t readLen; /*!< 数据读出数量 */ + uint16_t dataLenTmp; /*!< 存放数据数量暂存 */ - uint16_t rspTimeout; /*!< 回复超时时间ms */ - uint32_t rspTimeoutCnt; /*!< 回复超时时间计数 */ - uint8_t rspTimeoutTimes; /*!< 回复超时次数 */ - uint8_t packetNum; /*!< 包序号 */ + uint16_t rspTimeout; /*!< 回复超时时间ms */ + uint32_t rspTimeoutCnt; /*!< 回复超时时间计数 */ + uint8_t rspTimeoutTimes; /*!< 回复超时次数 */ + uint8_t packetNum; /*!< 包序号 */ - uint8_t state : 3; /*!< ymodem状态 @ref ymodem_rx_state */ - uint8_t checkNum : 2; /*!< 校验字节数 1:累加和 2:CRC16 */ - uint8_t fileFlag : 1; /*!< 文件信息标志 1:此包数据为文件信息 */ - uint8_t eotFlag : 2; /*!< 首次EOT标志 0:首次 1:非首次 */ + uint8_t state : 3; /*!< ymodem状态 @ref ymodem_rx_state */ + uint8_t checkNum : 2; /*!< 校验字节数 1:累加和 2:CRC16 */ + uint8_t fileFlag : 1; /*!< 文件信息标志 1:此包数据为文件信息 */ + uint8_t eotFlag : 2; /*!< 首次EOT标志 0:首次 1:非首次 */ - ymodem_tx_en_t txEnFn; /*!< 串口发送准备函数 */ + ymodem_tx_en_t txEnFn; /*!< 串口发送准备函数 */ ymodem_user_packet_cb_t getPacketFn; /*!< 获取数据包回调函数 */ ymodem_user_packet_cb_t setPacketFn; /*!< 设置数据包回调函数 */ } ymodem_t; diff --git a/drivers/common/all_include.h b/src/common/all_include.h similarity index 95% rename from drivers/common/all_include.h rename to src/common/all_include.h index 4eb9139..595819b 100644 --- a/drivers/common/all_include.h +++ b/src/common/all_include.h @@ -2,8 +2,8 @@ ****************************************************************************** * @file all_include.h * @author ashuai0110 - * @version V2.1 - * @date 2024-01-18 + * @version V2.2 + * @date 2024-01-27 * @brief 所有组件头文件集合 * ****************************************************************************** @@ -42,7 +42,7 @@ extern "C" { #include "modbus_host.h" /*!< modbus主机程序(RTU ASCII) */ #include "modbus_slave.h" /*!< modbus从机程序(RTU ASCII) */ /* bootloader */ -#include "bootloader.h" /*!< 程序升级引导 */ +#include "bootloader.h" /*!< 升级引导程序 */ #include "xmodem.h" /*!< xmodem协议 */ #include "ymodem.h" /*!< ymodem协议 */ diff --git a/drivers/common/common_include.c b/src/common/common_include.c similarity index 98% rename from drivers/common/common_include.c rename to src/common/common_include.c index a8a5a40..04043d6 100644 --- a/drivers/common/common_include.c +++ b/src/common/common_include.c @@ -2,8 +2,8 @@ ****************************************************************************** * @file common_include.c * @author ashuai0110 - * @version V2.1 - * @date 2024-01-04 + * @version V2.2 + * @date 2024-01-28 * @brief 公共引用文件(所有组件都需包含此文件) * ****************************************************************************** diff --git a/drivers/common/common_include.h b/src/common/common_include.h similarity index 99% rename from drivers/common/common_include.h rename to src/common/common_include.h index 9db146e..d30d519 100644 --- a/drivers/common/common_include.h +++ b/src/common/common_include.h @@ -2,8 +2,8 @@ ****************************************************************************** * @file common_include.h * @author ashuai0110 - * @version V2.1 - * @date 2024-01-04 + * @version V2.2 + * @date 2024-01-28 * @brief 公共引用文件(所有组件都需包含此文件) * ****************************************************************************** diff --git a/drivers/modbus/modbus_common.c b/src/modbus/modbus_common.c similarity index 99% rename from drivers/modbus/modbus_common.c rename to src/modbus/modbus_common.c index 103aa2b..dfbf0da 100644 --- a/drivers/modbus/modbus_common.c +++ b/src/modbus/modbus_common.c @@ -2,8 +2,8 @@ ****************************************************************************** * @file modbus_common.c * @author ashuai0110 - * @version V2.1 - * @date 2024-01-08 + * @version V2.2 + * @date 2024-01-27 * @brief modbus通用文件 * ****************************************************************************** diff --git a/drivers/modbus/modbus_common.h b/src/modbus/modbus_common.h similarity index 98% rename from drivers/modbus/modbus_common.h rename to src/modbus/modbus_common.h index 1786c14..5126ddf 100644 --- a/drivers/modbus/modbus_common.h +++ b/src/modbus/modbus_common.h @@ -2,8 +2,8 @@ ****************************************************************************** * @file modbus_common.h * @author ashuai0110 - * @version V2.1 - * @date 2024-01-08 + * @version V2.2 + * @date 2024-01-27 * @brief modbus通用文件 * ****************************************************************************** @@ -81,6 +81,7 @@ extern "C" { */ #define MB_RTU (0u) /*!< RTU协议 */ #define MB_ASCII (1u) /*!< ASCII协议 */ +/* 协议有效性检查 */ #define IS_VALID_MB_PROTOCOL(x) \ ( ((x) == MB_RTU) || \ ((x) == MB_ASCII)) diff --git a/drivers/modbus/modbus_host.c b/src/modbus/modbus_host.c similarity index 99% rename from drivers/modbus/modbus_host.c rename to src/modbus/modbus_host.c index cf7c8e1..e305f96 100644 --- a/drivers/modbus/modbus_host.c +++ b/src/modbus/modbus_host.c @@ -2,8 +2,8 @@ ****************************************************************************** * @file modbus_host.c * @author ashuai0110 - * @version V2.1 - * @date 2024-01-08 + * @version V2.2 + * @date 2024-01-27 * @brief modbus主机程序(RTU ASCII) * ****************************************************************************** diff --git a/drivers/modbus/modbus_host.h b/src/modbus/modbus_host.h similarity index 95% rename from drivers/modbus/modbus_host.h rename to src/modbus/modbus_host.h index 9e24b64..c3815be 100644 --- a/drivers/modbus/modbus_host.h +++ b/src/modbus/modbus_host.h @@ -2,8 +2,8 @@ ****************************************************************************** * @file modbus_host.h * @author ashuai0110 - * @version V2.1 - * @date 2024-01-08 + * @version V2.2 + * @date 2024-01-27 * @brief modbus主机程序(RTU ASCII) * ****************************************************************************** @@ -61,8 +61,8 @@ extern "C" { typedef struct mb_host { uint8_t *dataBuf; /*!< 数据缓存区 */ uint16_t dataBufLen; /*!< 数据缓存区长度 */ - uint16_t dataLen; /*!< 数据长度 */ - uint16_t readLen; /*!< 读出数据长度 */ + volatile uint16_t dataLen; /*!< 数据长度 */ + volatile uint16_t readLen; /*!< 读出数据长度 */ uint8_t protocol : 1; /*!< 协议类型 @ref modbus_common_protocol */ uint8_t state : 2; /*!< 应答状态 @ref modbus_common_state */ diff --git a/drivers/modbus/modbus_slave.c b/src/modbus/modbus_slave.c similarity index 99% rename from drivers/modbus/modbus_slave.c rename to src/modbus/modbus_slave.c index d785584..c10d917 100644 --- a/drivers/modbus/modbus_slave.c +++ b/src/modbus/modbus_slave.c @@ -2,8 +2,8 @@ ****************************************************************************** * @file modbus_slave.c * @author ashuai0110 - * @version V2.1 - * @date 2024-01-08 + * @version V2.2 + * @date 2024-01-27 * @brief modbus从机程序(RTU ASCII) * ****************************************************************************** diff --git a/drivers/modbus/modbus_slave.h b/src/modbus/modbus_slave.h similarity index 95% rename from drivers/modbus/modbus_slave.h rename to src/modbus/modbus_slave.h index e2f941e..bb32485 100644 --- a/drivers/modbus/modbus_slave.h +++ b/src/modbus/modbus_slave.h @@ -2,8 +2,8 @@ ****************************************************************************** * @file modbus_slave.h * @author ashuai0110 - * @version V2.1 - * @date 2024-01-08 + * @version V2.2 + * @date 2024-01-27 * @brief modbus从机程序(RTU ASCII) * ****************************************************************************** @@ -61,8 +61,8 @@ extern "C" { typedef struct mb_slave { uint8_t *dataBuf; /*!< 数据缓存区 */ uint16_t dataBufLen; /*!< 数据缓存区长度 */ - uint16_t dataLen; /*!< 数据长度 */ - uint16_t readLen; /*!< 读出数据长度 */ + volatile uint16_t dataLen; /*!< 数据长度 */ + volatile uint16_t readLen; /*!< 读出数据长度 */ uint8_t slaveAddr; /*!< 从机地址 1~247 */ uint8_t protocol : 1; /*!< 协议类型 @ref modbus_common_protocol */ diff --git a/drivers/modules/command_line.c b/src/modules/command_line.c similarity index 100% rename from drivers/modules/command_line.c rename to src/modules/command_line.c diff --git a/drivers/modules/command_line.h b/src/modules/command_line.h similarity index 100% rename from drivers/modules/command_line.h rename to src/modules/command_line.h diff --git a/drivers/modules/data_check.c b/src/modules/data_check.c similarity index 100% rename from drivers/modules/data_check.c rename to src/modules/data_check.c diff --git a/drivers/modules/data_check.h b/src/modules/data_check.h similarity index 100% rename from drivers/modules/data_check.h rename to src/modules/data_check.h diff --git a/drivers/modules/data_convert.c b/src/modules/data_convert.c similarity index 100% rename from drivers/modules/data_convert.c rename to src/modules/data_convert.c diff --git a/drivers/modules/data_convert.h b/src/modules/data_convert.h similarity index 100% rename from drivers/modules/data_convert.h rename to src/modules/data_convert.h diff --git a/drivers/modules/delay_no_block.c b/src/modules/delay_no_block.c similarity index 100% rename from drivers/modules/delay_no_block.c rename to src/modules/delay_no_block.c diff --git a/drivers/modules/delay_no_block.h b/src/modules/delay_no_block.h similarity index 100% rename from drivers/modules/delay_no_block.h rename to src/modules/delay_no_block.h diff --git a/drivers/modules/input_output.c b/src/modules/input_output.c similarity index 100% rename from drivers/modules/input_output.c rename to src/modules/input_output.c diff --git a/drivers/modules/input_output.h b/src/modules/input_output.h similarity index 100% rename from drivers/modules/input_output.h rename to src/modules/input_output.h diff --git a/drivers/modules/memory.c b/src/modules/memory.c similarity index 100% rename from drivers/modules/memory.c rename to src/modules/memory.c diff --git a/drivers/modules/memory.h b/src/modules/memory.h similarity index 100% rename from drivers/modules/memory.h rename to src/modules/memory.h diff --git a/drivers/modules/message_queue.c b/src/modules/message_queue.c similarity index 100% rename from drivers/modules/message_queue.c rename to src/modules/message_queue.c diff --git a/drivers/modules/message_queue.h b/src/modules/message_queue.h similarity index 100% rename from drivers/modules/message_queue.h rename to src/modules/message_queue.h diff --git a/drivers/modules/ring_buffer.c b/src/modules/ring_buffer.c similarity index 100% rename from drivers/modules/ring_buffer.c rename to src/modules/ring_buffer.c diff --git a/drivers/modules/ring_buffer.h b/src/modules/ring_buffer.h similarity index 90% rename from drivers/modules/ring_buffer.h rename to src/modules/ring_buffer.h index 36c9585..c96587a 100644 --- a/drivers/modules/ring_buffer.h +++ b/src/modules/ring_buffer.h @@ -48,10 +48,10 @@ extern "C" { * @brief 环形缓冲区 structrue definition */ typedef struct ring_buffer { - volatile char *pHead; /*!< 头节点(开始读节点) */ - volatile char *pTail; /*!< 尾节点(开始写节点) */ - char *pBuf; /*!< 数据缓冲区 */ - uint32_t bufLen; /*!< 数据缓冲区大小 */ + char *pHead; /*!< 头节点(开始读节点) */ + char *pTail; /*!< 尾节点(开始写节点) */ + char *pBuf; /*!< 数据缓冲区 */ + uint32_t bufLen; /*!< 数据缓冲区大小 */ } ring_buffer_t; /** diff --git a/drivers/modules/sync_method.c b/src/modules/sync_method.c similarity index 100% rename from drivers/modules/sync_method.c rename to src/modules/sync_method.c diff --git a/drivers/modules/sync_method.h b/src/modules/sync_method.h similarity index 100% rename from drivers/modules/sync_method.h rename to src/modules/sync_method.h diff --git a/drivers/modules/timer_software.c b/src/modules/timer_software.c similarity index 100% rename from drivers/modules/timer_software.c rename to src/modules/timer_software.c diff --git a/drivers/modules/timer_software.h b/src/modules/timer_software.h similarity index 100% rename from drivers/modules/timer_software.h rename to src/modules/timer_software.h diff --git a/drivers/modules/uart_handler.c b/src/modules/uart_handler.c similarity index 100% rename from drivers/modules/uart_handler.c rename to src/modules/uart_handler.c diff --git a/drivers/modules/uart_handler.h b/src/modules/uart_handler.h similarity index 100% rename from drivers/modules/uart_handler.h rename to src/modules/uart_handler.h diff --git a/drivers/segger_rtt/SEGGER_RTT.c b/src/segger_rtt/SEGGER_RTT.c similarity index 100% rename from drivers/segger_rtt/SEGGER_RTT.c rename to src/segger_rtt/SEGGER_RTT.c diff --git a/drivers/segger_rtt/SEGGER_RTT.h b/src/segger_rtt/SEGGER_RTT.h similarity index 100% rename from drivers/segger_rtt/SEGGER_RTT.h rename to src/segger_rtt/SEGGER_RTT.h diff --git a/drivers/segger_rtt/SEGGER_RTT_Conf.h b/src/segger_rtt/SEGGER_RTT_Conf.h similarity index 100% rename from drivers/segger_rtt/SEGGER_RTT_Conf.h rename to src/segger_rtt/SEGGER_RTT_Conf.h diff --git a/drivers/segger_rtt/SEGGER_RTT_printf.c b/src/segger_rtt/SEGGER_RTT_printf.c similarity index 100% rename from drivers/segger_rtt/SEGGER_RTT_printf.c rename to src/segger_rtt/SEGGER_RTT_printf.c diff --git "a/drivers/segger_rtt/\344\273\205\347\224\250\344\275\234\344\275\277\347\224\250jlink\346\211\223\345\215\260\350\276\223\345\207\272.txt" "b/src/segger_rtt/\344\273\205\347\224\250\344\275\234\344\275\277\347\224\250jlink\346\211\223\345\215\260\350\276\223\345\207\272.txt" similarity index 100% rename from "drivers/segger_rtt/\344\273\205\347\224\250\344\275\234\344\275\277\347\224\250jlink\346\211\223\345\215\260\350\276\223\345\207\272.txt" rename to "src/segger_rtt/\344\273\205\347\224\250\344\275\234\344\275\277\347\224\250jlink\346\211\223\345\215\260\350\276\223\345\207\272.txt" -- Gitee From 227bf99f6871b6115fde0e46a64508d3814c277d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=98=BF=E8=A1=B00110?= Date: Sun, 28 Jan 2024 22:05:57 +0800 Subject: [PATCH 66/66] =?UTF-8?q?=E6=9B=B4=E6=96=B0README?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 376c4e9..af55d0b 100644 --- a/README.md +++ b/README.md @@ -11,8 +11,8 @@ ## 文件目录 * ./documents/存放组件使用手册 -* ./src/存放所有组件源代码 * ./examples/存放所有组件的使用例程(用前必看) +* ./src/存放所有组件源代码 ## 使用说明 -- Gitee