GPIO口输出-点亮LED灯

前言

(1)本系列是基于STM32的项目笔记,内容涵盖了STM32各种外设的使用,由浅入深。

(2)小编使用的单片机是STM32F105RCT6,项目笔记基于小编的实际项目,但是博客中的内容适用于各种单片机开发的同学学习和使用。

学习目标

  1. GPIO的初始化
  2. GPIO的输出库函数
  3. LED灯硬件电路分析
  4. 控制LED灯闪烁

LED灯硬件原理图

GPIO口输出-点亮LED灯_第1张图片

GPIO口输出-点亮LED灯_第2张图片

PC14、PC15输出高电平,可将LED点亮。

程序实现–GPIO的输出

GPIO初始化流程:

打开GPIO对应的外设时钟

初始化GPIO端口:Pin选择、速率、模式上拉下拉开漏配置

关于速率:

➢ GPIO简单的控制选择2MHZ 就OK.

➢ 如果是SPI IIC 通讯的频率比较高的时候,需要选择对应的速率。

常见的GPIO输出库函数

void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);

void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);

void GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, BitAction BitVal);

LED灯控制的代码的实现:

LED灯驱动流程

  1. 端口的定义
  2. 初始化
  3. GPIO端口的控制与操作

hal_led.h 文件代码:

#ifndef _HAL_LED_H
#define _HAL_LED_H

#define LED1_PORT			GPIOC
#define LED1_PIN			       GPIO_Pin_14

#define LED2_PORT			GPIOC
#define LED2_PIN			        GPIO_Pin_15

void hal_LedInit(void);
void hal_LedProc(void);
	
#endif

hal_led.c 文件代码:

#include "stm32F10x.h"
#include "hal_led.h"

static void hal_LedConfig(void);
static void hal_Led1Turn(void);

void hal_LedInit(void)
{
	hal_LedConfig();
}
/
/
void delay_1sTest(void)//用于测试的延时函数
{
	unsigned int i=0;
	i = 7200000;
	while(i--);   
}

static void hal_LedHandle(void)//led处理函数
{
	delay_1sTest();
	GPIO_ResetBits(LED1_PORT,LED1_PIN);
	GPIO_ResetBits(LED2_PORT,LED2_PIN);
	delay_1sTest();
	GPIO_SetBits(LED1_PORT,LED1_PIN);
	GPIO_SetBits(LED2_PORT,LED2_PIN);
	//  static unsigned short delayt =0;
	//	delayt ++;
	//  if(delayt > 1000)
	//	{
	//		hal_Led1Turn();
	//		delayt = 0;
	//	}	
}
//


void hal_LedProc(void)//全局的任务函数,用于main函数中调用
{
	hal_LedHandle();
}

static void hal_LedConfig(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;	
	RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOC,ENABLE); 						 
	GPIO_InitStructure.GPIO_Pin = LED1_PIN | LED2_PIN;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 
	GPIO_Init(LED1_PORT, &GPIO_InitStructure);
	GPIO_ResetBits(LED1_PORT,LED1_PIN);
}


main.c文件代码

#include "stm32f10x.h"
#include "hal_led.h"

int main(void)
{
	hal_LedInit();
	hal_timerInit();
  while (1)
  {
		
  }
}

本章tips:

stastic定义的静态函数在其他c文件中调用

c文件中的静态函数(stastic定义的函数)要在其他文件中调用,直接调用是不行的;我们可以,再写一个全局的函数,这个全局函数里面调用这个静态函数就可以了。

形式

例如LED的驱动代码hal_led.c文件中代码:

void hal_LedInit(void)//led初始化函数。在hal_led.h中声明,使此函数可以全局调用
{
	hal_LedConfig();
}

static void hal_LedConfig(void)//led的驱动程序(初始化代码)。只能在本文件中调用
{
	GPIO_InitTypeDef GPIO_InitStructure;	
	RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOC,ENABLE); 						 
	GPIO_InitStructure.GPIO_Pin = LED1_PIN | LED2_PIN;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; ; 
	GPIO_Init(LED1_PORT, &GPIO_InitStructure);
	GPIO_ResetBits(LED1_PORT,LED1_PIN);
}

这样一来,在main.c中想要调用LED的驱动代码,调用hal_LedInit()就行。

这个小技巧很常用。

你可能感兴趣的:(STM32系列,stm32,学习,单片机)