Ваше программное обеспечение отлично справляется с поставленной задачей, но оно также блокирует некоторые полезные и важные функции. Для наилучшего использования сайта, пожалуйста, найдите время, чтобы отключить ваш AdBlocker.

STM32F030F4P6 с TTP223

Опубликовано stm32 - вс, 10/11/2020 - 10:24

Всем привет!

В этой статье расскажу как использовать сенсорную кнопку TTP223 в своем проекте на микроконтроллере STM32F030F4P6.

Эта статья будет интересна тем, кто только изучает как работать с портами микроконтроллеров серии  STM32F03! 

В этой статье  я буду использовать:

1. Проект созданный ранее в STM32F030F4P6 Keil Первый проект с корректировкой.

2. Плата с микроконтроллером  STM32F030F4P6 hand-made 

3. Сенсорная кнопка TTP223 1 KEY TOUCH PAD DETECTOR.

Соединив все это вместе получаем следующий вид

kk3

Сборка включает в себя :

1. Программатор - можно использовать любой программатор для программирования микроконтроллеров STM32

2. Отладочная плата - можно использовать любую плату с установленным на ней микроконтроллером серии  STM32F03 скорректировав пины подключения светодиода(ов) и сенсорной кнопки

В моем случае: 

PA5 - настроен на вход с прерыванием - получим сигнал от сенсорной кнопки  TTP223

PA6, PA7 - настроены на выход - подключим светодиоды зеленый и красный 

3. Светодиод(ы) - любой подключенный к портам светодиод(ы). ВНИМАНИЕ !!! Мои светодиоды подключены через РЕЗИСТОР!  Так чтобы нагрузка на порт не превышала 5-10 мA.

4. Плату сенсорной кнопки на основе микросхемы TTP223-BA.

В проекте будем использовать IDE 

 ww

Структура проекта будет следующей

1. Настроим порты с использование прерывания.

2. В прерывании изменим переменную срабатывания сенсорной кнопки TTP223

3. В основной программе смотрим состояние переменной срабатывания сенсорной кнопки и включаем или выключаем светодиоды.

Я буду использовать проект созданный в статье STM32F030F4P6 Keil Первый проект скорректировав его следующим образом - внутри папки проекта созданного при помощи Кейла создаем папку LIB в которой создаем подпапки необходимых нам в работе библиотек -  временных задержек и конфигурации портов. Временные задержки в этом проекте не используем - они могут пригодиться в других проектах.

Итак

ww2

И соответственно в папке LIB

ww1

 Так удобнее подключать к проекту дополнительные библиотеки.

Отдельно перемещаем файлы main.c и main.h

ww3

Соответственно в проекте Keila тоже добавляем эти папки. Ниже будет показан вид проекта.

После всех созданий и перемещений открываем проект в Keil правим пути к тому, что изменили

для этого открываем 

  ww4

Пункт 

ww5

жмем на кнопку с трем точками ... 

и корректируем пути в окне 

ww6

После того как пути скорректированы (исходя из того в каком месте на жестком диске храниться проект) переходим непосредственно к написанию программы. Если по каким-то причинам не получается то скачиваем измененный проект - ссылка. НО даже после скачивания корректируем пути расположения файлов.

Итак переходим к написанию программы

Открываем проект который после корректировки имеет вид

 ww7_0

Далее открываем открываем файлы

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 выключаем зеленый светодиод
          }
            
                 }

   }

********************************************************************************************************

Собираем проект 

ww8

 

Ошибок быть не должно

ww9

Если схема собрана и ошибок не было то прошиваем микроконтроллер 

ww10

Возможно реакции светодиодов не последует .. тогда идем в настройки программатора 

ww11

Жмем Settings

ww12

В окне 

ww13

Снимаем галку 

ww14

Выходим и прошиваем еще раз  и должно получиться как на видео 

Видео файл

 

Ура!!!

Все получилось и теперь мы можем использовать сенсорную кнопку в своих более сложных проектах.

Если не получается и остались вопросы или нужен оригинал проекта то пишем на stm32@stm32res.ru

 

 

Яндекс.Метрика