查看: 4997|回复: 14

[已解决] K64 + RTOS 擦除片上flash 重启

[复制链接]

该用户从未签到

4

主题

18

帖子

0

注册会员

Rank: 2

积分
83
最后登录
1970-1-1
发表于 2016-11-10 16:23:25 | 显示全部楼层 |阅读模式
本帖最后由 gaoqian01 于 2016-11-10 16:35 编辑

大家好,我用k64的芯片,用SDK2.0建的带rtos的工程,擦除片上flash时,异常

void test(void)
{
    uint32_t startAddr = flashDriver.PFlashTotalSize / 2 - flashDriver.PFlashSectorSize;//第一个block,最后一个sector起始地址
    //uint32_t startAddr = flashDriver.PFlashTotalSize / 2;
    //PRINTF("------test----startAddr=0x%x-----\r\n", startAddr);
    FLASH_Erase(&flashDriver, startAddr, flashDriver.PFlashSectorSize, kFLASH_apiEraseKey);
    PRINTF("TEST FLASH END.\r\n");
}

/*!
* @brief Task responsible for printing of "Hello world." message.
*/
static void hello_task(void *pvParameters) {
    //for (;;) {
        PRINTF("Hello world.\r\n");
        /* Add your code here */
        test();
        PRINTF("TEST FLASH END.\r\n");
        //vTaskSuspend(NULL);
   // }
}

void InitMcuFlash(void)
{
    memset(&flashDriver, 0, sizeof(flash_config_t));
    FLASH_Init(&flashDriver);

    //addby gq
    /* Check security status. */
    flash_security_state_t securityStatus = kFLASH_securityStateNotSecure;
    uint32_t result = FLASH_GetSecurityState(&flashDriver, &securityStatus);
}

/*!
* @brief Application entry point.
*/
int main(void) {
    /* Init board hardware. */
    BOARD_InitPins();
    BOARD_BootClockRUN();
    BOARD_InitDebugConsole();

    PRINTF("RCM->SRS0=0b%08b, RCM->SRS1=0b%08b\r\n", RCM->SRS0, RCM->SRS1);

    PRINTF("\r\n");
    PRINTF("\r\n");
    PRINTF("starting testing...\r\n");

    InitMcuFlash();

    /* Add your code here */
    test();//main擦除block0的最后一个sector正常
    /* Create RTOS task */
    xTaskCreate(hello_task, "Hello_task", configMINIMAL_STACK_SIZE, NULL, hello_task_PRIORITY, NULL);
//在task里面,调用test,擦除block0的最后一个扇区,就重启,擦除block1的任何扇区都正常
    vTaskStartScheduler();

    test();

    for(;;) { /* Infinite loop to avoid leaving the main function */
        __asm("NOP"); /* something to use as a breakpoint stop while looping */
    }
}


----------------------------------------------------------------------------------------------------------------
现象:
1、在main函数,擦除片上flash的扇区都正常
2、在task里面,擦除block0的任何扇区就重启,擦除block1的正常。重启后打印RCM的寄存器值,显示复位源是Core LockUp

请问这是那里的问题?task要怎么设置?谢谢!!!

最佳答案

gaoqian01 发表于 2016-11-11 11:39 谢谢 楼主可以是使用vPortEnterCritical和vPortExitCritical将Flash erase过程的代码作为临界区代码保护起来
回复

使用道具 举报

  • TA的每日心情
    开心
    2018-6-6 08:45
  • 签到天数: 328 天

    连续签到: 1 天

    [LV.8]以坛为家I

    10

    主题

    1047

    帖子

    1

    金牌会员

    Rank: 6Rank: 6

    积分
    2006
    最后登录
    2019-5-1
    发表于 2016-11-10 16:33:09 | 显示全部楼层
    友情帮顶
    该会员没有填写今日想说内容.
    回复

    使用道具 举报

    该用户从未签到

    0

    主题

    32

    帖子

    0

    注册会员

    Rank: 2

    积分
    61
    最后登录
    2019-9-30
    发表于 2016-11-10 16:59:53 | 显示全部楼层
    不懂帮顶
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2018-11-23 10:20
  • 签到天数: 45 天

    连续签到: 1 天

    [LV.5]常住居民I

    5

    主题

    693

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    1402
    最后登录
    2025-7-18
    发表于 2016-11-10 17:22:53 | 显示全部楼层
    帮顶
    dfdfdfdfdfdfdfd dsfa222
    回复

    使用道具 举报

    该用户从未签到

    3

    主题

    90

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    419
    最后登录
    1970-1-1
    发表于 2016-11-10 21:53:25 | 显示全部楼层
    当 program或者擦除Flash的时候,确保全局中断被关闭,因为Flash不支持写时读。 当操作完成后,再开启全局中断。

    回复 支持 反对

    使用道具 举报

    该用户从未签到

    4

    主题

    18

    帖子

    0

    注册会员

    Rank: 2

    积分
    83
    最后登录
    1970-1-1
     楼主| 发表于 2016-11-11 09:07:33 | 显示全部楼层
    本帖最后由 gaoqian01 于 2016-11-11 09:23 编辑
    浪淘沙-407988 发表于 2016-11-10 21:53
    当 program或者擦除Flash的时候,确保全局中断被关闭,因为Flash不支持写时读。 当操作完成后,再开启全局 ...

    我试试,谢谢!SDK里面有没有相关的API?在数据手册哪部分?谢谢!
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    712

    主题

    6371

    帖子

    0

    超级版主

    Rank: 8Rank: 8

    积分
    24860
    最后登录
    2025-7-18
    发表于 2016-11-11 09:41:42 | 显示全部楼层
    gaoqian01 发表于 2016-11-11 09:07
    我试试,谢谢!SDK里面有没有相关的API?在数据手册哪部分?谢谢!

    等一下我测试一下!!
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    4

    主题

    18

    帖子

    0

    注册会员

    Rank: 2

    积分
    83
    最后登录
    1970-1-1
     楼主| 发表于 2016-11-11 09:52:24 | 显示全部楼层
    小恩GG 发表于 2016-11-11 09:41
    等一下我测试一下!!

    谢谢
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    3

    主题

    90

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    419
    最后登录
    1970-1-1
    发表于 2016-11-11 11:13:16 | 显示全部楼层
    gaoqian01 发表于 2016-11-11 09:07
    我试试,谢谢!SDK里面有没有相关的API?在数据手册哪部分?谢谢!

    在调 FLASH_Program或者 FLASH_Verify, Flash_Readxxx, Flash_Erase相关的API之前, __disable_irq(). 完成后__enable_irq()就好了, 这两个函数应该是标准库里的, 也可以__ASM("cpsi d"); __ASM ("cpsi e"), 效果完全一样
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    4

    主题

    18

    帖子

    0

    注册会员

    Rank: 2

    积分
    83
    最后登录
    1970-1-1
     楼主| 发表于 2016-11-11 11:39:36 | 显示全部楼层
    浪淘沙-407988 发表于 2016-11-11 11:13
    在调 FLASH_Program或者 FLASH_Verify, Flash_Readxxx, Flash_Erase相关的API之前, __disable_irq().  ...

    谢谢
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2025-7-18 19:10 , Processed in 0.111174 second(s), 31 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表