开发平台: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);
无源晶振则是:
/* Enable HSE */
RCC->CR |= ((uint32_t)RCC_CR_HSEON);
于是,我在想,是不是有源晶振,上电了就输出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
}
发现是可以输出的。。
这就很尴尬。。
不过,再STM32H7的一份手册里,我看到了这样一句话:
也就是说,其实刚刚说的, OSC_IN使用外部时钟模式,第二个引脚充当一个IO引脚是可以的。
2. STM32F1系列PB3,PB4,PA13,PA14,PA15用作普通IO口的特殊配置
这里这个老哥比我写的详细,可参考:
STM32F1系列PB3,PB4,PA13,PA14,PA15用作普通IO口的特殊配置