ME32G030 系列是内嵌 ARM Cortex™ M0 核的 32 位微控制器。 该控制器具备有常用外设和功能,如高速 12 位的 ADC 转换器,UART 串口,SPI 接口,I2C 总线接口,看门狗定时器( WDT),7 个通用计数器/定时器和 24 位 RTC。除此之外,ME32G030系列还支持马达控制功能,直流无刷电机控制 PWM 模块。可以替换STM32F1G0系列。
主要特点:
内核与主频:采用ARM Cortex-M0内核,主频最高可达48MHz,具备可嵌套中断向量控制器(NVIC)和32位硬件乘法器,能够高效处理实时任务。
存储资源:配备64KB用户程序空间和5KB启动程序,内嵌8KB高速SRAM,满足中等规模嵌入式应用的存储需求。
外设接口:集成12位ADC转换器(支持12个外部输入通道)、4个UART串口、2个SPI接口、2个I2C总线接口、看门狗定时器(WDT)及7个通用计数器/定时器,支持马达控制和直流无刷电机控制PWM模块。
电源与温度:采用2.0V~5.5V宽工作电压,工作温度范围为-40°C至+85°C,适应多种工业环境。
低功耗与安全:提供多种功耗模式选择,支持BOD(Brown-Out Reset,欠压复位)功能,增强系统稳定性。
资料:https://pan.baidu.com/s/1SJxSOUxW8at4NxEcjggahA 提取码:6967
安装CPU支持包,找到G030系列,下载:
本次测试使用DMA传输ADC转换数据,并使用UART将数据上传到上位机;
进入 main函数首先将系统时钟set system clk 设置为 48M
SYS_SetAHBClkDivider (1);
PA0_INIT (PA0_ADC0);
PA1_INIT (PA1_ADC1);
初始化ADC引脚功能,要注意初始化代码和stm32库很不一样,需要查看ioconfig.h文件
#define PA0_GPIO 0x290 //Select function PA0
#define PA0_SPI1_SCK 0x291 //Select function SPI1_SCK
#define PA0_UART1_CTS 0x292 //Select function UART1_CTS
#define PA0_CTIM0_CAP0 0x293 //Select function CTIM0_CAP0
#define PA0_CTIM0_MAT0 0x294 //Select function CTIM0_MAT0
#define PA0_UART3_TX 0x295 //Select function UART3_TX
#define PA0_CMP0_OUT 0x296 //Select function CMP0_OUT
#define PA0_ADC0 0x187 //Select function ADC0
#define PA0_CMP_IN0 0x187 //Select function CMP_IN0
#define PA0_INIT(PA0_function) IOCON->PA0 = PA0_function
#define PA0_PULLUP(enable) IOCON->PA0_b.PUE = enable
#define PA0_PULLDOWN(enable) IOCON->PA0_b.PDE = enable
接下来完成ADC模块初始化:
ADC_Init(300000,INTERNALVDDGND); // 配置转换速度和参考电压
ADC_SetTrigger(ADC_START_BY_BTIM0_MAT,0);//设置启动信号为定时器0
ADC_SetupChannels(AD0|AD1|AD2|AD3|AD4|AD5|AD6|AD7,TRIGGERMODE);
ADC->CR_b .DMAEN =1; //使能 DMA
然后设置DMA:
DMA_Init(mydmactrl);
DMA_Channel_CFG(mydmactrl,DMA_CHN_ADC,128,DMA_HALF_WORD,(uint32_t) &(ADC->GDR),(uint32_t)adcdata0,DMA_ADDR_FIXED,DMA_ADDR_INC);
// mydmactrl[DMA_CHN_ADC].SRC_END_PTR = (uint32_t) &(ADC->GDR); 设置数据源
// mydmactrl[DMA_CHN_ADC].DES_END_PTR = (uint32_t) &adcdata[31];设置目标
// mydmactrl[DMA_CHN_ADC].CHNL_CTRL_b.cycleCtrl =1;
// mydmactrl[DMA_CHN_ADC].CHNL_CTRL_b.srcSize =1;
// mydmactrl[DMA_CHN_ADC].CHNL_CTRL_b.srcInc = 3; //地址不变
// mydmactrl[DMA_CHN_ADC].CHNL_CTRL_b.dstSize = 1;
// mydmactrl[DMA_CHN_ADC].CHNL_CTRL_b.dstInc =1;
// mydmactrl[DMA_CHN_ADC].CHNL_CTRL_b.nMinus1 = 7;
DMA_Channel_Enable(DMA_CHN_ADC,DMA_INITIAL_PRIORITY,DMA_CHN_INT_ENABLE);
NVIC_EnableIRQ(DMA_IRQn);//使能DMA中断
设置定时器频率并启动定时器工作
BTIM_Init(BTIM0, 2000000); //initial timer count clock as 10K
BTIM_ConfigMatch1(BTIM0,2, TIM_MATCH_RESET_COUNTER|TIM_MATCH_TRIGGER_INT );
TIM_START(BTIM0);
接着设置UART
//初始化引脚
PA9_INIT(PA9_UART0_TX);
PA10_INIT(PA10_UART0_RX);
//配置UART工作方式
UART_Open(UART0,115200,UART_NO_PARITY,UART_TRIGGER_LEVEL_1_BYTE);
UART_Send(UART0,"DMA START\n",10);
在循环中不断发送数据:
UART_Send(UART0,"DMA START\n",10);
UART_PutHex (UART0,(uint32_t)adcdata0);
编写DMA中断函数:
void DMA_IRQHandler(void)
{DMA->CHNL_IRQ_STATUS = 1<<DMA_CHN_ADC;
if (curpangpan==0)
{DMA_Channel_CFG(mydmactrl,DMA_CHN_ADC,128,DMA_HALF_WORD,(uint32_t) &(ADC->GDR),(uint32_t)adcdata1,DMA_ADDR_FIXED,DMA_ADDR_INC);
curpangpan=1;}else
{DMA_Channel_CFG(mydmactrl,DMA_CHN_ADC,128,DMA_HALF_WORD,(uint32_t) &(ADC->GDR),(uint32_t)adcdata0,DMA_ADDR_FIXED,DMA_ADDR_INC);
curpangpan=0;}
DMA_Channel_Enable(DMA_CHN_ADC,DMA_INITIAL_PRIORITY,DMA_CHN_INT_ENABLE);}
仿真调试结果如下,截图中有串口接收数据和调试中ADC结果:
硬件接线如图: