diiiiiii 发表于 2021-3-5 10:32:31

使用freertos驱动8*8点阵刷新率上不去

本帖最后由 diiiiiii 于 2021-3-5 10:35 编辑



void led88_refresh(uint8_t *mar)
{
    uint8_t *ma, i;
    uint16_t dr, dc;

    const TickType_t xDelay = 10 / portTICK_PERIOD_MS;

    ma = mar;
    dr = 0xFFFF;
    dc = 0x0000;

    for(i = 0; i < 8; i++)   
    {

      dr = ~(0x01 << i) & 0xFF;
      dc = *ma;
      ma++;
      dc = (dc << 8) | (uint16_t)*ma;

      led88_c_send_data(dc);//将数据送到74hc595
      led88_r_send_data(dr);   

      ma++;   
      vTaskDelay(xDelay);

    }   
}


static TaskHandle_t xLed88DisplayTask = NULL;

void led88_create_display_task(void)
{
    xTaskCreate(led88_display_task, "led88_display_task", 2048, NULL, \
      10, &xLed88DisplayTask);
}


static void led88_display_task(void* arg)
{

    const TickType_t xDelay = 1 / portTICK_PERIOD_MS;
    init_led88_pin();

    while(1)
    {
       led88_refresh(data);//显示点阵
      // vTaskDelayUntil( &xLastWakeTime, xFrequency );
      vTaskDelay( xDelay );
    }
}

电路是没问题的,裸机正常驱动74hc595。led88_refresh()是每隔10ms换一行刷新,在led88_display_task中,1ms刷新点阵一次。但是显示仍然非常晃动,刷新感很强烈。理论上来说,8*8点阵的刷新频率根本不需要这么快就能稳定显示。这个现象和freertos有关系吗?

eric2013 发表于 2021-3-5 10:42:05

下面这个是10ms更新一行吗

for(i = 0; i < 8; i++)   
    {

      dr = ~(0x01 << i) & 0xFF;
      dc = *ma;
      ma++;
      dc = (dc << 8) | (uint16_t)*ma;

      led88_c_send_data(dc);//将数据送到74hc595
      led88_r_send_data(dr);   

      ma++;   
      vTaskDelay(xDelay);

    }   

diiiiiii 发表于 2021-3-5 10:46:39

eric2013 发表于 2021-3-5 10:42
下面这个是10ms更新一行吗

for(i = 0; i < 8; i++)   


对。

diiiiiii 发表于 2021-3-5 10:47:27

eric2013 发表于 2021-3-5 10:42
下面这个是10ms更新一行吗

for(i = 0; i < 8; i++)   


是的。

eric2013 发表于 2021-3-5 10:57:12

diiiiiii 发表于 2021-3-5 10:47
是的。
这个为什么要做个延迟,整体更新下不挺好的。由于不了解你的硬件使用情况,其它不清楚了,你自己研究下吧

diiiiiii 发表于 2021-3-5 11:03:43

eric2013 发表于 2021-3-5 10:57
这个为什么要做个延迟,整体更新下不挺好的。由于不了解你的硬件使用情况,其它不清楚了,你自己研究下吧

因为是用595扫描的,只能一行一行的扫描,这个地方不延时的话,等于是每行停留的时间太短,导致led太暗。这个函数负责扫描每行。创建的任务负责多遍刷新整个点阵。

diiiiiii 发表于 2021-3-6 15:51:32

已解决。是驱动函数有问题。重新写的驱动。
页: [1]
查看完整版本: 使用freertos驱动8*8点阵刷新率上不去