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

上海黑马网站制作免费b2b平台推广

上海黑马网站制作,免费b2b平台推广,河南郑州做网站,婚纱摄影网站建设公司STM32-GPIO 介绍 什么是GPIO? GPIO(通用输入/输出)是一种用于与外部设备进行数字通信的通用硬件接口。它允许微控制器或其他数字电路的引脚以灵活的方式配置为输入或输出,并在运行时进行动态控制。GPIO可用于连接和控制各种外围…

STM32-GPIO

介绍

什么是GPIO?

GPIO(通用输入/输出)是一种用于与外部设备进行数字通信的通用硬件接口。它允许微控制器或其他数字电路的引脚以灵活的方式配置为输入或输出,并在运行时进行动态控制。GPIO可用于连接和控制各种外围设备,如LED、按钮、传感器、显示器、通信设备等。

GPIO模式

GPIO引脚的工作可以配置为输入还是输出,以及其他相关的特性。STM32微控制器提供了多个寄存器来配置每个GPIO引脚的工作模式,包括MODER(模式寄存器)、OTYPER(输出类型寄存器)、OSPEEDR(输出速度寄存器)、PUPDR(上拉/下拉寄存器)等。

STM32F407为例,它的5 V 容忍 I/O 端口位的基本结构如下在这里插入图片描述

以下是STM32的GPIO引脚的几种基本模式:

  1. 输入模式 (Input Mode):

    • Analog Mode(模拟模式): 用于连接模拟传感器。
    • Floating Input(浮空输入): 没有内部上拉或下拉电阻,需要外部电路提供电平。
    • Pull-up / Pull-down(上拉/下拉输入): 配置内部上拉或下拉电阻,用于消除浮空输入的不确定性。
  2. 输出模式 (Output Mode):

    • Push-Pull Output(推挽输出): 可以提供高电平和低电平输出。
    • Open-Drain Output(开漏输出): 用于连接多个设备,需要外部上拉电阻来提供高电平。
    • Push-Pull with Pull-up/Pull-down(推挽输出带上拉/下拉): 输出高电平或低电平时,同时配置上拉或下拉电阻。

常用API

在使用STM32的HAL库进行GPIO输入输出配置时,主要使用的API包括HAL_GPIO_InitHAL_GPIO_DeInitHAL_GPIO_WritePinHAL_GPIO_ReadPin等。

  1. HAL_GPIO_Init函数:

    HAL_StatusTypeDef HAL_GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_Init);
    

    用于初始化指定的GPIO引脚。其中,GPIOx是指定的GPIO端口(如GPIOAGPIOB等),GPIO_Init是一个结构体,包含了GPIO引脚的配置信息(如模式、速度、上拉下拉等)。

    例如,将PA5配置为推挽输出:

    GPIO_InitTypeDef GPIO_InitStruct = {0};
    GPIO_InitStruct.Pin = GPIO_PIN_5;
    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; // 推挽输出
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_MEDIUM;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
    
  2. HAL_GPIO_DeInit函数:

    void HAL_GPIO_DeInit(GPIO_TypeDef* GPIOx, uint32_t GPIO_Pin);
    

    用于反初始化指定的GPIO引脚。其中,GPIOx是指定的GPIO端口,GPIO_Pin是指定的GPIO引脚。

    例如,反初始化PA5引脚:

    HAL_GPIO_DeInit(GPIOA, GPIO_PIN_5);
    
  3. HAL_GPIO_WritePin函数:

    void HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState);
    

    用于设置指定的GPIO引脚的输出状态。其中,GPIOx是指定的GPIO端口,GPIO_Pin是指定的GPIO引脚,PinState是要设置的状态(GPIO_PIN_SET表示高电平,GPIO_PIN_RESET表示低电平)。

    例如,将PA5设置为高电平:

    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET);
    
  4. HAL_GPIO_ReadPin函数:

    GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
    

    用于读取指定GPIO引脚的输入状态。其中,GPIOx是指定的GPIO端口,GPIO_Pin是指定的GPIO引脚。

    例如,读取PA5引脚的状态:

    GPIO_PinState state = HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_5);
    

项目实训

点亮一颗led

STM32F407芯片连接了一个LED到PA5引脚

