有人有stm32f103vct6 FSMC方式驱动SSD1289的程序吗?,急求,十分感谢,无奈已没有财富值

stemwin5.22移植到红牛开发板STM32F103zet,驱动SSD1289圆满成功
最近在搞一个手持机,界面当然不可小视啦,以前用的是ucGUI,后来发现他的升级版emwin图片柔和度,
界面显示更好一些。意法半导体趁人之美和segger合作推出了免费的STemwin.真是脍炙人口的佳作啊。
再移植的时候参,参考了两位大神的杰作/link?url=HE6ovHrsfdpzkvYVe4Rd1j8RDItjDK95FFl90MwZjuBpAY0TtTp50LV9rL0rhCwq65MZ_jzIocO_fFZk5wjjU4xC7-FbHqVdQr_uyeH4Nrq和/posts/list/0/27697.htm。其实他们已经说的很清楚了,但是我还是想强调几点注意的地方。
一。stemwin移植前准备
&我们首先需要去ST官网下载最新的STemWinLibrary522库文件。官网地址:。下载完成后,放在你想放的任意盘符文件夹里。下载后解压如下图所示
二、开始移植
前期工作准备的要充分哦,不要偷懒,一步一步来。很快就成功率。
看完上面的准备工作,大家应该明白,我是利用ST现有的工程来一只的,是的,没错。这样移植的失败率会大大减小。为什么这么做的?首先,我们知道STM32驱动彩屏大多数用的都是FSMC总线形式,当然我用的也不例外。
1、那就让我们迫不及待打开项目工程。修改程序吧!如下图所示
2、我可以说这就移植成功了吗!哈……反正已经完成80%啦,剩下的就是把你液晶屏的底层驱动换掉现在项目里驱动。如下图所示
3、修改成你液晶的ID号
4、修改你的分辨率
5、修改相关宏定义,主要用于屏类型选择和数据总线选择
好,到此就基本上完成了。
三、让我们看看效果吧
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。21ic官方微信
后使用快捷导航没有帐号?
查看: 4218|回复: 16
memo移植RT-Thread到stm32f103zet6的方法
&&已结帖(0)
主题帖子积分
中级技术员, 积分 103, 距离下一级还需 197 积分
中级技术员, 积分 103, 距离下一级还需 197 积分
主题帖子积分
专家等级: 结帖率:0%
主题帖子积分
中级技术员, 积分 103, 距离下一级还需 197 积分
中级技术员, 积分 103, 距离下一级还需 197 积分
本帖最后由 stm32boy 于
14:31 编辑
RT-Thread的0.4.0rc1出来了(已符合POSIX源码标准,可移植性更强,Pthread带来的多核并行线程库更加强大,带有浓厚的Linux味道),还带GUI,免费的,比uCOS+uCGUI收费的要划算啊,下了一套源码来,准备搞移植,初步看了看,多任务单线程的RTOS管理,调用上比0.3版本要优化很多了,给stm32f103zet6用正合适。已经移植过的砖家,请多多指教。我也会把移植过程中遇到的要点分享出来,大家共同发扬GUN开源精神。
欢迎砖家和高手围观,并使劲拍砖斧正,集思广益,指点迷津。先谢过了。
偶是用RealView MDK uVision4.22.22 pro来建立工程模板的,IAR也行,有6.21版的,还不太熟悉,就先用MDK for arm的来弄吧,等搞爽了再转IAR来优化。
RT-Thread 0.4.0RC1源码有带stm32f10xx的BSP模板,移植的工程基础已经完成了90%,余下的是要根据具体的STM32芯片型号和板载接口及外扩资源来DIY那10%,正在看,初步搞了搞,已经跑起来,里面很多具体变量要按具体使用的片子来重定义的,尤其是对FSMC和NVIC的具体设定和重载配置,都要根据板载原件的具体接脚来写驱动,而且还带GUI很多配置,TFT-LCD的驱动也要移植,参数很多,没有LCD就感觉象没有眼睛一样,不爽啊,手上的LCD是用ssd1289控制的,要调参数和FSMC的驱动总线,按部就班搞吧,急不来。
先动手把TFT-LCD3.2&的驱动搞了搞,结合开发板原来配的驱动源码作为参考,初步移植就点亮的,可以通过rtgui的初始化显示信息,不过还很简陋。(详见12-13楼源码)
在BSP的stm32f10x目录里,有几个关键的移植文件:
stm32f10x_conf.h
stm32f10x_it.h
stm32f10x_it.c
这三个是可以自行添加参数的,用于自定义所需的函数(库)以及所涉及中断触发条件/还原配置的条件声明与具体定义,当然了,还有libcpu的stm32目录里,
context_iar.S& &/*用于IAR工程的上下文切换汇编码*/
context_rvds.S& &/*用于RVDS工程的上下文切换汇编码,已经是完成初步的STM32移植了,有需要的话才再补充*/
cpuport.c /*stm32芯片的控制,这个也是现成的,不用再弄*/
以上都是需要在移植过程中配置参数的,我的理解是,把这几个码源参数设置成针对手上的片子和板子资源所需ISR调用,就可以完成初步的移植了,不知是否right了,望砖家拍砖提醒。
在3.5的STM32标准库里头,有个 startup_stm32f10x_hd.s /*调试了一下,发现0.4.0 rc1版已经不再需要0.3系列里面的start_rvds.S启动码了,还是直接用回标准库的码,RTT也不声明一下,真费劲*/
也是与MCU芯片非常密切的启动配置文件,还配套了
stm32f10x.h
system_stm32f10x.c
system_stm32f10x.h
core_cm3.c
core_cm3.h
上述5大官方的权威片子驱动源码,一般状况下无需再折腾,可以直接用,看了许久,发现通过startup_stm32f10x_hd.s以及与cpuport.c和context_rvds.S进一步融合,初步建立好工程环境之后,RT-Thread0.4.0RC1就能顺利通过MDK的编译并让片子跑起来了……待续
主题帖子积分
中级技术员, 积分 103, 距离下一级还需 197 积分
中级技术员, 积分 103, 距离下一级还需 197 积分
主题帖子积分
专家等级: 结帖率:0%
主题帖子积分
中级技术员, 积分 103, 距离下一级还需 197 积分
中级技术员, 积分 103, 距离下一级还需 197 积分
本帖最后由 stm32boy 于
21:24 编辑
先看了看rtconfig.h中OS的功能选项,真多选择,还是先从finSH和GUI下手,其它屏蔽掉,再慢慢搞。功能可以自选,用的话就打开#define选项,不用的话,就加//或者/*...*/屏蔽掉。
/* RT-Thread config file */
#ifndef __RTTHREAD_CFG_H__
#define __RTTHREAD_CFG_H__
/* RT_NAME_MAX*/
#define RT_NAME_MAX& && &&&8
/* RT_ALIGN_SIZE*/
#define RT_ALIGN_SIZE& && &&&4
/* PRIORITY_MAX */
#define RT_THREAD_PRIORITY_MAX& && &&&32
/* Tick per Second */
#define RT_TICK_PER_SECOND& && &&&100
/* SECTION: RT_DEBUG */
/* Thread Debug */
#define RT_DEBUG
#define RT_THREAD_DEBUG
#define RT_USING_OVERFLOW_CHECK
/* Using Hook */
#define RT_USING_HOOK
/* Using Software Timer */
/* #define RT_USING_TIMER_SOFT */
#define RT_TIMER_THREAD_PRIO& && && && && & 4
#define RT_TIMER_THREAD_STACK_SIZE& && &&&512
#define RT_TIMER_TICK_PER_SECOND& && &&&100
/* SECTION: IPC */
/* Using Semaphore*/
#define RT_USING_SEMAPHORE
/* Using Mutex */
#define RT_USING_MUTEX
/* Using Event */
#define RT_USING_EVENT
/* Using MailBox */
#define RT_USING_MAILBOX
/* Using Message Queue */
#define RT_USING_MESSAGEQUEUE
/* SECTION: Memory Management */
/* Using Memory Pool Management*/
#define RT_USING_MEMPOOL
/* Using Dynamic Heap Management */
#define RT_USING_HEAP
/* Using Small MM --是否使用小存储容量的片子的功能,用效率来换空间的意思*/
#define RT_USING_SMALL_MEM
/* SECTION: Device System --硬件接口的配置,按实际需要来具体自定义*/
/* Using Device System */
#define RT_USING_DEVICE
#define RT_USING_UART1
/* SECTION: Console options --很重要的总控,可以自定义所需的输入输出配置*/
#define RT_USING_CONSOLE
/* the buffer size of console*/
#define RT_CONSOLEBUF_SIZE& && &&&128
/* SECTION: finsh, a C-Express shell --系统界面,类似于一个DOS的交互界面,实时指令SHELL*/
#define RT_USING_FINSH
/* Using symbol table */
#define FINSH_USING_SYMTAB
#define FINSH_USING_DESCRIPTION
/* SECTION: device filesystem --储存方面的文件管理,如SD卡之类的使用,先不搞,就注释掉*/
/* #define RT_USING_DFS */
//#define RT_USING_DFS_ELMFAT
//#define RT_DFS_ELM_WORD_ACCESS
/* Reentrancy (thread safe) of the FatFs module.&&*/
//#define RT_DFS_ELM_REENTRANT
/* Number of volumes (logical drives) to be used. */
//#define RT_DFS_ELM_DRIVES& && && && && && && && &2
/* #define RT_DFS_ELM_USE_LFN& && && && && && && && &1 */
//#define RT_DFS_ELM_MAX_LFN& && && && && && && && &255
/* Maximum sector size to be handled. */
//#define RT_DFS_ELM_MAX_SECTOR_SIZE&&512
/* the max number of mounted filesystem */
//#define DFS_FILESYSTEMS_MAX& && && && && && && && &2
/* the max number of opened files& && && && && &&&*/
//#define DFS_FD_MAX& && && && && && && && && && && && && & 4
/* SECTION: lwip, a lighwight TCP/IP protocol stack --轻型的联网接口配置,先不搞,注释掉*/
/* #define RT_USING_LWIP */
/* LwIP uses RT-Thread Memory Management */
// #define RT_LWIP_USING_RT_MEM
/* Enable ICMP protocol*/
// #define RT_LWIP_ICMP
/* Enable UDP protocol*/
// #define RT_LWIP_UDP
/* Enable TCP protocol*/
// #define RT_LWIP_TCP
/* Enable DNS */
// #define RT_LWIP_DNS
/* the number of simulatenously active TCP connections*/
// #define RT_LWIP_TCP_PCB_NUM& && &&&5
/* Using DHCP */
/* #define RT_LWIP_DHCP */
/* ip address of target*/
// #define RT_LWIP_IPADDR0& && &&&192
// #define RT_LWIP_IPADDR1& && &&&168
// #define RT_LWIP_IPADDR2& && &&&1
// #define RT_LWIP_IPADDR3& && &&&30
/* gateway address of target*/
// #define RT_LWIP_GWADDR0& && &&&192
// #define RT_LWIP_GWADDR1& && &&&168
// #define RT_LWIP_GWADDR2& && &&&1
// #define RT_LWIP_GWADDR3& && &&&1
/* mask address of target*/
// #define RT_LWIP_MSKADDR0& && &&&255
// #define RT_LWIP_MSKADDR1& && &&&255
// #define RT_LWIP_MSKADDR2& && &&&255
// #define RT_LWIP_MSKADDR3& && &&&0
/* tcp thread options */
// #define RT_LWIP_TCPTHREAD_PRIORITY& && && && && & 12
// #define RT_LWIP_TCPTHREAD_MBOX_SIZE& && && && && & 10
// #define RT_LWIP_TCPTHREAD_STACKSIZE& && && && && & 1024
/* ethernet if thread options */
// #define RT_LWIP_ETHTHREAD_PRIORITY& && && && && & 15
// #define RT_LWIP_ETHTHREAD_MBOX_SIZE& && && && && & 10
// #define RT_LWIP_ETHTHREAD_STACKSIZE& && && && && & 512
/* TCP sender buffer space */
// #define RT_LWIP_TCP_SND_BUF& && &&&8192
/* TCP receive window. */
// #define RT_LWIP_TCP_WND& && && && && & 8192
/* SECTION: RT-Thread/GUI --TFT/LCD的图形交互界面,很强大,比0.3版的有很大的飞跃,源于0.3超越0.3,要很费劲的,先搞一搞*/
#define RT_USING_RTGUI
/* name length of RTGUI object */
#define RTGUI_NAME_MAX& && && && && & 12
/* support 16 weight font */
#define RTGUI_USING_FONT16
/* support Chinese font */
#define RTGUI_USING_FONTHZ
/* use DFS as file interface */
//#define RTGUI_USING_DFS_FILERW
/* use font file as Chinese font --这个先注释掉,才能正常显示汉字,等搞好NAND-FLASH之后再弄大型的字库文件*/
// #define RTGUI_USING_HZ_FILE
/* use Chinese bitmap font */
#define RTGUI_USING_HZ_BMP
/* use small size in RTGUI */
#define RTGUI_USING_SMALL_SIZE
/* use mouse cursor */
/* #define RTGUI_USING_MOUSE_CURSOR */
/* default font size in RTGUI */
#define RTGUI_DEFAULT_FONT_SIZE& && &&&16
/* image support */
// #define RTGUI_IMAGE_XPM
// #define RTGUI_IMAGE_BMP
主题帖子积分
中级技术员, 积分 103, 距离下一级还需 197 积分
中级技术员, 积分 103, 距离下一级还需 197 积分
主题帖子积分
专家等级: 结帖率:0%
主题帖子积分
中级技术员, 积分 103, 距离下一级还需 197 积分
中级技术员, 积分 103, 距离下一级还需 197 积分
本帖最后由 stm32boy 于
14:44 编辑
再看rtdef.h中OS的结构定义,哇,又一大坨,很有C++范儿,全预先打包封装了,厉害
细看了主芯片的接线以及各块IC/接口之间的PIN脚连接之后,对于FSMC的管理和调用就必须严格按照硬件之间的接法来定义。简单来说,FSMC最基本的功能实现是对4个储存模块的调度管理:
FSMC_NE1& &基址 0x
FSMC_NE2& &基址 0x
FSMC_NE3& &基址 0x
FSMC_NE4& &基址 0x6C00 0000
--上述FSMC_NE[4:1]在芯片上直接对应4只脚(复用的),接什么IC外设就定义为什么,以硬件连接为准;
FSMC_NCE4_1
FSMC_NCE4_2
--正在啃读中……
主题帖子积分
中级技术员, 积分 103, 距离下一级还需 197 积分
中级技术员, 积分 103, 距离下一级还需 197 积分
主题帖子积分
专家等级: 结帖率:0%
主题帖子积分
中级技术员, 积分 103, 距离下一级还需 197 积分
中级技术员, 积分 103, 距离下一级还需 197 积分
本帖最后由 stm32boy 于
21:49 编辑
移植的重点还要弄RT-Thread中的application.c这个文件,里面是整个OS动态与静态线程的入口……待续
主题帖子积分
中级技术员, 积分 103, 距离下一级还需 197 积分
中级技术员, 积分 103, 距离下一级还需 197 积分
主题帖子积分
专家等级: 结帖率:0%
主题帖子积分
中级技术员, 积分 103, 距离下一级还需 197 积分
中级技术员, 积分 103, 距离下一级还需 197 积分
本帖最后由 stm32boy 于
21:51 编辑
整个OS所需的变量/函数/结构对象声明全在rtthread.h里面了,又是超级一大坨,哇噻
对于驱动板载资源时将会十分有用。……待续
主题帖子积分
中级技术员, 积分 264, 距离下一级还需 36 积分
中级技术员, 积分 264, 距离下一级还需 36 积分
主题帖子积分
专家等级: 结帖率:85%
主题帖子积分
中级技术员, 积分 264, 距离下一级还需 36 积分
中级技术员, 积分 264, 距离下一级还需 36 积分
咱能不贴代码,直接说事么?……
主题帖子积分
助理工程师, 积分 1531, 距离下一级还需 469 积分
助理工程师, 积分 1531, 距离下一级还需 469 积分
主题帖子积分
专家等级: 结帖率:88%
主题帖子积分
助理工程师, 积分 1531, 距离下一级还需 469 积分
助理工程师, 积分 1531, 距离下一级还需 469 积分
???不是有移植好的BSP吗
有自家养蜂蜜出售,纯天然绿色,¥30一斤,欢迎咨询惠顾,QQ~
主题帖子积分
实习生, 积分 19, 距离下一级还需 31 积分
实习生, 积分 19, 距离下一级还需 31 积分
主题帖子积分
专家等级: 结帖率:0%
主题帖子积分
实习生, 积分 19, 距离下一级还需 31 积分
实习生, 积分 19, 距离下一级还需 31 积分
直接贴代码。。。囧 也不把改动的地方标红啥的
主题帖子积分
中级技术员, 积分 103, 距离下一级还需 197 积分
中级技术员, 积分 103, 距离下一级还需 197 积分
主题帖子积分
专家等级: 结帖率:0%
主题帖子积分
中级技术员, 积分 103, 距离下一级还需 197 积分
中级技术员, 积分 103, 距离下一级还需 197 积分
本帖最后由 stm32boy 于
10:17 编辑
要移植,先要搞驱动stm32f103zet6片子的东西,context_rvds.S和cpuport.c这哥俩就是key啊,由于省掉了0.3系列的start_rvds.s文件,context_rvds.s就优化了中断调用的功能。
先尝尝context_rvds.S的源码--
; * File& && &: context_rvds.S
; * This file is part of RT-Thread RTOS
; * COPYRIGHT (C) 2009, RT-Thread Development Team
; * The license and distribution terms for this file may be
; * found in the file LICENSE in this distribution or at
; * Change Logs:
; * Date& && && &&&Author& && & Notes
; * & &&&Bernard& && &first version
; * @addtogroup STM32
NVIC_INT_CTRL& &EQU& &&&0xE000ED04& && && && && &; interrupt control state register
NVIC_SYSPRI2& & EQU& &&&0xE000ED20& && && && && &; system priority register (2)
NVIC_PENDSV_PRI EQU& &&&0x00FF0000& && && && && &; PendSV priority value (lowest)
NVIC_PENDSVSET&&EQU& &&&0x& && && && && &; value to trigger PendSV exception
& & AREA |.text|, CODE, READONLY, ALIGN=2
& & REQUIRE8
& & PRESERVE8
& & IMPORT rt_thread_switch_interrupt_flag
& & IMPORT rt_interrupt_from_thread
& & IMPORT rt_interrupt_to_thread
; * rt_base_t rt_hw_interrupt_disable();
rt_hw_interrupt_disable& & PROC
& & EXPORT&&rt_hw_interrupt_disable
& & MRS& &&&r0, PRIMASK
& & CPSID& &I
& & BX& && &LR
; * void rt_hw_interrupt_enable(rt_base_t level);
rt_hw_interrupt_enable& & PROC
& & EXPORT&&rt_hw_interrupt_enable
& & MSR& &&&PRIMASK, r0
& & BX& && &LR
; * void rt_hw_context_switch(rt_uint32 from, rt_uint32 to);
; * r0 --& from
; * r1 --& to
rt_hw_context_switch_interrupt
& & EXPORT rt_hw_context_switch_interrupt
rt_hw_context_switch& & PROC
& & EXPORT rt_hw_context_switch
& & ; set rt_thread_switch_interrupt_flag to 1
& & LDR& &&&r2, =rt_thread_switch_interrupt_flag
& & LDR& &&&r3, [r2]
& & CMP& &&&r3, #1
& & BEQ& &&&_reswitch
& & MOV& &&&r3, #1
& & STR& &&&r3, [r2]
& & LDR& &&&r2, =rt_interrupt_from_thread& &; set rt_interrupt_from_thread
& & STR& &&&r0, [r2]
& & LDR& &&&r2, =rt_interrupt_to_thread& &&&; set rt_interrupt_to_thread
& & STR& &&&r1, [r2]
& & LDR& &&&r0, =NVIC_INT_CTRL& && && && &&&; trigger the PendSV exception (causes context switch)
& & LDR& &&&r1, =NVIC_PENDSVSET
& & STR& &&&r1, [r0]
& & BX& && &LR
; r0 --& swith from thread stack
; r1 --& swith to thread stack
; psr, pc, lr, r12, r3, r2, r1, r0 are pushed into [from] stack
PendSV_Handler& &PROC
& & EXPORT PendSV_Handler
& & ; disable interrupt to protect context switch
& & MRS& &&&r2, PRIMASK
& & CPSID& &I
& & ; get rt_thread_switch_interrupt_flag
& & LDR& &&&r0, =rt_thread_switch_interrupt_flag
& & LDR& &&&r1, [r0]
& & CBZ& &&&r1, pendsv_exit& && && &; pendsv already handled
& & ; clear rt_thread_switch_interrupt_flag to 0
& & MOV& &&&r1, #0x00
& & STR& &&&r1, [r0]
& & LDR& &&&r0, =rt_interrupt_from_thread
& & LDR& &&&r1, [r0]
& & CBZ& &&&r1, swtich_to_thread& & ; skip register save at the first time
& & MRS& &&&r1, psp& && && && && &&&; get from thread stack pointer
& & STMFD& &r1!, {r4 - r11}& && && &; push r4 - r11 register
& & LDR& &&&r0, [r0]
& & STR& &&&r1, [r0]& && && && && & ; update from thread stack pointer
swtich_to_thread
& & LDR& &&&r1, =rt_interrupt_to_thread
& & LDR& &&&r1, [r1]
& & LDR& &&&r1, [r1]& && && && && & ; load thread stack pointer
& & LDMFD& &r1!, {r4 - r11}& && && &; pop r4 - r11 register
& & MSR& &&&psp, r1& && && && && &&&; update stack pointer
pendsv_exit
& & ; restore interrupt
& & MSR& &&&PRIMASK, r2
& & ORR& &&&lr, lr, #0x04
& & BX& && &lr
; * void rt_hw_context_switch_to(rt_uint32 to);
; * r0 --& to
; * this fucntion is used to perform the first thread switch
rt_hw_context_switch_to& & PROC
& & EXPORT rt_hw_context_switch_to
& & ; set to thread
& & LDR& &&&r1, =rt_interrupt_to_thread
& & STR& &&&r0, [r1]
& & ; set from thread to 0
& & LDR& &&&r1, =rt_interrupt_from_thread
& & MOV& &&&r0, #0x0
& & STR& &&&r0, [r1]
& & ; set interrupt flag to 1
& & LDR& &&&r1, =rt_thread_switch_interrupt_flag
& & MOV& &&&r0, #1
& & STR& &&&r0, [r1]
& & ; set the PendSV exception priority
& & LDR& &&&r0, =NVIC_SYSPRI2
& & LDR& &&&r1, =NVIC_PENDSV_PRI
& & LDR.W& &r2, [r0,#0x00]& && & ; read
& & ORR& &&&r1,r1,r2& && && && & ; modify
& & STR& &&&r1, [r0]& && && && & ; write-back
& & ; trigger the PendSV exception (causes context switch)
& & LDR& &&&r0, =NVIC_INT_CTRL
& & LDR& &&&r1, =NVIC_PENDSVSET
& & STR& &&&r1, [r0]
& & ; enable interrupts at processor level
& & CPSIE& &I
& & ; never reach here!
; compatible with old version
rt_hw_interrupt_thread_switch PROC
& & EXPORT rt_hw_interrupt_thread_switch
& & BX& && &lr
& & IMPORT rt_hw_hard_fault_exception
& & EXPORT HardFault_Handler
HardFault_Handler& & PROC
& & ; get current context
& & MRS& &&&r0, psp& && && && && &&&; get fault thread stack pointer
& & PUSH& & {lr}
& & BL& && &rt_hw_hard_fault_exception
& & POP& &&&{lr}
& & ORR& &&&lr, lr, #0x04
& & BX& && &lr
主题帖子积分
中级技术员, 积分 103, 距离下一级还需 197 积分
中级技术员, 积分 103, 距离下一级还需 197 积分
主题帖子积分
专家等级: 结帖率:0%
主题帖子积分
中级技术员, 积分 103, 距离下一级还需 197 积分
中级技术员, 积分 103, 距离下一级还需 197 积分
本帖最后由 stm32boy 于
21:55 编辑
不能少了cpuport.c呀,把原来0.3系列的几个分散文件集合起来了,更规范,好,还得啃下去--
* File& && &: cpuport.c
* This file is part of RT-Thread RTOS
* COPYRIGHT (C) 2009 - 2011, RT-Thread Development Team
* The license and distribution terms for this file may be
* found in the file LICENSE in this distribution or at
* Change Logs:
* Date& && && &&&Author& && & Notes
* & &&&Bernard& && &the first version
* & &&&Bernard& && &merge all of C source code into cpuport.c
#include &rtthread.h&
/* exception and interrupt handler table */
rt_uint32_t rt_interrupt_from_thread, rt_interrupt_to_
rt_uint32_t rt_thread_switch_interrupt_
struct stack_contex
& && &&&rt_uint32_t r0;
& && &&&rt_uint32_t r1;
& && &&&rt_uint32_t r2;
& && &&&rt_uint32_t r3;
& && &&&rt_uint32_t r12;
& && &&&rt_uint32_
& && &&&rt_uint32_
& && &&&rt_uint32_
rt_uint8_t *rt_hw_stack_init(void *tentry, void *parameter,
& && &&&rt_uint8_t *stack_addr, void *texit)
& && &&&unsigned long *
& && &&&stk& && && & = (unsigned long *)stack_
& && &&&*(stk)& &= 0xL;& && && && && && && && && && && && && & /* PSR */
& && &&&*(--stk) = (unsigned long)& && && && && & /* entry point, pc */
& && &&&*(--stk) = (unsigned long)& && && && && & /* lr */
& && &&&*(--stk) = 0;& && && && && && && && && && && && && && && && && && &&&/* r12 */
& && &&&*(--stk) = 0;& && && && && && && && && && && && && && && && && && &&&/* r3 */
& && &&&*(--stk) = 0;& && && && && && && && && && && && && && && && && && &&&/* r2 */
& && &&&*(--stk) = 0;& && && && && && && && && && && && && && && && && && &&&/* r1 */
& && &&&*(--stk) = (unsigned long)& && &&&/* r0 : argument */
& && &&&*(--stk) = 0;& && && && && && && && && && && && && && && && && && &&&/* r11 */
& && &&&*(--stk) = 0;& && && && && && && && && && && && && && && && && && &&&/* r10 */
& && &&&*(--stk) = 0;& && && && && && && && && && && && && && && && && && &&&/* r9 */
& && &&&*(--stk) = 0;& && && && && && && && && && && && && && && && && && &&&/* r8 */
& && &&&*(--stk) = 0;& && && && && && && && && && && && && && && && && && &&&/* r7 */
& && &&&*(--stk) = 0;& && && && && && && && && && && && && && && && && && &&&/* r6 */
& && &&&*(--stk) = 0;& && && && && && && && && && && && && && && && && && &&&/* r5 */
& && &&&*(--stk) = 0;& && && && && && && && && && && && && && && && && && &&&/* r4 */
& && &&&/* return task's current stack address */
& && &&&return (rt_uint8_t *)
extern void rt_hw_interrupt_thread_switch(void);
extern void list_thread(void);
extern rt_thread_t rt_current_
void rt_hw_hard_fault_exception(struct stack_contex* contex)
& && &&&rt_kprintf(&psr: 0x%08x\n&, contex-&psr);
& && &&&rt_kprintf(& pc: 0x%08x\n&, contex-&pc);
& && &&&rt_kprintf(& lr: 0x%08x\n&, contex-&lr);
& && &&&rt_kprintf(&r12: 0x%08x\n&, contex-&r12);
& && &&&rt_kprintf(&r03: 0x%08x\n&, contex-&r3);
& && &&&rt_kprintf(&r02: 0x%08x\n&, contex-&r2);
& && &&&rt_kprintf(&r01: 0x%08x\n&, contex-&r1);
& && &&&rt_kprintf(&r00: 0x%08x\n&, contex-&r0);
& && &&&rt_kprintf(&hard fault on thread: %s\n&, rt_current_thread-&name);
#ifdef RT_USING_FINSH
& && &&&list_thread();
& && &&&while (1);
void rt_hw_cpu_shutdown()
& && &&&rt_kprintf(&shutdown...\n&);
& && &&&RT_ASSERT(0);
主题帖子积分
中级技术员, 积分 103, 距离下一级还需 197 积分
中级技术员, 积分 103, 距离下一级还需 197 积分
主题帖子积分
专家等级: 结帖率:0%
主题帖子积分
中级技术员, 积分 103, 距离下一级还需 197 积分
中级技术员, 积分 103, 距离下一级还需 197 积分
本帖最后由 stm32boy 于
21:44 编辑
很费劲的跑了一下0.4.0RC1,发现原来0.3中很重要的start_rvds.s已经不再重要了,RTT遵循国际惯例,还是归顺了stm32自带的startup_stm32f10x_hd.s,只是在context_rvds.S中改善了ISR的接口函数,RTT是不错的,就是配套有点山寨,呵呵
主题帖子积分
中级技术员, 积分 103, 距离下一级还需 197 积分
中级技术员, 积分 103, 距离下一级还需 197 积分
主题帖子积分
专家等级: 结帖率:0%
主题帖子积分
中级技术员, 积分 103, 距离下一级还需 197 积分
中级技术员, 积分 103, 距离下一级还需 197 积分
TFT-LCD3.2&的SSD1289驱动源码,先来ssd1289.h的--
#ifndef SSD1289_H_INCLUDED
#define SSD1289_H_INCLUDED
#include &rtthread.h&
#include &board.h&
#include &rtgui.h&
#include &rtgui_server.h&
#include &rtgui_system.h&
#include &driver.h&
// Compatible list:
// ssd1289
//输出重定向.当不进行重定向时.
#define printf& && && && && &rt_kprintf //使用rt_kprintf来输出
/* LCD color */
#define White& && && && &0xFFFF
#define Black& && && && &0x0000
#define Grey& && && && & 0xF7DE
#define Blue& && && && & 0x001F
#define Blue2& && && && &0x051F
#define Red& && && && &&&0xF800
#define Magenta& && && & 0xF81F
#define Green& && && && &0x07E0
#define Cyan& && && && & 0x7FFF
#define Yellow& && && &&&0xFFE0
/*---------------------- Graphic LCD size definitions ------------------------*/
#define LCD_WIDTH& && & 240& && && && && &&&/* Screen Width (in pixels)& && && &&&*/
#define LCD_HEIGHT& && &320& && && && && &&&/* Screen Hight (in pixels)& && && &&&*/
#define BPP& && && && & 16& && && && && && &/* Bits per pixel& && && && && && && &*/
#define BYPP& && && && &((BPP+7)/8)& && && &/* Bytes per pixel& && && && && && &&&*/
void ssd1289_init(void);
//#define _ILI_REVERSE_DIRECTION_
rt_size_t lcd_ssd1289_read(rt_device_t dev, rt_off_t pos, void* buffer, rt_size_t size);
rt_size_t lcd_ssd1289_write (rt_device_t dev, rt_off_t pos, const void* buffer, rt_size_t size);
#endif // SSD1289_H_INCLUDED
主题帖子积分
中级技术员, 积分 103, 距离下一级还需 197 积分
中级技术员, 积分 103, 距离下一级还需 197 积分
主题帖子积分
专家等级: 结帖率:0%
主题帖子积分
中级技术员, 积分 103, 距离下一级还需 197 积分
中级技术员, 积分 103, 距离下一级还需 197 积分
本帖最后由 stm32boy 于
14:26 编辑
TFT-LCD3.2&的SSD1289驱动源码,再来ssd1289.c的--
* LCD ssd1289 Driver&&STM32ZET6 FSMC方式 (POWERAVR 红牛开发板)
* RGB mode (5-6-5)&&模式: I8080/16位
* 240 x 320 pixel LCD
*模式: I8080/16位
*IO连接:FSMC对16位数据线及读写控制
*CS--& FSMC_NE4& & 对应的起始地址:0x6C000000
*RS--& FSMC_A0& & RS=1:0x6C000002 &外接16位数据则A0拉高为A2&
*RESET--& 直连接板上的RESET则LCD的复位由外部手动控制.
*注:要根据硬件的具体接线来定义FSMC,才能有效驱动
#include &stm32f10x.h&
#include &ssd1289.h&
//内联函数定义,用以提高性能
#ifdef __CC_ARM& && && && && && &&&/* ARM Compiler&&*/
#define lcd_inline& && & static __inline
#elif defined (__ICCARM__)& && && & /* for IAR Compiler */
#define lcd_inline& && &inline
#elif defined (__GNUC__)& && && & /* GNU GCC Compiler */
#define lcd_inline& && &static __inline
#define lcd_inline& && && && && && &static
/********* control ***********/
/* ssd1289 LCD is connected to the FSMC_Bank1_NOR/SRAM4 and NE4 */
#define LCD_REG& && && && &&&(*((volatile unsigned short *) 0x6C000000)) /* RS = 0 */
#define LCD_RAM& && && && &&&(*((volatile unsigned short *) 0x6C000002)) /* RS = 1 */
static void LCD_FSMCConfig(void)
& & FSMC_NORSRAMInitTypeDef&&FSMC_NORSRAMInitS
& & FSMC_NORSRAMTimingInitTypeDef&&Timing_read,Timing_
& & /* Enable FSMC, GPIOD, GPIOE, GPIOF, GPIOG and AFIO clocks */
& && &&&GPIO_InitTypeDef GPIO_InitS
& && &&&RCC_AHBPeriphClockCmd(RCC_AHBPeriph_FSMC, ENABLE);
&&RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOE | RCC_APB2Periph_GPIOF
& && && && && && && && && && & | RCC_APB2Periph_GPIOG, RCC_APB2Periph_AFIO, ENABLE);
& && &&&/*
&&Set PD.00(D2), PD.01(D3), PD.04(NOE), PD.05(NWE), PD.08(D13), PD.09(D14),
& && &PD.10(D15), PD.14(D0), PD.15(D1)
& && &&&GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_8
& && && && && && && && && && && && && && & | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_14 | GPIO_Pin_15;
& && &&&GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
&&GPIO_InitStructure.GPIO_Mode&&= GPIO_Mode_AF_PP;
&&GPIO_Init(GPIOD,&GPIO_InitStructure);
& && &&&/*
& && &&&Set PE.07(D4), PE.08(D5), PE.09(D6), PE.10(D7), PE.11(D8), PE.12(D9), PE.13(D10),
& && && && &PE.14(D11), PE.15(D12) as alternate function push pull
& && &&&*/
& && &&&GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10
& && && && && && && && && && && && &&&| GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
& && &&&GPIO_Init(GPIOE,&GPIO_InitStructure);
& && &&&/* Set PF.00(A0 (RS)) as alternate function push pull */
& && &&&GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
& && &&&GPIO_Init(GPIOF,&GPIO_InitStructure);
&&/* Set PG.12(NE4 (LCD/CS)) as alternate function push pull - CE3(LCD /CS) */
& && &&&GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
& && &&&GPIO_Init(GPIOG,&GPIO_InitStructure);
& & /* FSMC GPIO configure */
& & /*-- FSMC Configuration -------------------------------------------------*/
& & FSMC_NORSRAMInitStructure.FSMC_ReadWriteTimingStruct = &Timing_
& & FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct = &Timing_
& & FSMC_NORSRAMStructInit(&FSMC_NORSRAMInitStructure);
& & Timing_read.FSMC_AddressSetupTime = 0;& && && && & /* 读取地址建立时间&&*/
& & Timing_read.FSMC_AddressHoldTime&&= 5;& && && && & /* 读取地址保持时间&&*/
& & Timing_read.FSMC_DataSetupTime = 5;& && && && && & /* 读取数据建立时间&&*/
& & Timing_read.FSMC_AccessMode = FSMC_AccessMode_A;& &/* 读取FSMC 访问模式 */
& & Timing_write.FSMC_AddressSetupTime = 0;& && && && & /* 写入地址建立时间&&*/
& & Timing_write.FSMC_AddressHoldTime&&= 5;& && && && & /* 写入地址保持时间&&*/
& & Timing_write.FSMC_DataSetupTime = 5;& && && && && & /* 写入数据建立时间&&*/
& & Timing_write.FSMC_AccessMode = FSMC_AccessMode_A;& &/* 写入FSMC 访问模式 */
& & /* Color LCD configuration ------------------------------------
& && & LCD configured as follow:
& && && & - Data/Address MUX = Disable
& && && & - Memory Type = SRAM
& && && & - Data Width = 16bit
& && && & - Write Operation = Enable
& && && & - Extended Mode = Enable
& && && & - Asynchronous Wait = Disable */
& & FSMC_NORSRAMInitStructure.FSMC_Bank = FSMC_Bank1_NORSRAM4;
& & FSMC_NORSRAMInitStructure.FSMC_DataAddressMux = FSMC_DataAddressMux_D
& & FSMC_NORSRAMInitStructure.FSMC_MemoryType = FSMC_MemoryType_SRAM;
& & FSMC_NORSRAMInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_16b;
& & FSMC_NORSRAMInitStructure.FSMC_BurstAccessMode = FSMC_BurstAccessMode_D
& & FSMC_NORSRAMInitStructure.FSMC_AsynchronousWait = FSMC_AsynchronousWait_D
& & FSMC_NORSRAMInitStructure.FSMC_WaitSignalPolarity = FSMC_WaitSignalPolarity_L
& & FSMC_NORSRAMInitStructure.FSMC_WrapMode = FSMC_WrapMode_D
& & FSMC_NORSRAMInitStructure.FSMC_WaitSignalActive = FSMC_WaitSignalActive_BeforeWaitS
& & FSMC_NORSRAMInitStructure.FSMC_WriteOperation = FSMC_WriteOperation_E
& & FSMC_NORSRAMInitStructure.FSMC_WaitSignal = FSMC_WaitSignal_D
& & FSMC_NORSRAMInitStructure.FSMC_ExtendedMode = FSMC_ExtendedMode_E
& & FSMC_NORSRAMInitStructure.FSMC_WriteBurst = FSMC_WriteBurst_D
& & FSMC_NORSRAMInit(&FSMC_NORSRAMInitStructure);
/* ssd1289 lcd on BANK 4 (of NOR/SRAM Bank) is enabled */
& & FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM4, ENABLE);
static void delay(int cnt)
& & while(cnt--)
& && &&&for(dl=0; dl&500; dl++);
static void lcd_port_init(void)
& & LCD_FSMCConfig();
lcd_inline void write_cmd(unsigned short cmd)
& & LCD_REG =
static void rw_data_prepare(void)
& & write_cmd(0x22);
lcd_inline unsigned short read_data(void)
& & return LCD_RAM;
lcd_inline void write_data(unsigned short data_code )
& & LCD_RAM = data_
lcd_inline void write_reg(unsigned char reg_addr,unsigned short reg_val)
& & write_cmd(reg_addr);
& & write_data(reg_val);
static void lcd_SetCursor(unsigned int x,unsigned int y)
& & write_reg(0x004e,x);& & /* 0-239 */
& & write_reg(0x004f,y);& & /* 0-319 */
/* 读取指定地址的GRAM */
static unsigned short lcd_read_gram(unsigned int x,unsigned int y)
& & lcd_SetCursor(x,y);
& & rw_data_prepare();
& & /* dummy read */
& & temp = read_data();
& & temp = read_data();
static void lcd_clear(unsigned short Color)
& & unsigned int index=0;
& & lcd_SetCursor(0,0);
& & rw_data_prepare();& && && && && && && & /* Prepare to write GRAM */
& & for (index=0; index&(LCD_WIDTH*LCD_HEIGHT); index++)
& && &&&write_data(Color);
void ssd1289_init(void)
& & lcd_port_init();
& & // power supply setting
& & // set R07h at 0021h (GON=1,DTE=0,D[1:0]=01)
& & write_reg(0x1);
& & // set R00h at 0001h (OSCEN=1)
& & write_reg(0x1);
& & // set R07h at 0023h (GON=1,DTE=0,D[1:0]=11)
& & write_reg(0x3);
& & // set R10h at 0000h (Exit sleep mode)
& & write_reg(0x0);
& & // Wait 30ms
& & delay(3000);
& & // set R07h at 0033h (GON=1,DTE=1,D[1:0]=11)
& & write_reg(0x3);
& & // Entry mode setting (R11h)
& & // R11H Entry mode
& & // vsmode DFM1 DFM0 TRANS OEDef WMode DMode1 DMode0 TY1 TY0 ID1 ID0 AM LG2 LG2 LG0
& & //& &0& &&&1& & 1& &&&0& &&&0& &&&0& &&&0& && &0& &&&0& &1& &1& &1&&*& &0& &0& &0
& & write_reg(0x0);
& & // LCD driver AC setting (R02h)
& & write_reg(0x0);
& & // power control 1
& & // DCT3 DCT2 DCT1 DCT0 BT2 BT1 BT0 0 DC3 DC2 DC1 DC0 AP2 AP1 AP0 0
& & // 1& &&&0& & 1& & 0& & 1& &0& &0&&0&&1& &0& &1& &0& &0& &1& &0&&0
& & // DCT[3:0] fosc/4 BT[2:0]&&DC{3:0] fosc/4
& & write_reg(0x4);//0xA8A4
& & write_reg(0x000C,0x0000);//
& & write_reg(0x000D,0x0808);// 0x080C --& 0x0808
& & // power control 4
& & // 0 0 VCOMG VDV4 VDV3 VDV2 VDV1 VDV0 0 0 0 0 0 0 0 0
& & // 0 0& &1& & 0& & 1& & 0& & 1& & 1& &0 0 0 0 0 0 0 0
& & write_reg(0x000E,0x2900);
& & write_reg(0x001E,0x00B8);
& & write_reg(0xB3F);//驱动输出控制320*240&&0x2B3F
& & write_reg(0x0);
& & write_reg(0x0);
& & write_reg(0x0);
& & write_reg(0x0016,0xEF1C);
& & write_reg(0x3);
& & write_reg(0x3);//0x0233
& & write_reg(0x000B,0x));
& & write_reg(0x000F,0x0000);//扫描开始地址
& & write_reg(0x0);
& & write_reg(0x0);
& & write_reg(0x0);
& & write_reg(0xF);
& & write_reg(0x004A,0x0000);
& & write_reg(0x004B,0x0000);
& & write_reg(0x0044,0xEF00);
& & write_reg(0x0);
& & write_reg(0xF);
& & write_reg(0x7);
& & write_reg(0x4);
& & write_reg(0x4);
& & write_reg(0x2);
& & write_reg(0x7);
& & write_reg(0x4);
& & write_reg(0x4);
& & write_reg(0x2);
& & write_reg(0x003A,0x0302);
& & write_reg(0x003B,0x0302);
& & write_reg(0x0);
& & write_reg(0x0);
& & write_reg(0x0);& &// 65hz
& & write_reg(0x004f,0);& && &&&// 行首址0
& & write_reg(0x004e,0);& && &&&// 列首址0
& & lcd_clear( Green );
/*&&设置像素点 颜色,X,Y */
void ssd1289_lcd_set_pixel(const char* pixel, int x, int y)
& & lcd_SetCursor(x,y);
& & rw_data_prepare();
& & write_data(*(rt_uint16_t*)pixel);
/* 获取像素点颜色 */
void ssd1289_lcd_get_pixel(char* pixel, int x, int y)
*(rt_uint16_t*)pixel = lcd_read_gram(x, y);
/* 画水平线 */
void ssd1289_lcd_draw_hline(const char* pixel, int x1, int x2, int y)
& & /* [5:4]-ID~ID0 [3]-AM-1垂直-0水平 */
& & write_reg(0x0 | (0&&3)); // AM=0 hline
& & lcd_SetCursor(x1, y);
& & rw_data_prepare(); /* Prepare to write GRAM */
& & while (x1 & x2)
& && &&&write_data(*(rt_uint16_t*)pixel);
& && &&&x1++;
/* 垂直线 */
void ssd1289_lcd_draw_vline(const char* pixel, int x, int y1, int y2)
& & /* [5:4]-ID~ID0 [3]-AM-1垂直-0水平 */
& & write_reg(0x0 | (1&&3)); // AM=0 vline
& & lcd_SetCursor(x, y1);
& & rw_data_prepare(); /* Prepare to write GRAM */
& & while (y1 & y2)
& && &&&write_data(*(rt_uint16_t*)pixel);
& && &&&y1++;
struct rt_device_graphic_ops ssd1289_ops =
ssd1289_lcd_set_pixel,
ssd1289_lcd_get_pixel,
ssd1289_lcd_draw_hline,
ssd1289_lcd_draw_vline
struct rt_device _lcd_
static rt_err_t lcd_init(rt_device_t dev)
return RT_EOK;
static rt_err_t lcd_open(rt_device_t dev, rt_uint16_t oflag)
return RT_EOK;
static rt_err_t lcd_close(rt_device_t dev)
return RT_EOK;
static rt_err_t lcd_control(rt_device_t dev, rt_uint8_t cmd, void *args)
switch (cmd)
case RTGRAPHIC_CTRL_GET_INFO:
& &struct rt_device_graphic_info *
& &info = (struct rt_device_graphic_info*)
& &RT_ASSERT(info != RT_NULL);
& &info-&pixel_format = RTGRAPHIC_PIXEL_FORMAT_RGB565P;
& &info-&bits_per_pixel = 16;
& &info-&width = 240;
& &info-&height = 320;
& &info-&framebuffer = RT_NULL;
case RTGRAPHIC_CTRL_RECT_UPDATE:
&&/* nothong to be done */
return RT_EOK;
void rt_hw_lcd_init(void)
& & /* register lcd device */
_lcd_device.type&&= RT_Device_Class_G
_lcd_device.init&&= lcd_
_lcd_device.open&&= lcd_
_lcd_device.close = lcd_
_lcd_device.control = lcd_
_lcd_device.read&&= RT_NULL;
_lcd_device.write = RT_NULL;
_lcd_device.user_data = &ssd1289_
& & ssd1289_init();
& & /* register graphic device driver */
rt_device_register(&_lcd_device, &lcd&,
&&RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_STANDALONE);
主题帖子积分
初级技术员, 积分 90, 距离下一级还需 10 积分
初级技术员, 积分 90, 距离下一级还需 10 积分
主题帖子积分
专家等级: 结帖率:0%
主题帖子积分
初级技术员, 积分 90, 距离下一级还需 10 积分
初级技术员, 积分 90, 距离下一级还需 10 积分
& &你移植好RT-Thread了吗
& && &用起来怎么样
主题帖子积分
中级技术员, 积分 207, 距离下一级还需 93 积分
中级技术员, 积分 207, 距离下一级还需 93 积分
主题帖子积分
专家等级: 结帖率:93%
主题帖子积分
中级技术员, 积分 207, 距离下一级还需 93 积分
中级技术员, 积分 207, 距离下一级还需 93 积分
貌似很猛啊!!!
主题帖子积分
中级工程师, 积分 4243, 距离下一级还需 757 积分
中级工程师, 积分 4243, 距离下一级还需 757 积分
主题帖子积分
专家等级: 结帖率:75%
主题帖子积分
中级工程师, 积分 4243, 距离下一级还需 757 积分
中级工程师, 积分 4243, 距离下一级还需 757 积分
RT-Thread | 启动下一代RTOS演化
主题帖子积分
高级技术员, 积分 579, 距离下一级还需 421 积分
高级技术员, 积分 579, 距离下一级还需 421 积分
主题帖子积分
专家等级: 结帖率:100%
主题帖子积分
高级技术员, 积分 579, 距离下一级还需 421 积分
高级技术员, 积分 579, 距离下一级还需 421 积分
时间类勋章
技术新星奖章
人才类勋章
技术高手奖章
人才类勋章
突出贡献奖章
等级类勋章
沉静之湖泊
发帖类勋章
时间类勋章
技术导师奖章
人才类勋章
时间类勋章
涓涓之细流
发帖类勋章
热门推荐 /1}

我要回帖

更多关于 stm32f103vet6 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信