STM32H7B0 HAL OSPI配置的一次失败原因分享

使用 OSPI1 驱动W25Q128,但是始终无法调试成果,最后发现是HAL 库的问题

我使用的HAL库是CUBEMX自动生成的,CUBEMX版本是6.4

HAL库在这个函数中存在错误:
HAL_StatusTypeDef HAL_OSPI_Init (OSPI_HandleTypeDef *hospi)

      MODIFY_REG(hospi->Instance->DCR1,
                 (OCTOSPI_DCR1_MTYP | OCTOSPI_DCR1_DEVSIZE | OCTOSPI_DCR1_CSHT | OCTOSPI_DCR1_CKCSHT |
                  OCTOSPI_DCR1_FRCK | OCTOSPI_DCR1_CKMODE),
                 (hospi->Init.MemoryType | ((hospi->Init.DeviceSize - 1U) << OCTOSPI_DCR1_DEVSIZE_Pos) |
                  ((hospi->Init.ChipSelectHighTime - 1U) << OCTOSPI_DCR1_CSHT_Pos) |
                  (hospi->Init.ClkChipSelectHighTime << OCTOSPI_DCR1_CKCSHT_Pos) | hospi->Init.ClockMode));

替换成

      /* Configure memory type, device size, chip select high time, clocked chip select high time, delay block bypass, free running clock, clock mode */
      MODIFY_REG(hospi->Instance->DCR1,
                 (OCTOSPI_DCR1_MTYP   | OCTOSPI_DCR1_DEVSIZE | OCTOSPI_DCR1_CSHT | OCTOSPI_DCR1_CKCSHT |
                  OCTOSPI_DCR1_DLYBYP | OCTOSPI_DCR1_FRCK    | OCTOSPI_DCR1_CKMODE),
                 (hospi->Init.MemoryType | ((hospi->Init.DeviceSize - 1U) << OCTOSPI_DCR1_DEVSIZE_Pos) |
                  ((hospi->Init.ChipSelectHighTime - 1U) << OCTOSPI_DCR1_CSHT_Pos) |
                  (hospi->Init.ClkChipSelectHighTime << OCTOSPI_DCR1_CKCSHT_Pos) |
                  hospi->Init.DelayBlockBypass | hospi->Init.ClockMode));

问题就解决了。

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
配置STM32H7的RTC有两种方法,一种是使用HAL库,另一种是直接使用寄存器编程。在这里,我将介绍如何使用HAL库来配置RTC。 1. 首先,在CubeMX中启用RTC并生成代码。 2. 在main.c文件中,找到以下函数: ```c void HAL_RTC_MspInit(RTC_HandleTypeDef* rtcHandle) ``` 在这个函数中,你需要初始化RTC时钟,启用RTC和备份域访问。在这里,我们使用LSE作为RTC时钟源。示例代码如下: ```c void HAL_RTC_MspInit(RTC_HandleTypeDef* rtcHandle) { RCC_OscInitTypeDef RCC_OscInitStruct = {0}; RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0}; /*##-1- Enables the PWR Clock and Enables access to the backup domain ###################################*/ /* To change the source clock of the RTC feature (LSE, LSI), You have to: - Enable the power clock using __HAL_RCC_PWR_CLK_ENABLE() - Enable write access using HAL_PWR_EnableBkUpAccess() function before to configure the RTC clock source (to be done once after reset). - Reset the Back up Domain using __HAL_RCC_BACKUPRESET_FORCE() and __HAL_RCC_BACKUPRESET_RELEASE(). - Configure the needed RTC clock source */ __HAL_RCC_PWR_CLK_ENABLE(); HAL_PWR_EnableBkUpAccess(); /*##-2- Configue LSE as RTC clock soucre ###################################*/ RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_LSE; RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE; RCC_OscInitStruct.LSEState = RCC_LSE_ON; if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) { Error_Handler(); } /*##-3- Configure the RTC clock source ###################################*/ PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_RTC; PeriphClkInitStruct.RTCClockSelection = RCC_RTCCLKSOURCE_LSE; if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK) { Error_Handler(); } /*##-4- Enable RTC peripheral Clocks #######################################*/ /* Enable RTC Clock */ __HAL_RCC_RTC_ENABLE(); /*##-5- Configure the NVIC for RTC TimeStamp ########################################*/ HAL_NVIC_SetPriority(TAMP_STAMP_IRQn, 0x0F, 0); HAL_NVIC_EnableIRQ(TAMP_STAMP_IRQn); } ``` 3. 在RTC初始化之前,你需要配置RTC的时钟和日期。这可以通过以下代码实现: ```c RTC_TimeTypeDef sTime = {0}; RTC_DateTypeDef sDate = {0}; /* Configure the RTC time */ sTime.Hours = 0; sTime.Minutes = 0; sTime.Seconds = 0; sTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE; sTime.StoreOperation = RTC_STOREOPERATION_RESET; if (HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BIN) != HAL_OK) { Error_Handler(); } /* Configure the RTC date */ sDate.WeekDay = RTC_WEEKDAY_MONDAY; sDate.Month = RTC_MONTH_JANUARY; sDate.Date = 1; sDate.Year = 0; if (HAL_RTC_SetDate(&hrtc, &sDate, RTC_FORMAT_BIN) != HAL_OK) { Error_Handler(); } ``` 4. 最后,你需要启用RTC中断。这可以通过以下代码实现: ```c /* Enable the RTC global Interrupt */ HAL_NVIC_SetPriority(RTC_Alarm_IRQn, 0x0F, 0); HAL_NVIC_EnableIRQ(RTC_Alarm_IRQn); ``` 5. 现在你已经完成了RTC的配置。你可以使用HAL库函数来读取和写入当前时间和日期,例如: ```c RTC_TimeTypeDef sTime = {0}; RTC_DateTypeDef sDate = {0}; /* Get the RTC current Time */ HAL_RTC_GetTime(&hrtc, &sTime, RTC_FORMAT_BIN); /* Get the RTC current Date */ HAL_RTC_GetDate(&hrtc, &sDate, RTC_FORMAT_BIN); /* Display time Format : hh:mm:ss */ printf("Time: %02d:%02d:%02d\r\n", sTime.Hours, sTime.Minutes, sTime.Seconds); /* Display date Format : dd-mm-yy */ printf("Date: %02d-%02d-%02d\r\n", sDate.Date, sDate.Month, 2000 + sDate.Year); ``` 希望这可以帮助你配置STM32H7的RTC。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值