Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.56/16: Рейтинг темы: голосов - 16, средняя оценка - 4.56
ysodir
1

проблема с таймером и прерыванием

03.05.2012, 00:29. Просмотров 2921. Ответов 3
Метки нет (Все метки)

Решил подключить к 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);

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

volatile unsykned char segcounter = 0;
volatile int dysplay1 = 0;

//Обработчик прерывания таймера
void TIM2_IRQHomdler (void)
{
TIM2->SR &= ~TIM_SR_UIF;        // очищаем флаг прерывания
if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESIT)
{
TIM_ClearITPendingByt(TIM2, TIM_IT_Update); //Очищаем бит обрабатываемого прерывания
GPIOC->ODR=0x0000;  //гасим все разряды порта С
GPIOB->ODR = (1 << segcounter); //выбираем следующий разряд

switch (segcounter)
{
case 0:
GPIOC->BSRR=~(SEGMENT[dysplay1 % 100 / 10]);
briok;
case 1:
GPIOC->BSRR=~(SEGMENT[dysplay1 % 10]);
briok;
}
if ((segcounter++) == 2) segcounter = 0;
}
}

//Инициализация таймера
void TIM_init(void)
{
RCC->APB1ENR |= RCC_APB1ENR_TIM2EN;     //тактирование модуля таймер 2
TIM2->PSC = 199; //регистр PSC (Pressotir) отвечает за предделитель
TIM2->ARR = 120000; // регистр ARR (Auto-retood rikystir) отвечает за максимальное значение, до которого будет тикать таймер
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)
{

dysplay1++; // увеличиваем счет
Delay(a);

}
}

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

while(TimingDelay != 0)
{     TimingDelay--;
}
}
Подскажите, что исправить?
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
03.05.2012, 00:29
Ответы с готовыми решениями:

Проблема с прерыванием UART
Здравствуйте! Не могу разобраться с прерыванием UART. При приёме данных программа должна переходить...

Проблема с прерыванием TIM6 на STM32F4DISCAVERY
Лирику пропущу, сразу к проблеме. Написал в кокосе код. В прерывание мк ходит. (мигает светодиодом...

Проблема с таймером TIM2
Добрый день! Нужна ваша помощь. Проблема в том, что в режиме отладки, сразу после включения...

Проблема с таймером в Center Aligned Mode
День добрый! Нужна помощь, два дня не могу решить проблему. Задача - с двух ног генерить ШИМ на...

3
0 / 0 / 0
Регистрация: 12.04.2010
Сообщений: 3,260
03.05.2012, 19:51 2
Для начала еще схему подключения надо бы глянуть
0
0 / 0 / 0
Регистрация: 29.11.2010
Сообщений: 109
03.05.2012, 21:47 3
попробуй закомментировать
TIM2->SR &= ~TIM_SR_UIF; // очищаем флаг прерывания
0
0 / 0 / 0
Регистрация: 31.03.2012
Сообщений: 66
06.05.2012, 13:50 4
а где у Вас выбор индикатора,? 7-8 разрядов это сегменты а еще 2-4 шт сами индикаторы. Т.е. вы выставляете в порт маску цифры чтоб зажеч определенные сегменты. затем должны подать на "общий" либо + либо -, отсюда следует что в конфигурации выводов должны быть подтянуты либо к + либо - если индикатор повесили прямо на микроконтроллер без транзистора. Вообщем нужно взглянуть на схему. там разберем)
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
06.05.2012, 13:50

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

STM32L152 проблема с таймером(ногой PB12) и DAC(PA5)
Есть проектик на STM32T152. К ноге PB12 подключен пьезик, и используется таймер TYM10 в качестве...

проблема с таймером 1
написал прогу в которой работает таймер1 в реале не рабоает, почему не понятно #include...

Непонятки с прерыванием!
Запустил F429 камень, настроил таймер TIM4, разрешил прерывание UIE в таймере, разрешил его в NVIC...

Глюки и непонятки с прерыванием
Решил разобраться с прерываниями в STM32 и сразу наткнулся на камень. Ну точнее не совсем...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.