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

本文详细介绍了STM32微控制器的GPIO控制及相关的时钟配置知识,包括不同时钟源的作用及其配置方法,并解释了如何通过配置RCC来启动系统时钟。
修正【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系列],

 

ContractedBlock.gif ExpandedBlockStart.gif Code
void SystemInit (void)
{
  RCC
->CR |= (uint32_t)0x00000001;
  RCC
->CFGR &= (uint32_t)0xF8FF0000;
  RCC
->CR &= (uint32_t)0xFEF6FFFF;
  RCC
->CR &= (uint32_t)0xFFFBFFFF;
  RCC
->CFGR &= (uint32_t)0xFF80FFFF;
  RCC
->CIR = 0x009F0000;
  SetSysClock();
}

 

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

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

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

ContractedBlock.gif ExpandedBlockStart.gif Code
typedef struct
{
  __IO uint32_t CR;
  __IO uint32_t CFGR;
  __IO uint32_t CIR;
  __IO uint32_t APB2RSTR;
  __IO uint32_t APB1RSTR;
  __IO uint32_t AHBENR;
  __IO uint32_t APB2ENR;
  __IO uint32_t APB1ENR;
  __IO uint32_t BDCR;
  __IO uint32_t CSR;
} RCC_TypeDef;


 

__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)

具体以后有时间再做分析。







转载于:https://www.cnblogs.com/pingf/archive/2009/08/30/1556694.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值