在上一帖中我忘记提及如何使用屋脊雀CMSISDAP下载器进行程序下载和TTL串口调试,本帖补上CMSISDAP串口驱动安装教程。) K) f; Y0 J. ^ 首先如果安装了MDK5系列的话,DAP下载器的驱动是肯定会顺便安装上的,在工程的Debug界面下可以看到DAP下载器的配置:2 H2 t/ N7 t7 o, d" d4 u1 v 这个非常简单,就不详细讲,先讲串口驱动安装,Windows系统默认是没有CMSISDAP驱动的,需要手动安装,屋脊雀提供的资料中带了CMSISDAP驱动,直接安装即可,首先要将usbser.sys文件放到C:\Windows\INF目录下覆盖: 然后将剩下的mdmcpq.inf和stmcdc.inf放到一个文件夹下,在设备管理器中安装,安装完毕之后即可识别:1 A% | s1 Y: C/ H 为了方便大家,我将这三个文件打包发到论坛上: 然后是SPI彩屏驱动,彩屏需要三根引脚,CLK MOSI CS,时钟,数据,片选,我一开始打算使用核心板上引出的SPI FLASH引脚(PB2 PB3 PB4)作为复用来驱动彩屏的,谁知道怎么都点不亮: 7 F9 t/ C7 G3 G! Q% Z 我又用了别的F407开发板(没有SPI器件引脚复用)作为对照,是可以点亮的,后面我就干脆不折腾了,直接用三根GPIO(PF9 PF11 PF13)模拟SPI时序来点亮液晶彩屏: 成功点亮了:( V/ S1 M: X( P# p: k 附上驱动代码:% k: k/ h* `* @" ^$ V& M/ a; }" M unsigned char SPI1_ReadWriteByte(unsigned char txdata) { int i; for(i=0;i<8;i++)/ o! L" O' Y, v( Z0 P { SPILCD_CLK_CLR; if(txdata&0x80)9 |% L1 W5 K- y3 x$ U SPILCD_DI_SET; else SPILCD_DI_CLR;7 y6 X/ T! L! T6 ` SPILCD_CLK_SET; txdata<<=1; } } : \ n2 V* [+ | ] / q A/ x2 h7 @9 I O0 I void SPILCD_Send_Command(unsigned char out_cmd) { SPILCD_CS_CLR; SPI1_ReadWriteByte(out_cmd);' I2 l& Y3 i7 {: T# Z% B w SPILCD_CS_SET;8 K6 a f9 {7 k$ O4 |9 b4 l }; F6 Q. W, W1 G9 ?+ N) ] ; B. d' y3 }0 X- Q( N3 P0 v void SPILCD_Send_Data(unsigned int out_data) 0 L* q& Z0 M% A' A1 d, h1 o { SPILCD_CS_CLR; SPI1_ReadWriteByte(out_data>>8); SPI1_ReadWriteByte(out_data); SPILCD_CS_SET; } * x9 |/ {9 S1 Q 6 I6 C' }5 r% T9 s 然后是SYSTICK延时,非常简单,参考原子的代码即可: 1 \9 j0 K( d2 g4 u- S" z; T ' ~8 R! ?8 E+ d- u5 J) } void Delay_us(int nus) { ! f9 q$ T9 Q0 h3 Z/ S/ `4 e6 j int temp; SysTick->LOAD=nus*fac_us;' A0 y( G4 Z d6 c& {* |+ w //时间加载 0 m9 Q1 h: i0 |4 Y$ r2 y, E" a( D SysTick->VAL=0x00; //清空计数器* c* ]' r/ D4 o2 c/ o; i+ U SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk ;' A) E* T* c D //开始倒数 ! ^$ S! K: Q' l1 [' i/ P$ c do( Q& m1 X) g9 U' R% l8 c { temp=SysTick->CTRL; G" i* W7 k/ v+ u d }while((temp&0x01)&&!(temp&(1<<16)));, L. m! a7 ^2 v1 J! d //等待时间到达 0 M+ M+ o; I" W SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk;6 M* Y; ?% |* y; w) J //关闭计数器 SysTick->VAL =0X00; //清空计数器 9 F2 G/ \; f$ P) a+ b. X }- Y) O( a0 B2 ?7 V, @; P8 o & M5 G) K' x8 ?! @3 T * _% c' d! Q4 c% e void Delay_ms(short nms) x% `# W4 r$ D$ G k% A { 4 y5 z3 r* j* {" F! |- ]5 C unsigned char repeat=nms/540; int temp; //这里用540,是考虑到某些客户可能超频使用,* c8 D8 q9 I4 |8 n' h9 L //比如超频到248M的时候,delay_xms最大只能延时541ms左右了 short remain=nms%540;. x. t* a* y6 Z u' f ` while(repeat) { SysTick->LOAD=(int)540*fac_ms;9 h/ u/ B) \$ Z/ W% I( V1 b //时间加载(SysTick->LOAD为24bit) SysTick->VAL =0x00; //清空计数器5 A0 p& u0 ^$ Y4 d- ] SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk; //开始倒数 $ ^: b/ X& _# z# z. `, V do {" u% m5 s. a) F) j. P4 k, L temp=SysTick->CTRL; }while((temp&0x01)&&!(temp&(1<<16)));" {9 ?' [% K% j6 Z/ i+ w: I, _' U //等待时间到达 SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk; //关闭计数器0 e* a1 t4 e3 F+ ~7 a# R9 d; j SysTick->VAL =0X00;8 X) X2 {4 T2 w) F //清空计数器 6 {! m8 p- F; A- f6 V repeat--;& \( ~) B4 G: q4 M }2 f8 ?: f8 I; j1 s8 z if(remain) {7 s# V l: E+ F. ? SysTick->LOAD=(int)remain*fac_ms;* f, C( K) ?2 P7 M. p! z //时间加载(SysTick->LOAD为24bit) SysTick->VAL =0x00; 2 [8 M S, Z2 O; X ~/ r- C //清空计数器8 {5 d" o$ K R0 {5 w' W SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk;4 b. x9 _/ G5 \1 i3 z //开始倒数 " o# g7 a- B7 U" `- d- {# H do { temp=SysTick->CTRL; }while((temp&0x01)&&!(temp&(1<<16)));/ J2 M7 f* W* X o0 h: b //等待时间到达 SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk;0 w3 X1 w0 C- B' |9 F6 C; Y! l //关闭计数器 SysTick->VAL =0X00;9 `% i4 w- C+ ? //清空计数器 6 J$ u: N3 T; Y" K* H$ [8 { } } 上传工程文件:/ X3 n( }1 ?4 P. M Z1 @. w |
只要把两片FLASH的CS拉高,应该就可以用了。
不是节约成本,节约成本的话,就不会有两片FLASH了。0 d( O. M4 @7 ]- l, c5 G
1 首先是IO口没有那么多。& _& @% U5 S. i
2 多个设备共用SPI控制器本来就是我要模拟的情景。
' ]0 T- {& }/ O/ M
根本上就是,这套板子,是为了我做软件开发教程而做的。
这点我也想到了,也拉高了,就是不行,我还用一个别的407板子来做空白对照,接在相同的PB2~PB4引脚上,是可以驱动的。
不错,感谢分享
! a7 e' p: @+ e8 v" M