STM32(HAL库)流水灯配置及代码
目录
一、Cube_MX配置及其原理:
1.选择合适的芯片,左侧输入芯片型号,右侧选择LQFP144双击打开芯片配置
2.点亮流水灯只需要设置GPIO口的输出,选择需要的GPIO口,选择GPIO_OUTPUT即可;
3.设置GPIO_PIN名及速率:双击展开设置卡片,选择想要的配置,实现流水灯的配置要求较低,可如下配置。注意user Label的命名会在keil代码中展现(不要随意命名)
4.GPIO流水灯不需要对时钟进制配置,默认即可,点击Project Manager,注意对下面红线的配置
5.选择Code,下载最必要的库,减小内存占用
6.点击下载
7.打开文件
二、代码详情(可自行跳转到此处)
方法一、二均已在普中开发板上实现;
1.方法一:通过直接对引脚写高低电平点亮对应LED
在生成文件里面main.c里面添加以下代码即可:(已测试实现)
#include "main.h"
#include "gpio.h"
//将各管脚放入数组便于循环调用
uint16_t GPIO_PIN[]={ LED1_Pin,LED2_Pin,LED3_Pin,LED4_Pin
,LED5_Pin,LED6_Pin,LED7_Pin,LED8_Pin};
//使用数组调用来实现流水灯循环点亮控制
void LED_control(uint8_t number)
{
HAL_GPIO_WritePin(GPIOC, LED1_Pin|LED2_Pin|LED3_Pin|LED4_Pin
|LED5_Pin|LED6_Pin|LED7_Pin|LED8_Pin, GPIO_PIN_SET);
//此处也可直接点亮一灯,利用togglePin进行管脚状态取反(上述低电平在gpio.c已设置)
HAL_GPIO_WritePin(GPIOC,GPIO_PIN[number], GPIO_PIN_RESET);
//HAL_GPIO_TogglePin(GPIOC,GPIO_PIN[number]);
}
void SystemClock_Config(void);
int number=0;//数组变量
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
while (1)
{
LED_control(number);
HAL_Delay(1000);
number++;
if(number==8)//实现循环
{number=0;}
}
}
gpio.c:(不需要修改)
void MX_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
__HAL_RCC_GPIOC_CLK_ENABLE();
HAL_GPIO_WritePin(GPIOC, LED1_Pin|LED2_Pin|LED3_Pin|LED4_Pin
|LED5_Pin|LED6_Pin|LED7_Pin|LED8_Pin, GPIO_PIN_SET);
//此处的管脚初始状态可根据需求设置,LED1等名称为上述Cube_MX所设置的名称,非撰写
GPIO_InitStruct.Pin = LED1_Pin|LED2_Pin|LED3_Pin|LED4_Pin
|LED5_Pin|LED6_Pin|LED7_Pin|LED8_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_MEDIUM;
HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
}
2.方法二:这次我利用了标准库函数里面的GPIO_Write()函数来流水
main.c:
#include "main.h"
#include "gpio.h"
uint16_t GPIO_WEI[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};//高低位
void SystemClock_Config(void);
int LED_number=0;
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
while (1)//不断扫描
{
/* USER CODE END WHILE */
GPIO_Write(GPIOC,~GPIO_WEI[LED_number]);//直接对多个管脚置位
HAL_Delay(1000);
LED_number++;
if(LED_number==8)//循环流水
{LED_number=0;}
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}
GPIO_Write()函数可以对于多个接口置位,来实现高低电平操作,不需要频繁调取HAL_GPIO_WritePin()来实现。但GPIO_Write是标准库的函数,HAL库使用时需要于gpio.c写入函数。(gpio.c如下)
gpio.c:(添加下面此段即可)
void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal)
{
/* Check the parameters */
assert_param(IS_GPIO_ALL_PERIPH(GPIOx));
GPIOx->ODR = PortVal;
}
这里置位,用的0x01\0x02…..因为普中开发板只有8个LED循环点亮,若需要点亮16个管脚则可以用0x0001\0x0002…….相与。对于方法一来说,如果LED在同一GPIOx则方法二更为简单。
此处使用的普中STM32F103ZETx板: