Взаимодействие четырехпроводного резистивного сенсорного экрана с STM32F429DISCOVERY

Я пытаюсь подключить 4-проводной резистивный сенсорный экран к плате Discovery STM32F429, но не могу понять, как это работает. Я хочу, чтобы MCU обнаруживал прикосновение, поэтому я настроил 4 контакта следующим образом:

X+ --> input w/pullup connected to EXTI external interrupt 
X- --> input floating (tristated)
Y+ --> input floating (tristated)
Y- --> output to GND

в этой конфигурации я должен быть в состоянии обнаружить прикосновение и вызвать прерывание на линии EXTI, чтобы я мог войти в ISR и произвести выборку значений x и y с помощью АЦП. Но когда я подключаю контакт X-, контакт X+ приближается к GND. Кажется, что ток течет между X+ и X- (так что X- не тристатирован?). Вот код, который я использую для настройки контактов GPIO:

GPIO_InitTypeDef gpio;
gpio.Pin = GPIO_PIN_2 | GPIO_PIN_1;
gpio.Mode = GPIO_MODE_INPUT;
gpio.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOA, &gpio);

gpio.Pin = GPIO_PIN_0;
gpio.Mode = GPIO_MODE_INPUT;
gpio.Pull = GPIO_PULLUP;
HAL_GPIO_Init(GPIOA, &gpio);

gpio.Pin = GPIO_PIN_5;
gpio.Mode = GPIO_MODE_OUTPUT_PP;
HAL_GPIO_Init(GPIOA, &gpio);

HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET);

/* initialization using registers, works the same as above */

//  /* Xr and Yu open (input floating) */
//  GPIOA->MODER &= ~(GPIO_MODER_MODE2 | GPIO_MODER_MODE1);
//  GPIOA->PUPDR &= ~(GPIO_PUPDR_PUPD2 | GPIO_PUPDR_PUPD1);
//
//  /* Xl input with pull-up */
//  GPIOA->MODER &= ~GPIO_MODER_MODE0;
//  GPIOA->PUPDR |= GPIO_PUPDR_PUPD0_0;
//
//  /* Yd to GND (output set to 0) */
//  GPIOA->MODER |= GPIO_MODER_MODE5_0;
//  GPIOA->ODR &= ~GPIO_ODR_OD5;

Я не могу понять, что я делаю неправильно или как правильно настроить тристатированные контакты, чтобы они не опускали контакт X+.

Ответы (1)

На плате STM32F429 Discovery PA1 и PA2 напрямую подключены к выходам прерывания микросхемы датчика движения L3GD20, которые по умолчанию имеют активный высокий уровень. Это означает, что они должны выводить сигнал низкого логического уровня до тех пор, пока не произойдет какое-либо (программируемое) событие. Что, поскольку часть предположительно не инициализирована, никогда не происходит.

Контакты X+ и X- резистивного сенсорного экрана соединены с резистором, обычно со значением менее 1 кОм. Подключение X+ к PA0 и X- к низкоуровневому выходу фактически создало понижение на 1 кОм на PA0.

PA0 подключается к земле через подтягивающий резистор 220 кОм (часть цепи подавления дребезга синей кнопки) на плате обнаружения, так что это тоже не лучший выбор для аналогового подключения.

Вы можете освободить PA0, перерезав где-нибудь паяный мост, но PA1 и PA2, по-видимому, напрямую подключены к датчику движения.

Вам следует обратиться к руководству пользователя вашей платы и найти 4 неиспользуемых контакта, два из которых должны использоваться в качестве каналов АЦП. К сожалению, встроенный ЖК-дисплей занимает большую часть контактов АЦП, но осталось несколько, а именно PA5, PC3 и PF6. Выберите два из них для аналого-цифрового преобразования и найдите два неиспользуемых контакта для двух других терминалов. Открытие предопределенного проекта STM32F429-Discovery в STM32CubeMX, пожалуй, самый простой способ найти пригодные для использования контакты.

спасибо, теперь булавка ведет себя как надо. Я никогда не проверял, были ли эти булавки прикреплены к чему-то другому (даже если эта мысль приходила мне в голову). Два дня голову ломал, спасибо, сэр, вы меня спасли!