找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1914|回复: 0
收起左侧

ESK32-360开发板的传感器测量及输出显示

[复制链接]
ID:776997 发表于 2020-8-21 21:09 | 显示全部楼层 |阅读模式
本帖最后由 jinglixixi 于 2020-8-21 21:16 编辑

传感器测量离不开3件事,输入输出、延时及时序控制。
1. 延时函数
鉴于ESK32-360开发板在SYSTICK程序中只提供了ms级的延时函数,而未提供us级的延时函数,使得程序设计时极为不便,为此添加了us级延时函数。
  1. void Delayus(u32 nTime)
  2. {
  3.   /* Enable the SysTick Counter */
  4.   SYSTICK_CounterCmd(SYSTICK_COUNTER_ENABLE);
  5.   DelayTime = nTime;
  6.   while(DelayTime != 0);
  7.   /* Disable SysTick Counter */
  8.   SYSTICK_CounterCmd(SYSTICK_COUNTER_DISABLE);
  9.   /* Clear SysTick Counter */
  10.   SYSTICK_CounterCmd(SYSTICK_COUNTER_CLEAR);
  11. }
复制代码

在使用时,因为ms级和us级延时函数是基于同一个基准时钟,故在使用前需调整基准时钟。
在ms级延时时,使用下列语句:
SYSTICK_IntConfig(DISABLE);
SYSTICK_SetReloadValue(SystemCoreClock / 8 / 1000);
SYSTICK_IntConfig(ENABLE);
在us级延时时,使用如下语句:
SYSTICK_IntConfig(DISABLE);
SYSTICK_SetReloadValue(SystemCoreClock / 8 / 1000000);
SYSTICK_IntConfig(ENABLE);

ms级延时的验证主程序如下:
  1. int main(void)
  2. {
  3.   SYSTICK_ClockSourceConfig(SYSTICK_SRC_STCLK);
  4.   SYSTICK_SetReloadValue(SystemCoreClock / 8 / 1000);
  5.   SYSTICK_IntConfig(ENABLE);
  6.   /* Initialize LEDs */
  7.   HT32F_DVB_LEDInit(HT_LED1);
  8.   HT32F_DVB_LEDInit(HT_LED2);
  9.   HT32F_DVB_LEDInit(HT_LED3);
  10.   /* Infinite loop */
  11.   while(1)
  12.   {
  13.        /* Toggle LEDs  */
  14.        HT32F_DVB_LEDToggle(HT_LED1);
  15.        HT32F_DVB_LEDToggle(HT_LED2);
  16.        HT32F_DVB_LEDToggle(HT_LED3);
  17.        Delay(500);
  18.   }
  19. }
复制代码

2. GPIO口输入输出
鉴于SD卡接口处于空置状态,故可用做GPIO来使用并进行功能扩展,从而化解资源的紧张的情况。
1)GPIO口输出
为便于输出口的配置,特定义了一个专用的函数,其内容为:
  1. void HT32F_DVB_OUT_Init(void)
  2. {
  3.   HT32F_DVB_ClockConfig();
  4.   //   PD0 、 PC12
  5.   HT32F_DVB_GPxConfig(GPIO_PD, GPIO_PIN_0, 0);
  6.   HT32F_DVB_GPxConfig(GPIO_PC, GPIO_PIN_12, 0);
  7.   HT_GPIOD->SRR = GPIO_PIN_0;
  8.   HT_GPIOC->SRR = GPIO_PIN_12;
  9.   GPIO_PullResistorConfig(HT_GPIOD, GPIO_PIN_0, GPIO_PR_DISABLE);
  10.   GPIO_DriveConfig(HT_GPIOD, GPIO_PIN_0, GPIO_DV_8MA);
  11.   GPIO_DirectionConfig(HT_GPIOD, GPIO_PIN_0, GPIO_DIR_OUT);
  12.   GPIO_PullResistorConfig(HT_GPIOC, GPIO_PIN_12, GPIO_PR_DISABLE);
  13.   GPIO_DriveConfig(HT_GPIOC, GPIO_PIN_12, GPIO_DV_8MA);
  14.   GPIO_DirectionConfig(HT_GPIOC, GPIO_PIN_12, GPIO_DIR_OUT);
  15. }
