Um deinen aktuelle Verdrahtung zu beschleunigen, kannst du auch den
recht berechnungsintensiven Befehl (LCD_PORT0->FIOPIN = ...) ersetzen,
indem zu dir zwei LUTs anlegst. Das kostet dich zwar 2k RAM, aber es
sollte um einiges schneller laufen.
1 | uint32_t LCD_LUTL[256];
|
2 | uint32_t LCD_LUTH[256];
|
3 |
|
4 | LCD_PORT0->FIOPIN = LCD_LUTL[com & 0xFF] | LCD_LUTH[com >> 8] | (1 << LCD_RD);
|
Die LUTs musst du dann beim Programmstart einmal berechnen, oder bereits
einkompilieren.
1 | for (i=0;i<256;i++)
|
2 | {
|
3 | LCD_LUTL[i] = 0;
|
4 | if (i & (1 << 0)) LCD_LUTL[i] |= (1 << LCD_DB0);
|
5 | if (i & (1 << 1)) LCD_LUTL[i] |= (1 << LCD_DB1);
|
6 | if (i & (1 << 2)) LCD_LUTL[i] |= (1 << LCD_DB2);
|
7 | if (i & (1 << 3)) LCD_LUTL[i] |= (1 << LCD_DB3);
|
8 | if (i & (1 << 4)) LCD_LUTL[i] |= (1 << LCD_DB4);
|
9 | if (i & (1 << 5)) LCD_LUTL[i] |= (1 << LCD_DB5);
|
10 | if (i & (1 << 6)) LCD_LUTL[i] |= (1 << LCD_DB6);
|
11 | if (i & (1 << 7)) LCD_LUTL[i] |= (1 << LCD_DB7);
|
12 |
|
13 | LCD_LUTH[i] = 0;
|
14 | if (i & (1 << 8)) LCD_LUTH[i] |= (1 << LCD_DB8);
|
15 | if (i & (1 << 9)) LCD_LUTH[i] |= (1 << LCD_DB9);
|
16 | if (i & (1 << 10)) LCD_LUTH[i] |= (1 << LCD_DB10);
|
17 | if (i & (1 << 11)) LCD_LUTH[i] |= (1 << LCD_DB11);
|
18 | if (i & (1 << 12)) LCD_LUTH[i] |= (1 << LCD_DB12);
|
19 | if (i & (1 << 13)) LCD_LUTH[i] |= (1 << LCD_DB13);
|
20 | if (i & (1 << 14)) LCD_LUTH[i] |= (1 << LCD_DB14);
|
21 | if (i & (1 << 15)) LCD_LUTH[i] |= (1 << LCD_DB15);
|
22 | }
|
Wenn die 2k RAM zu viel sind, so kannst du auch 4 LUTs mit jeweils 16
Einträgen machen, sodass nur 256 Byte benötigt werden, allerdings ist es
damit in der Ausführung wieder langsamer.