Страница 1 из 1
STM32. Считывание данных и условия.
Добавлено: 17 июл 2014, 22:19
Rogers
Привет всем! Подскажите, как реализовать считывание данных с пина платы. Понимаю, что вопрос тривиальный, но что применять я не знаю.
Собственно задача: если на 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);
}
}
}
Re: STM32. Считывание данных и условия.
Добавлено: 18 июл 2014, 06:09
alex34
Внеси znachpin = GPIO.. внутрь цикла while (1). И кстати, ты не сбрасываешь пины 5 и 7. Добавь внутрь после setbit pi5 - resetbit pin7, а после set pin7 - reset pin5
Re: STM32. Считывание данных и условия.
Добавлено: 18 июл 2014, 14:22
Rogers
Немного поправил, но все равно не срабатывает.
Код: Выделить всё
#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);
}
Re: STM32. Считывание данных и условия.
Добавлено: 18 июл 2014, 17:44
alex34
1) ты настроил пин 3 на выход вместо входа, а 5 и 7 вообще не настроил.
2) initall надо вызывать до цикла, ты всё время по кругу их инициализируешь.
В остальном - должно работать
Re: STM32. Считывание данных и условия.
Добавлено: 18 июл 2014, 19:30
Rogers
Не совсем разобрался, но код тот, что нужен. Первый код - сделано через пин(как в условии), второй - через кнопку (при нажатии - 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);
}
Re: STM32. Считывание данных и условия.
Добавлено: 19 июл 2014, 05:58
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), третий на вход. Вообще, подавать сигналы на ВЫХОДНУЮ лапу нельзя - сожжёшь контроллер. Вобщем, код настройки должен быть такой:
Код: Выделить всё
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);
Re: STM32. Считывание данных и условия.
Добавлено: 20 июл 2014, 12:48
Rogers
Все работает как надо (по задаче). Рабочий код (исправлен):
Код: Выделить всё
#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);
}
Re: STM32. Считывание данных и условия.
Добавлено: 20 июл 2014, 19:44
alex34
Всё хорошо, только чтобы всё было совсем правильно
1) вынеси initAll до начала цикла, перед DO. Порт один раз нужно проинициализировать. Инициализировать его сто тысяч раз в секунду совсем ни к чему.
2) убери GPIO_SetBits(GPIOA, GPIO_Pin_3); У нас же третий пин это вход. Зачем в него пытаться что-то писать?