控制GPIO就三步
1.RCC时钟使能
2.结构体配置GPIO寄存器
3.控制GPIO值
首先标准库写法
GPIO.c
这里注意推挽输出即可,然后 GPIO_Pin部分可以|来初始化列: GPIO_Pin_1| GPIO_Pin_2
就可以初始两个引脚
#include "stm32f10x.h" // Device headervoid 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_Hvoid 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)); //等待计数到0SysTick->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_Hvoid 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~P0GPIO_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 */
}
编译运行即可,效果一样