- Войдите или зарегистрируйтесь, чтобы оставлять комментарии
Всем привет!
В этой статье расскажу как использовать сенсорную кнопку TTP223 в своем проекте на микроконтроллере STM32F030F4P6.
Эта статья будет интересна тем, кто только изучает как работать с портами микроконтроллеров серии STM32F03!
В этой статье я буду использовать:
1. Проект созданный ранее в STM32F030F4P6 Keil Первый проект с корректировкой.
2. Плата с микроконтроллером STM32F030F4P6 hand-made
3. Сенсорная кнопка TTP223 1 KEY TOUCH PAD DETECTOR.
Соединив все это вместе получаем следующий вид
Сборка включает в себя :
1. Программатор - можно использовать любой программатор для программирования микроконтроллеров STM32
2. Отладочная плата - можно использовать любую плату с установленным на ней микроконтроллером серии STM32F03 скорректировав пины подключения светодиода(ов) и сенсорной кнопки
В моем случае:
PA5 - настроен на вход с прерыванием - получим сигнал от сенсорной кнопки TTP223
PA6, PA7 - настроены на выход - подключим светодиоды зеленый и красный
3. Светодиод(ы) - любой подключенный к портам светодиод(ы). ВНИМАНИЕ !!! Мои светодиоды подключены через РЕЗИСТОР! Так чтобы нагрузка на порт не превышала 5-10 мA.
4. Плату сенсорной кнопки на основе микросхемы TTP223-BA.
В проекте будем использовать IDE
Структура проекта будет следующей
1. Настроим порты с использование прерывания.
2. В прерывании изменим переменную срабатывания сенсорной кнопки TTP223
3. В основной программе смотрим состояние переменной срабатывания сенсорной кнопки и включаем или выключаем светодиоды.
Я буду использовать проект созданный в статье STM32F030F4P6 Keil Первый проект скорректировав его следующим образом - внутри папки проекта созданного при помощи Кейла создаем папку LIB в которой создаем подпапки необходимых нам в работе библиотек - временных задержек и конфигурации портов. Временные задержки в этом проекте не используем - они могут пригодиться в других проектах.
Итак
И соответственно в папке LIB
Так удобнее подключать к проекту дополнительные библиотеки.
Отдельно перемещаем файлы main.c и main.h
Соответственно в проекте Keila тоже добавляем эти папки. Ниже будет показан вид проекта.
После всех созданий и перемещений открываем проект в Keil правим пути к тому, что изменили
для этого открываем
Пункт
жмем на кнопку с трем точками ...
и корректируем пути в окне
После того как пути скорректированы (исходя из того в каком месте на жестком диске храниться проект) переходим непосредственно к написанию программы. Если по каким-то причинам не получается то скачиваем измененный проект - ссылка. НО даже после скачивания корректируем пути расположения файлов.
Итак переходим к написанию программы
Открываем проект который после корректировки имеет вид
Далее открываем открываем файлы
port_ini.c
port_ini.h
main.c
main.h
И наполняем их следующим содержимым :
port_ini.c - файл инициализации портов и прерывания по приходу сигнала от сенсорной кнопки TTP223
**************************************************************************************
#include "port_ini.h"
#include "stm32f0xx.h"
uint8_t fall=0; // переменная состояния ttp 223
// Подпрограмма в которую попадаем когда прервались по приходу сигнала от сенсорной кнопки
void EXTI4_15_IRQHandler (void)
{
if (EXTI_GetITStatus(EXTI_Line5) != RESET) // смотрим какая линия и если 5 а у нас PA5 выполняем код ниже
{
if (fall) // смотрим, что с переменной
{
fall=0; // если была 1 - обнуляем т.е. устанавливаем 0
}
else
{
fall=1; // если не была 1 устанавливаем в 1
}
EXTI_ClearITPendingBit(EXTI_Line5); // сбрасываем флаг прерывания
NVIC_ClearPendingIRQ(EXTI4_15_IRQn);
}
}
// Конфигурируем порты по светодиоды и сенсорную кнопку
void GPIO_init(void)
{
GPIO_InitTypeDef GPIO_InitStructure; // создаем структуру
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA ,ENABLE); // включаем тактирование порта А
// Светодиоды подключенные к портам - выход РA6 и РA7
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7; // выбираем пины на которых подключены светодиоды
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; // выход
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_Level_1; // скорость работы порта /* I/O output speed: Low 2 MHz */
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; // Тип выхода
GPIO_Init(GPIOA, &GPIO_InitStructure);
// Вход сигнала с ттр 223 - РA5
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; // выбираем пин
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; // вход
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_Level_1; // скорость работы порта /* I/O output speed: Low 2 MHz */
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN; // Включаем подтяжку к земле - уменьшаем дребезг при срабатывании
GPIO_Init(GPIOA, &GPIO_InitStructure);
// Настраиваем прерывания
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA,EXTI_PinSource5); // Порт РА5 - пин 5
EXTI_InitTypeDef EXTI_ttp223; // Определяем структуру
NVIC_InitTypeDef NVIC_ttp223; // Определяем структуру
EXTI_ttp223.EXTI_Line = EXTI_Line5; // Назначаем линию для прерывания по порту РА5 - пин 5
EXTI_ttp223.EXTI_Mode = EXTI_Mode_Interrupt; // Режим именно прерывания
EXTI_ttp223.EXTI_Trigger = EXTI_Trigger_Rising; // Режим срабатывания в данном случае по появлению сигнала на порту PA5
EXTI_ttp223.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_ttp223);
NVIC_ttp223.NVIC_IRQChannel = EXTI4_15_IRQn; // Так РА5 то и прерывание между 4 и 15
NVIC_ttp223.NVIC_IRQChannelPriority = 0; // т.к. это одно прерывание пусть будет основным
NVIC_ttp223.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_ttp223);
NVIC_EnableIRQ(EXTI4_15_IRQn);
}
******************************************************************************************************************************************
Содержание файла port_ini.h
*****************************************************************************************************************************************
#ifndef PORT_INI_H
#define PORT_INI_H
#include "stm32f0xx.h"
#define led_green_on GPIO_SetBits(GPIOA, GPIO_Pin_6); //Подаем «1» на PA6
#define led_green_off GPIO_ResetBits(GPIOA, GPIO_Pin_6); //Подаем «0» на PA6
#define led_red_on GPIO_SetBits(GPIOA, GPIO_Pin_7); //Подаем «1» на PA7
#define led_red_off GPIO_ResetBits(GPIOA, GPIO_Pin_7); //Подаем «0» на PA7
extern uint8_t fall; // делаем переменную внешней для использования ее в других подпрограммах
void GPIO_init(void);
#endif
*********************************************************************************************************************************
Содержание файла main.h
#ifndef MAIN_H
#define MAIN_H
#include "stm32f0xx.h"
#endif
**********************************************************************************************************************************
Содержимое файла main.c
***********************************************************************************************************************************
#include "main.h"
#include "delay.h" // подключаем но в данном проекте не используем
#include "port_ini.h"
int main(void)
{
GPIO_init(); // Инициализируем порты
while (1) {
if (fall) // читаем переменную и изменяем состояние светодиодов если изменилось состояние TTP223
{
led_red_on; // Если пришла 1 включаем красный светодиод
led_green_on; // Если пришла 1 включаем зеленый светодиод
}
else
{
led_red_off; // Если пришел 0 выключаем красный светодиод
led_green_off; // Если пришел 0 выключаем зеленый светодиод
}
}
}
********************************************************************************************************
Собираем проект
Ошибок быть не должно
Если схема собрана и ошибок не было то прошиваем микроконтроллер
Возможно реакции светодиодов не последует .. тогда идем в настройки программатора
Жмем Settings
В окне
Снимаем галку
Выходим и прошиваем еще раз и должно получиться как на видео
Ура!!!
Все получилось и теперь мы можем использовать сенсорную кнопку в своих более сложных проектах.
Если не получается и остались вопросы или нужен оригинал проекта то пишем на stm32@stm32res.ru