02-GPIO-铁头山羊STM32标准库新版笔记

一、GPIO四种输出模式
image

GPIO有8种工作模式
image

输出:通过写0或者写1,控制引脚输出低电压或者高电压
输入:通过读取引脚是0还是1,判断引脚输入的是低电压还是高电压

通用:CPU
复用:其它片上外设

推挽:
image

开漏:
image

二、IO的最大输出速度
IO最大输出速度:向IO交替写0和1且输出不失真的最快速度
image

选取满足要求的最小值,过于陡峭的边沿会增加耗电、并引入EMI问题。

三、LED闪灯实验
image

image

image

板载LED的工作模式是通用输出开漏

image

点击查看代码
//引脚编号
GPIO_Pin_0~GPIO_Pin_15
 
//模式
GPIO_Mode_Out_PP        //通用输出推挽
GPIO_Mode_Out_OD        //通用输出开漏
GPIO_Mode_AF_PP         //复用输出推挽
GPIO_Mode_AF_OD         //复用输出开漏
GPIO_Mode_IPU_          //输入上拉
GPIO_Mode_IPD_          //输入下拉
GPIO_Mode_IN_FLOATING   //输入浮空
GPIO_Mode_AIN           //模拟模式
 
//最大输出速度
GPIO_Speed_2MHz
GPIO_Speed_10MHz
GPIO_Speed_50MHz
 
//向IO引脚写0/1  示例:PC13
GPIO_WriteBit(GPIOC,GPIO_Pin_13,Bit_RESET);
GPIO_WriteBit(GPIOC,GPIO_Pin_13,Bit_SET);
 
//读取IO引脚0/1
GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_13) == Bit_RESET;
GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_13) == Bit_SET;

效果:LED闪烁
main.c

点击查看代码
#include "stm32f10x.h"
#include "delay.h"

int main(void)
{
	Delay_Init();
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); // 开启GPIOC的时钟
	
	GPIO_InitTypeDef GPIO_InitStruct;  //初始化IO引脚
	
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_13;
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_2MHz;
	
	GPIO_Init(GPIOC, &GPIO_InitStruct);
	
	// GPIO_WriteBit(GPIOC, GPIO_Pin_13, Bit_SET);  //向IO引脚写1
	
	// GPIO_WriteBit(GPIOC, GPIO_Pin_13, Bit_RESET);  //向IO引脚写0
	
	while(1)
	{
		GPIO_WriteBit(GPIOC, GPIO_Pin_13, Bit_RESET); // 亮
		
		Delay(100); 
		
		GPIO_WriteBit(GPIOC, GPIO_Pin_13, Bit_SET); // 灭
		
		Delay(100); 
	}
}

delay.h

点击查看代码
#ifndef _DELAY_H_
#define _DELAY_H_

#include "stm32f10x.h"

    void Delay_Init(void); // 延迟函数初始化
    void Delay(uint32_t ms); // 延迟
uint64_t GetTick(void); // 获取系统的当前时间

#endif

delay.c

点击查看代码
#include "delay.h"

__IO uint64_t ulTicks;

static uint8_t delay_initialized_flag = 0;


//
// @简介:初始化延迟函数
// @返回值:无
//
void Delay_Init(void)
{
	if(!delay_initialized_flag)
	{
		delay_initialized_flag = 1;
		
		RCC_ClocksTypeDef clockinfo = {0};
		uint32_t tmp;
		
		SysTick->CTRL &= ~SysTick_CTRL_ENABLE; // 禁止SYSTICK

		ulTicks = 0;

		RCC_GetClocksFreq(&clockinfo);

		SysTick->CTRL |= SysTick_CTRL_TICKINT; // 开启中断

		// 设置中断优先级为0
		SCB->SHP[7] = 0;

		// 设置自动重装值以保证1ms的时钟
		tmp =  clockinfo.HCLK_Frequency / 1000;
		if(tmp > 0x00ffffff)
		{
			tmp = tmp / 8;
			SysTick->CTRL &= ~SysTick_CTRL_CLKSOURCE; 
		}
		else
		{
			SysTick->CTRL |= SysTick_CTRL_CLKSOURCE; 
		}
		SysTick->LOAD = tmp - 1;

		SysTick->CTRL |= SysTick_CTRL_ENABLE; 
	}
}


// @简介:毫秒级延迟
// @参数:Delay - 延迟时长,以毫秒为单位(千分之一秒)
// @返回值:无
// @注意:不允许在中断响应函数中调用此方法
void Delay(uint32_t Delay)
{
	Delay_Init();
	
	uint64_t expiredTime = ulTicks + Delay;

	while(ulTicks <  expiredTime){}
}

// @简介:获取当前时间,以毫秒(千分之一秒)为单位
// @参数:无
// @返回值:当前时间,单位为毫秒(千分之一秒)
uint64_t GetTick(void)
{
	Delay_Init();
	
	return ulTicks;
}
四、4种输入模式

五、按钮实验
image

image

PA0工作模式为通用输出推挽模式

image

image

效果:按下按钮,LED亮,松开按钮,LED灭
main.c

点击查看代码
#include "stm32f10x.h"

int main(void)
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);  //开启GPIOA的时钟
	
	GPIO_InitTypeDef GPIO_InitStruct;
	
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0;
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;  //输出推挽模式
	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_2MHz;
	GPIO_Init(GPIOA, &GPIO_InitStruct);  //初始化PA0
	
	// GPIO_WriteBit(GPIOA, GPIO_Pin_0, Bit_SET);  //向PA0写1,点亮LED
	
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_1;
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU;
	GPIO_Init(GPIOA, &GPIO_InitStruct);
	
	while(1)
	{
		if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_1) == Bit_RESET)  //按钮按下
		{
			GPIO_WriteBit(GPIOA, GPIO_Pin_0, Bit_SET);  //亮灯
		}
		else  //按钮松开
		{
			GPIO_WriteBit(GPIOA, GPIO_Pin_0, Bit_RESET);  //灭灯
		}
	}
}
posted @ 2025-10-22 13:53  有点闲  阅读(28)  评论(0)    收藏  举报