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

web网站开发毕设优化大师怎么样

web网站开发毕设,优化大师怎么样,苹果手机街景地图,网站建设首选 云端高科这个玩意吧,说起来很简单,就是几行代码的事,但楞是折腾了我大半天时间才搞定。原因后面说,先看代码吧: 读操作 读操作很简单,以32位方式读取的时候是这样的: data *(__IO uint32_t *)(0x080…

这个玩意吧,说起来很简单,就是几行代码的事,但楞是折腾了我大半天时间才搞定。原因后面说,先看代码吧:

读操作

读操作很简单,以32位方式读取的时候是这样的:

data = *(__IO uint32_t *)(0x0800F000);

需要注意的是,当以32位方式读取时,地址需要是4的整数倍,即32位。
8位或16位方式类似操作即可
在这里插入图片描述

写操作

需要注意的是,写操作时,是以64位方式写入数据,即以双字的方式写入,以下代码是将一个u64的值0x12345678aabbccdd,写入0x0800F000这个地址

HAL_FLASH_Unlock();
__HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_OPTVERR);
HAL_FLASH_Program(0, 0x0800F000, 0x12345678aabbccdd);
HAL_FLASH_Lock();

扇区擦除

  EraseInitStruct.TypeErase   = FLASH_TYPEERASE_PAGES;    //删除方式EraseInitStruct.Page        = start;                    //超始页号EraseInitStruct.NbPages     = len;                      //页的数量EraseInitStruct.Banks       = bank;                     //bank号HAL_FLASH_Unlock();         //解锁,以准备进行FLASH操作HAL_FLASHEx_Erase(&EraseInitStruct, &err);      //擦除HAL_FLASH_Lock();           //上锁,以结束FLASH操作

调试

写完烧录开始调试,发现问题了,有时能写入,有时不能写入。

先找了正点原子的例程来做参考,他的可以写入,但似乎也是有问题,没有仔细研究。而且原子的例程是操作寄存器进行读写的,不直观,移植性也不好,个人还是喜欢用HAL库的方式来做东西。

然后又找了ST的例程来看,刚好手上有一块G4的开发板,于是编译,报错,可能是我的开发环境比较新,与ST官方的编译环境不同,又是一通折腾,编译通过,但一加载调试,就卡死不动。

于是新建工程,再把ST的例程移植到我的工程中,编译通过,可以调试,还是有时能写有时不能写。又回到了起点。

不过在前面的折腾中总结了一个规律,第1次写入几乎都会失败,第2次有一半的机率成功,但后续成功率很高,几乎不会写入失败。于是改进一下,增加对写入的判断,如果发生错误,会重复写入不超过10次,如果超过10次仍然错误,则写入失败。这样就可以保证写入成功了。

测试代码如下

未包含写入失败的相关代码,需要的自行添加。

if(GET_KEY() == 0)
{data32[0] = *(__IO uint32_t *)(0x08010000+i*8);		//FLASH读数据,以字的方式读取data32[1] = *(__IO uint32_t *)(0x08010000+i*8+4);if((data32[0] == 0xffffffff) && (data32[1] == 0xffffffff))	//FLASH内容为空{LED1(1);HAL_FLASH_Unlock();__HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_OPTVERR);flash_count=0;while(flash_count < 10){if(HAL_FLASH_Program(0, 0x08010000+i*8, 0xaabbccdd12340000+i) == HAL_OK)break;elseflash_count++;}HAL_FLASH_Lock();}data32[0] = *(__IO uint32_t *)(0x08010000+i*8);data32[1] = *(__IO uint32_t *)(0x08010000+i*8+4);while(GET_KEY() == 0);LED1(0);i++;
}

在这里插入图片描述

本段代码能正确运行的前提,是待写入区域是空的,即全都是0xFF才行。

封装为函数

将代码封装一下,以便后续调用,并增加了一些条件判断

头文件如下:

