本文共 3485 字,大约阅读时间需要 11 分钟。
General-purpose input/outputs一般除了 vcc gnd 这些管脚 ,其他所有管脚都支持gpio.vcc/vdd 和 gnd/vss 属于 supply pin其他管脚属于 I/O pin,其中极少数只能 Input大部分管脚能被作为 gpio 使用,还可以被复用为其他功能(例如,串口)管脚 功能 可能是普通的gpio ,也可能是 串口, pwm 功能,中断,中的一个或者复用.
是功能,由什么支撑的 IO口基本结构 请查询其中包括 (输入数据,输出数据,位设置,位清除)寄存器 ttl肖特基触发器 上下拉电阻 pmos nmos 保护二级管 .
// 比较简单,直接控制输出,没有时钟,#include//P0口输出0xFEP0 = 0xFE;
STM32F4 最多有 9 组 IO,分别用大写字母表示,即 x=A/B/C/D/E/F/G/H/I,每组16个IO口STM32F4 每组通用 I/O 端口包括 4 个 32 位配置寄存器(MODER、OTYPER、OSPEEDR 和 PUPDR) 2 个 32 位数据寄存器(IDR 和 ODR) 1 个 32 位置位/复位寄存器 (BSRR) 1 个 32 位锁定寄存器 (LCKR) 2 个 32 位复用功能选择寄存器(AFRH 和 AFRL) STM32F4 每组 IO 有 10 个 32 位寄存器控制 其中常用的有 4 个配置寄存器+2 个数据寄存器+2 个复用功能选择寄存器,共 8 个
// stm32f4xx_gpio.h// stm32f4xx_gpio.cvoid LED_Init(void){ GPIO_InitTypeDef GPIO_InitStructure; RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);//使能GPIOF时钟 //GPIOF9,F10初始化设置 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10;//LED0和LED1对应IO口 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//普通输出模式 GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉 // 配置 MODER、OTYPER、OSPEEDR 和 PUPDR GPIO_Init(GPIOF, &GPIO_InitStructure);//初始化GPIO // 操作 BSRRL 寄存器 GPIO_SetBits(GPIOF,GPIO_Pin_9 | GPIO_Pin_10);//GPIOF9,F10设置高,灯灭 // 操作 BSRRH 寄存器 GPIO_ResetBits(GPIOF,GPIO_Pin_9 | GPIO_Pin_10);//GPIOF9,F10设置低,灯亮 // GPIO_Write 操作 ODR寄存器}// 读输出 GPIO_ODR// 读输入 GPIO_IDR// GPIO_PinLockConfig 操作 LCKR// AFRH 和 AFRL 在 stm32f4xx_gpio.c 中没有
推挽输出和 开漏输出 有什么区别?为什么一般控制灯的时候用 推挽输出?stm32F4 的 gpio 为什么需要设置时钟 一般使用外设都去使能时钟 在 stm32f4xx_rcc.h 中 RCC_AHB1Periph_GPIOA - RCC_AHB1Periph_GPIOK 都属于 IS_RCC_AHB1_CLOCK_PERIPH如果使用的不是 引脚的 gpio 功能,需要配置 gpio 吗? 需要这几个参数的确定 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//普通输出模式 GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出 // 如果你要模拟 100M 速率的 总线,那么 需要设置 为 GPIO_Speed_100MHz; // 如果是 复用 uart ,则 需要设置 GPIO_Speed_2MHz 就可以了 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz // 也就是说你可以 10^8hz 操作gpio,一个周期 为 10^(-8)s , 就是 10^(-8) * 10^(9) nm = 10nm;??? GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉 // 一般是让当前的 线 失效, 空闲推挽输出:可以输出高,低电平,连接数字器件。 输出 0 时,N-MOS 导通,P-MOS 高阻,输出0。 输出 1 时,N-MOS 高阻,P-MOS 导通,输出1(不需要外部上拉电路)。开漏输出:输出端相当于三极管的集电极. 要得到高电平状态需要上拉电阻才行. 适合于做电流型的驱动,其吸收电流的能力相对强(一般20ma以内). 输出 0 时,N-MOS 导通,P-MOS 不被激活,输出0。 输出 1 时,N-MOS 高阻, P-MOS 不被激活,输出1(需要外部上拉电路);可以读IO输入电平变化,此模式可以把端口作为双向IO使用。 I2C控制器的两根引脚就应该是开漏输出,上拉电阻2.2K应该可以,如果小于1K的话,控I2C的时候引脚会一直为高或其他情况.
图1图2 中 阐述了 管脚 与功能的关系图3 阐述了 功能与寄存器的关系所以一般设置寄存器来控制 设置管脚的功能例如我们可以配置 0x1140 0000开始的四个字节中 的 31-28bit 为 0b0000 ,会直接配置为 0b1111,为EXT_INT1[7](注意,中断不是输入,虽然看起来是输入管脚,但是功能是中断,中断和输入是两个功能)例如我们可以配置 0x1140 0000开始的四个字节中 的 37-24bit 为 0b0001 ,来配置 XuCTSn[1]引脚的功能为 Output
gpa0[7] 设置为了 终端 ,gpa0[6] 设置为了 输出中断时可以 读 GPA0DAT[7] (此时要考虑是哪一方将 GPA0DAT[7] 还原)那么 就可以 设置 GPA0DAT[6] 为1,来讲gpa0[6]的引脚拉高且输出.
gpa0[7] 设置为中断,此时如果是上升沿触发,电平触发,则需要设置下拉, 15:14 设置为 0b01gpa0[6] 设置为输出,可以不设置,为 disable.默认为 下拉其实只要设置过一次,就不再是
上面是驱动能力,根据需要设置
一组寄存器如下,控制8个脚,一个寄存器控制8个脚的一个方面.所以设置一个脚,一般会设置6个寄存器,如果不设置,就使用默认值.GPD0CON: (模式寄存器)引脚功能 GPD0DAT: (数据寄存器)引脚输入或输出的数据 GPD0PUD: (上下拉寄存器) GPD0DRV: (驱动能力寄存器) GPD0CONPDN: (功耗相关寄存器) GPD0PUDPDN: (功耗相关寄存器)
#define GPFCON (*(volatile unsigned long *)0x56000050)#define GPFDAT (*(volatile unsigned long *)0x56000054)int main(){ GPFCON = 0x00000100; // 设置GPF4为输出口, 位[8:7]=0b01 GPFDAT = 0x00000000; // GPF4输出0,LED1点亮 return 0;}
转载地址:http://lengi.baihongyu.com/