当前位置:   article > 正文

STM32 特殊引脚作为普通IO口使用的问题_stm32使用c14当普通io

stm32使用c14当普通io

开发平台:Keil5
硬件平台:STM32F103RCT6

之前有有弄过的东西,因为没有记录忘记了,所以还得重新找资料寻找答案,所以说,博客还是得写啊,不然搞过的东西,又得重新再来一遍。(-_-||)

1. OSC_IN 引脚接有源晶振,OSC_OUT 做普通IO口使用

原理图如下:
在这里插入图片描述在这里插入图片描述
原理图中,我们将 OSC_IN 引脚接了有源晶振,OSC_OUT引脚需要采集DS18B20数据(也就是做普通IO使用),那么我们需要如何配置:

在手册中,由讲解到:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
注意,再这里提到过,“当不适用主振荡器HSE时,PD0 和PD1 可以映射到 OSC_IN 和 OSC_OUT引脚 ”。

再这里,由于我们使用了外部高速时钟 HSE,所以,是不是不能使用了呢?再这里我也有疑问。

在这里我们既要引出 STM32 时钟部分

HSE时钟

高速外部时钟信号(HSE)由以下两种时钟源产生:

  • HSE外部晶体/陶瓷谐振器 (也就是我们所说的无源晶振)
  • HSE用户外部时钟 (有源晶振)

为了减少时钟输出的失真和缩短启动稳定时间,晶体/陶瓷谐振器和负载电容器必须尽可能地靠
近振荡器引脚。负载电容值必须根据所选择的振荡器来调整。

在这里插入图片描述

外部时钟源(HSE旁路)

在这个模式里,必须提供外部时钟。它的频率最高可达50MHz。用户可通过设置在时钟控制寄存器中的 HSEBYP 和 HSEON 位选择这一模式。外部时钟信号(50%占空比的方波、正弦波或三角波)必须连到SOC_IN引脚,同时保证OSC_OUT引脚悬空。 见图12。

外部晶体/陶瓷谐振器(HSE晶体)

3~25Mz外部振荡器可为系统提供非常精确的主时钟。相关的硬件配置可参考图12,进一步信息可参考数据手册的电气特性部分。
在时钟控制寄存器(RCC_CR)中的 HSERDY 位用来指示 高速外部振荡器是否稳定。在启动时,直到这一位被硬件置’1’,时钟才被释放出来。如果在时钟中断寄存器(RCC_CIR)中允许产生中断,将会产生相应中断。HSE晶体可以通过设置时钟控制寄存器(RCC_CR)中的 HSEON 位被启动和关闭。


PS: 在这里,我们使用了有源晶振,但是之前我没有细看原理图,我的代码里面还是按照无源晶振配置,发现也是可以运行的,于是去寻找二者的配置区别,发现:有源晶振的配置就是多了一句:

  /* Enable HSE and HSE BYPASS */
  RCC->CR |= ((uint32_t)RCC_CR_HSEON | RCC_CR_HSEBYP);
  • 1
  • 2

无源晶振则是:

  /* Enable HSE */
  RCC->CR |= ((uint32_t)RCC_CR_HSEON);
  • 1
  • 2

于是,我在想,是不是有源晶振,上电了就输出50%占空比的正弦波,然后系统直接检测到了时钟就绪标志(RCC_CR_HSERDY)系统运行。

RCC_CR_HSEBYP : 定义是 HSE晶振被外部时钟旁路。指将芯片内部的用于外部晶体起振和功率驱动等的部分电路和XTAL_OUT引脚断开。这时使用的外部时钟是:有源时钟或者其他STM32提供的CCO输出等时钟信号,直接单线从XTAL_IN输入。

这样,就算是外部接了晶体(无源晶振)也不会起振。
在这里插入图片描述

因此:使用无源晶振的时钟代码配置适用于有源晶振,但是,有源晶振的代码配置就不适用了无源晶振,OCS_OUT引脚断开而导致晶振不起振。

回归上面的问题:将OSC_OUT 配置为普通IO口使用:
上面说 “当不使用主振荡器HSE时,PD0 和PD1 可以映射到 OSC_IN 和 OSC_OUT引脚”,那么我们使用了有源晶振,只接了OSC_IN,还有一个脚 OSC_OUT 还能不能使用呢?

实践是检验真理的唯一标准。

配置如下:

/**
  * @brief  初始化DS18B20的IO口 DQ 同时检测DS的存在
  * @param  Despition
  * @retval NULL
  */
void bsp_GPIO_Init(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);//使能PORTA时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//使能复用功能
    
    //使能重映射
    GPIO_PinRemapConfig(GPIO_Remap_PD01,ENABLE);
	//引脚配置
    GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_1;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 		 
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOD, &GPIO_InitStructure);
	
    GPIO_ResetBits(GPIOD,GPIO_Pin_1);    //输出0
}  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

发现是可以输出的。。

这就很尴尬。。

不过,再STM32H7的一份手册里,我看到了这样一句话:
在这里插入图片描述
也就是说,其实刚刚说的, OSC_IN使用外部时钟模式,第二个引脚充当一个IO引脚是可以的。

2. STM32F1系列PB3,PB4,PA13,PA14,PA15用作普通IO口的特殊配置

这里这个老哥比我写的详细,可参考:
STM32F1系列PB3,PB4,PA13,PA14,PA15用作普通IO口的特殊配置

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号