控制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 */
}
编译运行即可,效果一样