OpenEdv-开源电子网

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

RCC->CFGR无法设置,求教!

[复制链接]

15

主题

34

帖子

0

精华

初级会员

Rank: 2

积分
169
金钱
169
注册时间
2013-4-12
在线时间
32 小时
发表于 2013-4-12 14:55:49 | 显示全部楼层 |阅读模式

  用配置寄存器编写的流水灯,LED接在G14上。没有设置RCC时钟的时候能够实现LED亮灭。添加了void Stm32_Clock_Init(u8 PLL)这个后灯就不亮了。怀疑是void Stm32_Clock_Init(u8 PLL)函数中的语句有哪一句执行不通过,然后我添加了一句GPIOG->ODR|=1<<14;来判断是哪一句不能执行!最后发现是 RCC->CFGR|=0x00000002; 不执行  求解释


 

#include <stm32f10x_map.h>
#include <stm32f10x_nvic.h>
 
u8  fac_us=0;//us延时倍乘数     
u16 fac_ms=0;//ms延时倍乘数,在ucos下,代表每个节拍的ms数   
//初始化延迟函数
//当使用ucos的时候,此函数会初始化ucos的时钟节拍
//SYSTICK的时钟固定为HCLK时钟的1/8
//SYSCLK:系统时钟
void delay_init(u8 SYSCLK)
{

  SysTick->CTRL&=~(1<<2); //SYSTICK使用外部时钟源 
 fac_us=SYSCLK/8;  //不论是否使用ucos,fac_us都需要使用
 fac_ms=(u16)fac_us*1000;//非ucos下,代表每个ms需要的systick时钟数  
}           


//延时nms
//注意nms的范围
//SysTick->LOAD为24位寄存器,所以,最大延时为:
//nms<=0xffffff*8*1000/SYSCLK
//SYSCLK单位为Hz,nms单位为ms
//对72M条件下,nms<=1864
void delay_ms(u16 nms)
{        
 u32 temp;    
 SysTick->LOAD=(u32)nms*fac_ms;//时间加载(SysTick->LOAD为24bit)
 SysTick->VAL =0x00;           //清空计数器
 SysTick->CTRL=0x01 ;          //Systick使能 开始倒数 
 do
 {
  temp=SysTick->CTRL;
 }
 while((temp&0x01)&&!(temp&(1<<16)));//等待时间到达  
 SysTick->CTRL=0x00;       //关闭计数器
 SysTick->VAL =0X00;       //清空计数器       
}

void Stm32_Clock_Init(u8 PLL)
{
 unsigned char temp=0;  
  RCC->CR|=0x00010000;  //外部高速时钟使能HSEO

//GPIOG->ODR|=1<<14;
 while(!(RCC->CR>>17));//等待外部时钟就绪 
// GPIOG->ODR|=1<<14;

RCC->CFGR=0X00000400; //APB1=DIV2;APB2=DIV1;AHB=DIV1;
//GPIOG->ODR|=1<<14;

PLL-=2;//抵消2个单位
 RCC->CFGR|=PLL<<18;   //设置PLL值 2~16

//GPIOG->ODR|=1<<14;
 RCC->CFGR|=1<<16;   //PLLSRC ON

//GPIOG->ODR|=1<<14;
 RCC->CR|=0x01000000;  //PLLON

//GPIOG->ODR|=1<<14;
 while(!(RCC->CR>>25));//等待PLL锁定

//GPIOG->ODR|=1<<14;
 RCC->CFGR|=0x00000002;//PLL作为系统时钟 
 (发现这一句执行不过去,G14上面的灯不会亮)
 GPIOG->ODR|=1<<14; 

while(temp!=0x02)     //等待PLL作为系统时钟设置成功
 {  
  temp=RCC->CFGR>>2;
  temp&=0x03;
 }


void LED_Init(void)
{
 RCC->APB2ENR|=1<<8;             
 GPIOG->CRH&=0XF0FFFFFF;
 GPIOG->CRH|=0X03000000; 
                      
}


int main(void)
{   LED_Init();     
    Stm32_Clock_Init(9);
    delay_init(72);    //延时初始化 
 
 while(1)
 {   
     
  GPIOG->BSRR=0x4000;   
     delay_ms(500);
  GPIOG->BRR=0x4000;       
  delay_ms(500);
 } 
}


 

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

使用道具 举报

5

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
72
金钱
72
注册时间
2013-3-14
在线时间
0 小时
发表于 2013-4-12 17:43:23 | 显示全部楼层
回复【楼主位】lmlm512:
---------------------------------
你在配置PLL之前加两个flash延时试试。
#define FLASH  ((volatile unsigned long*)(0x40022000))
*FLASH =*FLASH | 0x32;   //FLASH 2个延时周期,
回复 支持 反对

使用道具 举报

15

主题

34

帖子

0

精华

初级会员

Rank: 2

积分
169
金钱
169
注册时间
2013-4-12
在线时间
32 小时
 楼主| 发表于 2013-4-18 13:51:42 | 显示全部楼层
回复【2楼】牵手一生:
---------------------------------
恩 果然解决了
回复 支持 反对

使用道具 举报

6

主题

153

帖子

0

精华

初级会员

Rank: 2

积分
197
金钱
197
注册时间
2013-4-4
在线时间
0 小时
发表于 2013-9-10 15:55:42 | 显示全部楼层
回复【2楼】牵手一生:
---------------------------------
求解释为何是这样呢?加两个FLASH延时就可以?
~~~~ 欢迎讨论,拒绝谩骂 ~~~~
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-9-10 22:28:12 | 显示全部楼层
回复【4楼】兰斯洛:
---------------------------------
STM32F103的FLASH速度不够快!跑不过CPU,所以CPU要等待。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-13 06:59

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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