当前位置: 首页 > news >正文

1.GPIO

理论说明

输入

上拉输入:拉高电平

下拉输入:拉低电平

浮空输入:不拉高也不拉低电平

输出

开漏输出:不能输出高电平(P-MOS不可用,则只能低电平)

推挽输出:可输出高低电平

输入输出电路图

输出速率

  • Low:2MHz
  • Medium:10MHz
  • High:50MHz

代码编写

几个功能例程的配置及代码

Cube IDE代码

LED灯闪烁

配置引脚功能:

GPIO配置
在main.c文件,大概94行开始

  /* USER CODE BEGIN WHILE */
while (1)
{//参数1:GPIO口名字(PB),参数2:GPIO数字(PB5中的5),参数3:高低电平(0,1)HAL_GPIO_WritePin(LED1_GPIO_Port, LED1_Pin, 0);HAL_Delay(1000);HAL_GPIO_WritePin(LED1_GPIO_Port, LED1_Pin, 1);//HAL_GPIO_TogglePin(LED1_GPIO_Port, LED1_Pin);	//电平反转,无需设置高低电平HAL_Delay(1000);/* USER CODE END WHILE *//* USER CODE BEGIN 3 */
}/* USER CODE END 3 */

实验二

按键PE3控制蜂鸣器开关、按键PE4控制 LED2(PE5) 亮灭、光敏传感器控制 LED1(PB5) 亮灭

按键:设置成上拉输入,PE4则为高电平,当按键按下时,PE4为0,则按键按下(其它按钮同理)

按键电路图

LED灯、蜂鸣器(PB8):输出高低电平,设置推挽输出

光敏传感器(PB11):高低电平由外界光照强度来决定,设置浮空输入

按键配置:

按钮配置

LED灯配置方面已经说明,直接配置

蜂鸣器配置(PB8):

蜂鸣器配置图

光敏传感器配置(PB11):

光敏传感器配置图

光敏传感器AO DO有什么区别?

AO:输出模拟信号

DO:输出数字信号(高低电平)

在main.c文件,大概94行开始

/* USER CODE BEGIN WHILE */
while (1)
{if(0 == HAL_GPIO_ReadPin(Key1_GPIO_Port, Key1_Pin))	//检测读取按键高低电平{HAL_Delay(120);if(0 == HAL_GPIO_ReadPin(Key1_GPIO_Port, Key1_Pin))	//检测读取按键高低电平{HAL_GPIO_TogglePin(BEEP_GPIO_Port, BEEP_Pin);	//电平反转,无需设置高低电平}}if(0 == HAL_GPIO_ReadPin(Key2_GPIO_Port, Key2_Pin))	//检测读取按键输入高低电平{HAL_Delay(120);if(0 == HAL_GPIO_ReadPin(Key2_GPIO_Port, Key2_Pin))	//检测读取按键高低电平{HAL_GPIO_TogglePin(LED2_GPIO_Port, LED2_Pin);	//电平反转,无需设置高低电平}}if(0 == HAL_GPIO_ReadPin(SUN_GPIO_Port, SUN_Pin))	//检测读取光敏传感器输入高低电平{HAL_GPIO_WritePin(LED1_GPIO_Port, LED1_Pin, 1);}else{HAL_GPIO_WritePin(LED1_GPIO_Port, LED1_Pin, 0);}/* USER CODE END WHILE *//* USER CODE BEGIN 3 */
}

效果展示:

代码过程

初始化时钟

  1. 初始化时钟

APB2ENR:外设时钟使能寄存器

外设时钟使能寄存器图

大概功能:将APB2ENR(外设时钟使能寄存器)初始化IO端口B时钟开启

