很荣幸能参加此次测评活动


1. 芯片特性


ME32G030介绍

ME32G030系列是内嵌ARM Cortex-M0核的32位微控制器。该控制器具备有常用外设和功能,如高速12位的ADC转换器,UART串口,SPI接口,I2C总线接口,看门狗定时器(WDT),7个通用计数器/定时器。除此之外,ME32G030系列还支持马达控制功能,直流无刷电机控制PWM模块。

特性

高性能 32位 ARM CPU 内核

速度高达48Mhz 的ARM Cortex-M0 处理器

可嵌套中断向量控制器(NVIC)

32位硬件乘法器

24位系统嘀嗒定时器

DMA,支持外设到SRAM,SRAM到外设以及SRAM到SRAM操作

Flash 存储器

64K字节的用户程序空间

5K 字节启动程序

32位Flash数据总线,支持高性能应用要求

SRAM 存储器

内嵌8K 字节高速SRAM

16位PWM发生器

8通道PWM输出

自动死区插入

基于硬件的保护系统

内嵌系统引导程序(bootloader)

?支持Flash存储器In-System-Program (ISP) 、 In-Application-Program (IAP)和In-Ciruits-Program (ICP)

?支持用户程序保护和加密

灵活的时钟单元

多个时钟源

内置48 MHz精度 1% 的内部高速振荡器,用户可调

内置32KHz 看门狗振荡器RTC32K外部晶振

内置24位计数器,用于实时计时和产生定时中断

定时器/计数器

4个基础定时器/计数器和2个增强型定时器/计数器

基础定时器/计数器支持匹配中断功能和2路互补的PWM输出

基础定时器/计数器支持标准红外载波输出

增强型定时器/计数器支持匹配和捕获中断功能

增强型定时器/计数器支持边沿计数,门控计数, AB相正交计数,触发计数,符号计数和3路PWM输出

模拟外设

12位 1MHz SAR ADC 转换器

8个通道AD

支持软件和硬件AD转换触发模式

2个比较器,8路输入,2个输出

丰富的通信接口和通用输入/输出端口(GPIO)

4个具备16字节FIFO 的串口通信模块,支持硬件握手(RTS/CTS)同时支持IrDA 协议

2个扩展的 SPI接口,支持多种协议

2个I2C接口

44个高速GPIO接口

电源管理

省电模式:睡眠模式,深度睡眠和掉电模式

通过4路WAKEUP管脚从掉电模式中唤醒

深度睡眠可以提供WDT/RTC定时中断唤醒

支持欠压检测(BOD),两组可配置电压检测点可分别产生欠压中断和强制复位

支持上电复位(POR)

集成的电源管理单元(PMU)

工作温度范围

工业级 (-40°C ~ +85°C)

扩展级 (-40°C ~ +105°C)

唯一的产品序列号

2.0V~5.5 V 宽压工作范围

48/32/20管脚LQFP/QFN/TSSOP封装

2. 环境搭建

keil 的环境包

https://download.csdn.net/download/xinshuwei/90762095

官网没有释放,都是百度网盘找到的,这个csdn 备份一个,keil 使用6.18 编译器以上


image.png


此次测评是基于systick 做delay 定时,然后通过gpio 操作来控制CH595 数据发送


此次使用的硬件8位数码管原理图

image.png

这里使用的是共阳数码管,发送数据表格如下

//共阳
  • uint8_t SegTab[]=
  • {
  • 0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90
  • };
  • 复制代码

    根据原理图

    段码表格如下

    uint8_t  posTab[8] = { 0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
    复制代码

    数码管模块和mcu 连接情况如下

    /************************
  • VCC------------>供电
  • DIO------------>PB15
  • RCLK------------>PB14  
  • SCLK------------>PB13  
  • GND------------>接地
  • **************************/
  • 复制代码

    整体发送流程是 第一个8bit 发送 数码管显示数据 ,第二个8bit 发送段位选择数据,最后产生rclk 跳变沿即可

    整体实现代码如下

    void send595(uint8_t byte)
  • {

  •         uint8_t byteData = byte;
  •         uint8_t i =0;
  •         for(;i<8;i++)
  •         {
  •                 DIO = byteData>>7;
  •                 byteData<<=1;
  •                 S_CLK =1;
  •                 delay_us(1);
  •                 S_CLK =0;
  •         }
  • }

  • void send_data(uint8_t num,uint8_t point)
  • {
  •         uint8_t value;
  •         value = point? SegTab[num]&0x7F:SegTab[num];
  •         send595(value);
  • }
  • void send_pos(uint8_t pos)
  • {
  •         if(pos>8)
  •         {
  •                 return;
  •         }
  •         uint8_t value = posTab[pos];
  •         send595(value);
  • }
  • void numdisplay(uint8_t num,uint8_t pos)
  • {
  •         send_data(num,0);
  •         send_pos(pos);
  •         R_CLK =1;
  •         delay_us(1);
  •         R_CLK =0;
  • }
  • 复制代码


    延迟实现过程如下:

    1.systick 初始化  ,这里使用100us 中断装载值

            SysTick_Config(SystemCoreClock/20000); //2000--1ms  20000--100us
  •         SysTick->CTRL  &=~ SysTick_CTRL_CLKSOURCE_Msk;
  • 复制代码

    2.当触发系统中断值时,进行计数操作

    //SystemTick handler
  • void SysTick_Handler()                //every 10mS
  • {

  •                 //PB->NOT_b.NOT12 =1;
  •           if(TimingDelay!=0x00)
  •                 {
  •                         TimingDelay --;
  •                 }
  •                
  • }
  • 复制代码