完整的程序代码
#include "stm32f10x.h"
ErrorStatus HSEStartUpStatus;
void SetSysClockTo72(void); //声明pll时钟设置
void RCC_Configuration(void); //声明时钟初始化函数
void GPIO_Configuration(void); //声明io口初始化函数
void delay(int); //声明延时函数
GPIO_InitTypeDef GPIO_InitStructure; //声明gpio的结构
int main(void)
{
RCC_Configuration(); //初始化时钟
GPIO_Configuration(); //初始化io口
while (1)
{
GPIO_WriteBit(GPIOA,GPIO_Pin_1,Bit_SET); //置位第一个灯
delay(20);
GPIO_WriteBit(GPIOA,GPIO_Pin_1,Bit_RESET); //复位第一个灯
delay(20);
GPIO_WriteBit(GPIOA,GPIO_Pin_4,Bit_SET);
delay(20);
GPIO_WriteBit(GPIOA,GPIO_Pin_4,Bit_RESET);
delay(20);
GPIO_WriteBit(GPIOB,GPIO_Pin_0,Bit_SET);
delay(20);
GPIO_WriteBit(GPIOB,GPIO_Pin_0,Bit_RESET);
delay(20);
GPIO_WriteBit(GPIOB,GPIO_Pin_1,Bit_SET);
delay(20);
GPIO_WriteBit(GPIOB,GPIO_Pin_1,Bit_RESET);
delay(20);
}
}
void GPIO_Configuration(void) //io初始化函数
{
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1|GPIO_Pin_4;//选择io口的第一和四位
GPIO_InitStructure.GPIO_Pin =GPIO_Pin_1 | GPIO_Pin_4;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; //时钟速度为50M
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP; //设置为端口输出模式
GPIO_Init(GPIOA,&GPIO_InitStructure); //用以上几个参数初始化PA口
// GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1;//选择io口的第0和1位
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; //时钟速度为50M
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP; //设置为端口输出模式
GPIO_Init(GPIOB,&GPIO_InitStructure); //用以上几个参数初始化PB口
}
void RCC_Configuration(void) //时钟初始化函数
{
SetSysClockTo72();
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB,ENABLE);
}
void SetSysClockTo72() //pll时钟设置函数
{
RCC_DeInit(); //RCC寄存器初始化
RCC_HSEConfig(RCC_HSE_ON); //打开外部时钟
// HSEStartUpStatus=RCC_WaitForHSEStartUp();
HSEStartUpStatus=RCC_WaitForHSEStartUp();
if(HSEStartUpStatus==SUCCESS) //如果外部时钟启动成功就执行初始化
{
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); //打开flash缓冲区
FLASH_SetLatency(FLASH_Latency_2); //配置flash延时周期
RCC_HCLKConfig(RCC_SYSCLK_Div4); //配置hclk时钟
RCC_PCLK2Config(RCC_HCLK_Div1); //配置pclk2时钟
RCC_PCLK1Config(RCC_HCLK_Div2); //配置pclk1时钟 系统时钟2分频为36M
RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9); //配置pll时钟为8*9=72M
RCC_PLLCmd(ENABLE); //打开pll时钟
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==RESET) //如果未启动成功则执行这个空循环
{
}
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); //选择pll作为系统时钟
while(RCC_GetSYSCLKSource()!=0x08) //等待pll作为系统时钟
{
}
}
else //如果未启动成功
{
while(1)
{
}
}
}
void delay(int k)
{
int i,j;
for(i=0;i<50000;i++)
for(j=0;j<k;j++);
}
#ifdef USE_FULL_ASSERT
void assert_failed(uint8_t* file, uint32_t line)
{
while (1)
{
}
}
#endif