STM32 寄存器配置笔记——GPIO配置输出

一、概述

本文主要介绍GPIO 作为输出时的寄存器配置。包括时钟配置,输出模式配置。以STM32F10xxx系列为例,配置PA8、PD2端口作为输出,输出高/低电平。

二、配置流程

1)GPIO外设时钟

通过查找STM32F10xxx中文参考手册得知,GPIO PORT口的时钟配置在RCC_APB2ENR寄存器的第2~6位,如下图:

使能PORTA 和 PORTD 的时钟:

复制代码
RCC->APB2ENR |= 1 << 2;//enable portA clk
RCC->APB2ENR |= 1 << 5;//enable portD clk

2) 配置GPIO模式

PORT A的PIN 8和PORT D的PIN 2配置为通用推挽(PP)输出模式,GPIO速度配置为50MHZ。CRL寄存器配置的是PIN0~7,CRH寄存器配置的是PIN8~15。

复制代码
GPIOA->CRH &= 0xFFFFFFF0;
GPIOA->CRH |= 0x3;         //GPIO PORTA PIN 8 cfg PP & output 50MHZ
GPIOD->CRL &= 0xFFFFF0FF;
GPIOD->CRL |= 0x3 << 8;    //GPIO PORTD PIN 2 cfg PP & output 50MHZ

3)配置 IO口输出电平

有如下几种方式:

a)配置ODR寄存器

复制代码
GPIOA->ODR |= 1 << 8;//GPIO PORT A PIN8 cfg output level '1'
GPIOA->ODR &= ~(1 << 8);//GPIO PORT A PIN8 cfg output level '0'

GPIOD->ODR |= 1 << 2;//GPIO PORT D PIN2 cfg output level '1'
GPIOD->ODR &= ~(1 << 2);//GPIO PORT D PIN2 cfg output level '0'

b)配置BSRR和BRR寄存器

复制代码
	GPIOA->BSRR = 1 << 8;   //GPIO PORTA PIN8 cfg output level '1'
	GPIOA->BSRR = 1 << 24;  //GPIO PORTA PIN8 cfg output level '0'

	GPIOD->BSRR = 1 << 2;   //GPIO PORTD PIN2 cfg output level '1'
	GPIOD->BSRR = 1 << 18;  //GPIO PORTD PIN2 cfg output level '0'

注:如果出现同时配置BR2和BS2为1即端口需要置位且需要复位,则此时置位生效,电平输出为1。

复制代码
	GPIOA->BRR = 1 << 8;  //GPIO A PIN 8 cfg output level '0'
    GPIOD->BRR = 1 << 2;  //GPIO D PIN 2 cfg output level '0'

三、ODR和BSRR、BRR的区别

ODR 可读写,相对耗时序,BSRR和BRR只能写,但不耗时序。由上可知配置PA8输出电平。

ODR寄存器,配置的时候只需配置端口8,其它bit位要保持原样。因此操作如下:

复制代码
GPIOA->ODR |= 1 << 8;

读取ODR寄存器->或运算->写入

复制代码
(GPIOA->ODR |= 1 << 8

->

GPIOA->ODR = GPIOA->ODR | (1 << 8))

而BSRR和BRR寄存器只需:

复制代码
	GPIOA->BSRR = 1 << 8;
	GPIOA->BRR = 1 << 8;

赋值即可,因为如下特性:

在手册上有如下描述:

即用BSRR和BRR去改变管脚状态的时候,没有被中断打断的风险。也就不需要关闭中断。因为BSRR寄存器的操作只有一个动作赋值。

相关推荐
BackCatK Chen13 小时前
第 8 篇:TMC2240 电机正反转实现|DIR 引脚控制 + 代码优化(稳定不抖动)
stm32·单片机·嵌入式硬件·保姆级教程·电机正反转·tmc2240·dir引脚控制
星马梦缘13 小时前
EDA彩灯电路绘制
单片机·嵌入式硬件·物联网·pcb·eda·嘉立创
Forsete16 小时前
LINUX驱动开发#9——定时器
linux·驱动开发·单片机
Hello_Embed18 小时前
libmodbus 移植 STM32(USB 串口后端篇)
笔记·stm32·单片机·嵌入式·freertos·libmodbus
VekiSon19 小时前
Linux内核驱动——杂项设备驱动与内核模块编译
linux·c语言·arm开发·嵌入式硬件
来自晴朗的明天20 小时前
14、光耦隔离电路(EL3H7)
单片机·嵌入式硬件·硬件工程
G***技20 小时前
杰和IB3-272:以低功耗高性能打造新一代工业智能交互核心
单片机·嵌入式硬件·物联网
czhaii21 小时前
STC AI8052U单片机特点
单片机
MAR-Sky1 天前
keil5中数据的不同定义和单片机(以stc8为例)里的对应关系(idata,xdata,data,code)
单片机·嵌入式硬件
项目題供诗1 天前
51单片机入门(八)
单片机·嵌入式硬件·51单片机