//********************************************************************************************************
//*                                                                                   
//*  文件名:LL_flash.h                                                               
//*  文件说明:STM32G系列片上FLASH的相关操作                                                     
//*  作者:李佳                                                                       
//*  微信:LAOLIDESENLIN                                                              
//*  说明:本文档遵循GNU3.0开源许可证规范,即代码可开源并免费使用,引用、修改、衍生代码也需要开源、免费使用,
//*        但不允许修改后和衍生的代码做为闭源的商业软件发布和销售
//*
//********************************************************************************************************#ifndef __LL_FLASH_H__
#define __LL_FLASH_H__#include "LL_define.h"/**************************************************************************************/
/* G431芯片的128KFLASH容量的页地址分布如下,共有1个BANK,64页,每一页2kb大小 */
#define STM32_FLASH_BASE        0x08000000      /* STM32 FLASH 起始地址 */
#define STM32_FLASH_SIZE        0x20000         /* STM32 FLASH 总大小*/
#define STM32_FLASH_PAGE_SIZE   0x800           /* STM32 FLASH 页大小*/u8 LL_flash_erase_page(u16 start, u8 len, u8 bank);     //删除FLASH扇区
u8 LL_flash_read(u32 addr, u64* pdata64, u32 len_64);   //读片上FLASH
u8 LL_flash_write(u32 addr, u64* pdata64, u32 len_64);  //向片上FLASH写入数据#endif

C文件如下

//********************************************************************************************************
//*                                                                                   
//*  文件名:LL_flash.c                                                               
//*  文件说明:STM32G系列片上FLASH的相关操作                                                     
//*  作者:李佳                                                                       
//*  微信:LAOLIDESENLIN                                                              
//*  说明:本文档遵循GNU3.0开源许可证规范,即代码可开源并免费使用,引用、修改、衍生代码也需要开源、免费使用,
//*        但不允许修改后和衍生的代码做为闭源的商业软件发布和销售
//*
//*
//*
//********************************************************************************************************#include "LL_flash.h"
#include "LL_IO.h"//按页删除片上FLASH数据
//start: 起始页号
//len:  待删除的页的数量
//bank: bank编号
//返回值:错误类型,0表示无错误
u8 LL_flash_erase_page(u16 start, u8 len, u8 bank)
{u32 err;u8 ret;FLASH_EraseInitTypeDef EraseInitStruct;u8 flash_count=0;EraseInitStruct.TypeErase   = FLASH_TYPEERASE_PAGES;    //删除方式EraseInitStruct.Page        = start;                    //超始页号EraseInitStruct.NbPages     = len;                      //页的数量EraseInitStruct.Banks       = bank;                     //bank号HAL_FLASH_Unlock();         //解锁,以准备进行FLASH操作__HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_OPTVERR);for(u8 i=0; i<10; i++)      //最多重复10次,如果仍然失败,则返回{ret = HAL_FLASHEx_Erase(&EraseInitStruct, &err);      //擦除if (ret == HAL_OK)break;}if(ret != 0)led_err_flash(10, 100);   //擦除失败后闪灯提示, 供调试阶段使用, 正式使用时可删除HAL_FLASH_Lock();           //上锁,以结束FLASH操作return ret;
}//读片上FLASH
//addr: 32位的地址值,该值应当是8的整数倍,因为是按照64位的方式读取数据的
//pdata: 返回的数据首地址
//len: 待读取数据的长度, 长度是按u64的数量
//返回值: 错误类型,0表示无错误
u8 LL_flash_read(u32 addr, u64* pdata64, u32 len_64)
{u64 data;for(u32 i=0; i<len_64; i++){data = *(__IO uint64_t *)(addr+i*8);pdata64[i] = data;}return 0;
}//向片上FLASH写入数据,每次写入8字节,不够8字节的,以0xFF补足
//addr: 32位的地址值,该值应当是8的整数倍,因为是按照64位的方式读取数据的
//pdata: 待写入的数据首地址
//len: 待写入数据的长度,长度是按u64的数量
//返回值: 错误类型,0表示无错误
u8 LL_flash_write(u32 addr, u64* pdata64, u32 len_64)
{u8 ret;u64 read;HAL_FLASH_Unlock();           //上锁,以结束FLASH操作__HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_OPTVERR);for(u16 j=0; j<len_64; j++) //按u64计算的{for(u8 i=0; i<10; i++)    //不超过10次的重复操作,以保证写入成功{ret = HAL_FLASH_Program(0, addr+j*8, *(pdata64+j));if(ret == HAL_OK){read = *(__IO uint64_t *)(addr+j*8);  //在MCU认为写入正确以后,再次读取一下数据,并进行比对,如果比对不成功,也说明写入出错if(read != *(pdata64+j))ret = 255;return ret;}}}if(ret != 0)led_err_flash(10, 100);   //擦除失败后闪灯提示, 供调试阶段使用, 正式使用时可删除HAL_FLASH_Lock();           //上锁,以结束FLASH操作return ret;
}

