当前位置: 首页 > article >正文

STM32的GPIO使用

一、使用流程

1.使用RCC开启GPIO时钟

2.使用GPIO_Init 函数初始化GPIO

3.使用输出或输入函数控制GPIO口

二、RCC的常用函数

函数内容可通过这两个文件进行查看:

RCC常用函数如下:

void RCC_AHBPeriphClockCmd(uint32_t RCC_AHBPeriph, FunctionalState NewState);
//RCC_AHBPeriph 选择外设
/* For @b STM32_Connectivity_line_devices STM32互联型设备       
  *     @arg RCC_AHBPeriph_DMA1
  *     @arg RCC_AHBPeriph_DMA2
  *     @arg RCC_AHBPeriph_SRAM
  *     @arg RCC_AHBPeriph_FLITF
  *     @arg RCC_AHBPeriph_CRC
  *     @arg RCC_AHBPeriph_OTG_FS    
  *     @arg RCC_AHBPeriph_ETH_MAC   
  *     @arg RCC_AHBPeriph_ETH_MAC_Tx
  *     @arg RCC_AHBPeriph_ETH_MAC_Rx
  * 
  *   For @b other_STM32_devices, STM32其他设备       
  *     @arg RCC_AHBPeriph_DMA1
  *     @arg RCC_AHBPeriph_DMA2
  *     @arg RCC_AHBPeriph_SRAM
  *     @arg RCC_AHBPeriph_FLITF
  *     @arg RCC_AHBPeriph_CRC
  *     @arg RCC_AHBPeriph_FSMC
  *     @arg RCC_AHBPeriph_SDIO
*/
//NewState: 这个参数是ENABLE 或者 DISABLE


void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState);
// RCC_APB2Periph 选择外设,可选择外设如下
/* *     @arg RCC_APB2Periph_AFIO, RCC_APB2Periph_GPIOA, RCC_APB2Periph_GPIOB,
  *          RCC_APB2Periph_GPIOC, RCC_APB2Periph_GPIOD, RCC_APB2Periph_GPIOE,
  *          RCC_APB2Periph_GPIOF, RCC_APB2Periph_GPIOG, RCC_APB2Periph_ADC1,
  *          RCC_APB2Periph_ADC2, RCC_APB2Periph_TIM1, RCC_APB2Periph_SPI1,
  *          RCC_APB2Periph_TIM8, RCC_APB2Periph_USART1, RCC_APB2Periph_ADC3,
  *          RCC_APB2Periph_TIM15, RCC_APB2Periph_TIM16, RCC_APB2Periph_TIM17,
  *          RCC_APB2Periph_TIM9, RCC_APB2Periph_TIM10, RCC_APB2Periph_TIM11   
*/

void RCC_APB1PeriphClockCmd(uint32_t RCC_APB1Periph, FunctionalState NewState);
//RCC_APB1Periph  可选择外设
/*@arg RCC_APB1Periph_TIM2, RCC_APB1Periph_TIM3, RCC_APB1Periph_TIM4,
  *          RCC_APB1Periph_TIM5, RCC_APB1Periph_TIM6, RCC_APB1Periph_TIM7,
  *          RCC_APB1Periph_WWDG, RCC_APB1Periph_SPI2, RCC_APB1Periph_SPI3,
  *          RCC_APB1Periph_USART2, RCC_APB1Periph_USART3, RCC_APB1Periph_USART4, 
  *          RCC_APB1Periph_USART5, RCC_APB1Periph_I2C1, RCC_APB1Periph_I2C2,
  *          RCC_APB1Periph_USB, RCC_APB1Periph_CAN1, RCC_APB1Periph_BKP,
  *          RCC_APB1Periph_PWR, RCC_APB1Periph_DAC, RCC_APB1Periph_CEC,
  *          RCC_APB1Periph_TIM12, RCC_APB1Periph_TIM13, RCC_APB1Periph_TIM14
*/

三、GPIO函数

