日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

STM32 之七 备份域(备份寄存器、备份SRAM)详解及数据丢失问题处理

發布時間:2024/10/14 编程问答 90 豆豆
生活随笔 收集整理的這篇文章主要介紹了 STM32 之七 备份域(备份寄存器、备份SRAM)详解及数据丢失问题处理 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

某些STM32芯片提供了備份SRAM,例如STM32F系列芯片有4K的備份SRAM。然而在使用過程中發現備份區域數據丟失!下面從STM32系列芯片提供的整個備份域來看看啥情況。

電池備份域

??首先,這部分在參考手冊的電源(PWR)章節有詳細的介紹。器件的工作電壓 (VDD) 要求介于 1.8 V 到 3.6 V 之間。嵌入式線性調壓器用于提供內部 1.2 V數字電源。當主電源 VDD 斷電時,可通過 VBAT 電壓為實時時鐘 (RTC)、RTC備份寄存器 和 備份 SRAM(BKP SRAM) 供電。具體如下圖:

手冊中有許多對于使用芯片時對于電源部分設計的要求,例如引腳的使用、電流的要求等等,具體見手冊!

備份域訪問

??復位后,備份域(RTC 寄存器、RTC 備份寄存器和備份 SRAM)將受到保護,以防止意外的寫訪問。要使能對備份域的訪問,請按以下步驟進行操作:

