点亮LED灯实验、系统时钟设置、LED灯闪烁实验、 位带操作
点亮LED灯实验
原理
由LED电路图,PCX端口输入低电平,则灯亮;输入高电平,则灯灭。
准备
APP文件:外设(如LED)驱动文件夹。这里是LED的驱动程序(led.c)和头文件(led.h)。添加led文件路径。
需对GPIO外设操作,需要添加驱动程序(stm32f103zet6_gpio.c)和头文件(stm32f103zet6_gpio.h)
添加系统是时钟驱动程序(stm32f103zet6_rcc.c)和头文件(stm32f103zet6_rcc.h)
程序
led.c:编写驱动程序,初始化函数。
led.h:存放板子头文件(stm32f10x.h)、管脚定义、全局变量声明、函数声明。
#include "led.h"
void LED_Init() //初始化函数
{
GPIO_InitTypeDef GPIO_InitStructure;//
RCC_APB2PeriphClockCmd(LED_PORT_RCC,ENABLE);//LED_PORT_RCC=RCC_APB2Periph_GPIOC
GPIO_InitStructure.GPIO_Pin=LED_PIN; // LED_PIN =GPIO_Pin_x
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP; //
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; //
GPIO_Init(LED_PORT,&GPIO_InitStructure); // LED_PORT=GPIOC
GPIO_SetBits(LED_PORT,LED_PIN); // LED_PORT=GPIOC
}
#ifndef _led_H
#define _led_H
#include "stm32f10x.h"
#define LED_PORT GPIOC
#define LED_PIN (GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7)
#define LED_PORT_RCC RCC_APB2Periph_GPIOC
void LED_Init(void);
#endif
主函数:
#include "stm32f10x.h"
#include "led.h"
int main()
{
LED_Init();//调用初始化函数,初始化led外设
while(1)
{
GPIO_ResetBits(LED_PORT,GPIO_Pin_0);//调用库函数,引脚输出低电平,参考stm32f1固件库手册
}
}
系统时钟设置
LED灯闪烁实验
主函数
#include "stm32f10x.h"
#include "led.h"
int main()
{
RCC_HSE_Config(RCC_PLLSource_HSE_Div2,RCC_PLLMul_9); //36M;自定义时钟函数
LED_Init();//LED初始化函数
while(1)
{
GPIO_ResetBits(LED_PORT,GPIO_Pin_0);//
delay(6000000);//延迟函数
GPIO_SetBits(LED_PORT,GPIO_Pin_0);
delay(6000000);
}
}
自定义时钟函数
void RCC_HSE_Config(u32 div,u32 pllm) //
{
RCC_DeInit(); //
RCC_HSEConfig(RCC_HSE_ON);//
if(RCC_WaitForHSEStartUp()==SUCCESS) //
{
RCC_HCLKConfig(RCC_SYSCLK_Div1);//
RCC_PCLK1Config(RCC_HCLK_Div2);//
RCC_PCLK2Config(RCC_HCLK_Div1);//
RCC_PLLConfig(div,pllm);// 修改PLL时钟源和倍频系数【只需要修改此处】相关定义查看stm32f10x_rcc.h头文件
//div表示时钟源,取值为RCC_PLLSource_HSE_Div1 或 RCC_PLLSource_HSE_Div2
//pllm为锁相环,提供倍频系数,取值为RCC_PLLMul_2-RCC_PLLMul_16。PLLMul表示倍频器。从2倍到16倍之间。
RCC_PLLCmd(ENABLE); //
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==RESET);//
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);//
while(RCC_GetSYSCLKSource()!=0x08);//
}
}
开发板使用的HSE是8M晶振,经过PLLMUL9倍频可以输出72M时钟频率给PLLCLK。
RCC_HSE_Config(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9)//72M
RCC_HSE_Config(RCC_PLLSource_HSE_Div2,RCC_PLLMul_9)//36M
如果我们选择的HSE是PLL的时钟源,PLL是SYSCLK的时钟源,那么SYSCLK为72M。也就是SystemInit配置的最终系统时钟。
RCC_PLLSource_HSE_Div2 HSE表示经过2分频之后,成为PLL的时钟源。
RCC_PLLSource_HSE_Div1 HSE表示 直接成为PLL的时钟源。
不要把系统时钟设置超过72M。
延迟函数
void delay(u32 i)
{
while(i--);
}
位带操作
与库函数操作外设相比,位带操作的优点:
控制GPIO输入与输出非常简单;操作串行接口方便;代码简洁。
对所有端口进行了位定义封装,需要使用PC0管脚输出,调用PCout(n)宏即可,这里n为0。输入PCin(n)。
Public文件夹:存放stm32f1的公共文件。如位带功能需要的驱动文件(system.c)和头文件(system.h);systick定时器需要的驱动文件和头文件;串口的驱动文件和头文件。
system.h:对GPIO的IDR和ODR寄存器位操作进行了封装。
system.c:调用其头文件。
LED外设驱动文件led.c调用system.h即可进行位带操作控制LED。
在led.h文件里面对led和管脚进行宏定义(相连接)。
然后使用位带操作控制即可:led=1,输出(PCout)高电平;led=0,输出低电平。
主函数:
#include "system.h" //不在led.h调用,在main.c调用也可
#include "led.h"
void delay(u32 i) //定义延迟函数
{
while(i--);
}
int main() //主函数
{
LED_Init(); //led初始化
while(1)
{
led1=!led1; //位带取反
delay(6000000); //延迟函数
}
}
上一篇: SLF4J+Logback 设置日志级别
下一篇: logback动态设置某个类的日志级别