[STM32F1] STM32F103VE

[复制链接]
1221|9
 楼主| icefox225 发表于 2015-4-20 15:49 | 显示全部楼层 |阅读模式
本帖最后由 icefox225 于 2015-4-20 16:20 编辑

最近在测试STM32F103的FLASH读写,发现一个问题
for(i = 0; i < i_Page; i++)
{
       FLASH_ErasePage(m_u32FlashCheckAddr + 0x400 * i);
       General_Wait_ms(10);
}m_u32FlashCheckAddr  = 0x08040000
就是执行前面这个for循环的时候仿真器老会自己停在status = FLASH_WaitForLastOperation(EraseTimeout);这句话,我这里没设置断点啊,我继续点F5可以继续跑,功能也是能实现的。
这里的i_Page的值是45。
FLASH_Status FLASH_WaitForLastOperation(uint32_t Timeout)
{
    FLASH_Status status = FLASH_COMPLETE;

    /* Check for the Flash Status */
    status = FLASH_GetStatus();
    /* Wait for a Flash operation to complete or a TIMEOUT to occur */
    do
    {
        delay();
        IWDG_ReloadCounter();
        status = FLASH_GetStatus();
        Timeout--;
    }while((status == FLASH_BUSY) && (Timeout != 0x00));
    if(Timeout == 0x00 )
    {
        status = FLASH_TIMEOUT;
    }
    /* Return the operation status */
    return status;
}
以上是这段代码,偶尔有几次就直接进入HardFault_Handler(),然后看门狗溢出重启了。
FLASH_ErasePage这个函数的内容没有改过。
群里有高手碰到过类似的问题吗?不知道跟STM32的FLASH是否有关。
 楼主| icefox225 发表于 2015-4-20 16:26 | 显示全部楼层
没人碰到过这个问题吗
hbyu 发表于 2015-4-20 16:35 | 显示全部楼层
mmuuss586 发表于 2015-4-20 18:53 | 显示全部楼层
读写FLASH的时候,最好把串口关掉;
firstblood 发表于 2015-4-20 20:16 | 显示全部楼层
flash的读写还是很不错的应用。
zh113214 发表于 2015-4-20 22:47 来自手机 | 显示全部楼层
测试STM32F103的FLASH读写,没啥印象额。。
ZYYlz 发表于 2015-4-21 09:56 | 显示全部楼层
SectorErase扇区擦除问题
wowow 发表于 2015-4-21 10:18 | 显示全部楼层
写Flash前关掉所有中断试试。另外看看你读写缓冲区是在哪开的,小心STACK溢出。
 楼主| icefox225 发表于 2015-4-21 10:47 | 显示全部楼层
**作FLASH时把中断都关了,堆栈我设置很大了,
Stack_Size      EQU     0x00001400
AREA    STACK, NOINIT, READWRITE, ALIGN=3
Stack_Mem       SPACE   Stack_Size
__initial_sp
                                          
__initial_spTop EQU    0x20001400                 ; stack used for SystemInit_ExtMemCtl
                                                  ; always internal RAM used
                                                  
; <h> Heap Configuration
;   <o>  Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>
; </h>

Heap_Size       EQU     0x00000C00
读写缓冲区我就是直接地址操作的
m_u32FlashAddr = 0x08040000
status = FLASH_ProgramWord(m_u32FlashAddr, *(uint32*)((uint32)(m_TempBuf + i)));
写完后再把数据读出来跟m_TempBuf比较。
 楼主| icefox225 发表于 2015-4-21 11:10 | 显示全部楼层
曾经碰到更奇怪的是ProgramWord这个函数有时候写不进数据,但是status却是完成的。因为我用memory看的时候某个地址段出现了连续好多个FF。说明数据没有写进去。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

223

主题

353

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部