1.板卡介绍:

EVB-L0130属于MM32EVBoard系列开发板,板载芯片为MM32L0136C7P,带有丰富的外设资源:支持高达 4KV EFT 抗干扰能力、支持 SWD 下载调试接口、4个用户按键、1个复位按键、4个用户LED、2路UART 连接器、1个给开发板供电USB 连接器、1个8Mbit 的 SPI Flash 存储器、1个2048bit 的 I2C 存储器、4个功能选择开关(I2S或是LCD)、1个3.5mm 耳机插座,用于 I2SL/R 音频输出、1个无源扬声器、3路模拟输入电位器、1个板载段码 LCD显示屏……
2.下载程序推荐接口:

推荐使用4线的DAPLINK SW方式下载程序,使用普通的DAPLINK就能在keil MDK快速的调试和下载程序,下图黄色部分是上图粉色标识的CN7的DAPLINK引脚,紫色标识是官方程序使用的UART串口。官方ISP串口下载和ISP软件的文档看起来不是很清楚,试了下官方的ISP下载没成功,不推荐串口下载程序。
3.资料准备:
1、EVB-L0130开发板
2、WCH LINKE调试下载器
3、MDK 5.39
4、MindMotion.MM32L3xx_DFP.1.0.8.pack
5、LibSamples_MM32L0130_V0.10.4
6、UG_EVB-L0136_SC
4. SLCD显示ADC1测试值:
在正常安装MDK 5.39和MindMotion.MM32L3xx_DFP.1.0.8.pack安装完成之后,正常就可以对灵动微这块EVB-L0130板卡进行编写程序验证了。因为官方有比较好的外设示例文件LibSamples_MM32L0130_V0.10.4,可以快速的在这个示例程序修改移植。下图是官方的示例程序:

先看下SLCD的示例程序SLCD_Basic,SLD显示驱动主要在slcd_basic.c和slcd_basic.h这2个文件里面,SLCD这块屏幕可以显示的内容如下图所示,4个小数字,8
个大数字和红框标识的图标,小数点和时间:冒号等~