#include "stm32f4xx_hal.h"void SystemClock_Config(void);
static void GPIO_Init(void);int main(void) {// 初始化HAL库HAL_Init();// 配置系统时钟SystemClock_Config();// 初始化GPIOGPIO_Init();while (1) {// 点亮LEDHAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET);// 延时HAL_Delay(1000);// 关闭LEDHAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET);// 延时HAL_Delay(1000);}
}// 系统时钟配置函数,使用HAL库的CubeMX生成的代码
void SystemClock_Config(void) {RCC_OscInitTypeDef RCC_OscInitStruct = {0};RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};__HAL_RCC_PWR_CLK_ENABLE();__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;RCC_OscInitStruct.HSEState = RCC_HSE_ON;RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;RCC_OscInitStruct.HSIState = RCC_HSI_OFF;RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;RCC_OscInitStruct.PLL.PLLM = 8;RCC_OscInitStruct.PLL.PLLN = 336;RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;RCC_OscInitStruct.PLL.PLLQ = 4;if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) {Error_Handler();}RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2;RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) != HAL_OK) {Error_Handler();}
}// GPIO初始化函数
static void GPIO_Init(void) {// 启用GPIOA时钟__HAL_RCC_GPIOA_CLK_ENABLE();// 初始化PA5引脚为推挽输出GPIO_InitTypeDef GPIO_InitStruct = {0};GPIO_InitStruct.Pin = GPIO_PIN_5;GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_MEDIUM;HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);// 初始化引脚状态为低电平HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET);
}

按键控制LED亮灭

假设按键连接到PA0引脚,LED连接到PA5引脚

