我试图从引导代码中跳转用户应用程序:
引导代码仅包括以下行:
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文件:
MEMORY
{
RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 192K
CCMRAM (rw) : ORIGIN = 0x10000000, LENGTH = 64K
FLASH (rx) : ORIGIN = 0x080A0000, LENGTH = 256K
}并更改#定义VECT_TAB_OFFSET 0xA0000值。
故障在哪里?
发布于 2022-02-04 14:48:06
在I2C微控制器中存在一个stm32 init问题。我不知道您的问题是否与引导程序代码有关,但我也有同样的症状。
我找到的最简单的修复方法是在初始化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;
...https://stackoverflow.com/questions/70957107
复制相似问题