欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

点亮LED灯实验、系统时钟设置、LED灯闪烁实验、 位带操作

程序员文章站 2022-07-03 16:34:40
...

点亮LED灯实验

原理
由LED电路图,PCX端口输入低电平,则灯亮;输入高电平,则灯灭。
点亮LED灯实验、系统时钟设置、LED灯闪烁实验、 位带操作
准备
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灯实验、系统时钟设置、LED灯闪烁实验、 位带操作

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灯闪烁实验、 位带操作
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);  //延迟函数
	}
}