搜索
bottom↓
回复: 15

STM32H750VB 外部程序QSPI模式,不成功。

[复制链接]

出500入8汤圆

发表于 2021-12-16 10:19:50 | 显示全部楼层 |阅读模式
本帖最后由 673835452 于 2021-12-16 10:33 编辑

STM32H750VB
硬件:使用W25Q128JV和W25Q64JV都试过了,     原理图和PCB图如下图所示,PCB做了等长处理

软件:目前烧录算法可以使用,并且开启校验模式。可以查到尝试ID,可以写读数据。
问题:STM32H750VB 内部128K存boot   外部qspi flash存app程序 。

目前无法跳转app,程序参考硬汉、野火、原子的都不行。运行到跳转字段时的时候晶振就不起振了。
boot mian函数:
  1. int main(void)
  2. {
  3.   /* USER CODE BEGIN 1 */
  4.         MPU_Config();
  5.         CPU_CACHE_Enable();
  6.   /* USER CODE END 1 */
  7.   /* MCU Configuration--------------------------------------------------------*/
  8.   /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  9.   HAL_Init();
  10.   /* USER CODE BEGIN Init */
  11.   /* USER CODE END Init */
  12.   /* Configure the system clock */
  13.   SystemClock_Config();
  14.   /* USER CODE BEGIN SysInit */
  15.   /* USER CODE END SysInit */
  16.   /* Initialize all configured peripherals */
  17.   MX_GPIO_Init();
  18.         //HAL_GPIO_WritePin(LOCK_GPIO_GPIO_Port,LOCK_GPIO_Pin,GPIO_PIN_SET);
  19.   MX_USART1_UART_Init();
  20. // MX_SPI1_Init();
  21. // MX_SPI2_Init();
  22.   /* USER CODE BEGIN 2 */
  23.         printf("boot ok\r\n");
  24.        
  25.         clock_information();
  26. //       
  27.         MX_QUADSPI_Init();
  28.         W25QXX_Init();
  29.        
  30.         printf("id:%X\r\n",W25QXX_MftrDeviceID());

  31.         QSPI_EnableMemoryMappedMode();

  32.         SCB_DisableICache();
  33.         SCB_DisableDCache();

  34.        

  35.   JumpToApp();  /* 跳转到应用程序 */
  36.   /* Infinite loop */
  37.   /* USER CODE BEGIN WHILE */
  38.   while (1)
  39.   {
  40.     /* USER CODE END WHILE */
  41.     /* USER CODE BEGIN 3 */
  42.   }
  43.   /* USER CODE END 3 */
  44. }
复制代码

boot映射代码:测试映射应该也没问题

  1. uint8_t QSPI_EnableMemoryMappedMode(void)
  2. {
  3.   QSPI_CommandTypeDef cmd;
  4.   QSPI_MemoryMappedTypeDef mem;

  5.   // Configure the command for the read instruction
  6.   cmd.InstructionMode = QSPI_INSTRUCTION_1_LINE;
  7.   cmd.Instruction = W25X_FastRead;

  8.   cmd.AddressMode = QSPI_ADDRESS_4_LINES;
  9.   cmd.AddressSize = QSPI_ADDRESS_24_BITS;

  10.   cmd.DataMode = QSPI_DATA_4_LINES;

  11.   cmd.AlternateByteMode = QSPI_ALTERNATE_BYTES_NONE;

  12.   cmd.DummyCycles = 8;

  13.   cmd.DdrMode = QSPI_DDR_MODE_DISABLE;
  14.   cmd.DdrHoldHalfCycle = QSPI_DDR_HHC_ANALOG_DELAY;
  15.   cmd.SIOOMode = QSPI_SIOO_INST_EVERY_CMD;

  16.   // Configure the memory mapped mode
  17.   mem.TimeOutActivation = QSPI_TIMEOUT_COUNTER_DISABLE;
  18.   mem.TimeOutPeriod = 0;

  19.   if (HAL_QSPI_MemoryMapped(&hqspi, &cmd, &mem) != HAL_OK)
  20.   {
  21.     return 1;
  22.   }

  23.   return 0;
  24. }
复制代码
boot跳转程序:
  1. void JumpToApp(void)
  2. {
  3.         uint32_t i=0;
  4.         void (*AppJump)(void);         /* 声明一个函数指针 */
  5.         __IO uint32_t AppAddr = 0x90000000;  /* APP 地址 0x90000000*/
  6.    

  7.     /* 关闭全局中断 */
  8.         DISABLE_INT();
  9.    
  10.     /* 设置所有时钟到默认状态,使用HSI时钟 */
  11.         HAL_RCC_DeInit();
  12.    
  13.         /* 关闭滴答定时器,复位到默认值 */
  14.         SysTick->CTRL = 0;
  15.   SysTick->LOAD = 0;
  16.   SysTick->VAL = 0;

  17.         /* 关闭所有中断,清除所有中断挂起标志 */
  18.         for (i = 0; i < 8; i++)
  19.         {
  20.                 NVIC->ICER[i]=0xFFFFFFFF;
  21.                 NVIC->ICPR[i]=0xFFFFFFFF;
  22.         }       

  23.         /* 使能全局中断 */
  24.         ENABLE_INT();

  25.         /* 跳转到应用程序,首地址是MSP,地址+4是复位中断服务程序地址 */
  26.         AppJump = (void (*)(void)) (*((uint32_t *) (AppAddr + 4)));

  27.         /* 设置主堆栈指针 */
  28.         __set_MSP(*(uint32_t *)AppAddr);
  29.        
  30.         /* 在RTOS工程,这条语句很重要,设置为特权级模式,使用MSP指针 */
  31.         __set_CONTROL(0);

  32.         /* 跳转到系统BootLoader */
  33.         AppJump();

  34.         /* 跳转成功的话,不会执行到这里,用户可以在这里添加代码 */
  35.         while (1)
  36.         {

  37.         }
  38. }
