AIR32F103(七) AIR32F103CBT6/CCT6啟用96K記憶體

来源:https://www.cnblogs.com/milton/archive/2022/12/25/17004589.html
-Advertisement-
Play Games

AIR32F103CBT6 和 AIR32F103CCT6 分別帶 32K Byte和 64K Byte 記憶體. 對於48pin封裝的 AIR32F103, 32K和64K的記憶體已經是市面上M3晶元中相當不錯的容量, 至於64pin封裝的AIR32F103RPT6, 96K的記憶體只在市場上的高端型號... ...


目錄

AIR32F103CBT6和CCT6的隱藏記憶體空間

TYPE AIR32F103CBT6 AIR32F103CCT6 AIR32F103RPT6
Flash 128K 256K 256K
RAM 32K 64K 96K
Pack lqfp48 lqfp48 lqfp64

根據數據手冊, AIR32F103CBT6 和 AIR32F103CCT6 分別帶 32K Byte和 64K Byte 記憶體. 對於48pin封裝的 AIR32F103, 32K和64K的記憶體已經是市面上M3晶元中相當不錯的容量, 至於64pin封裝的AIR32F103RPT6, 96K的記憶體只在市場上的高端型號中出現, 例如雅特力的AT32F403A系列.

但是實際上這兩個型號和 AIR32F103RPT6 一樣, 記憶體空間為96K.

這個隱藏的記憶體空間, 是 Hedley Rainnie 在觀察切換216MHz的過程中發現的. 這個容量也得到了合宙技術的確認.

具體的記錄可以查看 http://www.hrrzi.com/2022/12/the-air32f103.html. 在切換216MHz的過程中, 在將RCC->RCC_SYSCFG_CONFIG置零之前, 可以通過SYSCFG->SYSCFG_RSVD0[5]這個寄存器設置記憶體空間的結束地址. 將這個地址設為 0x20018000 後, 在代碼中就可以使用 96K Byte 的記憶體容量.

啟用隱藏記憶體的流程

查看代碼 https://gitee.com/openLuat/luatos-soc-air32f103/blob/master/Libraries/AIR32F10xLib/src/air32f10x_rcc_ex.c

切換216MHz的代碼

#define SysFreq_Set		(*((void (*)(uint32_t, FlashClkDiv , uint8_t, uint8_t))(*(uint32_t *)0x1FFFD00C)))

uint32_t AIR_RCC_PLLConfig(uint32_t RCC_PLLSource, uint32_t RCC_PLLMul, FlashClkDiv Latency)
{
	volatile uint32_t sramsize = 0;
	assert_param(IS_RCC_PLL_SOURCE(RCC_PLLSource));
	assert_param(IS_RCC_PLL_MUL(RCC_PLLMul));
	
	*(volatile uint32_t *)(0x400210F0) = BIT(0);//開啟sys_cfg門控
	*(volatile uint32_t *)(0x40016C00) = 0xa7d93a86;//解一、二、三級鎖
	*(volatile uint32_t *)(0x40016C00) = 0xab12dfcd;
	*(volatile uint32_t *)(0x40016C00) = 0xcded3526;
	// 這一步記錄了RAM大小
	sramsize = *(volatile uint32_t *)(0x40016C18);
	*(volatile uint32_t *)(0x40016C18) = 0x200183FF;//配置sram大小, 將BOOT使用對sram打開
	*(volatile uint32_t *)(0x4002228C) = 0xa5a5a5a5;//QSPI解鎖
	
	SysFreq_Set(RCC_PLLMul,Latency ,0,1);
	RCC->CFGR = (RCC->CFGR & ~0x00030000) | RCC_PLLSource;
	
	// 在這一步, 將之前的RAM大小再設置回去, 如果把這個sramsize直接改為 0x20018000, 就使得整個96K都可用了
	*(volatile uint32_t *)(0x40016C18) = sramsize;
	*(volatile uint32_t *)(0x400210F0) = 0;//開啟sys_cfg門控
	*(volatile uint32_t *)(0x40016C00) = ~0xa7d93a86;//加一、二、三級鎖
	*(volatile uint32_t *)(0x40016C00) = ~0xab12dfcd;
	*(volatile uint32_t *)(0x40016C00) = ~0xcded3526;
	*(volatile uint32_t *)(0x4002228C) = ~0xa5a5a5a5;//QSPI解鎖

	return 1;
}