复制代码
此外,还定义了一个GPIO口的时钟启动函数,其内容为:
  1. void HT32F_DVB_ClockConfig(void)
  2. {
  3.   CKCU_PeripClockConfig_TypeDef CKCUClock = {{0}};
  4.   u8 RegCK[5] = {0};
  5.   RegCK[3] = 1;  //  启动PD口
  6.   RegCK[2] = 1;  //  启动PC口
  7.   CKCUClock.Bit.PA         = RegCK[0];
  8.   CKCUClock.Bit.PB         = RegCK[1];
  9.   CKCUClock.Bit.PC         = RegCK[2];
  10.   CKCUClock.Bit.PD         = RegCK[3];
  11.   CKCUClock.Bit.AFIO       = 1;
  12.   CKCU_PeripClockConfig(CKCUClock, ENABLE);
  13. }
复制代码

验证函数功能的主程序为:
  1. int main(void)
  2. {
  3.      SYSTICK_ClockSourceConfig(SYSTICK_SRC_STCLK);
  4.      SYSTICK_SetReloadValue(SystemCoreClock / 8 / 1000);   
  5.      SYSTICK_IntConfig(ENABLE);
  6.      // LED1 & PC12
  7.      HT32F_DVB_OUT_Init();
  8.      while(1)
  9.      {
  10.         /* Toggle LEDs  */
  11.         HT_GPIOD->SRR = GPIO_PIN_0;
  12.         HT_GPIOC->RR = GPIO_PIN_12;
  13.         Delay(1000);
  14.         HT_GPIOD->RR = GPIO_PIN_0;
  15.         HT_GPIOC->SRR = GPIO_PIN_12;
  16.         Delay(1000);
  17.     }
  18. }
复制代码

经程序的下载验证,可实现指定GPIO口的输出功能。
2)GPIO口输入
为便于输入口的配置,所定义得专用函数为:
  1. void HT32F_DVB_IN_Init(void)
  2. {
  3.          AFIO_GPxConfig(GPIO_PC, GPIO_PIN_12, 0);
  4.          GPIO_PullResistorConfig(HT_GPIOC, GPIO_PIN_12, GPIO_PR_UP);  // down ?
  5.          GPIO_InputConfig(HT_GPIOC, GPIO_PIN_12, ENABLE);
  6. }
复制代码

注:为配置相应的时钟,需在HT32F_DVB_ClockConfig()函数中添加语句:
RegCK[2] = 1;   // 启动PC口

验证函数功能的主程序为:
  1. int main(void)
  2. {
  3.      SYSTICK_ClockSourceConfig(SYSTICK_SRC_STCLK);
  4.      SYSTICK_SetReloadValue(SystemCoreClock / 8 / 1000);
  5.      SYSTICK_IntConfig(ENABLE);
  6.      HT32F_DVB_OUT_Init();
  7.      while(1)
  8.      {   
  9.           // PC12=KEY
  10.           if(GPIO_ReadInBit(HT_GPIOC, GPIO_PIN_12)==0)        
  11.           {
  12.                 HT_GPIOD->SRR = GPIO_PIN_0;
  13.           }
  14.           else
  15.           {
  16.                 HT_GPIOD->RR = GPIO_PIN_0;
  17.           }
  18.          Delay(1000);
  19.     }
  20. }
复制代码

