【国民技术低功耗系列N32L43x测评】03.首次驱动段码LCD屏,需要协助
<p>N32L43X系列的MCU带有Segment LCD的驱动器,最多可配置8个公共端子(COM)和44个区段端子(SEG),最多可驱动176(4*44)或者320(8*40)个LCD段位显示,具有如下特性:</p><ul>
<li>帧速率控制具有高度灵活性</li>
</ul>
<div>
<ul>
<li>支持静态、1/2、1/3、1/4 和 1/8 工作周期(Duty)</li>
</ul>
<div>
<ul>
<li>支持静态、1/2、1/3 和 1/4 偏压配置(Bias)</li>
</ul>
<div>
<ul>
<li>双缓冲机制允许用户随时更新主显示数据存储器中的显示数据(像素活动/非活动信息),而不影响 LCD中实时显示的连续性和完整性</li>
</ul>
<div>
<ul>
<li>VLCD 内部电压可通过软件从 VLCDmin 到 VLCDmax 调节,,以便调整 LCD 显示对比度</li>
</ul>
<div>
<ul>
<li>可选的供电电源:从 VLCD 引脚外加电源,也可以将 VLCD 直接连接到 VDD;使用内嵌的 DC-DC 升压转换器,外部仅需一个 1μF 电容</li>
</ul>
<div>
<ul>
<li>内置电阻网络用来产生 LCD 驱动中间电压,可通过软件配置,以匹配适合 LCD 面板上的电容性负载</li>
</ul>
</div>
<div>
<ul>
<li>内置电压输出缓冲器</li>
</ul>
</div>
<div>
<ul>
<li>两种不同的对比度控制方式:当使用内部升压转换器时,VLCD 电压可以在 VLCDmin 到 VLCDmax 之间调节;帧之间可以配置多达 7 个相位周期的死区</li>
</ul>
</div>
<div>
<ul>
<li>支持 SLEEP、LOW-POWER SLEEP 和 STOP2 模式下显示,也可以在这些模式下禁用以获得更低的功耗</li>
</ul>
<div>
<ul>
<li>内置驱动波形相位翻转功能,可降低电磁干扰(EMI)和功耗</li>
</ul>
<div>
<ul>
<li>帧起始中断用于更新 LCD 显示数据时进行软件同步</li>
</ul>
<div>
<ul>
<li>闪烁功能–支持无需软件干预的闪烁:支持 1、2、3、4、8 或所有像素在指定的频率下闪烁;闪烁频率可配置为约 0.5Hz、1Hz、2Hz 或 4Hz</li>
</ul>
<div>
<ul>
<li>用作 SEG 和 COM 功能的管脚应配置为相应的 AFIO</li>
</ul>
<div>
<ul>
<li>HSE/32,LSI,LSE 多种 LCD 时钟源可供选择</li>
</ul>
<div> </div>
<div><span style="color:#e74c3c;"><strong>参考官方例程中的示例程序对LCD进行时钟配置、GPIO端口引脚配置、以及LCD参数配置,然后显示所有内容,结果LCD没有一点反应,因为是第一次使用,不知道怎么回事,请哪位大佬给讲解一下呢?</strong></span></div>
<div> </div>
<div><span style="color:#e74c3c;"><strong>LCD段码屏手册</strong></span></div>
<div></div>
<div><span style="color:#e74c3c;"><strong>GPIO控制端口选择</strong></span></div>
<div>使用的是PC10/PC11/PC12/PD2这4个引脚做的COM、PB0/PB1/PB10~15做的SEG</div>
<div></div>
<div><span style="color:#e74c3c;"><strong>配置程序</strong></span></div>
<div>
<pre>
<code class="language-cpp">void LCD_Configure(void)
{
GPIO_InitType GPIO_InitStructure;
LCD_InitTypeLCD_InitStructure;
printf("\r\n%s : %d", __FUNCTION__, __LINE__);
LCD_ClockConfig(LCD_CLK_SRC_LSI);
printf("\r\n%s : %d", __FUNCTION__, __LINE__);
RCC_EnableAPB2PeriphClk(RCC_APB2_PERIPH_GPIOB, ENABLE);
RCC_EnableAPB2PeriphClk(RCC_APB2_PERIPH_GPIOC, ENABLE);
RCC_EnableAPB2PeriphClk(RCC_APB2_PERIPH_GPIOD, ENABLE);
/*
* PB0: LCD_SEG5
* PB1: LCD_SEG6
*/
GPIO_InitStruct(&GPIO_InitStructure);
GPIO_InitStructure.Pin = GPIO_PIN_0 | GPIO_PIN_1;
GPIO_InitStructure.GPIO_Pull = GPIO_No_Pull;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Analog;
GPIO_InitStructure.GPIO_Alternate = GPIO_AF10_LCD;
GPIO_InitPeripheral(GPIOB, &GPIO_InitStructure);
/*
* PB10 : LCD_SEG10
* PB11 : LCD_SEG11
* PB12 : LCD_SEG12
* PB13 : LCD_SEG13
* PB14 : LCD_SEG14
* PB15 : LCD_SEG15
*/
GPIO_InitStruct(&GPIO_InitStructure);
GPIO_InitStructure.Pin = GPIO_PIN_10 | GPIO_PIN_11 | GPIO_PIN_12 |
GPIO_PIN_13 | GPIO_PIN_14 | GPIO_PIN_15;
GPIO_InitStructure.GPIO_Pull = GPIO_No_Pull;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Analog;
GPIO_InitStructure.GPIO_Alternate = GPIO_AF10_LCD;
GPIO_InitPeripheral(GPIOB, &GPIO_InitStructure);
/*
* PC10 : LCD_COM4
* PC11 : LCD_COM5
* PC12 : LCD_COM6
*/
GPIO_InitStruct(&GPIO_InitStructure);
GPIO_InitStructure.Pin = GPIO_PIN_10 | GPIO_PIN_11 | GPIO_PIN_12;
GPIO_InitStructure.GPIO_Pull = GPIO_No_Pull;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Analog;
GPIO_InitStructure.GPIO_Alternate = GPIO_AF10_LCD;
GPIO_InitPeripheral(GPIOC, &GPIO_InitStructure);
/*
* PD2: LCD_COM7
*/
GPIO_InitStruct(&GPIO_InitStructure);
GPIO_InitStructure.Pin = GPIO_PIN_2;
GPIO_InitStructure.GPIO_Pull = GPIO_No_Pull;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Analog;
GPIO_InitStructure.GPIO_Alternate = GPIO_AF10_LCD;
GPIO_InitPeripheral(GPIOD, &GPIO_InitStructure);
printf("\r\n%s : %d", __FUNCTION__, __LINE__);
LCD_InitStructure.Prescaler = LCD_PRESCALER_4;
LCD_InitStructure.Divider = LCD_DIV_25;
LCD_InitStructure.Duty = LCD_DUTY_1_4;
LCD_InitStructure.Bias = LCD_BIAS_1_3;
LCD_InitStructure.VoltageSource = LCD_VOLTAGESOURCE_INTERNAL;
LCD_InitStructure.Contrast = LCD_CONTRASTLEVEL_3;
LCD_InitStructure.DeadTime = LCD_DEADTIME_0;
LCD_InitStructure.PulseOnDuration = LCD_PULSEONDURATION_1;
LCD_InitStructure.HighDrive = LCD_HIGHDRIVE_DISABLE;
LCD_InitStructure.HighDriveBuffer = LCD_HIGHDRIVEBUFFER_ENABLE;
LCD_InitStructure.BlinkMode = LCD_BLINKMODE_OFF;
LCD_InitStructure.BlinkFreq = LCD_BLINKFREQ_DIV_8;
LCD_InitStructure.MuxSegment = LCD_MUXSEGMENT_DISABLE;
LCD_Init(&LCD_InitStructure);
printf("\r\n%s : %d", __FUNCTION__, __LINE__);
LCD_Write(LCD_RAM1_COM0, 0x00000000, 0xFFFFFFFF);
LCD_Write(LCD_RAM1_COM1, 0x00000000, 0xFFFFFFFF);
LCD_Write(LCD_RAM1_COM2, 0x00000000, 0xFFFFFFFF);
LCD_Write(LCD_RAM1_COM3, 0x00000000, 0xFFFFFFFF);
LCD_Write(LCD_RAM2_COM0, 0x00000000, 0x00000FFF);
LCD_Write(LCD_RAM2_COM1, 0x00000000, 0x00000FFF);
LCD_Write(LCD_RAM2_COM2, 0x00000000, 0x00000FFF);
LCD_Write(LCD_RAM2_COM3, 0x00000000, 0x00000FFF);
LCD_Write(LCD_RAM1_COM4, 0x00000000, 0xFFFFFFFF);
LCD_Write(LCD_RAM1_COM5, 0x00000000, 0xFFFFFFFF);
LCD_Write(LCD_RAM1_COM6, 0x00000000, 0xFFFFFFFF);
LCD_Write(LCD_RAM1_COM7, 0x00000000, 0xFFFFFFFF);
LCD_Write(LCD_RAM2_COM4, 0x00000000, 0x000000FF);
LCD_Write(LCD_RAM2_COM5, 0x00000000, 0x000000FF);
LCD_Write(LCD_RAM2_COM6, 0x00000000, 0x000000FF);
LCD_Write(LCD_RAM2_COM7, 0x00000000, 0x000000FF);
printf("\r\n%s : %d", __FUNCTION__, __LINE__);
LCD_UpdateDisplayRequest();
printf("\r\n%s : %d", __FUNCTION__, __LINE__);
}</code></pre>
<p> </p>
</div>
<div><span style="color:#e74c3c;"><strong>调试问题</strong></span></div>
<div>在调试时,已经将板子上的VDD与VLCD短接在一起了;如果使用电压,通过调节内部参考电压值,LCD没有任何反应,但在执行LCD_Init和LCD_UpdateDisplayRequest这两个函数时会占用比较长的时间;如果配置成使用外部电压时,此时整个初始化过程会比较快,担LCD依旧没有任何显示……所以想寻网友的帮助,协助分析一下,这到底是怎么回事?</div>
<div> </div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p>LCD没有任何反应,感觉还是LCD驱动问题</p>
<p>开发板上没有LCD断码屏,是外接的断码屏吗?可以拿逻辑分析仪抓一下时序。</p>
短接VDD和VLCD就不能配置为内部参考电压,也没办法调节对比度。建议断开VLCD和VDD的连接,接1uF的电容,并根据屏幕3V电压配置CONTRAST为3.01V的值。如果还是没显示的话,建议示波器看看有没有波形出来。 afanx 发表于 2022-7-4 15:09
短接VDD和VLCD就不能配置为内部参考电压,也没办法调节对比度。建议断开VLCD和VDD的连接,接1uF的电容,并 ...
<p>好的,稍后试一下<img height="48" src="https://bbs.eeworld.com.cn/static/editor/plugins/hkemoji/sticker/facebook/handshake.gif" width="48" /></p>
<p>PC10/11/12,PD2是COM4~COM7引脚,LCD应该配置成1/8duty</p>
<p> </p>
<p>官方提供了QQ支持群,可以回复更加快捷</p>
<p>710838632。 </p>
<p> </p>
<p>不是广告贴,请管理员不要删除哈:)</p>
milafan 发表于 2022-7-4 16:32
PC10/11/12,PD2是COM4~COM7引脚,LCD应该配置成1/8duty
官方提供了QQ支持群,可以回复更加快 ...
<p>是的,就是这个原因,感谢!<img height="48" src="https://bbs.eeworld.com.cn/static/editor/plugins/hkemoji/sticker/facebook/wanwan88.gif" width="59" /><img height="48" src="https://bbs.eeworld.com.cn/static/editor/plugins/hkemoji/sticker/facebook/wanwan88.gif" width="59" /><img height="48" src="https://bbs.eeworld.com.cn/static/editor/plugins/hkemoji/sticker/facebook/wanwan88.gif" width="59" /></p>
afanx 发表于 2022-7-4 15:09
短接VDD和VLCD就不能配置为内部参考电压,也没办法调节对比度。建议断开VLCD和VDD的连接,接1uF的电容,并 ...
<p>外部电压和内部电压的确只需要使能一个,在使用内部电压的时候,如果外部电压还供着电,会影响LCD初始化和LCD_UpdateDisplayRequest这两个函数的执行速度,这个后面有时间再研究……屏的规格书电压是3.0V,之前程序中设置的电压为2.99V那一档位,其实是可以的,设置3.12V那个档位也是可以了,区别就是显示对比度的不同……感谢!<img height="48" src="https://bbs.eeworld.com.cn/static/editor/plugins/hkemoji/sticker/facebook/wanwan88.gif" width="59" /><img height="48" src="https://bbs.eeworld.com.cn/static/editor/plugins/hkemoji/sticker/facebook/wanwan88.gif" width="59" /></p>
页:
[1]