上面的代碼用地址表示比較難閱讀, 能換成寄存器表達的都換成寄存器表達後, 看起來會簡單些

uint32_t AIR_RCC_PLLConfig(uint32_t RCC_PLLSource, uint32_t RCC_PLLMul, FlashClkDiv Latency)
{
    assert_param(IS_RCC_PLL_SOURCE(RCC_PLLSource));
    assert_param(IS_RCC_PLL_MUL(RCC_PLLMul));

    RCC->RCC_SYSCFG_CONFIG = 1;           // Unlock sys_cfg gate control
    SYSCFG->SYSCFG_LOCK = 0xa7d93a86;     // Unlock from level 1 to 3
    SYSCFG->SYSCFG_LOCK = 0xab12dfcd;
    SYSCFG->SYSCFG_LOCK = 0xcded3526;
    SYSCFG->SYSCFG_RSVD0[5] = 0x200183FF; // Set sram size, enable BOOT for sram
    *(__IO uint32_t *)(FLASH_R_BASE + 0x28C) = 0xa5a5a5a5; // Unlock QSPI

    AIR_SysFreq_Set(RCC_PLLMul, Latency, 0, 1);
    RCC->CFGR = (RCC->CFGR & ~0x00030000) | RCC_PLLSource;

    // Restore previous config
    SYSCFG->SYSCFG_RSVD0[5] = 0x20018000;
    RCC->RCC_SYSCFG_CONFIG = 0;           // Lock sys_cfg gate control
    SYSCFG->SYSCFG_LOCK = ~0xa7d93a86;    // Lock from level 1 to 3
    SYSCFG->SYSCFG_LOCK = ~0xab12dfcd;
    SYSCFG->SYSCFG_LOCK = ~0xcded3526;
    *(__IO uint32_t *)(FLASH_R_BASE + 0x28C) = ~0xa5a5a5a5;// Lock QSPI

    return 1;
}

測試 96K 記憶體的例子

測試96K記憶體的源代碼

DMA_TC_Interrupt_96k_Malloc 和 DMA_TC_Interrupt_96k_Static 這兩個示例分別演示動態和靜態使用超過64K記憶體的情況. 在運行這兩個例子前, 需要對項目代碼做一些調整

1. 編輯 Libraries/LDScripts/air32f103cbt6.ld 或 air32f103cct6

修改 RAM LENGTH 為 96K

MEMORY
{
  FLASH (rx)      : ORIGIN = 0x08000000, LENGTH = 256K
  RAM (xrw)       : ORIGIN = 0x20000000, LENGTH = 96K          <---- 修改這個值為 96K
  MEMORY_B1 (rx)  : ORIGIN = 0x60000000, LENGTH = 0K
}

2. 編輯 Libraries/AIR32F10xLib/src/system_air32f10x.c

確認啟用了 SYSCLK_FREQ_216MHz 這個巨集配置

//#define SYSCLK_FREQ_HSE    HSE_VALUE
//#define SYSCLK_FREQ_24MHz  24000000 
//#define SYSCLK_FREQ_36MHz  36000000
//#define SYSCLK_FREQ_48MHz  48000000
//#define SYSCLK_FREQ_56MHz  56000000
//#define SYSCLK_FREQ_72MHz  72000000
#define SYSCLK_FREQ_216MHz  216000000                          <---- 啟用這個配置

3. 動態和靜態申請

47000 個 uint16_t, 對應了 47K * 2 = 94K 記憶體

動態申請

#define BUFF_SIZE 47000
uint16_t *dma_buf;

