我使用的是STM32F030,采用内部时钟(HSI),现想把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公司是怎么得来的? |
安----应该是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;
}
}
我现在也是这个需求,HSE 已经关闭 RCC->CR = 0x03005A83
但是只有PF1能正常控制输出,PF0一直初一低电平状态;而且我用你上面的代码测试也一样;时间久远,不知道楼主能否帮忙解惑
你好,虽然时间比较久,但是 我也遇到了同样的问题。PF0无法控制、PF1可控制,不知道你后来解决了没
怕麻烦的话用STM32cubeMX, 勾选时钟为HSI,再选一下PLL,直接生成代码,很方便的。
对应晶振的引脚就可以按常规的IO设置了。
哦哦,请参考我的帖子
http://www.openedv.com/forum.php ... id=95688&extra=