当前位置: 首页 > news >正文

做一个租房卖房的网站怎么做现在怎么建设一个网站

做一个租房卖房的网站怎么做,现在怎么建设一个网站,煤炭网站建设企业,外贸网站建设熊掌号开发环境 windowssimplicity studio 5geck sdk 4.1 一 bootloader 新建BGAPI UART DFU工程 工程新建完成以后看一下linkerfile.ld文件的flash和ram的配置跟自己的application工程是否对应得上 配置串口波特率和引脚 默认使用PB0进入bootloader模式,这里改成Non…

开发环境

  • windows
  • simplicity studio 5
  • geck sdk 4.1

一 bootloader

新建BGAPI UART DFU工程
在这里插入图片描述

  1. 工程新建完成以后看一下linkerfile.ld文件的flash和ram的配置跟自己的application工程是否对应得上
    在这里插入图片描述
  2. 配置串口波特率和引脚
    在这里插入图片描述
  3. 默认使用PB0进入bootloader模式,这里改成None
    在这里插入图片描述

二 准备bt_host_uart_dfu.exe

geck sdk里面提供了bt_host_uart_dfu.exe的源码,但是需要自己编译。windows环境需要使用MinGW工具,linux使用make指令直接就可以编译出可执行文件。

2.1 安装MinGW

下载地址: https://sourceforge.net/projects/mingw-w64/files/

在这里插入图片描述
MinGW-W64-install.exe是在线安装,经常会提示错误,在这里建议直接下载x86_64-win32-seh。
下载完之后直接解压出来即可。
在这里插入图片描述

将bin的路径设置到环境变量Path中
在这里插入图片描述
在cmd界面中执行gcc -v,显示版本号说明安装成功。
在这里插入图片描述

2.2 编译

bt_host_uart_dfu的源码在gecko_sdk\app\bluetooth\example_host\bt_host_uart_dfu目录下
在该目录下使用shell power执行命令 mingw32-make 生成exe
在这里插入图片描述
不出意外在exe目录下生成了一个bt_host_uart_dfu.exe

三 升级

首先,当前固件需要能够接收串口发送过来的数据。

将bt_host_uart_dfu.exe 和 application.gbl放在同一个文件夹里面,在该文件夹下打开power shell执行如下指令

 .\bt_host_uart_dfu.exe -u COM14 -f -l 4 -b 115200 .\application.gbl
  • -u指定串口号
  • -f 表示禁止使用流控
  • -l 4 指定log日志级别
  • -b 指定波特率

特别注意:bt_host_uart_dfu.exe默认是开启流控的,如果你的bootloader没有开启流控,一定要加上-f参数,否者你会看到数据发出来了但是对方却怎么也收不到

bt_host_uart_dfu.exe 执行的最初会发送指令20 00 FF 02,固件收到这个数据之后就进入bootloader模式。


#define BOOTLOADER_RESET_REASON_BOOTLOAD      0x0202u
#define BOOTLOADER_RESET_SIGNATURE_VALID      0xF00Fu
#define SRAM_BASE                            (0x20000000UL) 
void bootloader_mode(void)
{BootloaderResetCause_t *cause = (BootloaderResetCause_t *) (SRAM_BASE);cause->reason = BOOTLOADER_RESET_REASON_BOOTLOAD;cause->signature = BOOTLOADER_RESET_SIGNATURE_VALID;CHIP_Reset();
}

之后不出意外就可以升级成功了。

四 改进bootloader

BGAPI默认是单区更新的,也就是bootloader会把收到的新固件直接覆盖掉原来的固件。如果在升级的过程中被中断了,那么设备将一直处于bootloader模式。

通过下面几步操作可以实现双区更新,并且升级过程被中断还可以启动老的固件。

在这里插入图片描述

  1. 修改btl_bootloader.c的flashData函数
static void flashData(uint32_t address,uint8_t  data[],size_t   length)
{const uint32_t pageSize = (uint32_t)FLASH_PAGE_SIZE;//ching: 默认是写到了0x4000地址,这里改成0x5C000地址处,address传过来的地址默认以0x4000为基地址address += 360448;//0x5C000 - 0x4000 = 360448, 加360448偏移到0x5C000地址处// Erase the page if write starts at a page boundaryif (address % pageSize == 0UL) {flash_erasePage(address);}// Erase all pages that start inside the write rangefor (uint32_t pageAddress = (address + pageSize) & ~(pageSize - 1UL);pageAddress < (address + length);pageAddress += pageSize) {flash_erasePage(pageAddress);}flash_writeBuffer_dma(address, data, length, SL_GBL_MSC_LDMA_CHANNEL);
}
  1. 修改btl_bootloader.c的bootload_applicationCallback函数
