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实验总结等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)