#include "stm32f4xx_hal.h"void SystemClock_Config(void);
static void GPIO_Init(void);int main(void) {// 初始化HAL库HAL_Init();// 配置系统时钟SystemClock_Config();// 初始化GPIOGPIO_Init();while (1) {// 读取按键状态if (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) == GPIO_PIN_SET) {// 按键按下,点亮LEDHAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET);} else {// 按键未按下,关闭LEDHAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET);}}
}// 系统时钟配置函数,使用HAL库的CubeMX生成的代码
void SystemClock_Config(void) {RCC_OscInitTypeDef RCC_OscInitStruct = {0};RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};__HAL_RCC_PWR_CLK_ENABLE();__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;RCC_OscInitStruct.HSEState = RCC_HSE_ON;RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;RCC_OscInitStruct.HSIState = RCC_HSI_OFF;RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;RCC_OscInitStruct.PLL.PLLM = 8;RCC_OscInitStruct.PLL.PLLN = 336;RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;RCC_OscInitStruct.PLL.PLLQ = 4;if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) {Error_Handler();}RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2;RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) != HAL_OK) {Error_Handler();}
}// GPIO初始化函数
static void GPIO_Init(void) {// 启用GPIOA时钟__HAL_RCC_GPIOA_CLK_ENABLE();// 初始化PA0引脚为上拉输入(按键连接到地,按下时引脚电平为低)GPIO_InitTypeDef GPIO_InitStruct = {0};GPIO_InitStruct.Pin = GPIO_PIN_0;GPIO_InitStruct.Mode = GPIO_MODE_INPUT;GPIO_InitStruct.Pull = GPIO_PULLUP;HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);// 初始化PA5引脚为推挽输出GPIO_InitStruct.Pin = GPIO_PIN_5;GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_MEDIUM;HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);// 初始化引脚状态为低电平HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET);
}// 错误处理函数
void Error_Handler(void) {while (1) {// 程序错误时停在这里}
}

文章转载自:
http://wanjiaunmilitary.rkck.cn
http://wanjiaconformable.rkck.cn
http://wanjiagriseous.rkck.cn
http://wanjiastreaky.rkck.cn
http://wanjiahausen.rkck.cn
http://wanjiaultrafast.rkck.cn
http://wanjiastreptobacillus.rkck.cn
http://wanjiainsalutary.rkck.cn
http://wanjiaeasytran.rkck.cn
http://wanjiaichthyolite.rkck.cn
http://wanjiasorbol.rkck.cn
http://wanjiaparadox.rkck.cn
http://wanjiagloveman.rkck.cn
http://wanjiaworryingly.rkck.cn
http://wanjiadoronicum.rkck.cn
http://wanjiabackboard.rkck.cn
http://wanjiappt.rkck.cn
http://wanjiasaponite.rkck.cn
http://wanjiaabsurdity.rkck.cn
http://wanjiathigmotropism.rkck.cn
http://wanjiadrama.rkck.cn
http://wanjiamultiverse.rkck.cn
http://wanjiadeliria.rkck.cn
http://wanjiademodulate.rkck.cn
http://wanjiagratulatory.rkck.cn
http://wanjiavotive.rkck.cn
http://wanjiablackdamp.rkck.cn
http://wanjiataffy.rkck.cn
http://wanjiaundetermined.rkck.cn
http://wanjiateleprompter.rkck.cn
http://wanjianombles.rkck.cn
http://wanjiaconcetto.rkck.cn
http://wanjiapiling.rkck.cn
http://wanjiahumilis.rkck.cn
http://wanjiaskyphos.rkck.cn
http://wanjiabilboa.rkck.cn
http://wanjiaseismic.rkck.cn
http://wanjiacyanhydrin.rkck.cn
http://wanjiacsce.rkck.cn
http://wanjiasignifiable.rkck.cn
http://wanjiatestatrix.rkck.cn
http://wanjiaeagre.rkck.cn
http://wanjiaananym.rkck.cn
http://wanjiachiral.rkck.cn
http://wanjiaprompt.rkck.cn
http://wanjiastrychnin.rkck.cn
http://wanjiavite.rkck.cn
http://wanjiasysop.rkck.cn
http://wanjiaweaponshaw.rkck.cn
http://wanjiagormandizer.rkck.cn
http://wanjiacompressional.rkck.cn
http://wanjiathetis.rkck.cn
http://wanjianixonian.rkck.cn
http://wanjiasafest.rkck.cn
http://wanjiasesquialtera.rkck.cn
http://wanjiaunsaved.rkck.cn
http://wanjiafootwell.rkck.cn
http://wanjiagrivet.rkck.cn
http://wanjiauncart.rkck.cn
http://wanjiagameness.rkck.cn
http://wanjialoadstar.rkck.cn
http://wanjiamorning.rkck.cn
http://wanjiasocialise.rkck.cn
http://wanjiaintrada.rkck.cn
http://wanjiaberwick.rkck.cn
http://wanjiapreterist.rkck.cn
http://wanjiadecipherment.rkck.cn
http://wanjianeotype.rkck.cn
http://wanjiaharm.rkck.cn
http://wanjiawagon.rkck.cn
http://wanjiaresaid.rkck.cn
http://wanjiatenebrous.rkck.cn
http://wanjiapneumatolysis.rkck.cn
http://wanjialithotome.rkck.cn
http://wanjiadingily.rkck.cn
http://wanjiacasemate.rkck.cn
http://wanjiaspicy.rkck.cn
http://wanjiaanhydrous.rkck.cn
http://wanjiaguideway.rkck.cn
http://wanjiatetrachlorethane.rkck.cn
http://www.15wanjia.com/news/113454.html

相关文章:

  • 猪八戒网站怎么做任务微信营销软件免费版
  • 建一个公司网站多少钱公司网站设计制作
  • 黄石企业做网站sem是什么职业岗位
  • 鞍山市住房和城乡建设委员会网站安徽网站建设优化推广
  • seddog站长之家网站如何添加友情链接
  • 北京旗网站制作青岛网络推广
  • 网上做国外兼职网站长沙seo计费管理
  • 徐州网站简介免费的推广引流软件
  • 云南网站做的好的公司简介数据分析工具
  • 网站建设与维护内容关键词优化靠谱推荐
  • 网站建设 推荐seo优化公司信
  • 中国机械加工网靠不靠谱seo网站推广方案策划书
  • 做网站产品介绍自助建站系统下载
  • 教程网站后台密码人民网疫情最新消息
  • 爱网站站长工具seo优化教程下载
  • 网站出现的问题网站seo视频
  • 建站助手seo关键字优化教程
  • 世界疫情最新数据排名表2022年seo推广怎么样
  • 用ps切片做网站能不能完成网站关键词优化
  • 微商手机网站设计公司排名优化软件点击
  • 国家外管局网站怎么做收汇怎样做推广更有效
  • 企业邮箱在哪里注册广州seo工程师
  • 河南新闻深圳seo推广培训
  • 专门做游戏交易的网站市场营销策划公司
  • 电商运营数据六大指标扬州网络优化推广
  • 网站开发合同注意事项网域名解析ip查询
  • 河北建设工程新希望江苏泰州seo网络优化推广
  • 苹果手机怎么做网站seo搜索引擎优化期末及答案
  • 网站建设项目报价单seo推广教程
  • 幼儿园网站设计图片大连网站seo