江科大学习笔记之——标准库以及其HAL库LED流水灯

发布于:2025-02-10 ⋅ 阅读:(55) ⋅ 点赞:(0)

控制GPIO就三步

1.RCC时钟使能

2.结构体配置GPIO寄存器 

3.控制GPIO值

首先标准库写法

GPIO.c

这里注意推挽输出即可,然后 GPIO_Pin部分可以|来初始化列: GPIO_Pin_1| GPIO_Pin_2

就可以初始两个引脚

#include "stm32f10x.h"                  // Device header

void gpio_Init(void)
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//1.RCC时钟使能
	
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA,&GPIO_InitStructure);			 	//2.结构体配置GPIO寄存器
	
	GPIO_SetBits (GPIOA,GPIO_Pin_All);					//3.控制GPIO值为1
	//GPIO_ResetBits (GPIOA,GPIO_Pin_1);					//3.控制GPIO值为0
}

GPIO.h

#ifndef __GPIO_H
#define __GPIO_H

void gpio_Init(void);

#endif

对于delay基本上都是一样的我这里给大家列出来直接粘贴用就可以

#include "stm32f10x.h"

/**
  * @brief  微秒级延时
  * @param  xus 延时时长,范围:0~233015
  * @retval 无
  */
void Delay_us(uint32_t xus)
{
	SysTick->LOAD = 72 * xus;				//设置定时器重装值
	SysTick->VAL = 0x00;					//清空当前计数值
	SysTick->CTRL = 0x00000005;				//设置时钟源为HCLK,启动定时器
	while(!(SysTick->CTRL & 0x00010000));	//等待计数到0
	SysTick->CTRL = 0x00000004;				//关闭定时器
}

/**
  * @brief  毫秒级延时
  * @param  xms 延时时长,范围:0~4294967295
  * @retval 无
  */
void Delay_ms(uint32_t xms)
{
	while(xms--)
	{
		Delay_us(1000);
	}
}
 
/**
  * @brief  秒级延时
  * @param  xs 延时时长,范围:0~4294967295
  * @retval 无
  */
void Delay_s(uint32_t xs)
{
	while(xs--)
	{
		Delay_ms(1000);
	}
} 

delay.h

#ifndef __DELAY_H
#define __DELAY_H

void Delay_us(uint32_t us);
void Delay_ms(uint32_t ms);
void Delay_s(uint32_t s);

#endif

mian()

这里我实现了单个灯亮的流水灯和两个灯亮的流水灯,建议大家用数组和循环写

0003是因为我们点亮P0,P1,0011是3

000C是因为点亮P2,P3,1100是C

0018是点亮P3,P4,0000 0000 0001 1000是0x0018

#include "stm32f10x.h"                  // Device header
#include "GPIO.h"  
#include "Delay.h"  

int main ()
{
	gpio_Init();
	uint8_t A[4]={~0x0003,~0x0006,~0x000c,~0x0018};
	uint8_t i;
	while(1)
	{
		//~(0000 0000 0000 0001)取反是因为低电平点亮,从高到低P15~P0
		GPIO_Write(GPIOA, ~0x0001);
		Delay_ms (500);
		GPIO_Write(GPIOA, ~0x0002);
		Delay_ms (500);
		GPIO_Write(GPIOA, ~0x0004);
		Delay_ms (500);
		GPIO_Write(GPIOA, ~0x0008);
		Delay_ms (500);
		GPIO_Write(GPIOA, ~0x0010);
		Delay_ms (500);
		
		for (i=0;i<4;i++)
		{
			GPIO_Write(GPIOA, A[i]);
			Delay_ms (500);	
		}
		
		
	}
}
 

标准库的原理明白了其实HAL库也是一模一样的非常简单,主要是流程配置大家可能不会,那我就把具体流程配置都截图出来

HAL库写法

点击FinIsh

2.配置时钟

3.配置GPIO

我们使用GPIOA的0~4,默认高电平

4.设置单独输出.C.H文件

5.ctrl+s生产代码

6.写代码

我没有看到HAL库写寄存器的函数,只有写单独一个引脚的于是:我用关闭所有灯,然后开所有灯的方式进行等效操作,

其实应该GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_4,避免改变其他GPIO的值,只是我这里其他GPIO口没使用,我就用GPIO_PIN_All了。

		HAL_GPIO_WritePin(GPIOA, GPIO_PIN_All , GPIO_PIN_SET);
	  	HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_RESET);
	  	HAL_Delay(500);

if里面我本想用 ~0x0001;~0x0002去判断,但是不行,编译没错误,但是进不去IF可能是条件不对,于是我就改为1,2,3,4了

int main(void)
{

  /* USER CODE BEGIN 1 */
	uint8_t A[4]={1,2,3,4};
	uint8_t i;
  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  /* USER CODE BEGIN 2 */

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

		HAL_GPIO_WritePin(GPIOA, GPIO_PIN_All , GPIO_PIN_SET);
	  	HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_RESET);
	  	HAL_Delay(500);

		HAL_GPIO_WritePin(GPIOA, GPIO_PIN_All , GPIO_PIN_SET);
	  	HAL_GPIO_WritePin(GPIOA,GPIO_PIN_1, GPIO_PIN_RESET);
	  	HAL_Delay(500);

		HAL_GPIO_WritePin(GPIOA, GPIO_PIN_All , GPIO_PIN_SET);
	  	HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_RESET);
	  	HAL_Delay(500);

		HAL_GPIO_WritePin(GPIOA, GPIO_PIN_All , GPIO_PIN_SET);
	  	HAL_GPIO_WritePin(GPIOA, GPIO_PIN_3, GPIO_PIN_RESET);
	  	HAL_Delay(500);

		HAL_GPIO_WritePin(GPIOA, GPIO_PIN_All , GPIO_PIN_SET);
	  	HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_RESET);
	  	HAL_Delay(500);

	  for(i=0;i<4;i++)
	  {
		  if(A[i] == 1)
		  {
			HAL_GPIO_WritePin(GPIOA, GPIO_PIN_All, GPIO_PIN_SET);
		  	HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0|GPIO_PIN_1, GPIO_PIN_RESET);
		  	HAL_Delay(500);
		  }
		  else if(A[i] == 2)
		  {
		  	HAL_GPIO_WritePin(GPIOA, GPIO_PIN_All, GPIO_PIN_SET);
		  	HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1|GPIO_PIN_2, GPIO_PIN_RESET);
		  	HAL_Delay(500);
		  }
		  else if(A[i] == 3)
		 {
			 HAL_GPIO_WritePin(GPIOA, GPIO_PIN_All, GPIO_PIN_SET);
			 HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2|GPIO_PIN_3, GPIO_PIN_RESET);
			 HAL_Delay(500);
		 }
		  else if(A[i] == 4)
			 {
				 HAL_GPIO_WritePin(GPIOA, GPIO_PIN_All, GPIO_PIN_SET);
				 HAL_GPIO_WritePin(GPIOA, GPIO_PIN_3|GPIO_PIN_4, GPIO_PIN_RESET);
				 HAL_Delay(500);
			 }
	  }


    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}

编译运行即可,效果一样