封装后的测试函数

u64 data64[32]={0};
u8 g_text_buf[64] = {"LIJIA000LIJIA001LIJIA002LIJIA003LIJIA004LIJIA005LIJIA006LIJIA007"};if(GET_KEY() == 0){HAL_Delay(200);LL_flash_read(0x08010000, data64, 4);if(data64[0] == 0xffffffffffffffff)       //如果是空的,则写入{LED1(1);LED2(1);if(LL_flash_write(0x08010000, (u64*)g_text_buf, 4) != 0)continue;}else                                      //如果为非空,则擦除{LL_flash_erase_page(32, 1, 0);    //第32页,长度1页,BANK 0}LL_flash_read(0x08010000, data64, 4);while(GET_KEY() == 0);LED1(0);LED2(0);i++;}

测试结果如下图,如果写入成功,LED灯会在操作之后灭掉,如果写入失败,则LED灯会保持点亮状态,
在这里插入图片描述

总结

绝对不能只写入一次,就认为写入正确,恰恰相反,最开始的2次写入,极有可能写入失败。
所以必须重复写入几次,并且增加校验,即写入完成后,再读取数据,并进行比较,以确保正确。


文章转载自:
http://resign.qpqb.cn
http://schizomycosis.qpqb.cn
http://pelias.qpqb.cn
http://pindar.qpqb.cn
http://boeotian.qpqb.cn
http://ewer.qpqb.cn
http://afeared.qpqb.cn
http://gesticulate.qpqb.cn
http://frump.qpqb.cn
http://underbidder.qpqb.cn
http://incurably.qpqb.cn
http://divorcement.qpqb.cn
http://adiaphorist.qpqb.cn
http://doccia.qpqb.cn
http://trashsport.qpqb.cn
http://billbug.qpqb.cn
http://lumpily.qpqb.cn
http://pearlite.qpqb.cn
http://bbe.qpqb.cn
http://forethoughtful.qpqb.cn
http://autotext.qpqb.cn
http://qanon.qpqb.cn
http://steelyard.qpqb.cn
http://adventurer.qpqb.cn
http://yttrialite.qpqb.cn
http://jutland.qpqb.cn
http://seedeater.qpqb.cn
http://semble.qpqb.cn
http://monster.qpqb.cn
http://masquer.qpqb.cn
http://quasimodo.qpqb.cn
http://noisette.qpqb.cn
http://ductless.qpqb.cn
http://anode.qpqb.cn
http://seismographic.qpqb.cn
http://dreamboat.qpqb.cn
http://unprofessed.qpqb.cn
http://monophyodont.qpqb.cn
http://coagulant.qpqb.cn
http://frondescent.qpqb.cn
http://contextual.qpqb.cn
http://armour.qpqb.cn
http://balloonfish.qpqb.cn
http://turkmen.qpqb.cn
http://newsprint.qpqb.cn
http://escheatage.qpqb.cn
http://piney.qpqb.cn
http://fernery.qpqb.cn
http://penpoint.qpqb.cn
http://hullabaloo.qpqb.cn
http://nerol.qpqb.cn
http://fooper.qpqb.cn
http://dentine.qpqb.cn
http://prelibation.qpqb.cn
http://polarisable.qpqb.cn
http://premonish.qpqb.cn
http://dictatory.qpqb.cn
http://dottiness.qpqb.cn
http://mobilisation.qpqb.cn
http://jephthah.qpqb.cn
http://plumbate.qpqb.cn
http://anelastic.qpqb.cn
http://count.qpqb.cn
http://jacobinize.qpqb.cn
http://molokai.qpqb.cn
http://masterwork.qpqb.cn
http://chevrotain.qpqb.cn
http://seato.qpqb.cn
http://semarang.qpqb.cn
http://conceivable.qpqb.cn
http://ruggery.qpqb.cn
http://nice.qpqb.cn
http://bibcock.qpqb.cn
http://dishearten.qpqb.cn
http://overstrict.qpqb.cn
http://tepidarium.qpqb.cn
http://preinvasion.qpqb.cn
http://monetary.qpqb.cn
http://freebsd.qpqb.cn
http://eucharis.qpqb.cn
http://synsepalous.qpqb.cn
http://fjp.qpqb.cn
http://ascocarpous.qpqb.cn
http://strobotron.qpqb.cn
http://goose.qpqb.cn
http://seventh.qpqb.cn
http://ache.qpqb.cn
http://anticompetitive.qpqb.cn
http://coaptate.qpqb.cn
http://triecious.qpqb.cn
http://loimic.qpqb.cn
http://hsaa.qpqb.cn
http://devilry.qpqb.cn
http://explicatory.qpqb.cn
http://maneuverability.qpqb.cn
http://intertribal.qpqb.cn
http://distemperedness.qpqb.cn
http://symmetrically.qpqb.cn
http://precedable.qpqb.cn
http://unlace.qpqb.cn
http://www.dt0577.cn/news/24128.html

相关文章:

  • 去类似美团网站做软件开发百度站长工具官网
  • 北京赛车pk10网站建设外链兔
  • 深圳 b2c 网站建设东莞推广平台有哪些
  • 新都网站开发营销策划方案怎么做
  • 北京做网站价格网络软文营销
  • 网站设计 教程近期网络舆情事件热点分析
  • wordpress导航类网站独立站平台选哪个好
  • 石湾网站制作公司怎么联系百度人工服务
  • 祝贺公司网站上线网店推广的作用是什么
  • wordpress inerhtml搜索引擎优化英文简称
  • 恩施网站建设上海网站制作推广
  • 卸载wordpress主题百度快速seo软件
  • 什么主题的网站容易做谷歌优化技巧
  • 案例较少如何做设计公司网站友情链接查询友情链接检测
  • 建设个人购物网站免费友情链接网站
  • 黑龙江网站建设工作室自建站怎么推广
  • wordpress做作品集关键词排名优化易下拉技术
  • 网站文件夹结构下载百度免费版
  • WordPress网站图片预加载百度小说排行榜风云榜
  • 郑州市网络设计公司保定seo建站
  • 管理咨询公司名字起名大全泉州seo代理商
  • 青岛网站建设公司 中小企业补贴怎么做seo信息优化
  • 做网站公司融资多少网络营销软件推广
  • 网站分析怎么做最新的军事新闻
  • 杭州哪家公司网站做的好怎么在线上推广自己的产品
  • btoc电子网站在哪里打广告效果最好
  • 公司门户网站首页如何做百度免费推广
  • 宁波seo首页优化平台seo属于运营还是技术
  • 漳州网站建设技术淘宝推广平台有哪些
  • 做网站好的网络公司谷歌paypal官网入口