OpenEdv-开源电子网

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

关于stm32f031 PF0及PF1 设置为普通IO口不可控制问题

[复制链接]

5

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
176
金钱
176
注册时间
2016-7-19
在线时间
26 小时
发表于 2018-1-11 21:49:00 | 显示全部楼层 |阅读模式
5金钱
stm32f031 PF0及PF1 脚为外部低速时钟脚,由于引脚限制 现在要用这两个脚,但是按照普通IO口配置后不受控制。求解,在线等,,,,,

最佳答案

查看完整内容[请看2#楼]

以解决 外部上拉电阻焊成40几欧 没办法
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

5

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
176
金钱
176
注册时间
2016-7-19
在线时间
26 小时
 楼主| 发表于 2018-1-11 21:49:01 | 显示全部楼层

以解决 外部上拉电阻焊成40几欧  没办法  
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165516
金钱
165516
注册时间
2010-12-1
在线时间
2116 小时
发表于 2018-1-12 00:31:54 | 显示全部楼层
看看参考手册怎么说的吧,这种特殊的脚用起来一般都会有说明的
回复

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2018-1-12 09:26:23 | 显示全部楼层
关闭HSE,然后走IO配置流程,否则没用,我试过070的PF0和PF1(默认是OSC的管脚),死活控制不了,仔细一想,是不是OSC功能没关闭造成的(使用的是内部HSI),启动初始化时钟的时候,切换到HSI初始化时没有关闭HSE,增加了关闭HSE就没事了RCC->CR &= ~((uint32_t)RCC_CR_HSEON);  /* Disable HSE */
回复

使用道具 举报

5

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
176
金钱
176
注册时间
2016-7-19
在线时间
26 小时
 楼主| 发表于 2018-1-12 09:44:28 | 显示全部楼层
八度空间 发表于 2018-1-12 09:26
关闭HSE,然后走IO配置流程,否则没用,我试过070的PF0和PF1(默认是OSC的管脚),死活控制不了,仔细一想 ...

谢谢你的回答。我按照你方式做了。PF1单独能够拉低了 ,但是拉低PF0的时候PF1电压也被拉低了,PF0在2V左右、PF1在1V左右 。是我上拉电阻不够大吗
回复

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2018-1-12 12:29:29 | 显示全部楼层
须弥指间 发表于 2018-1-12 09:44
谢谢你的回答。我按照你方式做了。PF1单独能够拉低了 ,但是拉低PF0的时候PF1电压也被拉低了,PF0在2V左 ...

贴你的初始化代码看下
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复

使用道具 举报

5

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
176
金钱
176
注册时间
2016-7-19
在线时间
26 小时
 楼主| 发表于 2018-1-12 13:18:47 | 显示全部楼层
八度空间 发表于 2018-1-12 12:29
贴你的初始化代码看下

[mw_shl_code=c,true]时钟初始化部分修改为 HSI
static void SetSysClock(void)
{
  __IO uint32_t StartUpCounter = 0, HSEStatus = 0;

/******************************************************************************/
/*            PLL (clocked by HSE) used as System clock source                */
/******************************************************************************/
    RCC->CR &= ~((uint32_t)RCC_CR_HSEON);  /* Disable HSE */
  /* SYSCLK, HCLK, PCLK configuration ----------------------------------------*/
  /* Enable HSE */   
  RCC->CR |= ((uint32_t)RCC_CR_HSION);

  /* Wait till HSE is ready and if Time out is reached exit */
  do
  {
    HSEStatus = RCC->CR & RCC_CR_HSIRDY;
    StartUpCounter++;  
  } while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT));

  if ((RCC->CR & RCC_CR_HSIRDY) != RESET)
  {
    HSEStatus = (uint32_t)0x01;
  }
  else
  {
    HSEStatus = (uint32_t)0x00;
  }  

  if (HSEStatus == (uint32_t)0x01)
  {
    /* Enable Prefetch Buffer and set Flash Latency */
    FLASH->ACR = FLASH_ACR_PRFTBE | FLASH_ACR_LATENCY;

    /* HCLK = SYSCLK */
    RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1;
      
    /* PCLK = HCLK */
    RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE_DIV1;

    /* PLL configuration */
    RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLMULL));
    RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_PREDIV1 | RCC_CFGR_PLLXTPRE_PREDIV1 | RCC_CFGR_PLLMULL6);
            
    /* Enable PLL */
    RCC->CR |= RCC_CR_PLLON;

    /* Wait till PLL is ready */
    while((RCC->CR & RCC_CR_PLLRDY) == 0)
    {
    }

    /* Select PLL as system clock source */
    RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW));
    RCC->CFGR |= (uint32_t)RCC_CFGR_SW_PLL;   

    /* Wait till PLL is used as system clock source */
    while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS) != (uint32_t)RCC_CFGR_SWS_PLL)
    {
    }
  }
  else
  { /* If HSE fails to start-up, the application will have wrong clock
         configuration. User can add here some code to deal with this error */
  }  
}

