打印
[STM32F0]

HSE 引脚用作GPIO碰到问题

[复制链接]
2461|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
hopewise|  楼主 | 2014-12-17 10:12 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
我使用的是STM32F030,采用内部时钟(HSI),程序运行OK.现想把PF0(OSC-IN)和PF1(OSC-OUT)作为普通IO,把这2个脚设为推挽方式后,没反应
            RCC->AHBENR|=1<<22;                //使能PortF时钟
           GPIOF->MODER   = 0X55555555 ;  //所有的IO设为推挽方式
           GPIOF->OTYPER  = 0X00000000;  
           GPIOF->OSPEEDR = 0X00000000;  
           GPIOF->PUPDR   = 0X00000000;
我看到参考手册如下内容:
"HSE 或LSE 引脚用作GPIO,当HSE或LSE振荡器关断时 ( 复位后的缺省状态) ,相关振荡器引脚可以用做普通的GPIO口。当HSE 或LSE 振荡器开启 ( 在RCC_CSR 寄存器设置HSEON 或LSEON 位来开启) 振荡器控制其相关引脚且相关引脚的GPIO 配置无效。......."
RCC_CSR 寄存器没有HSEON /LSEON 位,不知ST公司是怎么得来的?

沙发
mmuuss586| | 2014-12-17 12:22 | 只看该作者
不是有吗?

使用特权

评论回复
板凳
hopewise|  楼主 | 2014-12-17 14:08 | 只看该作者
应该是ST写错了,应该是RCC_CR,不是RCC_CSR.现我的程序是采用内部晶振HSI,已关闭了外不晶振HSE,那么OSC-IN(PF0)和OSC-OUT(PF1)这2个脚应该可以做为普通IO,但实际上还是不行啊.下面贴出时钟初始化部分:
void Stm32_Clock_Init(void)
{   
           //--------以下是内部HSI---------------
           uint8_t temp=0;
           RCC->AHBENR|=1<<22;                //使能PortF时钟
           RCC->APB1RSTR = 0x00000000;        //复位结束
           RCC->APB2RSTR = 0x00000000;
           RCC->APB2ENR = 0x00000000;         //外设时钟关闭.                  
           RCC->APB1ENR = 0x00000000;
       
           RCC->CR |= 1<<18;                  //禁用外部HSE
           RCC->CR |= 0x00000001;             //使能内部高速时钟HSION         
           while((RCC->CR&(1<<1))!=(1<<1));   //等待HSIRDY位变为1
           RCC->CFGR|=1<<16;                       //PLLSRC ON (此位一定要在关闭PLL后才能设置)
           RCC->CFGR=0X00000000;              //APB1=DIV1;APB2=DIV1;AHB=DIV1
           RCC->CFGR|=1<<21;                  //12倍频
           RCC->CFGR|=1<<19;         
           RCC->CR|=1<<24;                    //PLLON
           while((RCC->CR&(1<<25))!=(1<<25)); //等待PLL锁定
           RCC->CFGR|=0x00000002;             //PLL作为系统时钟         
           while(temp!=0x02)                  //等待PLL作为系统时钟设置成功
           {   
                      temp=RCC->CFGR>>2;
                      temp&=0x03;
           }
}

使用特权

评论回复
地板
泰山特曲123| | 2014-12-17 18:35 | 只看该作者
把手册中gpio的那一章也看完它,估计有意外收获。

使用特权

评论回复
5
搞IT的| | 2014-12-17 18:37 | 只看该作者
我觉得st没有写错啊,

使用特权

评论回复
6
hopewise|  楼主 | 2014-12-17 21:04 | 只看该作者
搞定了。

使用特权

评论回复
7
czt520523| | 2015-1-8 19:24 | 只看该作者
hopewise 发表于 2014-12-17 21:04
搞定了。

请问是怎么解决的,我也碰到这个问题,可以指导哈吗?

使用特权

评论回复
8
bear1| | 2015-1-8 22:11 | 只看该作者
czt520523 发表于 2015-1-8 19:24
请问是怎么解决的,我也碰到这个问题,可以指导哈吗?

同问

使用特权

评论回复
9
hopewise|  楼主 | 2015-1-9 08:15 | 只看该作者
是HSEON位和HSION位同时为1,想办法把HSEON位清零就OK了

使用特权

评论回复
10
czt520523| | 2015-1-9 19:59 | 只看该作者
hopewise 发表于 2015-1-9 08:15
是HSEON位和HSION位同时为1,想办法把HSEON位清零就OK了

您好,可以把代码贴给我看哈吗

使用特权

评论回复
11
hopewise|  楼主 | 2015-1-10 08:04 | 只看该作者
                 uint8_t temp=0;
                //--------以下是内部HSI---------------
                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;            //关闭所有中断
       
                 RCC->CR  |= 0x00000001;            //使能内部高速时钟HSION         
                 while((RCC->CR&(1<<1))!=(1<<1));   //等待HSIRDY位变为1
                 
                 RCC->CFGR=0X00000000;              //APB1=DIV1;APB2=DIV1;AHB=DIV1
                 RCC->CFGR|=1<<21;                  //12倍频
                 RCC->CFGR|=1<<19;
                 
                 RCC->CR|=1<<24;                    //PLLON
                 while(!(RCC->CR>>25));             //等待PLL锁定
                 RCC->CFGR|=0x00000002;             //PLL作为系统时钟         
                 while(temp!=0x02)                  //等待PLL作为系统时钟设置成功
                {   
                      temp=RCC->CFGR>>2;
                      temp&=0x03;
                }
                 
                 RCC->AHBENR|=1<<22;                //使能PortF时钟
                 GPIOF->MODER   = 0X55555555 ;  
                 GPIOF->OTYPER  = 0X00000000;  
                 GPIOF->OSPEEDR = 0X00000000;  
                 GPIOF->PUPDR   = 0X00000000;
                 GPIOF->BSRR|=3;

使用特权

评论回复
12
automationboy| | 2015-5-30 09:52 | 只看该作者
楼上的代码,使用后,只有PF0可以,PF1一直为高是为何?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

46

主题

468

帖子

3

粉丝