经程序下载,当按下连接PC12的按键时,可见到LED1发生变化,说明指定GPIO口的输入功能正确。
3. 串行通讯输出信息
除了使用LED显示按键状态外,还可以使用串行通讯来输出按键状态,它可以反映出比LED更丰富的信息。
实现按键状态输出的主程序如下:
  1. int main(void)
  2. {
  3.          SYSTICK_ClockSourceConfig(SYSTICK_SRC_STCLK);
  4.          SYSTICK_SetReloadValue(SystemCoreClock / 8 / 1000);
  5.          SYSTICK_IntConfig(ENABLE);
  6.          HT32F_DVB_OUT_Init();
  7.          UxART_Configuration();
  8.          while(1)
  9.          {
  10.                    if(GPIO_ReadInBit(HT_GPIOD, GPIO_PIN_1)==0)
  11.                    {
  12.                          HT_GPIOD->SRR = GPIO_PIN_0;
  13.                          gHelloString[3] ='0';
  14.                          UxART_TxTest();     
  15.                    }
  16.                    else
  17.                    {
  18.                         HT_GPIOD->RR = GPIO_PIN_0;
  19.                         gHelloString[3] = '1';
  20.                         UxART_TxTest();     
  21.                    }
  22.                    Delay(1000);
  23.          }
  24. }
复制代码

1.jpg                              
图1  按键状态输出

4. I2C总线模拟与BH1750光强检测
BH1750是一款基于I2C接口的数字式光强传感器,我们可利用SD卡接口空出的引脚来模拟I2C接口以驱动该传感器,从而进行光强检测。
BH1750与MCU的连接关系如下:
SCL --- PC11
SDA --- PC12

定义相关引脚输出高低电平的引脚为:
#define SCL_Set()         HT_GPIOC->SRR = GPIO_PIN_11
#define SCL_Clr()          HT_GPIOC->RR = GPIO_PIN_11

#define SDA_Set()        HT_GPIOC->SRR = GPIO_PIN_12
#defineSDA_Clr()          HT_GPIOC->RR =GPIO_PIN_12
BH1750的初始化函数为:
  1. void IIC_Init(void)
  2. {
  3.             HT32F_DVB_ClockConfig();
  4.         
  5.             GPIO_PullResistorConfig(HT_GPIOC, GPIO_PIN_12, GPIO_PR_DISABLE);
  6.             GPIO_DriveConfig(HT_GPIOC, GPIO_PIN_12, GPIO_DV_8MA);
  7.             GPIO_DirectionConfig(HT_GPIOC, GPIO_PIN_12, GPIO_DIR_OUT);
  8.         
  9.             GPIO_PullResistorConfig(HT_GPIOC, GPIO_PIN_11, GPIO_PR_DISABLE);
  10.             GPIO_DriveConfig(HT_GPIOC, GPIO_PIN_11, GPIO_DV_8MA);
  11.             GPIO_DirectionConfig(HT_GPIOC, GPIO_PIN_11, GPIO_DIR_OUT);
  12. }
复制代码
BH1750的读取函数为:
  1. void Get_Sunlight_Value()
  2. {
  3.         int dis_data=0;
  4.         float temp;
  5.         char i=0;
  6.         unsigned int sd;
  7.         Single_Write_BH1750(0x01);  // power on
  8.         Single_Write_BH1750(0x10);  // H- resolution mode
  9.         Delayms(180);
  10.         Multiple_Read_BH1750();
  11.         for(i=0;i<3;i++)
  12.         dis_data=gHelloString[0];
  13.         dis_data=(dis_data<<8)+gHelloString[1];
  14.         temp=(float)dis_data/1.2;
  15.         sd=temp;
  16.         gHelloString[0] = sd/10000+'0';
  17.         gHelloString[1] = sd% 10000/1000+'0';
  18.         gHelloString[2] = sd % 1000/100+'0';
  19.         gHelloString[3] = sd % 100/10+'0';
  20.         gHelloString[4] = sd % 10+'0';
  21.         UxART_TxTest();        
  22. }
复制代码

光强检测的主函数为:
  1. int main(void)
  2. {
  3.         SYSTICK_ClockSourceConfig(SYSTICK_SRC_STCLK);
  4.         SYSTICK_SetReloadValue(SystemCoreClock / 8 / 1000);
  5.         SYSTICK_IntConfig(ENABLE);
  6.         UxART_Configuration();
  7.         IIC_Init();
  8.         while(1)
  9.         {
  10.                    Get_Sunlight_Value();
  11.                    Delayms(1000);
  12.         }
  13. }
复制代码

经程序下载后,其运行结果如图所示。
2.jpg
图2 BH1750检测结果







评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表