STM32
直播中

王强

7年用户 1341经验值
私信 关注
[问答]

stm32 gpio直接驱动数码管做动态扫描没有反应是哪里的问题?

          #include"main.h"

const uint32_t SEG_SegPins[]=
{

        GPIO_PIN_0,GPIO_PIN_1,GPIO_PIN_2,GPIO_PIN_3,GPIO_PIN_4,GPIO_PIN_5,GPIO_PIN_6,GPIO_PIN_7,
};

const uint32_t SEG_DigPins[]=
{

        GPIO_PIN_8,GPIO_PIN_9,GPIO_PIN_10,GPIO_PIN_11,
};


void Seg_Init(void);
void Seg_DisplaySingleDigit(uint8_t n);
void Seg_DynamicScan(uint8_t n1,uint8_t n2,uint8_t n3,uint8_t n4);

int main(void)
{
uint32_t tsStart;
uint32_t counter=0;
uint8_t n1,n2,n3,n4;

HAL_Init();

Seg_Init();


while(1)
{
         tsStart=HAL_Gettick();

         n1=(counter/1000)%10;
         n2=(counter/100)%10;
         n3=(counter/10)%10;
         n4=counter%10;


         while(HAL_GetTick()-tsStart >=1000)
         {
                 Seg_DynamicScan(n1,n2,n3,n4);
         }
    counter++;
}

}


void Seg_Init(void)
{
        GPIO_InitTypeDef gpioinit;
        uint32_t i;

    //1.初始化数码管的段选引脚
        gpioinit.Mode=GPIO_MODE_OUTPUT_PP;
        gpioinit.Speed=GPIO_SPEED_FREQ_LOW;

        __HAL_RCC_GPIOA_CLK_ENABLE();

        for(i=0;i<8;i++)
        {
                gpioinit.Pin=SEG_SegPins[i];
        HAL_GPIO_WritePin(GPIOA,SEG_SegPins[i],GPIO_PIN_RESET);
        HAL_GPIO_Init(GPIOA, gpioinit);
        }


         //2.初始化数码管的位选引脚
                gpioinit.Mode=GPIO_MODE_OUTPUT_PP;
                gpioinit.Speed=GPIO_SPEED_FREQ_LOW;

                __HAL_RCC_GPIOA_CLK_ENABLE();

                for(i=0;i<4;i++)
                {
                        gpioinit.Pin=SEG_DigPins[i];
                HAL_GPIO_WritePin(GPIOA,SEG_DigPins[i],GPIO_PIN_SET);
                HAL_GPIO_Init(GPIOA, gpioinit);
                }

}

void Seg_DisplaySingleDigit(uint8_t n)
{

        const uint8_t font[]=
        {
                        0x3f,0x06,0x5B,0x4F,0x66,0x6D,0X7D,0X07,0X7F,0X6F
        };
     uint32_t i;
     for(i=0;i<8;i++)
     {
       if((font[n]   (0x1 << i))!=0)
       {

               HAL_GPIO_WritePin(GPIOA,SEG_SegPins [i],GPIO_PIN_SET);

       }
       else
       {
               HAL_GPIO_WritePin(GPIOA,SEG_SegPins [i],GPIO_PIN_RESET);
       }

     }
}


void Seg_DynamicScan(uint8_t n1,uint8_t n2,uint8_t n3,uint8_t n4)
{
     uint32_t i, j;
     uint8_t numbers[4];

     numbers[0]=n1;
     numbers[1]=n2;
     numbers[2]=n3;
     numbers[3]=n4;

     for(i=0;i<4;i++)
     {
      for(j=0;j<4;j++)
      {
             HAL_GPIO_WritePin(GPIOA,SEG_DigPins[j],GPIO_PIN_SET);
      }
      Seg_DisplaySingleDigit(numbers[i]);
      HAL_GPIO_WritePin(GPIOA,SEG_DigPins[i],GPIO_PIN_RESET);
      HAL_Delay(10);

     }


}



回帖(2)

常静娜

2024-3-27 09:52:55
可以挂着示波器单独调试一下,看看问题出在哪里
举报

李超

2024-3-27 16:45:32
可能是以下几个方面的问题导致没有反应:

1. 硬件接线问题:检查数码管的引脚是否正确连接,并确保连接正常。

2. 初始化问题:在代码中有一个Seg_Init函数,可能需要调用该函数来初始化GPIO引脚。确保已经正确调用了Seg_Init函数。

3. 时钟使能问题:检查是否已经使能了GPIO端口的时钟。可以找到对应的时钟使能函数,并确保已正确调用。

4. 跳线帽问题:对于一些开发板,可能需要设置跳线帽来选择GPIO引脚的连接方式。检查开发板上的跳线帽设置是否正确。

5. 动态扫描问题:检查Seg_DynamicScan函数的实现,确保正确扫描数码管并显示数字。可能需要考虑定时器的配置来实现动态扫描。

通过逐一检查这些可能的问题,你应该能够找到导致没有反应的具体原因。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分