学习国产MCU的开发--灵动微MM32G0001A6T
前段时间,因为看到灵动的促销,买了几片MM32G0001,两种封装的。一个是SOP8,型号是MM32G0001A6T,6个GPIO口;一种是TSSOP,型号是MM32G0001A1TC,20封装的,18个GPIO口。MM32G0001 系列微控制器是搭载Arm® Cortex®-M0 内核的RISC 处理器,最高工作频率可达 48MHz。内置16KB 高速存储器,并集成了丰富的 I/O 端口和外设模块。本产品包含 1 个 12 位的 ADC、1 个 16 位高级定时器、1 个 16 位通用定时器和 1 个 16 位基本定时器,还包含标准的通信接口:2 个 USART 接口、1 个 SPI 接口和 1 个 I2C 接口。工作电压为 2.0V ~ 5.5V。内置多种省电工作模式保证低功耗应用的要求。丰富的外设配置,非常适合于以下多种应用场合:
• 节点控制
• 无线充电
• 电机控制
• 玩具
• 照明电路
• 应急消防设备
• 8/16 位 MCU 升级
这次我以MM32G0001A6T作为学习对象。虽然MM32G0001A6T只是一个只有8个管脚的芯片,可它是拥有16KB Flash 存储器,2KB SRAM的32位微控制器,内嵌 48MHz HSI 高速振荡器和40KHz LSI 低速振荡器,有可编程电压监测器(PVD),有睡眠(Sleep)、停机(Stop)和深度停机(Deep Stop)三种低功耗模式。多达 4 个通信接口:2 个 USART 接口(支持 SPI 模式),1 个 I2C 接口,1 个 SPI 接口。1 个 12 位模数转换器(ADC),支持最快 1μs 转换时间(1MSPS 采样率),配置 8 个外部通道和 1 个可采集内置参考电压的内部通道。有CRC 计算单元,能进行串行调试(SWD接口)。这些功能比常用的51系列芯片,强大得可不是一点半点。
芯片外形如下:
由于是内部时钟,所以除了电源和地,剩下的所有引脚都可以作为GPIO使用,或者如引脚中的注释复用为对应的外设。芯片的的内部的功能框图如下,很简洁。
看看它的功能,再看看价格,你还想要啥自行车?顺便说一句,不算吐槽哈。我买的时候1.53元,现在只有0.73元,便宜如斯。简直是,哈哈哈哈,简直是没有简直了,泪眼朦胧中。真便宜啊!
总线矩阵包括一个 AHB 互联矩阵,一个 AHB 总线和一个桥接的 APB 总线。AHB 总线的外设(RCC,GPIO 和 CRC)通过 AHB 互联矩阵与系统总线连接。在 APB 和 AHB 总线之间连接通过 AHB2APB 桥进行数据交换。当 APB 寄存器进行 8 位 16 位访问,APB 会自动拓宽成 32 位,同样的,AHB2APB 桥也具备自动拓宽功能。
产品内置嵌套的向量式中断控制器,能够处理多个可屏蔽中断通道(不包括 16 个Cortex®-M0 的中断线) 和 4 个可编程优先级。中断返回时自动恢复,无需额外指令开销。
本产品除了LSI和HSI,可以使用外部时钟,通过PB0引入。
对于ADC处理,产品没有单独的 VDDA 引脚,VDDA 和 VDD 在芯片内部连接在一起,VDDA 为ADC、复位模块、振荡器和 PLL 的模拟部分供电。
本产品内部集成了上电复位(POR) / 掉电复位(PDR) 电路,该电路始终处于工作状态,保证系统供电超过 2.0V 时工作;当 VDD 低于设定的阈值(VPOR/PDR ) 时,置器件于复位状态。
器件中还有一个可编程电压监测器(PVD),它监视 VDD/VDDA 供电并与阈值 VPVD 比较,当 VDD 低于或高于阈值 VPVD 时产生中断,中断处理程序可以发出警告信息或将微控制器转入安全模式。PVD 功能需要通过程序开启。
产品支持低功耗模式,可以在要求低功耗、短启动时间和多种唤醒事件之间达到最佳的平衡。
1、睡眠模式
在睡眠模式,只有 CPU 停止,所有外设处于工作状态并可在发生中断/事件时唤醒 CPU。
2、停机模式
在保持 SRAM 和寄存器内容不丢失的情况下,停机模式可以达到较低的电能消耗。在停机模式下,HSI 的振荡器和 HSE 晶体振荡器被关闭。可以通过任一配置成 EXTI 的信号把微控制器从停机模式中唤醒,EXTI 信号可以是 16 个外部 I/O 口之一、PVD 的输出的唤醒信
号。
3、深度停机模式
与停机模式状态一致,但能够达到更低的电能消耗。
各低功耗模式下的外设状态如表所示。其中:
• Power Down 表示模块掉电,除 Flash 外数据均会丢失。
• Optional 表示外设可通过软件配置开启或关闭
• ON 表示工作
• OFF 表示功能关闭
• Retention 表示数据保留但无法操作
本产品包含 1 个高级定时器、1 个通用定时器、1 个基本定时器、1 个看门狗定时器和 1 个系统嘀嗒定时器。下表比较了高级控制定时器、通用定时器、基本定时器的功能:
高级控制定时器(TIM1)
高级控制定时器是由 16 位计数器、4 个比较通道以及三相互补 PWM 发生器组成,它具有带死区插入的互补 PWM 输出,还可以被当成完整的通用定时器。四个独立的通道可以用于:
• 输出比较
• 产生 PWM(边缘或中心对齐模式)
• 单脉冲输出
配置为 16 位通用定时器时,它与 TIM3 定时器具有相同的功能。配置为 16 位 PWM 发生器时,它具有全调制能力(0 ∼ 100%)。
很多功能都与通用的 TIM 定时器相同,内部结构也相同,因此高级控制定时器可以通过定时器链接功能与 TIM 定时器协同操作,提供同步或事件链接功能。
在调试模式下,计数器可以被冻结。
通用定时器(TIM3)
产品中内置了 1 个 16 位通用定时器(TIM3)。定时器有一个 16 位的自动加载递加/递减计数器、一个 16 位的预分频器和 4 个独立的通道,每个通道都可用于输入捕获、输出比较、PWM 和单脉冲模式输出。通用定时器还能通过定时器链接功能与高级控制定时器共同工作,提供同步或事件链接功能。
这些定时器还能够处理增量编码器的信号,也能处理 1 ~ 4 个霍尔传感器的数字输出。每个定时器都 PWM 输出或作为简单时间基准。在调试模式下,计数器可以被冻结。
基本定时器(TIM14)
产品中内置 1 个基本定时器(TIM14),每个定时器有一个 16 位计数器,支持自动重载,仅支持递增计数。定时器有一个 16 位预分频器和 1 个独立通道,每个通道可用于输入捕捉、输出比较、PWM 输出或单脉冲输出。
独立看门狗(IWDG)
独立的看门狗是基于一个 12 位的递减计数器和一个 8 位的预分频器,它由一个内部独立的 40KHz 的振荡器提供时钟。因为这个振荡器独立于主时钟,所以它可运行于停机和待机模式。它可以用在系统发生问题时复位整个系统或作为一个自由定时器为应用程序提供超时管理。通过选项字节可以配置成是软件或硬件启动看门狗。在调试模式下,计数器可以被冻结。
系统时基定时器(Systick)
这个定时器是专用于实时操作系统,也可当成一个标准的递减计数器。它具有下述特性:
• 24 位的递减计数器
• 自动重加载功能
• 当计数器为 0 时能产生一个可屏蔽系统中断
• 可编程时钟源
每个 GPIO 引脚都可以由软件配置成输出(推挽或开漏)、输入(带或不带上拉或下拉)或复用的外设功能端口。多数 GPIO 引脚都与数字或模拟的复用外设共用。在需要的情况下,I/O 引脚的外设功能可以通过一个特定的操作锁定,以避免意外的写入I/O 寄存器。
USART
本产品中内置 2 个通用同步/异步接收器/发送器(USART)接口。USART 为使用行业标准 NRZ 异步串行数据格式的外设提供全双工数据交换的灵活性。该模块可通过集成的波特率发生器支持广泛的波特率(包括整数和小数设置)。支持 LSB、MSB 收发模式,支持 8位或 9 位可编程数据长度,支持 0.5/1/1.5/2 位停止位配置。支持同步或异步单向通信和半双工单线通信。支持 SPI 模式。支持最高 6Mbps 波特率。
I2C
本产品中内嵌 1 个 I2C 接口,能够工作于多主模式或从模式,支持标准模式(100Kbps)和快速模式(400Kbps)。支持 7 位或 10 位寻址。
SPI
本产品中内嵌 1 个 SPI 接口。SPI 接口在从或主模式下,可配置成每帧 1 ∼ 32 位。主模式最大速率 24Mbps,从模式最大速率 12Mbps。
ADC
产品内嵌 1 个 12 位的模拟/数字转换器(ADC),支持高达 1Msps 转换速率,配置 8 个外部通道和 1 个内部通道。支持单次、单周期和连续扫描转换。支持任意序列采样模式,采样通道可按任意顺序排布。所有外部或内部转换通道都配备了独立的通道数据寄存器(共9 个)。内部通道用于采集内置参考电压,在应用中可根据采集的转换值推算芯片供电电
源的电压值。
模拟看门狗功能允许非常精准地监视一路或所有选中的通道,当被监视的信号超出预置的阈值时,将产生中断。
由通用定时器和高级控制定时器产生的事件,在芯片内部连接到 ADC 的触发源选择上,以实现精确的 ADC 采样时刻控制。
CRC
CRC(循环冗余校验)计算单元使用一个固定的多项式发生器,从一个 32 位的数据字产生一个 CRC 码。在众多的应用中,基于 CRC 的技术被用于验证数据传输或存储的一致性。在 EN/IEC60335-1 标准的范围内,它提供了一种检测闪存存储器错误的手段,CRC 计算单元可以用于实时地计算软件的签名,并与在链接和生成该软件时产生的签名对比。
SWD
内嵌 Arm 标准的两线串行调试接口(SW-DP)。
看完以上介绍,MM32G0001A6T是什么样的芯片、能干什么,在你心里是不是已经有了答案了?后面,我会按照自己的习惯,把学习这款芯片的开发经历,写成帖子发出来。让你和我这个菜鸟一起学习如何使用MM32G0001A6T。