你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【屋脊雀F407开发板】CMSISDAP驱动安装&驱动SPI彩屏&SYSTICK

[复制链接]
donatello1996 发布时间:2019-1-4 09:41
    在上一帖中我忘记提及如何使用屋脊雀CMSISDAP下载器进行程序下载和TTL串口调试,本帖补上CMSISDAP串口驱动安装教程。) K) f; Y0 J. ^
    首先如果安装了MDK5系列的话,DAP下载器的驱动是肯定会顺便安装上的,在工程的Debug界面下可以看到DAP下载器的配置:2 H2 t/ N7 t7 o, d" d4 u1 v
7.jpg
; x, W/ v2 l; F这个非常简单,就不详细讲,先讲串口驱动安装,Windows系统默认是没有CMSISDAP驱动的,需要手动安装,屋脊雀提供的资料中带了CMSISDAP驱动,直接安装即可,首先要将usbser.sys文件放到C:\Windows\INF目录下覆盖:
) b: ?5 x# i# i9 K1 W- {1 T 8.jpg
  o: G. q7 c1 s; I/ X3 p- J然后将剩下的mdmcpq.inf和stmcdc.inf放到一个文件夹下,在设备管理器中安装,安装完毕之后即可识别:1 A% |  s1 Y: C/ H
9.jpg / ?, K, x( H4 i( T, X0 \
为了方便大家,我将这三个文件打包发到论坛上:
5 D  Q' [: f7 a) E- G; J/ H+ C9 _
" E- |/ ?- s1 N: t; h: R

: [0 X2 k5 w3 o4 a' f4 p6 z$ J然后是SPI彩屏驱动,彩屏需要三根引脚,CLK MOSI CS,时钟,数据,片选,我一开始打算使用核心板上引出的SPI FLASH引脚(PB2 PB3 PB4)作为复用来驱动彩屏的,谁知道怎么都点不亮: 10.jpg
/ _" E9 M; ~" j4 z' T7 l7 F9 t/ C7 G3 G! Q% Z

( O4 A5 ^! ~- h, @* H& _9 h我又用了别的F407开发板(没有SPI器件引脚复用)作为对照,是可以点亮的,后面我就干脆不折腾了,直接用三根GPIO(PF9 PF11 PF13)模拟SPI时序来点亮液晶彩屏:
3 ~1 X$ U; s0 Z. a4 z9 F4 m' h 11.jpg
6 `3 }8 `" v7 S- P  R成功点亮了:( V/ S1 M: X( P# p: k
IMG_20190104_094027.jpg 9 M$ }0 j& f# X1 ~8 Q9 D0 P
附上驱动代码:% k: k/ h* `* @" ^$ V& M/ a; }" M
unsigned char SPI1_ReadWriteByte(unsigned char txdata)
5 Y) X5 J2 D0 [1 B4 Q" C1 S{
3 a1 Y2 j* x7 ?  M* s, t' B4 u        int  i;
1 J% G) Q- y% l0 p        for(i=0;i<8;i++)/ o! L" O' Y, v( Z0 P
        {
/ d/ R3 |/ j& G' k1 Q$ P8 E. G# b                SPILCD_CLK_CLR;
: M2 a% [. a) h* ]) d! H                if(txdata&0x80)9 |% L1 W5 K- y3 x$ U
                        SPILCD_DI_SET;
+ T8 ^1 s3 u3 |9 Y/ L: M$ b( ~                else SPILCD_DI_CLR;7 y6 X/ T! L! T6 `
                SPILCD_CLK_SET;
% r/ W/ ]# z0 Y( C! r9 c                txdata<<=1;
& V* Z& Y6 h* r* ]        }
4 b$ w; c% [2 r( H}       
$ C3 B$ C5 R: S7 F$ r: \  n2 V* [+ |  ]
/ q  A/ x2 h7 @9 I  O0 I
void SPILCD_Send_Command(unsigned char out_cmd)              
) r: l) M2 }0 o' g  x2 r{
4 l) Z4 _9 O/ R5 l        SPILCD_CS_CLR;
# O3 n$ r" W& f. n        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) ]

