灵动微EVB-L0136开发板SLCD显示ADC1 mV测试值和退出Flash读保护的介绍

分享作者:wechat_17663222818
评测品牌:灵动微电子
评测型号:MM32EVBL0136
申请理由(产品应用):1.产品OWI,I2C,SPI通讯,读取和写传感器产品内部寄存器的值; 2.检测TTL通讯hardbin的电平是否正确; 3.连接AD7606等芯片采集高精度的电压值。
发布时间:2024-11-19 09:57:05
0
概要
10月下旬申请的灵动微EVB-L0136开发板收到了,包装和做工都非常Nice!这块板子最吸引人注意的就是它的SLCD屏幕了,网上的论坛和分享的教程啥的都没有具体驱动这块屏幕程序的介绍。这次有机会拿到这块板子,把自己实验出来的记录下来,希望后面难道这块板子或者这块SLCD屏幕的人可以有所借鉴。
开源口碑分享内容

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和灵动微开发板。

全部评论
暂无评论
0/144