FM33LGxx开发板在引脚资源的使用上是很有特点的,它既不是按走线的方便来提供引脚资源,也不是以Arduino接口的方式来提供引脚资源,而是按接口的类型,这就为使用通过了极大的方便。
由于该开发板在外设的配置上比较简单,因此有必要为它配上一个显示屏来观察输出信息。这里为它配置的是一款0.96寸的双色显示屏,它使用的是板上的I2C接口。
图1 显示效果
图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)
由于在驱动过程中,只使用到输出工作模式,故其引脚功能的配置函数为:
voidoled_app(void){ FL_GPIO_InitTypeDef GPIO_InitStruct = {0}; FL_GPIO_ResetOutputPin(GPIOA,FL_GPIO_PIN_11|FL_GPIO_PIN_12); GPIO_InitStruct.pin =FL_GPIO_PIN_11|FL_GPIO_PIN_12; GPIO_InitStruct.mode = FL_GPIO_MODE_OUTPUT; GPIO_InitStruct.outputType =FL_GPIO_OUTPUT_PUSHPULL; GPIO_InitStruct.pull = FL_DISABLE; FL_GPIO_Init(GPIOA,&GPIO_InitStruct);}
以模拟方式发送字节数据的函数为:
voidWrite_IIC_Byte(unsignedcharIIC_Byte){unsignedchari;unsignedcharm,da; da=IIC_Byte; SCL_low;for(i=0;i<8;i++) { m=da; m=m&0x80;if(m==0x80) { SDA_high; }elseSDA_low; da=da<<1; SCL_high; SCL_low; } }
实现清屏功能的显示函数为:
voidOLED_Clear(void) {uint8_ti,n;for(i=0;i<8;i++) {OLED_WR_Byte(0xb0+i,OLED_CMD);OLED_WR_Byte(0x00,OLED_CMD);OLED_WR_Byte(0x10,OLED_CMD);for(n=0;n<128;n++)OLED_WR_Byte(0,OLED_DATA); } }
为实现图1的显示效果,其主程序为:
intmain(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屏的显示功能,后面再遇到显示问题时就方便许多。
在FM33LGxx开发板的内部,配有一个低功耗实时时钟日历(RTCC),并带有数字调教功能,其调校精度为+/-0.476ppm,将它与OLED屏的显示功能相结合,即可轻松地实现RTC电子时钟的功能。
图3 计时效果
图4 RTC后备电源
由于在例程中提供了标准的RTC读取函数,故稍加修改即可完成RTC的读取及显示功能,修改后的读取函数为:
uint8_tRTC_GetRTCA(FL_RTCA_InitTypeDef *InitStructer){uint8_tn, i;uint8_tResult =1;uint32_tu,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);returnResult; }
实现RTC计时功能的测试函数如下,它含有RTC的初始值设置及循环读取功能:
voidTest_RTCA(void){ FL_RTCA_InitTypeDef InitTime; FL_RTCA_InitTypeDef GetTime; RTCA_Init(); InitTime.year =0x22; InitTime.month =0x12; InitTime.day =0x12; InitTime.week =0x01; InitTime.hour =0x08; InitTime.minute =0x30; InitTime.second =0x00; RTC_SetRTCA(&InitTime); FL_DelayMs(1000);while(1) { RTC_GetRTCA(&GetTime); FL_DelayMs(1000); } }
实现图3计时显示效果的主程序为:
intmain(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); } }
视频演示: