使用STM32G0B1写内部的Flash时出现问题,代码: #pragma arm section code = "RAMCODE" uint32_t NorFlash_Write_ttu(uint16_t operateCmd, uint32_t startAddr, uint32_t * pPageDatas, uint16_t datasLen) { uint16_t writeCount = datasLen / 8; //因为datasLen传入的长度是固定1024(按byte算的),而实际写Flash是按64字节写入的,所以这里转换为uint64_t类型时的长度 uint16_t i; uint8_t retry = 3; HAL_StatusTypeDef status = HAL_OK; // 清除Flash待处理标识 //__HAL_FLASH_CLEAR_FLAG(HAL_FLASH_GetError()); // 解锁Flash写 HAL_FLASH_Unlock(); // 检查BUSY状态 do { status = FLASH_WaitForLastOperation(10); if((HAL_ERROR == status) || (--retry == 0)) { //HAL_FLASH_Lock(); return HAL_FLASH_GetError(); } }while(HAL_TIMEOUT == status); // 擦除将要写入的地址页 if(operateCmd & 0x0002) //设标志判断是否需要擦除 { FLASH_PageErase(FLASH_BANK_1, (startAddr - NORFLASH_START_ADDRESS) / NORFLASH_PAGE_SIZE); retry = 3; do { status = FLASH_WaitForLastOperation(10); if((HAL_ERROR == status) || (--retry == 0)) { //HAL_FLASH_Lock(); return HAL_FLASH_GetError(); } }while(HAL_TIMEOUT == status); // 注:擦除完成后控制寄存器(CR寄存器)的擦除使能位(PER位)不会自动清除,需要手动清除 CLEAR_BIT(FLASH->CR, FLASH_CR_PER); } // 写入数据 for(i = 0; i < writeCount; ++i) { // 写入Flash,注意写入时是64位写入,i*2是因为pPageDatas是uint32_t类型(为了代码兼容) if(HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD, startAddr + i * 8, *(uint64_t *)(pPageDatas+i*2)) != HAL_OK) { //HAL_FLASH_Lock(); return HAL_FLASH_GetError(); } } // 加锁FLASH HAL_FLASH_Lock(); // 判断写入结果 return HAL_OK; } #pragma arm section 遇到的问题是,基于nucleo-g0b1re开发板,新建的工程实现这个写flash操作和一个串口输出log,每次起来后在HAL_FLASH_Unlock()之后,状态寄存器(SR)都会置位0x000000A0,即PGA编程对齐错误和PGSERR编程顺序错误;另外unlock()之后的FLASH_WaitForLastOperation()中清除SR寄存器语句之后,会置位成0x00040000,即CFGBSY 编程或擦除配置繁忙位置1,所以把HAL_FLASH_Lock()屏蔽了,执行这个会导致程序hard_fault 有在HAL_Init()和SystemClock_Config()处加断点查看SR寄存器,此时就已经是0x000400A0。有怀疑芯片坏了,但换芯片后仍旧有问题。 求教如何解决,或相关的代码 |
STM32G0B1adc+dma采样数据错位
STM32的H5/U5系列处理器内置运放支持负压运算吗?比如输入-1V,放大倍数为2时输出-2V
stm32G030C8T6 官方例程库
STM32G070 调用HAL_I2C_Mem_Read_IT测试疑问
STM32G030F6P6中的3种睡眠模式的功耗分别是多少
STM32G030F6 ADC+DMA多通道非连续采样无法正常工作?
STM32G0B1VE的CAN过滤器个数问题
有没有stm32g071 Discovery kit的micropython的固件
STM32G0B1CBT6 Flash 不能写擦除,更不要说写入?fal库示例代码哪里有,分享一下,谢谢
STM32G031G6U6 PA8无法输出高低电平
STM32Cube_FW_G0_V1.4.1\Projects\NUCLEO-G0B1RE\Examples\FLASH\FLASH_EraseProgram
兄弟 你的后面咋解决 我也碰到了,仿真器只要一运行,FLASH_SR寄存器的CFGBSY就置1了, 完全无法操作,不管代码里面是否有操作flash 均如此。直觉告诉我是仿真器的匹配问题但是发现几个仿真器均如此。有其他兄弟碰到过吗?可否指导一下
用官方例程,什么都不更改,直接下载进去运行 也是如此。个人感觉是:仿真器和编译器与芯片哪里没有匹配好,不过目前没有足够的证据证明该问题,ST原厂也没有回复,不知道大家是否有碰到该问题。
有碰到的解决了的麻烦大家支援一下,
我在阿莫电子论坛上看到有类似的问题,但是那是17年关于F4的flash操作,也有类似问题,后面那位大哥的解决方案是:原厂支援把MDK升级和仿真器升级,问题就解决了,代码没有改动。
例程一样的有问题,