STM32 GPIO的配置以及直流电机驱动的实现

article/2025/8/16 22:39:04

GPIO的配置以及直流电机驱动的实现

一、GPIO概述

GPIO:General-purpose input/output 通用型输入输出的简称
在这里插入图片描述
     功能类似8051的P0—P3,其接脚可以供使用者由程控自由使用,PIN脚依现实考量可作为通用输入(GPI)或通用输出(GPO)或通用输入与输出(GPIO),如当clk generator, chip select等。
     既然一个引脚可以用于输入、输出或其他特殊功能,那么一定有寄存器用来选择这些功能。对于输入,一定可以通过读取某个寄存器来确定引脚电位的高低;对于输出,一定可以通过写入某个寄存器来让这个引脚输出高电位或者低电位;对于其他特殊功能,则有另外的寄存器来控制它们。

1.GPIO寄存器

每个通用I/O 端口包括:
4 个32 位配置寄存器(GPIOx_MODER、GPIOx_OTYPER、GPIOx_OSPEEDR 和GPIOx_PUPDR)
2 个32 位数据寄存器(GPIOx_IDR 和GPIOx_ODR)
1 个32 位置位/复位寄存器(GPIOx_BSRR)
1 个32 位锁定寄存器(GPIOx_LCKR)
2 个32 位复用功能选择寄存器(GPIOx_AFRH 和GPIOx_AFRL)
但是由于本次实训采用固件库,不要求对寄存器有深入的了解

2.STM32F4xx GPIO功能

1)输入功能: 芯片通过GPIO引脚获取外部电路的工作状态(1/0)
在这里插入图片描述
2)输出功能:芯片通过GPIO引脚向外部电路输出一个电平状态(1/0)在芯片内部,采用是 数字信号 1/0
在这里插入图片描述
3)功能复用:指将通用IO接入其他的外设控制器,成为其它外设的功能引脚,而不再直接与芯片内部处理交流
4)模拟输入:用来获取外部电路的连续变化的状态,用于AD/DA,模拟信号转为数字信号或者反之

3.STM32F4xx 固件库接口

stm32f4xx_dsp_stdperiph_lib_um.chm是一个固件库接口说明“词典”
在这里插入图片描述

4.工作任务

     编写STM32程序,配置LED相应的引脚,并且控制LED灯的亮灭,实现闪烁和流水灯
在这里插入图片描述在这里插入图片描述
在这里插入图片描述
     查看电路原理图:STM32F4xx的芯片,总共有144个GPIO引脚,分为9组记作 GPIOA、GPIOB、GPIOC、……、GPIOI
     每组16个引脚,编号 0 ~ 15因此,GPIOA组的16个引脚,分别是 GPIOA0 GPIOA1GPIOA2…GPIOA15也可以简记为: PA0 PA1 PA2 … PA15
     由上述电路可知,本次使用的STM32开发板中的LED灯是共阳接法

在固件库中,实现GPIO引脚的配置和输出控制

1)使能GPIO外设时钟
在智能电子设备中,任何一个外设想要正常工作,都必须有一个时钟时钟对于外设控制器,等同于心脏对于人类

void RCC_AHB1PeriphClockCmd(uint32_t RCC_AHB1Periph, FunctionalState NewState)

在这里插入图片描述
2)初始化配置GPIO

void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct) @GPIOx:用来指定要配置的GPIO所在分组 GPIOA GPIOB ..GPIOI      @GPIO_InitStruct:指定GPIO初始化信息 结构体,其原型如下
typedef struct 
{uint32_t GPIO_Pin; //指定GPIO引脚编号 GPIO_Pin_0…… GPIO_Pin_15 GPIOMode_TypeDef GPIO_Mode; //指定GPIO 模式 typedef enum { GPIO_Mode_IN = 0x00, 输入功能 GPIO_Mode_OUT = 0x01, 输出功能GPIO_Mode_AF = 0x02, 复用功能 GPIO_Mode_AN = 0x03 模拟 }GPIOMode_TypeDef;GPIOSpeed_TypeDef GPIO_Speed;//指定GPIO 速率                     GPIO_Speed_100MHz GPIO_Speed_50MHz GPIO_Speed_25MHz GPIO_Speed_2MHz 20 GPIOOType_TypeDef GPIO_OType;//Output Type 输出类型GPIO_OType_PP 输出推挽:芯片 输出高电平,引脚等效于接VDD,芯片输出低电平,引 脚等效于接VSS (P-MOS和N-MOS都存在)GPIO_OType_OD 输出开漏:(P- MOS不存在,只有N-MOS)芯片输出高电平,引脚相当 于悬空,芯片输出低电平,引脚等效于接VSSGPIOPuPd_TypeDef GPIO_PuPd;//Pull-up Pull-down 上拉 下拉选择GPIO_PuPd_NOPULL 悬空,不接外 电路时,引脚电平状态不确定GPIO_PuPd_UP 带上拉,即使不接外 电路,引脚默认为高电平GPIO_PuPd_DOWN带下拉,即使不接 外电路,引脚默认为低电平
}GPIO_InitTypeDef;

