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

网站开发技术联系方式网站设计公司排名前十

网站开发技术联系方式,网站设计公司排名前十,种子搜索引擎torrentkitty,网站建设与开发教学大纲文章目录一、单片机烧写程序的几种方法二、Bootloader如何加载启动App一、单片机烧写程序的几种方法 在线应用编程#xff0c;由开发者实现Bootloader功能#xff0c;比如ARM单片机的Code分区中的Flash本是存储用户应用程序的区间(上电从此处执行用户代码)#xff0c;开发者… 文章目录一、单片机烧写程序的几种方法二、Bootloader如何加载启动App一、单片机烧写程序的几种方法 在线应用编程由开发者实现Bootloader功能比如ARM单片机的Code分区中的Flash本是存储用户应用程序的区间(上电从此处执行用户代码)开发者可以将自己实现的Bootloader和应用程序都存放到Flash区间MCU上电启动先执行用户的Bootloader代码该代码可为用户应用程序的下载、校验、升级、启动等提供支持进而实现OTA远程升级功能。 一般用于给用户远程升级或者是烧写程序不方便的时候。 复位以后进入Bootloader程序 需要说明的是这个地方就是我们程序烧写的其实地址 这是因为我们要把前面的空间流出来给BOOT程序。 ARM单片机启动流程一(详细解析)-CSDN博客 在本人的这篇文章里面可以看到我们的Main Flash的物理其实地址就是0x08000000因此我需要把BOOT程序烧写到这里因为CPU执行程序最先 CPU都是从0地址开始访问的根据被引导到的地方有可能直接跳转到Main Flash 0x0800 0000的原始存储空间也有可能跳转到MCU厂商预置的bootloader开始于0x1FFF F000的原始存储空间。至于怎么跳转这两个以及默认是什么连接文章在这一块进行了详细分析。 一般我们默认就是下面顺序我们就是直接跳转到Main Flash 0x0800 0000的原始存储空间 CPU通过程序计数器PC获取下一条指令的地址。在无分支的情况下PC自动增加如 PC_new PC_old 指令长度实现物理地址的顺序执行 int main(void) { InitIrqAfterBoot();DrvInit();AppInit();while (1){TaskHandler();} }void InitIrqAfterBoot(void) {nvic_vector_table_set(NVIC_VECTTAB_FLASH, 0x3000);__enable_irq(); }#define NVIC_VECTTAB_FLASH ((uint32_t)0x08000000) /*! Flash base address */ 值得注意的是在APP程序里面需要配置中断向量表里面的初始地址这是因为原本我们默认的程序初始地址是0x08000000但是由于BOOT程序的作用导致我们的初始地址变成了((uint32_t)0x08000000)偏移地址0x3000中断向量表的初始位置。 如果我们常规的程序是CPU直接加载的就不需要我们初始化就是内核会默认帮我们搞好从0x08000000开始。 但是我们现在的程序是从BOOT里面启动的那就意味着我们需要自己配置一个中断向量表初始地址所以我们需要在应用程序里面做一些CPU需要做的事情并且在BOOT程序里面一样需要做一些CPU需要做的事情说白了就是手动干一些CPU的事情。 同样需要烂熟于心的还有0x3000表示12KB0x1000表示4KB也就是4096个字节(Byte)。 另外需要一点注意的 .property R | W,.address 0x0004, // 触发系统复位 01 06 00 04 00 01.minValue 0,.maxValue 1,.WriteCb ModbusResetSystem,static void ModbusResetSystem(uint16_t value) {ResetToBoot(); }void ResetToBoot(void) {__disable_irq(); //关闭所有中断NVIC_SystemReset(); //复位函数需要一些执行的时间 }在APP程序里面触发复位的时候我们一定要先关闭所有中断如果不关闭中断可能会导致我们的BOOT程序会出现错误因为BOOT里面也需要中断。 此外需要联系之前的知识在做一次对比 代码段1 __Vectors0x08000000: 20000428 (.. DCD 5368719760x08000004: 08000145 E... DCD 1342180530x08000008: 0800014d M... DCD 1342180610x0800000c: 0800014f O... DCD 1342180630x08000010: 08000151 Q... DCD 1342180650x08000014: 08000153 S... DCD 1342180670x08000018: 08000155 U... DCD 1342180690x0800001c: 00000000 .... DCD 00x08000020: 00000000 .... DCD 00x08000024: 00000000 .... DCD 00x08000028: 00000000 .... DCD 00x0800002c: 08000157 W... DCD 1342180710x08000030: 08000159 Y... DCD 1342180730x08000034: 00000000 .... DCD 00x08000038: 0800015b [... DCD 1342180750x0800003c: 0800015d ]... DCD 1342180770x08000040: 0800015f _... DCD 1342180790x08000044: 0800015f _... DCD 1342180790x08000048: 0800015f _... DCD 1342180790x0800004c: 0800015f _... DCD 1342180790x08000050: 0800015f _... DCD 1342180790x08000054: 0800015f _... DCD 1342180790x08000058: 0800015f _... DCD 134218079 代码段2 __Vectors0x08003000: 20000738 8.. DCD 5368727600x08003004: 08003145 E1.. DCD 1342303410x08003008: 08003d21 !.. DCD 1342333770x0800300c: 08003965 e9.. DCD 1342324210x08003010: 08003c69 i.. DCD 1342331930x08003014: 0800356b k5.. DCD 1342314030x08003018: 08004531 1E.. DCD 1342354410x0800301c: 00000000 .... DCD 00x08003020: 00000000 .... DCD 00x08003024: 00000000 .... DCD 00x08003028: 00000000 .... DCD 00x0800302c: 0800402d -.. DCD 1342341570x08003030: 0800365b [6.. DCD 1342316430x08003040: 0800315f _1.. DCD 1342303670x08003044: 0800315f _1.. DCD 1342303670x08003048: 0800315f _1.. DCD 1342303670x0800304c: 0800315f _1.. DCD 1342303670x08003050: 0800315f _1.. DCD 1342303670x08003054: 0800315f _1.. DCD 134230367可以明显看出初始的中断向量地址就是0x08003000:开始的跟之前的0x08000000:有明显的地址偏移量而这个地址偏移量就是我们自己设计的0x3000。 二、Bootloader如何加载启动App 首先我们看一下ROM空间的分布 相当于前面12KB划分给了BOOT后面的500KB空间给了APP。并且本例程使用的GD32这个单片机一共的FLASH空间就是512KB。 首先是读取 0x08000000:获取栈顶地址 接着是读取 0x08000004:获取复位函数的地址 然后跳转到复位函数地址 0x08000004:执行复位函数的代码指令这些是CPU自动完成的。 这里需要说明的为什么CPU需要执行复位函数 建立可预测的初始状态消除不确定性确保系统行为可预测。 CPU上电或复位时寄存器、程序计数器PC、状态标志等内部状态是随机的或残留前次运行的错误值。复位函数会强制将其清零或设为预设值如PC指向复位向量地址0xFFFF0使CPU从已知起点开始执行。 程序计数器PC清零​复位后PC指向固定的启动地址如ARM的0x00000000或x86的0xFFFF0加载第一条指令 ​寄存器初始化​通用寄存器、状态寄存器如EFLAGS恢复默认值避免残留数据干扰新程序。 此外当系统遇到致命错误时复位是恢复运行的终极手段 ​软件错误​如堆栈溢出、死循环、空指针访问等通过看门狗定时器触发复位。看门狗超时未清零则强制复位脱离卡死状态。​硬件故障​内存错误、总线冲突、电源欠压等触发复位以保护硬件。例如STM32的欠压检测VBOR会直接复位CPU。​中断与死锁​多核系统中核心间死锁可通过内核复位如ARM的VECTRESET局部恢复避免全系统重启。 那如何启动APP 我们使用BOOT启动APP的时候也是需要干这些动作只不过这些动作不是CPU帮助我们自动完成了而是需要我们自己手动完成。 代码详细解析 static void BootToApp(void) {uint32_t stackTopAddr *(volatile uint32_t*)APP_ADDR_IN_FLASH; if (stackTopAddr RAM_START_ADDRESS stackTopAddr (RAM_START_ADDRESS RAM_SIZE)) //判断栈顶地址是否在合法范围内{__disable_irq();__set_MSP(stackTopAddr);uint32_t resetHandlerAddr *(volatile uint32_t*) (APP_ADDR_IN_FLASH 4);/* Jump to user application */pFunction Jump_To_Application (pFunction) resetHandlerAddr; // int *p (int *)0x8003145/* Initialize user applications Stack Pointer */Jump_To_Application();}NVIC_SystemReset(); }文章源码获取方式 如果您对本文的源码感兴趣欢迎在评论区留下您的邮箱地址。我会在空闲时间整理相关代码并通过邮件发送给您。由于个人时间有限发送可能会有一定延迟请您耐心等待。同时建议您在评论时注明具体的需求或问题以便我更好地为您提供针对性的帮助。 【版权声明】 本文为博主原创文章遵循 CC 4.0 BY-SA 版权协议。这意味着您可以自由地共享复制、分发和改编修改、转换本文内容但必须遵守以下条件 署名您必须注明原作者即本文博主的姓名并提供指向原文的链接。 相同方式共享如果您基于本文创作了新的内容必须使用相同的 CC 4.0 BY-SA 协议进行发布。 感谢您的理解与支持如果您有任何疑问或需要进一步协助请随时在评论区留言。
http://www.zqtcl.cn/news/946893/

