引导程序跳转应用程序I2C问题



我正在尝试从启动代码中跳转用户应用程序:

引导代码仅包括以下行:

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);
}

同样#define FLASH_APP_START_ADDRESS 0x080A0000这是应用程序代码的起始地址。

但是当我跳用户应用程序I2C不工作。

在用户应用程序中,我陷入了while(HAL_I2C_GetState(hi2c(!=HAL_I2C_STATE_READY(函数。但是如果用户应用程序在0x080000000地址的基础上工作一切顺利,当我跳的时候我就有问题了。

我换了闪光灯。用户应用程序上的Ld文件:

MEMORY
{
RAM (xrw)      : ORIGIN = 0x20000000, LENGTH = 192K
CCMRAM (rw)      : ORIGIN = 0x10000000, LENGTH = 64K
FLASH (rx)      : ORIGIN = 0x080A0000, LENGTH = 256K
}

并更改了#define VECT_TAB_OFFSET 0xA0000值。

故障在哪里?

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

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

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;
...

最新更新