求一个stm32的GPIO配置函数,就是使用这个函数可以配置任何一个GPIO端口(如下)

求一个stm32的GPIO配置函数,就是使用这个函数可以配置任何一个GPIO端口(如下),第1张

void config_gpio(u32 PORTx, u32 MODE, u32 PINxs, PULL_STAT stat)//PORTx=0,则代表GPIOA,类推。PINxs从0开始。MODE和stat见如下对照表,需要你自己实现PULL_STAT枚举型

{

    /IO配置对照,4bit一个引脚(y)

     高2位(CNFy):

    输入  00=模拟,01=浮空,10=上/下拉,11=保留

    输出        [推挽] [开漏]

           [通用]  00     01

        [复用]  10     11

     低2位(MODEy):

     输入  00

     输出  01=10MHz,10=2MHz,11=50MHz

    /

GPIO_TypeDef GPIOs[] = {GPIOA,GPIOB,GPIOC,GPIOD,GPIOE,GPIOF,GPIOG};

MODE|=stat<<2;

if(PINxs>15)

{

PINxs -= 8;

GPIOs[PORTx]->CRH = MODE<<(PINxs4);

}

else

{

GPIOs[PORTx]->CRL = MODE<<(PINxs4);

}

}

至于

void set_PINxs(u32 PORTx, u32 PINxs, PIN_VAL val)

{

}

可以用位带实现,如下:

保存为systemh

#ifndef __SYS_H

#define __SYS_H

#include "stm32f10xh" 

//0,不支持ucos

//1,支持ucos

#define SYSTEM_SUPPORT_UCOS 0 //定义系统文件夹是否支持UCOS

    

 

//位带 *** 作,实现51类似的GPIO控制功能

//具体实现思想,参考<<CM3权威指南>>第五章(87页~92页)

//IO口 *** 作宏定义

#define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x2000000+((addr &0xFFFFF)<<5)+(bitnum<<2)) 

#define MEM_ADDR(addr)  ((volatile unsigned long  )(addr)) 

#define BIT_ADDR(addr, bitnum)   MEM_ADDR(BITBAND(addr, bitnum)) 

//IO口地址映射

#define GPIOA_ODR_Addr    (GPIOA_BASE+12) //0x4001080C 

#define GPIOB_ODR_Addr    (GPIOB_BASE+12) //0x40010C0C 

#define GPIOC_ODR_Addr    (GPIOC_BASE+12) //0x4001100C 

#define GPIOD_ODR_Addr    (GPIOD_BASE+12) //0x4001140C 

#define GPIOE_ODR_Addr    (GPIOE_BASE+12) //0x4001180C 

#define GPIOF_ODR_Addr    (GPIOF_BASE+12) //0x40011A0C    

#define GPIOG_ODR_Addr    (GPIOG_BASE+12) //0x40011E0C    

#define GPIOA_IDR_Addr    (GPIOA_BASE+8) //0x40010808 

#define GPIOB_IDR_Addr    (GPIOB_BASE+8) //0x40010C08 

#define GPIOC_IDR_Addr    (GPIOC_BASE+8) //0x40011008 

#define GPIOD_IDR_Addr    (GPIOD_BASE+8) //0x40011408 

#define GPIOE_IDR_Addr    (GPIOE_BASE+8) //0x40011808 

#define GPIOF_IDR_Addr    (GPIOF_BASE+8) //0x40011A08 

#define GPIOG_IDR_Addr    (GPIOG_BASE+8) //0x40011E08 

 

//IO口 *** 作,只对单一的IO口!

//确保n的值小于16!

#define PAout(n)   BIT_ADDR(GPIOA_ODR_Addr,n)  //输出 

#define PAin(n)    BIT_ADDR(GPIOA_IDR_Addr,n)  //输入 

#define PBout(n)   BIT_ADDR(GPIOB_ODR_Addr,n)  //输出 

#define PBin(n)    BIT_ADDR(GPIOB_IDR_Addr,n)  //输入 

#define PCout(n)   BIT_ADDR(GPIOC_ODR_Addr,n)  //输出 

#define PCin(n)    BIT_ADDR(GPIOC_IDR_Addr,n)  //输入 

#define PDout(n)   BIT_ADDR(GPIOD_ODR_Addr,n)  //输出 

#define PDin(n)    BIT_ADDR(GPIOD_IDR_Addr,n)  //输入 

#define PEout(n)   BIT_ADDR(GPIOE_ODR_Addr,n)  //输出 

#define PEin(n)    BIT_ADDR(GPIOE_IDR_Addr,n)  //输入

#define PFout(n)   BIT_ADDR(GPIOF_ODR_Addr,n)  //输出 

#define PFin(n)    BIT_ADDR(GPIOF_IDR_Addr,n)  //输入

#define PGout(n)   BIT_ADDR(GPIOG_ODR_Addr,n)  //输出 

#define PGin(n)    BIT_ADDR(GPIOG_IDR_Addr,n)  //输入

//void NVIC_Configuration(void);

#endif

使用时直接:

PAout(0) = 0;

//或

a = PAin(0);

当然,你还可以使用STM32的库函数