相关文章:

  • 临沂科技网站建设在线网页截图工具
  • 聊城网站推广软件简单网页制作训练
  • wordpress去除文章作者seo核心技术排名
  • 网站建设黄页免费观看wordpress所有文章
  • 企业整站优化沈阳建设学院
  • 网站怎么做弹框河北省建设注册中心网站首页
  • 大连哪里有手机自适应网站建设网站开发层次
  • 网站首页的浮窗怎么做美食网站程序
  • 淮北网站建设建设银行福州分行招聘网站
  • c 网站开发 pdf济南集团网站建设报价
  • 做网站找哪家公司好中国网络优化推广
  • 创建网站目录结构应遵循的方法dz旅游网站模板
  • 我看别人做系统就直接网站下载软件外贸物流流程
  • 手机微信网站南县网站定制
  • 做字幕网站重庆seo代理价格
  • 长春公司做网站找哪个公司好英文网站google推广
  • 潍坊网站建设方案推广官方网站如何建设
  • 设计网站的公司名称苏州建设人才网官网
  • 河南网站推广优化公司wordpress搭建vip下载站
  • 做网站拉客户有效吗网络宣传渠道
  • 制作深圳网站建设四川广安网站建设
  • 网站服务器服务商wordpress特效主题
  • 大型大型网站制作wordpress产品相册
  • 古董做推广哪个网站好租空间开网站
  • 巴中网站建设开发公司网站上传在空间哪里
  • 哈尔滨网站建设赚钱么宁波大型网站制作
  • 自助网站搭建群晖搭建的wordpress外网访问
  • 社区网站建设申请报告WordPress评论通知邮箱
  • 佛山网站建设技术托管建设网站容易吗
  • 网站开发的层级结构iis6.0如何做网站301