复制代码
app mian函数:
  1. int main(void)
  2. {
  3.   /* USER CODE BEGIN 1 */
  4.         SCB->VTOR = QSPI_BASE;
  5. //        __enable_irq();
  6.         SCB_EnableICache();
  7.         SCB_EnableDCache();
  8.        
  9.   /* USER CODE END 1 */
  10.   /* MCU Configuration--------------------------------------------------------*/
  11.   /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  12.   MPU_Config( );
  13.         HAL_Init();
  14.   /* USER CODE BEGIN Init */
  15.   /* USER CODE END Init */
  16.   /* Configure the system clock */
  17.   SystemClock_Config();
  18. /* USER CODE BEGIN SysInit */
  19. /* USER CODE END SysInit */
  20. /*Initialize all configured peripherals */
  21.   MX_GPIO_Init();
  22.         HAL_GPIO_WritePin(LOCK_GPIO_GPIO_Port,LOCK_GPIO_Pin,GPIO_PIN_RESET);
  23. // MX_QUADSPI_Init();
  24.   MX_USART1_UART_Init();
  25. //  MX_SPI1_Init();
  26. //  MX_SPI2_Init();
  27.   /* USER CODE BEGIN 2 */
  28.         printf("APP ok!\r\n");

  29.   /* USER CODE END 2 */
  30.   /* Infinite loop */
  31.   /* USER CODE BEGIN WHILE */
  32.   while (1)
  33.   {
  34.     /* USER CODE END WHILE */
  35.                 HAL_GPIO_WritePin(LOCK_GPIO_GPIO_Port,LOCK_GPIO_Pin,GPIO_PIN_SET);
  36.                 HAL_Delay(100);
  37.                 HAL_GPIO_WritePin(LOCK_GPIO_GPIO_Port,LOCK_GPIO_Pin,GPIO_PIN_RESET);
  38.                 HAL_Delay(100);
  39.     /* USER CODE BEGIN 3 */
  40.   }
  41.   /* USER CODE END 3 */
  42. }
复制代码
APP MDK 设置:


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入442汤圆

发表于 2021-12-16 12:37:57 来自手机 | 显示全部楼层
。。。你自己在app里把时钟都复位了,还指望晶振不变?

出500入8汤圆

 楼主| 发表于 2021-12-16 13:37:51 | 显示全部楼层
wye11083 发表于 2021-12-16 12:37
。。。你自己在app里把时钟都复位了,还指望晶振不变?

你好  SystemClock_Config(); 这是时钟初始化,cubemx 生成的
  1. void SystemClock_Config(void)
  2. {
  3.   RCC_OscInitTypeDef RCC_OscInitStruct = {0};
  4.   RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};

  5.   /** Supply configuration update enable
  6.   */
  7.   HAL_PWREx_ConfigSupply(PWR_LDO_SUPPLY);
  8.   /** Configure the main internal regulator output voltage
  9.   */
  10.   __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE0);

  11.   while(!__HAL_PWR_GET_FLAG(PWR_FLAG_VOSRDY)) {}
  12.   /** Initializes the RCC Oscillators according to the specified parameters
  13.   * in the RCC_OscInitTypeDef structure.
  14.   */
  15.   RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
  16.   RCC_OscInitStruct.HSEState = RCC_HSE_ON;
  17.   RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  18.   RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
  19.   RCC_OscInitStruct.PLL.PLLM = 5;
  20.   RCC_OscInitStruct.PLL.PLLN = 192;
  21.   RCC_OscInitStruct.PLL.PLLP = 2;
  22.   RCC_OscInitStruct.PLL.PLLQ = 5;
  23.   RCC_OscInitStruct.PLL.PLLR = 2;
  24.   RCC_OscInitStruct.PLL.PLLRGE = RCC_PLL1VCIRANGE_3;
  25.   RCC_OscInitStruct.PLL.PLLVCOSEL = RCC_PLL1VCOWIDE;
  26.   RCC_OscInitStruct.PLL.PLLFRACN = 0;
  27.   if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  28.   {
  29.     Error_Handler();
  30.   }
  31.   /** Initializes the CPU, AHB and APB buses clocks
  32.   */
  33.   RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
  34.                               |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2
  35.                               |RCC_CLOCKTYPE_D3PCLK1|RCC_CLOCKTYPE_D1PCLK1;
  36.   RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  37.   RCC_ClkInitStruct.SYSCLKDivider = RCC_SYSCLK_DIV1;
  38.   RCC_ClkInitStruct.AHBCLKDivider = RCC_HCLK_DIV2;
  39.   RCC_ClkInitStruct.APB3CLKDivider = RCC_APB3_DIV2;
  40.   RCC_ClkInitStruct.APB1CLKDivider = RCC_APB1_DIV2;
  41.   RCC_ClkInitStruct.APB2CLKDivider = RCC_APB2_DIV2;
  42.   RCC_ClkInitStruct.APB4CLKDivider = RCC_APB4_DIV2;

  43.   if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_4) != HAL_OK)
  44.   {
  45.     Error_Handler();
  46.   }
  47. }
