使用stm32f103 内部高速时钟作为系统时钟?
我没有使用PLL锁相环,在进行LED灯闪烁时发现只要使能了GPIO口,和对应引脚,LED就会亮为什么?
该回答通过自己思路及引用到GPTᴼᴾᴱᴺᴬᴵ搜索,得到内容具体如下:
使用STM32F103内部高速时钟作为系统时钟的步骤如下:
配置系统时钟源为内部高速时钟(HSI)。
在RCC寄存器中,将SW位设置为0,将SWS位设置为1,以选择HSI作为系统时钟源。
等待HSI稳定。
在RCC寄存器中,检查HSIRDY位是否为1,以确保HSI稳定并可用。
配置AHB时钟分频器。
在RCC寄存器中,将HPRE位设置为0,即使用不分频的AHB时钟。
配置APB1时钟分频器。
在RCC寄存器中,将PPRE1位设置为0,即使用不分频的APB1时钟。
配置APB2时钟分频器。
在RCC寄存器中,将PPRE2位设置为0,即使用不分频的APB2时钟。
在以上步骤完成后,系统时钟就会被配置为HSI,并且AHB、APB1和APB2时钟都将与系统时钟相同。下面是相应的代码示例:
#include "stm32f10x.h"
int main(void)
{
// 使能GPIOC时钟
RCC->APB2ENR |= RCC_APB2ENR_IOPCEN;
// 配置PC13引脚为输出
GPIOC->CRH &= ~GPIO_CRH_MODE13; // 清零MODE13位
GPIOC->CRH |= GPIO_CRH_MODE13_0; // 设置MODE13位为01,输出模式,最大输出速率2MHz
// 配置系统时钟源为HSI
RCC->CR |= RCC_CR_HSION; // 使能HSI
while ((RCC->CR & RCC_CR_HSIRDY) == 0); // 等待HSI稳定
RCC->CFGR &= ~RCC_CFGR_SW; // 选择HSI作为系统时钟源
RCC->CFGR |= RCC_CFGR_SWS_HSI;
while ((RCC->CFGR & RCC_CFGR_SWS) != RCC_CFGR_SWS_HSI); // 等待系统时钟源切换完成
// 配置时钟分频器为不分频
RCC->CFGR &= ~RCC_CFGR_HPRE;
RCC->CFGR &= ~RCC_CFGR_PPRE1;
RCC->CFGR &= ~RCC_CFGR_PPRE2;
while (1)
{
GPIOC->BSRR |= GPIO_BSRR_BS13; // PC13引脚输出高电平
for (int i = 0; i < 1000000; i++); // 延时
GPIOC->BSRR |= GPIO_BSRR_BR13; // PC13引脚输出低电平
for (int i = 0; i < 1000000; i++); // 延时
}
}
在以上的代码中,我们通过配置GPIOC的CRH寄存器来将PC13引脚配置为输出模式。然后,我们使用RCC寄存器将系统时钟源配置为HSI,并将时钟分频器配置为不分频。之后,我们使用GPIOC的BSRR寄存器来控制PC13引脚的电平,从而实现LED灯的闪烁。
在上面的代码中,我们通过配置GPIOC的CRH寄存器来将PC13引脚配置为输出模式,然后使用GPIOC的BSRR寄存器来控制PC13引脚的电平,从而实现LED灯的闪烁。具体来说,程序会不断地将PC13引脚输出高电平,然后延时一段时间后再将其输出低电平,再延时一段时间,如此循环,就可以实现LED灯的闪烁。
因此,如果一切正常,LED灯应该会以一定的频率闪烁,即每隔一段时间亮一次,然后暗一次。如果LED灯没有闪烁,或者闪烁频率过快或过慢,可能是由于时钟分频器配置不正确或延时时间不合适导致的。需要对时钟分频器和延时时间进行调整,以使LED灯能够按照预期的频率闪烁。
需要注意的是,如果使用不分频的时钟,系统时钟将非常快,因此需要适当增加延时时间,以确保LED灯的闪烁频率不会太快,从而使LED灯的亮度过低。
如果以上回答对您有所帮助,点击一下采纳该答案~谢谢