例如:
将PF9引脚配置为 通用推挽输出

GPIO_InitTypeDef GPIO_InitStruct; 
/* 1.使能GPIOF组时钟 */ 
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GP IOF,ENABLE); 
/* 2.初始化配置GPIOF9通用推挽输出 */ 
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT; GPIO_InitStruct.GPIO_OType = GPIO_OType_PP; GPIO_InitStruct.GPIO_Speed = GPIO_Speed_100MHz; GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(GPIOF,&GPIO_InitStruct);

3)输出函数

GPIO_SetBits向指定GPIO引脚输出高电平 (置位) 
void GPIO_SetBits(GPIO_TypeDef * GPIOx, uint16_t GPIO_Pin GPIO_ResetBits想指定GPIO引脚输出低电 平(复位) 
void GPIO_ResetBits(GPIO_TypeDef * GPIOx, uint16_t GPIO_Pin)

例如:
PF9是共阳LED灯D1的控制引脚,配置好改引脚后,想要点亮D1
则:

void led_init(void)
{/*定义GPIO初始化信息结构体*/GPIO_InitTypeDef GPIO_InitStruct;/*1.使能GPIO组时钟*/RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE);/*2.初始化配置GPIO通用推挽输出*/GPIO_InitStruct.GPIO_Pin   =   GPIO_Pin_9 GPIO_InitStruct.GPIO_Mode  =   GPIO_Mode_OUT;GPIO_InitStruct.GPIO_OType =   GPIO_OType_PP;GPIO_InitStruct.GPIO_Speed =   GPIO_Speed_100MHz;GPIO_InitStruct.GPIO_PuPd  =   GPIO_PuPd_NOPULL;GPIO_Init(GPIOF, &GPIO_InitStruct);/*3.默认点亮LED*/GPIO_ResetBits(GPIOF, GPIO_Pin_9);}

主函数延时配置

int main(void)
{/*设置延时函数的延时单位SystemCoreClock /1000=》Delay函数是ms级延时SystemCoreClock/1000000 =>Delay函数是us级延时HSE_vALUE =>外部高速时钟改为8000000(8M,取决于硬件晶振大小) stm32f4xx.h的L144SystemCoreClock = HSE_VALUE / PLL_M* PLL_N /PLL_P*/SysTick_Config(SystemCoreClock/1000);/*初始化LED配置*/led_init();/* Infinite loop */while (1){GPIO_ResetBits(GPIOF, GPIO_Pin_9);Delay(1000);GPIO_SetBits(GPIOF, GPIO_Pin_9);Delay(1000);}
}

二、直流电机驱动原理

通过STM32单片机程序控制L9110驱动电机转动,
在这里插入图片描述
     利用STM32F407开发板的复位键边上有一组 “Camera”接口,可以用来连接L9110信号输入端口
在这里插入图片描述
在这里插入图片描述

工作任务

     在Carmera中找出4个GPIO引脚,用于连接L9110电机驱动模块的输入信号引脚,并且编写写程序配置改引脚,同时完成控制小车运动的函数的编写

