STM32(HAL库)流水灯配置及代码

目录

一、Cube_MX配置及其原理:

二、代码详情(可自行跳转到此处)


一、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板:

物联沃分享整理
物联沃-IOTWORD物联网 » STM32(HAL库)流水灯配置及代码

发表评论