使用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有关系吗?
下面这个是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);
} eric2013 发表于 2021-3-5 10:42
下面这个是10ms更新一行吗
for(i = 0; i < 8; i++)
对。 eric2013 发表于 2021-3-5 10:42
下面这个是10ms更新一行吗
for(i = 0; i < 8; i++)
是的。 diiiiiii 发表于 2021-3-5 10:47
是的。
这个为什么要做个延迟,整体更新下不挺好的。由于不了解你的硬件使用情况,其它不清楚了,你自己研究下吧 eric2013 发表于 2021-3-5 10:57
这个为什么要做个延迟,整体更新下不挺好的。由于不了解你的硬件使用情况,其它不清楚了,你自己研究下吧
因为是用595扫描的,只能一行一行的扫描,这个地方不延时的话,等于是每行停留的时间太短,导致led太暗。这个函数负责扫描每行。创建的任务负责多遍刷新整个点阵。 已解决。是驱动函数有问题。重新写的驱动。
页:
[1]