在上一帖中我忘记提及如何使用屋脊雀CMSISDAP下载器进行程序下载和TTL串口调试,本帖补上CMSISDAP串口驱动安装教程。 首先如果安装了MDK5系列的话,DAP下载器的驱动是肯定会顺便安装上的,在工程的Debug界面下可以看到DAP下载器的配置: 这个非常简单,就不详细讲,先讲串口驱动安装,Windows系统默认是没有CMSISDAP驱动的,需要手动安装,屋脊雀提供的资料中带了CMSISDAP驱动,直接安装即可,首先要将usbser.sys文件放到C:\Windows\INF目录下覆盖:" p' {# {* C+ b: k* h: y: B. C 然后将剩下的mdmcpq.inf和stmcdc.inf放到一个文件夹下,在设备管理器中安装,安装完毕之后即可识别: 为了方便大家,我将这三个文件打包发到论坛上: * v+ Q0 t5 F e6 ]7 z% ^6 F, U- e# _ 2 l E5 d: b' P1 S; F$ c# v% V 然后是SPI彩屏驱动,彩屏需要三根引脚,CLK MOSI CS,时钟,数据,片选,我一开始打算使用核心板上引出的SPI FLASH引脚(PB2 PB3 PB4)作为复用来驱动彩屏的,谁知道怎么都点不亮: ; K* l0 A& @) m' C3 r x # E8 N( @% W: O 我又用了别的F407开发板(没有SPI器件引脚复用)作为对照,是可以点亮的,后面我就干脆不折腾了,直接用三根GPIO(PF9 PF11 PF13)模拟SPI时序来点亮液晶彩屏: 成功点亮了: 附上驱动代码:- d- ~! {; k% u) U+ ]# p3 ` unsigned char SPI1_ReadWriteByte(unsigned char txdata)( N2 [0 s8 \$ C% b3 P) X( _1 Z { int i; for(i=0;i<8;i++) { SPILCD_CLK_CLR; if(txdata&0x80) SPILCD_DI_SET;8 ~6 X! c, h0 I }* d else SPILCD_DI_CLR; SPILCD_CLK_SET;6 w4 O) s7 F- b txdata<<=1; } } void SPILCD_Send_Command(unsigned char out_cmd) ! ]. S. C* j8 n! v: K {! G5 m% t8 n3 h8 R9 S. M% O$ f SPILCD_CS_CLR; SPI1_ReadWriteByte(out_cmd);, A) Q$ x7 j3 j. _6 x) s SPILCD_CS_SET;& T& X9 v9 x& m6 t- @8 z }, V0 U) z$ Z, U: N0 A. j + L( k% \ y4 o- v& @* Y void SPILCD_Send_Data(unsigned int out_data) , A+ h0 a- B3 W+ t* k { Q5 x. ?2 M, I SPILCD_CS_CLR; SPI1_ReadWriteByte(out_data>>8); SPI1_ReadWriteByte(out_data); SPILCD_CS_SET;# L1 l3 Q2 f7 F9 d }: S: t4 N" X! J0 w0 f 然后是SYSTICK延时,非常简单,参考原子的代码即可: ' o+ w' H9 t$ w3 ?: {( | 7 J$ w% \( o5 k" E7 g k! S9 | void Delay_us(int nus)5 c" K$ e) a) m7 {+ Y% i4 H { ; W, r$ E8 U S/ J! c int temp; SysTick->LOAD=nus*fac_us; //时间加载 ; l) I1 X. H- R& l4 U SysTick->VAL=0x00; //清空计数器# T# K* X! a5 _" b" j4 `8 z SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk ; //开始倒数 do {3 k& l' z) R0 [7 y3 i1 t temp=SysTick->CTRL; }while((temp&0x01)&&!(temp&(1<<16))); //等待时间到达 5 ~! N8 H3 }: O SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk;$ |5 }/ Y! {9 h1 i$ | C //关闭计数器, I% I$ S4 ?- V8 }; T8 [1 n% c1 ? SysTick->VAL =0X00;9 L3 M3 z6 I/ ^6 ]: B; R. G+ y' S //清空计数器 }" _ {% X# w# }: Q" l 8 I. ~/ j/ F2 @+ c void Delay_ms(short nms) { unsigned char repeat=nms/540;+ Z/ f# m# I0 l int temp; * `6 d; O9 Z( f //这里用540,是考虑到某些客户可能超频使用,4 h# ~8 h! a9 a$ Z7 g9 y //比如超频到248M的时候,delay_xms最大只能延时541ms左右了9 V5 t4 [' e& Y8 |+ b short remain=nms%540;# t" p+ [. h* b$ T( B* u while(repeat)8 T/ `/ L! }$ } { SysTick->LOAD=(int)540*fac_ms; //时间加载(SysTick->LOAD为24bit) SysTick->VAL =0x00; //清空计数器 SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk;2 |( U; }( p P9 K9 e9 N- r# ~ //开始倒数 do { temp=SysTick->CTRL; }while((temp&0x01)&&!(temp&(1<<16))); G3 d" {% M" j8 D$ @ //等待时间到达 SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk;. V9 a" k# X0 U9 p( {" m //关闭计数器& M) E. u1 I! Q4 { SysTick->VAL =0X00;5 D$ z, o8 L5 _! i- V //清空计数器 repeat--; y( z' \6 H: o }8 B/ E# V3 C" c9 |" \6 V2 l, v if(remain) {9 p% D0 f; p& E) M0 o SysTick->LOAD=(int)remain*fac_ms;3 _ [/ R% Q8 W, ^ //时间加载(SysTick->LOAD为24bit)3 t; |. Y6 T# F9 g8 Y" b SysTick->VAL =0x00; $ K$ O/ s( y! ?& P, W //清空计数器" T( e. P% V# T# S. Q K( D SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk;. \( u* }3 N: ?; w+ h' o' J //开始倒数 ( x" A7 Q% p) H$ C) x( ^: u k do {& c% d+ d' D( G. E# r( S q temp=SysTick->CTRL; }while((temp&0x01)&&!(temp&(1<<16)));# q- k5 r& e1 V; c" H# Q //等待时间到达 # R( e. B' m0 E) D1 `- ] SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk; //关闭计数器( [% D b, h+ E$ q SysTick->VAL =0X00;! ~. z% w: d! o+ j3 {% c9 s" U# F //清空计数器 3 F0 h' z/ E8 {- a% h. B+ }+ v } } 2 c6 q7 F8 [9 u0 f( k 上传工程文件: |
只要把两片FLASH的CS拉高,应该就可以用了。
不是节约成本,节约成本的话,就不会有两片FLASH了。
1 首先是IO口没有那么多。$ u: ]$ ?) P! `4 j! r8 s
2 多个设备共用SPI控制器本来就是我要模拟的情景。# D) M* j8 F5 T
根本上就是,这套板子,是为了我做软件开发教程而做的。
这点我也想到了,也拉高了,就是不行,我还用一个别的407板子来做空白对照,接在相同的PB2~PB4引脚上,是可以驱动的。
不错,感谢分享
2 P. h; y9 ?% X9 Q1 r7 d ^