时钟树
详细介绍可以看STM32F10x-中文参考手册
可以参考下面别人介绍 点击
时钟配置函数
- 时钟初始化函数
void SystemInit (void)
-
时钟配置函数(都在 stm32f10x_rcc.c里面)
-
普中设计的配置系统函数
void RCC_HSE_Config(u32 div,u32 pllm) //自定义系统时间(可以修改时钟)
{
RCC_DeInit(); //将外设RCC寄存器重设为缺省值
RCC_HSEConfig(RCC_HSE_ON);//设置外部高速晶振(HSE)
if(RCC_WaitForHSEStartUp()==SUCCESS) //等待HSE起振
{
RCC_HCLKConfig(RCC_SYSCLK_Div1);//设置AHB时钟(HCLK)
RCC_PCLK1Config(RCC_HCLK_Div2);//设置低速AHB时钟(PCLK1)
RCC_PCLK2Config(RCC_HCLK_Div1);//设置高速AHB时钟(PCLK2)
RCC_PLLConfig(div,pllm);//设置PLL时钟源及倍频系数
RCC_PLLCmd(ENABLE); //使能或者失能PLL
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==RESET);//检查指定的RCC标志位设置与否,PLL就绪
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);//设置系统时钟(SYSCLK)
while(RCC_GetSYSCLKSource()!=0x08);//返回用作系统时钟的时钟源,0x08:PLL作为系统时钟
}
}
void delay(u32 ms)
{
while(ms--);
}
- 自己检测函数
int main()
{
LED_Init();
RCC_HSE_Config(RCC_PLLSource_HSE_Div2,RCC_PLLMul_9);//36MHz,可以将此函数注释掉,系统时钟函数就会默认为72MHz
while(1)
{
GPIO_ResetBits(GPIOB,GPIO_Pin_5);
GPIO_ResetBits(GPIOE,GPIO_Pin_5);
//点亮led0,led1
delay(600000);
GPIO_SetBits(GPIOB,GPIO_Pin_5);
GPIO_SetBits(GPIOE,GPIO_Pin_5);
//熄灭led0,led1
delay(600000);
}
}
- 实验结果
==36MHz比72MHz LED0和LED1 闪烁时间慢
位带操作
-
介绍
在学习 51 单片机的时候就使用过位操作,通过关键字 sbit 对单片机 IO口进行位定义比如P2^1=0。但是在STM32里面,内核的最小寻址单位是字节,一个字节里面有8bit,根本不能直接进行位操作。那么如何进行位操作呢?推荐一篇文章解读还不错 点击跳转 -
LED呼吸代码(其余都是按照普中的代码)
int main()
{
LED_Init();
//RCC_HSE_Config(RCC_PLLSource_HSE_Div2,RCC_PLLMul_9);//36MHz
while(1)
{
u32 i=0,j=3000;
while(i<j)
{
i++;
LED1=0;
delay(i);
LED1=1;
delay(j-i);
}
while(j>1)
{
j--;
LED1=0;
delay(j);
LED1=1;
delay(i-j);
}
}
}
- 实验结果
DS0 LEd0有·呼吸效果