diff --git a/README.md b/README.md index bf37a91ea127ad665bdabce794b3be1833cd8b09..af55d0be6c03f78e411ebfe93a299b4382ba9325 100644 --- a/README.md +++ b/README.md @@ -1,49 +1,49 @@ -# 单片机可复用,可通用开发组件 - -* ./documents/存放组件使用文档 -* ./drivers/存放所有组件源程序 -* ./examples/存放所有组件的使用举例(使用必看) - -### drivers/common - -all_include.h: 所有组件头文件集合 - -common_include.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: 环形缓冲区 - -ring_queue.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.png) + +## 文件目录 + +* ./documents/存放组件使用手册 +* ./examples/存放所有组件的使用例程(用前必看) +* ./src/存放所有组件源代码 + +## 使用说明 + +- MCU开发项目编译器需要勾选C99 +- 使用前请先查看例程,例程项目和组件名称相同 +- 所有组件都必须包含common_include.c.h文件 + +## 组件说明 + +| 组件名称 | 组件描述 | +| ----- | --- | +| | **src/bootloader文件夹内容↓↓↓** | +| bootloader | 升级引导程序 | +| xmodem | xmodem协议 | +| ymodem | ymodem协议 | +| | **src/common文件夹内容↓↓↓** | +| all_include | 所有组件头文件集合 | +| common_include | 公共引用文件(所有组件都需包含此文件) | +| | **src/modbus文件夹内容↓↓↓** | +| modbus_common | modbus通用文件(modbus主从机都需包含此文件) | +| modbus_host | modbus主机程序(RTU ASCII) | +| modbus_slave | modbus从机程序(RTU ASCII) | +| | **src/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/modules/data_check.c b/drivers/modules/data_check.c deleted file mode 100644 index 8b10ab016515de18085c302339305698b33fdb53..0000000000000000000000000000000000000000 --- a/drivers/modules/data_check.c +++ /dev/null @@ -1,170 +0,0 @@ -/** - ****************************************************************************** - * @file data_check.c - * @author ashuai0110 - * @version V2.1 - * @date 2023-10-17 - * @brief 数据校验方法集合 - * - ****************************************************************************** - * @attention - * - * 版权声明:内容为编者(ashuai0110)原创,使用请注明出处,当然,你也可以不这样做^_^ - * 出处链接:https://gitee.com/ashuai0110/mcu_reuse_development_module.git - * - ****************************************************************************** - */ - -/* 包含头文件-----------------------------------------------------------------*/ -#include "data_check.h" - -/** - * @addtogroup modules - * @{ - */ - -/** - * @defgroup data_check data_check - * @{ - */ - -/* 私有宏定义-----------------------------------------------------------------*/ - -/* 私有类型定义---------------------------------------------------------------*/ - -/* 私有变量-------------------------------------------------------------------*/ -/** - * @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 -}; - -/** - * @} - */ - -/* 全局变量-------------------------------------------------------------------*/ - -/* 私有函数原型---------------------------------------------------------------*/ -/** - * @defgroup data_check_global_functions data check global functions - * @{ - */ - -/** - * @brief CRC16校验(MODBUS) - * - * @param pBuf : 校验数据 - * - * @param len : 校验数据长度 - * - * @retval 校验结果 - */ -uint16_t check_crc16_modbus(uint8_t *pBuf, uint16_t len) -{ - uint8_t crcHi = 0xFF; /* 高CRC字节初始化 */ - uint8_t crcLo = 0xFF; /* 低CRC 字节初始化 */ - uint16_t index; /* CRC循环中的索引 */ - - while(len--) - { - index = crcHi ^ *pBuf++; /* 计算CRC */ - crcHi = crcLo ^ crcHiArr[index]; - crcLo = crcLoArr[index]; - } - - return ((uint16_t)crcHi << 8 | crcLo); -} - -/** - * @brief LRC校验 - * - * @param pBuf : 校验数据 - * - * @param len : 校验数据长度 - * - * @retval 校验结果 - */ -uint8_t check_lrc(uint8_t *pBuf, uint16_t len) -{ - uint8_t lrc = 0; - - for(uint16_t index = 0; index < len; index++) - { - lrc += pBuf[index]; - } - - lrc = (~lrc) + 1; - - return lrc; -} - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ diff --git a/drivers/modules/ring_queue.c b/drivers/modules/ring_queue.c deleted file mode 100644 index bf9016035bdee3625cb24aacdc4d22de4948a6c4..0000000000000000000000000000000000000000 --- a/drivers/modules/ring_queue.c +++ /dev/null @@ -1,284 +0,0 @@ -/** - ****************************************************************************** - * @file ring_queue.c - * @author ashuai0110 - * @version V2.1 - * @date 2023-09-24 - * @brief 环形队列 - * (适合定长或易分离出的数据,写入后必须读出才可再写,写满后新数据无法写入) - * - ****************************************************************************** - * @attention - * - * 版权声明:内容为编者(ashuai0110)原创,使用请注明出处,当然,你也可以不这样做^_^ - * 出处链接:https://gitee.com/ashuai0110/mcu_reuse_development_module.git - * - ****************************************************************************** - */ - -/* 包含头文件-----------------------------------------------------------------*/ -#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/examples/[base_on_stm32f1]/stm32f1_sys/flash.c b/examples/[base_on_stm32f1]/stm32f1_sys/flash.c new file mode 100644 index 0000000000000000000000000000000000000000..eff34c5fe1b360cae7f48db4d1bf0780411a4086 --- /dev/null +++ b/examples/[base_on_stm32f1]/stm32f1_sys/flash.c @@ -0,0 +1,105 @@ +/* 包含头文件-----------------------------------------------------------------*/ +#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 bytes : 擦除总字节数量 + * @retval 0:擦除成功 1:擦除失败 + */ +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--) + { + 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, uint32_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, uint32_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 0000000000000000000000000000000000000000..f72276b821d48d7ca81d421592e569549a67bb12 --- /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, 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 +} +#endif + +#endif /* flash.h */ diff --git a/examples/[base_on_stm32f1]/stm32f1_sys/gpio.c b/examples/[base_on_stm32f1]/stm32f1_sys/gpio.c index 7554ba7e53917edcca55d7844f6381dfe9e4561e..e9c6790429ee581b47d03cb681e366813210c4a0 100644 --- a/examples/[base_on_stm32f1]/stm32f1_sys/gpio.c +++ b/examples/[base_on_stm32f1]/stm32f1_sys/gpio.c @@ -1,21 +1,35 @@ +/* 包含头文件-----------------------------------------------------------------*/ #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 +40,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 +120,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 a5dfc93fad4c15844f5cef0f8f050497b8103dda..a0c073c6e0f9fe063166ed233944cc2cff5bcea8 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; /* 全局变量-------------------------------------------------------------------*/ @@ -34,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 470b5dee469b0d208ad0c50bdfa1538909090e8a..10d0dac7f4cc13ab9932bce7e728e6208e87506a 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 36dc4db5996dde2afa0bf72e60e9e9bc3a5073e6..3497c945be70d25839c32fbcf1b65f5188b41cd3 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 6587bcdd634ee1a3afb166f103fd382cba753ce1..1325f86460d4d98c1e9c9ea398e8275deb48b0fe 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 new file mode 100644 index 0000000000000000000000000000000000000000..77aeacd5bc90aba31fa6960fca83ca326e60cdfe --- /dev/null +++ b/examples/[base_on_stm32f1]/stm32f1_sys/usart_dma.c @@ -0,0 +1,184 @@ +/* 包含头文件-----------------------------------------------------------------*/ +#include "usart.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_TC4); +// } +//} + +/** + * @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 = 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 = 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 = 2; + 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) +{ + if(num == 0) { return ; } + + 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) +{ + if(num == 0) { return ; } + + 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 0000000000000000000000000000000000000000..0249e295623961b07f1190804d921c0eebea5de2 --- /dev/null +++ b/examples/[base_on_stm32f1]/stm32f1_sys/usart_dma.h @@ -0,0 +1,26 @@ +#ifndef __USART_DMA_AS_H +#define __USART_DMA_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 /* usart_dma.h */ diff --git a/examples/bootloader/MDK/use_example.uvoptx b/examples/bootloader/MDK/use_example.uvoptx new file mode 100644 index 0000000000000000000000000000000000000000..2eb10c79258002df0f00a10b63554965487098bb --- /dev/null +++ b/examples/bootloader/MDK/use_example.uvoptx @@ -0,0 +1,751 @@ + + + + 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 + + + 8 + 1 + bootCtrl + + + + + 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 + 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 + ..\..\..\src\segger_rtt\SEGGER_RTT.c + SEGGER_RTT.c + 0 + 0 + + + 3 + 29 + 1 + 0 + 0 + 0 + ..\..\..\src\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 + + + + + source + 1 + 0 + 0 + 0 + + 5 + 33 + 1 + 0 + 0 + 0 + ..\SRC\main.c + main.c + 0 + 0 + + + 5 + 34 + 1 + 0 + 0 + 0 + ..\..\..\src\bootloader\bootloader.c + bootloader.c + 0 + 0 + + + 5 + 35 + 1 + 0 + 0 + 0 + ..\..\..\src\bootloader\ymodem.c + ymodem.c + 0 + 0 + + + 5 + 36 + 1 + 0 + 0 + 0 + ..\..\..\src\common\common_include.c + common_include.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/MDK/use_example.uvprojx b/examples/bootloader/MDK/use_example.uvprojx new file mode 100644 index 0000000000000000000000000000000000000000..4e6529d3b09dd2dfe9b9f4074815cf438611d313 --- /dev/null +++ b/examples/bootloader/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 + 0x8000000 + 0x2c00 + + + 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;..\..\..\src\bootloader;..\..\..\src\common;..\..\..\src\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 + ..\..\..\src\segger_rtt\SEGGER_RTT.c + + + SEGGER_RTT_printf.c + 1 + ..\..\..\src\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 + + + + + source + + + main.c + 1 + ..\SRC\main.c + + + bootloader.c + 1 + ..\..\..\src\bootloader\bootloader.c + + + ymodem.c + 1 + ..\..\..\src\bootloader\ymodem.c + + + common_include.c + 1 + ..\..\..\src\common\common_include.c + + + + + readme + + + README.txt + 5 + ..\README.txt + + + + + + + + + + + + + + + + + use_example + 1 + + + + +
diff --git a/examples/ring_queue/README.txt b/examples/bootloader/README.txt similarity index 77% rename from examples/ring_queue/README.txt rename to examples/bootloader/README.txt index d187a708f1d8bdeba93687d98c0452553ae2f202..8bf28ebed6aa5fec84efe00c07be671896a3bcf0 100644 --- a/examples/ring_queue/README.txt +++ b/examples/bootloader/README.txt @@ -2,12 +2,12 @@ 用例使用说明 ================================================================================ Date Author MDK MCU -2023-09-24 ashuai0110 5.35 STM32F1 +2024-01-28 ashuai0110 5.35 STM32F103 ================================================================================ 功能描述 ================================================================================ -本用例展示了环形队列组件的使用方法。 +本用例展示了bootloader组件的使用方法。 ================================================================================ 测试环境 @@ -23,23 +23,23 @@ J-Link 辅助软件: --------------------- J-Link RTT Viewer -串口调试软件 源码文件: --------------------- -ring_queue.c -ring_queue.h +bootloader.c +bootloader.h ================================================================================ 使用步骤 ================================================================================ 1)使用J-Link连接目标板; 2)打开工程,重新编译,启动调试或直接下载程序运行; -3)用J-Link RTT Viewer软件连接,等待发送串口数据后查看打印消息; -3)打开串口调试软件,发送结尾是\r\n的任意数据。 +3)第一次烧写应全片擦除一次,然后按顺序烧写bootloader,application,factory程序; +3)用户可更换通信协议,将组件接口对接好即可使用。 ================================================================================ 注意 ================================================================================ +1)用户根据需求可前往源码头文件修改宏定义参数 ================================================================================ diff --git a/examples/bootloader/SRC/main.c b/examples/bootloader/SRC/main.c new file mode 100644 index 0000000000000000000000000000000000000000..bd502fc259eb46cfffea909480579d66e60e886e --- /dev/null +++ b/examples/bootloader/SRC/main.c @@ -0,0 +1,195 @@ +/** + ****************************************************************************** + * @file main.c + * @author ashuai0110 + * @version V1.0 + * @date 2024-01-28 + * @brief 使用举例-bootloader(基于ymodem协议传输升级文件) + * + ****************************************************************************** + * @attention + * + * 版权声明:内容为编者(ashuai0110)原创,使用请注明出处,当然,你也可以不这样做^_^ + * 出处链接:https://gitee.com/ashuai0110/mcu_reuse_development_module + * + ****************************************************************************** + */ + +/* 包含头文件-----------------------------------------------------------------*/ +#include "stm32f10x.h" +#include "usart.h" +#include "tim.h" +#include "flash.h" + +#include "ymodem.h" +#include "bootloader.h" + +/* 私有宏定义-----------------------------------------------------------------*/ + +/* 私有类型定义---------------------------------------------------------------*/ + +/* 私有变量-------------------------------------------------------------------*/ +ymodem_t ymodem; /* ymodem实例 */ +static uint8_t ymodemBuf[1029]; /* ymodem数据缓存区 */ +file_info_t fileInfo; /* 文件信息结构体 */ + +/* 全局变量-------------------------------------------------------------------*/ + +/* 私有函数原型---------------------------------------------------------------*/ + + +/** + * @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) +{ + static uint8_t rxData, txData, ret; + + /* 串口接收中断 */ + if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) + { + rxData = USART_ReceiveData(USART1); + /* 写入接收缓存 */ + ret = ymodem_write_rx_buf(&ymodem, &rxData, 1); + if(0 == ret) + { + WARN_LOG("ymodem_write_rx_buf failure"); + } + + USART_ClearITPendingBit(USART1, USART_IT_RXNE); + } + /* 串口发送中断 */ + if(USART_GetITStatus(USART1, USART_IT_TXE) != RESET) + { + /* 读出发送缓存 */ + ret = ymodem_read_tx_buf(&ymodem, &txData, 1); + if(1 == ret) + { + USART_SendData(USART1, txData); + } + + USART_ClearITPendingBit(USART1, USART_IT_TXE); + } +} + +/** + * @brief 串口发送前准备函数 + * + * @param enState : 0失能 1使能 + * + * @retval None + */ +void usart1_tx_en(uint8_t enState) +{ + if(enState) + { + /* 使能发送中断 */ + USART_ITConfig(USART1, USART_IT_TXE, ENABLE); + } + else + { + /* 关闭发送中断 */ + USART_ITConfig(USART1, USART_IT_TXE, 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) +{ + /* 文件信息 */ + if(YMODEM_FILE_FLAG(ymodem)) + { + ymodem_get_file_info(&ymodem, &fileInfo); /* 获取文件信息保存至fileInfo结构体 */ + /* 用户可以自行校验文件名称 不再举例 */ + 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 + { + boot_program_application((void *)data, *len); /* 编程应用程序FLASH区域 */ + } +} + +/** + * @brief 恢复/失能已使用的外设/中断 + * + * @param None + * + * @retval None + */ +void boot_recover_all(void) +{ + GPIO_DeInit(GPIOA); + TIM_DeInit(TIM1); + USART_DeInit(USART1); +} + +/** + * @brief main + */ +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(); + + /* 串口初始化 */ + 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, NULL, 2000); + /* 启动ymodem接收 */ + ymodem_rx_start(&ymodem, YMODEM_RX_FLAG_CRC); + + while(1) + { + static uint8_t ret; + + ret = ymodem_rx_poll(&ymodem); /* 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(); /* 跳转到备份(出厂)程序 */ + } + } +} + 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 0000000000000000000000000000000000000000..bceadacd29495e7627af6fe176a5bff474e88ffb --- /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 new file mode 100644 index 0000000000000000000000000000000000000000..b67c79a4944fd0bfb8d1810c0e67ac756cafbdac --- /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 + 1 + 0 + 0 + 0 + + 3 + 28 + 1 + 0 + 0 + 0 + ..\..\..\src\segger_rtt\SEGGER_RTT.c + SEGGER_RTT.c + 0 + 0 + + + 3 + 29 + 1 + 0 + 0 + 0 + ..\..\..\src\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 + ..\SRC\main.c + main.c + 0 + 0 + + + 5 + 35 + 1 + 0 + 0 + 0 + ..\..\..\src\bootloader\bootloader.c + bootloader.c + 0 + 0 + + + 5 + 36 + 1 + 0 + 0 + 0 + ..\..\..\src\common\common_include.c + common_include.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 0000000000000000000000000000000000000000..8ad9f49035068f2ec4f4876c35babe3e2f626b4e --- /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;..\..\..\src\bootloader;..\..\..\src\common;..\..\..\src\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 + ..\..\..\src\segger_rtt\SEGGER_RTT.c + + + SEGGER_RTT_printf.c + 1 + ..\..\..\src\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 + + + main.c + 1 + ..\SRC\main.c + + + bootloader.c + 1 + ..\..\..\src\bootloader\bootloader.c + + + common_include.c + 1 + ..\..\..\src\common\common_include.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 0000000000000000000000000000000000000000..a8124c48c73fc58ffd71e2817a05acbe52796add --- /dev/null +++ b/examples/bootloader_app/README.txt @@ -0,0 +1,49 @@ +================================================================================ + 用例使用说明 +================================================================================ +Date Author MDK MCU +2024-01-28 ashuai0110 5.35 STM32F103 + +================================================================================ +功能描述 +================================================================================ +本用例展示了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/ring_queue/SRC/main.c b/examples/bootloader_app/SRC/main.c similarity index 43% rename from examples/ring_queue/SRC/main.c rename to examples/bootloader_app/SRC/main.c index 7d0debda2f674e999474a90ee81c0248918dd510..2f45ec0947e6ab83155bc933c20c1df082d62564 100644 --- a/examples/ring_queue/SRC/main.c +++ b/examples/bootloader_app/SRC/main.c @@ -3,8 +3,8 @@ * @file main.c * @author ashuai0110 * @version V1.0 - * @date 2023-09-24 - * @brief 使用举例-环形队列 + * @date 2024-01-28 + * @brief 使用举例-bootloader_app * ****************************************************************************** * @attention @@ -17,103 +17,89 @@ /* 包含头文件-----------------------------------------------------------------*/ #include "stm32f10x.h" +#include "gpio.h" #include "usart.h" +#include "tim.h" +#include "flash.h" -#include "ring_queue.h" +#include "bootloader.h" /* 私有宏定义-----------------------------------------------------------------*/ /* 私有类型定义---------------------------------------------------------------*/ /* 私有变量-------------------------------------------------------------------*/ -static ring_queue_t testRQ; /* 测试环形队列实例 */ -static uint8_t testBuf[50]; /* 实际缓冲区 */ +uint8_t updataFlag; /* 升级标志变量 */ /* 全局变量-------------------------------------------------------------------*/ /* 私有函数原型---------------------------------------------------------------*/ + /** - * @brief 串口中断函数 - * - * @param None - * - * @retval None + * @brief 定时器1中断函数 */ -void USART1_IRQHandler(void) +void TIM1_UP_IRQHandler(void) { - static uint8_t data; + static uint16_t cnt = 0; - if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) + if(TIM_GetITStatus(TIM1, TIM_IT_Update) != RESET) { - data = USART_ReceiveData(USART1); - /* 环形队列写入数据 */ - ring_queue_write(&testRQ, &data, 1); + cnt++; + if(1000 < cnt) + { + cnt = 0; + gpio_toggle(LED_RUN); /* 1s周期翻转led */ + } - USART_ClearITPendingBit(USART1, USART_IT_RXNE); + TIM_ClearITPendingBit(TIM1, TIM_FLAG_Update); } } /** - * @brief 环形队列测试读取 - * - * @param pBuf : 数据存储区 - * - * @param size : 期望读取大小 - * - * @retval 实际读取大小 + * @brief 串口1中断 */ -uint32_t ring_queue_test_read(void *pBuf, uint32_t size) +void USART1_IRQHandler(void) { - /* 超过可读大小则使用可读大小 */ - size = (size > ring_queue_can_read(&testRQ)) ? ring_queue_can_read(&testRQ) : size; - if(0 != size) - { - /* 从环形队列读取数据 */ - ring_queue_read(&testRQ, pBuf, size); - } + static uint8_t data; - return size; + /* 串口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[]) { - VERSION_LOG("example-ring_queue", 1, 0, 0); + /* 设置向量表偏移 */ + 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); - /* 环形队列初始化 */ - 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++) + /* 升级标志变量置位则跳转到bootloader进行升级 */ + if(updataFlag) { - /* 遇结束符则打印消息 */ - 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; } - } + updataFlag = 0; + boot_program_updata_flag(BOOT_UPDATA_FLAG); /* 设置bootloader升级标志 */ + NVIC_SystemReset(); /* MCU重启 */ } } } 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 0000000000000000000000000000000000000000..622c316ff9f461b3ad4752b02ef1b1b1c2a72e71 --- /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 new file mode 100644 index 0000000000000000000000000000000000000000..b67c79a4944fd0bfb8d1810c0e67ac756cafbdac --- /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 + 1 + 0 + 0 + 0 + + 3 + 28 + 1 + 0 + 0 + 0 + ..\..\..\src\segger_rtt\SEGGER_RTT.c + SEGGER_RTT.c + 0 + 0 + + + 3 + 29 + 1 + 0 + 0 + 0 + ..\..\..\src\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 + ..\SRC\main.c + main.c + 0 + 0 + + + 5 + 35 + 1 + 0 + 0 + 0 + ..\..\..\src\bootloader\bootloader.c + bootloader.c + 0 + 0 + + + 5 + 36 + 1 + 0 + 0 + 0 + ..\..\..\src\common\common_include.c + common_include.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 0000000000000000000000000000000000000000..c7efa5a8f5b29e2cb48c1b1514e1e88bd2fb1101 --- /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;..\..\..\src\bootloader;..\..\..\src\common;..\..\..\src\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 + ..\..\..\src\segger_rtt\SEGGER_RTT.c + + + SEGGER_RTT_printf.c + 1 + ..\..\..\src\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 + + + main.c + 1 + ..\SRC\main.c + + + bootloader.c + 1 + ..\..\..\src\bootloader\bootloader.c + + + common_include.c + 1 + ..\..\..\src\common\common_include.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 0000000000000000000000000000000000000000..859be2d64fea7a22cca81b5ad064d2704ce9346d --- /dev/null +++ b/examples/bootloader_factory/README.txt @@ -0,0 +1,49 @@ +================================================================================ + 用例使用说明 +================================================================================ +Date Author MDK MCU +2024-01-28 ashuai0110 5.35 STM32F103 + +================================================================================ +功能描述 +================================================================================ +本用例展示了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 0000000000000000000000000000000000000000..3a15822a6c5bbe9378ff58c5d82ef209e7693068 --- /dev/null +++ b/examples/bootloader_factory/SRC/main.c @@ -0,0 +1,106 @@ +/** + ****************************************************************************** + * @file main.c + * @author ashuai0110 + * @version V1.0 + * @date 2024-01-28 + * @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) + { + /* 升级标志变量置位则跳转到bootloader进行升级 */ + if(updataFlag) + { + updataFlag = 0; + boot_program_updata_flag(BOOT_UPDATA_FLAG); /* 设置bootloader升级标志 */ + NVIC_SystemReset(); /* MCU重启 */ + } + } +} + diff --git a/examples/command_line/MDK/use_example.uvoptx b/examples/command_line/MDK/use_example.uvoptx index 2fec47e5279cbea73eccd6e52fbf0b8fd439aac2..88efe2aee9559b94b3e2b13630be9f87fe3b8301 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,7 +586,19 @@ 0 0 0 - ..\..\..\drivers\modules\command_line.c + ..\..\..\src\common\common_include.c + common_include.c + 0 + 0 + + + 5 + 32 + 1 + 0 + 0 + 0 + ..\..\..\src\modules\command_line.c command_line.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 e0e1f1ab8aade2c423a5fcd7ca7322f8c2941537..b95bede84d9dfdb272bcc8c36ca037c575910749 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 @@ -551,10 +551,15 @@ 1 ..\SRC\main.c + + common_include.c + 1 + ..\..\..\src\common\common_include.c + command_line.c 1 - ..\..\..\drivers\modules\command_line.c + ..\..\..\src\modules\command_line.c diff --git a/examples/command_line/README.txt b/examples/command_line/README.txt index 2e4d1ec8ffffdd08fc7edf1385a2b24f355fa4b9..d9ea961a82eb32430bd5b476fae2571b40b9e3d7 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-28 ashuai0110 5.35 STM32F103 ================================================================================ 功能描述 diff --git a/examples/command_line/SRC/main.c b/examples/command_line/SRC/main.c index a297692a185dc2a28de24025b000dc5a666bfda0..a690dc856b0a4b8849d73cc6c8f8131e6a403cdb 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-28 * @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/delay_no_block/MDK/use_example.uvoptx b/examples/delay_no_block/MDK/use_example.uvoptx index 5958fb9f1f7b1df91b4317a862e0902df70eda22..a95f4b104bd3ca600e711104b31a111995d0333b 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 @@ -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,7 +598,19 @@ 0 0 0 - ..\..\..\drivers\modules\delay_no_block.c + ..\..\..\src\common\common_include.c + common_include.c + 0 + 0 + + + 5 + 33 + 1 + 0 + 0 + 0 + ..\..\..\src\modules\delay_no_block.c delay_no_block.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 6d78445c96cc3699e3fd89bacb46921e93392c97..c11e377aab18ae096e8a82d177b27989b26c0029 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 @@ -558,10 +558,15 @@ 1 ..\SRC\main.c + + common_include.c + 1 + ..\..\..\src\common\common_include.c + delay_no_block.c 1 - ..\..\..\drivers\modules\delay_no_block.c + ..\..\..\src\modules\delay_no_block.c diff --git a/examples/delay_no_block/README.txt b/examples/delay_no_block/README.txt index f783cf2a99ba31d8b380e5572fe440343612f391..0b8011641c963c787f7ea2247edd0b0f75a4e8db 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 +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 233039ac22173b1afc39f10d2b347b1a0be4e29a..6ad78b877446ebf98e226f6585550e8ec8433980 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 2024-01-28 * @brief 使用举例-非阻塞延时 * ****************************************************************************** @@ -22,7 +22,6 @@ #include "delay_no_block.h" /* 私有宏定义-----------------------------------------------------------------*/ -#define DELAY_TIM_PERIOD (1u) /* 延时调度周期1ms */ /* 私有类型定义---------------------------------------------------------------*/ @@ -46,13 +45,16 @@ void TIM1_UP_IRQHandler(void) { if(TIM_GetITStatus(TIM1, TIM_IT_Update) != RESET) { - /* 延时轮询处理 */ - delay_poll(); + /* 组件计时节拍接口 */ + 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/input_output/MDK/use_example.uvoptx b/examples/input_output/MDK/use_example.uvoptx index 2f453aca14b7652365e039985f3ed6436f720e1a..6a70bc41e04429aa517effdcd8850a5320dc0068 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,7 +610,19 @@ 0 0 0 - ..\..\..\drivers\modules\input_output.c + ..\..\..\src\common\common_include.c + common_include.c + 0 + 0 + + + 5 + 34 + 1 + 0 + 0 + 0 + ..\..\..\src\modules\input_output.c input_output.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 a4c6265a75104e256e5b8715bfd6325b3e69af34..5786f4dc658e9df82972d14f1d0923b53712481c 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 @@ -563,10 +563,15 @@ 1 ..\SRC\main.c + + common_include.c + 1 + ..\..\..\src\common\common_include.c + input_output.c 1 - ..\..\..\drivers\modules\input_output.c + ..\..\..\src\modules\input_output.c diff --git a/examples/input_output/README.txt b/examples/input_output/README.txt index 07d0023e3e442e2658c9a06717eb31f51277a9b1..85f7c570650264865840a46da66cba01000cd6df 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-28 ashuai0110 5.35 STM32F103 ================================================================================ 功能描述 diff --git a/examples/input_output/SRC/main.c b/examples/input_output/SRC/main.c index d19fd3afa4c5b1b1e5bc6e7ec221ffe336dbbe62..8f84dcddaf59621b36a22add4f538cfd0f4e6228 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-28 * @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/MDK/use_example.uvoptx b/examples/memory/MDK/use_example.uvoptx index c5fa07c23cecf4d4273c40cca026c5e798f2f2f9..e06cc7356c597795d4b0aa012734fff666101415 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,7 +586,19 @@ 0 0 0 - ..\..\..\drivers\modules\memory.c + ..\..\..\src\common\common_include.c + common_include.c + 0 + 0 + + + 5 + 32 + 1 + 0 + 0 + 0 + ..\..\..\src\modules\memory.c memory.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 667da16a7313024cb47e6e45b1acf4172ab48eff..167c5625af203af29c238781d299d595e804cffe 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 @@ -551,10 +551,15 @@ 1 ..\SRC\main.c + + common_include.c + 1 + ..\..\..\src\common\common_include.c + memory.c 1 - ..\..\..\drivers\modules\memory.c + ..\..\..\src\modules\memory.c diff --git a/examples/memory/README.txt b/examples/memory/README.txt index 9f30782a927b29ec6aa52950b3fddba92c31f673..a4edbaea8d856b45ff71a5e3a5d8b5adb606e876 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-28 ashuai0110 5.35 STM32F103 ================================================================================ 功能描述 diff --git a/examples/memory/SRC/main.c b/examples/memory/SRC/main.c index 789ceb767986f0d129d13331984e9130f3128c6b..425e906954770e1149b4f85c73083101dcdc5da5 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-28 * @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/MDK/use_example.uvoptx b/examples/message_queue/MDK/use_example.uvoptx index d982fc0fe6694e564d7d527e00e2c5914c22ea6c..9bc473ec95d577934a309e3dc635df064613fc40 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,7 +586,19 @@ 0 0 0 - ..\..\..\drivers\modules\message_queue.c + ..\..\..\src\common\common_include.c + common_include.c + 0 + 0 + + + 5 + 32 + 1 + 0 + 0 + 0 + ..\..\..\src\modules\message_queue.c message_queue.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 24a50b1b570c1c54ff95e3284650b25ec38108b8..1a8acfdc8a29d6f4caea62aeb85362cbebd84e3f 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 @@ -551,10 +551,15 @@ 1 ..\SRC\main.c + + common_include.c + 1 + ..\..\..\src\common\common_include.c + message_queue.c 1 - ..\..\..\drivers\modules\message_queue.c + ..\..\..\src\modules\message_queue.c diff --git a/examples/message_queue/README.txt b/examples/message_queue/README.txt index 950d172e2e8b1bf3696959c76cf6a8a8420c28a6..395b642dc72a92c5b61450ea41db10a3efb64bc4 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-28 ashuai0110 5.35 STM32F103 ================================================================================ 功能描述 diff --git a/examples/message_queue/SRC/main.c b/examples/message_queue/SRC/main.c index 13aa2a93039fc0f03cc18a2f7c12affcda668656..5d5a50aceb4af83291501e0f8325b86d60f6a162 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-28 * @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/MDK/use_example.uvoptx b/examples/modbus_host/MDK/use_example.uvoptx index 3063e396798573e75f6cceb1e5222d0bccb4e2fa..4da9e30ec071f90e6ac794494e5869a9c5e2d616 100644 --- a/examples/modbus_host/MDK/use_example.uvoptx +++ b/examples/modbus_host/MDK/use_example.uvoptx @@ -152,39 +152,23 @@ 0 0 - 115 + 534 1 -
0
+
134228346
0 0 0 0 0 - 0 - ..\SRC\main.c + 1 + D:\ASProject\mcuProject\mcu_development_template\mcu_reuse_development_module\drivers\modbus\modbus_host.c - + \\use_example\../../../drivers/modbus/modbus_host.c\534
1 0 - 159 - 1 -
0
- 0 - 0 - 0 - 0 - 0 - 0 - ..\SRC\main.c - - -
- - 2 - 0 - 158 + 536 1
0
0 @@ -193,26 +177,10 @@ 0 0 0 - ..\SRC\main.c + D:\ASProject\mcuProject\mcu_development_template\mcu_reuse_development_module\drivers\modbus\modbus_host.c
- - 3 - 0 - 162 - 1 -
134222676
- 0 - 0 - 0 - 0 - 0 - 1 - ..\SRC\main.c - - \\use_example\../SRC/main.c\162 -
0 @@ -608,7 +576,7 @@ segger - 0 + 1 0 0 0 @@ -619,7 +587,7 @@ 0 0 0 - ..\..\..\drivers\segger_rtt\SEGGER_RTT.c + ..\..\..\src\segger_rtt\SEGGER_RTT.c SEGGER_RTT.c 0 0 @@ -631,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 @@ -695,8 +663,8 @@ 0 0 0 - ..\..\..\drivers\modbus\modbus_host.c - modbus_host.c + ..\..\..\src\common\common_include.c + common_include.c 0 0
@@ -707,11 +675,23 @@ 0 0 0 - ..\..\..\drivers\modbus\modbus_common.c + ..\..\..\src\modbus\modbus_common.c modbus_common.c 0 0 + + 5 + 35 + 1 + 0 + 0 + 0 + ..\..\..\src\modbus\modbus_host.c + modbus_host.c + 0 + 0 + @@ -722,7 +702,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 02fb4f89c8915cca072ebb84d836639c90ac215c..8dfde4bc3f829ba519ba31b0dac44b971ecc1582 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,14 +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 + + + modbus_host.c + 1 + ..\..\..\src\modbus\modbus_host.c diff --git a/examples/modbus_host/README.txt b/examples/modbus_host/README.txt index 8bf433eea4c46c64eedb776820dd9579556d6e50..f3856450589157df122d8c2155e8196498c8fbfe 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-28 ashuai0110 5.35 STM32F103 ================================================================================ 功能描述 diff --git a/examples/modbus_host/SRC/main.c b/examples/modbus_host/SRC/main.c index 06cee9f96544f4e3b9507f94a8485964e4423b29..cffa335706b96994d8988e2203100eb357a9e5b5 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-28 * @brief 使用举例-MODBUS主机程序 * ****************************************************************************** @@ -49,6 +49,7 @@ uint16_t inputRegister[8]; /* 输入寄存器 共8*1=8个 地址0~7 */ /* 私有函数原型---------------------------------------------------------------*/ + /** * @brief 定时器中断函数 * @@ -58,28 +59,10 @@ 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) { - /* 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); } @@ -143,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); @@ -156,7 +142,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 +165,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 c33b0c97e6f393d0135bc9b9194d97f9783bc1de..5bfab9ceeb9f68cc5c80f842aedd5c7de29afaca 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 @@ -576,7 +543,7 @@ segger - 0 + 1 0 0 0 @@ -587,7 +554,7 @@ 0 0 0 - ..\..\..\drivers\segger_rtt\SEGGER_RTT.c + ..\..\..\src\segger_rtt\SEGGER_RTT.c SEGGER_RTT.c 0 0 @@ -599,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 @@ -663,8 +630,8 @@ 0 0 0 - ..\..\..\drivers\modbus\modbus_common.c - modbus_common.c + ..\..\..\src\common\common_include.c + common_include.c 0 0 @@ -675,7 +642,19 @@ 0 0 0 - ..\..\..\drivers\modbus\modbus_slave.c + ..\..\..\src\modbus\modbus_common.c + modbus_common.c + 0 + 0 + + + 5 + 35 + 1 + 0 + 0 + 0 + ..\..\..\src\modbus\modbus_slave.c modbus_slave.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 112bd423b98bbc67638e7d35e4e8d1a424891530..065a0b5ee223553d1749ed616df6540b996b65b9 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 @@ -563,15 +563,20 @@ 1 ..\SRC\main.c + + common_include.c + 1 + ..\..\..\src\common\common_include.c + modbus_common.c 1 - ..\..\..\drivers\modbus\modbus_common.c + ..\..\..\src\modbus\modbus_common.c modbus_slave.c 1 - ..\..\..\drivers\modbus\modbus_slave.c + ..\..\..\src\modbus\modbus_slave.c diff --git a/examples/modbus_slave/README.txt b/examples/modbus_slave/README.txt index 34068c5fc6fd2e14c5f0ee12c817fe5bd3dba892..160f08511b2825de775450d3f90c47cd16e5b87d 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-28 ashuai0110 5.35 STM32F103 ================================================================================ 功能描述 diff --git a/examples/modbus_slave/SRC/main.c b/examples/modbus_slave/SRC/main.c index 75856aff0bf25f3d2bf5b3f1ecd9b41d9a2823e4..29938f343a069ad44ab23ad76dca73cbf1479c8f 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-28 * @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); } @@ -134,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); @@ -148,7 +137,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 f262c89ea285332c80d68f815b39693df93f88b8..07a9259de79f8e4c56febfb3ecb56df55e98ee2d 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 @@ -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 @@ -602,75 +650,107 @@ - drivers/common + bootloader 1 0 0 0 7 - 32 - 5 + 36 + 1 0 0 0 - ..\..\..\drivers\common\all_include.h - all_include.h + ..\..\..\src\bootloader\bootloader.c + bootloader.c 0 0 7 - 33 - 5 + 37 + 1 0 0 0 - ..\..\..\drivers\common\common_include.h - common_include.h + ..\..\..\src\bootloader\xmodem.c + xmodem.c + 0 + 0 + + + 7 + 38 + 1 + 0 + 0 + 0 + ..\..\..\src\bootloader\ymodem.c + ymodem.c 0 0 - drivers/modbus + common 1 0 0 0 8 - 34 + 39 1 0 0 0 - ..\..\..\drivers\modbus\modbus_common.c + ..\..\..\src\common\common_include.c + common_include.c + 0 + 0 + + + + + modbus + 1 + 0 + 0 + 0 + + 9 + 40 + 1 + 0 + 0 + 0 + ..\..\..\src\modbus\modbus_common.c modbus_common.c 0 0 - 8 - 35 + 9 + 41 1 0 0 0 - ..\..\..\drivers\modbus\modbus_host.c + ..\..\..\src\modbus\modbus_host.c modbus_host.c 0 0 - 8 - 36 + 9 + 42 1 0 0 0 - ..\..\..\drivers\modbus\modbus_slave.c + ..\..\..\src\modbus\modbus_slave.c modbus_slave.c 0 0 @@ -678,151 +758,139 @@ - drivers/modules + modules 1 0 0 0 - 9 - 37 + 10 + 43 1 0 0 0 - ..\..\..\drivers\modules\command_line.c + ..\..\..\src\modules\command_line.c command_line.c 0 0 - 9 - 38 + 10 + 44 1 0 0 0 - ..\..\..\drivers\modules\data_check.c + ..\..\..\src\modules\data_check.c data_check.c 0 0 - 9 - 39 + 10 + 45 1 0 0 0 - ..\..\..\drivers\modules\data_convert.c + ..\..\..\src\modules\data_convert.c data_convert.c 0 0 - 9 - 40 + 10 + 46 1 0 0 0 - ..\..\..\drivers\modules\delay_no_block.c + ..\..\..\src\modules\delay_no_block.c delay_no_block.c 0 0 - 9 - 41 + 10 + 47 1 0 0 0 - ..\..\..\drivers\modules\input_output.c + ..\..\..\src\modules\input_output.c input_output.c 0 0 - 9 - 42 + 10 + 48 1 0 0 0 - ..\..\..\drivers\modules\memory.c + ..\..\..\src\modules\memory.c memory.c 0 0 - 9 - 43 + 10 + 49 1 0 0 0 - ..\..\..\drivers\modules\message_queue.c + ..\..\..\src\modules\message_queue.c message_queue.c 0 0 - 9 - 44 + 10 + 50 1 0 0 0 - ..\..\..\drivers\modules\ring_buffer.c + ..\..\..\src\modules\ring_buffer.c ring_buffer.c 0 0 - 9 - 45 - 1 - 0 - 0 - 0 - ..\..\..\drivers\modules\ring_queue.c - ring_queue.c - 0 - 0 - - - 9 - 46 + 10 + 51 1 0 0 0 - ..\..\..\drivers\modules\sync_method.c + ..\..\..\src\modules\sync_method.c sync_method.c 0 0 - 9 - 47 + 10 + 52 1 0 0 0 - ..\..\..\drivers\modules\timer_software.c + ..\..\..\src\modules\timer_software.c timer_software.c 0 0 - 9 - 48 + 10 + 53 1 0 0 0 - ..\..\..\drivers\modules\uart_handler.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 68ccfc9ecaf1ede03658a18913d61b5f3fa375ef..cd2711665fe5e4ec9802af97874de3e4ca59c2cd 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 @@ -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\modules;..\..\..\src\segger_rtt;..\..\..\src\modbus;..\..\..\src\bootloader @@ -531,17 +531,39 @@ 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 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 @@ -564,102 +586,112 @@ - drivers/common + bootloader - all_include.h - 5 - ..\..\..\drivers\common\all_include.h + bootloader.c + 1 + ..\..\..\src\bootloader\bootloader.c - common_include.h - 5 - ..\..\..\drivers\common\common_include.h + xmodem.c + 1 + ..\..\..\src\bootloader\xmodem.c + + + ymodem.c + 1 + ..\..\..\src\bootloader\ymodem.c - drivers/modbus + common + + + common_include.c + 1 + ..\..\..\src\common\common_include.c + + + + + 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 - - - ring_queue.c - 1 - ..\..\..\drivers\modules\ring_queue.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 + ..\..\..\src\modules\uart_handler.c diff --git a/examples/project_template/README.txt b/examples/project_template/README.txt index e416d8acd91bf7ed225731b75f0b2c3ee1a58d85..6f300a0e6adf539e78854d6c73ffcee69881ebaa 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-28 ashuai0110 5.35 STM32F103 ================================================================================ 功能描述 diff --git a/examples/project_template/SRC/main.c b/examples/project_template/SRC/main.c index 1a7c601f3278cb0d81fb9cc0b843e77c2c5a0bdd..4180ed012076f724d15d7c3009cbec82389fc6ea 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-28 + * @brief 使用举例-工程模版 * ****************************************************************************** * @attention @@ -32,15 +32,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/MDK/use_example.uvoptx b/examples/ring_buffer/MDK/use_example.uvoptx index 11547f740743edce3f6ef05e0f9d7bdeb0b5382e..45338ac2d3cac130945637020f2b82cb8c78bcc0 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,7 +598,19 @@ 0 0 0 - ..\..\..\drivers\modules\ring_buffer.c + ..\..\..\src\common\common_include.c + common_include.c + 0 + 0 + + + 5 + 33 + 1 + 0 + 0 + 0 + ..\..\..\src\modules\ring_buffer.c ring_buffer.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 6f13d6b9d701ae0d220b75813d49d6098a35ccf6..e11f29b4ecd52699747f6afc5960d63c90773115 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 @@ -558,10 +558,15 @@ 1 ..\SRC\main.c + + common_include.c + 1 + ..\..\..\src\common\common_include.c + ring_buffer.c 1 - ..\..\..\drivers\modules\ring_buffer.c + ..\..\..\src\modules\ring_buffer.c diff --git a/examples/ring_buffer/README.txt b/examples/ring_buffer/README.txt index ea36226de72334b3ef6bcb790b8c288b406209ce..76cb7911694df86c754e1485157926c582707bb3 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 +2024-01-28 ashuai0110 5.35 STM32F103 ================================================================================ 功能描述 diff --git a/examples/ring_buffer/SRC/main.c b/examples/ring_buffer/SRC/main.c index 9c542c865012efa25ec60619d2ee90532515f76e..5afc1be0b8af206a964147e87173fa4bb928e782 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 2024-01-28 * @brief 使用举例-环形缓冲区 * ****************************************************************************** @@ -26,13 +26,14 @@ /* 私有类型定义---------------------------------------------------------------*/ /* 私有变量-------------------------------------------------------------------*/ -static ring_buffer_t testRB; /* 测试环形缓冲区实例 */ +static ring_buffer_t testRB; /* 环形缓冲区管理实例 */ static uint8_t testBuf[50]; /* 实际缓冲区 */ /* 全局变量-------------------------------------------------------------------*/ /* 私有函数原型---------------------------------------------------------------*/ + /** * @brief 串口中断函数 * @@ -42,40 +43,25 @@ 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 实际读取大小 + * @brief main */ -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 +79,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 +94,7 @@ int main(int argc, char *argv[]) DEBUG_LOG("rec:%s", recData); } dataCnt = 0; - } + } /* 否则继续存储 */ else { recData[dataCnt++] = buf[cnt]; diff --git a/examples/sync_method/MDK/use_example.uvoptx b/examples/sync_method/MDK/use_example.uvoptx index 40ea0312a7de98e16361c7a64c4545b104cb3a5c..52290d8030205eac34077d6ca7ffb9eab8e0ce33 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,7 +598,19 @@ 0 0 0 - ..\..\..\drivers\modules\sync_method.c + ..\..\..\src\common\common_include.c + common_include.c + 0 + 0 + + + 5 + 33 + 1 + 0 + 0 + 0 + ..\..\..\src\modules\sync_method.c sync_method.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 f08b1f444202659794b6a70fc63eb4ca90c7a217..7a18c85f2922ab5fb492dda165af99ce62b93ba4 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 @@ -558,10 +558,15 @@ 1 ..\SRC\main.c + + common_include.c + 1 + ..\..\..\src\common\common_include.c + sync_method.c 1 - ..\..\..\drivers\modules\sync_method.c + ..\..\..\src\modules\sync_method.c diff --git a/examples/sync_method/README.txt b/examples/sync_method/README.txt index c10e1a343bab39b22bd07be70ed08cc813decf1f..c07a291918edacdb141bd54a28509fa78423eff6 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-28 ashuai0110 5.35 STM32F103 ================================================================================ 功能描述 diff --git a/examples/sync_method/SRC/main.c b/examples/sync_method/SRC/main.c index b538af28a2840c5e6e42e34475c2f52cd37d86a8..bed58c910b9ee3865224eac513db87be0902e8fd 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-28 * @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/timer_software/MDK/use_example.uvoptx b/examples/timer_software/MDK/use_example.uvoptx index 1bf747b1e6917decf18d57c267429be3eb74f1d6..dc3b7c3adf20f77572345b0d887af46b942f70a9 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,7 +610,19 @@ 0 0 0 - ..\..\..\drivers\modules\timer_software.c + ..\..\..\src\common\common_include.c + common_include.c + 0 + 0 + + + 5 + 34 + 1 + 0 + 0 + 0 + ..\..\..\src\modules\timer_software.c timer_software.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 eab55501e086f536914571e191056a15a628edc7..d488f010089dc8b8bf6986fb11a430389c7eb33a 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 @@ -563,10 +563,15 @@ 1 ..\SRC\main.c + + common_include.c + 1 + ..\..\..\src\common\common_include.c + timer_software.c 1 - ..\..\..\drivers\modules\timer_software.c + ..\..\..\src\modules\timer_software.c diff --git a/examples/timer_software/README.txt b/examples/timer_software/README.txt index 44d9b0ebdd94a7a55c221665d3dcc78aa13e2bb2..720f3783c2272810bbe4be6cac1789b416ae93fd 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 +2024-01-28 ashuai0110 5.35 STM32F103 ================================================================================ 功能描述 diff --git a/examples/timer_software/SRC/main.c b/examples/timer_software/SRC/main.c index d52edff290355ad116d6769788f37a74f066b2b1..d492f35677456e1e004380fdddc44ff7ebe690d5 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 2024-01-28 * @brief 使用举例-软件定时器 * ****************************************************************************** @@ -23,7 +23,6 @@ #include "timer_software.h" /* 私有宏定义-----------------------------------------------------------------*/ -#define TIMER_S_PERIOD (1u) /* 软件定时器调度周期1ms */ /* 私有类型定义---------------------------------------------------------------*/ @@ -46,8 +45,8 @@ void TIM1_UP_IRQHandler(void) { if(TIM_GetITStatus(TIM1, TIM_IT_Update) != RESET) { - /* 软件定时器轮询处理 */ - timer_s_poll(); + /* 组件计时节拍接口 */ + 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,15 +91,16 @@ 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) { - + /* 软件定时器轮询处理 */ + timer_s_poll(); } } diff --git a/examples/uart_handler/MDK/use_example.uvoptx b/examples/uart_handler/MDK/use_example.uvoptx index 6a61e91bc9ec73862b76fc2425966658ea475eef..a2cac30d209aea27d42aa10ddc793497ca4dc94f 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,20 @@ 0 0 0 - ..\..\..\drivers\modules\ring_queue.c - ring_queue.c + ..\..\..\src\modules\uart_handler.c + uart_handler.c + 0 + 0 + + + 5 + 35 + 1 + 0 + 0 + 0 + ..\..\..\src\modules\ring_buffer.c + ring_buffer.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 c4249e3f89c19f079b84a7295b64f1f2ff2b2831..48ab2c0ee7a1324b158e16eff544f5eb9159697f 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 @@ -563,15 +563,20 @@ 1 ..\SRC\main.c + + common_include.c + 1 + ..\..\..\src\common\common_include.c + uart_handler.c 1 - ..\..\..\drivers\modules\uart_handler.c + ..\..\..\src\modules\uart_handler.c - ring_queue.c + ring_buffer.c 1 - ..\..\..\drivers\modules\ring_queue.c + ..\..\..\src\modules\ring_buffer.c diff --git a/examples/uart_handler/README.txt b/examples/uart_handler/README.txt index 45c22f0cac31c410a62ecca82646285c5b16f21a..e33e5c214ae592b99a35d61c12076d26c075dac0 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 +2024-01-28 ashuai0110 5.35 STM32F103 ================================================================================ 功能描述 diff --git a/examples/uart_handler/SRC/main.c b/examples/uart_handler/SRC/main.c index e32d9d7715958b366a710ae88ecbacf9d213d4ea..ce6fee7495afce582107e9903da5764e9b34179e 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 2024-01-28 * @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); } @@ -96,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); } @@ -126,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); @@ -135,16 +123,28 @@ 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); - - 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"); + } } } diff --git a/examples/ring_queue/MDK/use_example.uvoptx b/examples/xmodem/MDK/use_example.uvoptx similarity index 88% rename from examples/ring_queue/MDK/use_example.uvoptx rename to examples/xmodem/MDK/use_example.uvoptx index 8199edd8237953ea1f401572b47f1f450ab3217b..20466c17b3bc179ac9e20ad5114b12139e2b4d46 100644 --- a/examples/ring_queue/MDK/use_example.uvoptx +++ b/examples/xmodem/MDK/use_example.uvoptx @@ -117,6 +117,26 @@ 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 @@ -129,18 +149,60 @@ + + + 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 - 0 + 1 0 0 0 0 - 0 + 1 0 0 0 @@ -523,7 +585,7 @@ segger - 0 + 1 0 0 0 @@ -534,7 +596,7 @@ 0 0 0 - ..\..\..\drivers\segger_rtt\SEGGER_RTT.c + ..\..\..\src\segger_rtt\SEGGER_RTT.c SEGGER_RTT.c 0 0 @@ -546,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 @@ -566,8 +628,20 @@ 0 0 0 - ..\..\[base_on_stm32f1]\stm32f1_sys\usart.c - usart.c + ..\..\[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 @@ -581,7 +655,7 @@ 0 5 - 31 + 32 1 0 0 @@ -593,25 +667,25 @@ 5 - 32 + 33 1 0 0 0 - ..\..\..\drivers\modules\ring_queue.c - ring_queue.c + ..\..\..\src\common\common_include.c + common_include.c 0 0 5 - 33 + 34 1 0 0 0 - ..\..\..\drivers\modules\input_output.c - input_output.c + ..\..\..\src\bootloader\xmodem.c + xmodem.c 0 0 @@ -625,7 +699,7 @@ 0 6 - 34 + 35 5 0 0 diff --git a/examples/ring_queue/MDK/use_example.uvprojx b/examples/xmodem/MDK/use_example.uvprojx similarity index 96% rename from examples/ring_queue/MDK/use_example.uvprojx rename to examples/xmodem/MDK/use_example.uvprojx index 561c7347fa71b8735caf5cf4c5911c44c33594ce..b674a1b56f2ddec39131293edb76224e0c3d9825 100644 --- a/examples/ring_queue/MDK/use_example.uvprojx +++ b/examples/xmodem/MDK/use_example.uvprojx @@ -80,9 +80,9 @@ 0 - 0 + 1 0 - + fromelf.exe --bin -o "$L@L.bin" "#L" 0 0 @@ -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\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 @@ -544,9 +544,14 @@ system - usart.c + usart_dma.c + 1 + ..\..\[base_on_stm32f1]\stm32f1_sys\usart_dma.c + + + tim.c 1 - ..\..\[base_on_stm32f1]\stm32f1_sys\usart.c + ..\..\[base_on_stm32f1]\stm32f1_sys\tim.c @@ -559,14 +564,14 @@ ..\SRC\main.c - ring_queue.c + common_include.c 1 - ..\..\..\drivers\modules\ring_queue.c + ..\..\..\src\common\common_include.c - input_output.c + xmodem.c 1 - ..\..\..\drivers\modules\input_output.c + ..\..\..\src\bootloader\xmodem.c diff --git a/examples/xmodem/README.txt b/examples/xmodem/README.txt new file mode 100644 index 0000000000000000000000000000000000000000..2b29fc0d1533bc4249cc3b04cbe176b5a73474a4 --- /dev/null +++ b/examples/xmodem/README.txt @@ -0,0 +1,47 @@ +================================================================================ + 用例使用说明 +================================================================================ +Date Author MDK MCU +2024-01-28 ashuai0110 5.35 STM32F103 + +================================================================================ +功能描述 +================================================================================ +本用例展示了xmodem协议组件的使用方法。 + +================================================================================ +测试环境 +================================================================================ +测试用板: +--------------------- +任意开发板 + +辅助工具: +--------------------- +J-Link + +辅助软件: +--------------------- +J-Link RTT Viewer +SecureCRT串口软件 + +源码文件: +--------------------- +xmodem.c +xmodem.h + +================================================================================ +使用步骤 +================================================================================ +1)使用J-Link连接目标板; +2)打开工程,重新编译,启动调试或直接下载程序运行; +3)用J-Link RTT Viewer软件连接,查看打印消息; +4)用SecureCRT串口软件连接设备串口,点击工具栏Transfer->Send Xmodem + 或Transfer->Receive Xmodem选项开始传输 + +================================================================================ +注意 +================================================================================ +1)用户根据需求可前往源码头文件修改宏定义参数 + +================================================================================ diff --git a/examples/xmodem/SRC/main.c b/examples/xmodem/SRC/main.c new file mode 100644 index 0000000000000000000000000000000000000000..70d502aaf64f7142894b6aa95c8ec8490a4c1e31 --- /dev/null +++ b/examples/xmodem/SRC/main.c @@ -0,0 +1,243 @@ +/** + ****************************************************************************** + * @file main.c + * @author ashuai0110 + * @version V1.0 + * @date 2024-01-28 + * @brief 使用举例-xmodem + * + ****************************************************************************** + * @attention + * + * 版权声明:内容为编者(ashuai0110)原创,使用请注明出处,当然,你也可以不这样做^_^ + * 出处链接:https://gitee.com/ashuai0110/mcu_reuse_development_module + * + ****************************************************************************** + */ + +/* 包含头文件-----------------------------------------------------------------*/ +#include "stm32f10x.h" +#include "usart_dma.h" +#include "tim.h" + +#include "xmodem.h" + +/* 私有宏定义-----------------------------------------------------------------*/ +#define XMODEM_TX_RX_TEST (1u) /* 0:测试发送 1:测试接收 */ + +/* 私有类型定义---------------------------------------------------------------*/ + +/* 私有变量-------------------------------------------------------------------*/ +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, 1000); +#if XMODEM_TX_RX_TEST + /* 启动xmodem接收 */ + xmodem_rx_start(&xmodem, XMODEM_RX_FLAG_CRC); +#endif + + while(1) + { + 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"); + } +#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"); + } +#endif + } +} + diff --git a/examples/ymodem/MDK/use_example.uvoptx b/examples/ymodem/MDK/use_example.uvoptx new file mode 100644 index 0000000000000000000000000000000000000000..b1f3971113b74bc544130e483a8727e9051c41ff --- /dev/null +++ b/examples/ymodem/MDK/use_example.uvoptx @@ -0,0 +1,875 @@ + + + + 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 + 419 + 1 +
134225620
+ 0 + 0 + 0 + 0 + 0 + 1 + D:\ASProject\mcuProject\mcu_development_template\mcu_reuse_development_module\drivers\bootloader\ymodem.c + + \\use_example\../../../drivers/bootloader/ymodem.c\419 +
+ + 1 + 0 + 427 + 1 +
134225648
+ 0 + 0 + 0 + 0 + 0 + 1 + D:\ASProject\mcuProject\mcu_development_template\mcu_reuse_development_module\drivers\bootloader\ymodem.c + + \\use_example\../../../drivers/bootloader/ymodem.c\427 +
+ + 2 + 0 + 441 + 1 +
134225682
+ 0 + 0 + 0 + 0 + 0 + 1 + D:\ASProject\mcuProject\mcu_development_template\mcu_reuse_development_module\drivers\bootloader\ymodem.c + + \\use_example\../../../drivers/bootloader/ymodem.c\441 +
+ + 3 + 0 + 481 + 1 +
134225806
+ 0 + 0 + 0 + 0 + 0 + 1 + D:\ASProject\mcuProject\mcu_development_template\mcu_reuse_development_module\drivers\bootloader\ymodem.c + + \\use_example\../../../drivers/bootloader/ymodem.c\481 +
+ + 4 + 0 + 557 + 1 +
134226256
+ 0 + 0 + 0 + 0 + 0 + 1 + D:\ASProject\mcuProject\mcu_development_template\mcu_reuse_development_module\drivers\bootloader\ymodem.c + + \\use_example\../../../drivers/bootloader/ymodem.c\557 +
+ + 5 + 0 + 417 + 1 +
0
+ 0 + 0 + 0 + 0 + 0 + 0 + D:\ASProject\mcuProject\mcu_development_template\mcu_reuse_development_module\drivers\bootloader\ymodem.c + + +
+ + 6 + 0 + 425 + 1 +
0
+ 0 + 0 + 0 + 0 + 0 + 0 + D:\ASProject\mcuProject\mcu_development_template\mcu_reuse_development_module\drivers\bootloader\ymodem.c + + +
+ + 7 + 0 + 439 + 1 +
0
+ 0 + 0 + 0 + 0 + 0 + 0 + D:\ASProject\mcuProject\mcu_development_template\mcu_reuse_development_module\drivers\bootloader\ymodem.c + + +
+ + 8 + 0 + 479 + 1 +
0
+ 0 + 0 + 0 + 0 + 0 + 0 + D:\ASProject\mcuProject\mcu_development_template\mcu_reuse_development_module\drivers\bootloader\ymodem.c + + +
+ + 9 + 0 + 555 + 1 +
0
+ 0 + 0 + 0 + 0 + 0 + 0 + D:\ASProject\mcuProject\mcu_development_template\mcu_reuse_development_module\drivers\bootloader\ymodem.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 + 1 + 0 + 0 + 0 + + 3 + 28 + 1 + 0 + 0 + 0 + ..\..\..\src\segger_rtt\SEGGER_RTT.c + SEGGER_RTT.c + 0 + 0 + + + 3 + 29 + 1 + 0 + 0 + 0 + ..\..\..\src\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 + ..\..\..\src\common\common_include.c + common_include.c + 0 + 0 + + + 5 + 34 + 1 + 0 + 0 + 0 + ..\..\..\src\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 0000000000000000000000000000000000000000..d9d6d7c7b4f9c679fe488f6236119a82abfd94ff --- /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;..\..\..\src\common;..\..\..\src\segger_rtt;..\..\..\src\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 + ..\..\..\src\segger_rtt\SEGGER_RTT.c + + + SEGGER_RTT_printf.c + 1 + ..\..\..\src\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 + ..\..\..\src\common\common_include.c + + + ymodem.c + 1 + ..\..\..\src\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 0000000000000000000000000000000000000000..8261eaa493369cd7aaf4db8df8777a2704456550 --- /dev/null +++ b/examples/ymodem/README.txt @@ -0,0 +1,47 @@ +================================================================================ + 用例使用说明 +================================================================================ +Date Author MDK MCU +2024-01-28 ashuai0110 5.35 STM32F103 + +================================================================================ +功能描述 +================================================================================ +本用例展示了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 0000000000000000000000000000000000000000..551c91fd2f90a957c82b957127acad96b51f2e0b --- /dev/null +++ b/examples/ymodem/SRC/main.c @@ -0,0 +1,286 @@ +/** + ****************************************************************************** + * @file main.c + * @author ashuai0110 + * @version V1.0 + * @date 2024-01-28 + * @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:测试发送 1:测试接收 */ + +/* 私有类型定义---------------------------------------------------------------*/ + +/* 私有变量-------------------------------------------------------------------*/ +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; /* 文件信息结构体 */ + +/* 全局变量-------------------------------------------------------------------*/ + +/* 私有函数原型---------------------------------------------------------------*/ +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)) + { + ymodem_get_file_info(&ymodem, &fileInfo); /* 获取文件信息保存至fileInfo结构体 */ + 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) +{ + static uint8_t fileCnt = 0; /* 文件计数 */ + static uint32_t sendCnt = 0; /* 已发送字节 */ + + /* 文件信息 */ + if(YMODEM_FILE_FLAG(ymodem)) + { + /* 只发送一个文件 */ + 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 + { + /* 已发送字节小于文件长度时则设置发送内容 */ + 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; + } + } +} + +/** + * @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, 1000); +#if YMODEM_TX_RX_TEST + /* 启动ymodem接收 */ + ymodem_rx_start(&ymodem, YMODEM_RX_FLAG_CRC); +#endif + + while(1) + { + 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"); + } +#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"); + } +#endif + } +} + diff --git a/src/bootloader/bootloader.c b/src/bootloader/bootloader.c new file mode 100644 index 0000000000000000000000000000000000000000..cc17e646704b0dc47c62305d0cde85b3a7c20dfc --- /dev/null +++ b/src/bootloader/bootloader.c @@ -0,0 +1,313 @@ +/** + ****************************************************************************** + * @file bootloader.c + * @author ashuai0110 + * @version V2.2 + * @date 2024-01-28 + * @brief 升级引导程序 + * + ****************************************************************************** + * @attention + * + * 版权声明:内容为编者(ashuai0110)原创,使用请注明出处,当然,你也可以不这样做^_^ + * 出处链接:https://gitee.com/ashuai0110/mcu_reuse_development_module.git + * + * Change Logs: + * Date Author Notes + * 2024-01-21 ashuai0110 完成基本内容 + * + ****************************************************************************** + */ + +/* 包含头文件-----------------------------------------------------------------*/ +#include "bootloader.h" + +/** + * @addtogroup bootloader + * @{ + */ + +/** + * @defgroup bootloader bootloader + * @{ + */ + +/* 私有宏定义-----------------------------------------------------------------*/ +/** + * @defgroup bootloader_local_macros bootloader local macros + * @{ + */ + +/** + * @defgroup bootloader_check_parameters_validity bootloader check parameters validity + * @{ + */ +/* 升级标志有效性检查 */ +#define IS_VALID_UPDATA_FLAG(x) \ +( ((x) == BOOT_UPDATA_FLAG) || \ + ((x) == BOOT_TO_APP_FLAG) || \ + ((x) == BOOT_TO_FACTORY_FLAG)) + +/** + * @} + */ + +/** + * @} + */ + +/* 私有类型定义---------------------------------------------------------------*/ + +/* 私有变量-------------------------------------------------------------------*/ +/** + * @defgroup bootloader_local_variables bootloader local variables + * @{ + */ + +static bootloader_t bootCtrl; /*!< bootloader管理实例 */ + +/** + * @} + */ + +/* 全局变量-------------------------------------------------------------------*/ + +/* 私有函数原型---------------------------------------------------------------*/ +/** + * @defgroup bootloader_local_functions bootloader local functions + * @{ + */ + + +/** + * @} + */ + +/** + * @defgroup bootloader_global_functions bootloader global functions + * @{ + */ + +/** + * @brief bootloader初始化 + * + * @param flashErase : 对接flash擦除接口(用户实现) + * + * @param flashRead : 对接flash读取接口(用户实现) + * + * @param flashWrite : 对接flash写入接口(用户实现) + * + * @retval None + */ +void boot_init(boot_flash_erase_fn_t flashErase, boot_flash_rw_fn_t flashRead, boot_flash_rw_fn_t flashWrite) +{ + ASSERT_PARAM(IS_VALID_POINT(flashErase)); + ASSERT_PARAM(IS_VALID_POINT(flashRead)); + ASSERT_PARAM(IS_VALID_POINT(flashWrite)); + + /* 初始化各参数 */ + bootCtrl.flashEraseFn = flashErase; + bootCtrl.flashReadFn = flashRead; + bootCtrl.flashWriteFn = flashWrite; + /* 读取FLASH中的内存参数 */ + 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; } +} + +/** + * @brief bootloader校验升级标志 + * + * @note 进入bootloader程序检查是升级还是直接跳转 + * + * @param None + * + * @retval None + */ +void boot_check_updata_flag(void) +{ + switch(bootCtrl.bootInfo.updataFlag) + { + 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 擦除状态 + * @arg RET_OK : 擦除成功 + * @arg RET_ERR : 擦除失败 + * @arg RET_FULL : 超出APP大小 + */ +uint8_t boot_erase_application(uint32_t appSize) +{ + uint8_t ret; + + /* 参数若超出应用程序最大大小则返回RET_FULL */ + if(4 >= appSize || BOOT_APP_SIZE_MAX < appSize) { return RET_FULL; } + + /* 擦除应用程序FLASH区域 */ + ret = bootCtrl.flashEraseFn(BOOT_ROM_START_ADDR + BOOT_APP_ADDR_OFFSET, appSize); + + return ret; +} + +/** + * @brief 编程应用程序FLASH区域 + * + * @param data : 数据缓冲区 + * + * @param len : 写入数量byte + * + * @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; } + /* 编程应用程序FLASH区域 */ + ret = bootCtrl.flashWriteFn(BOOT_ROM_START_ADDR + BOOT_APP_ADDR_OFFSET + bootCtrl.writedSize, data, len); + 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; /* 赋值升级标志 */ + /* 先擦除升级信息FLASH区域 */ + bootCtrl.flashEraseFn(BOOT_ROM_START_ADDR + BOOT_INFO_ADDR_OFFSET, sizeof(boot_info_t)); + /* 再编程升级信息FLASH区域 */ + bootCtrl.flashWriteFn(BOOT_ROM_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; /* 赋值应用程序版本 */ + /* 先擦除升级信息FLASH区域 */ + bootCtrl.flashEraseFn(BOOT_ROM_START_ADDR + BOOT_INFO_ADDR_OFFSET, sizeof(boot_info_t)); + /* 再编程升级信息FLASH区域 */ + bootCtrl.flashWriteFn(BOOT_ROM_START_ADDR + BOOT_INFO_ADDR_OFFSET, (void *)&bootCtrl.bootInfo, sizeof(boot_info_t)); +} + +/** + * @brief bootloader跳转应用程序 + * + * @param None + * + * @retval None + */ +void boot_to_application(void) +{ + 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(); + } +} + +/** + * @brief bootloader跳转备份(出厂)程序 + * + * @param None + * + * @retval None + */ +void boot_to_factory(void) +{ + /* 写入跳转备份(出厂)程序标志 */ + boot_program_updata_flag(BOOT_TO_FACTORY_FLAG); + /* 恢复已使用的中断和外设 */ + boot_recover_all(); + /* 将备份(出厂)程序地址+4后强转为函数指针 */ + 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(); +} + +/** + * @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/src/bootloader/bootloader.h b/src/bootloader/bootloader.h new file mode 100644 index 0000000000000000000000000000000000000000..02d6cf463441d07fc451dc1aba8f3bd0353f787f --- /dev/null +++ b/src/bootloader/bootloader.h @@ -0,0 +1,191 @@ +/** + ****************************************************************************** + * @file bootloader.h + * @author ashuai0110 + * @version V2.2 + * @date 2024-01-28 + * @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 bootloader + * @{ + */ + +/** + * @addtogroup bootloader + * @{ + */ + +/* 宏定义---------------------------------------------------------------------*/ +/** + * @defgroup bootloader_global_macros bootloader global macros + * @{ + */ + +/* 设置栈顶指针接口(不适配时用户需自行更换) */ +#define BOOT_SET_STACK_POINT(addr) ( __set_MSP((addr)) ) + +/** + * @defgroup boot_mcu_info bootloader mcu info + * @brief MCU ROM,RAM,升级参数设置(用户按需修改) + * @{ + */ +#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 */ +/** + * @} + */ + +/** + * @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/升级失败标志 */ +/** + * @} + */ + +/** + * @} + */ + +/* 类型定义-------------------------------------------------------------------*/ +/** + * @defgroup bootloader_global_types bootloader global types + * @{ + */ + +/** + * @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, uint32_t len); + +/** + * @brief 擦除flash + * + * @param startAddr : 起始地址 + * + * @param bytes : 擦除总字节数量 + * + * @retval 0:擦除成功 1:擦除失败 + */ +typedef uint8_t (* boot_flash_erase_fn_t)(uint32_t startAddr, uint32_t bytes); + +/** + * @brief 升级参数 structure definition + */ +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; /*!< 跳转应用程序函数 */ + + 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; + +/** + * @} + */ + +/* 全局变量-------------------------------------------------------------------*/ + +/* 函数原型-------------------------------------------------------------------*/ +/** + * @addtogroup bootloader_global_functions + * @{ + */ + +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); + +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); + +/* 弱定义函数 */ +void boot_recover_all(void); + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* bootloader.h */ diff --git a/src/bootloader/xmodem.c b/src/bootloader/xmodem.c new file mode 100644 index 0000000000000000000000000000000000000000..44a7f2b491f02ca54450c0a798403b1dd0416741 --- /dev/null +++ b/src/bootloader/xmodem.c @@ -0,0 +1,603 @@ +/** + ****************************************************************************** + * @file xmodem.c + * @author ashuai0110 + * @version V2.2 + * @date 2024-01-28 + * @brief xmodem协议 + * + ****************************************************************************** + * @attention + * + * 版权声明:内容为编者(ashuai0110)原创,使用请注明出处,当然,你也可以不这样做^_^ + * 出处链接:https://gitee.com/ashuai0110/mcu_reuse_development_module.git + * + * Change Logs: + * Date Author Notes + * 2024-01-07 ashuai0110 完成基本内容 + * 2024-01-14 ashuai0110 修改接收使用校验和的逻辑错误,增加一些协议信息的宏定义 + * 2024-01-21 ashuai0110 增加收发轮询处理返回状态,优化逻辑 + * 2024-01-22 ashuai0110 增加发送缓存读出完毕关闭发送中断的处理 + * + ****************************************************************************** + */ + +/* 包含头文件-----------------------------------------------------------------*/ +#include "xmodem.h" + +/** + * @addtogroup bootloader + * @{ + */ + +/** + * @defgroup xmodem xmodem + * @{ + */ + +/* 私有宏定义-----------------------------------------------------------------*/ +/** + * @defgroup xmodem_local_macros xmodem local macros + * @{ + */ + +/** + * @defgroup xmodem_check_parameters_validity xmodem check parameters validity + * @{ + */ +/* xmodem接收标志有效性检查 */ +#define IS_VALID_RX_FLAG(x) \ +( ((x) == XMODEM_RX_FLAG_NAK) || \ + ((x) == XMODEM_RX_FLAG_CRC)) + +/** + * @} + */ + +/** + * @} + */ + +/* 私有类型定义---------------------------------------------------------------*/ + +/* 私有变量-------------------------------------------------------------------*/ + +/* 全局变量-------------------------------------------------------------------*/ + +/* 私有函数原型---------------------------------------------------------------*/ +/** + * @defgroup xmodem_local_functions xmodem local functions + * @{ + */ + +/** + * @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; + + 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 xmodem_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 xmodem初始状态 + * + * @param _xmodem : xmodem管理实例 + * + * @retval None + */ +inline static void xmodem_init_state(xmodem_t *_xmodem) +{ + _xmodem->eotFlag = 0; + _xmodem->rspTimeoutCnt = 0; + _xmodem->rspTimeoutTimes = 0; + _xmodem->packetNum = 1; + _xmodem->state = XMODEM_STATE_IDLE; +} + +/** + * @} + */ + +/** + * @defgroup xmodem_global_functions xmodem global functions + * @{ + */ + +/** + * @brief xmodem初始化 + * + * @param _xmodem : xmodem管理实例 + * + * @param pBuf : 数据缓存区 + * + * @param bufLen : 数据缓存区长度byte(可根据xmodem.h:50行xmodem协议格式定义) + * + * @param txEnFn : 串口发送前准备函数 + * + * @param getPacketFn : 获取数据包回调函数(不用可填NULL) + * + * @param setPacketFn : 设置数据包回调函数(不用可填NULL) + * + * @param rspTimeout : 回复超时时间sec + * + * @retval None + */ +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->txEnFn = txEnFn; + _xmodem->getPacketFn = getPacketFn; + _xmodem->setPacketFn = setPacketFn; + _xmodem->rspTimeout = rspTimeout; + _xmodem->packetNum = 1; + _xmodem->state = XMODEM_STATE_IDLE; +} + +/** + * @brief xmodem接收轮询处理 + * + * @note SecureCRT实测开启串口DMA接收1024byte数据包稳定8KB/sec + * + * @param _xmodem : xmodem管理实例 + * + * @retval 接收轮询状态 + * @arg RET_OK : 传输完成 + * @arg RET_ERR : 传输错误 + * @arg RET_ING : 进行中(默认处于此状态) + * @arg RET_TIMEOUT : 回复超时 + */ +uint8_t xmodem_rx_poll(xmodem_t *_xmodem) +{ + uint8_t ret = RET_ING; + uint32_t tickTmp; + + ASSERT_PARAM(IS_VALID_POINT(_xmodem)); + + switch(_xmodem->state) + { + case XMODEM_STATE_IDLE: break; + case XMODEM_STATE_WAIT: + tickTmp = _xmodem->rspTimeoutCnt; + /* 应答超时判断 */ + if(tickTmp && (module_tick_get() - tickTmp) > _xmodem->rspTimeout) + { + _xmodem->rspTimeoutCnt = 0; + /* 若回复超时次数达到预设值 则直接中断接收回到IDLE状态 */ + if(_xmodem->rspTimeoutTimes++ >= XMODEM_RSP_TIMES) + { + xmodem_init_state(_xmodem); + ret = RET_TIMEOUT; /* 回复超时 */ + break; + } + /* 重发当前包 */ + _xmodem->dataLen = _xmodem->dataLenTmp; + _xmodem->txEnFn(1); + } + break; + case XMODEM_STATE_CHECK_HEAD: + /* 根据包头和数据长度进行初步检查 */ + /* SOH为包头 携带128byte数据 */ + 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 = YMODEM_DATA_SIZE; + } /* STX为包头 携带1024byte数据 */ + 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 = YMODEM_DATA_1K_SIZE; + } /* EOT为包头 表示传输结束 */ + else if(XMODEM_EOT == _xmodem->dataBuf[YMODEM_START_INDEX]) + { + xmodem_init_state(_xmodem); + /* 回复ACK */ + _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 + { + _xmodem->state = XMODEM_STATE_WAIT; + 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字节累加和校验 */ + if(1 == _xmodem->checkNum) + { + /* 校验成功 */ + 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[YMODEM_DATA_INDEX], &_xmodem->dataLenTmp); + _xmodem->dataBuf[YMODEM_START_INDEX] = XMODEM_ACK; /* 回复ACK */ + } /* 校验失败 */ + else + { + _xmodem->dataBuf[YMODEM_START_INDEX] = XMODEM_NAK; /* 回复NAK */ + } + } /* 2字节CRC16校验 */ + else if(2 == _xmodem->checkNum) + { + /* 校验成功 */ + if(0 == xmodem_check_crc16(&_xmodem->dataBuf[YMODEM_DATA_INDEX], _xmodem->dataLenTmp + _xmodem->checkNum)) + { + _xmodem->getPacketFn(_xmodem->packetNum++, &_xmodem->dataBuf[YMODEM_DATA_INDEX], &_xmodem->dataLenTmp); /* 用户回调函数 */ + _xmodem->dataBuf[YMODEM_START_INDEX] = XMODEM_ACK; /* 回复ACK */ + } /* 校验失败 */ + else + { + _xmodem->dataBuf[YMODEM_START_INDEX] = XMODEM_NAK; /* 回复NAK */ + } + } + } /* 否则回复NAK */ + else + { + _xmodem->dataBuf[YMODEM_START_INDEX] = XMODEM_NAK; + } + _xmodem->rspTimeoutTimes = 0; + _xmodem->state = XMODEM_STATE_WAIT; /* 切换状态 */ + /* 发送回复内容 */ + _xmodem->dataLen = 1; + _xmodem->dataLenTmp = _xmodem->dataLen; + _xmodem->txEnFn(1); + break; + default: + xmodem_init_state(_xmodem); + ret = RET_ERR; /* 传输错误 */ + break; + } + + return ret; +} + +/** + * @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_STATE_IDLE == _xmodem->state) + { + _xmodem->checkNum = (startFlag == XMODEM_RX_FLAG_NAK) ? 1 : 2; /* 记录校验方式 */ + _xmodem->state = XMODEM_STATE_WAIT; /* 切换状态 */ + /* 发送启动内容 */ + _xmodem->dataBuf[YMODEM_START_INDEX] = startFlag; + _xmodem->dataLen = 1; + _xmodem->dataLenTmp = _xmodem->dataLen; + _xmodem->txEnFn(1); + } +} + +/** + * @brief xmodem发送轮询处理 + * + * @param _xmodem : xmodem管理实例 + * + * @retval 发送轮询状态 + * @arg RET_OK : 传输完成 + * @arg RET_ERR : 传输错误 + * @arg RET_ING : 进行中(默认处于此状态) + * @arg RET_TIMEOUT : 回复超时 + */ +uint8_t xmodem_tx_poll(xmodem_t *_xmodem) +{ + uint8_t ret = RET_ING; + uint16_t checkVal; + uint32_t tickTmp; + + ASSERT_PARAM(IS_VALID_POINT(_xmodem)); + + switch(_xmodem->state) + { + case XMODEM_STATE_IDLE: + /* 逐字节查询启动命令 */ + if(_xmodem->readLen < _xmodem->dataLen) + { + /* 收到NAK则使用累加和校验 */ + if(XMODEM_NAK == _xmodem->dataBuf[_xmodem->readLen]) + { + _xmodem->checkNum = 1; + } /* 收到'C'则使用CRC16校验 */ + else if(XMODEM_CRC16 == _xmodem->dataBuf[_xmodem->readLen]) + { + _xmodem->checkNum = 2; + } /* 否则认为是无效数据 */ + else + { + _xmodem->readLen++; + break; + } + _xmodem->state = XMODEM_STATE_CHECK_DATA; /* 切换状态 */ + } + break; + case XMODEM_STATE_WAIT: + tickTmp = _xmodem->rspTimeoutCnt; + /* 应答超时判断 */ + if(tickTmp && (module_tick_get() - tickTmp) > _xmodem->rspTimeout) + { + _xmodem->rspTimeoutCnt = 0; + /* 若回复超时次数达到预设值 则直接中断接收回到IDLE状态 */ + if(_xmodem->rspTimeoutTimes++ >= XMODEM_RSP_TIMES) + { + xmodem_init_state(_xmodem); + ret = RET_TIMEOUT; /* 回复超时 */ + break; + } + /* 重发当前包 */ + _xmodem->dataLen = _xmodem->dataLenTmp; + _xmodem->txEnFn(1); + } + break; + case XMODEM_STATE_CHECK_HEAD: + /* 收到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]) + { + _xmodem->packetNum--; /* 包序号-1 */ + _xmodem->state = XMODEM_STATE_CHECK_DATA; /* 切换状态 */ + } /* 收到CAN则取消传输 */ + else if(XMODEM_CAN == _xmodem->dataBuf[YMODEM_START_INDEX]) + { + xmodem_init_state(_xmodem); + ret = RET_ERR; /* 传输错误 */ + break; + } /* 否则认为是无效数据 */ + else + { + _xmodem->dataLen = 0; + _xmodem->state = XMODEM_STATE_WAIT; + break; + } + case XMODEM_STATE_CHECK_DATA: + /* 用户set回调函数 */ + _xmodem->setPacketFn(_xmodem->packetNum, &_xmodem->dataBuf[YMODEM_DATA_INDEX], &_xmodem->dataLen); + /* 超过128但不超过1024的按1024byte */ + if(YMODEM_DATA_SIZE < _xmodem->dataLen && YMODEM_DATA_1K_SIZE >= _xmodem->dataLen) + { + _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 && YMODEM_DATA_SIZE >= _xmodem->dataLen) + { + _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->eotFlag = 1; + /* 回复EOT传输结束 */ + _xmodem->dataBuf[YMODEM_START_INDEX] = XMODEM_EOT; + _xmodem->dataLen = 1; + _xmodem->dataLenTmp = _xmodem->dataLen; + _xmodem->txEnFn(1); + break; + } + /* 1字节累加和校验 */ + if(1 == _xmodem->checkNum) + { + checkVal = xmodem_check_sum(&_xmodem->dataBuf[YMODEM_DATA_INDEX], _xmodem->dataLen); + _xmodem->dataBuf[_xmodem->dataLen + YMODEM_HEADER_SIZE] = checkVal; + } /* 2字节CRC16校验 */ + else if(2 == _xmodem->checkNum) + { + 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[YMODEM_NUMBER_INDEX] = _xmodem->packetNum; + _xmodem->dataBuf[YMODEM_CNUMBER_INDEX] = 0xFF - _xmodem->packetNum; + _xmodem->packetNum++; + /* 发送包内容 */ + _xmodem->dataLen = _xmodem->dataLen + YMODEM_HEADER_SIZE + _xmodem->checkNum; + _xmodem->dataLenTmp = _xmodem->dataLen; + _xmodem->txEnFn(1); + break; + default: + xmodem_init_state(_xmodem); + ret = RET_ERR; /* 传输错误 */ + break; + } + + return ret; +} + +/** + * @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, 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)); + + /* 在IDLE和WAIT状态下可以接收数据 */ + if(XMODEM_STATE_WAIT >= _xmodem->state) + { + /* 计算可写数量 */ + unusedLen = _xmodem->dataBufLen - _xmodem->dataLen; + len = (len > unusedLen) ? unusedLen : len; + + if(0 < len) + { + /* 接续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 0; +} + +/** + * @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, 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) + { + /* 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(); /*开启回复超时计数*/ + } + } + else + { + _xmodem->txEnFn(0); /* 关闭发送中断 */ + } + + return len; +} + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ diff --git a/src/bootloader/xmodem.h b/src/bootloader/xmodem.h new file mode 100644 index 0000000000000000000000000000000000000000..07575ade0f14ca104396367f9799514620f08db1 --- /dev/null +++ b/src/bootloader/xmodem.h @@ -0,0 +1,202 @@ +/** + ****************************************************************************** + * @file xmodem.h + * @author ashuai0110 + * @version V2.2 + * @date 2024-01-28 + * @brief xmodem协议 + * + ****************************************************************************** + * @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 bootloader + * @{ + */ + +/** + * @addtogroup xmodem + * @{ + */ + +/* 宏定义---------------------------------------------------------------------*/ +/** + * @defgroup xmodem_global_macros xmodem global macros + * @{ + */ + +#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 + * @{ + */ +#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_STATE_IDLE (0u) /*!< 空闲状态 */ +#define XMODEM_STATE_WAIT (1u) /*!< 等待接收状态 */ +#define XMODEM_STATE_CHECK_HEAD (2u) /*!< 校验数据头状态 */ +#define XMODEM_STATE_CHECK_DATA (3u) /*!< 校验数据状态 */ +/** + * @} + */ + +/** + * @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; /*!< 数据缓冲区大小 */ + volatile uint16_t dataLen; /*!< 存放数据数量 */ + volatile uint16_t readLen; /*!< 数据读出数量 */ + uint16_t dataLenTmp; /*!< 存放数据数量暂存 */ + + 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; /*!< 传输结束标志 */ + + xmodem_tx_en_t txEnFn; /*!< 串口发送准备函数 */ + xmodem_user_packet_cb_t getPacketFn; /*!< 获取数据包回调函数 */ + xmodem_user_packet_cb_t setPacketFn; /*!< 设置数据包回调函数 */ +} xmodem_t; + +/** + * @} + */ + +/* 全局变量-------------------------------------------------------------------*/ + +/* 函数原型-------------------------------------------------------------------*/ +/** + * @addtogroup xmodem_global_functions + * @{ + */ + +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); + +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); + +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); + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* xmodem.h */ diff --git a/src/bootloader/ymodem.c b/src/bootloader/ymodem.c new file mode 100644 index 0000000000000000000000000000000000000000..ad08fed43a49d10df4258367768b06dcb0e5e6dc --- /dev/null +++ b/src/bootloader/ymodem.c @@ -0,0 +1,711 @@ +/** + ****************************************************************************** + * @file ymodem.c + * @author ashuai0110 + * @version V2.2 + * @date 2024-01-28 + * @brief ymodem协议 + * + ****************************************************************************** + * @attention + * + * 版权声明:内容为编者(ashuai0110)原创,使用请注明出处,当然,你也可以不这样做^_^ + * 出处链接:https://gitee.com/ashuai0110/mcu_reuse_development_module.git + * + * Change Logs: + * Date Author Notes + * 2024-01-17 ashuai0110 完成基本内容 + * 2024-01-21 ashuai0110 增加收发轮询处理返回状态 + * 2024-01-22 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接收轮询处理 + * + * @param _ymodem : ymodem管理实例 + * + * @retval 接收轮询状态 + * @arg RET_OK : 传输完成 + * @arg RET_ERR : 传输错误 + * @arg RET_ING : 进行中(默认处于此状态) + * @arg RET_TIMEOUT : 回复超时 + */ +uint8_t ymodem_rx_poll(ymodem_t *_ymodem) +{ + uint8_t ret = RET_ING; + 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); + ret = RET_TIMEOUT; /* 回复超时 */ + 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); + } + /* 每次收到文件信息包后要重新回复启动内容 */ + 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]) + { + /* 官方定义结束包的数据全是0 但有些工具并不是 此处为兼容大部分只判断一部分数据 */ + 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); + ret = RET_OK; /* 传输完成 */ + 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 = 2; + _ymodem->dataBuf[YMODEM_START_INDEX] = YMODEM_ACK; /* 回复ACK */ + } /* 第一次收到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); + ret = RET_ERR; /* 传输错误 */ + 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; + default: + ymodem_init_state(_ymodem); + ret = RET_ERR; /* 传输错误 */ + break; + } + + return ret; +} + +/** + * @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 发送轮询状态 + * @arg RET_OK : 传输完成 + * @arg RET_ERR : 传输错误 + * @arg RET_ING : 进行中(默认处于此状态) + * @arg RET_TIMEOUT : 回复超时 + */ +uint8_t ymodem_tx_poll(ymodem_t *_ymodem) +{ + uint8_t ret = RET_ING; + uint16_t checkVal; + uint32_t tickTmp; + + ASSERT_PARAM(IS_VALID_POINT(_ymodem)); + + switch(_ymodem->state) + { + case YMODEM_STATE_IDLE: + /* 逐字节查询启动命令 */ + if(_ymodem->readLen < _ymodem->dataLen) + { + /* 收到NAK则使用累加和校验 */ + if(YMODEM_NAK == _ymodem->dataBuf[_ymodem->readLen]) + { + _ymodem->checkNum = 1; + } /* 收到'C'则使用CRC16校验 */ + else if(YMODEM_CRC16 == _ymodem->dataBuf[_ymodem->readLen]) + { + _ymodem->checkNum = 2; + } /* 否则认为是无效数据 */ + else + { + _ymodem->readLen++; + break; + } + /* 首次收到启动命令则回复文件信息包 */ + if(0 == _ymodem->packetNum) + { + _ymodem->fileFlag = 1; + } + _ymodem->state = YMODEM_STATE_CHECK_DATA; /* 切换状态 */ + } + 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); + ret = RET_TIMEOUT; /* 回复超时 */ + break; + } + /* 重发当前包 */ + _ymodem->dataLen = _ymodem->dataLenTmp; + _ymodem->txEnFn(1); + } + break; + case YMODEM_STATE_CHECK_HEAD: + /* 收到ACK则继续发下一包 */ + if(YMODEM_ACK == _ymodem->dataBuf[0]) + { + /* 文件标志置位表明此前发出的是文件信息包 收到ACK则返回IDLE状态 */ + if(_ymodem->fileFlag) + { + _ymodem->fileFlag = 0; + _ymodem->dataLen = 0; + _ymodem->state = YMODEM_STATE_IDLE; /* 切换状态 */ + break; + } + /* 传输结束标志置位表明此前发出的是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]) + { + _ymodem->packetNum--; /* 包序号-1 */ + _ymodem->state = YMODEM_STATE_CHECK_DATA; /* 切换状态 */ + } /* 收到CAN则取消传输 */ + else if(YMODEM_CAN == _ymodem->dataBuf[0]) + { + ymodem_init_state(_ymodem); + ret = RET_ERR; /* 传输错误 */ + break; + } /* 否则认为是无效数据 */ + else + { + _ymodem->dataLen = 0; + _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 */ + 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->eotFlag = 1; + /* 回复EOT传输结束 */ + _ymodem->dataBuf[0] = YMODEM_EOT; + _ymodem->dataLen = 1; + _ymodem->dataLenTmp = _ymodem->dataLen; + _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->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; + default: + ymodem_init_state(_ymodem); + ret = RET_ERR; /* 传输错误 */ + break; + } + + return ret; +} + +/** + * @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(); /*开启回复超时计数*/ + } + } + else + { + _ymodem->txEnFn(0); /* 关闭发送中断 */ + } + + return len; +} + +/** + * @brief 将文件信息写入包中 + * + * @param _info : 文件信息结构体 + * + * @param data : ymodem数据 + * + * @retval None + */ +void ymodem_set_file_info(ymodem_t *_ymodem, file_info_t *_info) +{ + uint8_t lenTmp; + /* 清零数据缓冲区 */ + memset((void *)_ymodem->dataBuf, 0, YMODEM_HEADER_SIZE + YMODEM_DATA_SIZE); + /* 文件大小为0则没有文件需要传输 */ + if(0 != _info->fileSize) + { + 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; + } +} + +/** + * @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/src/bootloader/ymodem.h b/src/bootloader/ymodem.h new file mode 100644 index 0000000000000000000000000000000000000000..294b71df16150162853e2528b5e8e86b244a0ba9 --- /dev/null +++ b/src/bootloader/ymodem.h @@ -0,0 +1,217 @@ +/** + ****************************************************************************** + * @file ymodem.h + * @author ashuai0110 + * @version V2.2 + * @date 2024-01-28 + * @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) /*!< 校验数据状态 */ +/** + * @} + */ + +/** + * @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; /*!< 数据缓冲区大小 */ + volatile uint16_t dataLen; /*!< 存放数据数量 */ + volatile 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 : 2; /*!< 首次EOT标志 0:首次 1:非首次 */ + + ymodem_tx_en_t txEnFn; /*!< 串口发送准备函数 */ + ymodem_user_packet_cb_t getPacketFn; /*!< 获取数据包回调函数 */ + ymodem_user_packet_cb_t setPacketFn; /*!< 设置数据包回调函数 */ +} ymodem_t; + +/** + * @brief ymodem file info structure definition + */ +typedef struct file_info { + char fileName[YMODEM_FILE_NAME_LEN + 1]; /*!< 文件名 */ + 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); + +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); + +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_set_file_info(ymodem_t *_ymodem, file_info_t *_info); +void ymodem_get_file_info(ymodem_t *_ymodem, file_info_t *_info); + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif /* ymodem.h */ diff --git a/drivers/common/all_include.h b/src/common/all_include.h similarity index 83% rename from drivers/common/all_include.h rename to src/common/all_include.h index 9cfa636a97665f4569ff0039a0abb0941089b462..595819bebe21f1d3e6d600892c998ad2333954b8 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 2023-10-21 + * @version V2.2 + * @date 2024-01-27 * @brief 所有组件头文件集合 * ****************************************************************************** @@ -24,24 +24,27 @@ 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) */ +#include "common_include.h" /*!< 公共引用文件(所有组件都需包含此文件) */ /* modules */ #include "command_line.h" /*!< 命令行交互 */ #include "data_check.h" /*!< 数据校验方法集合 */ #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" /*!< 串口管理 */ +/* 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/drivers/modules/ring_queue.h b/src/common/common_include.c similarity index 34% rename from drivers/modules/ring_queue.h rename to src/common/common_include.c index 65a24619758dc2e1c2d99956e365711a8cd4e73d..04043d67a62130d835b52c54b5a2d5842be196fa 100644 --- a/drivers/modules/ring_queue.h +++ b/src/common/common_include.c @@ -1,11 +1,10 @@ /** ****************************************************************************** - * @file ring_queue.h + * @file common_include.c * @author ashuai0110 - * @version V2.1 - * @date 2023-09-24 - * @brief 环形队列 - * (适合定长或易分离出的数据,写入后必须读出才可再写,写满后新数据无法写入) + * @version V2.2 + * @date 2024-01-28 + * @brief 公共引用文件(所有组件都需包含此文件) * ****************************************************************************** * @attention @@ -13,47 +12,39 @@ * 版权声明:内容为编者(ashuai0110)原创,使用请注明出处,当然,你也可以不这样做^_^ * 出处链接:https://gitee.com/ashuai0110/mcu_reuse_development_module.git * + * Change Logs: + * Date Author Notes + * 2023-10-17 ashuai0110 完成基本内容 + * 2023-12-28 ashuai0110 新增组件计时节拍接口 + * 2024-01-04 ashuai0110 修改组件计时节拍初值为1 + * ****************************************************************************** */ -#ifndef __RING_QUEUE_H -#define __RING_QUEUE_H - -#ifdef __cplusplus -extern "C" { -#endif - /* 包含头文件-----------------------------------------------------------------*/ #include "common_include.h" /** - * @addtogroup modules + * @addtogroup common * @{ */ /** - * @addtogroup ring_queue + * @defgroup common_include common_include * @{ */ -/* 宏定义---------------------------------------------------------------------*/ +/* 私有宏定义-----------------------------------------------------------------*/ -/* 类型定义-------------------------------------------------------------------*/ +/* 私有类型定义---------------------------------------------------------------*/ + +/* 私有变量-------------------------------------------------------------------*/ /** - * @defgroup ring_queue_global_types ring queue global types + * @defgroup common_include_local_variables common include local variables * @{ */ -/** - * @brief 环形队列 structure definition - */ -typedef struct ring_queue { - char *pHead; /*!< 环形队列头节点(开始读节点) */ - char *pTail; /*!< 环形队列尾节点(开始写节点) */ - char *pBuf; /*!< 环形队列数据缓存区 */ - uint32_t curCnt; /*!< 环形队列数据当前存储数量(byte) */ - uint32_t maxCnt; /*!< 环形队列数据最大存储数量(byte) */ -} ring_queue_t; +static volatile uint32_t moduleTick = 1; /* 组件计时节拍(计时溢出需49.7天,溢出后可能造成计时异常影响组件功能) */ /** * @} @@ -61,21 +52,40 @@ typedef struct ring_queue { /* 全局变量-------------------------------------------------------------------*/ -/* 函数原型-------------------------------------------------------------------*/ +/* 私有函数原型---------------------------------------------------------------*/ + /** - * @addtogroup ring_queue_global_functions + * @defgroup common_include_global_functions common include 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); +/** + * @brief 组件计时节拍累计 + * + * @note 此接口全组件共用需用户对接底层systick或timer等,若使用的组件无需时基则无需对接 + * + * @param ticks : 累计时间ms(如轮询周期是10ms则填10,是1ms则填1) + * + * @retval None + */ +void module_tick_inc(uint32_t ticks) +{ + moduleTick += ticks; +} -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); +/** + * @brief 获取组件计时节拍 + * + * @note 此接口一般情况仅组件内部使用 + * + * @param None + * + * @retval 返回当前节拍数ms + */ +uint32_t module_tick_get(void) +{ + return moduleTick; +} /** * @} @@ -88,9 +98,3 @@ uint8_t ring_queue_write(ring_queue_t *_rq, void *pData, uint32_t size); /** * @} */ - -#ifdef __cplusplus -} -#endif - -#endif /* ring_queue.h */ diff --git a/drivers/common/common_include.h b/src/common/common_include.h similarity index 94% rename from drivers/common/common_include.h rename to src/common/common_include.h index 7568f99565d0d8483ad05e15bda8dad356fe211b..d30d5194bd0174d77701a1bdc327e2cd20116e4e 100644 --- a/drivers/common/common_include.h +++ b/src/common/common_include.h @@ -2,9 +2,9 @@ ****************************************************************************** * @file common_include.h * @author ashuai0110 - * @version V2.1 - * @date 2023-10-17 - * @brief 通用头文件(所有组件都需包含此文件) + * @version V2.2 + * @date 2024-01-28 + * @brief 公共引用文件(所有组件都需包含此文件) * ****************************************************************************** * @attention @@ -15,8 +15,8 @@ ****************************************************************************** */ -#ifndef __MULTICOMMON_H -#define __MULTICOMMON_H +#ifndef __COMMON_INCLUDE_H +#define __COMMON_INCLUDE_H #ifdef __cplusplus extern "C" { @@ -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 @@ -314,6 +314,17 @@ extern "C" { /* 全局变量-------------------------------------------------------------------*/ /* 函数原型-------------------------------------------------------------------*/ +/** + * @addtogroup common_include_global_functions + * @{ + */ + +void module_tick_inc(uint32_t ticks); +uint32_t module_tick_get(void); + +/** + * @} + */ /** * @} diff --git a/drivers/modbus/modbus_common.c b/src/modbus/modbus_common.c similarity index 52% rename from drivers/modbus/modbus_common.c rename to src/modbus/modbus_common.c index 87718765e14ada25ccd274156864cd73f37e29da..dfbf0dad10addb5b52834adbb78ade7213691778 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 2023-10-24 + * @version V2.2 + * @date 2024-01-27 * @brief modbus通用文件 * ****************************************************************************** @@ -12,6 +12,11 @@ * 版权声明:内容为编者(ashuai0110)原创,使用请注明出处,当然,你也可以不这样做^_^ * 出处链接:https://gitee.com/ashuai0110/mcu_reuse_development_module.git * + * Change Logs: + * Date Author Notes + * 2023-10-27 ashuai0110 完成基本内容 + * 2024-01-08 ashuai0110 修改查表的crc16为计算的 + * ****************************************************************************** */ @@ -38,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}; /** @@ -107,52 +53,62 @@ static const char HEX_TO_ASCII[] = {0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38 /* 全局变量-------------------------------------------------------------------*/ /* 私有函数原型---------------------------------------------------------------*/ + /** * @defgroup modbus_common_global_functions modbus common global functions * @{ */ /** - * @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/src/modbus/modbus_common.h similarity index 91% rename from drivers/modbus/modbus_common.h rename to src/modbus/modbus_common.h index 0da400f9e762b2e126948970f381259a965a2ad3..5126ddfc234f8b7b39bca6dfb919722e6d3e292b 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 2023-10-24 + * @version V2.2 + * @date 2024-01-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 @@ -67,10 +81,10 @@ 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)) /** * @} */ @@ -133,8 +147,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/src/modbus/modbus_host.c similarity index 90% rename from drivers/modbus/modbus_host.c rename to src/modbus/modbus_host.c index 10e33af9ae76e3a206b78f8d4c18dc98ab73d695..e305f9673d9048ee56c49737bb779e659d9973cf 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 2023-10-25 + * @version V2.2 + * @date 2024-01-27 * @brief modbus主机程序(RTU ASCII) * ****************************************************************************** @@ -12,6 +12,11 @@ * 版权声明:内容为编者(ashuai0110)原创,使用请注明出处,当然,你也可以不这样做^_^ * 出处链接:https://gitee.com/ashuai0110/mcu_reuse_development_module.git * + * Change Logs: + * Date Author Notes + * 2023-10-27 ashuai0110 完成基本内容 + * 2024-01-02 ashuai0110 修改从组件计时节拍接口获取时基 + * ****************************************************************************** */ @@ -100,6 +105,8 @@ static void mb_host_rspProcess(uint8_t ch) /** * @brief 追加校验后发送 * + * @note modbus的地址和数据项采用大端序,CRC16校验采用小端序 + * * @param ch : modbus主机管理序号(即数组索引) * * @retval None @@ -117,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; @@ -125,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); @@ -160,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; @@ -189,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; @@ -218,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; @@ -251,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; @@ -289,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; @@ -336,27 +349,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; } @@ -377,6 +384,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; /* 进行中 */ @@ -387,15 +395,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 && 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 && 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; /* 切换状态 */ @@ -449,7 +459,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; @@ -475,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; @@ -522,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; } @@ -579,15 +591,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) { @@ -596,16 +608,19 @@ 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 = 1; /* 开启帧间隔超时计数 */ + mbHostArr[ch].curFrameIntv = module_tick_get(); /* 开启帧间隔超时计数 */ mbHostArr[ch].rspTimeoutCnt = 0; /* 关闭应答超时计数 */ return len; @@ -620,15 +635,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) { @@ -637,26 +652,32 @@ 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; - if(0 >= (mbHostArr[ch].dataLen - mbHostArr[ch].readLen)) + /* 数据被全部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 = 1; /* 开启应答超时计数 */ + mbHostArr[ch].rspTimeoutCnt = module_tick_get(); /* 开启应答超时计数 */ mbHostArr[ch].state = MB_RX_IDLE; /* 切换状态 */ } } @@ -717,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; @@ -752,7 +774,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)); @@ -766,7 +788,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)); @@ -897,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/src/modbus/modbus_host.h similarity index 69% rename from drivers/modbus/modbus_host.h rename to src/modbus/modbus_host.h index 87e4a3afa979d0a845d2f5e2b39ab0799fda846e..c3815be2a3eef80a400a655dd54344e0d1533949 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 2023-10-25 + * @version V2.2 + * @date 2024-01-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主机管理数量 用户按需修改 */ /** * @} @@ -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; /*!< 数据缓存区长度 */ + volatile uint16_t dataLen; /*!< 数据长度 */ + volatile 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/src/modbus/modbus_slave.c similarity index 91% rename from drivers/modbus/modbus_slave.c rename to src/modbus/modbus_slave.c index d28ced1695b7a9b414fbbef61baeea96960df19a..c10d917e35b5db0baab994dc746bb9ea7d56c818 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 2023-10-25 + * @version V2.2 + * @date 2024-01-27 * @brief modbus从机程序(RTU ASCII) * ****************************************************************************** @@ -12,6 +12,11 @@ * 版权声明:内容为编者(ashuai0110)原创,使用请注明出处,当然,你也可以不这样做^_^ * 出处链接:https://gitee.com/ashuai0110/mcu_reuse_development_module.git * + * Change Logs: + * Date Author Notes + * 2023-10-27 ashuai0110 完成基本内容 + * 2024-01-02 ashuai0110 修改从组件计时节拍接口获取时基 + * ****************************************************************************** */ @@ -41,6 +46,7 @@ /* modbus从机管理序号有效性检查 */ #define IS_VALID_MBS_CH(x) \ ( (x) < MBS_NUM) + /* modbus从机地址有效性检查 */ #define IS_VALID_MBS_ADDR(x) \ ( ((x) >= 1u) && \ @@ -78,6 +84,8 @@ static mb_slave_t mbSlaveArr[MBS_NUM]; /* modbus从机管理数组 */ /** * @brief 追加校验后发送 * + * @note modbus的地址和数据项采用大端序,CRC16校验采用小端序 + * * @param ch : modbus主机管理序号(即数组索引) * * @retval None @@ -95,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; @@ -103,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); @@ -127,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; @@ -135,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; @@ -182,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; @@ -230,18 +244,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; } @@ -261,6 +271,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; /* 进行中 */ @@ -271,8 +282,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 && 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; /* 切换状态 */ @@ -326,7 +338,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; @@ -352,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; @@ -379,15 +391,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) { @@ -396,16 +408,19 @@ 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 = 1; /* 开启帧间隔超时计数 */ + mbSlaveArr[ch].curFrameIntv = module_tick_get(); /* 开启帧间隔超时计数 */ return len; } @@ -419,15 +434,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) { @@ -436,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; - if(0 >= (mbSlaveArr[ch].dataLen - mbSlaveArr[ch].readLen)) + /* 数据被全部copy出去 */ + if(mbSlaveArr[ch].dataLen == mbSlaveArr[ch].readLen) { + /* 清零相关计数 */ mbSlaveArr[ch].dataLen = 0; mbSlaveArr[ch].readLen = 0; mbSlaveArr[ch].state = MB_RX_IDLE; /* 切换状态 */ @@ -541,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/src/modbus/modbus_slave.h similarity index 80% rename from drivers/modbus/modbus_slave.h rename to src/modbus/modbus_slave.h index 0263df2812a68e99f78deebe2119f16b88458ce3..bb32485cd3ac0b6871e7786a7d1844d27dad7366 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 2023-10-25 + * @version V2.2 + * @date 2024-01-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从机管理数量 用户按需修改 */ /** * @} @@ -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; /*!< 数据缓存区长度 */ + volatile uint16_t dataLen; /*!< 数据长度 */ + volatile 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; /** @@ -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/drivers/modules/command_line.c b/src/modules/command_line.c similarity index 78% rename from drivers/modules/command_line.c rename to src/modules/command_line.c index ab29529f9e8389413cd0c7ee851b05511c367488..16288d6cf80f3e08a8739aaebfc5062b4a76927b 100644 --- a/drivers/modules/command_line.c +++ b/src/modules/command_line.c @@ -2,11 +2,10 @@ ****************************************************************************** * @file command_line.c * @author ashuai0110 - * @version V2.1 - * @date 2023-09-24 + * @version V2.2 + * @date 2024-01-28 * @brief 命令行交互 * (类命令行,空格分割 比如:cmd arg1 arg2\r\n或AT+CMD= arg1 arg2\r\n) - * 分隔符和结束符均可修改 * ****************************************************************************** * @attention @@ -14,6 +13,11 @@ * 版权声明:内容为编者(ashuai0110)原创,使用请注明出处,当然,你也可以不这样做^_^ * 出处链接:https://gitee.com/ashuai0110/mcu_reuse_development_module.git * + * Change Logs: + * Date Author Notes + * 2023-10-27 ashuai0110 完成基本内容 + * 2024-01-01 ashuai0110 修改链表挂起逻辑 + * ****************************************************************************** */ @@ -103,14 +107,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 ; @@ -144,24 +149,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; @@ -180,11 +188,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)) @@ -276,13 +287,15 @@ 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)); + /* 初始化各参数 */ + memset(_cmd, 0, sizeof(cmd_line_t)); _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); } @@ -297,6 +310,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)); } @@ -312,15 +326,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; @@ -338,32 +355,20 @@ 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; ASSERT_PARAM(IS_VALID_POINT(_cmd)); - 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; } /** @@ -387,19 +392,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); @@ -430,7 +440,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); } @@ -449,31 +459,32 @@ 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) + /* 运行标志是开启运行的才执行 */ + 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]) { - 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; + cmd_line_handle(cmdLineTarget); /* 执行处理 */ } - else + 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; } } } @@ -517,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/src/modules/command_line.h similarity index 78% rename from drivers/modules/command_line.h rename to src/modules/command_line.h index 1c5ae3c131ef65d1d0eed64b4f66f106897c25d9..1cbca93007fb19cdc3943b8dc2eeb2913b3d65dd 100644 --- a/drivers/modules/command_line.h +++ b/src/modules/command_line.h @@ -2,11 +2,10 @@ ****************************************************************************** * @file command_line.h * @author ashuai0110 - * @version V2.1 - * @date 2023-09-24 + * @version V2.2 + * @date 2024-01-28 * @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 用户按需修改 */ /** * @} */ @@ -62,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) /*!< 开启回显 */ /** * @} */ @@ -72,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) /*!< 运行 */ /** * @} */ @@ -104,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; /*!< 数据读函数 */ @@ -126,11 +125,11 @@ 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]; /* 命令名称 */ - cmd_line_callback_fn_t cmdCallbackFn; /* 命令处理函数 */ + char cmdName[CMD_LINE_NAME_MAX + 1]; /*!< 命令名称 */ + cmd_line_callback_fn_t cmdCallbackFn; /*!< 命令处理回调函数 */ } cmd_line_item_t; /** @@ -148,18 +147,19 @@ 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); +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/src/modules/data_check.c b/src/modules/data_check.c new file mode 100644 index 0000000000000000000000000000000000000000..c3753ac5096714d9e8b7e2d19f801ccf8b310374 --- /dev/null +++ b/src/modules/data_check.c @@ -0,0 +1,851 @@ +/** + ****************************************************************************** + * @file data_check.c + * @author ashuai0110 + * @version V2.2 + * @date 2024-01-28 + * @brief 数据校验方法集合 + * + ****************************************************************************** + * @attention + * + * 版权声明:内容为编者(ashuai0110)原创,使用请注明出处,当然,你也可以不这样做^_^ + * 出处链接:https://gitee.com/ashuai0110/mcu_reuse_development_module.git + * + * Change Logs: + * Date Author Notes + * 2023-10-17 ashuai0110 完成基本内容 + * 2023-12-29 ashuai0110 新增sum,xor,crc校验 + * 2024-01-04 ashuai0110 修复crc校验中的问题 + * + ****************************************************************************** + */ + +/* 包含头文件-----------------------------------------------------------------*/ +#include "data_check.h" + +/** + * @addtogroup modules + * @{ + */ + +/** + * @defgroup data_check data_check + * @{ + */ + +/* 私有宏定义-----------------------------------------------------------------*/ + +/* 私有类型定义---------------------------------------------------------------*/ + +/* 私有变量-------------------------------------------------------------------*/ + +/* 全局变量-------------------------------------------------------------------*/ + +/* 私有函数原型---------------------------------------------------------------*/ +/** + * @defgroup data_check_global_functions data check global functions + * @{ + */ + +/** + * @brief 累加和校验 + * + * @param data : 校验数据 + * + * @param len : 校验数据长度 + * + * @retval 校验结果 + */ +uint8_t check_sum(uint8_t *data, uint16_t len) +{ + uint8_t sum = 0; + + while(len--) + { + sum += *data; + data++; + } + + 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 data : 校验数据 + * + * @param len : 校验数据长度 + * + * @retval 校验结果 + */ +uint8_t check_lrc(uint8_t *data, uint16_t len) +{ + uint8_t lrc = 0; + + while(len--) + { + 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; + uint8_t crc = 0; + + while(len--) + { + crc ^= *data; + data++; + for(cnt = 0; 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; + uint8_t crc = 0x48; + + while(len--) + { + crc ^= *data; + data++; + for(cnt = 0; 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; + uint8_t crc = 0; + + while(len--) + { + crc ^= *data; + data++; + for(cnt = 0; 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; + uint8_t crc = 0x1F; + + while(len--) + { + crc ^= *data; + data++; + for(cnt = 0; 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; + uint8_t crc = 0; + + while(len--) + { + crc ^= *data; + data++; + for(cnt = 0; 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; + uint8_t crc = 0; + + while(len--) + { + crc ^= *data; + data++; + for(cnt = 0; 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; + uint8_t crc = 0; + + while(len--) + { + crc ^= *data; + data++; + for(cnt = 0; 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; + uint8_t crc = 0; + + while(len--) + { + crc ^= *data; + data++; + for(cnt = 0; 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; + uint8_t crc = 0xFF; + + while(len--) + { + crc ^= *data; + data++; + for(cnt = 0; 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; + uint8_t crc = 0; + + while(len--) + { + crc ^= *data; + data++; + for(cnt = 0; 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; + uint16_t crc = 0; + + while(len--) + { + crc ^= *data; + data++; + for(cnt = 0; 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; + uint16_t crc = 0; + + while(len--) + { + crc ^= *data; + data++; + for(cnt = 0; 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; + uint16_t crc = 0xFFFF; + + while(len--) + { + crc ^= *data; + data++; + for(cnt = 0; 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; + uint16_t crc = 0xFFFF; + + while(len--) + { + crc ^= *data; + data++; + for(cnt = 0; 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; + uint16_t crc = 0; + + while(len--) + { + crc ^= *data; + data++; + for(cnt = 0; 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; + uint16_t crc = 0xFFFF; + + 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 CRC16-X25校验 + * + * @param data : 校验数据 + * + * @param len : 校验数据长度 + * + * @retval 校验结果 + */ +uint16_t check_crc16_x25(uint8_t *data, uint16_t len) +{ + uint8_t cnt; + uint16_t crc = 0xFFFF; + + while(len--) + { + crc ^= *data; + data++; + for(cnt = 0; 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; + 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 CRC16-DNP校验 + * + * @param data : 校验数据 + * + * @param len : 校验数据长度 + * + * @retval 校验结果 + */ +uint16_t check_crc16_dnp(uint8_t *data, uint16_t len) +{ + uint8_t cnt; + uint16_t crc = 0; + + while(len--) + { + crc ^= *data; + data++; + for(cnt = 0; 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; + uint32_t crc = 0xFFFFFFFF; + + while(len--) + { + crc ^= *data++; + data++; + for(cnt = 0; 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; + uint32_t crc = 0xFFFFFFFF; + + while(len--) + { + crc ^= (uint32_t)(*data) << 24; + data++; + for(cnt = 0; cnt < 8; ++cnt) + { + if(crc & 0x80000000) + { + crc = (crc << 1) ^ 0x04C11DB7; + } + else + { + crc <<= 1; + } + } + } + + return crc; +} + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ diff --git a/drivers/modules/data_check.h b/src/modules/data_check.h similarity index 51% rename from drivers/modules/data_check.h rename to src/modules/data_check.h index f437b82adbc8c85d1aa143004d6b381465d18b9b..879fe92fe74cfc082e30076c3c2cf317bda476b0 100644 --- a/drivers/modules/data_check.h +++ b/src/modules/data_check.h @@ -2,8 +2,8 @@ ****************************************************************************** * @file data_check.h * @author ashuai0110 - * @version V2.1 - * @date 2023-10-17 + * @version V2.2 + * @date 2024-01-28 * @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); /** * @} diff --git a/drivers/modules/data_convert.c b/src/modules/data_convert.c similarity index 64% rename from drivers/modules/data_convert.c rename to src/modules/data_convert.c index b2466ea3d2bb514d08a0864e32ff682d22e7170c..d591c031c0ce3c6c54a21d206e2c9af339cafe82 100644 --- a/drivers/modules/data_convert.c +++ b/src/modules/data_convert.c @@ -2,8 +2,8 @@ ****************************************************************************** * @file data_convert.c * @author ashuai0110 - * @version V2.1 - * @date 2023-09-19 + * @version V2.2 + * @date 2024-01-28 * @brief 数据转换方法集合 * ****************************************************************************** @@ -12,6 +12,11 @@ * 版权声明:内容为编者(ashuai0110)原创,使用请注明出处,当然,你也可以不这样做^_^ * 出处链接:https://gitee.com/ashuai0110/mcu_reuse_development_module.git * + * Change Logs: + * Date Author Notes + * 2023-09-19 ashuai0110 完成基本内容 + * 2023-12-11 ashuai0110 新增conv_complement_code_to_dec函数 + * ****************************************************************************** */ @@ -45,6 +50,10 @@ /* 十六进制字符串转十进制整数的长度有效性检查 */ #define IS_VALID_HEX_DEC_LENGTH(x) \ ( (x) <= 8) + +/* 补码转十进制整数的位数有效性检查 */ +#define IS_VALID_COMP_DEC_BIT_NUM(x) \ +( (x) <= 32) /** * @} */ @@ -75,17 +84,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 +136,27 @@ 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) { - *pSrc = '\0'; + *pSrc = '\0'; /* 当前字符改为'\0' 代表字符串到此结束 */ + /* 若分割数量达到参数num则break */ if(cnt >= num) { - return cnt; + break; } - pBuf[cnt++] = pSrc + 1; - } // 结束符'\r' '\n' '\0'可自定义修改 + pBuf[cnt++] = pSrc + 1; /* 缓存区存放下一个字符串首地址 */ + } /* 若当前字符与结束符'\r' '\n' '\0'相同则break, 结束符可自定义修改 */ else if(*pSrc == '\r' || *pSrc == '\n' || *pSrc == '\0') { *pSrc = '\0'; break; } - pSrc++; + pSrc++; /* 当前字符地址自增 */ } return cnt; @@ -166,16 +179,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 +207,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 +216,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 +224,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/src/modules/data_convert.h similarity index 93% rename from drivers/modules/data_convert.h rename to src/modules/data_convert.h index 163852e5dc062b7548b3011c34743731375260c2..4790583555e6da9d16c59ccfafffa49817952771 100644 --- a/drivers/modules/data_convert.h +++ b/src/modules/data_convert.h @@ -2,8 +2,8 @@ ****************************************************************************** * @file data_convert.h * @author ashuai0110 - * @version V2.1 - * @date 2023-09-19 + * @version V2.2 + * @date 2024-01-28 * @brief 数据转换方法集合 * ****************************************************************************** @@ -50,6 +50,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); /** * @} diff --git a/drivers/modules/delay_no_block.c b/src/modules/delay_no_block.c similarity index 67% rename from drivers/modules/delay_no_block.c rename to src/modules/delay_no_block.c index 669261c49ab37f94a225b4ee11c90295f1ed2550..04ed19b3f44de31e42236335d4f64ac96d25f1e6 100644 --- a/drivers/modules/delay_no_block.c +++ b/src/modules/delay_no_block.c @@ -2,8 +2,8 @@ ****************************************************************************** * @file delay_no_block.c * @author ashuai0110 - * @version V2.1 - * @date 2023-09-24 + * @version V2.2 + * @date 2024-01-28 * @brief 非阻塞延时 * ****************************************************************************** @@ -12,6 +12,11 @@ * 版权声明:内容为编者(ashuai0110)原创,使用请注明出处,当然,你也可以不这样做^_^ * 出处链接:https://gitee.com/ashuai0110/mcu_reuse_development_module.git * + * Change Logs: + * Date Author Notes + * 2023-10-27 ashuai0110 完成基本内容 + * 2023-12-28 ashuai0110 修改从组件计时节拍接口获取时基 + * ****************************************************************************** */ @@ -34,22 +39,17 @@ * @{ */ -#define DELAY_TICKS_MAX (0x7FFFFFFFul) /* 最大计数值(默认不改) */ - /** * @defgroup delay_no_block_check_parameters_validity delay no block check parameters validity * @{ */ /* 延时任务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) \ -( ((x) >= 1) && \ - ((x) <= DELAY_TICKS_MAX)) +( (x) != 0u) /** * @} */ @@ -66,8 +66,7 @@ * @{ */ -static delay_item_t delayTaskArr[DELAY_TASK_SIZE]; /* 延时任务工作数组 */ -volatile static uint32_t delayBaseTicks; /* 基本计数值 */ +static delay_item_t delayTaskArr[DELAY_TASK_SIZE]; /* 延时任务数组 */ /** * @} @@ -85,9 +84,11 @@ volatile static uint32_t delayBaseTicks; /* 基本计数值 */ /** * @brief 创建延时任务 * - * @param _id : 延时任务ID 首次调用为新建,之后为更新参数 + * @note 若创建的任务ID为局部变量则需要初始化值为0 * - * @param delayTicks : 延时任务计数值 例如延时500ms,轮询周期10ms,则delayTicks=500ms/10ms=50 + * @param _id : 延时任务ID + * + * @param delayTicks : 延时时间ms * * @retval uint8_t * @arg RET_OK : 创建成功 @@ -101,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; } @@ -125,7 +130,7 @@ uint8_t delay_init(delay_id_t *_id, uint32_t delayTicks) } /** - * @brief 延时任务取消初始化 + * @brief 取消延时任务 * * @param _id : 延时任务ID * @@ -136,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; } @@ -155,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; @@ -170,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/src/modules/delay_no_block.h similarity index 87% rename from drivers/modules/delay_no_block.h rename to src/modules/delay_no_block.h index 0f459d1409fd3d177aa1612e404417630f102186..05920460ed8e0e97cf048ceb1dda2d0cf9a93627 100644 --- a/drivers/modules/delay_no_block.h +++ b/src/modules/delay_no_block.h @@ -2,8 +2,8 @@ ****************************************************************************** * @file delay_no_block.h * @author ashuai0110 - * @version V2.1 - * @date 2023-09-24 + * @version V2.2 + * @date 2024-01-28 * @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) 用户按需修改 */ /** * @} */ @@ -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; /** @@ -86,14 +86,11 @@ 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); -void delay_poll(void); - -uint32_t delay_ticks(void); - /** * @} */ diff --git a/drivers/modules/input_output.c b/src/modules/input_output.c similarity index 72% rename from drivers/modules/input_output.c rename to src/modules/input_output.c index b72745c94546eda2ed2fef3eedd6cfc441197b24..6486d463a96351233bcfce4b92df3b485bd05a5d 100644 --- a/drivers/modules/input_output.c +++ b/src/modules/input_output.c @@ -2,8 +2,8 @@ ****************************************************************************** * @file input_output.c * @author ashuai0110 - * @version V2.1 - * @date 2023-09-19 + * @version V2.2 + * @date 2024-01-28 * @brief IO输入输出操作 * (输入可以设置各边沿触发时间,输出可以设置各边沿保持时间) * @@ -13,6 +13,11 @@ * 版权声明:内容为编者(ashuai0110)原创,使用请注明出处,当然,你也可以不这样做^_^ * 出处链接:https://gitee.com/ashuai0110/mcu_reuse_development_module.git * + * Change Logs: + * Date Author Notes + * 2023-09-19 ashuai0110 完成基本内容 + * 2024-01-01 ashuai0110 修改链表挂起逻辑 + * ****************************************************************************** */ @@ -93,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; } @@ -155,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; @@ -241,17 +255,15 @@ 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)); + /* 初始化各参数 */ + 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->level = (_io->dir == IO_DIR_IN) ? (_io->rwFn(0)) : 0; /* 默认电平由此时读到的电平决定 */ _io->edge = IN_EDGE_NONE; - _io->state = 0; _io->callbackFn = callbackFn; - + /* 初始化时就插入链表 */ return io_insert(_io); } @@ -266,6 +278,7 @@ void io_de_init(io_t *_io) { ASSERT_PARAM(IS_VALID_POINT(_io)); + /* 从链表取下并置零所有参数 */ io_pending(_io); memset(_io, 0, sizeof(io_t)); } @@ -281,15 +294,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; @@ -307,32 +323,20 @@ 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; ASSERT_PARAM(IS_VALID_POINT(_io)); - 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; } /** @@ -352,6 +356,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; } @@ -359,7 +364,7 @@ void io_update_ticks(io_t *_io, uint32_t risingTicks, uint32_t fallingTicks) /** * @brief IO操作轮询处理 * - * @note 此函数执行周期即是IO操作任务计数值累加周期 + * @note 此函数执行周期即是IO操作任务计数值累加周期,一般放入定时器中 * * @param None * @@ -370,13 +375,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); @@ -385,6 +394,7 @@ void io_poll(void) else { result = io_output_handle(ioTarget); + /* 返回一个周期输出完成则执行用户回调函数 */ if(OUT_CYCLE_END == result) { ioTarget->callbackFn(0xFF); @@ -459,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/src/modules/input_output.h similarity index 97% rename from drivers/modules/input_output.h rename to src/modules/input_output.h index 49aa355322842099753acf0fc760013bc6b12674..a9f6d5e2968f8bc7ea176e287f51078cab7ae3c1 100644 --- a/drivers/modules/input_output.h +++ b/src/modules/input_output.h @@ -2,8 +2,8 @@ ****************************************************************************** * @file input_output.h * @author ashuai0110 - * @version V2.1 - * @date 2023-09-19 + * @version V2.2 + * @date 2024-01-28 * @brief IO输入输出操作 * (输入可以设置各边沿触发时间,输出可以设置各边沿保持时间) * @@ -143,18 +143,20 @@ 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); 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/src/modules/memory.c similarity index 72% rename from drivers/modules/memory.c rename to src/modules/memory.c index c4d734a3919363948280b1e7e3d64efa91caaadc..6ecbe4dace194b0277239ef0ef1b55898414909e 100644 --- a/drivers/modules/memory.c +++ b/src/modules/memory.c @@ -2,10 +2,9 @@ ****************************************************************************** * @file memory.c * @author ashuai0110 - * @version V2.1 - * @date 2023-09-20 - * @brief 内存管理-小内存管理算法 - * (参考rt-thread的mem,小内存管理算法<2MB) + * @version V2.2 + * @date 2024-01-28 + * @brief 内存管理(rt-thread的mem,小内存管理算法<2MB) * ****************************************************************************** * @attention @@ -13,6 +12,10 @@ * 版权声明:内容为编者(ashuai0110)原创,使用请注明出处,当然,你也可以不这样做^_^ * 出处链接:https://gitee.com/ashuai0110/mcu_reuse_development_module.git * + * Change Logs: + * Date Author Notes + * 2023-10-27 ashuai0110 完成基本内容 + * ****************************************************************************** */ @@ -34,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 @@ -98,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 @@ -112,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 @@ -177,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; } /* 轮询查找管理者 */ @@ -184,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)); @@ -218,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)); } @@ -246,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)); @@ -314,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); } @@ -346,6 +359,7 @@ void *mem_set(void *pStr, int c, uint32_t n) { char *s = (char *)pStr; + /* 循环设置填充值 */ while(n--) { *s++ = c; } return pStr; @@ -367,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/src/modules/memory.h similarity index 73% rename from drivers/modules/memory.h rename to src/modules/memory.h index 4ffc255c90d618aff9670df9e16201193d1f8769..cf7303aa33210abc2f13a629dfabb1817830db81 100644 --- a/drivers/modules/memory.h +++ b/src/modules/memory.h @@ -2,10 +2,9 @@ ****************************************************************************** * @file memory.h * @author ashuai0110 - * @version V2.1 - * @date 2023-09-20 - * @brief 内存管理 - * (参考rt-thread的mem,小内存管理算法<2MB) + * @version V2.2 + * @date 2024-01-28 + * @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 (1) /*!< 内存用量统计 0:关闭 1:开启 */ -/** - * @} - */ +#define MEM_SIZE (1024u) /*!< 内存管理总字节数(28至2MB) 用户按需修改 */ +#define MEM_ALIGN_SIZE (4u) /*!< 最小对齐字节数(默认4字节) */ +#define MEM_CODE (0x1EA0u) /*!< 内存管理标识(默认0x1EA0) */ +#define _MEM_STATES (1u) /*!< 内存用量统计 0:关闭 1:开启 */ /** * @} @@ -74,10 +60,10 @@ extern "C" { * @brief 内存管理 structure definition */ typedef struct memory{ - uint16_t code; /*!< 内存管理标识 */ - uint16_t used; /*!< 内存使用标志 0未使用 1已使用 */ - uint32_t next; /*!< 下一个管理者的偏移(基于内存首地址) */ - uint32_t prev; /*!< 上一个管理者的偏移(基于内存首地址) */ + 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/src/modules/message_queue.c similarity index 64% rename from drivers/modules/message_queue.c rename to src/modules/message_queue.c index 3b203e83708401f04959eb8eede7195417e8ab14..69989fb681939e4fd9a5062593ccd89576899d32 100644 --- a/drivers/modules/message_queue.c +++ b/src/modules/message_queue.c @@ -2,8 +2,8 @@ ****************************************************************************** * @file message_queue.c * @author ashuai0110 - * @version V2.1 - * @date 2023-09-20 + * @version V2.2 + * @date 2024-01-28 * @brief 消息队列 * (适合不定长数据和复杂数据,写入时动态申请内存) * @@ -13,6 +13,11 @@ * 版权声明:内容为编者(ashuai0110)原创,使用请注明出处,当然,你也可以不这样做^_^ * 出处链接:https://gitee.com/ashuai0110/mcu_reuse_development_module.git * + * Change Logs: + * Date Author Notes + * 2023-10-27 ashuai0110 完成基本内容 + * 2023-12-30 ashuai0110 修改内部链表逻辑 + * ****************************************************************************** */ @@ -77,13 +82,13 @@ 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; + /* 初始化各参数 */ + memset(_mq, 0, sizeof(mes_queue_t)); _mq->maxCnt = size; - _mq->curCnt = 0; } /** - * @brief 消息队列删除 + * @brief 消息队列取消初始化(删除) * * @note 将消息队列内所有消息占用内存释放 * @@ -91,54 +96,61 @@ 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) { + 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)); } /** * @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; + *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; } @@ -158,21 +170,22 @@ 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)); ASSERT_PARAM(IS_VALID_POINT(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; + _mq->pHead = _mq->pHead->pNext; /* 头节点指向下一节点 */ + MQ_FREE(pItem); /* 释放内存 */ + _mq->curCnt = _mq->curCnt - 1; /* 消息计数-1 */ return RET_OK; } diff --git a/drivers/modules/message_queue.h b/src/modules/message_queue.h similarity index 85% rename from drivers/modules/message_queue.h rename to src/modules/message_queue.h index 71d063af7d00d047802f2ba65aac98fda1fb9eae..e83a782faa5a353ac21d1acbcccf4aae45f31b18 100644 --- a/drivers/modules/message_queue.h +++ b/src/modules/message_queue.h @@ -2,8 +2,8 @@ ****************************************************************************** * @file message_queue.h * @author ashuai0110 - * @version V2.1 - * @date 2023-09-20 + * @version V2.2 + * @date 2024-01-28 * @brief 消息队列 * (适合不定长数据和复杂数据,写入时动态申请内存) * @@ -69,10 +69,9 @@ 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_t; /** @@ -82,8 +81,13 @@ 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); +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/ring_buffer.c b/src/modules/ring_buffer.c similarity index 53% rename from drivers/modules/ring_buffer.c rename to src/modules/ring_buffer.c index ca817252d165e7550e224b48e5e9bee021fc7f70..3f45f68409d75fc0691d66101d63ef51c1671d16 100644 --- a/drivers/modules/ring_buffer.c +++ b/src/modules/ring_buffer.c @@ -2,10 +2,10 @@ ****************************************************************************** * @file ring_buffer.c * @author ashuai0110 - * @version V2.1 - * @date 2023-09-24 + * @version V2.2 + * @date 2024-01-28 * @brief 环形缓冲区 - * (适合定长或易分离出的数据,写满后再写会覆写旧数据无论其是否被读出处理过) + * (适合定长或易分离出的数据,写满后必须读出否则无法写入新数据) * ****************************************************************************** * @attention @@ -13,6 +13,11 @@ * 版权声明:内容为编者(ashuai0110)原创,使用请注明出处,当然,你也可以不这样做^_^ * 出处链接:https://gitee.com/ashuai0110/mcu_reuse_development_module.git * + * Change Logs: + * Date Author Notes + * 2023-09-24 ashuai0110 完成基本内容 + * 2023-12-26 ashuai0110 修改读写接口取有效数量读写 + * ****************************************************************************** */ @@ -66,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; } /** @@ -101,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 获取环形缓冲区的大小 + * @brief 获取环形缓冲区的可读数量 * - * @note 缓冲区大小(byte) + * @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 获取环形缓冲区的可读大小 - * - * @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/src/modules/ring_buffer.h similarity index 75% rename from drivers/modules/ring_buffer.h rename to src/modules/ring_buffer.h index b30a27a08fb2c1ccdc1ad1711640716fe6d08905..c96587a814f4b9db85f46c34c182b9ae61b222d2 100644 --- a/drivers/modules/ring_buffer.h +++ b/src/modules/ring_buffer.h @@ -2,8 +2,8 @@ ****************************************************************************** * @file ring_buffer.h * @author ashuai0110 - * @version V2.1 - * @date 2023-09-24 + * @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 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/drivers/modules/sync_method.c b/src/modules/sync_method.c similarity index 87% rename from drivers/modules/sync_method.c rename to src/modules/sync_method.c index 0521e31f988fcf75847089edceaeb219790dc87a..d2385f5bb48f8a4b7ad40956fa54e92202318eea 100644 --- a/drivers/modules/sync_method.c +++ b/src/modules/sync_method.c @@ -2,8 +2,8 @@ ****************************************************************************** * @file sync_method.c * @author ashuai0110 - * @version V2.1 - * @date 2023-09-26 + * @version V2.2 + * @date 2024-01-28 * @brief 伪线程同步方法(信号量,互斥锁,事件集) * ****************************************************************************** @@ -12,6 +12,10 @@ * 版权声明:内容为编者(ashuai0110)原创,使用请注明出处,当然,你也可以不这样做^_^ * 出处链接:https://gitee.com/ashuai0110/mcu_reuse_development_module.git * + * Change Logs: + * Date Author Notes + * 2023-09-26 ashuai0110 完成基本内容 + * ****************************************************************************** */ @@ -84,7 +88,8 @@ void sync_sem_init(sync_sem_t *_sem, uint32_t value) { ASSERT_PARAM(IS_VALID_POINT(_sem)); - + + /* 信号量实质上是整型变量 */ *_sem = value; } @@ -99,6 +104,7 @@ void sync_sem_put(sync_sem_t *_sem) { ASSERT_PARAM(IS_VALID_POINT(_sem)); + /* 释放信号量即变量自增 */ if(0xFFFFFFFFul != *_sem) { *_sem = *_sem + 1; @@ -118,11 +124,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; @@ -154,6 +161,7 @@ void sync_mutex_init(sync_mutex_t *_mutex) { ASSERT_PARAM(IS_VALID_POINT(_mutex)); + /* 信号量实质上是二值变量 */ *_mutex = MUTEX_UNLOCK; } @@ -168,6 +176,7 @@ void sync_mutex_put(sync_mutex_t *_mutex) { ASSERT_PARAM(IS_VALID_POINT(_mutex)); + /* 解锁即变量赋值为0 */ *_mutex = MUTEX_UNLOCK; } @@ -184,11 +193,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; @@ -206,6 +216,7 @@ void sync_event_init(sync_event_t *_event) { ASSERT_PARAM(IS_VALID_POINT(_event)); + /* 事件集实质上是32位无符号整型变量 */ *_event = 0; } @@ -223,6 +234,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; } @@ -254,13 +266,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) @@ -268,7 +281,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/src/modules/sync_method.h similarity index 97% rename from drivers/modules/sync_method.h rename to src/modules/sync_method.h index aee6268b98a07e455ea3bf35a84542f9d3e20dd4..9b6d872a9cd710ff7c2d91e0b4a63825d78f0496 100644 --- a/drivers/modules/sync_method.h +++ b/src/modules/sync_method.h @@ -2,8 +2,8 @@ ****************************************************************************** * @file sync_method.h * @author ashuai0110 - * @version V2.1 - * @date 2023-09-26 + * @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/src/modules/timer_software.c similarity index 76% rename from drivers/modules/timer_software.c rename to src/modules/timer_software.c index e226be1b357f6b56c16024067957e1d1bd927f1f..a9e6583af12341fb0c636722ef3b45a815395fd3 100644 --- a/drivers/modules/timer_software.c +++ b/src/modules/timer_software.c @@ -2,8 +2,8 @@ ****************************************************************************** * @file timer_software.c * @author ashuai0110 - * @version V2.1 - * @date 2023-09-26 + * @version V2.2 + * @date 2024-01-28 * @brief 软件定时器 * ****************************************************************************** @@ -12,6 +12,12 @@ * 版权声明:内容为编者(ashuai0110)原创,使用请注明出处,当然,你也可以不这样做^_^ * 出处链接:https://gitee.com/ashuai0110/mcu_reuse_development_module.git * + * Change Logs: + * Date Author Notes + * 2023-09-26 ashuai0110 完成基本内容 + * 2023-12-29 ashuai0110 修改从组件计时节拍接口获取时基 + * 2024-01-01 ashuai0110 修改链表挂起逻辑 + * ****************************************************************************** */ @@ -80,7 +86,7 @@ static timer_s_t *pTimerTaskHead = NULL; /*!< 软件定时器工作链表头节 * * @param _ts : 软件定时器任务实例 * - * @param targetTicks : 目标计数值 例如定时任务为500ms,调度器周期10ms,则targetTicks=500ms/10ms=50 + * @param targetTicks : 定时时间ms * * @param callbackFn : 回调函数 * @@ -98,11 +104,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; + /* 初始化各参数 */ + memset(_ts, 0, sizeof(timer_s_t)); _ts->targetTicks = targetTicks; _ts->callbackFn = callbackFn; _ts->runFlg = runFlg; - + /* 初始化时就插入链表 */ return timer_s_insert(_ts); } @@ -117,6 +124,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)); } @@ -132,15 +140,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)); - while(tsTarget) + tsTarget = pTimerTaskHead; /* 拿到链表头节点 */ + /* 遍历查重 重复则返回错误 */ + while(NULL != tsTarget) { if(tsTarget == _ts) { return RET_ERR; } tsTarget = tsTarget->pNext; } + /* 否则使用头插法(后来居上)将此节点插入链表 */ _ts->pNext = pTimerTaskHead; pTimerTaskHead = _ts; @@ -158,36 +169,20 @@ 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; ASSERT_PARAM(IS_VALID_POINT(_ts)); - 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; } /** @@ -203,29 +198,32 @@ 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 + if((module_tick_get() - tsTarget->curTicks) > tsTarget->targetTicks) { + /* 当前计数值达到目标计数值则执行回调函数并记录最新组件计时节拍 */ tsTarget->callbackFn(); - tsTarget->curTicks = 0; + tsTarget->curTicks = module_tick_get(); } + } /* 不开启运行则一直记录最新的组件计时节拍 */ + else + { + tsTarget->curTicks = module_tick_get(); } } } /** - * @brief 设置软件定时器任务的当前计数值 + * @brief 设置软件定时器任务的当前计数值ms * * @param _ts : 软件定时器任务实例 * - * @param curTicks : 当前计数值 + * @param curTicks : 当前计数值ms * * @retval None */ @@ -237,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) { @@ -251,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 */ @@ -267,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/src/modules/timer_software.h similarity index 90% rename from drivers/modules/timer_software.h rename to src/modules/timer_software.h index 6271d49b9f61455b87c5ad302df877dd1dee407e..be8ff9760b1614221d9a9557928708f591620aae 100644 --- a/drivers/modules/timer_software.h +++ b/src/modules/timer_software.h @@ -2,8 +2,8 @@ ****************************************************************************** * @file timer_software.h * @author ashuai0110 - * @version V2.1 - * @date 2023-09-26 + * @version V2.2 + * @date 2024-01-28 * @brief 软件定时器 * ****************************************************************************** @@ -65,9 +65,9 @@ extern "C" { * @brief 软件定时器任务 structrue definition */ typedef struct timer_s { - volatile uint32_t curTicks; /*!< 当前计数值 */ - uint32_t targetTicks; /*!< 目标计数值 */ - uint8_t runFlg; /*!< 运行标志 @ref timer_run_flg */ + 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; @@ -87,11 +87,13 @@ 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); void timer_s_set_target_ticks(timer_s_t *_ts, uint32_t targetTicks); diff --git a/drivers/modules/uart_handler.c b/src/modules/uart_handler.c similarity index 72% rename from drivers/modules/uart_handler.c rename to src/modules/uart_handler.c index 0802c5290d277933c5fbc6545affba6f4875d723..ed59e9a2848137d9d4c90f8a5f3af09f0857bd5d 100644 --- a/drivers/modules/uart_handler.c +++ b/src/modules/uart_handler.c @@ -2,10 +2,9 @@ ****************************************************************************** * @file uart_handler.c * @author woshiashuai - * @version V2.1 - * @date 2023-09-26 - * @brief 串口管理 - * (使用帧间隔分帧或现有的分帧方法) + * @version V2.2 + * @date 2024-01-28 + * @brief 串口管理(使用帧间隔分帧或现有的分帧方法) * ****************************************************************************** * @attention @@ -13,6 +12,11 @@ * 版权声明:内容为编者(ashuai0110)原创,使用请注明出处,当然,你也可以不这样做^_^ * 出处链接:https://gitee.com/woshiashuai/mcu_development_module.git * + * Change Logs: + * Date Author Notes + * 2023-10-27 ashuai0110 完成基本内容 + * 2023-12-29 ashuai0110 修改从组件计时节拍接口获取时基,修改使用ring_buffer组件 + * ****************************************************************************** */ @@ -96,22 +100,24 @@ 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; } /** - * @brief 串口管理轮询处理(1ms) + * @brief 串口管理轮询处理 * * @param ch : 串口管理序号(即数组索引) * @@ -122,20 +128,24 @@ 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 && uartHandlerArr[ch].curFrameIntv++ > uartHandlerArr[ch].targetFrameIntv) + if(tickTmp && (module_tick_get() - tickTmp) > uartHandlerArr[ch].targetFrameIntv) { + /* 置零帧间隔计数 */ uartHandlerArr[ch].curFrameIntv = 0; - uartHandlerArr[ch].recTimeoutCnt = 0; return RET_OK; } + tickTmp = uartHandlerArr[ch].recTimeoutCnt; /* 接收超时判断 */ - if(uartHandlerArr[ch].recTimeoutCnt && uartHandlerArr[ch].recTimeoutCnt++ > uartHandlerArr[ch].recTimeout) + if(tickTmp && (module_tick_get() - tickTmp) > uartHandlerArr[ch].recTimeout) { - uartHandlerArr[ch].recTimeoutCnt = 0; + uartHandlerArr[ch].recTimeoutCnt = 0; /* 置零接收超时 */ return RET_TIMEOUT; } @@ -159,11 +169,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; } @@ -186,11 +193,13 @@ 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; + /* 向环形缓冲区写入数据 */ + len = ring_buffer_write(&uartHandlerArr[ch].rxRingBuffer, pBuf, len); + /* 若实际写入长度不为0则开启帧间隔计数 */ if(0 < len) { - ring_queue_write(&uartHandlerArr[ch].rxRingQueue, pBuf, len); - uartHandlerArr[ch].curFrameIntv = 1; + uartHandlerArr[ch].curFrameIntv = module_tick_get(); /* 开启帧间隔超时计数 */ + uartHandlerArr[ch].recTimeoutCnt = 0; /* 关闭接收超时计数 */ } return len; @@ -214,15 +223,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; @@ -244,18 +251,16 @@ 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; } /** - * @brief 设置串口管理帧间隔超时时间 + * @brief 设置串口管理帧间隔超时时间ms * * @param ch : 串口管理序号(即数组索引) * @@ -265,14 +270,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; - } + } /* 波特率=0则取0ms */ else if(0 == baud) { uartHandlerArr[ch].targetFrameIntv = 0; - } + } /* 波特率<=9600则取该波特率下传输3.5个字节的时间 */ else { uartHandlerArr[ch].targetFrameIntv = 10000 / baud * 3.5; @@ -280,7 +286,7 @@ void uart_hr_set_frame_intv(uint8_t ch, uint32_t baud) } /** - * @brief 获取串口管理帧间隔超时时间 + * @brief 获取串口管理帧间隔超时时间ms * * @param ch : 串口管理序号(即数组索引) * @@ -292,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 */ @@ -306,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/src/modules/uart_handler.h similarity index 77% rename from drivers/modules/uart_handler.h rename to src/modules/uart_handler.h index 4d47b0b96deeca38d32640bb69cc535085e9602a..979b333718692ff584dd2a290854a8fc44f61200 100644 --- a/drivers/modules/uart_handler.h +++ b/src/modules/uart_handler.h @@ -2,10 +2,9 @@ ****************************************************************************** * @file uart_handler.h * @author woshiashuai - * @version V2.1 - * @date 2023-09-26 - * @brief 串口管理 - * (使用帧间隔分帧或现有的分帧方法) + * @version V2.2 + * @date 2024-01-28 + * @brief 串口管理(使用帧间隔分帧或现有的分帧方法) * ****************************************************************************** * @attention @@ -25,7 +24,7 @@ extern "C" { /* 包含头文件-----------------------------------------------------------------*/ #include "common_include.h" -#include "ring_queue.h" +#include "ring_buffer.h" /** * @addtogroup modules @@ -43,7 +42,7 @@ extern "C" { * @{ */ -#define UART_HANDLER_NUM (1u) /*!< 串口管理数量 */ +#define UART_HANDLER_NUM (3u) /*!< 串口管理数量 用户按需修改 */ /** * @} @@ -70,13 +69,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; /*!< 串口发送前准备函数 */ + 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; /** @@ -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/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/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" "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" new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391