复制代码

出0入442汤圆

发表于 2021-12-16 15:15:40 来自手机 | 显示全部楼层
673835452 发表于 2021-12-16 13:37
你好  SystemClock_Config(); 这是时钟初始化,cubemx 生成的


app代码里面不要配时钟!闲着没事干了。app只执行用户算法代码。所有初始化都在bootloader里面做!

想想你的电脑,配置cpu /内存是在进入桌面之后你再手动配吗?这样的电脑你觉得有几个人能用起来?单片机一样的道理。

出0入8汤圆

发表于 2021-12-16 16:09:09 | 显示全部楼层
时钟只能在boot里配置

出140入158汤圆

发表于 2021-12-16 17:27:09 | 显示全部楼层
楼上两位不对,BootLoader和App可以分别配置时钟,这个不影响,而且这样可以多个项目使用同一BootLoader。现在关键是您跳转后,App是否有开始执行??并且,App的中断向量起始地址需要在App的程序里面设置(MDK没得设),App能进入,就再重新配置时钟等,反正App里您可以视为一个完全独立的单机程序,唯一不同只是起始地址和向量表地址不同而已。

出140入158汤圆

发表于 2021-12-16 17:30:32 | 显示全部楼层
中断向量表基址在System_stm32h7xx.c里的SystemInit函数内,SCB->VTOR = FLASH_BANK1_BASE | VECT_TAB_OFFSET;       /* Vector Table Relocation in Internal FLASH */

出100入113汤圆

发表于 2021-12-16 18:39:13 | 显示全部楼层
本帖最后由 saccapanna 于 2021-12-16 18:40 编辑

Boot 与 APP 解耦分离的思路是对的,两个程序各不相关。
但是要注意,你在 Boot 中,初始化时钟,然后 QSPI 的时钟使用的那一路?
不要在 APP 启动时,再把 QSPI 的时钟关闭了吧,QSPI的驱动和映射不能复位吧?不然相当于读取 QSPI 失效了,当然无法运行。

出100入113汤圆

发表于 2021-12-16 18:44:42 | 显示全部楼层
也就是说,你可以重新初始化时钟,可以做一切硬件的初始化,但是无论做什么,你必须要确保 QSPI 工作正常,并且映射正常。除非,你把 FLASH 数据全部加载到 RAM 中运行,反正 STM32H750 SRAM 足够大。

出0入17汤圆

发表于 2021-12-16 22:45:10 来自手机 | 显示全部楼层
QSPI FLASH 数据全部加载到 RAM 有没有人成功过?不知道抗干扰怎么样?

出0入91汤圆

发表于 2021-12-17 10:05:17 | 显示全部楼层
没有做分散文件吧?

出500入8汤圆

 楼主| 发表于 2021-12-17 11:16:26 | 显示全部楼层
saccapanna 发表于 2021-12-16 18:39
Boot 与 APP 解耦分离的思路是对的,两个程序各不相关。
但是要注意,你在 Boot 中,初始化时钟,然后 QSPI ...

APP启动没有把QSPI时钟复位,
BOOT复位时钟注释掉也不行。

出500入8汤圆

 楼主| 发表于 2021-12-17 11:18:06 | 显示全部楼层
ackyee 发表于 2021-12-17 10:05
没有做分散文件吧?

boot  app 模式应该不需要做分散文件吧,参考别人的都没有做

出0入16汤圆

发表于 2021-12-17 11:26:51 | 显示全部楼层
boot我只做自升级,所有配置都在APP,比如手机下载完成后自动安装,boot只负责安装或者固件初始化啥的,一般都是向量地址错了所以跑不起来

出10入0汤圆

发表于 2021-12-18 00:48:17 | 显示全部楼层
QSPI时钟要用HCLK3的,不能用PLL之后的。另外,QSPI FLASH里的程序 ,不要再次初始化QSPI了

出100入113汤圆

发表于 2021-12-18 14:09:49 | 显示全部楼层
radar_12345 发表于 2021-12-16 22:45
QSPI FLASH 数据全部加载到 RAM 有没有人成功过?不知道抗干扰怎么样?

理论是应该是完全没问题的,我目前128KB,没用外部FLASH,升级部分就是运行在RAM中的。
不过完全加载到 SRAM 运行没有试验过,稳定性不知道。
加载完毕后,配置 MMU,把RAM的一段空间,设置为只读,应该问题不大。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-6-8 11:25

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表