//初始化代码,在gpio.c中48行
__HAL_RCC_GPIOE_CLK_ENABLE();
__HAL_RCC_GPIOB_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE();//__HAL_RCC_GPIOB_CLK_ENABLE(); 如下过程
#define __HAL_RCC_GPIOB_CLK_ENABLE()   do { \__IO uint32_t tmpreg;  /*定义一个变量*/\SET_BIT(RCC->APB2ENR, RCC_APB2ENR_IOPBEN);\/* Delay after an RCC peripheral clock enabling(下方两个延时作用) */\tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_IOPBEN);\UNUSED(tmpreg); \} while(0U)//SET_BIT(RCC->APB2ENR, RCC_APB2ENR_IOPBEN); 的解释//1.RCC_APB2ENR_IOPBEN
#define RCC_APB2ENR_IOPBEN_Pos		(3U)                              
#define RCC_APB2ENR_IOPBEN_Msk		(0x1UL << RCC_APB2ENR_IOPBEN_Pos)	/*RCC_APB2ENR_IOPBEN_Msk 等于0x1<< 3 结果:0x00000008 */
//0x1 = 0000 0001 << 3 = 0000 1000(对应上图,位3为1) = 0x00000008 
#define RCC_APB2ENR_IOPBEN			RCC_APB2ENR_IOPBEN_Msk		/* RCC_APB2ENR_IOPBEN 等于0x00000008 *///2.RCC寄存器,RCC_BASE强转成这个RCC_TypeDef类型的结构体
#define RCC                 ((RCC_TypeDef *)RCC_BASE)
//RCC_BASE = 由总线矩阵偏移到AHB系统总线再偏移到复位和时钟控制(RCC)(可看参考手册的系统结构)(下面三行从下往上看)
#define RCC_BASE              (AHBPERIPH_BASE + 0x00001000UL)
#define AHBPERIPH_BASE        (PERIPH_BASE + 0x00020000UL)
#define PERIPH_BASE           0x40000000UL
//RCC_TypeDef(结构体)
typedef struct
{__IO uint32_t CR;__IO uint32_t CFGR;__IO uint32_t CIR;__IO uint32_t APB2RSTR;__IO uint32_t APB1RSTR;__IO uint32_t AHBENR;__IO uint32_t APB2ENR;__IO uint32_t APB1ENR;__IO uint32_t BDCR;__IO uint32_t CSR;
} RCC_TypeDef;//3.RCC->APB2ENR
RCC指向APB2ENR,则就是结构体内的__IO uint32_t APB2ENR;//将APB2ENR的位3置1
  1. 初始化引脚

GPIOx_BSRR:端口位设置/清除寄存器

低16位中若有某一位 置1,则这个引脚为1(高电平),若都为0,则不影响

高16位中若有某一位 置1,则这个引脚位0(低电平),若都为0,则不影响

端口位设置/清除寄存器图

//gpio.c中第53行
/*Configure GPIO pin Output Level */
HAL_GPIO_WritePin(LED2_GPIO_Port, LED2_Pin, GPIO_PIN_SET);void HAL_GPIO_WritePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState)
{/* Check the parameters */assert_param(IS_GPIO_PIN(GPIO_Pin));assert_param(IS_GPIO_PIN_ACTION(PinState));if (PinState != GPIO_PIN_RESET)	//GPIO_PIN_RESET为0{GPIOx->BSRR = GPIO_Pin;	//给BSRR寄存器 低16位赋值 置1}else{GPIOx->BSRR = (uint32_t)GPIO_Pin << 16u;	//给BSRR寄存器 高16位赋值 置0}
}//GPIO_TypeDef *GPIOx 等于 LED2_GPIO_Port
#define LED2_GPIO_Port GPIOE
#define GPIOE		((GPIO_TypeDef *)GPIOE_BASE)
//GPIO_TypeDef 强转
typedef struct
{__IO uint32_t CRL;__IO uint32_t CRH;__IO uint32_t IDR;__IO uint32_t ODR;__IO uint32_t BSRR;__IO uint32_t BRR;__IO uint32_t LCKR;
} GPIO_TypeDef;
#define GPIOE_BASE            (APB2PERIPH_BASE + 0x00001800UL)
#define APB2PERIPH_BASE       (PERIPH_BASE + 0x00010000UL)
#define PERIPH_BASE           0x40000000UL//GPIO_Pin 等于 LED2_Pin
#define LED2_Pin GPIO_PIN_5
#define GPIO_PIN_5		((uint16_t)0x0020)  /* Pin 5 selected    */
  1. 写实际需求(输入:read 判断,输出:write 0/1)