函数的内容可以通过这两个文件查看:

GPIO常用函数如下:

void GPIO_DeInit(GPIO_TypeDef* GPIOx);
//复位制定的GPIO外设

void GPIO_AFIODeInit(void);
//复位AFIO外设

void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct);
//GPIO的初始化函数
/*用结构体参数初始化GPIO口,需要先定义一个结构体变量,再给结构体赋值,再调用函数*/

void GPIO_StructInit(GPIO_InitTypeDef* GPIO_InitStruct);
//函数用于把结构体变量赋一个默认值

//GPIO的读取函数
uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);//读取GPIO口的输入状态,高电平为1,低电平为0
uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx);
uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);//读取GPIO口的输出状态,0表示低电平,1表示高电平
uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx);

//GPIO的写入函数
void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
void GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, BitAction BitVal);
void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal);

四、main函数

1.LED闪烁的main函数

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

int main(void)
{
    //GPIO的初始化操作
    //GPIO_A的时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
	//定一个GPIO结构体变量
	GPIO_InitTypeDef GPIO_InitStructure;
    //制定GPIO的工作模式
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//推挽输出,最常用的工作模式
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;//外设引脚编号
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//输出速度50MHz
    //初始化GPIO口
    //第一个参数:GPIOx: where x can be (A..G) to select the GPIO peripheral.
    //第二个参数:GPIO结构体变量
	GPIO_Init(GPIOC, &GPIO_InitStructure);
	
    //操作GPIO外设输入输出
	while (1)
	{
		GPIO_ResetBits(GPIOC, GPIO_Pin_13);//置低电平
		Delay_ms(2000);
		GPIO_SetBits(GPIOC, GPIO_Pin_13);//置高电平
		Delay_ms(500);
	
//		GPIO_WriteBit(GPIOC, GPIO_Pin_0, Bit_RESET);//置低电平
//		Delay_ms(500);
//		GPIO_WriteBit(GPIOC, GPIO_Pin_0, Bit_SET);//置高电平
//		Delay_ms(500);
//		
//		GPIO_WriteBit(GPIOC, GPIO_Pin_0, (BitAction)0);
//		Delay_ms(500);
//		GPIO_WriteBit(GPIOC, GPIO_Pin_0, (BitAction)1);
//		Delay_ms(500);
	}
}

2.LED流水灯的main函数

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

int main(void)
{
	/*开启时钟*/
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);	//开启GPIOA的时钟
    //使用各个外设前必须开启时钟,否则对外设的操作无效
	
	/*GPIO初始化*/
	GPIO_InitTypeDef GPIO_InitStructure;					//定义结构体变量
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;		//GPIO模式,赋值为推挽输出模式
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;				//GPIO引脚,赋值为所有引脚
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;		//GPIO速度,赋值为50MHz
	
	GPIO_Init(GPIOA, &GPIO_InitStructure);					//将赋值后的构体变量传递给GPIO_Init函数

	while (1)
	{
		/*使用GPIO_Write,同时设置GPIOA所有引脚的高低电平,实现LED流水灯*/
		GPIO_Write(GPIOA, ~0x0001);	//0000 0000 0000 0001,PA0引脚为低电平,其他引脚均为高电平,注意数据有按位取反
		Delay_ms(100);	
		GPIO_Write(GPIOA, ~0x0002);	//0000 0000 0000 0010,PA1引脚为低电平,其他引脚均为高电平
		Delay_ms(100);	
		GPIO_Write(GPIOA, ~0x0004);	//0000 0000 0000 0100,PA2引脚为低电平,其他引脚均为高电平
		Delay_ms(100);	
		GPIO_Write(GPIOA, ~0x0008);	//0000 0000 0000 1000,PA3引脚为低电平,其他引脚均为高电平
		Delay_ms(100);	
		GPIO_Write(GPIOA, ~0x0010);	//0000 0000 0001 0000,PA4引脚为低电平,其他引脚均为高电平
		Delay_ms(100);	
		GPIO_Write(GPIOA, ~0x0020);	//0000 0000 0010 0000,PA5引脚为低电平,其他引脚均为高电平
		Delay_ms(100);	
		GPIO_Write(GPIOA, ~0x0040);	//0000 0000 0100 0000,PA6引脚为低电平,其他引脚均为高电平
		Delay_ms(100);	
		GPIO_Write(GPIOA, ~0x0080);	//0000 0000 1000 0000,PA7引脚为低电平,其他引脚均为高电平
		Delay_ms(100);	
	}
}

