实验说明:将两个LED灯点亮,隔一段时间后,将它们熄灭。
硬件电路:
如图 GPIOA.2引脚连接LED灯,在连接一个1kΩ的限流电阻,最后接地。
GPIOA.3引脚连接LED灯,在连接一个1kΩ的限流电阻,最后接地。(很简单)
主要来看软件设计(程序设计):
需要注意的几点:
- 置RCC寄存器组,使PLL输出72MHz时钟频率。
- 配置GPIOA.2和GPIOA.3为推挽输出,最大翻转频率为50MHz。
- 通过在GPIOA.2和GPIOA.3上输出高电平点亮LED,反之输出低电平则熄灭LED。
程序:
主函数main.c
#include"stm32f10x_lib.h" //头文件
#define Delay(n) //自定义变量
void RCC_Configuration (void);
void GPIO_Configuration (void);
int main (void)
{
vu32 n=2000000; //定义延时函数
RCC_Configuration(); //设置系统时钟
GPIO_Configuration(); //设置GPIO端口
GPIO_SetBits(GPIOA,GPIO_Pin_2); //设置GPIOA.2为高电平
GPIO_SetBits(GPIOA,GPIO_Pin_3); //设置GPIOA.3为高电平
Delay(n); //延时
GPIO_ResetBits(GPIOA,GPIO_Pin_2); //设置GPIOA.2为低电平
GPIO_ResetBits(GPIOA,GPIO_Pin_3); //设置GPIOA.3为低电平
while(1);
{
}
}
设置系统各部分时钟 RCC_Configuration
void RCC_Configuration(void)
{
ErrorStatus HSEStartUpStatus; //定义枚举类型变量 HSEStartUpStatus
RCC_DeInit(); //复位系统时钟设置
RCC_HSEConfig(RCC_HSE_ON); //开启HSE
HSEStatrtUpStatus=RCC_WaitForHSEStartUp(); //等待HSE起振并稳定
if(HSEStatrtUpStatus==SUCCESS) //判断HSE是否起振成功,是则进入if()内部
{
RCC_HCLKConfig(RCC_SYSCLK_Div1); //选择HCLK(AHB)时钟源为SYSCLK分频
RCC_PCLK2Config(RCC_HCLK_Div1); //选择PCLK2时钟源为HCLK(AHB)1分频
RCC_PCLK1Config(RCC_HCLK_Div2); //选择PCLK1时钟源为HCLK(AHB)2分频
FLASH_SetLatency(FLASH_Latency_2); //设置Flash延时周期数为2
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); //使能Flash预取缓存
//选择PLL时钟源为 HSE 1 分频,倍频数为9,则PLL=8MHz *9=72MHz
RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9);
RCC_PLLCmd(ENABLE); //使能PLL
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==RESET); //等待PLL输出稳定
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); //选择SYSCLK时钟源为PLL
while(RCC_GetSYSCLKSource()!=0x08); //等待PLL成为SYSCLK时钟源
}
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); //打开APB2总线上的GPIOA时钟
}
设置各GPIO端口功能 GPIO_Configuration
void GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
//设置GPIOA.2和GPIOA.3为推挽输出,最大翻转频率为50MHz
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_2|GPIO_Pin_3;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_Init(GPIOA,&GPIO_InitStructure);
}
下一篇博客写本篇代码使用到的库函数。