设为首页 加入收藏

TOP

AIR32F103(七) AIR32F103CBT6/CCT6启用96K内存(一)
2023-07-23 13:31:14 】 浏览:103
Tags: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 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 previo
首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇痞子衡嵌入式:低功耗&高性能边缘.. 下一篇痞子衡嵌入式:探讨i.MXRT下FlexS..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目