OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 15498|回复: 4

系统时钟HSI转到HSE,请教

[复制链接]

3

主题

6

帖子

0

精华

新手上路

积分
38
金钱
38
注册时间
2011-8-4
在线时间
0 小时
发表于 2011-8-17 23:08:29 | 显示全部楼层 |阅读模式
#include "stm32f10x_lib.h"

//采用HSI作为驱动时钟源

void HSI_SYSTEM_CLOCK( void )
{
 //开启HSI,关闭HSE,CSS
   RCC->CR = 0x00000000;//RCC_CR 初始化 ,有点多余,初始化就是0x83
   RCC->CFGR = 0X00000000;//RCC_CFGR 初始化
   RCC->CR |= 0X01;//开启HSION
   while(RCC->CR&(u32)(1<<2));//相当于RCC_CR的HSIRDY = 1时跳出。(u32)1<<2 = 0...0000 0010;
 //****PLLSRC配置要在PLLON之前配置******
   RCC->CFGR &= 0<<16;//PLLSRC = 0 HSI/2 作为PLL输入时钟源
//****刻意的写这个配置成0 主要是位了体现配置过程。
   RCC->CR |= 1<<24;//PLLON =1 
   while(RCC->CR & (u32)(1<<25));//等待PLLRDY = 1;

   //配置PLL。9倍频,4*9=26Mhz。注意:PLLSRC必须在PLL关闭的情况下才能配置
   //由于我们配置的是HSI/2 就是0 初始化就是0 所以这里没有改变,此程序存在风险
   //RCC->CFGR |= (u32)(0x07<<18);//PLLMUL = 0111 ;9倍频
   RCC->CFGR |= 1<<18;//3倍频 
   RCC->CFGR |= 1<<1;//SW[1:0] 10 PLL 作为系统时钟


}

void HSE_SYSTEM_CLOCK(void)
{
//开启HSE,关闭HSI,CSS
   RCC->CR = 0x00000000;//RCC_CR 初始化 
   RCC->CR |= 1<<16;//开启HSEON
   while(RCC->CR&(u32)(1<<17));//相当于RCC_CR的HSERDY = 1时跳出。(u32)1<<17 = 0...0000 0010.....;
   RCC->CFGR &=~(u32)(1<<17);
   RCC->CFGR |=1<<16;//PLLXTPRE = 0;PLLSRC = 1;HSE 作为PLL输入时钟源
   RCC->CR |= 1<<24;//PLLON =1 
   while(RCC->CR & (u32)(1<<25));//等待PLLRDY = 1;
   //配置PLL。9倍频,4*9=26Mhz。注意:PLLSRC必须在PLL关闭的情况下才能配置
   //由于我们配置的是HSI/2 就是0 初始化就是0 所以这里没有改变,此程序存在风险
   RCC->CFGR |= (u32)(0x07<<18);//PLLMUL = 0111 ;9倍频
   RCC->CFGR |= 1<<1;//SW[1:0] 10 PLL 作为系统时钟
}
void LED_INIT(void)
{
   RCC->APB2ENR = 0X00000000;
   RCC->APB2ENR |= (1<<2)|(1<<5);//开启GPIOA,GPIOD设备时钟
   //先配置PA8是输出模式 ,输出时一定要注意端口速率问题
   GPIOA->CRH = 0x00000000;
   GPIOA->CRH = 0x00000002;//输出模式,最大速度2Mhz 推免输出
 
  //配置PD2是输出模式 ,输出时一定要注意端口速率问题
   GPIOD->CRL = 0x00000000;
   GPIOD->CRL = 0x00000200;//输出模式,最大速度2Mhz 推免输出
}

