Я перешел к разработке встраиваемых систем с использованием STM32 и недавно начал пытаться использовать Keil вместо моего взломанного процесса для использования gcc / st-util (поскольку для переноса кода на устройство требуется меньше шагов, простая отладка и т. Д.),Во всяком случае, я делал раннюю попытку функции, которая записывает строку на маленький 1,8-дюймовый TFT-экран (это было упражнение в книге Джеффери Брауна), и кажется, что это сработает, если я скомпилирую его, используя gcc, но не с Keil. Я получаюощущение, что я должен делать что-то, что не соответствует стандарту C, или в компиляторе Keil есть идиосинкразия, о которой я не знаю.
Я уверен, что есть много возможностей для улучшения, но моя текущая проблема заключается в том, что array
никогда не обновляется, это кажется пустым массивом, когда он собирается записать фактические данные на экран. Я пробовал несколько вещей (используя malloc
, переставляя, где он обновляется) но это всегда одно и то же, я вижу, как процесс достигает строки, в которой он устанавливает color
в следующем значении массива, но это значение не появляется в array
. Есть идеи?
Код:
void ST7735_WriteString(uint8_t *c, uint16_t size, uint16_t fgColor, uint16_t bgColor)
{
uint8_t i = 0;
// How many chars fit across
uint8_t needAnotherLine = 1;
uint16_t currentPosition = 0;
uint8_t currentLine = 0;
uint16_t boxesLeft = size - currentPosition;
uint16_t arraySize;
while (needAnotherLine)
{
uint16_t boxesThisRow = 0;
if (boxesLeft > 25)
{
needAnotherLine = 1;
boxesThisRow = 25;
}
else
{
needAnotherLine = 0;
boxesThisRow = boxesLeft;
}
// Initialize array which holds the pixel-color data for the row
arraySize = 66 * boxesThisRow;
uint16_t array[arraySize];
// Set new box for line
ST7735_setAddrWindow(110 - 10 * currentLine, 6, 120 - 10 * currentLine, 6 + 6 * boxesThisRow, 0x6);
for (i = 0; i < boxesThisRow; i++)
{
int8_t k = 0, j = 0;
uint16_t line; // font column
uint8_t bit; // foreground or background?
uint16_t color; // which color to draw
for (k = 0; k < 6; k++)
{
line = (k < 5) ? ASCII[5 * (*c++) + k] : 0; // 7-bit bitmap
for (j = 10; j >= 0; j--)
{
// Get bit values
bit = (line >> j) & 1;
color = bit ? fgColor : bgColor;
array[10 - j + k * 11 + i * 66] = color;
}
}
}
LcdWrite16(LCD_D, array, 66 * boxesThisRow);
currentPosition += boxesThisRow;
boxesLeft -= boxesThisRow;
currentLine++;
}
}