STM32F4+таймеры+семисегментный индикатор

Кто любит RISC в жизни, заходим, не стесняемся.
Ответить
TmYAG
Встал на лапы
Сообщения: 89
Зарегистрирован: Пн окт 14, 2013 21:39:47

STM32F4+таймеры+семисегментный индикатор

Сообщение TmYAG »

Всем привет! И снова я со своими вопросами!)
Решил написать программку по таймеру каждую секунду обновляется значение на семисегментном индикаторе.
В режиме отладки вроде все ничего. Считает, меняет цифры, но если запустить, то всего этого нет. Тупо все индикаторы загораются и все.
Подскажите пожалуйста, что я делаю не так?

Код: Выделить всё

#include "stm32f4xx.h"                  // Device header

#define SEG_A 7
#define SEG_B 6
#define SEG_C 4
#define SEG_D 2
#define SEG_E 1
#define SEG_F 9
#define SEG_G 10

#define DIG_1 (0<<SEG_A)|(1<<SEG_B)|(1<<SEG_C)|(0<<SEG_D)|(0<<SEG_E)|(0<<SEG_F)|(0<<SEG_G)
#define DIG_2 (1<<SEG_A)|(1<<SEG_B)|(0<<SEG_C)|(1<<SEG_D)|(1<<SEG_E)|(0<<SEG_F)|(1<<SEG_G)
#define DIG_3 (1<<SEG_A)|(1<<SEG_B)|(1<<SEG_C)|(1<<SEG_D)|(0<<SEG_E)|(0<<SEG_F)|(1<<SEG_G)
#define DIG_4 (0<<SEG_A)|(1<<SEG_B)|(1<<SEG_C)|(0<<SEG_D)|(0<<SEG_E)|(1<<SEG_F)|(1<<SEG_G)
#define DIG_5 (1<<SEG_A)|(0<<SEG_B)|(1<<SEG_C)|(1<<SEG_D)|(0<<SEG_E)|(1<<SEG_F)|(1<<SEG_G)
#define DIG_6 (1<<SEG_A)|(0<<SEG_B)|(1<<SEG_C)|(1<<SEG_D)|(1<<SEG_E)|(1<<SEG_F)|(1<<SEG_G)
#define DIG_7 (1<<SEG_A)|(1<<SEG_B)|(1<<SEG_C)|(0<<SEG_D)|(0<<SEG_E)|(0<<SEG_F)|(0<<SEG_G)
#define DIG_8 (1<<SEG_A)|(1<<SEG_B)|(1<<SEG_C)|(1<<SEG_D)|(1<<SEG_E)|(1<<SEG_F)|(1<<SEG_G)
#define DIG_9 (1<<SEG_A)|(1<<SEG_B)|(1<<SEG_C)|(1<<SEG_D)|(0<<SEG_E)|(1<<SEG_F)|(1<<SEG_G) 
#define DIG_0 (1<<SEG_A)|(1<<SEG_B)|(1<<SEG_C)|(1<<SEG_D)|(1<<SEG_E)|(1<<SEG_F)|(0<<SEG_G)

int ind_LED[10]  = {DIG_1, DIG_2, DIG_3, DIG_4, DIG_5, DIG_6, DIG_7, DIG_8, DIG_9, DIG_0};
volatile static uint32_t i = 0;

void TIM6_DAC_IRQHandler(){
	if (i <10) {
		GPIOD->ODR = 0x00;
		GPIOD->ODR |= ind_LED[i];
		i++;
	}
	else if(i == 10){
		GPIOD->ODR = 0x00;
		GPIOD->ODR |= ind_LED[i];
		i = 0;
	}
	
	//GPIOD->ODR = DIG_2;
}

int main(){

	RCC->AHB1ENR |= RCC_AHB1ENR_GPIODEN;
	GPIOD->MODER = 0x55555555;
	GPIOD->OTYPER = 0;
	GPIOD->OSPEEDR = 0;
	
	RCC->APB1ENR = RCC_APB1ENR_TIM6EN;
	TIM6->PSC = 24000-1;
	TIM6->ARR = 1000;
	TIM6->CR1 = TIM_CR1_CEN;
	TIM6->DIER = TIM_DIER_UIE; 
	NVIC_EnableIRQ(TIM6_DAC_IRQn);
	while(1) {
	}

}
Вложения
L5_LED_Indicators_Timer_CMSIS.zip
(710.91 КБ) 154 скачивания
Реклама
Аватара пользователя
qbit
Встал на лапы
Сообщения: 101
Зарегистрирован: Вт апр 02, 2013 10:03:29
Откуда: Санкт-Петербург
Контактная информация:

Re: STM32F4+таймеры+семисегментный индикатор

Сообщение qbit »

TmYAG писал(а):...Подскажите пожалуйста, что я делаю не так?

Код: Выделить всё

else if(i == 10){

Код: Выделить всё

else if(i >= 10){
Для связи email: info собака qbit.su
Реклама
TmYAG
Встал на лапы
Сообщения: 89
Зарегистрирован: Пн окт 14, 2013 21:39:47

Re: STM32F4+таймеры+семисегментный индикатор

Сообщение TmYAG »

Это не повлияет на динамическое переключение индикатора. Разве что я напутал с нумерацией. Там не 10 должно быть а 9.
Проблема именно в том, что цифры не переключаются в режиме реального времени, а лишь при отладке можно увидеть конкретные значения.
Ответить

Вернуться в «ARM»