Keil代码

修改的地方如下

main.c

//main函数中
while (1)
{if(0 == HAL_GPIO_ReadPin(Key1_GPIO_Port, Key1_Pin))	//检测读取按键高低电平{HAL_Delay(120);if(0 == HAL_GPIO_ReadPin(Key1_GPIO_Port, Key1_Pin))	//检测读取按键高低电平{HAL_GPIO_TogglePin(BEEP_GPIO_Port, BEEP_Pin);	//电平反转,无需设置高低电平}}if(0 == HAL_GPIO_ReadPin(Key2_GPIO_Port, Key2_Pin))	//检测读取按键输入高低电平{HAL_Delay(120);if(0 == HAL_GPIO_ReadPin(Key2_GPIO_Port, Key2_Pin))	//检测读取按键高低电平{HAL_GPIO_TogglePin(LED2_GPIO_Port, LED2_Pin);	//电平反转,无需设置高低电平}}if(0 == HAL_GPIO_ReadPin(SUN_GPIO_Port, SUN_Pin))	//检测读取光敏传感器输入高低电平{HAL_GPIO_WritePin(LED1_GPIO_Port, LED1_Pin, 1);}else{HAL_GPIO_WritePin(LED1_GPIO_Port, LED1_Pin, 0);}
}

gpio.c

void MDK_GPIO_Init(void)
{GPIO_InitTypeDef GPIO_InitStruct = {0};/* GPIO Ports Clock Enable */__HAL_RCC_GPIOE_CLK_ENABLE();__HAL_RCC_GPIOB_CLK_ENABLE();__HAL_RCC_GPIOA_CLK_ENABLE();/*Configure GPIO pin Output Level */HAL_GPIO_WritePin(LED2_GPIO_Port, LED2_Pin, GPIO_PIN_SET);/*Configure GPIO pin Output Level */HAL_GPIO_WritePin(LED1_GPIO_Port, LED1_Pin, GPIO_PIN_SET);/*Configure GPIO pin Output Level */HAL_GPIO_WritePin(BEEP_GPIO_Port, BEEP_Pin, GPIO_PIN_RESET);/*Configure GPIO pins : PEPin PEPin */GPIO_InitStruct.Pin = Key1_Pin|Key2_Pin;GPIO_InitStruct.Mode = GPIO_MODE_INPUT;GPIO_InitStruct.Pull = GPIO_PULLUP;HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);/*Configure GPIO pin : PtPin */GPIO_InitStruct.Pin = LED2_Pin;GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;GPIO_InitStruct.Pull = GPIO_NOPULL;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;HAL_GPIO_Init(LED2_GPIO_Port, &GPIO_InitStruct);/*Configure GPIO pin : PtPin */GPIO_InitStruct.Pin = SUN_Pin;GPIO_InitStruct.Mode = GPIO_MODE_INPUT;GPIO_InitStruct.Pull = GPIO_NOPULL;HAL_GPIO_Init(SUN_GPIO_Port, &GPIO_InitStruct);/*Configure GPIO pin : PtPin */GPIO_InitStruct.Pin = LED1_Pin;GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;GPIO_InitStruct.Pull = GPIO_NOPULL;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;HAL_GPIO_Init(LED1_GPIO_Port, &GPIO_InitStruct);/*Configure GPIO pin : PtPin */GPIO_InitStruct.Pin = BEEP_Pin;GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;GPIO_InitStruct.Pull = GPIO_PULLUP;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;HAL_GPIO_Init(BEEP_GPIO_Port, &GPIO_InitStruct);
}

