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)
{