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

您所在的位置:网站首页 gpio_pupd STM32 GPIO的配置以及直流电机驱动的实现

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

#STM32 GPIO的配置以及直流电机驱动的实现| 来源: 网络整理| 查看: 265

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)芯片输出高电平,引脚相当 于悬空,芯片输出低电平,引脚等效于接VSS GPIOPuPd_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的L144 SystemCoreClock = 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);//0 GPIO_SetBits(GPIOC, A_1B);//1 GPIO_ResetBits(GPIOC, B_1A);//0 GPIO_SetBits(GPIOC, B_1B);//1 } /*控制车辆后退*/ void car_back(void) { GPIO_ResetBits(GPIOC, A_1B);//0 GPIO_SetBits(GPIOC, A_1A);//1 GPIO_ResetBits(GPIOC, B_1B);//0 GPIO_SetBits(GPIOC, B_1A);//1 } /*控制车辆停止*/ void car_stop(void) { GPIO_ResetBits(GPIOC, A_1B);//0 GPIO_ResetBits(GPIOC, A_1A);//0 GPIO_ResetBits(GPIOC, B_1B);//0 GPIO_ResetBits(GPIOC, B_1A);//0 } /*控制车辆左转*/ void car_turn_left(void) { GPIO_ResetBits(GPIOC, A_1A);//0 GPIO_SetBits(GPIOC, A_1B);//1 GPIO_ResetBits(GPIOC, B_1B);//0 GPIO_ResetBits(GPIOC, B_1A);//0 } /*控制车辆右转*/ void car_turn_right(void) { GPIO_ResetBits(GPIOC, A_1B);//0 GPIO_ResetBits(GPIOC, A_1A);//0 GPIO_ResetBits(GPIOC, B_1A);//0 GPIO_SetBits(GPIOC, B_1B);//1 } B);//0 GPIO_ResetBits(GPIOC, B_1A);//0 } /*控制车辆右转*/ void car_turn_right(void) { GPIO_ResetBits(GPIOC, A_1B);//0 GPIO_ResetBits(GPIOC, A_1A);//0 GPIO_ResetBits(GPIOC, B_1A);//0 GPIO_SetBits(GPIOC, B_1B);//1 }


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3