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

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管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版