訪問 RTC 和 RTC 備份寄存器

  • 將 RCC_APB1ENR 寄存器中的 PWREN 位置 1,使能電源接口時鐘(分別參見手冊第 6.3.15 節和第 6.3.16 節了解 STM32F405xx/07xx 和 STM32F415xx/17xx 和 STM32F42xxx 和 STM32F43xxx)
  • 將用于 STM32F405xx/07xx 和 STM32F415xx/17xx 的 PWR 電源控制寄存器 (PWR_CR)和 用于STM32F42xxx 和 STM32F43xxx 的 PWR 電源控制寄存器 (PWR_CR) 中的 DBP 位置 1,使能對備份域的訪問
  • 選擇 RTC 時鐘源:參見手冊第 6.2.8 節:RTC/AWU 時鐘
  • 通過對 RCC 備份域控制寄存器 (RCC_BDCR) 中的 RTCEN [15] 位進行編程,使能 RTC 時鐘
  • 訪問備份 SRAM

  • 將 RCC_APB1ENR 寄存器中的 PWREN 位置 1,使能電源接口時鐘(分別參見手冊第 6.3.15 節和第 6.3.16 節了解 STM32F405xx/07xx 和 STM32F415xx/17xx 和 STM32F42xxx 和 STM32F43xxx)。
  • 將用于 STM32F405xx/07xx 和 STM32F415xx/17xx 的 PWR 電源控制寄存器 (PWR_CR) 和用于STM32F42xxx 和 STM32F43xxx 的 PWR 電源控制寄存器 (PWR_CR) 中的 DBP 位置 1,使能對備份域的訪問。
  • 通過將 RCC AHB1 外設時鐘使能寄存器 (RCC_AHB1ENR) 中的 BKPSRAMEN 位置 1,使能備份 SRAM 時鐘。
  • 想要訪問備份域還是非常簡單的,下面以訪問備份SRAM為例,從代碼角度說明一下(具體見注釋即可):

    /*** @brief (使用標準外設庫)備份SRAM初始化* @param[in] void* @retval NULL*/ static void vBkpSramInit(void) {/* 電源接口時鐘使能 (Power interface clock enable) */RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);/* DBP 位置 1,使能對備份域的訪問 */PWR_BackupAccessCmd(ENABLE);/* 通過將 RCC AHB1 外設時鐘使能寄存器 (RCC_AHB1ENR) 中的 BKPSRAMEN 位置 1, 使能備份 SRAM 時鐘 */RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_BKPSRAM, ENABLE);/* 應用程序必須等待備份調壓器就緒標志 (BRR) 置 1,指示在待機模式和 VBAT 模式下會保持寫入 RAM 中的數據。 */while(PWR_GetFlagStatus(PWR_FLAG_BRR) != SET); }/** (使用HAL庫)備份SRAM初始化* * @param[in] NULL* @retval Null **/ void BKP_SRAM_Init(void) {/* 電源接口時鐘使能 (Power interface clock enable) */__HAL_RCC_PWR_CLK_ENABLE();/* DBP 位置 1,使能對備份域的訪問 */HAL_PWR_EnableBkUpAccess();/* 通過將 RCC AHB1 外設時鐘使能寄存器 (RCC_AHB1ENR) 中的 BKPSRAMEN 位置 1, 使能備份 SRAM 時鐘 */__HAL_RCC_BKPSRAM_CLK_ENABLE();/* 應用程序必須等待備份調壓器就緒標志 (BRR) 置 1,指示在待機模式和 VBAT 模式下會保持寫入 RAM 中的數據。 */HAL_PWREx_EnableBkUpReg(); }

    經過以上初始化之后,就可以使用備份域中的各部分功能了(RTC和備份SRAM的初始化有些區別)。

    備份域的使用

    初始化后對于備份域中各功能(RTC、RTC備份寄存器、備份SRAM)的使用就比較靈活了。

    • RTC: 使用相對來說比較復雜,后面獨立介紹
    • RTC備份寄存器: 讀寫非常簡單,標準外設庫和HAL庫都提供了函數直接進行讀寫。
    /*----------------------------標準外設庫----------------------------*/ /*** @brief Writes a data in a specified RTC Backup data register.* @param RTC_BKP_DR: RTC Backup data Register number.* This parameter can be: RTC_BKP_DRx where x can be from 0 to 19 to * specify the register.* @param Data: Data to be written in the specified RTC Backup data register. * @retval None*/ void RTC_WriteBackupRegister(uint32_t RTC_BKP_DR, uint32_t Data) {__IO uint32_t tmp = 0;/* Check the parameters */assert_param(IS_RTC_BKP(RTC_BKP_DR));tmp = RTC_BASE + 0x50;tmp += (RTC_BKP_DR * 4);/* Write the specified register */*(__IO uint32_t *)tmp = (uint32_t)Data; } /*** @brief Reads data from the specified RTC Backup data Register.* @param RTC_BKP_DR: RTC Backup data Register number.* This parameter can be: RTC_BKP_DRx where x can be from 0 to 19 to * specify the register. * @retval None*/ uint32_t RTC_ReadBackupRegister(uint32_t RTC_BKP_DR) {__IO uint32_t tmp = 0;/* Check the parameters */assert_param(IS_RTC_BKP(RTC_BKP_DR));tmp = RTC_BASE + 0x50;tmp += (RTC_BKP_DR * 4);/* Read the specified register */return (*(__IO uint32_t *)tmp); }/*----------------------------HAL庫----------------------------*/ /*** @brief Writes a data in a specified RTC Backup data register.* @param hrtc: pointer to a RTC_HandleTypeDef structure that contains* the configuration information for RTC. * @param BackupRegister: RTC Backup data Register number.* This parameter can be: RTC_BKP_DRx where x can be from 0 to 19 to * specify the register.* @param Data: Data to be written in the specified RTC Backup data register. * @retval None*/ void HAL_RTCEx_BKUPWrite(RTC_HandleTypeDef *hrtc, uint32_t BackupRegister, uint32_t Data) {uint32_t tmp = 0U;/* Check the parameters */assert_param(IS_RTC_BKP(BackupRegister));tmp = (uint32_t)&(hrtc->Instance->BKP0R);tmp += (BackupRegister * 4U);/* Write the specified register */*(__IO uint32_t *)tmp = (uint32_t)Data; } /*** @brief Reads data from the specified RTC Backup data Register.* @param hrtc: pointer to a RTC_HandleTypeDef structure that contains* the configuration information for RTC. * @param BackupRegister: RTC Backup data Register number.* This parameter can be: RTC_BKP_DRx where x can be from 0 to 19 to * specify the register. * @retval Read value*/ uint32_t HAL_RTCEx_BKUPRead(RTC_HandleTypeDef *hrtc, uint32_t BackupRegister) {uint32_t tmp = 0U;/* Check the parameters */assert_param(IS_RTC_BKP(BackupRegister));tmp = (uint32_t)&(hrtc->Instance->BKP0R);tmp += (BackupRegister * 4U);/* Read the specified register */return (*(__IO uint32_t *)tmp); }
    • 備份SRAM: 這部分的使用就更加靈活了,可以直接當內存去訪問。推薦一種使用分散加載文件進行訪問的方式。具體為定義自己的結構體,使用結構體定義變量BKP_SRAM myContent __attribute__((section("BKP_SRAM_SECTION")));,最后使用分散加載文件,將以上定義的變量直接映射到備份SRAM即可。
    ; ************************************************************* ; *** Scatter-Loading Description File generated by uVision *** ; *************************************************************LR_IROM1 0x08000000 0x0000C000 { ; load region size_regionER_IROM1 0x08000000 0x0000C000 { ; load address = execution address*.o (RESET, +First)*(InRoot$$Sections).ANY (+RO)}RW_IRAM1 0x20000000 0x00020000 { ; RW data.ANY (+RW +ZI)}RW_BkSRAM 0x40024000 0x1000 {*.o (BKP_SRAM_SECTION, +First) ; 備份SRAM} }

    備份SRAM問題

    在實際產品中使用時,發現備份SRAM中的數據丟失!檢查在硬件上并沒有出現任何問題,于是從軟件一步步分析如下:

  • 產品( 使用STM32F407VG )中實現了IAP、APP在線升級,備份域在這兩部程序中均有使用(兩部分程序中均對備份域進行了初始化)。
  • 在由IAP跳轉到APP后,發現在APP中初始化的備份SRAM中原有數據全部丟失( 準確的說應該是時鐘不起作用,導致數據全是 0,看似數據丟失
  • 分析原因,STM32芯片在上電后默認以內部低速時鐘源(HSI運行),如果用戶配置了使用外部時鐘源,則再配置外部時鐘源,然后將時鐘切換為外部。程序在APP中配置時鐘前是正常的,一旦時鐘源出現切換則導致備份域再次初始化之后就無效了!感覺應該是 備份域的各種初始化必須在時鐘初始化之后再進行配置才可以,顛倒順序將導致備份域時鐘初始化后不可用! 但是,其他外設(例如GPIO,同是掛在AHP總線上)卻不受以上限制,比較奇怪!
  • 解決

    ??在IAP跳轉到APP前,將備份域的各時鐘失能,這樣APP中配置的備份SRAM才會有效。

    后續

    后續可以測試一下其他外設是否有此問題。最好測試一下同樣是掛在同一總線下的外設(GPIO、DMA、備份域時鐘全部是在AHB總線下的)。

    總結

    以上是生活随笔為你收集整理的STM32 之七 备份域(备份寄存器、备份SRAM)详解及数据丢失问题处理的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 狠狠人妻久久久久久综合蜜桃 | 精品无码一区二区三区 | 成人国产精品蜜柚视频 | 99久久这里只有精品 | 成人观看网站 | 亚洲乱色熟女一区二区三区 | 村上凉子av | 久久精品h | 欧美精品在线一区二区 | 日韩毛片在线播放 | 国产激情一区二区三区在线观看 | av在线精品 | 久久久久久久无码 | 婷婷俺去也 | 欧美精品一区二区久久婷婷 | 男女日批在线观看 | 国产又黄又猛又爽 | 在线免费看mv的网站入口 | 在线成人中文字幕 | 综合在线亚洲 | 亚洲精品国产精品乱码不卡 | 可以免费看的黄色 | 伊人影院av | 播放美国生活大片 | 日本免费在线观看视频 | 九九久久精品视频 | 久人人 | 又嫩又硬又黄又爽的视频 | 亚洲中文字幕无码不卡电影 | 综合精品在线 | 自拍偷拍精品视频 | 亚欧毛片| 黄色a级片网站 | 一卡二卡三卡四卡 | 五月天婷婷在线播放 | 风间由美一二三区av片 | 制服丝袜一区二区三区 | 视频成人免费 | 婷婷伊人综合 | 精品美女久久久 | 青草视频免费观看 | 97在线免费视频 | 91丨porny丨对白 | 在线a网 | 美女又爽又黄又免费 | 性生活av| 色国产在线 | 中文字幕 欧美日韩 | 日韩五码电影 | 天堂网av手机版 | 欧美三级视频在线 | 欧美50p| 国产精品7777 | 亚洲AV无码乱码国产精品色欲 | www.99精品| av资源免费看 | 久久久99精品国产一区二区三区 | 五月天六月婷婷 | 久久精品视频在线 | 91av麻豆| 精品黄网 | 日日射天天操 | 撸大师av | 欧美日韩成人 | 在线h网站| 国产情侣酒店自拍 | 久久受 | 在线观看www视频 | 老地方在线观看免费动漫 | 人人射av| 日韩av在线观看免费 | 黄色小视频免费观看 | 国产激情无套内精对白视频 | 久久久久久久极品内射 | 中文字幕欧美另类精品亚洲 | a v视频在线观看 | jzjzjzjzj亚洲成熟少妇 | 中文字幕美女 | 草草影院最新网址 | 亚洲高清无码久久 | 女人性做爰69片免费看 | 影音先锋制服丝袜 | 超碰77| 国产一区999 | 欧美黄视频在线观看 | 91高清视频在线观看 | 美女扒开腿让男人操 | 激情五月色播五月 | 老司机av网站| 国产精品成人网 | 成人动漫在线免费观看 | 欧美做受高潮1 | 亚洲一区二区影视 | 高潮无码精品色欲av午夜福利 | 72种无遮挡啪啪的姿势 | 国产精品电影网站 | 九九热最新 | 天天射天天 | 男女羞羞的视频 |