STM32使用HAL库驱动4线的电阻屏

其实道理很简单,就是用adc去读电压,但是细节很多。废话不说,直接上代码,这个是给STemWin的驱动,但是原理都在。如果单独用,需要滤波。

第一个细节: 设为浮空的引脚需要内部下拉,否则没有办法判断按或者不按。

第二个细节:ADC的sampling时间不能太小,否则读出数据不稳定,没法用。

 

#include "GUI.h"

#define XSIZE_PHYS  240 // To be adapted to x-screen size
#define YSIZE_PHYS  320 // To be adapted to y-screen size

#define GUI_TOUCH_AD_TOP    3600
#define GUI_TOUCH_AD_BOTTOM 410
#define GUI_TOUCH_AD_LEFT   410
#define GUI_TOUCH_AD_RIGHT  3660

void GUI_TOUCH_X_Init(void)
{
  GUI_TOUCH_SetOrientation(GUI_SWAP_XY);

  GUI_TOUCH_Calibrate(GUI_COORD_X, 0, XSIZE_PHYS, GUI_TOUCH_AD_LEFT, GUI_TOUCH_AD_RIGHT);
  GUI_TOUCH_Calibrate(GUI_COORD_Y, 0, YSIZE_PHYS, GUI_TOUCH_AD_TOP, GUI_TOUCH_AD_BOTTOM);
}

void GUI_TOUCH_X_ActivateX(void)
{
  GPIO_InitTypeDef GPIO_InitStruct = {0};

  // X- = 0
  GPIO_InitStruct.Pin = X_Left_Pin;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  HAL_GPIO_Init(X_Left_GPIO_Port, &GPIO_InitStruct);
  HAL_GPIO_WritePin(X_Left_GPIO_Port, X_Left_Pin, GPIO_PIN_RESET);

  // X+ = 1
  GPIO_InitStruct.Pin = X_RIGHT_Pin;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  HAL_GPIO_Init(X_RIGHT_GPIO_Port, &GPIO_InitStruct);
  HAL_GPIO_WritePin(X_RIGHT_GPIO_Port, X_RIGHT_Pin, GPIO_PIN_SET);

  // Enable Y- = NO PULLUP OR DOWN
  GPIO_InitStruct.Pin = Y_UP_Pin;
  GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
  GPIO_InitStruct.Pull = GPIO_PULLDOWN;
  HAL_GPIO_Init(Y_UP_GPIO_Port, &GPIO_InitStruct);

  // Enable Y+ ADC, Channel 3
  GPIO_InitStruct.Pin = Y_DOWN_Pin;
  GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  HAL_GPIO_Init(Y_DOWN_GPIO_Port, &GPIO_InitStruct);
}

void GUI_TOUCH_X_ActivateY(void)
{
  GPIO_InitTypeDef GPIO_InitStruct = {0};
  // Y- = 0
  GPIO_InitStruct.Pin = Y_UP_Pin;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  HAL_GPIO_Init(Y_UP_GPIO_Port, &GPIO_InitStruct);
  HAL_GPIO_WritePin(Y_UP_GPIO_Port, Y_UP_Pin, GPIO_PIN_RESET);

  // Y+ = 1
  GPIO_InitStruct.Pin = Y_DOWN_Pin;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  HAL_GPIO_Init(Y_DOWN_GPIO_Port, &GPIO_InitStruct);
  HAL_GPIO_WritePin(Y_DOWN_GPIO_Port, Y_DOWN_Pin, GPIO_PIN_SET);

  // X- NO PULL UP or DOWN
  GPIO_InitStruct.Pin = X_Left_Pin;
  GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
  GPIO_InitStruct.Pull = GPIO_PULLDOWN;
  HAL_GPIO_Init(X_Left_GPIO_Port, &GPIO_InitStruct);

  // Enable X+ ADC, Channel 2
  GPIO_InitStruct.Pin = X_RIGHT_Pin;
  GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  HAL_GPIO_Init(X_RIGHT_GPIO_Port, &GPIO_InitStruct);
}

int GUI_TOUCH_X_MeasureX(void)
{
  int result;
  ADC_ChannelConfTypeDef sConfig = {0};

  /*
  * Configure for the selected ADC regular channel its corresponding rank in the sequencer and its sample time.
  */
  sConfig.Channel = ADC_CHANNEL_2;
  sConfig.Rank = 1;
  sConfig.SamplingTime = ADC_SAMPLETIME_480CYCLES;
  if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
  {
    Error_Handler();
  }

  if (HAL_ADC_Start(&hadc1) != HAL_OK)
  {
    Error_Handler();
  }

  if (HAL_ADC_PollForConversion(&hadc1, 10) != HAL_OK)
  {
    Error_Handler();
  }
  result = HAL_ADC_GetValue(&hadc1);

  if (HAL_ADC_Stop(&hadc1) != HAL_OK)
  {
    Error_Handler();
  }

  return result;
}

int GUI_TOUCH_X_MeasureY(void) {
  int result;
  ADC_ChannelConfTypeDef sConfig = {0};

  /*
  * Configure for the selected ADC regular channel its corresponding rank in the sequencer and its sample time.
  */
  sConfig.Channel = ADC_CHANNEL_3;
  sConfig.Rank = 1;
  sConfig.SamplingTime = ADC_SAMPLETIME_480CYCLES;
  if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
  {
    Error_Handler();
  }

  if (HAL_ADC_Start(&hadc1) != HAL_OK)
  {
    Error_Handler();
  }

  if (HAL_ADC_PollForConversion(&hadc1, 10) != HAL_OK)
  {
    Error_Handler();
  }
  result = HAL_ADC_GetValue(&hadc1);

  if (HAL_ADC_Stop(&hadc1) != HAL_OK)
  {
    Error_Handler();
  }

  return result;
}

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
STM32F4是意法半导体(STMicroelectronics)推出的一款高性能32位微控制器系列,而HAL(Hardware Abstraction Layer)库是STM32系列微控制器的一个软件抽象层库,可以提供一些基础的硬件驱动和功能函数供开发人员使用。 在STM32F4HAL库中,对于红外传感器的驱动,可以通过以下步骤来实现: 1. 配置GPIO引脚:首先要确定红外传感器的接口引脚,然后配置对应的GPIO为输入模式。 2. 配置外部中断:如果红外传感器输出的信号通过外部中断来触发,可以配置对应的外部中断线。 3. 初始化红外传感器:根据红外传感器的工作特性,设置相应的工作模式和参数,如发射频率、接收灵敏度等。 4. 接收红外信号:通过读取GPIO引脚的电平状态,实时监测红外传感器的信号。可以使用HAL库提供的GPIO读取函数来获取引脚状态。 5. 处理红外信号:根据红外信号的编码格式进行解码,并根据不同的信号值执行相应的逻辑操作。可以通过使用HAL库提供的定时器和中断功能来实现红外信号的高精度计时和数据处理。 总结起来,使用STM32F4HAL库驱动红外传感器需要进行引脚配置、中断配置和数据处理等步骤,通过这些步骤可以实现对红外信号的接收和解码,以及对红外传感器的工作控制。在实际应用中,还需要根据具体的红外传感器型号和特性进行相应的配置和操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值