原创 STM32F103的复位及时钟控制模块头文件

2008-7-29 14:24 6674 10 10 分类: MCU/ 嵌入式

    在处理器正常工作前,肯定要做一些初始化工作,其中最主要的一个就是初始化各种时钟。圈圈通过对STM32F103的复位及时钟控制(RCC)模块分析之后,自己写了一个RCC的头文件,这样使用起来更方便。头文件中首先定义了最基本的几个寄存器,然后再对每个寄存器中的域使用结构体做了定义,可以直接使用寄存器中的位来操作。注意设置系统时钟时要先设置好FLASH的等待周期,不然程序就可能会跑飞,参看http://blog.ednchina.com/computer00/140713/message.aspx


    该测试工程是在以前的GPIO实验的基础上增加系统时钟初始化代码,设置系统时钟为72M。通过流水灯可以看到,比未配置系统时钟之前(8M)流水灯的速度快了很多。从这里下载完整的测试工程:点击下载


系统时钟初始化的代码如下:


//以下时钟配置为最高性能
void SystemClockInit(void)
{
 //设置flash等待周期为2,否则设置为72M系统时钟时就会跑飞
 FLASH_ACR=0x32; 
 
 pbRCC_CR->HSEON=1;          //使能外部高速时钟
 while(!(pbRCC_CR->HSERDY)); //等待外部高速时钟稳定
 pbRCC_CFGR->MCO=0;          //MCO无时钟输出
 pbRCC_CFGR->USBPRE=1;       //USB时钟1.5分频
 pbRCC_CFGR->PLLMUL=9-2;     //PLL倍频设置为9倍(外部时钟8M,PLL输出72M)
 pbRCC_CFGR->PLLXTPRE=0;     //HSE不分频
 pbRCC_CFGR->PLLSRC=1;       //HSE选作做为PLL时钟源输入
 pbRCC_CFGR->ADCPRE=0;       //ADC时钟2分频
 pbRCC_CFGR->PPRE2=1+6;      //APB2设置为1分频
 pbRCC_CFGR->PPRE1=2+6;      //APB1设置为2分频
 pbRCC_CFGR->HPRE=0;         //AHB无分频
 pbRCC_CR->PLLON=1;          //启动PLL
 while(!(pbRCC_CR->PLLRDY)); //等待PLL稳定
 pbRCC_CFGR->SW=2;           //选择PLL输出为时钟源
 //pbRCC_AHBENR->SRAMEN=1;
 //pbRCC_AHBENR->FLITFEN=1;
 
 //IO口第二功能时钟使能
 pbRCC_APB2ENR->AFIOEN=1;
 
 //各通用IO口时钟使能
 pbRCC_APB2ENR->IOPAEN=1;
 pbRCC_APB2ENR->IOPBEN=1;
 pbRCC_APB2ENR->IOPCEN=1;
 pbRCC_APB2ENR->IOPDEN=1;
 pbRCC_APB2ENR->IOPEEN=1;
 
 //ADC时钟使能
 pbRCC_APB2ENR->ADC1EN=1;
 pbRCC_APB2ENR->ADC2EN=1;
 
 //定时器1时钟使能
 pbRCC_APB2ENR->TIM1EN=1;
 
 //SPI1时钟使能
 pbRCC_APB2ENR->SPI1EN=1;
 
 //串口1时钟使能
 pbRCC_APB2ENR->USART1EN=1;
 
 //定时器2、3、4时钟使能
 pbRCC_APB1ENR->TIM2EN=1;
 pbRCC_APB1ENR->TIM3EN=1;
 pbRCC_APB1ENR->TIM4EN=1;
 
 //窗口看门狗时钟不使能
 pbRCC_APB1ENR->WWDGEN=0;


 //SPI2时钟使能
 pbRCC_APB1ENR->SPI2EN=1;


 //串口2、3时钟使能
 pbRCC_APB1ENR->USART2EN=1;
 pbRCC_APB1ENR->USART3EN=1;
 
 //I2C1、2时钟使能
 pbRCC_APB1ENR->I2C1EN=1;
 pbRCC_APB1ENR->I2C2EN=1;
 
 //USB时钟使能
 pbRCC_APB1ENR->USBEN=1;


 //CAN时钟使能
 pbRCC_APB1ENR->CANEN=1;
 
 //备份接口时钟使能
 pbRCC_APB1ENR->BKPEN=1;
 
 //电源接口时钟使能
 pbRCC_APB1ENR->PWREN=1;
 
 //外部低速时钟启动
 pbRCC_BDCR->LSEON=1;
 pbRCC_BDCR->LSEBYP=0;
 pbRCC_BDCR->RTCSEL=1; //选择外部时钟为RTC时钟
}

PARTNER CONTENT

文章评论2条评论)

登录后参与讨论

用户1099353 2008-7-30 15:42

学习了

computer00 2008-7-30 00:40

晕……不知咋的眼晕,将两个APB分频寄存器看成了4位,搞错了... pbRCC_CFGR->PPRE2=1+6; //APB2设置为1分频 pbRCC_CFGR->PPRE1=2+6; //APB1设置为2分频 这两个语句应该改为 pbRCC_CFGR->PPRE2=1+2; //APB2设置为1分频 pbRCC_CFGR->PPRE1=2+2; //APB1设置为2分频

用户89532 2008-3-5 10:39

顶顶
相关推荐阅读
computer00 2013-06-05 16:27
[招聘]Android系统开发工程师
任职要求: 1. 扎实的C/C++基础,熟悉嵌入式Linux和Android操作系统的软件开发; 2. 良好的沟通能力和逻辑思维能力; 3. 良好的英文文献阅读能力; 4. 具备...
computer00 2013-06-04 09:26
[招聘]Android应用开发工程师
任职要求: 1. 具备扎实的面向对象编程思想和JAVA编程基础; 2. 熟悉Eclipse+ADT开发环境,熟练掌握Android基本类库; 3. 熟悉网络应用和多媒体应用开发; ...
computer00 2012-09-26 13:15
圈圈的新浪官方围脖
http://weibo.com/computer00  ...
computer00 2012-09-26 13:12
欢迎大家去收听圈圈弹的曲子
http://www.tudou.com/home/_105209016  ...
computer00 2009-06-29 15:07
《圈圈教你玩USB》勘误(更新日期2009 年06月29日)
《圈圈教你玩USB》勘误(更新日期2009 年06月29日)下载地址1:下载地址2: 勘误.pdf...
computer00 2009-06-25 11:23
一块磐正845GE主板PS2接口的修复
圈圈有一部台式机,某天开机时,发现键盘用不了了,停留在输入BIOS密码那里。主机自检通过,但是蜂鸣器却发出很微弱的、连续的声音,同时键盘的三个LED也没有出现象往常一样的闪烁一下。圈圈以为多日未用,积...
EE直播间
更多
我要评论
2
10
关闭 站长推荐上一条 /1 下一条