程序部分可以看出void SLCD_Basic_Sample(void)可以看出, Number1是显示4位小数字,Number1显示6位大数字,SLCD_DisplayNumber2(6 - strlen(Buffer) + i, Buffer[i], 0);这个位置可以减少6的值让显示的数字左移,如6改成4数字显示就会左移2位。
void SLCD_Basic_Sample(void)
{
static uint32_t Number1 = 0;
static uint32_t Number2 = 0;
static uint32_t Counter = 0;
char Buffer[10];
uint8_t i = 0;
printf("\r\nTest %s", __FUNCTION__);
SLCD_Configure();
while (1)
{
Number2 = (Number2 + 1) % 1000000;
sprintf(Buffer, "%d", Number2);
for (i = 0; i < strlen(Buffer); i++)
{
SLCD_DisplayNumber2(6 - strlen(Buffer) + i, Buffer[i], 0);
}
Counter++;
if ((Counter % 3) == 0)
{
SLCD_DisplayTool();
}
if ((Counter % 10) == 0)
{
Number1 = (Number1 + 1) % 10000;
sprintf(Buffer, "%d", Number1);
for (i = 0; i < strlen(Buffer); i++)
{
SLCD_DisplayNumber1(4 - strlen(Buffer) + i, Buffer[i], 0);
}
}
PLATFORM_LED_Toggle(LED1);
PLATFORM_DelayMS(100);
}
}
图标显示的函数如下,由于网上没有这块的介绍,于是就程序里面全局搜索T1,看这样的字符定义是什么?
void SLCD_DisplayTool(void)
{
static uint8_t State = 0;
char TAB[4] = "T1 ";
uint8_t COMn = 0xFF, SEGn = 0xFF;
SLCD_SearchName(TAB, &COMn, &SEGn);
if ((COMn != 0xFF) && (SEGn != 0xFF))
{
SLCD_WriteBit(COMn, SLCD_SCH[SEGn].Line, SLCD_SCH[SEGn].LineGroup, State);
}
State = (State + 1) % 2;
}
搜索T1,跳转到了如下的函数,可以试下把DP1,W5只有的值放入 char TAB[4] = " ";的 " "内编译程序看显现效果,图标,小数点和时间:冒号这些显示都是靠这些数组来实现的,下面是大概的对应关系,其他的部分可以试出来:
0-mV 1-N.m 2-kg 3-g 4-℃ 5-(配置) 6-(电池) 7-(小:) 8-(大:1) 9-(大:2)
{"S1 ", "S2 ", "S3 ", "S4 ", "S9 ", "T1 ", "W1 ", "C1 ", "C2 ", "C3 "};
DP1-9是小数点
const char SLCD_NAME_Table[SLCD_COM_NUMBER][SLCD_SEG_NUMBER][4] =
{
{ "1D ", "DP1", "2D ", "DP2", "3D ", "DP3", "4D ", "C1 ", "C2 ", "W5 ", "L1 ", "5F ", "5A ", "6F ", "6A ", "7F ", "7A ", "S4 ", "S5 ", "8F ",
"8A ", "9F ", "9A ", "10F", "10A" },
{ "1E ", "1C ", "2E ", "2C ", "3E ", "3C ", "4E ", "4C ", "C3 ", "W4 ", "L2 ", "5G ", "5B ", "6G ", "6B ", "7G ", "7B ", "S3 ", "S6 ", "8G ",
"8B ", "9G ", "9B ", "10G", "10B" },
{ "1G ", "1B ", "2G ", "2B ", "3G ", "3B ", "4G ", "4B ", "T1 ", "W3 ", "L3 ", "5E ", "5C ", "6E ", "6C ", "7E ", "7C ", "S2 ", "S7 ", "8E ",
"8C ", "9E ", "9C ", "10E", "10C" },
{ "1F ", "1A ", "2F ", "2A ", "3F ", "3A ", "4F ", "4A ", "W1 ", "W2 ", "L4 ", "5D ", "DP5", "6D ", "DP6", "7D ", "DP7", "S1 ", "S8 ", "8D ",
"DP8", "9D ", "DP9", "10D", "S9 " },
了解了上面的内容,移植程序就非常简单了,main修改成如下,SLCD屏幕就可以显示ADC1的测试值,以mV为单位的测试值显示,并且显示mV这个单位,移植后的程序如附件。
float RVxVoltage[3];
static uint32_t Number1 = 0;
static uint32_t Number2 = 0;
static uint32_t Counter = 0;
char Buffer[10];
uint8_t i = 0;
int main(void)
{
PLATFORM_Init();
// SLCD_Basic_Sample();
printf("\r\nTest %s", __FUNCTION__);
ADC_Configure();
SLCD_Configure();
while (1)
{
if (SET == ADC_GetFlagStatus(ADC, ADC_FLAG_EOS))
{
ADC_ClearFlag(ADC, ADC_FLAG_EOS);
RVxVoltage[0] = (float)ADC_GetChannelConvertedValue(ADC, ADC_Channel_5) * (float)3.3 / (float)4096.0;
RVxVoltage[1] = (float)ADC_GetChannelConvertedValue(ADC, ADC_Channel_4) * (float)3.3 / (float)4096.0;
RVxVoltage[2] = (float)ADC_GetChannelConvertedValue(ADC, ADC_Channel_1) * (float)3.3 / (float)4096.0;
// Number2 = RVxVoltage[0];
// sprintf(Buffer, "%0.2f", Number2);
printf("\r\nRV1 Voltage = %0.2f \tRV2 Voltage = %0.2f \tRV3 Voltage = %0.2f\t", RVxVoltage[0], RVxVoltage[1], RVxVoltage[2]);
}
//大数字前3位显示ADC1
Number2 = RVxVoltage[0]*1000;
sprintf(Buffer, "%d", Number2);
for (i = 0; i < strlen(Buffer); i++)
{
SLCD_DisplayNumber2(4 - strlen(Buffer) + i, Buffer[i], 0);
}
Counter++;
if ((Counter % 3) == 0)
{
SLCD_DisplayTool();
//PLATFORM_DelayMS(1000);
}
// //大数字后3位显示ADC2
// Number2 = RVxVoltage[1]*100;
// sprintf(Buffer, "%d", Number2);
// for (i = 0; i < strlen(Buffer); i++)
// {
// SLCD_DisplayNumber2(6 - strlen(Buffer) + i, Buffer[i], 0);
// }
// //小数字显示ADC3
// Number1 = RVxVoltage[2]*100;
//;
// sprintf(Buffer, "%d", Number1);
// for (i = 0; i < strlen(Buffer); i++)
// {
// SLCD_DisplayNumber1(4 - strlen(Buffer) + i, Buffer[i], 0);
// }
//
//
// Counter++;
// if ((Counter % 3) == 0)
// {
// SLCD_DisplayTool();
//
// }
}
}
5. 退出Flash读保护和解决Cannot enter Debug Mode:
A. 收到板子,下载了FLASH_MainFlash_ReadProtection这个程序,结果芯片读保护了,如下图!!!程序也没有介绍怎么退出读保护,怎么办? 直接到这个https://www.mindmotion.com.cn/products/mm32mcu/low_power/mm32l_low_power/mm32l0130/ 网址,按AN0005 芯片恢复出厂设置使用说明(中文版)这个文档在keil下把芯片恢复出厂设置就可以解除读保护;
B.除了遇到A这个问题点,使用的时候还遇到过Cannot enter Debug Mode这个报警,找了好多文档和在线搜索都没找到答案,最后想起来STM32遇到类似问题是Boot这个PIN接3.3V然后按住reset按键点击下载程序就解除了这个报警。于是查看PCB原理图PH0是Boot Pin,于是PH0接3.3V然后按住reset按键,点击下载程序就解决这个问题了;
拿到这块板子算是收获满满,学习掌握了SLCD的库函数驱动显示,FLASH读保护应用和解除,还有程序不能下载无法进入Debug模式可以BOOT接高电平解决。感谢ICeasy和灵动微开发板。


