返回> 网站首页 

STM32F070的IAP - bootloader

yoours2021-09-11 08:39:55 阅读 2410

简介一边听听音乐,一边写写文章。

一、bootloader计时中断

        计时采用systick,默认使用STM32Mx创建的ll库程序没有产生systick中断,则需要修改:

__STATIC_INLINE void LL_InitTick(uint32_t HCLKFrequency, uint32_t Ticks)
{
  SysTick->LOAD  = (uint32_t)((HCLKFrequency / Ticks) - 1UL);
  SysTick->VAL   = 0UL;
  SysTick->CTRL  = SysTick_CTRL_CLKSOURCE_Msk |
                    SysTick_CTRL_TICKINT_Msk| /*增加此项*/
                   SysTick_CTRL_ENABLE_Msk;
}


二、bootloader跳转到应用

typedef  void (*pFunction)(void);
if(TmCnt>2000)
{
    SysTick->CTRL=0x00;//关闭计数器
    SysTick->VAL =0x00;//清空计数器

    NVIC_DisableIRQ(USART1_IRQn);
    NVIC_DisableIRQ(DMA1_Channel2_3_IRQn);

    LL_DMA_DeInit(DMA1, LL_DMA_CHANNEL_3);
    LL_USART_DeInit(USART1);

    __disable_irq();
    if(((*(__IO uint32_t*)APPLICATION_ADDRESS)&0x2FFE0000)==0x20000000)
    {
        pFunction jumpapp = (pFunction)*(__IO uint32_t*)(APPLICATION_ADDRESS+4);
        __set_MSP(*(__IO uint32_t*)APPLICATION_ADDRESS);
        jumpapp();
    }
}


三、应用程序的中断向量表处理

memcpy((void*)0x20000000,(void*)APPLICATION_ADDRESS, 0xC0);
__HAL_RCC_SYSCFG_CLK_ENABLE();
__HAL_SYSCFG_REMAPMEMORY_SRAM();
__HAL_RCC_PWR_CLK_ENABLE();
__enable_irq();

STM32F0的中断向量表处理与STM32F1等不一样,F0必须使用SRAM手动将中断向量表拷贝到0x20000000地址。

四、Keil设置


修改RAM地址,防止变量地址使用中断向量表空间。


微信小程序扫码登陆

文章评论

2410人参与,0条评论