GPIO控制,点亮LED灯
1、STM32CubeMX引脚设置和代码生成
1.正点原子mini开发板LED的电路图,正点原子mimi板的电路:LED0–PA8 LED1–PD2,且引脚为高电平时LED为暗,引脚为低电平时LED为亮。
2.在STM32CubeMX软件中,配置相对应的引脚及引脚相关模式GPIO_Output
,并在软件右侧对引脚进行详细配置,并在用户标签项User Label
中填进LED0
,这个标签项有利于帮助我们查看各个引脚的使用情况及相关代码的宏定义,相关的宏定义会在生成的代码main.h
中进行定义。
3.在STM32CubeMX软件右上角,点击GEBERATE CODE项,生成代码。
2、新建BSP文件夹目录,放置程序文件
1.在HAL_TEST
工程下新建BSP
文件夹,用于存放我们写的驱动程序
2.在BSP
文件夹内,新建LED
文件夹,用于放置我们写的点亮LED的相关程序代码
3.在MDK软件中,新建led.c
和led.h
文件,并放置在HAL_TEST/BSP/LED
文件夹内
3、链接C文件,h头文件的相对应路径
1.在MDK软件中,右键选择工程名HAL_TEST
,选择Manage Project Items
项,然后在添加组Group项,命名为Application/BSP
2.在新建的组Application/BSP
添加我们刚新建的led.c
,点击add
就会看见Files项会增加led.c
3.选择MDK软件界面的魔术棒选项,选择C/C++
,将led.h
的路径添加进去,此时选择的是到BSP的路径
4、编写C文件,h头文件
led.h
和led.h
文件的编写如下:
1.led.h
的编辑情况:
#ifndef __LED_H
#define __LED_H
#include "main.h"
#include "gpio.h"
#define LED0_ON HAL_GPIO_WritePin(LED0_GPIO_Port, LED0_Pin, GPIO_PIN_SET)
#define LED0_OFF HAL_GPIO_WritePin(LED0_GPIO_Port, LED0_Pin, GPIO_PIN_RESET)
#define LED0_Toggle HAL_GPIO_TogglePin(LED0_GPIO_Port, LED0_Pin)
#define LED1_ON HAL_GPIO_WritePin(LED1_GPIO_Port, LED1_Pin, GPIO_PIN_SET)
#define LED1_OFF HAL_GPIO_WritePin(LED1_GPIO_Port, LED1_Pin, GPIO_PIN_RESET)
#define LED1_Toggle HAL_GPIO_TogglePin(LED1_GPIO_Port, LED1_Pin)
void led_bling(uint32_t time);
void led_bling2(uint32_t time);
void led_bling3(uint32_t time);
void led_bling_sum(uint32_t sum,uint32_t time);
#endif
2.led.c
的编辑情况:这里使用头文件的路径为#include "LED\led.h"
,这个也是上面包含头文件时的路径,因为之后工程的所有驱动文件会放在HAL_TEST/BSP
文件夹下,故这样相对较为简便。
#include "LED\led.h"
// 正点原子mimi板的电路:LED0--PA8 LED1--PD2
/**************************************************************************
函数功能:LED闪烁
入口参数:闪烁时间(ms)
返回 值:无
说 明:采用原始数据对HAL库进行操作
**************************************************************************/
void led_bling(uint32_t time)
{
HAL_GPIO_WritePin((GPIO_TypeDef *) GPIOD,(uint16_t) GPIO_PIN_2,(GPIO_PinState) 0);
HAL_GPIO_WritePin((GPIO_TypeDef *) GPIOA,(uint16_t) GPIO_PIN_8,(GPIO_PinState) 0);
HAL_Delay(time);
HAL_GPIO_WritePin((GPIO_TypeDef *) GPIOD,(uint16_t) GPIO_PIN_2,(GPIO_PinState) 1);
HAL_GPIO_WritePin((GPIO_TypeDef *) GPIOA,(uint16_t) GPIO_PIN_8,(GPIO_PinState) 1);
HAL_Delay(time);
}
/**************************************************************************
函数功能:LED闪烁
入口参数:闪烁时间(ms)
返回 值:无
说 明:采用Cube中 User Labl 标签的对HAL库进行操作
**************************************************************************/
void led_bling2(uint32_t time)
{
HAL_GPIO_WritePin(LED0_GPIO_Port, LED0_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(LED1_GPIO_Port, LED1_Pin, GPIO_PIN_RESET);
HAL_Delay(time);
HAL_GPIO_WritePin(LED0_GPIO_Port, LED0_Pin, GPIO_PIN_SET);
HAL_GPIO_WritePin(LED1_GPIO_Port, LED1_Pin, GPIO_PIN_SET);
HAL_Delay(time);
}
/**************************************************************************
函数功能:LED闪烁
入口参数:闪烁时间(ms)
返回 值:无
说 明:采用宏定义,Cube中 User Labl 标签的对HAL库进行操作
**************************************************************************/
void led_bling3(uint32_t time)
{
//两个LED灯亮着
LED0_ON;
LED1_ON;
HAL_Delay(time);
//两个LED灯灭掉
LED0_OFF;
LED1_OFF;
HAL_Delay(time);
}
/**************************************************************************
函数功能:LED闪烁次数
入口参数:闪烁时间(ms)
返回 值:无
说 明:使用HAL库中的GPIO取反函数控制灯闪烁次数
**************************************************************************/
void led_bling_sum(uint32_t sum,uint32_t time)
{
for(int i=0;i<sum;i++)
{
HAL_Delay(time);
HAL_GPIO_TogglePin(LED0_GPIO_Port, LED0_Pin);
HAL_GPIO_TogglePin(LED1_GPIO_Port, LED1_Pin);
}
}
相关在STM32CubeMX的标签的宏定义会在生成的代码main.h
中进行定义,可以对生成工程中的main.h
进行查看,如下:
/* Private defines -----------------------------------------------------------*/
#define LED0_Pin GPIO_PIN_8
#define LED0_GPIO_Port GPIOA
#define LED1_Pin GPIO_PIN_2
#define LED1_GPIO_Port GPIOD
/* USER CODE BEGIN Private defines */
/* USER CODE END Private defines */
其中HAL库
中GPIO相关函数操作在MDK软件中的标签页中的Functions
中,stm32f1xx_hal_gpio.c
可以进行查看
5、添加相关函数,使用ST-Link烧录,点亮LED灯
在main.c
文件中进行编辑,添加头文件#include "LED\led.h"
,在white循环中添加点亮LED灯的相关c函数led_bling(500)
。切记,相关的代码要放在用户代码保护区中,避免重新使用STM32CubeMX生成代码是被覆盖删除。
/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "LED\led.h"
/* USER CODE END Includes */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
led_bling2(500);
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */