FreeRTOS的移植我是基于FreeRTOS最新官方7.5.2版的Demo: CORTEX_M4F_STM32F407ZG-SK 移植的.不過(guò)這個(gè)Demo里的RCC,PLL,HSE等相關(guān)配置不符合STM32 Discovery的實(shí)際情況,我重新用ST公司官方提供的system_stm32f4xx.c重新替換實(shí)現(xiàn),同時(shí)去掉了Demo里的除LED任務(wù)外的所有其它任務(wù),并修改中斷等其它配置.重新自己寫(xiě)了幾個(gè)Task實(shí)現(xiàn)自己的要求.
這里提一下,網(wǎng)上流傳甚廣的12864的SPI驅(qū)動(dòng)是有問(wèn)題的.主要表現(xiàn)在一個(gè)重要的設(shè)置坐標(biāo)的函數(shù),錯(cuò)誤版本代碼如下:
void LCD_Set_Pos(unsigned char x, unsigned char y)
{
}
使用這個(gè)函數(shù)明顯的錯(cuò)誤發(fā)生在x的坐標(biāo)定位會(huì)出問(wèn)題,比如當(dāng)你使用LCD_Set_Pos(126,0)和LCD_Set_Pos(127,0)時(shí)效果是一樣的,都定位到(126,0)位置,無(wú)法點(diǎn)亮x=127這最后一列的像素.結(jié)果通過(guò)查看12864控制芯片的硬件文檔找到原因:
文檔明確表示,x坐標(biāo)的設(shè)置將坐標(biāo)字節(jié)的低4位直接寫(xiě)入,將D4位置1后再將坐標(biāo)字節(jié)的高4位一起寫(xiě)入設(shè)置.而上面的代碼中:
LCD_WrCmd((x&0x0f)|0x01);
顯然畫(huà)蛇添足,應(yīng)改為:
LCD_WrCmd(x&0x0f);
即可.
另外, 由于12864的控制芯片內(nèi)的顯存是按位進(jìn)行素像迭制的,并且寫(xiě)入顯存時(shí)還得按節(jié)字為單位進(jìn)行.實(shí)際程序中非常不方便進(jìn)行單像素的隨意控制.為此,我寫(xiě)了個(gè)中間層,這個(gè)中間層對(duì)每個(gè)像素按字節(jié)操作,GUI操作都在位于內(nèi)存中開(kāi)辟的中間層顯存中進(jìn)行.然后渲染到屏上去時(shí)再轉(zhuǎn)換成為控制芯片要求的格式.
代碼如下:
[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)
{