Всем добрый вечер. Проблема следующая. Есть плата STM32VL Discovery. К ней цепляется з-х разрядный семисегментный индикатор. Цифры предполагается выводить динамически. Но при выводе первого разряда вместе с ним подсвечивается и второй, при выводе 2-го подсвечивается 3-й и соответственно при выводе 3-го подсвечивается 1-й. Пробовал различные частоты вывода и применять задержки между выключением предыдущего индикатора и включением последующего. В чём может быть дело??? На Си только начинаю программировать, поэтому код скорее всего не эффективный, но всё же.
Жду ваших ответов.
Раздел: STM32
Жду ваших ответов.
#include "stm32f10x.h"
#include "stm32f10x_rcc.h"
#include "stm32f10x_gpio.h"
#include "stm32f10x_tim.h"
#define IND_PORT GPIOA// This port is responsible for the display of "IND_PORT"
#define D1 GPIO_Pin_0//This conclusion is responsible for 1st indicator
#define D2 GPIO_Pin_1//This conclusion is responsible for 2nd indicator
#define D3 GPIO_Pin_2//This conclusion is responsible for 3rd indicator
// A segment of the indicator - the output of the microcontroller
#define SEG_A GPIO_Pin_0// seg "A"
#define SEG_B GPIO_Pin_1// seg "B"
#define SEG_C GPIO_Pin_2// seg "C"
#define SEG_D GPIO_Pin_3// seg "D"
#define SEG_E GPIO_Pin_4// seg "E"
#define SEG_F GPIO_Pin_5// seg "F"
#define SEG_G GPIO_Pin_6// seg "G"
#define DP GPIO_Pin_7 //Decimal point
// Create the numbers of segments
#define DIG0 ( SEG_A | SEG_B | SEG_C | SEG_D | SEG_E | SEG_F )
#define DIG1 ( SEG_B | SEG_C )
#define DIG2 ( SEG_A | SEG_B | SEG_G | SEG_E | SEG_D )
#define DIG3 ( SEG_A | SEG_B | SEG_G | SEG_C | SEG_D )
#define DIG4 ( SEG_F | SEG_G | SEG_B | SEG_C)
#define DIG5 ( SEG_A | SEG_F | SEG_G | SEG_C | SEG_D )
#define DIG6 ( SEG_A | SEG_C | SEG_D | SEG_E | SEG_F | SEG_G )
#define DIG7 ( SEG_A | SEG_B | SEG_C )
#define DIG8 ( SEG_A | SEG_B | SEG_C | SEG_D | SEG_E | SEG_F | SEG_G)
#define DIG9 ( SEG_A | SEG_B | SEG_C | SEG_D | SEG_F | SEG_G)
#define ALL_PINS (DIG8 | D1 | D2 | D3 )
// Delay
void Delay (void);
void Delay (void)
{
unsigned long i;
for (i=0; i<20000; i++);
}
//
#define TIMER_PRESCALER 720
uint8_t previousState;
uint8_t IND_State;
GPIO_InitTypeDef port;//???
TIM_TimeBaseInitTypeDef timer;
uint8_t counter1;
uint8_t counter2;
uint8_t counter3;
uint8_t rez;
uint8_t digit;
void digit_to_port (uint8_t digit){
uint8_t digitsp[]={DIG0,DIG1,DIG2,DIG3,DIG4,DIG5,DIG6,DIG7,DIG8,DIG9};
IND_PORT->ODR &= ~DIG8;
IND_PORT->ODR |= digitsp[digit];
}
//
void initAll()
{
GPIO_InitTypeDef port;//???
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //On port "A"
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //On port "B"
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE); //On timer "Tim 4"
GPIO_StructInit(&port);
//Port "A" input
port.GPIO_Mode = GPIO_Mode_Out_PP;
port.GPIO_Pin = DIG8 | DP;
port.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init(GPIOA, &port);
//Port "B" output
port.GPIO_Mode = GPIO_Mode_Out_PP;
port.GPIO_Pin =D1 | D2 | D3;
port.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init(GPIOB, &port);
// Timer
TIM_TimeBaseStructInit(&timer);
timer.TIM_Prescaler = TIMER_PRESCALER;
timer.TIM_Period = 5000;
TIM_TimeBaseInit(TIM4, &timer);
}
//
int main()
{
__enable_irq();
initAll();
TIM_ITConfig(TIM4, TIM_IT_Update, ENABLE);
TIM_Cmd(TIM4, ENABLE);
NVIC_EnableIRQ(TIM4_IRQn);
IND_State=1;
counter1=1;
counter2=2;
counter3=7;
while(1)
{
__NOP();
}
}
//
void TIM4_IRQHandler()
{
if (IND_State == 1)
{
GPIO_ResetBits(GPIOB, D1|D2|D3);
GPIO_ResetBits(GPIOA, DIG8);
Delay();
IND_State=2;
GPIO_SetBits(GPIOB, D1);
digit_to_port(counter1);
timer.TIM_Period = 50000;
TIM_TimeBaseInit(TIM4, &timer);
TIM_ClearITPendingBit(TIM4, TIM_IT_Update);
}
else
{
if (IND_State == 2)
{
GPIO_ResetBits(GPIOB, D1|D2|D3);
GPIO_ResetBits(GPIOA, DIG8);
Delay();
IND_State=3;
GPIO_SetBits(GPIOB, D2);
digit_to_port(counter2);
timer.TIM_Period = 50000;
TIM_TimeBaseInit(TIM4, &timer);
TIM_ClearITPendingBit(TIM4, TIM_IT_Update);
}
else
{
GPIO_ResetBits(GPIOB, D1|D2|D3);
GPIO_ResetBits(GPIOA, DIG8);
Delay();
IND_State=1;
GPIO_SetBits(GPIOB, D3);
digit_to_port(counter3);
timer.TIM_Period = 50000;
TIM_TimeBaseInit(TIM4, &timer);
TIM_ClearITPendingBit(TIM4, TIM_IT_Update);
}
}
}
Раздел: STM32