Pingf的stm32学习笔记之GPIO_Part1[0830]

修正【20090913 14:43】
Pingf的stm32学习笔记之GPIO_Part1

配置完之后[见前面的文章],就可以写个简单的gpio程序了,但是在此之前还要了解一些基本知识。

最起码应该知道stm32的电源与时钟的相关知识,下面就针对此简单絮叨一番。
关于电源部分在此不多叙述,相关的知识应该补充待机模式的切换,pvd的控制等,但目前要实现的是gpio的控制,还是有目的性的看,要不然太多也太繁琐。


下面还是用张图介绍下时钟树,


 

图中红色部分是主要的几个时钟源,

HSE , HSI , LSE , LSI , PLL [用作倍频之用]

其实从英文就可理解它们的用途,如HSE代表High Speed External.

 

HSE就不用说了,和传统的51avr之类的外部晶振一个道理。

HSI 则是内部时钟源,是内部的相对不精准晶振,avr等单片机也有,对晶振要求不严格的场合或者低功率时可以用此。复位时默认用的是此晶振,需通过配置切换到其它晶振。

LSE 是低频率时钟源是供内部RTC用的,和DS1302HT1380等类似一般都用32.768KHZ的,当然stm32也允许使用内部的clk经过分频后作RTCclk用。

LSI 是内部低频率晶振为40khz,多作为看门狗的clk用。

PLL 就不用多说了,仅仅是为了倍频用的,想获得72mhz的频率,少了它是不行的。

 

Arm整了个叫做AMBA的总线,不过对我来说就是一学术名词,具体内部有多复杂暂不知道也不过分关心。一般来说,只要知道AHB[advanced highspeed bus]上是高速的东西【诸如flashdma什么的】,时钟对应HCLK,其上通过一个所谓的桥【bridge】连接到APBp对应peripheral  ,其上连接的是一些外设【诸如gpio,串口什么的】,时钟对应PCLK。当然stm32APB分成了两个,用12区分,GPIO挂在了APB2上了。

 

在知道了上面的知识知识之后就不难明白为啥stm32程序开始都要有个RCC_Configuration的函数了,其实里面就是要对RCC进行一番配置。


 

我们可以很简单的实现这一函数

void RCC_Configuration(void)
{  
 SystemInit();
}

SystemInit是一个库函数,下面将其展开具体研究下[针对103系列],

 

Code

 

关于a&=… a|=…这样的赋值操作我就不说啥了,

里面RCC->CR这样的使用还是比较有意思的

RCC是一个指针型,其类型是RCC_TypeDef类型的,对于103的器件其具体如下

Code


 

__IO 就是volatile ,而后面那个uint32_t就是告诉要占32位的长度
这样RCC指向的其实就是RCC相关寄存器的基地址,然后通过->便可取到相应的寄存器。
下面简要说明下配置步骤【103系列】
1 Set HSION bit 
2. Reset SW, HPRE, PPRE1, PPRE2, ADCPRE and MCO bits
3. Reset HSEON, CSSON and PLLON bits 
4. Reset HSEBYP bit 
5. Reset PLLSRC, PLLXTPRE, PLLMUL and USBPRE/OTGFSPRE bits 
6. Disable all interrupts and clear pending bits 
7. sysclock的配置
9部需要借助于如下函数【以72MHZ为例】
static void SetSysClockTo72(void)
具体以后有时间再做分析。







posted @ 2009-08-30 15:41  平繁  阅读(2938)  评论(0编辑  收藏  举报