【上海航芯 ACM32F070开发板+触控功能评估板测评】通过LCD进行简单的时间显示
[复制链接]
本帖最后由 KING_阿飞 于 2022-9-29 01:39 编辑
【上海航芯 ACM32F070开发板+触控功能评估板测评】通过LCD进行简单的时间显示
为了更好的方便大家,同时方便自己,按照我的习惯,放上我的Github地址: ,大家需要的可以自取。
在上一节中,我们移植了RT-Thread Nano,下面我们开始LCD显示+RTC时钟
一、LCD控制器
通过查阅用户手册,我们发现ACM32F070这款开发板是自带LCD 控制器。
- 其LCD特性:
- 高度灵活的帧速率控制
- 支持静态、 1/2、 1/3、 1/4、 1/6 和 1/8 占空比
- 支持 1/2、 1/3、 1/4 偏置
- 多达 16 个寄存器的 LCD 数据 RAM
- 可通过软件配置 LCD 的对比度
- 支持 A 类、 B 类波形
- 2 种驱动波形生成方式
- - 内部电阻分压、外部电阻分压
- - 可选的滤波电容
- - 可通过软件配置内部电阻分压方式的功耗,从而匹配 LCD 面板所需的电容电荷
- 支持低功耗模式: LCD 控制器可在 Active、 Sleep、 Stop 模式下进行显示
- 可配置帧中断
- 支持 LCD 闪烁功能且可配置多种闪烁频率
- 未使用的 LCD 区段和公共引脚可配置为数字或模拟功能
LCD 支持 5 种占空比( Duty)的驱动波形:静态、 1/2、 1/3、 1/4、 1/6 和 1/8,由LCD_CR0.Duty 进行设置。 LCD 支持 3 种偏置( Bias)的驱动波形 1/2、 1/3 和 1/4,由LCD_CR0.Bias 进行设置。官方文档建议,按照下表配置:
驱动LCD的流程:
1.根据 LCD 显示屏初始化 GPIO, 使能相应的 SEG/COM, 使能 LCD 模块时钟/中断;
2.根据 LCD 显示屏设置合适的占空比/偏压/频率/显示模式等配置;
3.选择合适的分压模式,并搭建相应的外部电路;
4.使能 LCD 模块,向 LCD_RAM 中写入相应的数值开始驱动显示。
移植官方例程包:
我们下载完官方的固件包后,打开LCD例程。在其中我们需要把BSP层的东西先移植过来,此处官方已经解耦。我这里先全部搬过来,为之后做准备。
然后就是LCD应用层的编写:
/*********************************************************************************
* Function : LCD_Config
* Description : Config LCD
* Input :
* Outpu :
* Author : CWT Data : 2021Äê
**********************************************************************************/
void LCD_Config(void)
{
#if defined LCD_GDC04212
LCD_DisplayNum=LCD_DisplayNum_GDC04212;
LCD_Init=LCD_Init_GDC04212;
lcdhandle=&lcdhandle_GDC04212;
#elif defined LCD_GDC03828
LCD_DisplayNum=LCD_DisplayNum_GDC003828;
LCD_Init=LCD_Init_GDC03828;
lcdhandle=&lcdhandle_GDC03828;
#else
LCD_DisplayNum=LCD_DisplayNum_YR1618A;
LCD_Init=LCD_Init_YR1618A;
lcdhandle=&lcdhandle_YR1618A;
#endif
LCD_Init();
LCD_BACK_LED();
}
/*********************************************************************************
* Function : LCD_IRQHandler
* Description : LCD Interrupt handler
* Input :
* Outpu :
* Author : CWT Data : 2021Äê
**********************************************************************************/
void LCD_IRQHandler(void)
{
HAL_LCD_IRQHandler(lcdhandle);
}
具体部分,大家可以去仓库看,这里就不全部放出。
二、RTC
RTC 提供秒、分、时、日、周、月、年的信息,每月的天数和闰年的天数可自动调整。时间和日期都以 BCD 码的形式显示。 RTC 可以进行夏令时补偿。 RTC 可以工作在省电模式下,并通过软件配置来智能唤醒。 RTC 支持外接更高精度的低频时钟,用以达到更高的日历精度。
主要特性
- 可计算 00~99 年之间的秒、分、时、日、周、月、年
- BCD 时间显示
- 自动闰年调整
- 数字校准功能:通过调整最小时间单位(最大可调精度 0.95ppm)来进行日历校准,
- 调校后理论精度+/-0.477ppm
- 周期唤醒中断
- 闹钟功能
- 可从管脚输出 XTLF 时钟信号供用户校准
- RTC 计时器部分不复位
- 2 路输入上下沿(侵入)时间戳功能
- 5 个 32 位 (共 20 字节) 通用备份寄存器,能够在省电模式下保存数据。当有外部侵
- 入事件发生时,备份寄存器可复位(可配置)。
BSP层的编写:
#include "rtc.h"
#include "ACM32Fxx_HAL.h"
#include <rtthread.h>
void RTC_Config(void)
{
RTC_ConfigTypeDef RTC_Handle;
RTC_TimeTypeDef gstr_Time_Set;
RTC_DateTypeDef gstr_Date_Set;
RTC_Handle.u32_ClockSource = RTC_CLOCK_XTL;
RTC_Handle.u32_Compensation = COMPENSATION_INCREASE; // ¿aê¼ê±Öó213¥£¬èç2»Dè213¥éèÖÃ213¥ÖμÎa0
RTC_Handle.u32_CompensationValue = 0x05; // ¿aê¼ê±Öó213¥£¬èç2»Dè213¥éèÖÃ213¥ÖμÎa0
HAL_RTC_Config(&RTC_Handle);
/* Set RTC Time¡¢Date */
gstr_Time_Set.u8_Hours = 0x12;
gstr_Time_Set.u8_Minutes = 0x30;
gstr_Time_Set.u8_Seconds = 0x00;
HAL_RTC_SetTime(&gstr_Time_Set);
gstr_Date_Set.u8_Year = 0x22; // 2021
gstr_Date_Set.u8_Month = RTC_MONTH_MARCH;
gstr_Date_Set.u8_Date = 0x20;
gstr_Date_Set.u8_WeekDay = RTC_WEEKDAY_FRIDAY;
HAL_RTC_SetDate(&gstr_Date_Set);
}
我们在这里需要注意的是:时间存放是16进制的。
所以,我们在显示时间时,需要去位。这里我的操作是:
void LCD_time_display(void)
{
HAL_RTC_GetTime(&gstr_Time_Get);
HAL_RTC_GetDate(&gstr_Date_Get);
fu32_Displayup[0]=(gstr_Time_Get.u8_Hours & 0xF0)>>4;
fu32_Displayup[1]=(gstr_Time_Get.u8_Hours & 0x0F);
fu32_Displayup[2]=(gstr_Time_Get.u8_Minutes & 0xF0)>>4;
fu32_Displayup[3]=(gstr_Time_Get.u8_Minutes & 0x0F);
fu32_Displaydown[2]=(gstr_Time_Get.u8_Seconds & 0xF0)>>4;
fu32_Displaydown[3]=(gstr_Time_Get.u8_Seconds & 0x0F);
}
三、效果展示
VID_20220929_011747
|