你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32F030K6外部晶振不工作,查不出原因

[复制链接]
huangjiayin 提问时间:2014-11-13 14:53 /
void Stm32_Clock_Init(uint8_t PLL)
{
            uint8_t temp=0;   
            MYRCC_DeInit();                     复位并配置向量表
              RCC->CR|=0x00010000;              选用外部晶振
            while(!(RCC->CR &=0X00020000));     等待外部时钟就绪
            RCC->CFGR=0X00000400;            
            PLL-=2;                        
            RCC->CFGR|=PLL<<18;                 倍频到48MHZ        
            RCC->CFGR|=1<<16;                   PLLSRC ON
            FLASH->ACR|=0x32;                     
            RCC->CR|=0x01000000;                PLLON(Bit24)   
            while(!(RCC->CR &=0X02000000));     等待 PLLPLLPLL锁
            RCC->CFGR|=0x00000002;              PLL作为系统时钟
            while(temp!=0x02)                   等待 PLLPLLPLL作为系统时钟设置成功
            {   
                       temp=RCC->CFGR>>2;         
                       temp&=0x03;                 
            }                 
           RCC->APB2ENR|=1<<0;                   使能SYSCFG时钟
                           
}

收藏 评论25 发布时间:2014-11-13 14:53

举报

25个回答
huangjiayin 回答时间:2014-11-14 17:58:18
现跳到while(!(RCC->CR>>17)); 这条指令就不往下走了。

void Stm32_Clock_Init(uint8_t PLL)  
{   
            uint8_t temp=0;     
            MYRCC_DeInit();                               复位并配置向量表  
             RCC->CR|=0x00010000;                   选用外部晶振  
            while(!(RCC->CR>>17));                   等待外部时钟就绪  
            RCC->CFGR=0X00000400;              
            PLL-=2;                          
            RCC->CFGR|=PLL<<18;                     倍频到48MHZ         
            RCC->CFGR|=1<<16;                        PLLSRC ON  
            FLASH->ACR|=0x32;                        
            RCC->CR|=0x01000000;                     PLLON(Bit24)     
            while(!(RCC->CR &=0X02000000));     等待 PLLPLLPLL锁  
            RCC->CFGR|=0x00000002;                 PLL作为系统时钟  
            while(temp!=0x02)                            等待 PLLPLLPLL作为系统时钟设置成功   
            {     
                       temp=RCC->CFGR>>2;            
                       temp&=0x03;                  
            }                  
           RCC->APB2ENR|=1<<0;                   使能SYSCFG时钟  
                              
}
huangjiayin 回答时间:2014-11-14 17:54:56
现重贴MYRCC_DeInit函数,我把配置向量表屏蔽了,见下
void MYRCC_DeInit(void)
{       
        RCC->APB1RSTR = 0x00000000;//复位结束                         
        RCC->APB2RSTR = 0x00000000;
          
          RCC->AHBENR = 0x00000014;  //睡眠模式闪存和SRAM时钟使能.其他关闭.          
          RCC->APB2ENR = 0x00000000; //外设时钟关闭.                          
          RCC->APB1ENR = 0x00000000;   
        RCC->CR |= 0x00000001;     //使能内部高速时钟HSION                                                                                                                                  
        RCC->CFGR &= 0xF8FF0000;   //复位SW[1:0],HPRE[3:0],PPRE1[2:0],PPRE2[2:0],ADCPRE[1:0],MCO[2:0]                                         
        RCC->CR &= 0xFEF6FFFF;     //复位HSEON,CSSON,PLLON
        RCC->CR &= 0xFFFBFFFF;     //复位HSEBYP                     
        RCC->CFGR &= 0xFF80FFFF;   //复位PLLSRC, PLLXTPRE, PLLMUL[3:0] and USBPRE
        RCC->CIR = 0x00000000;     //关闭所有中断                 
        //配置向量表       
/*                          
#ifdef  VECT_TAB_RAM
        MY_NVIC_SetVectorTable(0x20000000, 0x0);
#else   
        MY_NVIC_SetVectorTable(0x08000000,0x0);
#endif*/
}