$ D  u. z+ R' P& k
; 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
{
" V0 W$ I6 P# G  K3 M        SPILCD_CS_CLR;
) m) q/ b3 X: @) G        SPI1_ReadWriteByte(out_data>>8);
9 {2 V, @  i1 B5 S. U        SPI1_ReadWriteByte(out_data);
0 v1 L( }0 Y# k2 u* O" K        SPILCD_CS_SET;
! ]" W- M3 u8 n0 C! w3 `8 J}
1 b3 |% S& _; s. n/ t+ y1 c$ J
& u2 H  B" U! Y  s
* x9 |/ {9 S1 Q

# B9 ^* e6 b, V" e7 l) e
6 I6 C' }5 r% T9 s
然后是SYSTICK延时,非常简单,参考原子的代码即可:
5 Z/ |3 K0 V4 M% U1 \9 j0 K( d2 g4 u- S" z; T
' ~8 R! ?8 E+ d- u5 J) }
void Delay_us(int nus)
. A3 M* f; {* L5 |- v{                ! f9 q$ T9 Q0 h3 Z/ S/ `4 e6 j
        int temp;                     
& Q& r  R) q$ r8 a) x* c        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;
+ I$ F3 Z9 `% b( ~$ e! v        //清空计数器* 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
        {
$ i% `: V1 @7 q: u7 n                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
        //关闭计数器
, j. N7 m: m$ s) d7 n7 l' G  Z% G        SysTick->VAL =0X00;
7 n1 x9 z+ U; e        //清空计数器 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;
- Y% \& D; R& N% ~+ x        int temp;               
4 A6 J/ I4 G3 z5 ~. F        //这里用540,是考虑到某些客户可能超频使用,* c8 D8 q9 I4 |8 n' h9 L
        //比如超频到248M的时候,delay_xms最大只能延时541ms左右了
' C# O/ }/ k, v3 h        short remain=nms%540;. x. t* a* y6 Z  u' f  `
        while(repeat)
. n3 E4 h1 U' Q/ p- d0 C        {
9 c, Z; V6 h3 d1 @& f# M  ?, W                        SysTick->LOAD=(int)540*fac_ms;9 h/ u/ B) \$ Z/ W% I( V1 b
        //时间加载(SysTick->LOAD为24bit)
4 L+ y5 ~' y$ K! T: ]        SysTick->VAL =0x00;
' j5 V3 F) s0 u9 D6 h        //清空计数器5 A0 p& u0 ^$ Y4 d- ]
        SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk;
) s8 Z' O$ s0 z# {        //开始倒数 $ ^: b/ X& _# z# z. `, V
        do
9 N; g1 ^) t; H3 J        {" u% m5 s. a) F) j. P4 k, L
                temp=SysTick->CTRL;
. v+ n; X0 m' N) B! h        }while((temp&0x01)&&!(temp&(1<<16)));" {9 ?' [% K% j6 Z/ i+ w: I, _' U
        //等待时间到达   
( a0 [2 d8 E$ h% x1 E        SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk;
8 S0 q$ ?* p" p% V2 v/ }        //关闭计数器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)
+ R# x# e: H3 I6 C0 n" [% b& C        {7 s# V  l: E+ F. ?
                SysTick->LOAD=(int)remain*fac_ms;* f, C( K) ?2 P7 M. p! z
                //时间加载(SysTick->LOAD为24bit)
# e* O# ^6 k. e: F: P' Z                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
& E  d! p- w0 G9 I* j- Q                {
  f% x! z7 q* I" t                        temp=SysTick->CTRL;
0 \3 I! D+ c% N* c3 p                }while((temp&0x01)&&!(temp&(1<<16)));/ J2 M7 f* W* X  o0 h: b
                //等待时间到达   
9 ^% ?1 I* K- _& D; h                SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk;0 w3 X1 w0 C- B' |9 F6 C; Y! l
                //关闭计数器
  k8 Z0 b/ x/ G1 T4 b9 ^( Z; z2 r, M. M                SysTick->VAL =0X00;9 `% i4 w- C+ ?
                //清空计数器        6 J$ u: N3 T; Y" K* H$ [8 {
        }
( b- Q" G4 z0 k" M) f: r9 W}
1 g! q& o) j' ]3 O
) [" l6 v+ k! ~# @0 O# ?/ T$ p

) Y* d/ q" b, R& E. E# g7 y1 s1 t上传工程文件:/ X3 n( }1 ?4 P. M  Z1 @. w
STM32F407ZGT6.zip (551.13 KB, 下载次数: 238)
收藏 评论8 发布时间:2019-1-4 09:41

举报

8个回答
donatello1996 回答时间:2019-1-4 10:15:19
这里想给屋脊雀工作室的设计者提个醒,最好能预留一组空的SPI引脚给用户用,尽量不要与已有的SPI器件复用。
zhdzhd 回答时间:2019-1-4 10:44:44
可能空间有限或节约成本吧
wujique 回答时间:2019-1-4 21:37:36
donatello1996 发表于 2019-1-4 10:150 \- ~( c& G  ~/ {3 R/ m
这里想给屋脊雀工作室的设计者提个醒,最好能预留一组空的SPI引脚给用户用,尽量不要与已有的SPI器件复用。 ...

7 _4 J1 Y* T+ _- G* u# I( k/ J只要把两片FLASH的CS拉高,应该就可以用了。
wujique 回答时间:2019-1-4 21:39:54
zhdzhd-174422 发表于 2019-1-4 10:44
& x: X# f5 b1 K4 B8 U可能空间有限或节约成本吧

7 x8 w: ~# T. m5 L1 P不是节约成本,节约成本的话,就不会有两片FLASH了。0 d( O. M4 @7 ]- l, c5 G
1 首先是IO口没有那么多。& _& @% U5 S. i
2 多个设备共用SPI控制器本来就是我要模拟的情景。
, H9 b' L" G, P: b' ]0 T- {& }/ O/ M
根本上就是,这套板子,是为了我做软件开发教程而做的。
donatello1996 回答时间:2019-1-5 11:10:08
huangxuejia-292 发表于 2019-1-4 21:37" \8 |; {3 K. f; Q0 f' j
只要把两片FLASH的CS拉高,应该就可以用了。

5 I6 G# ~3 E2 ~3 [; @% \  b( y这点我也想到了,也拉高了,就是不行,我还用一个别的407板子来做空白对照,接在相同的PB2~PB4引脚上,是可以驱动的。
mmuuss586 回答时间:2019-1-5 13:08:00
1 \1 {1 h; c8 @# o$ B) P
不错,感谢分享
berber 回答时间:2021-5-31 19:28:31
说了半天我是来找驱动的你打包的驱动呢" q6 m# A5 m: c3 y6 c
! a7 e' p: @+ e8 v" M
龙泉火箭客 回答时间:2022-9-4 20:55:30
谢楼主分享资料谢楼主分享资料

所属标签

相似分享

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版