打印
[STM32F4]

IAP 情况下 只CPU reset 会影响哪些呢?

[复制链接]
732|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
最近搞了个基于CAN 的IAP;

有个板子控制了电源,不能直接调用  NVIC_SystemReset()
所以想到只复位CPU,这样就保持 GPIO不变了;


代码如下:

        /* Only CoreReset.
        */
        __set_FAULTMASK(1);

        __DSB();

        SCB->AIRCR = ((0x5FA << SCB_AIRCR_VECTKEY_Pos) |
                      (SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) |
                      SCB_AIRCR_VECTRESET_Msk);

        __DSB();




这样在 App 收到指令先调用全部外设的
HAL_DeInit(); 或者一个个调用类似 HAL_RCC_DeInit();这样些函数;

        /* Timers DeInit.
        */
        HAL_TIM_Base_DeInit(&htim2);
        HAL_TIM_Base_DeInit(&htim3);
        HAL_TIM_Base_DeInit(&htim4);
        HAL_TIM_Base_DeInit(&htim5);
        HAL_TIM_Base_DeInit(&htim6);

        /* DMA DeInit.
        */
        HAL_DMA_DeInit(&hdma_tim4_ch2);
        HAL_DMA_DeInit(&hdma_tim5_ch1);


        LL_DMA_DeInit(DMA2, LL_DMA_STREAM_2);
        LL_DMA_DeInit(DMA2, LL_DMA_STREAM_7);

        LL_DMA_DeInit(DMA2, LL_DMA_STREAM_1);
        LL_DMA_DeInit(DMA2, LL_DMA_STREAM_6);

        HAL_DMA_DeInit(&hdma_usart2_rx);
        HAL_DMA_DeInit(&hdma_usart2_tx);
        HAL_DMA_DeInit(&hdma_usart3_rx);
        HAL_DMA_DeInit(&hdma_usart3_tx);
        HAL_DMA_DeInit(&hdma_uart5_rx);
        HAL_DMA_DeInit(&hdma_uart5_tx);

        /* CAN DeInit.
        */
        HAL_CAN_DeInit(&hcan1);
        HAL_CAN_DeInit(&hcan2);

        /* UART DeInit.
        */
        LL_USART_DeInit(USART1);
        LL_USART_DeInit(USART6);

        HAL_UART_MspDeInit(&huart2);
        HAL_UART_MspDeInit(&huart3);
        HAL_UART_MspDeInit(&huart5);

        /* SPI DeInit.
        */
        HAL_SPI_DeInit(&hspi1);

        /* RCC Reset.
        */
        HAL_RCC_DeInit();




进行复位后,就会进入到 0x08000000 开始的bootloader;

升级完成后;bootloader 会跳转到 App运行(0x08002000);


现在的问题是,仅仅 core reset 会在 App 初始化外设,并产生中断的时候,PC指针会出现0 的情况,CPU 就进入 HardFault 了;
用 __disable_irq(); 在初始化时钟之后,其他外设初始化之前,屏蔽掉全部中断,在全部外设初始化之后,再调用 __enable_irq(); 开启全部中断;也会出现
PC指针= 0 的情况,CPU 进入 HardFault ;


不知道有大侠出现过类似的情况吗?





















使用特权

评论回复
沙发
sonicll| | 2021-3-25 09:11 | 只看该作者
app跳转bootloader,和bootloader跳转app,都可以设置好SP直接跳转吧,没必要复位吧?

使用特权

评论回复
板凳
xiaofei558008|  楼主 | 2021-3-25 17:42 | 只看该作者
sonicll 发表于 2021-3-25 09:11
app跳转bootloader,和bootloader跳转app,都可以设置好SP直接跳转吧,没必要复位吧? ...

在中断函数里面,直接设置 SP 指针和 PC 指针跳转可以吗?还在只能在中断函数外面设置这两个指针?

使用特权

评论回复
地板
sonicll| | 2021-3-25 19:12 | 只看该作者
xiaofei558008 发表于 2021-3-25 17:42
在中断函数里面,直接设置 SP 指针和 PC 指针跳转可以吗?还在只能在中断函数外面设置这两个指针? ...

要在中断函数外面操作,中断函数里面会牵扯到内核的handler和thread模式切换问题

使用特权

评论回复
5
xiaofei558008|  楼主 | 2021-4-1 18:04 | 只看该作者
sonicll 发表于 2021-3-25 19:12
要在中断函数外面操作,中断函数里面会牵扯到内核的handler和thread模式切换问题 ...

现在在中断外面了,但是还是有问题;
DeInit外设

CoreReset
进入 Bootloader
升级固件
跳转到App运行
外设初始化
工作不正常了,DMA等出问题,进入中断出不来

全部用的是HAL库;

求大侠帮忙啊;

OTA仅仅 CoreReset 咋处理外设?

使用特权

评论回复
6
xiaofei558008|  楼主 | 2021-4-6 14:23 | 只看该作者
最近问题应该解了;

需要操作RCC的寄存器,把外设在App跳转之前全部关一编;



90075606bfe529300f.png (64.39 KB )

90075606bfe529300f.png

使用特权

评论回复
7
两只袜子| | 2021-4-6 16:53 | 只看该作者
都很厉害的,我来看看问题是怎么解决的,学习了

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

137

主题

971

帖子

13

粉丝