历史上的今天
今天是:2025年08月14日(星期四)
2018年08月14日 | STM32F103ZET6 —— GPIO
2018-08-14 来源:eefocus
STM32 的 GPIO 可以由软件配置成为几种不同的模式,每个I/O端口位可以自由编程,然而I/0端口寄存器必须按32位字被访问:
A. 芯片侧:
1. 输入:
| MODE | Descriptions |
|---|---|
| 输入浮空 | 引脚配置成为浮空状态,接施密特触发器,常用的场景是外接按键 |
| 输入上拉 | 输入接上拉电阻,将不确定的信号钳位到高电平 |
| 输入下拉 | 输入接下拉电阻,将不确定的信号钳位到低电平 |
| 模拟输入 | 信号直接进入ADC模块,即无法再输入寄存器中读到IO口的状态 |
2. 输出:
| MODE | Descriptions |
|---|---|
| 开漏输出 | 所谓开漏,指MOSFET漏极。IO输出1时,悬空,需要外部电路上拉电阻方可实现高电平的输出(低电平接地)。 一般用于电平不匹配情况,通过外部上下拉电阻来实现不同电平输出。 |
| 推挽输出 | 输出 0 接GND,输出 1 接 VCC(即0=》GND,1=》3.3V) |
| 开漏复用 | PinMux 到其他功能使用 |
| 推挽复用 | PinMux 到其他功能使用 |
B. 硬件侧:
对应的单板,有两个GPIO连接到LED上:
使用的是 GPIO 的 Port G 的 Pin13 和 Pin14 脚
C. 代码侧:
配置上述两个 GPIO 工作需要的步骤如下:
1. 使能对应的 GPIO_G 的时钟
2. 配置 GPIO_G13/GPIO_G14 为通用推挽输出,配置口线翻转速度50M
3. 配置完成后,设置端口的输出为1/0即可控制 GPIO 的输出。
1. 时钟设置:
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOG , ENABLE); // 此处 RCC_APB2Periph_GPIOG 为 (0x01 << 8)
void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState)
{
/* Check the parameters */
assert_param(IS_RCC_APB2_PERIPH(RCC_APB2Periph));
assert_param(IS_FUNCTIONAL_STATE(NewState));
if (NewState != DISABLE)
{
RCC->APB2ENR |= RCC_APB2Periph;
}
else
{
RCC->APB2ENR &= ~RCC_APB2Periph;
}
}
2. 配置 GPIO_G13/GPIO_G14 为通用推挽输出,50M速度
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13|GPIO_Pin_14;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOG, &GPIO_InitStructure);
3. 配置输出:
STM32 配置 GPIO 的输出1/0,提供了多种方式,有端口直接写入1/0的寄存器(GPIOx_ODR),也有专门设置 1 值的寄存器(GPIOx_BSRR),同样有专用用于设置 0 值的寄存器(GPIOx_BRR)。可以随意使用:
#define LED1_ON GPIO_SetBits(GPIOG, GPIO_Pin_13);
#define LED1_OFF GPIO_ResetBits(GPIOG, GPIO_Pin_13);
#define LED2_ON GPIO_SetBits(GPIOG, GPIO_Pin_14);
#define LED2_OFF GPIO_ResetBits(GPIOG, GPIO_Pin_14);
void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
{
/* Check the parameters */
assert_param(IS_GPIO_ALL_PERIPH(GPIOx));
assert_param(IS_GPIO_PIN(GPIO_Pin));
GPIOx->BSRR = GPIO_Pin;
}
void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
{
/* Check the parameters */
assert_param(IS_GPIO_ALL_PERIPH(GPIOx));
assert_param(IS_GPIO_PIN(GPIO_Pin));
GPIOx->BRR = GPIO_Pin;
}
基本的使用方式如上述,后续再在具体的外设部分,在介绍 GPIO 的复用功能
史海拾趣
|
关于视频系统处理器选择的建议基于ARM核心的Freescale的i.MX系列芯片是视频应用的佼佼者。 比如i.MX27和i.MX31 i.MX27嵌入式开发板是高清视频输入输出的首选,i.mx27芯片提供了更高的灵活性和更强大的多媒体处理能力,成为IP视频和语音(V2IP)、移 ...… 查看全部问答> |
|
关于7行5列LED键盘指示灯的编程,请高手解惑!十万火急!万分感谢! 7行5列的LED键盘指示灯,键按下时相应的LED指示灯也会亮! 灯亮的原则:列为高电平,行为低电平。 我想问的是,如果我知道了第0行第0列的键按下了,想要第0行第0列的灯亮,那么是不是应该让列所在的存储器第0位置1,其余列置0!即将0x01输入到相 ...… 查看全部问答> |
|
单片机的用途非常广阔,各种智能控制的产品中都少不了它的身影,前景看好,因此引起了一阵阵学习单片机的热潮。 相信很多初学单片机的朋友都是从做流水灯开始的,因为流水灯的电路较为简单。看着按照自己的设想做成的流水灯变幻着不同的花样, ...… 查看全部问答> |
|
如题, 望版主推荐 一直以来,因ARM开发板每次换屏的时候都要重新生成NK,有没人做过在板子上驱动一个显卡IC来驱动LCD? 如果有,IC型号大家了解的有哪些? 如果增加了这个显卡IC,那么原来的Display驱动还要不要? 大家一起讨论讨论,突然想 ...… 查看全部问答> |
|
关于vs2005开发windows ce 5程序部署到机器的问题 1:首先非常感谢您的帮助,同时我找遍了google和baidu,没有找到,或许是关键字搜索的不好。所以来此提问。 2:问题描述如下 机器是广州市微嵌计算机科技的Arm9 的硬件系统,采用的是windows ce 5.0。该设备有一个特点是会将hwDir目 ...… 查看全部问答> |
|
小弟要实现如下功能: 当我点击打印操作时,程序弹出一个对话框,显示正在打印,在打印的过程中,必须使程序无法响应用户的其它任何操作。当打印结束时,显示打印成功或打印失败,然后才让程序可以继续响应用户其它操作。 请问这个如何解决哈? … 查看全部问答> |