#define PACK_LEN  1024
/*** @ching:* @brief 将0x5C000地址处的固件全部搬运到0x4000地址处* @param length 已经接收到的新固件长度*/
static void install_application(uint32_t length)
{const uint32_t pageSize = (uint32_t)FLASH_PAGE_SIZE;uint32_t bak_address = 0x5C000;uint32_t write_address = 0x4000;uint8_t buffer[PACK_LEN];uint16_t seg = length / PACK_LEN;if(length % PACK_LEN){seg += 1;}LOGD("seg: %d\n", seg);for(int i = 0; i < seg; i++){LOGD("write_address: %08x\n", write_address);if(write_address % pageSize == 0){flash_erasePage(write_address);}memset(buffer, 0, PACK_LEN);memcpy(buffer, (uint32_t *)(bak_address + i * PACK_LEN), PACK_LEN);flash_writeBuffer(write_address, buffer, PACK_LEN);write_address += PACK_LEN;}
}
void bootload_applicationCallback(uint32_t address,uint8_t  data[],size_t   length,void     *context)
{static uint32_t app_length = 0;(void)context;//ching: 使用一个特殊的长度值来判断是否进行搬运工作if(length == 0xA5A5A5A5){//copy 0x5C000内容到0x4000 长度 app_lengthLOGD("all length: %d\n", app_length);install_application(app_length);app_length = 0;return;}// Check if addresses to write to are within writeable spaceif ((address < (uint32_t)(mainBootloaderTable->startOfAppSpace))|| ((address + length)> (uint32_t)(mainBootloaderTable->endOfAppSpace))) {BTL_DEBUG_PRINT("OOB 0x");BTL_DEBUG_PRINT_WORD_HEX(address);BTL_DEBUG_PRINT_LF();return;}//ching: 记录新固件的长度app_length += length;flashData(address, data, length);
}
  1. 修改btl_comm_bgapi_common.c的bootloader_bgapi_communication_main函数
    当收到更新完成指令后调用applicationCallback回调并传入len = 0xA5A5A5A5
else if (command.header.class == BGAPI_PACKET_CLASS_SYSTEM) {// BGAPI System commandswitch (command.header.command) {case SYSTEM_RESET:LOGD("Reset request\n");//ching: 长度传0xA5A5A5A5,新固件已经接收完成,开始搬运工作parseCb->applicationCallback(0, NULL, 0xA5A5A5A5, NULL);break;

完成以上步骤之后,bootloader就实现了双区更新的功能。

http://www.yayakq.cn/news/989189/

相关文章:

  • 个人网站建设基础与实例龙港网站建设
  • 自己做网站去哪买服务器庆阳网站设计 贝壳下拉
  • 蚌埠网站建设融资平台公司定义
  • 网站开发的好处网络推广方案怎么写
  • 网站建设宀金手指花总十五网站规划与栏目结构诊断
  • 商城网站开发定制网络营销的特点和优势
  • 湖州做网站公司怎么自己开个免费网站
  • 中国室内设计网站深圳 网页制作
  • 住房和城乡建设部课题网站wordpress4.9.7
  • 个人网站备案名字大全wordpress 忘记管理员密码
  • 建设外贸网站价格电脑托管
  • 巢湖有没有专门做网站的公司网络建站培训
  • 网站基础设施建设wordpress修改页面标题显示
  • 沈阳定制网站方案网络运维工作内容及过程
  • 南头专业企业网站建设公司网网站建设设计
  • 新浪sae可以做网站么百度相册登录入口
  • 做网站 做应用网页设计师培训需要多少钱
  • 获取网站缩略图南宁南宁做网站
  • 如何制作大气网站wordpress登陆页文件夹
  • 包头哪有做网站的培训计划模板
  • 新余建设银行招聘网站济南简单网站制作排名公司
  • 长沙专业网站优化定制网店分销系统
  • 做301网站打不开广州网络营销网站建设
  • 手机p2p网站开发哪些人不适合学计算机
  • 公司做的网站过期了wordpress汉化主题收费
  • 做ppt兼职网站有哪些龙岗做网站的
  • 网站建设公司利润怎么样泉州手机网站建设价格
  • 网站开发工资济南开发一个app的注意事项
  • 安全的网站建设服务网络营销推广公司哪家好
  • 广州网站建设网站制作网站建设中搭建页面结构