huangjiayin 回答时间:2014-11-19 17:24:10
多谢各位,是软件问题,下面是我从网上找来的,现系统正常了,没有用到原子的void Stm32_Clock_Init(uint8_t PLL)函数,而用到下面的:
     while((RCC->CR&(1<<1))<=1)       //HSIRDY: HSI clock ready flag
      {
           RCC->CR|= 0X00000001;       //Bit 0 HSION: HSI clock enable
      }
      while((RCC->CR&(1<<25))<=1)
      {
           RCC->CR |=0<<24;
      }
      while((RCC->CR&(1<<25))!=(1<<25))
      {
          //学入改变PLL CF的程序
          RCC->CFGR|=0X0028059A;          // 0000 0000  0010 1000     0000 0101  1001 1010  
          RCC->CR |=1<<24;
      }
      //Bits 16:15 PLLSRC[1:0]: PLL input clock source   11: HSI48/PREDIV selected as PLL input clock
      RCC -> APB2RSTR|=0X00000001;
      RCC -> AHBENR |= 0x00080000;//Bit 19 IOPCEN: I/O port C clock enable
      //Bit 19 IOPCRST: I/O port C reset}^
xulay 回答时间:2014-11-13 15:04:35
死在这里了?:
while(!(RCC->CR &=0X00020000));  
mtg 回答时间:2014-11-13 15:06:09
会不会是因为和板子的原因啊,你换块板子测试一下呢
那片清茶 回答时间:2014-11-13 15:38:00
死在哪里,把问题描述清楚,不然别人怎么回答你的问题。
huangjiayin 回答时间:2014-11-13 15:40:38
多谢3位的回答,我是操作寄存器的。现逻辑分析仪测出OSC-IN和OSC-OUT没波形,电压为零
huangjiayin 回答时间:2014-11-13 15:44:06
烧写程序成功,用J-LINK仿真器设置断点,连第1条指令不执行,这进一步说明晶振没起振了
huangjiayin 回答时间:2014-11-13 15:47:10
我初学STM32,看700多页参考手册头都大了.
huangjiayin 回答时间:2014-11-13 16:08:16
xulay:这句是while(!(RCC->CR &=0X00020000));  是对的,判断HSE 振荡器就绪.我改成原子的while(!(RCC->CR>>17));结过还是一样
说不定 回答时间:2014-11-13 16:17:32
晶振没波形是硬件问题  你去检查晶振电路 电容什么的
huangjiayin 回答时间:2014-11-13 16:28:12
外部晶振是8MHZ,那2个起振电容是22PF
huangjiayin 回答时间:2014-11-13 17:45:19
换了另一块板,测试结过还是一样,是不是哪里设置出了问题?
duanks 回答时间:2014-11-13 18:21:38
为何非要用寄存器,改库函数试试,不行就换晶振,以前焊电路板时就把晶振烫坏过一次
Veiko 回答时间:2014-11-13 21:18:37
huangjiayin 发表于 2014-11-13 15:40
多谢3位的回答,我是操作寄存器的。现逻辑分析仪测出OSC-IN和OSC-OUT没波形,电压为零 ...

仔细阅读一下时钟部份的资料,看看有没有什么关键配置没有打开,同时更换晶振和起振电容(一般除了容值相差很大的情况才会不起振),检测电路连接
Veiko 回答时间:2014-11-13 21:20:34
huangjiayin 发表于 2014-11-13 15:44
烧写程序成功,用J-LINK仿真器设置断点,连第1条指令不执行,这进一步说明晶振没起振了
...

这种情况有可能是工程(软件部份,IDE处理时的问题)复制代码重新建立一个工程试,我遇到过这种情况,但比较少一般,我在使用5.12版本做STM32F103时遇到过仿真不动的情况
arm8686 回答时间:2014-11-14 11:39:53
huangjiayin 发表于 2014-11-13 15:40
多谢3位的回答,我是操作寄存器的。现逻辑分析仪测出OSC-IN和OSC-OUT没波形,电压为零 ...

我觉得还是使用示波器看吧。逻辑分析仪未必能够看到峰峰值较小的正弦波。
12下一页

所属标签

相似问题

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版