void delay(u32 time)//不晓得是多长时间啊
{
int i ,j;
for(i=0;i<10000;++i)
for(j=0;j<time;++j);
}
//HSI ->HSE ->LL
void SYSTEM_CLOCK_CHANGE(void)
{
//时钟改变的时候要注意关闭PLL,即PLLON=0;
RCC->CR &=~(u32)(1<<16);//PLLON = 0;

}
int main (void)
{
u8 flag=0;
u32 m=0;
   HSI_SYSTEM_CLOCK();
   LED_INIT();
   while(1)
   {
   //LED0 闪烁 HSI时钟
   if(flag == 0)
   {
GPIOA->BSRR |= 1<<8;//PA8 = 1;
delay(10);
GPIOA->BSRR |=(1<<(8+16));
delay(10);
m++;
if(m==100){ flag = 1;m = 0;}//LED灯闪烁一百次
}
  //改变时钟,主要是进行了重新配置
if(flag == 1)
{
SYSTEM_CLOCK_CHANGE();
HSE_SYSTEM_CLOCK();
flag = 2;
}
//HSE时钟运行
   if(flag == 2)
{
  GPIOA->BSRR |= 1<<8;//PA8 = 1;
  delay(10);
  GPIOA->BSRR |=(1<<(8+16));
  delay(10);
  m++;
  if(m==100)    while(1);//led灯闪烁100次结束  
}
   }
}


我程序中开始使用的是HSI内部时钟,PLL倍频后时钟速度比使用HSE时钟频率低,但是转化后,发现开发板上得LED灯的闪烁频率没有改变,求教。我的思想是在程序中开始配置HSI一个程序,之后配置HSE,两个配置是独立的,各自作为时钟控制都可以工作。之后改变时钟的时候,利用了关闭PLLON,之后再重新配置,不是很明白为什么看到的现象LED灯闪烁频率不变,?或者哪位有更好地方法,还希望指教。


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165352
金钱
165352
注册时间
2010-12-1
在线时间
2108 小时
发表于 2011-8-18 00:58:58 | 显示全部楼层
软件仿真一下,看看寄存器是否正确?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

19

主题

121

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
218
金钱
218
注册时间
2011-8-8
在线时间
0 小时
发表于 2011-8-18 20:52:44 | 显示全部楼层
//这一句少个叹号吧
while(RCC->CR&(u32)(1<<2));//相当于RCC_CR的HSIRDY = 1时跳出。(u32)1<<2 = 0...0000 0010;

//这句也少个叹号吧
while(RCC->CR & (u32)(1<<25));//等待PLLRDY = 1;

//说的是PLL开启后配置就不能变了,你看你怎么设的

   RCC->CR |= 1<<24;//PLLON =1 // !!!!!!!!!!!!!!!!!PLL开启了
   while(RCC->CR & (u32)(1<<25));//等待PLLRDY = 1;

   //配置PLL。9倍频,4*9=26Mhz。注意:PLLSRC必须在PLL关闭的情况下才能配置
   //由于我们配置的是HSI/2 就是0 初始化就是0 所以这里没有改变,此程序存在风险
   //RCC->CFGR |= (u32)(0x07<<18);//PLLMUL = 0111 ;9倍频
   RCC->CFGR |= 1<<18;//3倍频//!!!!!!!!!!!!!!!!这里和之后的的配置是无效的



外部时钟存在相同的多处错误

世界上有10种人,一种是懂二进制的,另一种是不懂二进制的。。。
回复 支持 反对

使用道具 举报

19

主题

121

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
218
金钱
218
注册时间
2011-8-8
在线时间
0 小时
发表于 2011-8-18 20:54:37 | 显示全部楼层
经鉴定,你的程序一直跑在8M的系统时钟下,所以频率是一样的。
世界上有10种人,一种是懂二进制的,另一种是不懂二进制的。。。
回复 支持 反对

使用道具 举报

3

主题

6

帖子

0

精华

新手上路

积分
38
金钱
38
注册时间
2011-8-4
在线时间
0 小时
 楼主| 发表于 2011-8-19 22:07:42 | 显示全部楼层
回复【3楼】sixear:
---------------------------------
谢谢指点啊,我仔细看了手册,明白了。程序配置自己还是不小心,分析的不是很到位。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-24 20:27

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表