...

dma_buf =  (uint16_t *)malloc(BUFF_SIZE * sizeof(uint16_t));
printf("Malloc size: %d\r\n", BUFF_SIZE * sizeof(uint16_t));

靜態申請

#define BUFF_SIZE 47000
uint16_t dma_buf[BUFF_SIZE];

需要確保在未完成記憶體容量設置前, 不要使用 dma_buf

最後

據說除了額外的RAM, 還有額外的FLASH, 但是我沒試成功, 在寫入flash後校驗不通過, 也可能我使用的姿勢不對.

原先AIR32F103CBT6只有32K記憶體, 不能跑Helix MP3解碼, 現在的96K記憶體足夠跑兩個, LOL


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Ruby是強類型動態語言,即Ruby中一旦某一個對象被定義類型,如果不通過強制轉換操作,那麼它永遠就是該數據類型,並且只有在Ruby解釋器運行時才會檢測對象數據類型,它的一切皆為對象(包括 nil 值對象),可以通過調用內置class屬性來獲取該對象的具體數據類型。對於 Ruby 而言,所有類型都繼 ...
  • JZ56 數組中只出現一次的兩個數字 題目 一個整型數組裡除了兩個數字只出現一次,其他的數字都出現了兩次。請寫程式找出這兩個只出現一次的數字 思路 演算法實現 既然有兩個數字只出現了一次,我們就統計每個數字的出現次數,利用哈希表的快速根據key值訪問其頻率值。 具體做法: step 1:遍曆數組,用哈 ...
  • 在VsCode中搭建C/C++運行環境需要先安裝以下插件 1、安裝c/c++插件 2、安裝code runner插件 當然也可以安裝一些其他的美化插件根據個人習慣,但是以上這兩個是必裝的。 安裝好插件後來到插件主頁點擊卸載旁邊的小齒輪選擇擴展設置 找到擴展設置中的下圖選項並打上勾即可,設置完後重啟V ...
  • 返回值類型後置語法,是為瞭解決函數返回值類型依賴於參數而導致難以確定返回值類型的問題。有了這種語法以後,對返回值類型的推導就可以用清晰的方式(直接通過參數做運算)描述出來,而不需要像 C++98/03 那樣使用晦澀難懂的寫法。 在泛型編程中,可能需要通過參數的運算來得到返回值的類型。比如如下的代碼: ...
  • 大家好,我是王有志,歡迎來到《Java面試都問啥?》的第一篇技術文章。 這個系列會從Java部分開始,接著是MySQL和Redis的內容,同時會繼續更新數據結構與演算法的部分,這樣在第一階段,我們就完成了面試“三幻神”的挑戰。 Java的部分從併發編程開始,接著是Java虛擬機,最後是集合框架。至於J ...
  • 一個簡單的C#實例。包括:GRPC文件的創建生成、服務端和客戶端函數類庫的封裝、創建服務端和客戶端調用測試。若有錯誤或更好的方法還請指正。 1、創建並生成GRPC服務文件 (1)打開vs2022,創建新項目控制台應用(其他應用好像不行)。 (2)需要安裝三個nuget包,如圖: (3)項目添加新建項 ...
  • 在前面隨筆介紹的基於SqlSugar的WInform端管理系統中,數據提供者是直接訪問資料庫的方式,不過窗體界面調用數據介面獲取數據的時候,我們傳遞的是標準的介面,因此可擴展性比較好。我曾經在隨筆《基於SqlSugar的開發框架循序漸進介紹(5)-- 在服務層使用介面註入方式實現IOC控制反轉》中介... ...
  • 在實際應用開發中,隨著項目業務逐漸複雜,耦合度會越來越高,維護成本也會直線上升,所以解耦也變得越來越重要。Prism框架為WPF開發中解耦提供了非常便捷的應用。今天主要以一個簡單的小例子,簡述WPF開發中Prism框架的簡單應用,如有不足之處,還請指正。 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...