FreeRTOS的移植我是基于FreeRTOS最新官方7.5.2版的Demo: CORTEX_M4F_STM32F407ZG-SK 移植的.不過這個Demo里的RCC,PLL,HSE等相關配置不符合STM32 Discovery的實際情況,我重新用ST公司官方提供的system_stm32f4xx.c重新替換實現,同時去掉了Demo里的除LED任務外的所有其它任務,并修改中斷等其它配置.重新自己寫了幾個Task實現自己的要求.
這里提一下,網上流傳甚廣的12864的SPI驅動是有問題的.主要表現在一個重要的設置坐標的函數,錯誤版本代碼如下:
void LCD_Set_Pos(unsigned char x, unsigned char y)
{
}
使用這個函數明顯的錯誤發生在x的坐標定位會出問題,比如當你使用LCD_Set_Pos(126,0)和LCD_Set_Pos(127,0)時效果是一樣的,都定位到(126,0)位置,無法點亮x=127這最后一列的像素.結果通過查看12864控制芯片的硬件文檔找到原因:
文檔明確表示,x坐標的設置將坐標字節的低4位直接寫入,將D4位置1后再將坐標字節的高4位一起寫入設置.而上面的代碼中:
LCD_WrCmd((x&0x0f)|0x01);
顯然畫蛇添足,應改為:
LCD_WrCmd(x&0x0f);
即可.
另外, 由于12864的控制芯片內的顯存是按位進行素像迭制的,并且寫入顯存時還得按節字為單位進行.實際程序中非常不方便進行單像素的隨意控制.為此,我寫了個中間層,這個中間層對每個像素按字節操作,GUI操作都在位于內存中開辟的中間層顯存中進行.然后渲染到屏上去時再轉換成為控制芯片要求的格式.
代碼如下:
[1]. hal_lcd.h
#ifndef HAL_LCD_H
#define HAL_LCD_H
#include
#define LCD_WIDTH
#define LCD_HEIGHT
#define PIXEL_PER_BYTE
#define LOG_PIXEL_PER_BYTE
#define USE_LOG_WIDTH_32
#define USE_LOG_WIDTH_64
#define USE_LOG_WIDTH_128 7
#define USE_LOG_WIDTH_256 8
#define CUR_LOG_WIDTH USE_LOG_WIDTH_128
#define BIT(n)
extern unsigned char hal_lcd_buff[LCD_WIDTH*LCD_HEIGHT];
extern unsigned char lcd_buff[(LCD_WIDTH*LCD_HEIGHT)>>LOG_PIXEL_PER_BYTE];
extern unsigned long render_count;
inline void set_pixel(int x, int y, unsigned char clr)
{
}
inline unsigned char get_pixel(int x, int y)
{
}
inline void clear_hal_lcd_buff()
{
}
inline void clear_lcd_buff()
{
}
inline void clear_buff()
{
}
void DrawCharacter10(unsigned char color);
void GenLcdBuff();
void RenderBuff();
void Render();
#endif
[2]. hal_lcd.c
#include "hal_lcd.h"
#include "LQ12864.h"
#include "gb_10_zhi.h"
#include "5_7font.h"
#include "mylife_txt.h"
unsigned char hal_lcd_buff[LCD_WIDTH*LCD_HEIGHT];
unsigned char lcd_buff[(LCD_WIDTH*LCD_HEIGHT)>>LOG_PIXEL_PER_BYTE];
unsigned long render_count=1;
#define ASC_COUNT
#define ASC_START
#define ASC_WIDTH
#define ASC_HEIGHT
#define ROW_SPACE
#define COL_SPACE
#define TAB_SPACE_NUM
#define CN_CHAR_HEIGHT
#define CN_CHAR_WIDTH
void GenLcdBuff()
{
}
void RenderBuff()
{
}
void Render()
{
}
char* file;//file pointer
unsigned int nFilePosition;
unsigned int nOffset;
static void memcpy(void* dst, const void* src, unsigned int count)
{
}
int DrawASC(int nRow,int nCol,int nIndex,unsigned char color)
{