首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Bootloader跳转应用I2C问题

Bootloader跳转应用I2C问题
EN

Stack Overflow用户
提问于 2022-02-02 14:09:00
回答 1查看 356关注 0票数 0

我试图从引导代码中跳转用户应用程序:

引导代码仅包括以下行:

代码语言:javascript
复制
int main()
{
        HAL_Init();
        SystemClock_Config();
        // Jump proccess start
        uint32_t reset_handler_add=*((volatile uint32_t*)(FLASH_APP_START_ADDRESS+4));
        void (*app_reset_handler)(void) = (void*)reset_handler_add;
        HAL_RCC_DeInit();                  
        HAL_DeInit();
        __HAL_RCC_SYSCFG_CLK_DISABLE(); 
        SysTick->CTRL = 0;                   
        SysTick->LOAD = 0;                   
        SysTick->VAL = 0;                    
        __disable_irq();     
        SCB->VTOR = FLASH_APP_START_ADDRESS;                                                        
        uint32_t msp_value = *((volatile uint32_t*)(FLASH_APP_START_ADDRESS));
        __set_MSP(msp_value);
        app_reset_handler();
while(1);
}

还#定义FLASH_APP_START_ADDRESS 0x080A0000,这是应用程序代码开始地址。

但是当我跳转用户应用程序时,I2C就不能工作了。

在用户应用程序中,当我跳过用户应用程序时,我使用了while (HAL_I2C_GetState(hi2c) != HAL_I2C_STATE_READY)函数。但是,如果用户应用程序在基础0x080000000上成功地解决了所有问题,当我跳转时,我就有问题了。

我在用户应用程序上更改了flash.Ld文件:

代码语言:javascript
复制
MEMORY
{
RAM (xrw)      : ORIGIN = 0x20000000, LENGTH = 192K
CCMRAM (rw)      : ORIGIN = 0x10000000, LENGTH = 64K
FLASH (rx)      : ORIGIN = 0x080A0000, LENGTH = 256K
}

并更改#定义VECT_TAB_OFFSET 0xA0000值。

故障在哪里?

EN

回答 1

Stack Overflow用户

发布于 2022-02-04 14:48:06

在I2C微控制器中存在一个stm32 init问题。我不知道您的问题是否与引导程序代码有关,但我也有同样的症状。

我找到的最简单的修复方法是在初始化SDA和SCL引脚之前插入I2C clk:

代码语言:javascript
复制
void HAL_I2C_MspInit(I2C_HandleTypeDef* i2cHandle)
{

  GPIO_InitTypeDef GPIO_InitStruct = {0};
  if(i2cHandle->Instance==I2C1)
  {
  /* USER CODE BEGIN I2C1_MspInit 0 */

  /* USER CODE END I2C1_MspInit 0 */
  
    __HAL_RCC_GPIOB_CLK_ENABLE();
    __HAL_RCC_I2C1_CLK_ENABLE();       // <------ move this line here 

    /**I2C1 GPIO Configuration    
    PB6     ------> I2C1_SCL
    PB7     ------> I2C1_SDA 
    */
    GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_7;
    ...
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70957107

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档