Перейти к содержанию

Порты Gpio На Stm32F4Discovery


K.A.

Рекомендуемые сообщения

Добрый день. Решил сделать часы на газоразрядных индикаторах. Остановился на управлении дешифратором, который преобразует двоичный код порта в десятичный. Использую дешифратор К155ИД1 и отладочную плату STM32F4Discovery. Проблема в следующем: при попытке выставить любое значение порта от 0b0000 до 0b1111 напряжение на выводах микроконтроллера "гуляет" в пределах 0,5 - 1,3 В, адекватно реагирует только нулевой пин. То есть, если отладчик показывает, что GPIOA = 0b0110, то на нулевом выходе логический ноль(0 - 10мВ), а на остальных "болтанка". Пробовал "перенести" программу на другие порты - все то же самое, только на порте Е адекватно работают 0 и 2 пины. Пробовал проводить измерения как с висящими в воздухе выводами, так и подключенными к дешифратору, результат 0.

В чем может быть дело? Схему подключения и файлы проекта прикладываю ниже. Простите за внешний вид кода - это рабочая версия.post-172712-0-11355400-1442925860_thumb.png

#include "stm32f4xx.h"
#include "stm32f4xx_rcc.h"
#include "stm32f4xx_pwr.h"
#include "stm32f4xx_rtc.h"
//#include "stm32f4xx_conf.h"
//#include "system_stm32f4xx.h"
#include "misc.h"
#include "stm32f4xx_exti.h"
#include "stm32f4xx_gpio.h"
//****************Объявляем переменные*************************************
RTC_InitTypeDef rtc;
RTC_TimeTypeDef time;
RTC_TimeTypeDef alarmTime;
RTC_AlarmTypeDef alarm;
EXTI_InitTypeDef exti;
NVIC_InitTypeDef NVIC_InitStructure;
uint16_t i = 0;
uint16_t R0 = 0, R1 = 0, R2 = 0, R3 = 0; //Переменные, содержащие числа, которые будут отправлены в соответствующие
//разряды
//**************************************************************************
void initRTC() //Функция инициализации модуля часов реального времени
{
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE); //Включаем питание
PWR_BackupAccessCmd(ENABLE); //Разрешаем доступ к области данных, которая может питаться от резервной батареи при выключении питания
RCC_BackupResetCmd(ENABLE); //
RCC_BackupResetCmd(DISABLE); //Комманды для сброса модуля RTC
RCC_LSICmd(ENABLE); //Выбираем тактирование от внутреннего источника и включаем его питание
RCC_RTCCLKConfig(RCC_RTCCLKSource_LSI); //
RCC_RTCCLKCmd(ENABLE); //
rtc.RTC_HourFormat = RTC_HourFormat_24; //Выбираем 24-ех часовой формат времени
rtc.RTC_SynchPrediv = 0x7FFF; //С помощью синхронного делителя получаем сигнал с частотой 1Гц
RTC_Init(&rtc); //Выполняем инициализацию настроек
}
void RTC_Alarm_IRQHandler() //Функция обработки прерывания от будильника
{
if(RTC_GetITStatus(RTC_IT_ALRA) != RESET) //Если будильник вызвал прерывание, то флаги сработавших прерываний (внешнего прерывания и прерывания от будильника) сбрасываются
{
RTC_ClearITPendingBit(RTC_IT_ALRA); //Сброс флага прервания от будильника
EXTI_ClearITPendingBit(EXTI_Line17); //Сброс флага внешнего прерывания
}
}
void init_led_port(void) //Конфигурация порта со светодиодами
{
GPIO_InitTypeDef GPIO_InitStructure; //Структруа, содержащая настройки порта
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); //Включаем тактирование порта со светодиодами
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE); //Включаем тактирование порта со светодиодами
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0, GPIO_Pin_1, GPIO_Pin_2, GPIO_Pin_3; //Выбираем необходимые пины
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; //Пины работают на выход
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; //Скорость работы пинов
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //Тип значение порта - двухуровневый
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN; //Начальное значение пинов - 0
GPIO_Init(GPIOE, &GPIO_InitStructure); //Инициализация настроек
GPIO_Init(GPIOA, &GPIO_InitStructure); //Инициализация настроек
}
void EXTI_Conf(void) //Настройка прерывания от будильника
{
//******************Конфигурация линии прерывания**********************************
EXTI_ClearITPendingBit(EXTI_Line17); //Очищаем флаг по 17-ой линии прерывания (см. Datasheet)
exti.EXTI_Line = EXTI_Line17; //Определяем, что будем использовать 17-ую линию прерывания, отвечающую за будильник (см. Datasheet)
exti.EXTI_Mode = EXTI_Mode_Interrupt; //Определяем, что при установки флага будет происходить прерывание, а не какое либо событие
exti.EXTI_Trigger = EXTI_Trigger_Rising; //Устанавливаем срабатывание по нарастанию
exti.EXTI_LineCmd = ENABLE; //"Включаем" линию прерывания
//***************************************************************************
//*****************Конфигурация прерывания******************************
NVIC_InitStructure.NVIC_IRQChannel = RTC_Alarm_IRQn; //Устанавливаем источник прерывания
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;//Устанавливаем приоритет обработки прервания
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //Определяет приоритет для выбранного канала прерывания
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //Включаем выбранный канал прерывания
NVIC_Init(&NVIC_InitStructure); //Выполняем инициализацию
//*****************************************************************************
}
void Alarm_Conf(void) //Настройка будильника
{
//********************Установка будильника**********************************
alarmTime.RTC_H12 = RTC_HourFormat_24;
alarmTime.RTC_Hours = 20;
alarmTime.RTC_Minutes = 00;
alarmTime.RTC_Seconds = 15;
alarm.RTC_AlarmTime = alarmTime; //Записываем параметры будильника в структуру инициализации будильника
alarm.RTC_AlarmMask = RTC_AlarmMask_DateWeekDay; //Включаем срабатывание будильника каждый день
RTC_SetAlarm(RTC_Format_BIN, RTC_Alarm_A, &alarm); //Включаем будильник А(в запасе остается еще Б)
RTC_OutputConfig(RTC_Output_AlarmA, RTC_OutputPolarity_High); //Включаем сигнал при срабатывании будильника
RTC_ITConfig(RTC_IT_ALRA, ENABLE); //Включаем прерывание от будильника А
RTC_AlarmCmd(RTC_Alarm_A, ENABLE); //Подключаем все настройки для будильника
RTC_ClearFlag(RTC_FLAG_ALRAF); //Сбрасываем флаг будильника А
//******************************************************************************
}
void time_conversion() //Функция преобразования времени в отдельные числа
{
if (i >= 1000)
{
R3 = (i - i % 1000) / 1000;
i = i%1000;
}
if (i >= 100)
{
R2 = (i - i % 100) / 100;
i = i%100;
}
if (i >= 10)
{
R1 = (i - i % 10) / 10;
i = i%10;
}
if (i >= 1)
{
R0 = (i - i % 1) / 1;
i = i%1;
}
return (R3, R2, R1, R0);
}
int main(void)
{
__enable_irq(); //Разрешаем прерывания
initRTC(); //Инициализируем RTC
init_led_port(); //Инициализируем порт со светодиодами
EXTI_Conf(); //Настройка прерывания от будильника
//******************Установка текущего времени*******************************
time.RTC_H12 = RTC_HourFormat_24;
time.RTC_Hours = 23;
time.RTC_Minutes = 25;
time.RTC_Seconds = 00;
RTC_SetTime(RTC_Format_BIN, &time);
//*****************************************************************************
while (1)
{
RTC_GetTime(RTC_Format_BIN, &time); //Получаем текущее значение времени
i = time.RTC_Hours*100 + time.RTC_Minutes; //Переводим текущее время в четырехначное число
time_conversion();
/*
while (i > 0)
{
if (i >= 1000)
{
i = i - 1000;
R3 ++;
}
if (i >= 100)
{
i = i - 100;
R2 ++;
}
if (i >= 10)
{
i = i - 10;
R1 ++;
}
if (i >= 1)
{
i = i - 1;
R0 ++;
}
*/
if (R3 == 0) { R3 = 11; }
if ((R3 + R2) == 0) { R3 = R2 = 11; }
if ((R3 + R2 +R1) == 0) { R3 = R2 = R1 = 11; }
/* GPIO_SetBits(GPIOA, R3);
GPIO_SetBits(GPIOC, 1);
GPIO_SetBits(GPIOA, R2);
GPIO_SetBits(GPIOC, 4);
GPIO_SetBits(GPIOA, R1);
GPIO_SetBits(GPIOC, 8);
*/
GPIO_Write(GPIOE, R0);
GPIO_Write(GPIOE, 0b0);
/* GPIO_Write(GPIOE, 0);
GPIO_Write(GPIOE, 1);
GPIO_Write(GPIOE, 2);
GPIO_Write(GPIOE, 3);
GPIO_Write(GPIOE, 4);
GPIO_Write(GPIOE, 5);*/
// GPIO_SetBits(GPIOC, 16);
// GPIO_SetBits(GPIOA, GPIO_Pin_1);
}
//if (time.RTC_Seconds == 2) //При прошествии двух секунд необходимо включить светодиоды
// {GPIO_SetBits(GPIOD, GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15);}
// GPIO_ResetBits(GPIOD, GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15);
}

В конце простыни можно увидеть попытки присвоить различные значения порту и проверить, что будет на выходе. Результат остался нулевым. Еще раз повторюсь, отладчик указывает, что в порты выставляется значение как положено, но при измерении получается ****.

Nixie_Clock_0v01.rar

Изменено пользователем K.A.
Ссылка на комментарий
Поделиться на другие сайты

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

Ни разу не встречал присвоение списком, через запятую. Интересно, что компилятор это проглатывает без ошибок. Что бы это значило с точки зрения компилятора?

Ссылка на комментарий
Поделиться на другие сайты

Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов

 Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Большое спасибо! совсем заработался, пора перекурить, компилятор это действительно "проглотил"

Изменено пользователем K.A.
Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...