目录
- 普冉PY32系列(一) PY32F0系列32位Cortex M0+ MCU简介
- 普冉PY32系列(二) Ubuntu GCC Toolchain和VSCode开发环境
- 普冉PY32系列(三) PY32F002A资源实测 - 这个型号不简单
- 普冉PY32系列(四) PY32F002A/003/030的时钟设置
- 普冉PY32系列(五) 使用JLink RTT代替串口输出日志
- 普冉PY32系列(六) 通过I2C接口驱动PCF8574扩展的1602LCD
- 普冉PY32系列(七) SOP8,SOP10,SOP16封装的PY32F002A/PY32F003管脚复用
- 普冉PY32系列(八) GPIO模拟和硬件SPI方式驱动无线收发芯片XN297LBW
- 普冉PY32系列(九) GPIO模拟和硬件SPI方式驱动无线收发芯片XL2400
- 普冉PY32系列(十) 基于PY32F002A的6+1通道遥控小车I - 综述篇
- 普冉PY32系列(十一) 基于PY32F002A的6+1通道遥控小车II - 控制篇
- 普冉PY32系列(十二) 基于PY32F002A的6+1通道遥控小车III - 驱动篇
- 普冉PY32系列(十三) SPI驱动WS2812全彩LED
- 普冉PY32系列(十四) 从XL2400迁移到XL2400P
- 普冉PY32系列(十五) PY32F0系列的低功耗模式
如同 STM32F103C8T6 与 CBT6 有着同样的128K flash容量一样, 市面上很多芯片, 同一系列的多个型号其实底下使用的是相同的硬件, 只是通过软件, 芯片ID, 某些隐藏寄存器(例如AIR32F103)或者物理熔断对容量进行限制. 让我们看一看 PY32F002AF15P 这颗标称 20K Flash, 3K RAM 的芯片还隐藏着哪些资源.
声明
任何在厂家数据手册之外的资源都是无保证的, 本文的内容仅对当前测试中使用的样品有效, 请勿以此作为选型参考, 一切以厂家手册为准. 因此产生的任何问题本人概不负责.
PY32F002A 的 RAM
当前样品的型号是 PY32F002AF15P, TSSOP20封装, 因为内存容量的检测只涉及代码修改, 对这片 PY32F002AF15P 进行了内存可用容量的测试
- 修改ld文件, 将内存设为 4KB, 写入成功, 读取成功
- 修改ld文件, 将内存设为 5KB, 无法启动
- 修改ld文件, 将内存设为 4196, 无法启动
实际上直接可用的内存为 4KB
PY32F002A 的 Flash
测试用的是 JLink, 修改 Flash 容量涉及到 Device 文件的修改, 首先修改 /opt/SEGGER/JLink/JLinkDevices.xml, 将 PY32F002AX5 的配置调整为32K Flash, 4K RAM
<Device>
<ChipInfo Vendor="Puya" Name="PY32F002AX5" WorkRAMAddr="0x20000000" WorkRAMSize="0x1000" Core="JLINK_CORE_CORTEX_M0"/>
<FlashBankInfo Name="Flash_32K" BaseAddr="0x08000000" MaxSize="0x8000" Loader="Devices/Puya/PY32F0xx_32.FLM" LoaderType="FLASH_ALGO_TYPE_OPEN" AlwaysPresent="1"/>
</Device>
然后修改ld文件, 将flash也设为32K
MEMORY
{
RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 4K
FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 32K
}
在代码中构造一个巨大的数组将 32K 填满, 从末尾开始打印, 编译烧录
32K容量, 写入读取成功
再改为48K, 写入失败, 读取也失败
实际直接可用的Flash容量为 32KB
PY32F002A 的运行频率
因为 PY32F002A 的库函数将最高频率限制在了24MHz, 而 PY32F003 没有PLL, HSI最高也只有24MHz, 既然 PY32F002A 可以使用 32K Flash + 4K RAM, 就直接将库参数修改为了 PY32F030Fx6. 将运行频率设为16MHz, 同时开启 PLL.
结果运行正常. 此时系统频率为 32MHz.
进一步将 HSI 设为 24MHz, 保持 PLL 开启, 也运行正常, 此时系统频率为 48MHz.
clk:48000000 flash:96 ram:de 8c 96␍␊
clk:48000000 flash:8c ram:8c 96 8c␍␊
clk:48000000 flash:64 ram:96 8c 64␍␊
clk:48000000 flash:4e ram:8c 64 4e␍␊
clk:48000000 flash:63 ram:64 4e 63␍␊
clk:48000000 flash:e6 ram:4e 63 e6␍␊
运行半小时, 没有任何问题.
可见当前这片 PY32F002AF15P 支持PLL, 实际直接可用的系统内置时钟为 48MHz, 如果使用外置晶振, 频率也许能更高
PY32F002A 测试DMA
运行SDK中 PY32F003 的 ADC_ContinousConversion_DMA 示例代码, 可以正常运行
当前这片 PY32F002AF15P 支持DMA
测试代码
测试RAM, Flash 和 PLL 的代码已经放到 GitHub, 地址 https://github.com/IOsetting/py32f0-template/tree/main/Examples/HAL/Test/PY32F002A_32KF_4KR
结论
到这里, 这颗 PY32F002AF15P 是哪个型号的马甲已经有点眉目, 进一步可以继续校验其它几个关键外设: SPI2, LED.
更新 2023-02-12
从最近的测试看, 这颗 PY32F002AF15P 其实和 PY32F030 的外设是一样的, 按 PY32F030 的寄存器地址读写都有反应, 可能属于同一晶圆但是某些部分测试失败或者有缺陷而被区分打标的产品. 再进一步测试 PY32F003 系列的型号, 发现和 PY32F030 也一样. 所以对于这三个系列, 开发上就很简单了, 全部都用 PY32F030 的库函数就好了, 只需要区分Flash和RAM容量大小. 😄