STM32. Считывание данных и условия.

Все о микроконтроллерах: AVR, PIC, STM8, STM32, Arduino, Altera, Xilinx, все что угодно. Этот раздел для всего что клацает байтиками.
Rogers
Сообщения: 13
Откуда: МО, Климовск

Сообщение Rogers » 17 июл 2014, 22:19

Привет всем! Подскажите, как реализовать считывание данных с пина платы. Понимаю, что вопрос тривиальный, но что применять я не знаю.
Собственно задача: если на PA3 "1", то установить "1" на PA5, иначе выставить "1" на PA7. Дело еще в том, что я сам задаю на PA3 "1", и должно получится, что на PA5 "1", но этого "анализа" в программе нет (if..else). Кое-что я уже набросал:

Код: Выделить всё

#include "stm32f4xx.h"

void initAll()
{
   GPIO_InitTypeDef GPIO_Init_A;

   RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE );

   GPIO_Init_A.GPIO_Pin = GPIO_Pin_3;
   GPIO_Init_A.GPIO_Mode = GPIO_Mode_OUT;
   GPIO_Init_A.GPIO_Speed = GPIO_Speed_2MHz;
   GPIO_Init_A.GPIO_OType = GPIO_OType_PP;
   GPIO_Init_A.GPIO_PuPd = GPIO_PuPd_NOPULL;

   GPIO_Init(GPIOA, &GPIO_Init_A);
}

int main (void)
{
   uint8_t ZnachPin = 0;   
   initAll();
ZnachPin = GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_3);   
while(1)
{
   GPIO_SetBits(GPIOA, GPIO_Pin_3);
   if (ZnachPin == 1)
   {
      GPIO_SetBits(GPIOA, GPIO_Pin_5);
   }
   else
   {
      GPIO_SetBits(GPIOA, GPIO_Pin_7);
   }
}
}

Аватара пользователя
alex34
Сообщения: 301
Откуда: Волгоград

Сообщение alex34 » 18 июл 2014, 06:09

Внеси znachpin = GPIO.. внутрь цикла while (1). И кстати, ты не сбрасываешь пины 5 и 7. Добавь внутрь после setbit pi5 - resetbit pin7, а после set pin7 - reset pin5

Rogers
Сообщения: 13
Откуда: МО, Климовск

Сообщение Rogers » 18 июл 2014, 14:22

Немного поправил, но все равно не срабатывает.

Код: Выделить всё

#include "stm32f4xx.h"

void initAll()
{
   GPIO_InitTypeDef GPIO_Init_A;

   RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE );

   GPIO_Init_A.GPIO_Pin = GPIO_Pin_3;
   GPIO_Init_A.GPIO_Mode = GPIO_Mode_OUT;
   GPIO_Init_A.GPIO_Speed = GPIO_Speed_2MHz;
   GPIO_Init_A.GPIO_OType = GPIO_OType_PP;
   GPIO_Init_A.GPIO_PuPd = GPIO_PuPd_NOPULL;

   GPIO_Init(GPIOA, &GPIO_Init_A);
}

int main (void)
{
   uint16_t ZnachPin = 0;   
   do
   {
      initAll();
      GPIO_SetBits(GPIOA, GPIO_Pin_3);
      ZnachPin = GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_3);
   
   if (ZnachPin == 1)
   {
      GPIO_SetBits(GPIOA, GPIO_Pin_5);
      GPIO_ResetBits(GPIOA, GPIO_Pin_7);
   }
   else
   {
      GPIO_SetBits(GPIOA, GPIO_Pin_7);
      GPIO_ResetBits(GPIOA, GPIO_Pin_5);
   }

}
   while(1);
}

Аватара пользователя
alex34
Сообщения: 301
Откуда: Волгоград

Сообщение alex34 » 18 июл 2014, 17:44

1) ты настроил пин 3 на выход вместо входа, а 5 и 7 вообще не настроил.
2) initall надо вызывать до цикла, ты всё время по кругу их инициализируешь.

В остальном - должно работать

Rogers
Сообщения: 13
Откуда: МО, Климовск

Сообщение Rogers » 18 июл 2014, 19:30

Не совсем разобрался, но код тот, что нужен. Первый код - сделано через пин(как в условии), второй - через кнопку (при нажатии - 1 на PA7, 0 на PA5 , без нажатия - наоборот).

Код: Выделить всё

#include "stm32f4xx.h"

void initAll()
{
   GPIO_InitTypeDef GPIO_Init_A;

   RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE );

   GPIO_Init_A.GPIO_Pin = GPIO_Pin_3|GPIO_Pin_5|GPIO_Pin_7;
   GPIO_Init_A.GPIO_Mode = GPIO_Mode_OUT;
   GPIO_Init_A.GPIO_Speed = GPIO_Speed_2MHz;
   GPIO_Init_A.GPIO_OType = GPIO_OType_PP;
   GPIO_Init_A.GPIO_PuPd = GPIO_PuPd_NOPULL;

   GPIO_Init(GPIOA, &GPIO_Init_A);
}

int main (void)
{
   //uint8_t ZnachPin = 0;   
   do
   {
      initAll();
      GPIO_SetBits(GPIOA, GPIO_Pin_3);
      
   if ((GPIOA->IDR & 0x00000040)!=0x00000040)
   {
      GPIO_SetBits(GPIOA, GPIO_Pin_5);
      GPIO_ResetBits(GPIOA, GPIO_Pin_7);
   }
   else
   {
      GPIO_SetBits(GPIOA, GPIO_Pin_7);
      GPIO_ResetBits(GPIOA, GPIO_Pin_5);
   }

}
   while(1);
}

