Easyelectronics.ru

Электроника для всех
Текущее время: 29 окт 2020, 21:32

Часовой пояс: UTC + 5 часов



JLCPCB – Прототипы печатных плат за $2/5шт. два слоя. $5/5шт. четыре слоя
Крупнейший производитель печатных плат и прототипов. Более 600000 клиентов и свыше 10000 заказов в день!
Получите скидку на почтовую отправку при первом заказе в JLCPCB!

Начать новую тему Ответить на тему  [ Сообщений: 4 ] 
Автор Сообщение
 Заголовок сообщения: проблема с таймером и прерыванием
СообщениеДобавлено: 04 май 2012, 00:16 
Здравствуйте!

Зарегистрирован: 06 дек 2011, 15:07
Сообщения: 2
Решил подключить к stm32vldiscovery двухразрядный семисегментный индикатор. Включить отдельно каждый разряд несложно. Но вот как сделать вывод цифр от 0 до 99 в режиме динамической индикации? Решил осуществить это при помощи таймера и прерывания. Но видимо что-то не то делаю (я еще абсолютный чайник в этом), т.к. индикатор не отображает ничего.
Код:
#include "stm32f10x.h"
#include <stm32f10x_gpio.h>
#include <stm32f10x_rcc.h>
#include <stm32f10x_tim.h>
#include <misc.h>

static __IO uint32_t TimingDelay;
void Delay(uint32_t nTime);
void TimingDelay_Decrement(void);

unsigned char SEGMENT[ ] =
{
  0x3F, //0
  0x06, //1
  0x5B, //2
  0x4F, //3   
  0x66, //4
  0x6D, //5
  0x7D, //6
  0x07, //7   
  0x7F, //8
  0x6F  //9   
};

volatile unsigned char segcounter = 0;
volatile int display1 = 0;

  //Обработчик прерывания таймера
void TIM2_IRQHandler (void)
{
  TIM2->SR &= ~TIM_SR_UIF;        // очищаем флаг прерывания
if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)
  {
    TIM_ClearITPendingBit(TIM2, TIM_IT_Update); //Очищаем бит обрабатываемого прерывания
    GPIOC->ODR=0x0000;  //гасим все разряды порта С
    GPIOB->ODR = (1 << segcounter); //выбираем следующий разряд
   
    switch (segcounter)
    {
      case 0:
        GPIOC->BSRR=~(SEGMENT[display1 % 100 / 10]);
        break;
      case 1:
        GPIOC->BSRR=~(SEGMENT[display1 % 10]);
        break;
    }
    if ((segcounter++) == 2) segcounter = 0;
  }
}

//Инициализация таймера
void TIM_init(void)
{
        RCC->APB1ENR |= RCC_APB1ENR_TIM2EN;     //тактирование модуля таймер 2
        TIM2->PSC = 199; //регистр PSC (Prescaler) отвечает за предделитель
        TIM2->ARR = 120000; // регистр ARR (Auto-reload register) отвечает за максимальное значение, до которого будет тикать таймер
        TIM2->CR1 |= TIM_CR1_CEN; //разрешение работы таймера и сброс по достижении макс. значения
        TIM2->DIER |= TIM_DIER_UIE; //по достижении макс. значения таймер уведомляет контроллер прерываний
}


//Главная функция
void main(void)
{

int a;
a=5000;  //величина задержки
 
  //Включаем тактирование
  RCC->APB2ENR|=RCC_APB2ENR_IOPCEN; //подаем тактирование на порт C
  RCC->APB2ENR|=RCC_APB2ENR_IOPBEN; //подаем тактирование на порт B
 
  //конфигурация портов 
  GPIOC->CRL|=(GPIO_CRL_MODE0_1 | GPIO_CRL_MODE1_1 | GPIO_CRL_MODE2_1 | GPIO_CRL_MODE3_1 | GPIO_CRL_MODE4_1 | GPIO_CRL_MODE5_1 | GPIO_CRL_MODE6_1);
  GPIOC->CRL&=~(GPIO_CRL_CNF0_0 | GPIO_CRL_CNF1_0 | GPIO_CRL_CNF2_0 | GPIO_CRL_CNF3_0 | GPIO_CRL_CNF4_0 | GPIO_CRL_CNF5_0 | GPIO_CRL_CNF6_0);
  GPIOB->CRL|=(GPIO_CRL_MODE0_1 | GPIO_CRL_MODE1_1);
  GPIOB->CRL&=~(GPIO_CRL_CNF0_0 | GPIO_CRL_CNF1_0);

   
  TIM_init();
  __enable_irq(); // глобальное включение прерывания
  NVIC_EnableIRQ(TIM2_IRQn); // прерывание по таймеру2
  NVIC_SetPriority(TIM2_IRQn, 1); // приоритет

  GPIOC->ODR=0x0000;
  GPIOB->ODR=0x0000;
 
   while (1)
  {
     
    display1++; // увеличиваем счет
    Delay(a);
   
  }
}


/** Подпрограмма задержки**/
void Delay(uint32_t nTime)
{ TimingDelay = nTime;

  while(TimingDelay != 0)
  {     TimingDelay--;
  }
}

Подскажите, что исправить?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: проблема с таймером и прерыванием
СообщениеДобавлено: 04 май 2012, 19:38 
Старожил
Аватара пользователя

Зарегистрирован: 17 апр 2010, 08:38
Сообщения: 4921
Откуда: Усинск, республика Коми
Для начала еще схему подключения надо бы глянуть

_________________
хаос это непознанный порядок


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: проблема с таймером и прерыванием
СообщениеДобавлено: 04 май 2012, 21:34 
Заглядывает иногда

Зарегистрирован: 29 ноя 2010, 23:50
Сообщения: 140
Откуда: Калуга
попробуй закомментировать
TIM2->SR &= ~TIM_SR_UIF; // очищаем флаг прерывания


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: проблема с таймером и прерыванием
СообщениеДобавлено: 07 май 2012, 13:37 
Заглядывает иногда

Зарегистрирован: 04 апр 2012, 01:14
Сообщения: 66
а где у Вас выбор индикатора,? 7-8 разрядов это сегменты а еще 2-4 шт сами индикаторы. Т.е. вы выставляете в порт маску цифры чтоб зажеч определенные сегменты. затем должны подать на "общий" либо + либо -, отсюда следует что в конфигурации выводов должны быть подтянуты либо к + либо - если индикатор повесили прямо на микроконтроллер без транзистора. Вообщем нужно взглянуть на схему. там разберем)

_________________
...и на пятый день господь создал STM32F407...


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 4 ] 


Часовой пояс: UTC + 5 часов


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

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


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

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB