一、前言
本章主要介绍如何使用标准库工程与cubemx配置工程使LED灯闪烁,可以直接点击目录看自己想要看的内容,文章教程可以让您一步一步学会如何用标准库工程与cubemx使LED闪烁。
二、准备工作
- STM32开发板(我使用的是普中的STM32F103ZE的Z200系列)
- STM32cubemx、Keil5(MDK)、开发板原理图
- 标准库工程模板
有关STM32芯片GPIO的讲解可以看这篇文章:【STM32】SMT32标准库与HAL库对照学习教程特别篇–GPIO详讲
有关库函数工程模板的创建可以看这篇文章:【STM32】STM32标准库与HAL库对照学习教程二–库函数模板创建
标准库模板工程文件我已上传至百度网盘,网盘链接:https://pan.baidu.com/s/1Ok_wIMi1V1cVAHdGETPJzQ
密码:lob1
三、LED硬件威廉希尔官方网站
硬件原理图看自己的开发板
可以看到开发板的两个LED分别由PE5与PB5引脚控制,由原理图可知,当两引脚给低电平时,发光二级管LED导通,LED被点亮,给高电平时,LED灯熄灭。
四、使用标准库工程点亮LED灯
1、GPIO初始化一般步骤
打开对应GPIO引脚的时钟。
定义GPIO端口结构体变量。
配置结构体变量(设置IO、设置模式、设置速率)。
初始化GPIO函数。
2、GPIO标准库函数介绍
(1)GPIO外设库的文件:
stm32f10x_gpio.c、
stm32f10x_gpio.h
(2)GPIO常用标准库函数:
void GPIO_Init(GPIO_TypeDef* GPIOx,GPIO_InitTypeDef* GPIO_InitStruct)
功能:初始化一个或多个IO口(同一组端口)的工作模式、输出速度。
void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
功能:设置某个IO口为高电平(可同时设置同一端口的多个IO)。底层是通过配置BSRR寄存器。
void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
功能:设置某个IO口为低电平(可同时设置同一端口的多个IO)。底层是通过配置BSRR寄存器。
void GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin,
BitAction BitVal);
void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal);
功能:设置端口管脚输出电平,很少使用。
uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t
GPIO_Pin);
功能:读取端口中的某个管脚输入电平。底层是通过读取IDR寄存器。
uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx);
功能:读取某组端口的输入电平。底层是通过读取IDR寄存器。
uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t
GPIO_Pin);
功能:读取端口中的某个管脚输出电平。底层是通过读取ODR寄存器。
uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx);
功能:读取某组端口的输出电平。底层是通过读取ODR寄存器。
(3)使能GPIO时钟函数
void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState);
3、使用库函数编写程序使LED灯闪烁操作
(1)复制模板工程,重新命名为库函数点亮LED。
(2)在工程文件中新建一个App文件夹,专门用来存放外设文件。
(3)在App在新建一个LED文件夹用来存放LED的.c和.h文件。
这样做的好处是便于移植外设文件
(4)打开工程,新建文件,格式保存为.h,写入LED初始化申明部分。
- ①
- ②
- ③
程序:
#ifndef LED_H_
#define LED_H_
#include "stm32f10x.h"
/* 宏定义LED时钟端口、引脚的定义 */
#define LED0_GPIO_Port GPIOB
#define LED0_Pin GPIO_Pin_5
#define LED0_Port_RCC RCC_APB2Periph_GPIOB
#define LED1_GPIO_Port GPIOE
#define LED1_Pin GPIO_Pin_5
#define LED1_Port_RCC RCC_APB2Periph_GPIOE
void LED_Init(void); //LED初始化函数
#endif
- ①
- ②
程序:
#include "LED.h"
/*************************************************
*函数名: LED_Init
*函数功能: LED灯初始化函数
*输入: 无
*返回值: 无
**************************************************/
void LED_Init()
{
GPIO_InitTypeDef GPIO_InitStructure; //定义结构体变量
RCC_APB2PeriphClockCmd(LED0_Port_RCC|LED1_Port_RCC,ENABLE); //使能时钟
GPIO_InitStructure.GPIO_Pin=LED0_Pin; //选择设置LED0的IO口
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP; //设置推挽输出模式
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; //设置传输速率
GPIO_Init(LED0_GPIO_Port,&GPIO_InitStructure); /* 初始化GPIO */
GPIO_SetBits(LED0_GPIO_Port, LED0_Pin); //输出高电平,LED0熄灭
GPIO_InitStructure.GPIO_Pin=LED1_Pin; //选择设置LED1的IO口
GPIO_Init(LED1_GPIO_Port,&GPIO_InitStructure); /* 初始化GPIO */
GPIO_SetBits(LED1_GPIO_Port, LED1_Pin); //输出高电平,LED01熄灭
}
- ①
- ②
(7)编写主函数,并编译烧入程序。
程序:
#include "LED.h"
/*************************************************
*函数名: delay
*函数功能: 延时函数,通过while循环占用CPU,到达延时目的
*输入: i
*返回值: 无
**************************************************/
void delay(u32 i)
{
while(i--);
}
/*************************************************
*函数名: main
*函数功能: 主函数
*输入: 无
*返回值: 无
**************************************************/
int main()
{
LED_Init();
while(1)
{
GPIO_SetBits(LED0_GPIO_Port, LED0_Pin);
GPIO_ResetBits(LED1_GPIO_Port, LED1_Pin);
delay(6000000);
GPIO_SetBits(LED1_GPIO_Port, LED1_Pin);
GPIO_ResetBits(LED0_GPIO_Port, LED0_Pin);
delay(6000000);
}
}
- 编译后无错误,无警告,烧入程序到开发板。
我使用的普中提供的串口烧入软件
4、实验效果
五、使用cubemx生成HAL库工程点亮LED灯
有关cubemx一些使用可以看:【STM32】STM32标准库与HAL库对照学习教程二–库函数模板创建
有关cubemx功能部分,下面的配置不会多做介绍。
1、cubemx配置生成工程
(1)打开cubemx,点击ACCESS TO MCU SELECTOR。
(2)选择自己开发板的芯片。
(3)配置SYS。
(4)配置RCC,选择外部时钟。
(5)配置PB5、PE6引脚。
- ①
- ②
PE5操作相同
(6)点击GPIO配置模式。
PE5操作相同
(7)配置时钟树。
有关时钟树不懂的可以看这篇文章:【STM32】STM32标准库与HAL库对照学习教程特别篇–系统时钟RCC详讲
(8)点击Project Manager,配置文件,生成工程。
- ①
重点提醒:路径和工程名都不要带中文
- ②
2、HAL库控制函数介绍
(1)GPIO外设库的文件:
stm32f10xx_hal_gpio.h、
stm32f10xx_hal_gpio.c
(2)操作GPIO常用HAL库函数:
GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);
功能:读取一个引脚的电平。
void HAL_GPIO_WritePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState);
功能:写一个引脚的电平,可写高电平,也可以是低电平。
void HAL_GPIO_TogglePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);
功能:翻转一个引脚的电平。
3、编写使LED灯闪烁的程序
程序:
HAL_GPIO_WritePin(LED0_GPIO_Port,LED0_Pin,GPIO_PIN_RESET);
HAL_GPIO_WritePin(LED1_GPIO_Port,LED1_Pin,GPIO_PIN_SET);
HAL_Delay(500); //HAL库自带的ms级延时函数
HAL_GPIO_WritePin(LED0_GPIO_Port,LED0_Pin,GPIO_PIN_SET);
HAL_GPIO_WritePin(LED1_GPIO_Port,LED1_Pin,GPIO_PIN_RESET);
HAL_Delay(500);
编译后0错误0警告,烧入到开发板。
一、前言
本章主要介绍如何使用标准库工程与cubemx配置工程使LED灯闪烁,可以直接点击目录看自己想要看的内容,文章教程可以让您一步一步学会如何用标准库工程与cubemx使LED闪烁。
二、准备工作
- STM32开发板(我使用的是普中的STM32F103ZE的Z200系列)
- STM32cubemx、Keil5(MDK)、开发板原理图
- 标准库工程模板
有关STM32芯片GPIO的讲解可以看这篇文章:【STM32】SMT32标准库与HAL库对照学习教程特别篇–GPIO详讲
有关库函数工程模板的创建可以看这篇文章:【STM32】STM32标准库与HAL库对照学习教程二–库函数模板创建
标准库模板工程文件我已上传至百度网盘,网盘链接:https://pan.baidu.com/s/1Ok_wIMi1V1cVAHdGETPJzQ
密码:lob1
三、LED硬件威廉希尔官方网站
硬件原理图看自己的开发板
可以看到开发板的两个LED分别由PE5与PB5引脚控制,由原理图可知,当两引脚给低电平时,发光二级管LED导通,LED被点亮,给高电平时,LED灯熄灭。
四、使用标准库工程点亮LED灯
1、GPIO初始化一般步骤
打开对应GPIO引脚的时钟。
定义GPIO端口结构体变量。
配置结构体变量(设置IO、设置模式、设置速率)。
初始化GPIO函数。
2、GPIO标准库函数介绍
(1)GPIO外设库的文件:
stm32f10x_gpio.c、
stm32f10x_gpio.h
(2)GPIO常用标准库函数:
void GPIO_Init(GPIO_TypeDef* GPIOx,GPIO_InitTypeDef* GPIO_InitStruct)
功能:初始化一个或多个IO口(同一组端口)的工作模式、输出速度。
void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
功能:设置某个IO口为高电平(可同时设置同一端口的多个IO)。底层是通过配置BSRR寄存器。
void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
功能:设置某个IO口为低电平(可同时设置同一端口的多个IO)。底层是通过配置BSRR寄存器。
void GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin,
BitAction BitVal);
void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal);
功能:设置端口管脚输出电平,很少使用。
uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t
GPIO_Pin);
功能:读取端口中的某个管脚输入电平。底层是通过读取IDR寄存器。
uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx);
功能:读取某组端口的输入电平。底层是通过读取IDR寄存器。
uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t
GPIO_Pin);
功能:读取端口中的某个管脚输出电平。底层是通过读取ODR寄存器。
uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx);
功能:读取某组端口的输出电平。底层是通过读取ODR寄存器。
(3)使能GPIO时钟函数
void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState);
3、使用库函数编写程序使LED灯闪烁操作
(1)复制模板工程,重新命名为库函数点亮LED。
(2)在工程文件中新建一个App文件夹,专门用来存放外设文件。
(3)在App在新建一个LED文件夹用来存放LED的.c和.h文件。
这样做的好处是便于移植外设文件
(4)打开工程,新建文件,格式保存为.h,写入LED初始化申明部分。
- ①
- ②
- ③
程序:
#ifndef LED_H_
#define LED_H_
#include "stm32f10x.h"
/* 宏定义LED时钟端口、引脚的定义 */
#define LED0_GPIO_Port GPIOB
#define LED0_Pin GPIO_Pin_5
#define LED0_Port_RCC RCC_APB2Periph_GPIOB
#define LED1_GPIO_Port GPIOE
#define LED1_Pin GPIO_Pin_5
#define LED1_Port_RCC RCC_APB2Periph_GPIOE
void LED_Init(void); //LED初始化函数
#endif
- ①
- ②
程序:
#include "LED.h"
/*************************************************
*函数名: LED_Init
*函数功能: LED灯初始化函数
*输入: 无
*返回值: 无
**************************************************/
void LED_Init()
{
GPIO_InitTypeDef GPIO_InitStructure; //定义结构体变量
RCC_APB2PeriphClockCmd(LED0_Port_RCC|LED1_Port_RCC,ENABLE); //使能时钟
GPIO_InitStructure.GPIO_Pin=LED0_Pin; //选择设置LED0的IO口
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP; //设置推挽输出模式
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; //设置传输速率
GPIO_Init(LED0_GPIO_Port,&GPIO_InitStructure); /* 初始化GPIO */
GPIO_SetBits(LED0_GPIO_Port, LED0_Pin); //输出高电平,LED0熄灭
GPIO_InitStructure.GPIO_Pin=LED1_Pin; //选择设置LED1的IO口
GPIO_Init(LED1_GPIO_Port,&GPIO_InitStructure); /* 初始化GPIO */
GPIO_SetBits(LED1_GPIO_Port, LED1_Pin); //输出高电平,LED01熄灭
}
- ①
- ②
(7)编写主函数,并编译烧入程序。
程序:
#include "LED.h"
/*************************************************
*函数名: delay
*函数功能: 延时函数,通过while循环占用CPU,到达延时目的
*输入: i
*返回值: 无
**************************************************/
void delay(u32 i)
{
while(i--);
}
/*************************************************
*函数名: main
*函数功能: 主函数
*输入: 无
*返回值: 无
**************************************************/
int main()
{
LED_Init();
while(1)
{
GPIO_SetBits(LED0_GPIO_Port, LED0_Pin);
GPIO_ResetBits(LED1_GPIO_Port, LED1_Pin);
delay(6000000);
GPIO_SetBits(LED1_GPIO_Port, LED1_Pin);
GPIO_ResetBits(LED0_GPIO_Port, LED0_Pin);
delay(6000000);
}
}
- 编译后无错误,无警告,烧入程序到开发板。
我使用的普中提供的串口烧入软件
4、实验效果
五、使用cubemx生成HAL库工程点亮LED灯
有关cubemx一些使用可以看:【STM32】STM32标准库与HAL库对照学习教程二–库函数模板创建
有关cubemx功能部分,下面的配置不会多做介绍。
1、cubemx配置生成工程
(1)打开cubemx,点击ACCESS TO MCU SELECTOR。
(2)选择自己开发板的芯片。
(3)配置SYS。
(4)配置RCC,选择外部时钟。
(5)配置PB5、PE6引脚。
- ①
- ②
PE5操作相同
(6)点击GPIO配置模式。
PE5操作相同
(7)配置时钟树。
有关时钟树不懂的可以看这篇文章:【STM32】STM32标准库与HAL库对照学习教程特别篇–系统时钟RCC详讲
(8)点击Project Manager,配置文件,生成工程。
- ①
重点提醒:路径和工程名都不要带中文
- ②
2、HAL库控制函数介绍
(1)GPIO外设库的文件:
stm32f10xx_hal_gpio.h、
stm32f10xx_hal_gpio.c
(2)操作GPIO常用HAL库函数:
GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);
功能:读取一个引脚的电平。
void HAL_GPIO_WritePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState);
功能:写一个引脚的电平,可写高电平,也可以是低电平。
void HAL_GPIO_TogglePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);
功能:翻转一个引脚的电平。
3、编写使LED灯闪烁的程序
程序:
HAL_GPIO_WritePin(LED0_GPIO_Port,LED0_Pin,GPIO_PIN_RESET);
HAL_GPIO_WritePin(LED1_GPIO_Port,LED1_Pin,GPIO_PIN_SET);
HAL_Delay(500); //HAL库自带的ms级延时函数
HAL_GPIO_WritePin(LED0_GPIO_Port,LED0_Pin,GPIO_PIN_SET);
HAL_GPIO_WritePin(LED1_GPIO_Port,LED1_Pin,GPIO_PIN_RESET);
HAL_Delay(500);
编译后0错误0警告,烧入到开发板。
举报