3.蜂鸣器鸣叫

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

int main(void)
{
	/*开启时钟*/
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);	//开启GPIOB的时钟
	
	/*GPIO初始化*/
	GPIO_InitTypeDef GPIO_InitStructure;					//定义结构体变量
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;		//推挽输出模式
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;				//第12号引脚
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;		//50MHz
	
	GPIO_Init(GPIOB, &GPIO_InitStructure);					//将赋值后的构体变量传递给GPIO_Init函数
	
	while (1)
	{
		GPIO_ResetBits(GPIOB, GPIO_Pin_12);		//引脚设置为低电平,蜂鸣器鸣叫
		Delay_ms(100);							//延时100ms
		GPIO_SetBits(GPIOB, GPIO_Pin_12);		//引脚设置为高电平,蜂鸣器停止
		Delay_ms(100);							//延时100ms
		GPIO_ResetBits(GPIOB, GPIO_Pin_12);		//引脚设置为低电平,蜂鸣器鸣叫
		Delay_ms(100);							//延时100ms
		GPIO_SetBits(GPIOB, GPIO_Pin_12);		//引脚设置为高电平,蜂鸣器停止
		Delay_ms(700);							//延时700ms
	}
}

参考学习资料:[3-2] LED闪烁&LED流水灯&蜂鸣器_哔哩哔哩_bilibili 


http://www.kler.cn/a/295130.html

相关文章:

  • 动态规划与贪心算法:核心区别与实例分析
  • 力扣 LeetCode 27. 移除元素(Day1:数组)
  • 什么是 Real-Time Factor (RTF)
  • 009_SSH_Mysql图书管理系统(学生注册 借书 还书 绵阳)——lwplus87(免费送)
  • css:没错又是我
  • 【大数据学习 | HBASE高级】region split机制和策略
  • QT定时器QObiect/QTimer
  • 【环境领域EI稳定 I 院士主讲】第九届能源与环境研究进展国际学术会议(ICAEER 2024)
  • 【H2O2|全栈】关于HTML(1)认识HTML
  • 智能交通系统如何利用大数据、云计算和物联网技术优化交通流量、减少拥堵|智能交通系统|大数据|云计算|物联网|交通流量优化|减少拥堵
  • 记录一个前端学习小组的收集的模版
  • 在VB.net中,如何把20240906转化成日期格式
  • SSL和HTTPS是一样的吗?
  • 解决ruoyi框架中使用pagehelper插件分页查询后对数据进行对象转换后失效问题
  • 24程序员转行,首选为什么是它?
  • 深度学习TensorFlow框架
  • 分享MSSQL、MySql、Oracle的大数据批量导入方法及编程手法细节
  • 场外个股期权雪球结构期权产品原理
  • Linux 使用rsync拷贝文件
  • 【Linux】读者写者问题与读写锁
  • 探索大语言模型在心理健康状态评估的应用
  • 【线性代数】正定矩阵,二次型函数
  • IOS 21 发现界面(UITableView)单曲列表(UITableView)实现
  • Java项目: 基于SpringBoot+mybatis+maven学科竞赛管理系统(含源码+数据库+毕业论文)
  • 0x06 记录一次挖src的经历(xss漏洞)
  • 【机器人工具箱Robotics Toolbox开发笔记(十六)】SCARA机器人关节空间轨迹规划仿真实例