前言
(1)本系列是基于STM32的项目笔记,内容涵盖了STM32各种外设的使用,由浅入深。
(2)小编使用的单片机是STM32F105RCT6,项目笔记基于小编的实际项目,但是博客中的内容适用于各种单片机开发的同学学习和使用。
学习目标
- GPIO的初始化
- GPIO的输出库函数
- LED灯硬件电路分析
- 控制LED灯闪烁
LED灯硬件原理图
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灯驱动流程
- 端口的定义
- 初始化
- 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()就行。
这个小技巧很常用。