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

网站欣赏公司网站案例做本地地旅游网站

网站欣赏公司网站案例,做本地地旅游网站,永久免费linux云主机,网站工信部实名认证目录 一、概述二、自制 FLM 文件1、修改使用的芯片2、修改输出算法的名称3、其它设置4、修改配置文件 FlashDev.c5、文件 FlashPrg.c 的实现 三、验证算法 一、概述 本文将介绍如何使用 MDK 创建 STM32F407 的 SPI Flash 下载算法。 其中#xff0c;SPI Flash 芯片使用的是 W… 目录 一、概述二、自制 FLM 文件1、修改使用的芯片2、修改输出算法的名称3、其它设置4、修改配置文件 FlashDev.c5、文件 FlashPrg.c 的实现 三、验证算法 一、概述 本文将介绍如何使用 MDK 创建 STM32F407 的 SPI Flash 下载算法。 其中SPI Flash 芯片使用的是 W25Q128其相关操作源码可以参考 STM32 通过 SPI 驱动 W25Q128本文所使用的驱动 SPI Flash 的 API 和里面是一样的。 单片机的 Flash 下载算法是一个 FLM 文件FLM 通过编译链接得到其内部包含一系列对 FLASH 的操作包括初始化、擦除、写、读、校验等等操作。 想要制作下载算法先要了解下载算法的工作原理。我们下载一个程序的流程大概是这样的 下载工具比如 jlink读取 FLM 文件然后 JLINK 提取 FLM 文件的信息将其传输到单片机的内部 SRAM下载算法开始在 SRAM 中运行由于下载算法包含了一系列对 Flash 的操作那么下载工具通过下发初始化、擦除、写入、校验等指令给单片机单片机去执行这些指令操作实现对单片机 Flash 的下载。 二、自制 FLM 文件 我参照的是 MDK 给的程序模板来完成 Flash 下载程序然后在模板的基础上加上自己的代码。 模板路径如下D:\Keil_v5\ARM\Packs\ARM\CMSIS\5.8.0\Device\_Template_Flash不同的 MDK 版本可能路径不一样。 然后将项目拷贝到你的工作目录下并取消该工程项目的只读属性。 打开项目如下 然后开始我们的工作。 1、修改使用的芯片 首先选择你的芯片类型和型号。 2、修改输出算法的名称 这一步不是必须的改个名称方便自己查看。 注意这个名称只是项目最终生成输出的 FLM 文件的名称和下面位置识别出的算法名后面会介绍这个名称如何修改无关。 3、其它设置 注意 这里的设置在模板文件中已经设置好了这里主要是介绍一些可以跳过 这两个设置是为了保证生成的算法文件中 RO 和 RW 段的独立性即与地址无关。 如果程序的所有只读段都与位置无关则该程序为只读位置无关ROPIRead-only position independence。ROPI 段通常是位置无关代码PICposition-independent code但可以是只读数据也可以是 PIC 和只读数据的组合。选择“ ROPI”选项可以避免用户不得不将代码加载到内存中的特定位置。这对于以下例程特别有用 加载以响应运行事件。在不同情况下使用其他例程的不同组合加载到内存中。在执行期间映射到不同的地址。 使用 Read-Write position independence 同理表示的可读可写数据段。 通过下面的命令就可以将生成的 axf 可执行文件修改为 FLM。 我们这里的分散加载文件直接使用 MDK 模板工程里提供好的即可无需任何修改。 4、修改配置文件 FlashDev.c 模板工程里面提供简单的配置说明 struct FlashDevice const FlashDevice {FLASH_DRV_VERS, // Driver Version, do not modify!New Device 256kB Flash, // Device Name ONCHIP, // Device Type0x00000000, // Device Start Address0x00040000, // Device Size in Bytes (256kB)1024, // Programming Page Size0, // Reserved, must be 00xFF, // Initial Content of Erased Memory100, // Program Page Timeout 100 mSec3000, // Erase Sector Timeout 3000 mSec// Specify Size and Address of Sectors0x002000, 0x000000, // Sector Size 8kB (8 Sectors)0x010000, 0x010000, // Sector Size 64kB (2 Sectors) 0x002000, 0x030000, // Sector Size 8kB (8 Sectors)SECTOR_END };这里的注释已经说得很明白了大家根据自己的芯片来进行修改即可我使用的是 W25Q128其存储大小为 16MB一个扇区 4KB所以修改如下 W25Q128 一页是 256KB但这里写的 4096 是为了提高下载速率和擦除速率如果你把 4096 改为 8可以很明显得感受到下载速度变慢了 struct FlashDevice const FlashDevice {FLASH_DRV_VERS, /* 驱动算法由 MDK 制定勿动 */Yux_STM32F407VE_SPI_W25Q128, /* 算法名称 */ EXTSPI, /* 设备类型外扩展 SPI-Flash */SPI_FLASH_MEM_ADDR, /* Flash 起始地址 */0x01000000, /* Flash 大小16MB */4096, /* 编程页大小 */0, /* 保留必须为 0 */0xFF, /* 擦除后的数值 */3000, /* 页编程等待时间 */3000, /* 扇区擦除等待时间 */0x001000, 0x000000, /* 扇区大小扇区地址 */SECTOR_END };其中SPI_FLASH_MEM_ADDR 是我在 FlashOS.h 文件中定义的一个宏表示 Flash 的起始地址 #define SPI_FLASH_MEM_ADDR 0x00000000这里的算法名称就体现在这里 5、文件 FlashPrg.c 的实现 模板文件中提供了这几个函数也是我们完成 Flash 下载算法最关键的地方 // Flash 初始化 int Init (unsigned long adr, unsigned long clk, unsigned long fnc) {/* Add your Code */return (0); // Finished without Errors }// Flash 复位 int UnInit (unsigned long fnc) {/* Add your Code */return (0); // Finished without Errors }// 擦除整个 Flah 芯片 int EraseChip (void) {/* Add your Code */return (0); // Finished without Errors }// 擦除指定扇区 int EraseSector (unsigned long adr) {/* Add your Code */return (0); // Finished without Errors }// 页编程 int ProgramPage (unsigned long adr, unsigned long sz, unsigned char *buf) {/* Add your Code */return (0); // Finished without Errors }// 校验 unsigned long Verify (unsigned long adr, unsigned long sz, unsigned char *buf) {/* Add your Code */return (0); // Finished without Errors }这里涉及到了对 W25Q128 的相关操作详细内容参照 STM32 通过 SPI 驱动 W25Q128这里主要是调用之前实现的函数。 我使用的是标准库所以还要添加一些相关的文件进来 实现如下 初始化函数 int Init (unsigned long adr, unsigned long clk, unsigned long fnc) {SystemInit(); // 初始化系统和时钟w25qxx_init(); // 初始化 w25q128 /* Add your Code */return (0); // Finished without Errors }这里的 SystemInit 是 system_stm32f4xx.c 中的函数在 STM32 时钟树基于 STM32F407 一文中讨论过。 复位函数 Uninit 没有用到所以不用改。 擦除整个芯片 int EraseChip (void) {w25qxx_erase_chip();/* Add your Code */return (0); // Finished without Errors }擦除指定扇区 int EraseSector (unsigned long adr) {uint32_t sector 0;adr - SPI_FLASH_MEM_ADDR;sector adr / 4096;w25qxx_erase_sector(sector);/* Add your Code */return (0); // Finished without Errors }页编程 int ProgramPage (unsigned long adr, unsigned long sz, unsigned char *buf) {adr - SPI_FLASH_MEM_ADDR;w25qxx_write(buf, adr, sz);/* Add your Code */return (0); // Finished without Errors }校验 unsigned char aux_buf[4096]; unsigned long Verify (unsigned long adr, unsigned long sz, unsigned char *buf) {unsigned long remain sz; //剩余的字节数unsigned long current_add 0;//当前的地址unsigned int index 0;//用于buf的索引current_add adr - 0xC0000000;while(remain 4096){w25qxx_read(aux_buf, current_add, 4096);for(int i 0; i 4096; i){if(aux_buf[i] ! buf[indexi])return adrindexi;}current_add 4096;remain - 4096;index 4096;}w25qxx_read(aux_buf, current_add, remain);for(int i 0; i remain; i){if(aux_buf[i] ! buf[indexi])return adr index i;}return (adr sz); // 校验成功 }为什么要 adr - SPI_FLASH_MEM_ADDR; 因为实际传递进来的地址是带了首地址的即 0x00000000如果你定义的是其它地址而不执行 adr - SPI_FLASH_MEM_ADDR; 就会出错。特别注意我们这里的 0xC0000000 是随意设置的因为 STM32F4 的标准 SPI 外设并不支持内存映射。 这里执行的擦除大小要前面 FlashDev.c 文件中配置的扇区大小一致这里是执行的 4KB 为扇区进行擦除。 现在编译之后就可以在项目目录下看见一个 FLM 文件。下面就来验证一下我们的下载算法是否正确。 三、验证算法 首先把我们的 FLM 文件放到如下目录中D:\Keil_v5\ARM\Flash可以看到这里有很多 FLM 和 FLX 文件。 这里我随便找了一个项目按如下方式添加自己的 Flash 下载算法 然后编译下载然后我报了如下的错误 报错原因是下载算法没有找到 08000000H 这个地址我这里使用的是默认的链接脚本 LR_IROM1 0x08000000 0x00100000 { ; load region size_regionER_IROM1 0x08000000 0x00100000 { ; load address execution address*.o (RESET, First)*(InRoot$$Sections).ANY (RO).ANY (XO)}RW_IRAM1 0x20000000 0x00020000 { ; RW data.ANY (RW ZI)} }有关链接脚本的部分可以参考 浅析 Keil 中的 sct 文件 分散加载文件 scatter files。 这部分的内容比较复杂我就直接给出解决方案了 LR_IROM1 0x00000000 0x00100000 { ; load region size_regionER_IROM1 0x0000000 0x00100000 { ; load address execution address*.o (RESET, First)*(InRoot$$Sections).ANY (RO).ANY (XO)}RW_IRAM1 0x20000000 0x00020000 { ; RW data.ANY (RW ZI)} }这下编译成功了。但至于写没写入并不清楚写没写对也不知道。所以我又写了个 W25Q128 的读取程序 w25q32_dev.rd(data, 0x00000000, sizeof(data));for (int i 0; i sizeof(data); i){printf(%2x , data[i]);if ( (i 1) % 16 0 )printf(\r\n);}话不多说看结果比较的是 bin 文件 说明算法编写成功 (^人^)。
http://www.hkea.cn/news/14261704/

