单片机学习小组
直播中

王健

7年用户 943经验值
私信 关注

如何用标准库工程与cubemx使LED闪烁?

如何用标准库工程与cubemx使LED闪烁?

回帖(1)

李焰

2022-2-8 15:32:36
一、前言

本章主要介绍如何使用标准库工程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分别由PE5PB5引脚控制,由原理图可知,当两引脚给低电平时,发光二级管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警告,烧入到开发板。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分