要将GPIO这些口配置成输出状态,然后通过C写DATA寄存器的地址,比如6个进制为010101,那么就将

DATA = 0x15

一般DATA是一个32bit的寄存器,对应32个GPIO口

如果GPIO配置为输出,那么写DATA就对应输出相应电平,读DATA无效

如果GPIO配置为输入,那么读DATA就反映对应引脚电平,写DATA无效

1、写个按键检测函数,符合条件了

2、就进入流水灯的编程呗

3、比如简单点的直接就IO口通断这样控制(这里以GPIOA0到3为4个灯,高电平亮)

GPIO_SetBits(GPIOA,GPIO_Pin_0);

GPIO_ResetBits(GPIOA,GPIO_Pin_0);

delay(1000);

GPIO_SetBits(GPIOA,GPIO_Pin_1);

GPIO_ResetBits(GPIOA,GPIO_Pin_1);

delay(1000);

GPIO_SetBits(GPIOA,GPIO_Pin_2);

GPIO_ResetBits(GPIOA,GPIO_Pin_2);

delay(1000);

GPIO_SetBits(GPIOA,GPIO_Pin_3);

GPIO_ResetBits(GPIOA,GPIO_Pin_3);

delay(1000);

1、输入浮空            GPIO的配置可以在这里找到资料网页链接

2、输入上拉

3、输入下拉

4、模拟输入#

5、开漏输出

6、推挽输出

7、推挽式复用功能

8、开漏复用功能

AMD gpio pull 配置:一个总线上可以有很多设备,它们都是通过同一条总线进行沟通的。

譬如要控制A开关,BCD在收到GPIO信号之后认出这不是发给自己的,就会自动忽略之后的指令,A接收这个指令,哦,这是发给我的,之后就会执行接收到的指令(如A是一个通过芯片控制的LED灯,控制芯片就会控制点亮或熄灭)。

脉宽调制分类:

PWM又可分为单极性与双极性控制模式两种。产生单极性PWM模式的基本原理如图62所示。首先由同极性的三角波载波信号ut。

与调制信号ur,比较(图62中(a)),产生单极性的PWM脉冲(图62中(b));然后将单极性的PWM脉冲信号与图62中(c)所示的倒相信号UI相乘,从而得到正负半波对称的PWM脉冲信号Ud,如图62中(d)所示。

给你个配置举例:

void GPIO_I2C_Configuration(void)

{

GPIO_InitTypeDef GPIO_InitStructure;

/!< sEE_I2C Periph clock enable /

RCC_APB1PeriphClockCmd(sEE_I2C_CLK, ENABLE);

/!< sEE_I2C_SCL_GPIO_CLK and sEE_I2C_SDA_GPIO_CLK Periph clock enable /

RCC_AHB1PeriphClockCmd(sEE_I2C_SCL_GPIO_CLK | sEE_I2C_SDA_GPIO_CLK, ENABLE);

RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);

/ Reset sEE_I2C IP /

RCC_APB1PeriphResetCmd(sEE_I2C_CLK, ENABLE);

/ Release reset signal of sEE_I2C IP /

RCC_APB1PeriphResetCmd(sEE_I2C_CLK, DISABLE);

/!< GPIO configuration /

/!< Configure sEE_I2C pins: SCL /

GPIO_InitStructureGPIO_Pin = sEE_I2C_SCL_PIN;

GPIO_InitStructureGPIO_Mode = GPIO_Mode_AF;

GPIO_InitStructureGPIO_Speed = GPIO_Speed_25MHz;

GPIO_InitStructureGPIO_OType = GPIO_OType_OD;

GPIO_InitStructureGPIO_PuPd = GPIO_PuPd_NOPULL;

GPIO_Init(sEE_I2C_SCL_GPIO_PORT, &GPIO_InitStructure);

/!< Configure sEE_I2C pins: SDA /

GPIO_InitStructureGPIO_Pin = sEE_I2C_SDA_PIN;

GPIO_Init(sEE_I2C_SDA_GPIO_PORT, &GPIO_InitStructure);

/ Connect PXx to I2C_SCL/

GPIO_PinAFConfig(sEE_I2C_SCL_GPIO_PORT, sEE_I2C_SCL_SOURCE, sEE_I2C_SCL_AF);

/ Connect PXx to I2C_SDA/

GPIO_PinAFConfig(sEE_I2C_SDA_GPIO_PORT, sEE_I2C_SDA_SOURCE, sEE_I2C_SDA_AF);

}

GPIO_PinAFConfig(sEE_I2C_SCL_GPIO_PORT, sEE_I2C_SCL_SOURCE, sEE_I2C_SCL_AF); 这句语句分配为它的复用功能,可查看库 的函数定义和说明。

以上就是关于求一个stm32的GPIO配置函数,就是使用这个函数可以配置任何一个GPIO端口(如下)全部的内容,包括:求一个stm32的GPIO配置函数,就是使用这个函数可以配置任何一个GPIO端口(如下)、如何配置GPIO、ARMGPIO实验程序求帮填_单片机gpio实验总结等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zz/9761636.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-01
下一篇 2023-05-01

发表评论

登录后才能评论

评论列表(0条)

保存