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

Все о микроконтроллерах: AVR, PIC, STM8, STM32, Arduino, Altera, Xilinx, все что угодно. Этот раздел для всего что клацает байтиками.
Post Reply
Rogers
Posts: 13
Joined: 30 Sep 2013, 21:37
Location: МО, Климовск

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

Post by Rogers »

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

Code: Select all

#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);
	}
}
}
User avatar
alex34
Posts: 301
Joined: 19 Sep 2011, 09:45
Location: Волгоград

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

Post by alex34 »

Внеси znachpin = GPIO.. внутрь цикла while (1). И кстати, ты не сбрасываешь пины 5 и 7. Добавь внутрь после setbit pi5 - resetbit pin7, а после set pin7 - reset pin5
Rogers
Posts: 13
Joined: 30 Sep 2013, 21:37
Location: МО, Климовск

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

Post by Rogers »

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

Code: Select all

#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);
}
User avatar
alex34
Posts: 301
Joined: 19 Sep 2011, 09:45
Location: Волгоград

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

Post by alex34 »

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

В остальном - должно работать
Rogers
Posts: 13
Joined: 30 Sep 2013, 21:37
Location: МО, Климовск

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

Post by Rogers »

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

Code: Select all

#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);
}

Code: Select all

#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);
}
User avatar
alex34
Posts: 301
Joined: 19 Sep 2011, 09:45
Location: Волгоград

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

Post by alex34 »

Не нужен 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), третий на вход. Вообще, подавать сигналы на ВЫХОДНУЮ лапу нельзя - сожжёшь контроллер. Вобщем, код настройки должен быть такой:

Code: Select all

   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
Posts: 13
Joined: 30 Sep 2013, 21:37
Location: МО, Климовск

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

Post by Rogers »

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

Code: Select all

#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);
}
User avatar
alex34
Posts: 301
Joined: 19 Sep 2011, 09:45
Location: Волгоград

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

Post by alex34 »

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