|
在上一帖中我忘记提及如何使用屋脊雀CMSISDAP下载器进行程序下载和TTL串口调试,本帖补上CMSISDAP串口驱动安装教程。 首先如果安装了MDK5系列的话,DAP下载器的驱动是肯定会顺便安装上的,在工程的Debug界面下可以看到DAP下载器的配置:
这个非常简单,就不详细讲,先讲串口驱动安装,Windows系统默认是没有CMSISDAP驱动的,需要手动安装,屋脊雀提供的资料中带了CMSISDAP驱动,直接安装即可,首先要将usbser.sys文件放到C:\Windows\INF目录下覆盖:. I. m" d8 V' c- H
然后将剩下的mdmcpq.inf和stmcdc.inf放到一个文件夹下,在设备管理器中安装,安装完毕之后即可识别:) \ _$ Q! u# J7 J
为了方便大家,我将这三个文件打包发到论坛上: . m, N' {7 k+ A* l9 z- t* w 然后是SPI彩屏驱动,彩屏需要三根引脚,CLK MOSI CS,时钟,数据,片选,我一开始打算使用核心板上引出的SPI FLASH引脚(PB2 PB3 PB4)作为复用来驱动彩屏的,谁知道怎么都点不亮:
, c2 }6 T# X7 q, ~. W2 B" j 我又用了别的F407开发板(没有SPI器件引脚复用)作为对照,是可以点亮的,后面我就干脆不折腾了,直接用三根GPIO(PF9 PF11 PF13)模拟SPI时序来点亮液晶彩屏:2 i2 t/ y9 J- A& {/ l
成功点亮了:2 _3 x, [, Y5 k+ ?8 T
附上驱动代码: unsigned char SPI1_ReadWriteByte(unsigned char txdata)0 @. b6 \2 T* z5 F5 ]- x {. v: Q# V& {1 R0 M" K int i;, V/ z2 k7 Y. _1 h for(i=0;i<8;i++) { SPILCD_CLK_CLR;2 C7 g: F9 S4 H+ [ if(txdata&0x80)* W+ U& k( X* T& U7 s SPILCD_DI_SET; else SPILCD_DI_CLR; SPILCD_CLK_SET;( v5 a( r! E7 o7 S% m# S3 N txdata<<=1; } / q1 a* x1 o& C5 l } * x- ^' }' a+ A0 E( d" N) C void SPILCD_Send_Command(unsigned char out_cmd) * ^4 ^$ S* P6 p6 ]1 F { SPILCD_CS_CLR;& s' J( a0 p b* \# {3 c, y) k SPI1_ReadWriteByte(out_cmd);! R' @* w3 A! g& K4 z' F0 ^2 q SPILCD_CS_SET; }, ^, B! u5 |4 D6 K! N; ? 2 t: C- u* A% v6 H & U' G9 z% ~0 ?: L% J; T void SPILCD_Send_Data(unsigned int out_data) : ]" I S5 b5 X) Y2 ~# L) _. g { SPILCD_CS_CLR; SPI1_ReadWriteByte(out_data>>8);. d( e1 y( Z2 ? SPI1_ReadWriteByte(out_data); SPILCD_CS_SET; }# ?' J @- g+ v5 p& p& _$ d c/ V( k: V8 H) K 然后是SYSTICK延时,非常简单,参考原子的代码即可:/ J3 U3 e+ ^' ~2 e; O 3 G9 `8 p4 k* ?+ U9 D+ T& h6 d/ W 7 i! L* w7 c+ `3 I1 U2 B void Delay_us(int nus)7 p0 r( M$ A! R2 {0 S { int temp; SysTick->LOAD=nus*fac_us;: g$ m9 |* ~2 ]6 A$ e# c3 Y' P //时间加载 $ b4 K9 I# v: o SysTick->VAL=0x00; , z8 Z$ b1 c0 p: U //清空计数器 SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk ;# t0 i- m1 i* C3 y( l" L //开始倒数 do: m% B2 M9 P: D9 N" y* q5 D {2 v8 U; N+ z4 k _) A. S temp=SysTick->CTRL;* _0 R1 \8 \, P8 i6 A# ]0 ? }while((temp&0x01)&&!(temp&(1<<16)));2 g% O% q) b8 _( @& N. l //等待时间到达 SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk;8 P* K7 [" g6 T: s* P //关闭计数器' h' l; M! M% `' u SysTick->VAL =0X00; //清空计数器 $ V9 C, L! }0 R } 4 b* b; I7 r0 e* ?: W1 R. K" x7 g void Delay_ms(short nms) { & u) @5 v- \" `/ \& X8 E+ ?$ Q unsigned char repeat=nms/540; int temp; //这里用540,是考虑到某些客户可能超频使用,% u( e+ \$ t* K5 y5 r# q% _; T //比如超频到248M的时候,delay_xms最大只能延时541ms左右了 short remain=nms%540; while(repeat)& |4 x, i4 |7 C# s q {) `! D' e% Q C* b4 z8 N; | SysTick->LOAD=(int)540*fac_ms;4 ~9 P+ ]% P, x. ~# G# f- l //时间加载(SysTick->LOAD为24bit) SysTick->VAL =0x00; " o# i( [1 A5 D+ j% y //清空计数器 SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk;* F, M, }* Z# D5 {% D, z //开始倒数 do1 y z9 J" K6 a+ F% H+ d { temp=SysTick->CTRL; Y5 r' Y: x7 V3 O# G' M }while((temp&0x01)&&!(temp&(1<<16))); //等待时间到达 SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk; //关闭计数器5 P+ r) W& m* _! q, h SysTick->VAL =0X00; //清空计数器 repeat--;: ]+ [( l$ c3 M& _2 c+ R } if(remain)" a) E) \, V/ H: i8 S { SysTick->LOAD=(int)remain*fac_ms;' _) ^- Q& `: W' r( M //时间加载(SysTick->LOAD为24bit) SysTick->VAL =0x00; //清空计数器0 c! ?8 |1 O/ D/ t; O SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk; //开始倒数 1 t. M. ^6 a! Y- a# L$ N) W* [8 R) B do; N$ ^/ D1 c8 J1 N0 U {% F- y# @6 a$ Z/ H temp=SysTick->CTRL; }while((temp&0x01)&&!(temp&(1<<16))); //等待时间到达 6 K+ W4 Y& d7 `+ G SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk; //关闭计数器( @% H, U4 u, K SysTick->VAL =0X00; //清空计数器 % c6 p! n; @6 V: G8 {" ?6 F1 c } }- ?* ~- }/ p, b. g% U: q& g \* a- [ [8 V' X# W7 B" [; M0 q 上传工程文件:
STM32F407ZGT6.zip
(551.13 KB, 下载次数: 250)
|
微信公众号
手机版
只要把两片FLASH的CS拉高,应该就可以用了。
不是节约成本,节约成本的话,就不会有两片FLASH了。- U- E* O% `- H0 `, X# d
1 首先是IO口没有那么多。
2 多个设备共用SPI控制器本来就是我要模拟的情景。
根本上就是,这套板子,是为了我做软件开发教程而做的。
这点我也想到了,也拉高了,就是不行,我还用一个别的407板子来做空白对照,接在相同的PB2~PB4引脚上,是可以驱动的。
不错,感谢分享