Код: Выделить всё

#include "stm32f4xx.h"

void initAll()
{
   GPIO_InitTypeDef GPIO_Init_A;

   RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE );

   GPIO_Init_A.GPIO_Pin = GPIO_Pin_3|GPIO_Pin_5|GPIO_Pin_7;
   GPIO_Init_A.GPIO_Mode = GPIO_Mode_OUT;
   GPIO_Init_A.GPIO_Speed = GPIO_Speed_2MHz;
   GPIO_Init_A.GPIO_OType = GPIO_OType_PP;
   GPIO_Init_A.GPIO_PuPd = GPIO_PuPd_NOPULL;

   GPIO_Init(GPIOA, &GPIO_Init_A);
}

int main (void)
{
   //uint8_t ZnachPin = 0;   
   do
   {
      initAll();
   //   GPIO_SetBits(GPIOA, GPIO_Pin_3);
      
   if ((GPIOA->IDR & 0x01)==0x01)
   {
      GPIO_SetBits(GPIOA, GPIO_Pin_5);
      GPIO_ResetBits(GPIOA, GPIO_Pin_7);
   }
   else
   {
      GPIO_SetBits(GPIOA, GPIO_Pin_7);
      GPIO_ResetBits(GPIOA, GPIO_Pin_5);
   }

}
   while(1);
}

Аватара пользователя
alex34
Сообщения: 301
Откуда: Волгоград

Сообщение alex34 » 19 июл 2014, 05:58

Не нужен IDR, Gpioreadinputbit вполне подойдет. Разберись всё-таки с настройками порта.
GPIO_Init_A.GPIO_Pin = GPIO_Pin_3;
GPIO_Init_A.GPIO_Mode = GPIO_Mode_OUT;

Здесь что: третий пин, настраивается на выход (OUT). Тебе же нужно: 5 и 7 на выход (GPIO_Pin_5|GPIO_Pin_7, GPIO_Mode_OUT), третий на вход. Вообще, подавать сигналы на ВЫХОДНУЮ лапу нельзя - сожжёшь контроллер. Вобщем, код настройки должен быть такой:

Код: Выделить всё

   GPIO_Init_A.GPIO_Pin =GPIO_Pin_5|GPIO_Pin_7;
   GPIO_Init_A.GPIO_Mode = GPIO_Mode_OUT;
   GPIO_Init_A.GPIO_Speed = GPIO_Speed_2MHz;
   GPIO_Init_A.GPIO_OType = GPIO_OType_PP;
   GPIO_Init_A.GPIO_PuPd = GPIO_PuPd_NOPULL;

   GPIO_Init(GPIOA, &GPIO_Init_A);

   GPIO_Init_A.GPIO_Pin =GPIO_Pin_3;
   GPIO_Init_A.GPIO_Mode = GPIO_Mode_IN;
   GPIO_Init_A.GPIO_PuPd = GPIO_PuPd_UP;                   // подтянем к плюсу. Если на вход ничего не подать - будет читаться единица

   GPIO_Init(GPIOA, &GPIO_Init_A);


Rogers
Сообщения: 13
Откуда: МО, Климовск

Сообщение Rogers » 20 июл 2014, 12:48

Все работает как надо (по задаче). Рабочий код (исправлен):

Код: Выделить всё

#include "stm32f4xx.h"

void initAll()
{
   GPIO_InitTypeDef GPIO_Init_A;

   RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE );
   GPIO_Init_A.GPIO_Pin = GPIO_Pin_5|GPIO_Pin_7;
   GPIO_Init_A.GPIO_Mode = GPIO_Mode_OUT;
   GPIO_Init_A.GPIO_Speed = GPIO_Speed_2MHz;
   GPIO_Init_A.GPIO_OType = GPIO_OType_PP;
   GPIO_Init_A.GPIO_PuPd = GPIO_PuPd_NOPULL;
   
    GPIO_Init(GPIOA, &GPIO_Init_A);

   GPIO_Init_A.GPIO_Pin = GPIO_Pin_3;
   GPIO_Init_A.GPIO_Mode = GPIO_Mode_IN;
//   GPIO_Init_A.GPIO_Speed = GPIO_Speed_2MHz;
//   GPIO_Init_A.GPIO_OType = GPIO_OType_PP;
   GPIO_Init_A.GPIO_PuPd = GPIO_PuPd_UP;

   GPIO_Init(GPIOA, &GPIO_Init_A);
}

int main (void)
{
   uint16_t ZnachPin = 0;   
   do
   {
      initAll();
      GPIO_SetBits(GPIOA, GPIO_Pin_3);
      ZnachPin = GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_3);
   
   if (ZnachPin == 1)
   {
      GPIO_SetBits(GPIOA, GPIO_Pin_5);
      GPIO_ResetBits(GPIOA, GPIO_Pin_7);
   }
   else
   {
      GPIO_SetBits(GPIOA, GPIO_Pin_7);
      GPIO_ResetBits(GPIOA, GPIO_Pin_5);
   }

}
   while(1);
}

Аватара пользователя
alex34
Сообщения: 301
Откуда: Волгоград

Сообщение alex34 » 20 июл 2014, 19:44

Всё хорошо, только чтобы всё было совсем правильно
1) вынеси initAll до начала цикла, перед DO. Порт один раз нужно проинициализировать. Инициализировать его сто тысяч раз в секунду совсем ни к чему.
2) убери GPIO_SetBits(GPIOA, GPIO_Pin_3); У нас же третий пин это вход. Зачем в него пытаться что-то писать?

Вернуться в «Микроконтроллеры и ПЛИС»



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 5 гостей