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

STM32F103RCT6学习之二:GPIO开发

  • GPIO基础

1.简介

2.GPIO基本结构 

3.种模式

  • GPIO基本功能

 1.输出功能--LED灯闪烁

1)进行基本配置 

2)编辑代码

主要在main.c中编辑。

int main(void)
{/* USER CODE BEGIN 1 *//* USER CODE END 1 *//* MCU Configuration--------------------------------------------------------*//* Reset of all peripherals, Initializes the Flash interface and the Systick. */HAL_Init();/* USER CODE BEGIN Init *//* USER CODE END Init *//* Configure the system clock */SystemClock_Config();/* USER CODE BEGIN SysInit *//* USER CODE END SysInit *//* Initialize all configured peripherals */MX_GPIO_Init();/* USER CODE BEGIN 2 */HAL_GPIO_WritePin(LED0_GPIO_Port,LED0_Pin,GPIO_PIN_RESET);//将LED0点亮/* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1){/* USER CODE END WHILE */HAL_Delay(50);HAL_GPIO_WritePin(LED0_GPIO_Port,LED0_Pin,GPIO_PIN_SET);//将LED0熄灭HAL_Delay(50);HAL_GPIO_WritePin(LED0_GPIO_Port,LED0_Pin,GPIO_PIN_RESET);//将LED0点亮/* USER CODE BEGIN 3 */}/* USER CODE END 3 */
}

3)分析:

涉及2个函数

HAL_GPIO_WritePin();//定义于stm32f1xx_hal_gpio.c

HAL_Delay();//定义于stm32f1xx_hal.c

涉及2个宏-

LED0_GPIO_Port   //定义于main.h

LED0_Pin//定义于main.h

实现闪烁功能也可以用如下代码:

int main(void)
{/* USER CODE BEGIN 1 *//* USER CODE END 1 *//* MCU Configuration--------------------------------------------------------*//* Reset of all peripherals, Initializes the Flash interface and the Systick. */HAL_Init();/* USER CODE BEGIN Init *//* USER CODE END Init *//* Configure the system clock */SystemClock_Config();/* USER CODE BEGIN SysInit *//* USER CODE END SysInit *//* Initialize all configured peripherals */MX_GPIO_Init();/* USER CODE BEGIN 2 */HAL_GPIO_WritePin(LED0_GPIO_Port,LED0_Pin,GPIO_PIN_RESET);//将LED0点亮/* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1){/* USER CODE END WHILE */HAL_Delay(50);HAL_GPIO_TogglePin(LED0_GPIO_Port,LED0_Pin);//将LED0翻转/* USER CODE BEGIN 3 */}/* USER CODE END 3 */
}

 2.输入功能--按键控制LED灯

要求KEY0控制LED0,按一下点亮,再按一下熄灭

1)进行基本配置

2)编辑代码

3)分析

1、可能存在抖动问题

2、效率不高

考虑用中断的方式实现

3.GPIO外部中断方式实现按键功能

要求KEY0控制LED0,按一下点亮,再按一下熄灭

1)进行基本配置

2)编辑代码

触发中断时系统会调用定义于stm32f1xx_it.c的void EXTI9_5_IRQHandler(void)

可以看到该中断服务函数又调用 HAL_GPIO_EXTI_IRQHandler(KEY0_Pin),该函数定义于stm32f1xx_hal_gpio.c中:

而该函数又调用了HAL_GPIO_EXTI_Callback(GPIO_Pin); 这是一个同样定义于tm32f1xx_hal_gpio.c中的可重定义函数

在main.c中重定义HAL_GPIO_EXTI_Callback(GPIO_Pin):

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{if(GPIO_Pin==KEY0_Pin){if(HAL_GPIO_ReadPin(KEY0_GPIO_Port,KEY0_Pin)==GPIO_PIN_RESET){HAL_GPIO_TogglePin(LED0_GPIO_Port,LED0_Pin);}
}

3)分析

4.GPIO-三个按键控制2个LED

要求KEY1控制LED0,按一下点亮,再按一下熄灭

要求KEY1控制LED2,按一下点亮,再按一下熄灭

要求KEY_WKUP控制LED0、LED1,按一下取反

1)进行基本配置

**配置KEY_WKUP应该是下拉模式,上升沿触发

**配置KEY0、KEY1应该是上拉模式,下降沿触发

2)编辑代码

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
//  if(GPIO_Pin==KEY0_Pin){
//		if(HAL_GPIO_ReadPin(KEY0_GPIO_Port,KEY0_Pin)==GPIO_PIN_RESET){
//			HAL_GPIO_TogglePin(LED0_GPIO_Port,LED0_Pin);
//		}
//			
//	}else if(GPIO_Pin==KEY1_Pin){
//		if(HAL_GPIO_ReadPin(KEY1_GPIO_Port,KEY1_Pin)==GPIO_PIN_RESET){
//			HAL_GPIO_TogglePin(LED1_GPIO_Port,LED1_Pin);
//		}
//		
//	}else if(GPIO_Pin==KEY_WKUP_Pin){
//		if(HAL_GPIO_ReadPin(KEY_WKUP_GPIO_Port,KEY_WKUP_Pin)==GPIO_PIN_RESET){
//			HAL_GPIO_TogglePin(LED0_GPIO_Port,LED0_Pin);
//			HAL_GPIO_TogglePin(LED1_GPIO_Port,LED1_Pin);
//		}
//	}switch(GPIO_Pin){case KEY0_Pin:HAL_GPIO_TogglePin(LED0_GPIO_Port,LED0_Pin); break;case KEY1_Pin:HAL_GPIO_TogglePin(LED1_GPIO_Port,LED1_Pin); break;case KEY_WKUP_Pin:HAL_GPIO_TogglePin(LED0_GPIO_Port,LED0_Pin);HAL_GPIO_TogglePin(LED1_GPIO_Port,LED1_Pin);break;default:break;}}