#define A_1A GPIO_Pin_6
#define A_1B GPIO_Pin_7
#define B_1A GPIO_Pin_8
#define B_1B GPIO_Pin_9/*初始化控制GPIO*/
void control_init(void)
{/*定义GPIO初始化结构体*/GPIO_InitTypeDef GPIO_InitStruct;/*1.使能GPIOC组时钟*/RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE);/*2.初始化GPIO通用推挽输出*/GPIO_InitStruct.GPIO_Pin   =   A_1A | A_1B | B_1A | B_1B;GPIO_InitStruct.GPIO_Mode  =   GPIO_Mode_OUT;GPIO_InitStruct.GPIO_OType =   GPIO_OType_PP;GPIO_InitStruct.GPIO_Speed =   GPIO_Speed_100MHz;GPIO_InitStruct.GPIO_PuPd  =   GPIO_PuPd_NOPULL;GPIO_Init(GPIOC, &GPIO_InitStruct);/*3.默认复位*/GPIO_ResetBits(GPIOC, A_1A);GPIO_ResetBits(GPIOC, A_1B);GPIO_ResetBits(GPIOC, B_1A);GPIO_ResetBits(GPIOC, B_1B);
}/*控制车辆前进*/
void car_go(void)
{GPIO_ResetBits(GPIOC, A_1A);//0GPIO_SetBits(GPIOC, A_1B);//1GPIO_ResetBits(GPIOC, B_1A);//0GPIO_SetBits(GPIOC, B_1B);//1}/*控制车辆后退*/
void car_back(void)
{GPIO_ResetBits(GPIOC, A_1B);//0GPIO_SetBits(GPIOC, A_1A);//1GPIO_ResetBits(GPIOC, B_1B);//0GPIO_SetBits(GPIOC, B_1A);//1
}/*控制车辆停止*/
void car_stop(void)
{GPIO_ResetBits(GPIOC, A_1B);//0GPIO_ResetBits(GPIOC, A_1A);//0GPIO_ResetBits(GPIOC, B_1B);//0GPIO_ResetBits(GPIOC, B_1A);//0
}/*控制车辆左转*/
void car_turn_left(void)
{GPIO_ResetBits(GPIOC, A_1A);//0GPIO_SetBits(GPIOC, A_1B);//1GPIO_ResetBits(GPIOC, B_1B);//0GPIO_ResetBits(GPIOC, B_1A);//0
}/*控制车辆右转*/
void car_turn_right(void)
{GPIO_ResetBits(GPIOC, A_1B);//0GPIO_ResetBits(GPIOC, A_1A);//0GPIO_ResetBits(GPIOC, B_1A);//0GPIO_SetBits(GPIOC, B_1B);//1
}
B);//0GPIO_ResetBits(GPIOC, B_1A);//0
}/*控制车辆右转*/
void car_turn_right(void)
{GPIO_ResetBits(GPIOC, A_1B);//0GPIO_ResetBits(GPIOC, A_1A);//0GPIO_ResetBits(GPIOC, B_1A);//0GPIO_SetBits(GPIOC, B_1B);//1
}

http://chatgpt.dhexx.cn/article/gLRhiLw7.shtml

相关文章

lm298驱动电机c语言程序,机器人教程3:直流电机驱动及L298N模块

这一节我们主要介绍H桥电路,后面的章节我们会专门介绍到PWM调速问题。 3、H桥电路 电机做好后后引出两个极,如图5所示,给两个极能电就能够实现其转动,而改变其电源极性刚可以实现换向。 图5减速电机及电路图 前面我们说过必须要解决驱动力不足和换向问题,设计一般会采用两…

直流电机驱动电路

一、 直流电机驱动电路的设计目标 在直流电机驱动电路的设计中,主要考虑一下几点: 功能:电机是单向还是双向转动?需不需要调速?对于单向的电机驱动,只要用一个大功率三极管或场效应管或继电器直接带动电机即…

直流电机驱动保护方案

直流电机(direct current machine)是指能将直流电能转换成机械能或将机械能转换成直流电能(直流发电机)的旋转电机. 1.起动和调速性能好,调速范围广平滑,过载能力较强,受电磁干扰影响小; 2.直流电机具有良好的启动特性和调速特性;…

51单片机——直流电机驱动PWM

目录 一、功能描述 二、主要模块介绍 2.1 直流电机 2.1.1 直流电机外部 2.2 PWM介绍 2.2.1 产生PWM的方法 三、测试文件test.c 四、效果演示 一、功能描述 利用定时器产生PWM,对直流电机进行调速。 二、主要模块介绍 2.1 直流电机 直流电机是一种将电能转换为…

贰拾:直流电机的驱动

直流电机 直流电机是电机的主要类型之一,由于它具有良好的调速性能,在许多调速性能要求较高的场合,得到广泛应用。在电子制作中也较多设计到直流电机的使用。 当负载一定时,流过直流电机的平均电流越大,产生的力矩就…

直流电机的原理及驱动

文章目录 直流电机的原理直流电机的种类有刷电机无刷电机空心杯 直流减速电机减速器减速电机驱动器 直流电机的原理 在了解直流电机工作原理之前,先复习一下高中几个物理知识 第一.左手定则 通电导线处于磁场中时,所受安培力 F (或运动)的方向、磁感应…

tar,zip压缩命令

