通常我对一款新板子的移植性评判标准就是选一个常用的器件将其移植到新板子上来实现其原有的功能,如果能在半小时已能完成,就认为它是适于快速移植的。 在相应的移植测试器件中,光照强度传感器BH1750就是其中之一,其功能移植后的效果如图所示。 之所以选取BH1750是由于,它使用的引脚少,测试的基础要求比较低,主要掌握了GPIO口的使用方法即可进行。 测试效果图 通常为了减少测试的复杂性,对于I2C接口的器件直接以GPIO口模拟的方式来实现。 CLK---PC0 DIN---PC1 输出高低电平及读取外部电位的语句定义为: #define SCL_Clr1() GPIO_WriteBit(GPIOC, GPIO_Pin_0, Bit_RESET) #define SCL_Set1() GPIO_WriteBit(GPIOC, GPIO_Pin_0, Bit_SET) #define SDA_Clr1() GPIO_WriteBit(GPIOC, GPIO_Pin_1, Bit_RESET) #define SDA_Set1() GPIO_WriteBit(GPIOC, GPIO_Pin_1, Bit_SET) #define IIC_SDA_IN1 GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_1) 切换数据引脚的输入输出性能的函数为:
对BH1750的初始化函数为: - void BH1750_Init(void)
- {
- GPIO_InitTypeDef GPIO_InitStructure = {0};
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_Init(GPIOC, &GPIO_InitStructure);
- }
复制代码
这样就为功能移植完成了必要的准备条件,为了直接以OLED屏来显示检测值,其检测与函数为: - void Get_Sunlight_Value()
- {
- int dis_data=0;
- float temp;
- unsigned int sd;
- Single_Write_BH1750(0x01);
- Single_Write_BH1750(0x10);
- Delay_Ms(180);
- Multiple_Read_BH1750();
- dis_data=BUF[0];
- dis_data=(dis_data<<8)+BUF[1];
- temp=(float) dis_data/1.2;
- sd=temp;
- if(sd<54612) OLED_ShowNum(20,6,sd,5,16);
- }
复制代码
显示图示检测效果的主程序为: - int main(void)
- {
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
- Delay_Init();
- GPIO_Toggle_INIT();
- BH1750_Init();
- oled_pin_INIT();
- OLED_Init();
- OLED_Clear();
- OLED_ShowString(60,0,"V307",16);
- OLED_ShowString(20,2,"OLED test",16);
- OLED_ShowCHinese(20,0,0);
- OLED_ShowCHinese(40,0,1);
- OLED_ShowString(20,4,"Sunlight=",16);
- OLED_ShowString(68,6,"lx",16);
- while(1)
- {
- Get_Sunlight_Value();
- Delay_Ms(1000);
- GPIO_WriteBit(GPIOA, GPIO_Pin_0, (i == 0) ? (i = Bit_SET) : (i = Bit_RESET));
- }
- }
复制代码
经此功能移植,完全可以在半小时内解决问题,说明CH32V307的功能移植性是十分强的。
|