3)分析

5.GPIO-控制4位动态数码管及4X4矩阵键盘

数码管段选信号SEG_A~SEG_DP经74HC240反相输出到数码管各段(阳极),编程时用低电平点亮;

数码管位选信号BIT3~BIT0经两片75452反向驱动后输出到数码管各位()阴极),编程时高电平选中。

1)进行基本配置

2)编辑代码

键盘扫描

#define ROW_NUM 4
#define COL_NUM 4
GPIO_TypeDef* row_ports[ROW_NUM] = {GPIOB, GPIOB, GPIOB, GPIOB};  //数据类型为端口号的指针数组
uint16_t row_pins[ROW_NUM] = {GPIO_PIN_0, GPIO_PIN_1, GPIO_PIN_2, GPIO_PIN_3};  //引脚编号数组GPIO_TypeDef* col_ports[COL_NUM] = {GPIOB, GPIOB, GPIOB, GPIOB};  //数据类型为端口号的指针数组
uint16_t col_pins[COL_NUM] = {GPIO_PIN_4, GPIO_PIN_5, GPIO_PIN_6, GPIO_PIN_7};  //引脚编号数组
uint8_t key_num_map[ROW_NUM][COL_NUM] = {{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16}
};
uint8_t scan_keypad_num(void) {for (int row = 0; row < ROW_NUM; row++) {// 设置当前行输出低电平,其余行输出高电平for (int i = 0; i < ROW_NUM; i++) {HAL_GPIO_WritePin(row_ports[i], row_pins[i], GPIO_PIN_SET);}HAL_GPIO_WritePin(row_ports[row], row_pins[row], GPIO_PIN_RESET);// 检测列输入状态for (int col = 0; col < COL_NUM; col++) {if (HAL_GPIO_ReadPin(col_ports[col], col_pins[col]) == GPIO_PIN_RESET) {HAL_Delay(10); // 按键消抖if (HAL_GPIO_ReadPin(col_ports[col], col_pins[col]) == GPIO_PIN_RESET) {return key_num_map[row][col];}}}}return NULL; // 无按键按下
}

主程序

int main(void)
{/* USER CODE BEGIN 1 *///	uint8_t key_num=NULL;/* USER CODE END 1 *//* MCU Configuration--------------------------------------------------------*//* Reset of all peripherals, Initializes the Flash interface and the Systick. */HAL_Init();/* USER CODE BEGIN Init *//* USER CODE END Init *//* Configure the system clock */SystemClock_Config();/* USER CODE BEGIN SysInit *//* USER CODE END SysInit *//* Initialize all configured peripherals */MX_GPIO_Init();MX_USART1_UART_Init();/* USER CODE BEGIN 2 *//* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 *//* USER CODE END WHILE *//* USER CODE BEGIN 3 */uint8_t key_num = scan_keypad_num();if(key_num != NULL){switch(key_num){case 1:HAL_GPIO_TogglePin(LED0_GPIO_Port,LED0_Pin);  //翻转LED0电平HAL_Delay(100); // 消抖防止重复检测同一按键break;case 2:HAL_GPIO_TogglePin(LED1_GPIO_Port,LED1_Pin);  //翻转LED1电平HAL_Delay(100); // 消抖防止重复检测同一按键break;case 3:HAL_GPIO_TogglePin(LED0_GPIO_Port,LED0_Pin);  //翻转LED0、LED1电平HAL_GPIO_TogglePin(LED1_GPIO_Port,LED1_Pin);HAL_Delay(100); // 消抖防止重复检测同一按键break;}}}/* USER CODE END 3 */
}

3)分析

1.效率不高

2.重复扫描 


http://www.mrgr.cn/news/81703.html

相关文章:

  • 探秘仓颉编程语言:使用体验与功能剖析
  • Java学习,foreach循环
  • 24.12.27 SpringMVCDay02
  • 使用 PyQt5 构建高效的文件分类与管理工具
  • 【再谈设计模式】享元模式~对象共享的优化妙手
  • 2025年三个月自学手册 网络安全(黑客技术)
  • 使用 IDE生成 Java Doc
  • 使用 Three.js 创建圣诞树场景
  • Linux 搭建 nginx+keepalived (主备+双主模式) 高可用 | Nginx反向代理
  • Layui 新增销售单 其中一种 编写逻辑和打开方式
  • linux 中文输入法设置的宏观思路 (****)
  • 数据处理之数据规约
  • 文本数据处理
  • 了解智能运维
  • #渗透测试#漏洞挖掘#红蓝攻防#漏洞挖掘#未授权漏洞-Es未授权漏洞
  • leetcode 27. 移除元素
  • 【和春笋一起学C++】文本输入与读取
  • C# 修改项目类型 应用程序程序改类库
  • 【CSS in Depth 2 精译_094】16.2:CSS 变换在动效中的应用(下)——导航菜单的文本标签“飞入”特效与交错渲染效果的实现
  • CMake技术细节:解决未定义,提供参数
  • 走进人工智能体
  • 【Go】context标准库
  • SpringMVC学习(二)——RESTful API、拦截器、异常处理、数据类型转换
  • esp32学习:用虫洞ESP32S3-EYE开发板快速实现USB摄像头(UVC免驱)
  • 【HENU】河南大学计院2024 计算机网络 期末复习知识点
  • 中关村科金智能客服机器人如何解决客户个性化需求与标准化服务之间的矛盾?