复旦微电子 FM33LG0xx系列开发板—OLED以及电子时钟应用

cathy的头像
cathy 发布于:周一, 01/09/2023 - 15:32 ,关键词:

复旦微电子推出的FM33LG0xx开发板免费试用活动,小伙伴们积极参与,并基于FM33LG0xx开发板进行开发,如下是参与者的开发过程和心得。

FM33LG0xx系列开发板示意图

1.jpg

FM33LG0xx开发板在引脚资源的使用上是很有特点的,它既不是按走线的方便来提供引脚资源,也不是以Arduino接口的方式来提供引脚资源,而是按接口的类型,这就为使用者提供了极大的方便。由于该开发板在外设的配置上比较简单,因此有必要为它配上一个显示屏来观察输出信息。这里为它配置的是一款0.96寸的双色显示屏,它使用的是板上的I2C接口。

2.png

图 1. 显示效果

3.png

图 2. I2C接口电路原理图

该接口所使用的引脚为:

SCL---PA11

SDA---PA12

为便于以GPIO口来模拟I2C驱动,相关引脚输出高低电平的定义为:

#define
SCL_high FL_GPIO_SetOutputPin(GPIOA,FL_GPIO_PIN_11)

#define
SCL_low FL_GPIO_ResetOutputPin(GPIOA,FL_GPIO_PIN_11)

#define
SDA_high FL_GPIO_SetOutputPin(GPIOA, FL_GPIO_PIN_12)

#define
SDA_low FL_GPIO_ResetOutputPin(GPIOA,FL_GPIO_PIN_12)

以模拟方式发送字节数据的函数为:

void Write_IIC_Byte(unsigned char IIC_Byte)
{    
    unsigned char i;    
    unsigned char m,da;    
    da=IIC_Byte;    
    SCL_low;    
    for(i=0;i<8;i++)    
    {        
        m=da;        
        m=m&0x80;        
        if(m==0x80)        
        {            
            SDA_high;        
        }        
        else           
        SDA_low;        
        da=da<<1;        
        SCL_high;        
        SCL_low;     
    }
}

为实现图1的显示效果,其主程序为:

int main(void)
{    
    MF_Clock_Init();    
    MF_SystemClock_Config();    
    FL_Init();    
    MF_Config_Init();    
    UserInit();    
    key_int();    
    led_int();    
    oled_app();    
    OLED_Init();    
    OLED_Clear();    
    OLED_ShowString(20,0,"FM33LG0XX",16);    
    OLED_ShowCHinese(20,2,0);    
    OLED_ShowCHinese(36,2,1);    
    OLED_ShowCHinese(52,2,2);    
    OLED_ShowCHinese(68,2,3);    
    OLED_ShowCHinese(84,2,4);    
    OLED_ShowCHinese(100,2,5);    
    OLED_ShowString(20,6,"jinglixixi",16);    
    while(1);
}

有了OLED屏的显示功能,后面再遇到显示问题时就方便许多。

在FM33LG0xx开发板的内部,配有一个低功耗实时时钟日历(RTCC),并带有数字调校功能,其调校精度为+/-0.476ppm,将它与OLED屏的显示功能相结合,即可轻松地实现RTC电子时钟的功能。

4.png

图 3. 计时效果

5.png

图 4. RTC后备电源

由于在例程中提供了标准的RTC读取函数,故稍加修改即可完成RTC的读取及显示功能,修改后的读取函数为:

uint8_t RTC_GetRTCA(FL_RTCA_InitTypeDef *InitStructer)
{    
    uint8_t n, i;    
    uint8_t Result = 1;    
    uint32_t u,ut;    
    FL_RTCA_InitTypeDef TempTime1;    
    FL_RTCA_GetTime(RTCA, &TempTime1);    
    u=((uint32_t *)(&TempTime1))[4];    
    OLED_ShowNumH(20,5,u,2,16);    
    u=((uint32_t *)(&TempTime1))[5];    
    OLED_ShowNumH(44,5,u,2,16);    
    u=((uint32_t *)(&TempTime1))[6];    
    OLED_ShowNumH(68,5,u,2,16);    
    return Result;
}

实现RTC计时功能的测试函数如下,它含有RTC的初始值设置及循环读取功能:

uint8_t RTC_GetRTCA(FL_RTCA_InitTypeDef *InitStructer)
{    
    uint8_t n, i;    
    uint8_t Result = 1;    
    uint32_t u,ut;    
    FL_RTCA_InitTypeDef TempTime1;    
    FL_RTCA_GetTime(RTCA, &TempTime1);    
    u=((uint32_t *)(&TempTime1))[4];    
    OLED_ShowNumH(20,5,u,2,16);    
    u=((uint32_t *)(&TempTime1))[5];    
    OLED_ShowNumH(44,5,u,2,16);    
    u=((uint32_t *)(&TempTime1))[6];    
    OLED_ShowNumH(68,5,u,2,16);    
    return Result;
}

实现图3计时显示效果的主程序为:

int main(void)
{    
    MF_Clock_Init();    
    MF_SystemClock_Config();    
    FL_Init();    
    MF_Config_Init();    
    UserInit();    
    CDIF->CR= 0x02;    
    oled_app();    
    OLED_Init();    
    OLED_Clear();    
    OLED_ShowString(20,0,"FM33LG0XX",16);    
    OLED_ShowCHinese(20,2,0);    
    OLED_ShowCHinese(36,2,1);    
    OLED_ShowCHinese(52,2,2);    
    OLED_ShowCHinese(68,2,3);    
    OLED_ShowCHinese(84,2,4);    
    OLED_ShowCHinese(100,2,5);    
    OLED_ShowString(20,6,"jinglixixi",16);    
    FL_DelayMs(1000);    
    OLED_ShowString(20,6,"      ",16);    
    OLED_ShowString(20,5,"  :   :  ",16);    
    Test_RTCA();    while(1)    
    {        
        LED0_TOG();        
        FL_DelayMs(1000);    
    }
}

正文内容转载于电子发烧友论坛

直接转载来源:复微MCU爱好者天地

免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。

围观 79