相关文章:

  • 网站是先制作后上线么论坛平台主要产品
  • 河北建设厅官方网站报名考试网html笔记完整版
  • 石家庄seo网站优化报价wordpress access denied.
  • wordpress搭建个人博客厦门市做网站优化
  • 苏州新区网站制作公司怎么增加网站的收录量
  • 苏通建设集团有限公司网站.wordpress淘宝客模版
  • 层次结构分明的网站配色方案网站关键词在哪里设置
  • 网站域名登wordpress头部导航栏代码
  • 珠海房地产网站建设北京网站开发制作公司
  • 怎么做视频网站的seo网站建设工作情况
  • 网站服务器指的是什么公司网站建设代码都写完了
  • 网站建设改版攻略网站怎么做营销策划
  • 上海网站哪家好翰诺网站建设
  • 网站托管..wordpress 工具插件下载
  • 网站开发 网页制作积分支付 WordPress
  • 网站流量报表制作京东网站建设
  • 网站建设业务培训平面设计培训班大概多少钱
  • 网站seo快速排名做PPT的网站canva
  • 网站建设代码好难啊网站建设及优化 赣icp
  • 东莞英文网站制作海外建站服务平台
  • 那个网站做毕业设计wordpress的伪静态
  • 河北爱站网络科技有限公司建设局网站查询个人信息
  • 个人网站制作流程图片企业网站优化服务主要围绕什么
  • 质量基础设施一站式服务工作站seo搜索引擎优化就业前景
  • 陕西 网站备案产品设计方案3000字
  • ps图做ppt模板下载网站有哪些内容成都管控最新通告
  • 怎么设立网站赚广告费自定义标签wordpress
  • 网站挣钱方式电子商务网站开发实训总结报告
  • SEO案例网站建设价格火龙果写作网站
  • 手机营销型网站建设莱芜网上服务