压缩解压 tar tar这个命令并没有压缩的功能,它只是一个打包的命令,但是在tar命令中增加一个选项(-z)可以调用gzip实现了一个压缩的功能,实行一个先打包后压缩的过程。 文件压缩解压:bzip2 压缩用法:tar jcvf 压缩包包…

linux 压缩根目录文件,Linux操作系统下如何压缩文件? zip压缩命令使用

Linux zip命令用于压缩文件。 zip是个使用广泛的压缩程序,文件经它压缩后会另外产生具有”.zip”扩展名的压缩文件。 在linux操作系统中,使用zip命令进行文件压缩时,你可能会遇到下面的报错: zip I/O error: Permission denied zip error: Could not create output file (/…

linux命令zip如何使用,linux zip压缩命令如何使用

linux zip压缩命令的使用方法:1、使用zip打包文件夹,代码为【zip -r -q -o pack.zip mark/】;2、使用【-e】参数可以创建加密压缩包,代码为【zip -r -e o packencryption.zi】。 本教程操作环境:linux7.3系统、DELL G3…

Linux系统zip压缩命令

不管是在 Windows 系统还是 Linux 系统中,我们常常会有一些大文件,特别占磁盘空间,对于这种占用空间大的文件我们很多时候就要用到 ZIP(压缩文件格式),ZIP 文件格式是一种数据压缩和文档储存的文件格式。除…

内部总线(双向数据总线)

由于计算机内部的主要工作过程是信息传送和加工的过程,因此在机器内部各部件之司的数据传送非常频繁。为了减少内部数据传送线并便于控制,通常将一些寄存器之间数据传送的通路加以归并,组成总线结构,使不同来源的信息在此传输线上…

企业服务总线相关理论和技术的研究

企业服务总线相关理论和技术的研究 摘 要 随着社会信息化进程的进一步加快和信息化技术的不断进步,很多企业发现在引进新的应用和系统的同时,如何保证公司旧有的应用和系统不被全部抛弃或替换是节省公司运作成本,有效利用公司资源的重要手段。…

业务集成中间件软件的新锐:企业服务总线

业务集成中间件软件的新锐:企业服务总线 2009-04-13 作者:董云卫 来源:amteam.org 企业应用集成(EAI)是近年来增长最快的软件市场之一,这是因为许多企业的应用系统不能互联,制约了企业信息系统的…

企业服务总线需求说明

 企业服务总线需求说明 Enterprzise Service Bus 1 ESB的主要作用 ESB主要解决多终端多系统的相互调用问题,减少系统间的耦合,添加可维护性。 2 ESB的核心需求 ESB的核心需求主要包含:服务调用与数据适配、服…

数据总线学习

为啥要数据总线 使用服务化方式发布,业务端和中间件完全解耦合。一处生产,处处消费设计理念。提供用户可定制的托管化通用消费方案(如同步mysql到缓存,同步mysql到es,消费mysql到大数据等托管服务) 特性 …

地址总线数据总线控制总线_大数据:信息总线上的一切

地址总线数据总线控制总线 对短期有利的东西对长期不利。 棒球的一个简单例子: 很明显,类固醇增强了性能,许多球员转向了“果汁”,以推动他们的短期表现。 但是,他们很快了解到这是不可持续的。 一旦停止或过度使用它…

地址总线、数据总线、控制总线详细解释

摘自某位大神,共同学习三种总线的相关知识: 其中地址总线通过CPU和内存的图示形式表示更方便理解记忆 在地址总线和数据总线相同的前提下,32位CPU(数据总线为32位)的最大支持寻址空间为2^32,即最大支持4…

阿里十年技术沉淀|深度解析百PB级数据总线技术

云原生场景下数据总线需求场景及挑战 数据总线简介 数据总线作为大数据架构下的流量中枢,在不同的大数据组件之间承载着数据桥梁的作用。通过数据总线,可以实时接入来自服务器、K8s、APP、Web、IoT/移动端等产生的各类异构数据,进行统一数据…

数据仓库系列文章二:浅谈企业数据仓库总线矩阵

Kinball在《数据仓库工具箱》一书中,详细阐述维度建模思想,并给出维度建模的众多实践。维度建模的核心内容和建设过程在实践中已经被大家所熟知,网上教程也很多,本文不做赘述。本文重点谈一谈企业数据仓库总线矩阵。 企业数据仓库…

企业数据仓库总线架构、总线矩阵笔记 (第三篇)

一、总线架构 维度建模的数据仓库中,有一个概念叫Bus Architecture,中文一般翻译为“总线架构”。总线架构是Kimball的多维体系结构(MD)中的三个关键性概念之一,另两个是一致性维度(Conformed Dimension&a…