main.h

//60行开始
#define Key1_Pin GPIO_PIN_3
#define Key1_GPIO_Port GPIOE
#define Key2_Pin GPIO_PIN_4
#define Key2_GPIO_Port GPIOE
#define LED2_Pin GPIO_PIN_5
#define LED2_GPIO_Port GPIOE
#define SUN_Pin GPIO_PIN_11
#define SUN_GPIO_Port GPIOB
#define LED1_Pin GPIO_PIN_5
#define LED1_GPIO_Port GPIOB
#define BEEP_Pin GPIO_PIN_8
#define BEEP_GPIO_Port GPIOB

若烧录完成后,需要按复位按键才可正常,可尝试以下设置

第一步:

设置1

第二步:

设置2

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • YAML语法格式详解
  • 为什么要使用双亲委派机制?
  • 一文搞懂GIT
  • 本地部署持续集成工具Jenkins并配置公网地址实现远程自动化构建
  • 【Android】数据存储之SQLite数据库知识总结
  • C语言数据在内存中的存储超详解
  • nacos 2.3.2 若依使用mysql
  • 智慧环卫可视化:科技赋能城市清洁管理
  • Java--二,十,十六进制间的相互转换
  • 【初阶数据结构篇】归并排序和计数排序(总结篇)
  • Python面试题:结合Python技术,如何使用Scrapy构建爬虫框架
  • [极客大挑战 2019]Secret File-web
  • 校园点餐系统
  • java算法递归算法练习-数组之和
  • 快速部署私有化大模型 毕昇(使用docker-compose方式)
  • 《Java8实战》-第四章读书笔记(引入流Stream)
  • 《网管员必读——网络组建》(第2版)电子课件下载
  • 2018一半小结一波
  • download使用浅析
  • HTTP请求重发
  • interface和setter,getter
  • JavaScript 奇技淫巧
  • Laravel 中的一个后期静态绑定
  • Next.js之基础概念(二)
  • Objective-C 中关联引用的概念
  • Otto开发初探——微服务依赖管理新利器
  • PhantomJS 安装
  • PV统计优化设计
  • Python打包系统简单入门
  • scrapy学习之路4(itemloder的使用)
  • storm drpc实例
  • SwizzleMethod 黑魔法
  • Terraform入门 - 1. 安装Terraform
  • VuePress 静态网站生成
  • 不用申请服务号就可以开发微信支付/支付宝/QQ钱包支付!附:直接可用的代码+demo...
  • 测试开发系类之接口自动化测试
  • 程序员最讨厌的9句话,你可有补充?
  • 关于Flux,Vuex,Redux的思考
  • 简单基于spring的redis配置(单机和集群模式)
  • 可能是历史上最全的CC0版权可以免费商用的图片网站
  • 前端每日实战 2018 年 7 月份项目汇总(共 29 个项目)
  • 微信公众号开发小记——5.python微信红包
  • 小程序滚动组件,左边导航栏与右边内容联动效果实现
  • 基于django的视频点播网站开发-step3-注册登录功能 ...
  • ​ 全球云科技基础设施:亚马逊云科技的海外服务器网络如何演进
  • ​软考-高级-信息系统项目管理师教程 第四版【第14章-项目沟通管理-思维导图】​
  • #QT(TCP网络编程-服务端)
  • #ubuntu# #git# repository git config --global --add safe.directory
  • #快捷键# 大学四年我常用的软件快捷键大全,教你成为电脑高手!!
  • #我与Java虚拟机的故事#连载14:挑战高薪面试必看
  • (android 地图实战开发)3 在地图上显示当前位置和自定义银行位置
  • (排序详解之 堆排序)
  • (算法)大数的进制转换
  • (五)关系数据库标准语言SQL
  • (转)ObjectiveC 深浅拷贝学习