Pingf的stm32学习笔记之GPIO_Part1[0830]
Pingf的stm32学习笔记之GPIO_Part1
配置完之后[见前面的文章],就可以写个简单的gpio程序了,但是在此之前还要了解一些基本知识。
最起码应该知道stm32的电源与时钟的相关知识,下面就针对此简单絮叨一番。
关于电源部分在此不多叙述,相关的知识应该补充待机模式的切换,pvd的控制等,但目前要实现的是gpio的控制,还是有目的性的看,要不然太多也太繁琐。
下面还是用张图介绍下时钟树,
图中红色部分是主要的几个时钟源,
HSE , HSI , LSE , LSI , PLL [用作倍频之用]
其实从英文就可理解它们的用途,如HSE代表High Speed External.
HSE就不用说了,和传统的51,avr之类的外部晶振一个道理。
HSI 则是内部时钟源,是内部的相对不精准晶振,avr等单片机也有,对晶振要求不严格的场合或者低功率时可以用此。复位时默认用的是此晶振,需通过配置切换到其它晶振。
LSE 是低频率时钟源是供内部RTC用的,和DS1302或HT1380等类似一般都用32.768KHZ的,当然stm32也允许使用内部的clk经过分频后作RTC的clk用。
LSI 是内部低频率晶振为40khz,多作为看门狗的clk用。
PLL 就不用多说了,仅仅是为了倍频用的,想获得72mhz的频率,少了它是不行的。
Arm整了个叫做AMBA的总线,不过对我来说就是一学术名词,具体内部有多复杂暂不知道也不过分关心。一般来说,只要知道AHB[advanced highspeed bus]上是高速的东西【诸如flash,dma什么的】,时钟对应HCLK,其上通过一个所谓的桥【bridge】连接到APB【p对应peripheral 】,其上连接的是一些外设【诸如gpio,串口什么的】,时钟对应PCLK。当然stm32的APB分成了两个,用1和2区分,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 bit2. Reset SW, HPRE, PPRE1, PPRE2, ADCPRE and MCO bits3. Reset HSEON, CSSON and PLLON bits4. Reset HSEBYP bit5. Reset PLLSRC, PLLXTPRE, PLLMUL and USBPRE/OTGFSPRE bits6. Disable all interrupts and clear pending bits7. sysclock的配置第9部需要借助于如下函数【以72MHZ为例】static void SetSysClockTo72(void);具体以后有时间再做分析。