我正在尝试从启动代码中跳转用户应用程序:
引导代码仅包括以下行:
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;
...