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

html5快速建站广西建筑八大员报考官网

html5快速建站,广西建筑八大员报考官网,做博客网站需要工具吗,企业网站建设方案书范本故障现象1 G0系列,写片上FLASH时,经常死机,而且按复位键都没用,属于不断电都救不回来的那种死法。这种情况一般是由硬件置位了某个标志导致,只有断电才能故障复原。 故障查找 检查FLASH的相关寄存器,发现…

故障现象1

G0系列,写片上FLASH时,经常死机,而且按复位键都没用,属于不断电都救不回来的那种死法。这种情况一般是由硬件置位了某个标志导致,只有断电才能故障复原。

故障查找

检查FLASH的相关寄存器,发现死机后SR寄存器如下图:
在这里插入图片描述
正常情况下,SR的值应该是等于0,如果哪一位不为0,则是出现了相应的错误。
上面的截图不仅仅是在死机之后出现,即使按下复位键,仍然是这样,通过操作寄存器,可以消除PGAERR和PGSERR两个标志位,但不能消除CFGBSY。
查手册发现,CFGBSY位是硬件置位和清0的,所以无法手动消除。
看来按复位键后,仍然不能正常工作的原因找到了,只要想办法清除这个标志位即可。

故障解决

通过向Flash的任意一个地址,直接写一个数,当然是不按照FLASH的操作流程。
数值无所谓。反正也不会真正写入数据的。
这时硬件会对FLASH的CFGBSY位清0,并将PGAERR和PGSERR两个标志位置位。
再手动对PGAERR和PGSERR两个标志位清0即可。
代码如下:

//向任意地址写一个数,数值任意,在Flash的SR寄存器中,硬件会自动清除CFGBSY标志,同时产生2个错误
//再手动清除这两个错误标志即可清除CFGBSY标志
void LL_flash_clear_cfgbsy(void)    //CFGBSY标志无法软件清除,只能通过制造错误,让硬件清除
{if(__HAL_FLASH_GET_FLAG(FLASH_FLAG_CFGBSY) != 0x00U){*(uint32_t *)(0x08001000) = 1;	//向FLASH任意位置写一个数__HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_PGAERR) ;//清除2个标志位__HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_PGSERR) ;}
}

故障现象2

G0系列的FLASH写入,是双字模式,也就是一次写入8字节,即64位。
STM32G030C8T6的一页是2K字节,也就是256个u64。
当我写入的数据比较多时,比如一次写整整一页,这时就必然会在接近完成的时候发生写入错误,代码如下:

//直接写入FLASH,在写入前不检查FLASH内容是否为空
u8 LL_flash_write_without_check(u32 addr, u64* pdata64, u16 len)
{u16 i,j;u8 ret;u64 read;u64 write;u8 err=0;HAL_FLASH_Unlock();for(j=0; j<len; j++){for(i=0; i<10; i++)    //不超过10次的重复操作,以保证写入成功{ret = HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD, addr+j*8, *(pdata64+j));if(ret == HAL_OK){read = *(__IO uint64_t *)(addr+j*8);  //在MCU认为写入正确以后,再次读取数据,并进行比对,如果比对不成功,说明写入出错write = *(pdata64+j);if(read == write)break;else{ret = 255;return ret;}}elseerr = 1;}}HAL_FLASH_Lock();return 0;
}

每次都会在写入超过0xe0,也就是224个数据之后出现错误,也可能是225,或者226,227,不会再更大了。换了板子也是同样的故障。
具体情况就是HAL_FLASH_Program返回值为0,表示写入成功,但是再次读取数据时,读出的数据与写入的数据不相等。

故障解决

不得已对代码进行了修改,如下

//直接写入FLASH,在写入前不检查FLASH内容是否为空
u8 LL_flash_write_without_check(u32 addr, u64* pdata64, u16 len)
{u16 i,j;u8 ret;u64 read;u64 write;u8 err=0;HAL_FLASH_Unlock();for(j=0; j<len; j++){for(i=0; i<10; i++)    //不超过10次的重复操作,以保证写入成功{write = *(pdata64+j);ret = HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD, addr+j*8, write);if(ret == HAL_OK){read = *(__IO uint64_t *)(addr+j*8);  //在MCU认为写入正确以后,再次读取数据,并进行比对,如果比对不成功,说明写入出错if(read == write)break;else{ret = 255;HAL_FLASH_Lock();return ret;}}else{err = 1;}}}HAL_FLASH_Lock();return 0;
}

其实修改的就是

      ret = HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD, addr+j*8, *(pdata64+j));

改成了

      write = *(pdata64+j);ret = HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD, addr+j*8, write);

故障排除。而这两种方式是完全等价的啊。难道是编译器出问题了?

唉,问题解决就行。

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

相关文章:

  • 企业网站创建的步骤简单旅游网站开发
  • 域名的网站建设方案书wordpress 表单发邮件
  • 柳城网站建设最新创建的网站
  • 跨境电商网站设计晋江外贸网站建设
  • 贾汪微网站开发推广运营公司哪家好
  • 网站建设信息平台永嘉网站建设几
  • 白银网站建设熊掌号wordpress 顶部高度
  • 宝塔怎么做两个网站的解析装修店铺
  • 网站建设最高管理权限免费logo图片在线制作
  • 私自做彩票网站销售犯法么贵州建设职业技术学院网站查成绩
  • wordpress级验哈尔滨seo优化分析
  • 找个不能粘贴文字的网站做实验怎样注册自己的网址
  • 静态网站用什么做继续教育网站怎么做不了作业
  • 西安北郊做网站wordpress实现pdf浏览
  • 哪个网站做译员好在线设计网站哪个好
  • 遨游网站建设有限公司极致优化WordPress网站速度
  • 网站开发成本估计西安seo阳建
  • 北海住房和城乡建设部网站网站建设和维护怎么学
  • 用织梦怎么做网站网站 免费认证
  • 铁岭哪家做营销型网站关于阅读类网站的建设规划书
  • 网站建设销售话术文本格式永久免费vps服务器
  • 昆明快速做网站网站常识
  • 网站2级页面怎么做用vs2012做网站首页
  • 最新微网站建设价格网站用什么程序做的
  • 网站数据分析案例wordpress建站 客户端
  • 成都思乐网站建设行业资讯网
  • 宁波网站关键词优化排名wordpress gallery插件
  • 企业网站建设公司选择分析服务商平台登录
  • 网站前台管理系统3d演示中国空间站建造历程
  • 制作网站的图片哪来赣州网站建设设计