file-type

STM32F10x GPIO寄存器详解与Linux服务器搭建

PDF文件

下载需积分: 42 | 3.86MB | 更新于2024-08-09 | 156 浏览量 | 36 下载量 举报 收藏
download 立即下载
"GPIO寄存器结构-用centos_(linux)搭建服务器的详细教程" 本文档主要介绍了STM32微控制器中GPIO(通用输入输出)寄存器的结构及其在固件库中的使用,特别关注了STM32F101xx和STM32F103xx系列。这些寄存器是STM32处理器控制GPIO引脚状态的关键组成部分,对于理解STM32的硬件接口编程至关重要。 GPIO寄存器结构如下: 1. GPIO_TypeDef 结构体定义了GPIO端口的各个寄存器: - CRL(端口配置低寄存器):用于配置GPIO引脚的模式和输出速度,低8位对应端口A-F的低4位引脚。 - CRH(端口配置高寄存器):同CRL,但控制高4位引脚。 - IDR(端口输入数据寄存器):读取引脚的输入状态。 - ODR(端口输出数据寄存器):设置或读取引脚的输出状态。 - BSRR(端口位设置/复位寄存器):快速设置或复位单个GPIO位。 - BRR(端口位复位寄存器):复位GPIO位。 - LCKR(端口配置锁定寄存器):锁定或解锁GPIO配置,防止意外修改。 2. AFIO_TypeDef 结构体包含了复用和外部中断相关的寄存器: - EVCR(事件控制寄存器):配置GPIO的复用功能和事件控制。 - MAPR(复用重映射和调试I/O配置寄存器):用于改变某些GPIO引脚的默认功能。 - EXTICR(外部中断线路配置寄存器):选择外部中断线路上的GPIO引脚。 STM32的GPIO外设在内存映射中位于特定地址,例如AFIO_BASE、GPIOA_BASE到GPIOE_BASE,这些地址是在“stm32f10x_map.h”文件中定义的。这些基地址加上偏移量即可访问到对应的GPIO寄存器。 固件库(firmware library)是STM32微控制器开发的重要工具,它包含了一系列的函数、数据结构和宏,简化了对GPIO和其他外设的操作。固件库的API(应用编程接口)提供了统一的接口,使得开发者能更方便地控制GPIO功能,而无需深入了解底层硬件细节。同时,固件库实现了输入值的实时校验,增强了软件的健壮性,但也可能增加代码体积和运行时的开销,这可以通过在最终应用中优化或移除相关校验来平衡。 STM32的固件库适用于广泛的开发环境,其源代码遵循“Strict ANSI-C”标准,且符合MISRA-C2004编码规范。库的灵活性使得开发者既可以使用预编译的库函数,也可以根据需求进行定制,以满足特定应用对于代码大小和执行效率的严格要求。 总结来说,STM32的GPIO寄存器结构和固件库是实现与外部设备交互的基础,为开发者提供了便利的接口和工具,帮助他们高效地利用STM32的GPIO功能。了解这些寄存器的含义和使用方法是开发基于STM32系统的关键步骤。

相关推荐

filetype

/** *函数功能:初始化引脚模式 *参数说明:GPIOx,该参数为GPIO_TypeDef类型的指针,指向GPIO端口的地址 * GPIO_InitTypeDef:GPIO_InitTypeDef结构体指针,指向初始化变量 */ void GPIO_Init(GPIO_TypeDef* GPIOx,GPIO_InitTypeDef* GPIO_InitStruct) { //pinpos:用于循环遍历GPIO引脚的位位置(0到15) //pos:用于生成一个掩码,表示当前正在处理的引脚 //currentpin:用于存储当前处理的引脚与配置引脚的交集 uint32_t pinpos = 0x00, pos = 0x00 , currentpin = 0x00; for(pinpos = 0x00;pinpos<16;pinpos++) { /*以下运算是为了通过 GPIO_InitStruct->GPIO_Pin 算出引脚号0-15*/ /*经过运算后pos的pinpos位为1,其余为0,与GPIO_Pin_x宏对应。pinpos变量每次循环加1,*/ pos = (uint32_t)0x01<<pinpos //0000 0000 0000 0000 //0000 0000 0000 0001//代表pin0 //0000 0000 0000 0010//代表pin1 //0000 0000 0000 0100//代表pin2 currentpin = (GPIO_InitStruct->GPIO_Pin)&pos; if(currentpin == pos) { /*GPIOx端口,MODER寄存器的GPIO_InitStruct->GPIO_Pin对应的引脚,MODER位清空*/ GPIOx->MODER &= ~(3 << (2 *pinpos)); /*GPIOx端口,MODER寄存器的GPIO_Pin引脚,MODER位设置"输入/输出/复用输出/模拟"模式*/ GPIOx->MODER |= (((uint32_t)GPIO_InitStruct->GPIO_Mode) << (2 *pinpos)); /*GPIOx端口,PUPDR寄存器的GPIO_Pin引脚,PUPDR位清空*/ GPIOx->PUPDR &= ~(3 << ((2 *pinpos))); /*GPIOx端口,PUPDR寄存器的GPIO_Pin引脚,PUPDR位设置"上/下拉"模式*/ GPIOx->PUPDR |= (((uint32_t)GPIO_InitStruct->GPIO_PuPd) << (2 *pinpos)); if((GPIO_InitStruct->GPIO_Mode == GPIO_Mode_OUT) || (GPIO_InitStruct->GPIO_Mode == GPIO_Mode_AF)) { /*GPIOx端口,OSPEEDR寄存器的GPIO_Pin引脚,OSPEEDR位清空*/ GPIOx->OSPEEDR &= ~(3 << (2 *pinpos)); /*GPIOx端口,OSPEEDR寄存器的GPIO_Pin引脚,OSPEEDR位设置输出速度*/ GPIOx->OSPEEDR |= ((uint32_t)(GPIO_InitStruct->GPIO_Speed) << (2 *pinpos)); /*GPIOx端口,OTYPER寄存器的GPIO_Pin引脚,OTYPER位清空*/ GPIOx->OTYPER &= ~(1 << (pinpos)) ; /*GPIOx端口,OTYPER位寄存器的GPIO_Pin引脚,OTYPER位设置"推挽/开漏"输出类型*/ GPIOx->OTYPER |= (uint16_t)(((uint16_t)GPIO_InitStruct->GPIO_OType) << (pinpos)); } } } }