本帖最后由 黑夜之狼 于 2016-11-21 10:05 编辑 & b! t) P0 m+ B. t# y7 P. Z
" s8 }! U7 _! v, c9 M8 S
闲来无事,翻箱看到了这块板子,之前没玩过M0,现在来好好玩下,有板子的朋友可以一起指导交流!# e! \% @2 J7 _$ I4 {
- C: J% c3 V$ l3 P3 l
首先打开ST的选型手册,看看板载的主控芯片STM32F030R8到底有多牛叉先- \8 R+ a# {9 c- r, o# o
/ t, h) [% d0 K s8 J ]
: @+ ^) j& e9 c$ d0 l0 U
64KFlash,8K的RAM,16*12bit的ADC,SPI、I2C、USART各2路,在JLC上查过,售价5个大洋左右,性价比还算不错,20个引脚的做到两块多....(这会不会和STM8有冲突  )' o t1 ^4 ?0 ^$ j
- ~' ~. s3 z- C: s/ C N
板子的照片就不发了,和大多数的Nucleo板一样,那就直奔主题,来点灯吧!
/ s/ C5 R. T8 C5 Z' n0 i
" q1 w, h% }+ I点灯前,养成一个好习惯-使能外设的时钟(在这点上,很多初学者可能多数都是从51过来,都是犯了这个错误)- u4 d7 f2 C- h3 W7 \; ] | E
既然有了时钟这个概念,那么这个时钟怎么来的,到底有快呢?
. H9 [2 D; O; l1 U我们先看看时钟树(参考手册P90 Figure 10)! M) q# p0 p1 D% r- P' [
0 t2 R! c5 h5 @4 @2 l通过上面的时钟树,我们一共有三种不同的时钟源
4 s( J" G- u! Z& h2 c0 ^. S1.内部8MHz RC时钟1 c- p- |. H# G3 I5 A
2.外部RC时钟(可接4-32MHz晶振)
- e% G+ `1 V" T5 i1 s; g$ |- L. Q3.内部锁相环PLL时钟
p' n) O0 |3 l9 c由于STM32F030 Nucleo64这块开发板只留了HSE接口,焊接了LSE,我也懒得找晶振焊接上去,往后的实验会用HSI/2经过PLL,12倍频到48MHz给系统时钟(已经是这颗芯片最高时钟频率了!)
0 T5 @8 b F0 k6 o既然要用PLL,那么我们打开参考手册P94,看看PLL是如何配置的:3 V" Q; x8 v8 L* g: `
4 d( @4 K7 [! J贴上代码:
) K- _+ X+ U- v+ }- void SystemClock_Config(void)
2 Z: N7 ^/ Q& Y. @& ? - {
/ R2 I9 t7 Z9 S - RCC_DeInit(); //将外设 RCC寄存器重设为缺省值
- s" w7 }7 D( w1 i -
" ?. h1 p3 a7 A% k - RCC_HSICmd(ENABLE); //使能HSI $ p0 f6 l u! Y' w7 j4 |% Y( }
- while(RCC_GetFlagStatus(RCC_FLAG_HSIRDY) == RESET); //等待HSI使能成功
7 @* D5 U2 d$ l7 W6 Z# l - RCC_PLLCmd(DISABLE); //禁止PLL
& x; S4 ^2 l. T" N: f' ^4 q - while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == SET); //等待PLL禁止成功3 U+ ~# F6 m' |% t$ P& L
- RCC_HCLKConfig(RCC_SYSCLK_Div1); //AHB clock = SYSCLK
( K$ t' [* ^. [# X6 c( x - RCC_PLLConfig(RCC_PLLSource_HSI_Div2, RCC_PLLMul_12); //PLL时钟来源HSI二分频,再12倍频,得出48MHz
1 J9 } R3 L( X% c; s8 A! o0 d) u - RCC_PLLCmd(ENABLE); //使能PLL/ f' W5 j5 s6 u) ^6 h3 |
- while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET); //等待PLL使能成功
3 o3 ]# z6 J$ Y - RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); //设置PLL为系统时钟# R. G8 c" f. s w# S
- while(RCC_GetSYSCLKSource() != 0x08);
0 c/ N. f8 J- A' ~ - }
复制代码 那么时钟的配置就完成了,回到之前所讲的使能外设时钟。9 ~) y5 `( D9 f: R9 U3 d
GPIO是挂在在AHB这个时钟总线上的,对GPIO的时钟使能,我们可以通过RCC_AHBPeriphClockCmd()这个库函数来实现,代码如下:
0 @" G) j4 [% e7 i2 ]- RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE); //使能PA端口时钟
复制代码 板子上只有LD2才可以控制,是挂在PA5上,而配置GPIO的步骤如下:
( D, {: O# T3 L" j1.选择配置的端口
* D' E/ h% [2 x- p2.选择控制模式8 u, d! \/ i6 y5 }3 e( A- e8 R
3.GPIO的速率
. J( C( m+ @+ m2 G4 [
, h/ M8 x s$ O; y, m实现代码如下:+ o( ^3 r: P. N( Y
- /*
7 g( P% C9 t7 N- G) c - LED2<----->PA5
% q' t9 u2 W" O* l9 l& L - */
4 {- ?7 b: m* p# G - //LED IO初始化
8 s: v' r U1 Q U6 J& b5 \ - void LED_Init(void)
8 b$ _0 F) q/ d. z; G - {! l6 S6 A* ?1 N9 m
- GPIO_InitTypeDef GPIO_InitStructure;
! _* Z1 ?) e4 }: u: `/ _- g- J! e -
9 X0 N j. Q1 Y( T - RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE); //使能PA端口时钟; N: Z: o* p/ e) }& V1 d8 O, s; _( S
- ) ?7 b4 u9 R+ f! s; U8 `* e
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //LED0-->PA.5 端口配置
4 k5 E6 ~. Z8 S1 i - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
) i* T8 B, K8 F9 i - GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽输出
: X E9 `0 k- j. n; `" x - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz" D6 L% ~0 X3 v$ G. z
- GPIO_Init(GPIOA, &GPIO_InitStructure); //根据设定参数初始化GPIOA.5
+ V8 D H0 I/ N: M8 n2 _, ^- E - GPIO_ResetBits(GPIOA, GPIO_Pin_5); //PA.5 输出低电平 # {# J! A x+ m1 r( V! i
- }
复制代码 到了这里就完成点灯这个步骤,如果让LED闪烁起来,那写一个简单的delay即可,我们这里顺带把Cortex-M0内核的嘀嗒定时器玩起来,让这个定时器完成delay功能,具体代码可参考官方例程,这里就不具体描述了* J3 a. z. ~6 `( A1 e$ n
2 U. \" e8 Q: T+ L- F( E* x
3 p A+ |3 c4 ^4 O2 g% O
" T& ?7 P3 e- W/ K8 l8 ?) Q t7 @+ V, C4 W* V: }
7 W: T' |& S* h1 h7 v4 U: T
* e- _$ V* j4 I1 j |
额,跟着论坛里某一位大神安装的,设备管理器里读取不了驱动。* ~# m3 @. |. \$ H0 ?
然后程序也下载不进去) s* K7 V' D" ^! G" J
下载程序我就知道一种,把.bin文件拖进虚拟U盘
不会其他的方法了
你发的截图是已经读取到驱动的呀,是不是你的代码工程配置有问题?
下载我帖子上的工程,然后连接开发板,直接下载,看看
感谢管理员和各位的支持,本人文笔实在一般,如果有错误的地方,还麻烦各位提出来,多多指导!
把板子连接到电脑上,看能不能读出驱动来
第一次连接板子与电脑 就显示一个 设备 ST-Link Debug $ A% _) t; l- ~9 p& P
安装完驱动之后什么也读不出来
驱动已经安装好了,不能下载代码吗?