目录

  • AIR32F103(一) 合宙AIR32F103CBT6开发板上手报告
  • AIR32F103(二) Linux环境和LibOpenCM3项目模板
  • AIR32F103(三) Linux环境基于标准外设库的项目模板
  • AIR32F103(四) 27倍频216MHz,CoreMark跑分测试
  • AIR32F103(五) FreeRTOSv202112核心库的集成和示例代码
  • AIR32F103(六) ADC,I2S,DMA和ADPCM实现的录音播放功能
  • AIR32F103(七) AIR32F103CBT6/CCT6启用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 controlSYSCFG->SYSCFG_LOCK = 0xa7d93a86;     // Unlock from level 1 to 3SYSCFG->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 QSPIAIR_SysFreq_Set(RCC_PLLMul, Latency, 0, 1);RCC->CFGR = (RCC->CFGR & ~0x00030000) | RCC_PLLSource;// Restore previous configSYSCFG->SYSCFG_RSVD0[5] = 0x20018000;RCC->RCC_SYSCFG_CONFIG = 0;           // Lock sys_cfg gate controlSYSCFG->SYSCFG_LOCK = ~0xa7d93a86;    // Lock from level 1 to 3SYSCFG->SYSCFG_LOCK = ~0xab12dfcd;SYSCFG->SYSCFG_LOCK = ~0xcded3526;*(__IO uint32_t *)(FLASH_R_BASE + 0x28C) = ~0xa5a5a5a5;// Lock QSPIreturn 1;
}

测试 96K 内存的例子

测试96K内存的源代码

  • GitHub https://github.com/IOsetting/air32f103-template/tree/master/Examples/NonFreeRTOS/DMA
  • Gitee https://gitee.com/iosetting/air32f103-template/tree/master/Examples/NonFreeRTOS/DMA

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 = 256KRAM (xrw)       : ORIGIN = 0x20000000, LENGTH = 96K          <---- 修改这个值为 96KMEMORY_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

AIR32F103(七) AIR32F103CBT6/CCT6启用96K内存相关推荐

  1. 为 SQL Server 启用 AWE 内存。

    今天突然想仔细了解下下AWE,所以微软的网站上查了查,顺便把查到的内容放到这里,嘿嘿嘿. 地址窗口化扩展插件 (AWE) 可以使 32 位操作系统访问大量内存.AWE 由操作系统提供,并且在 Micr ...

  2. 如何启用“锁定内存页”选项 (Windows)

    默认情况下,禁用 Windows 策略"锁定内存页"选项.必须启用此权限才能配置地址窗口化扩展插件 (AWE).此策略将确定哪些帐户可以使用进程将数据保留在物理内存中,从而阻止系统 ...

  3. 【linux】Valgrind工具集详解(七):Memcheck(内存错误检测器)

    一.概述 Memcheck是一个内存错误检测器.它可以检测C和C ++程序中常见的以下问题: 1.非法内存:如越界.释放后继续访问: 2.使用未初始化的值: 3.释放内存错误:如double-free ...

  4. 高性能网络编程(七)TCP连接的内存使用

    当服务器的并发TCP连接数以十万计时,我们就会对一个TCP连接在操作系统内核上消耗的内存多少感兴趣.socket编程方法提供了SO_SNDBUF.SO_RCVBUF这样的接口来设置连接的读写缓存,li ...

  5. android在哪存储当前用户名和密码,Android实战教程第七篇之如何在内存中存储用户名和密码...

    本文实例为大家分享了Android内存中存储用户名和密码的方法,供大家参考,具体内容如下 首先是配置文件: xmlns:tools="http://schemas.android.com/t ...

  6. webpack学习(七):启用 HMR(模块热替换)

    demo地址: https://github.com/Lkkkkkkg/webpack-demo 上次使用 webpack-dev-serve : https://blog.csdn.net/qq59 ...

  7. kubevirt(七)HugePages大页内存

    一.HugePages大页内存 1.1 物理内存与虚拟内存 物理内存 也称为实际内存或硬件内存,是计算机中实际安装的内存条的容量. 虚拟内存 是一种利用硬盘空间来扩展物理内存的技术,它允许计算机将暂时 ...

  8. 数据结构实验之排序七:选课名单(卡内存的一道题。。坑)

    RE... 带更正 #include<iostream> #include<algorithm> using namespace std; #include<cstdio ...

  9. AIR32F103(九) CAN总线的通信和ID过滤机制及实例

    目录 AIR32F103(一) 合宙AIR32F103CBT6开发板上手报告 AIR32F103(二) Linux环境和LibOpenCM3项目模板 AIR32F103(三) Linux环境基于标准外 ...

最新文章

  1. 【Java代码】反射机制处理传递给mapper文件的非Map类型参数对象(指定属性为空则设置默认值)
  2. 基础才是重中之重~再说面向接口的编程
  3. P4245-[模板]任意模数多项式乘法
  4. 洛谷 P2097 资料分发1
  5. laravel无法运行php,Laravel:php artisan服务无法启动
  6. 1016 部分A+B (15 分)—PAT (Basic Level) Practice (中文)
  7. 关于东南亚互联网市场的现状,有些问题得搞清楚
  8. TSF自定义候选词列表界面
  9. 用友U8来料检验单参照不到报检单
  10. USB、Mini-USB、Micro-USB接口的引脚定义
  11. 说点牛逼的“愿景,使命,目标,战略”
  12. redis实现分布式锁(乞丐版)
  13. ARM Cortex 详解
  14. 【转】鼠标右键多余菜单清理
  15. amcharts的使用介绍
  16. 苹果计算机安装应用软件,苹果Mac电脑怎么安装软件和卸载软件?
  17. AS400遇到的一些问题和解决办法
  18. uniApp 生成微信小程序图片上传提示 fail url not in domain list 的解决方法
  19. 如何将以前wm手机所备份的bkg文件导入android手机,【极光ROM】-【三星S20(国行/港版/台版/韩版/美版) G981X-高通865】-【V5.0 Android-Q-TI8】...
  20. 树莓派笔记1:树莓派4B+网线(无网线)+远程打印机+静态IP设置

热门文章

  1. 微信门户开发框架-使用指导说明书
  2. 听君一席话,胜读十年书
  3. 怎么看电脑支持多少兆网速_Win7系统下查看电脑宽带是多少兆的2个方法
  4. 什么才是程序员的内功心法?
  5. iOS15使用带Header的tableview 顶部出现空白问题
  6. dedecms教程:织梦所有实用标签调用方法搜集整理
  7. 基于聚类(Kmeans)算法实现客户价值分析系统(电信运营商)
  8. 重庆大学 计算机组成原理,计算机组成原理课程设计报告重庆大学
  9. 北京一卡通以35288.8529万元挂牌出让68.45%股权,溢价率为84%
  10. 离散数学·集合论【自然数和基数】