GPIO初始化部分
void IIC_Init(void)
{                                             
    GPIO_InitTypeDef GPIO_InitStructure;
        
    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOF, ENABLE);       
          
    GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_0|GPIO_Pin_1;
    GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_OUT;
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
   
    GPIO_Init(GPIOF, &GPIO_InitStructure);
   
    //GPIO_ResetBits(GPIOF,GPIO_Pin_0|GPIO_Pin_1);
    GPIO_ResetBits(GPIOF,GPIO_Pin_0);
    //GPIO_ResetBits(GPIOF,GPIO_Pin_1);
}[/mw_shl_code]
回复

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2018-1-12 13:40:31 | 显示全部楼层
须弥指间 发表于 2018-1-12 13:18
[mw_shl_code=c,true]时钟初始化部分修改为 HSI
static void SetSysClock(void)
{

PuPd寄存器你都没初始化,默认是浮空的
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复

使用道具 举报

5

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
176
金钱
176
注册时间
2016-7-19
在线时间
26 小时
 楼主| 发表于 2018-1-12 15:13:46 | 显示全部楼层
八度空间 发表于 2018-1-12 13:40
PuPd寄存器你都没初始化,默认是浮空的

有外部上拉,所以没设。设置后PF0仍然不可拉低,PF1正常,一个脚可控一个脚不可控,
回复

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2018-1-14 19:12:07 | 显示全部楼层
须弥指间 发表于 2018-1-12 15:13
有外部上拉,所以没设。设置后PF0仍然不可拉低,PF1正常,一个脚可控一个脚不可控,

我两个都可以控制
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复

使用道具 举报

1

主题

10

帖子

0

精华

初级会员

Rank: 2

积分
104
金钱
104
注册时间
2017-1-17
在线时间
8 小时
发表于 2018-3-6 20:47:25 | 显示全部楼层
外部上拉电阻焊成40几欧?
回复

使用道具 举报

0

主题

5

帖子

0

精华

新手上路

积分
39
金钱
39
注册时间
2016-11-28
在线时间
6 小时
发表于 2021-7-6 11:34:34 | 显示全部楼层
STM32F0使用内部时钟,PF1做普通IO口的时钟设置
static void SetSysClock(void)
{
        __IO uint32_t StartUpCounter = 0, HSIStatus = 0;

        RCC->CR &= ~((uint32_t)RCC_CR_HSEON);                                     //关闭外部时钟
        RCC->CR |= ((uint32_t)RCC_CR_HSION);                                      //使能内部时钟 HSI
        do                                                                        //等待内部时钟起振
        {
                HSIStatus = RCC->CR & RCC_CR_HSIRDY;                                    // 设置RCC
                StartUpCounter++;                                                                    //启动计数器
        }
        while((HSIStatus== 0) && (StartUpCounter != HSI_STARTUP_TIMEOUT));                          // 等待 HSE 启动稳定

        if((RCC->CR & RCC_CR_HSIRDY) != RESET)                                           //判断启动状态
        {
                HSIStatus = (uint32_t)0x01;
        }
        else
        {
                HSIStatus = (uint32_t)0x00;                                              //启动不成功
        }

        if(HSIStatus == (uint32_t)0x01) //启动成功
        {
                /* Enable Prefetch Buffer and set Flash Latency */
                FLASH->ACR = FLASH_ACR_PRFTBE | FLASH_ACR_LATENCY;      //flash总线时钟使能

                /* HCLK = SYSCLK */      //AHB总线时钟HCLK(是系统时钟SYSCLK经过AHB分频器分频后得到的时钟,

                                                                                                                                                                         //一般设置1分频,HCLK=SYSSCLK=48MHz;

                RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1;    //AHB总线时钟  HCLK = SYSCLK/1=48MHz

                /* PCLK = HCLK */         //APB总线时钟PCLK等于AHB总线时钟/1   PCLK=HCLK/1
                RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE_DIV1;                    // PCLK=HCLK/1=48M/1=48M

                /* PLL configuration = HSI/2 * 12= 48 MHz */
                RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLSRC | RCC_CFGR_PLLMULL));
                RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSI_Div2 | RCC_CFGR_PLLMULL12);   

                                                                                                                                                                                                                                                                                                        //RC时钟2分频后 进行12倍频
                                                                                                                                                                                                                                                                                                        //=8M/2*12=48M
                RCC->CR |= RCC_CR_PLLON;                                                     //使能锁相环倍频开关 /* Enable PLL */

                while((RCC->CR & RCC_CR_PLLRDY) == 0)                                //等待锁相环就绪
                { }

                /* Select PLL as system clock source */                              //选择锁相环输出时钟作为系统时钟
                RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW));
                RCC->CFGR |= (uint32_t)RCC_CFGR_SW_PLL;

                while ((RCC->CFGR & (uint32_t)RCC_CFGR_SWS) != (uint32_t)RCC_CFGR_SWS_PLL)
                { }                                                             //等待锁相环输出时钟已经成为系统时钟
        }
        else
        { }     
}
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-23 10:15

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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