(1)STM32使用HAL库操作GPIO

软件端(2)-蓝桥杯与Keil与PLC(嵌入式) 这个理解成透传就可以了,整体是靠着LE来控制的,LE给高电平就可以了,OE是一直在开启状态的,因为io口冲突,所以加上了锁存器。这是573数据手册上面的逻辑图。 阅读详情

一  初始化GPIO

使用HAL库的优点在于不用手动添加初始化的代码了,CubeMX会根据软件设置自动生成。

自动生成的HAL库GPIO初始化代码:

复制代码

static void MX_GPIO_Init(void)
{

  GPIO_InitTypeDef GPIO_InitStruct;

  /* GPIO Ports Clock Enable */
  __HAL_RCC_GPIOH_CLK_ENABLE();
  __HAL_RCC_GPIOD_CLK_ENABLE();

  /*Configure GPIO pin Output Level */
  HAL_GPIO_WritePin(GPIOD, GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15, GPIO_PIN_SET);

  /*Configure GPIO pin : PD11 */
  GPIO_InitStruct.Pin = GPIO_PIN_11;
  GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
  GPIO_InitStruct.Pull = GPIO_PULLUP;
  HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);

  /*Configure GPIO pins : PD12 PD13 PD14 PD15 */
  GPIO_InitStruct.Pin = GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
  HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);

}

复制代码

 顺序:(1)定义结构体变量。(2)使能时钟。(3)配置初始化电平。(4)通过结构体变量初始化GPIO。

1.首先定义一个结构体变量GPIO_InitStruct,该变量类型是GPIO_InitTypeDef。

GPIO_InitTypeDef 定义如下:

复制代码

/** 
  * @brief GPIO Init structure definition  
  */ 
typedef struct
{
  uint32_t Pin;       /*!< Specifies the GPIO pins to be configured.
                           This parameter can be any value of @ref GPIO_pins_define */

  uint32_t Mode;      /*!< Specifies the operating mode for the selected pins.
                           This parameter can be a value of @ref GPIO_mode_define */

  uint32_t Pull;      /*!< Specifies the Pull-up or Pull-Down activation for the selected pins.
                           This parameter can be a value of @ref GPIO_pull_define */

  uint32_t Speed;     /*!< Specifies the speed for the selected pins.
                           This parameter can be a value of @ref GPIO_speed_define */

  uint32_t Alternate;  /*!< Peripheral to be connected to the selected pins. 
                            This parameter can be a value of @ref GPIO_Alternate_function_selection */
}GPIO_InitTypeDef;

复制代码

 

作用是:设置要用的是哪个引脚、引脚工作模式、上拉还是下拉、速度、XX这个还不知道是干嘛的XX。

2.使能时钟。

  /* GPIO Ports Clock Enable */
  __HAL_RCC_GPIOH_CLK_ENABLE();
  __HAL_RCC_GPIOD_CLK_ENABLE();

 这里使能时钟的方法与标准库不一样,HAL库其实是宏定义,标准库则是函数。

宏定义(使能H口的宏定义):

复制代码

#define __HAL_RCC_GPIOH_CLK_ENABLE()  do { \
                                        __IO uint32_t tmpreg = 0x00U; \
                                        SET_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOHEN);\
                                        /* Delay after an RCC peripheral clock enabling */ \
                                        tmpreg = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOHEN);\
                                        UNUSED(tmpreg); \
                                         } while(0U)

复制代码

 这里使能H口是因为H口接的外部晶振。

3.配置引脚的初始化电平。

  /*Configure GPIO pin Output Level */
  HAL_GPIO_WritePin(GPIOD, GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15, GPIO_PIN_SET);

 这里设置D口的pin12、pin13、pin14、pin15为高电平。如果最后一个参数是GPIO_PIN_RESET则为低电平。

4.通过结构体变量配置具体的引脚。

复制代码

  /*Configure GPIO pin : PD11 */
  GPIO_InitStruct.Pin = GPIO_PIN_11;
  GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
  GPIO_InitStruct.Pull = GPIO_PULLUP;
  HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);

  /*Configure GPIO pins : PD12 PD13 PD14 PD15 */
  GPIO_InitStruct.Pin = GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
  HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);

复制代码

 

PD11为输入,上拉。PD12-15为推挽输出。所以分开配置。

总结一下:(1)定义结构体变量。(2)使能时钟。(3)配置初始化电平。(4)通过结构体变量初始化GPIO。

其中,(3)和(4)可调换顺序

 二  功能解释

1.系统分析。

STM32F4Discovery的PD12-15的四个引脚是LED。

我们要做的功能是按键一次点亮一个LED(顺时针PIN12-15,从PIN12开始)并关闭上一个LED。

首先我们需要一个标志变量来代表当前正在亮的LED:

int LEDNUM_Flag = 12;

 流程:按键扫描  ->  读到Pin11按下  ->  关闭当前LEDNUM_Flag代表的LED(正在亮的)  ->  LEDNUM_Flag+1  ->  点亮当前LEDNUM_Flag代表的LED;

2.按键输入。

复制代码

_Bool GetPress(void)
{
    if(HAL_GPIO_ReadPin(GPIOD,GPIO_PIN_11)==0)
    {
        HAL_Delay(10);//防抖
        if(HAL_GPIO_ReadPin(GPIOD,GPIO_PIN_11)==0)
            {
                while(HAL_GPIO_ReadPin(GPIOD,GPIO_PIN_11)==0)//等待按键抬起。
                {;}
                return 1;
            }
            else return 0;
    }
    else    return 0;
}

复制代码

 

3.点亮LED。

复制代码

void TurnOnLED(int flag)
{
    switch(flag)
    {
        case 12 :
            HAL_GPIO_WritePin(GPIOD, GPIO_PIN_12, GPIO_PIN_SET);
            break;
        case 13 :
            HAL_GPIO_WritePin(GPIOD, GPIO_PIN_13, GPIO_PIN_SET);
            break;
        case 14 :
            HAL_GPIO_WritePin(GPIOD, GPIO_PIN_14, GPIO_PIN_SET);
            break;
        case 15 :
            HAL_GPIO_WritePin(GPIOD, GPIO_PIN_15, GPIO_PIN_SET);
            break;
    }
}

复制代码

 

4.关闭LED。

复制代码

void TurnOffLED(int flag)
{
    switch(flag)
    {
        case 12 :
            HAL_GPIO_WritePin(GPIOD, GPIO_PIN_12, GPIO_PIN_RESET);
            break;
        case 13 :
            HAL_GPIO_WritePin(GPIOD, GPIO_PIN_13, GPIO_PIN_RESET);
            break;
        case 14 :
            HAL_GPIO_WritePin(GPIOD, GPIO_PIN_14, GPIO_PIN_RESET);
            break;
        case 15 :
            HAL_GPIO_WritePin(GPIOD, GPIO_PIN_15, GPIO_PIN_RESET);
            break;
    }
}

复制代码

 

5.标志变量自加。

复制代码

void FlagPlus(int *flag)
{
    (*flag)++;
    if((*flag)==16)
    {
        (*flag)=12;
    }
}

复制代码

 

这里一定要用指针,因为函数参数是值传递所以只能用指针来改变LEDNUM_Flag。

6.整合代码。

复制代码

#include "main.h"
#include "stm32f4xx_hal.h"

void SystemClock_Config(void);
static void MX_GPIO_Init(void);

int LEDNUM_Flag = 12;
    
_Bool GetPress(void);

void TurnOnLED(int flag);

void TurnOffLED(int flag);

void FlagPlus(int *flag);

int main(void)
{

  HAL_Init();
  SystemClock_Config();
  MX_GPIO_Init();
  //最开始先点亮PD12的LED
  HAL_GPIO_WritePin(GPIOD, GPIO_PIN_12, GPIO_PIN_SET);

  while (1)
  {
    //有按键按下
    if(GetPress()==1)
        {
            TurnOffLED(LEDNUM_Flag);
            FlagPlus(&LEDNUM_Flag);
            TurnOnLED(LEDNUM_Flag);
        }
  }
}

/** System Clock Configuration
*/
void SystemClock_Config(void)
{

  RCC_OscInitTypeDef RCC_OscInitStruct;
  RCC_ClkInitTypeDef RCC_ClkInitStruct;

    /**Configure the main internal regulator output voltage 
    */
  __HAL_RCC_PWR_CLK_ENABLE();

  __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);

    /**Initializes the CPU, AHB and APB busses clocks 
    */
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
  RCC_OscInitStruct.HSIState = RCC_HSI_ON;
  RCC_OscInitStruct.HSICalibrationValue = 16;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;
  RCC_OscInitStruct.PLL.PLLM = 8;
  RCC_OscInitStruct.PLL.PLLN = 168;
  RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
  RCC_OscInitStruct.PLL.PLLQ = 4;
  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }

    /**Initializes the CPU, AHB and APB busses clocks 
    */
  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|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(__FILE__, __LINE__);
  }

    /**Configure the Systick interrupt time 
    */
  HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);

    /**Configure the Systick 
    */
  HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);

  /* SysTick_IRQn interrupt configuration */
  HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
}

/** Configure pins as 
        * Analog 
        * Input 
        * Output
        * EVENT_OUT
        * EXTI
*/
static void MX_GPIO_Init(void)
{

  GPIO_InitTypeDef GPIO_InitStruct;

  /* GPIO Ports Clock Enable */
  __HAL_RCC_GPIOH_CLK_ENABLE();
  __HAL_RCC_GPIOD_CLK_ENABLE();

  /*Configure GPIO pin Output Level */
  HAL_GPIO_WritePin(GPIOD, GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15, GPIO_PIN_RESET);

  /*Configure GPIO pin : PD11 */
  GPIO_InitStruct.Pin = GPIO_PIN_11;
  GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
  GPIO_InitStruct.Pull = GPIO_PULLUP;
  HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);

  /*Configure GPIO pins : PD12 PD13 PD14 PD15 */
  GPIO_InitStruct.Pin = GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
  HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);

}

/////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////
_Bool GetPress(void)
{
    if(HAL_GPIO_ReadPin(GPIOD,GPIO_PIN_11)==0)
    {
        HAL_Delay(10);
        if(HAL_GPIO_ReadPin(GPIOD,GPIO_PIN_11)==0)
            {
                while(HAL_GPIO_ReadPin(GPIOD,GPIO_PIN_11)==0)
                {;}
                return 1;
            }
            else return 0;
    }
    else    return 0;
}

void TurnOnLED(int flag)
{
    switch(flag)
    {
        case 12 :
            HAL_GPIO_WritePin(GPIOD, GPIO_PIN_12, GPIO_PIN_SET);
            break;
        case 13 :
            HAL_GPIO_WritePin(GPIOD, GPIO_PIN_13, GPIO_PIN_SET);
            break;
        case 14 :
            HAL_GPIO_WritePin(GPIOD, GPIO_PIN_14, GPIO_PIN_SET);
            break;
        case 15 :
            HAL_GPIO_WritePin(GPIOD, GPIO_PIN_15, GPIO_PIN_SET);
            break;
    }
}

void TurnOffLED(int flag)
{
    switch(flag)
    {
        case 12 :
            HAL_GPIO_WritePin(GPIOD, GPIO_PIN_12, GPIO_PIN_RESET);
            break;
        case 13 :
            HAL_GPIO_WritePin(GPIOD, GPIO_PIN_13, GPIO_PIN_RESET);
            break;
        case 14 :
            HAL_GPIO_WritePin(GPIOD, GPIO_PIN_14, GPIO_PIN_RESET);
            break;
        case 15 :
            HAL_GPIO_WritePin(GPIOD, GPIO_PIN_15, GPIO_PIN_RESET);
            break;
    }
}

void FlagPlus(int *flag)
{
    (*flag)++;
    if((*flag)==16)
    {
        (*flag)=12;
    }
}
/////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////
/**
  * @brief  This function is executed in case of error occurrence.
  * @param  None
  * @retval None
  */
void _Error_Handler(char * file, int line)
{
  /* USER CODE BEGIN Error_Handler_Debug */
  /* User can add his own implementation to report the HAL error return state */
  while(1) 
  {
  }
  /* USER CODE END Error_Handler_Debug */ 
}

#ifdef USE_FULL_ASSERT

/**
   * @brief Reports the name of the source file and the source line number
   * where the assert_param error has occurred.
   * @param file: pointer to the source file name
   * @param line: assert_param error line source number
   * @retval None
   */
void assert_failed(uint8_t* file, uint32_t line)
{
  /* USER CODE BEGIN 6 */
  /* User can add his own implementation to report the file name and line number,
    ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
  /* USER CODE END 6 */

}

#endif

复制代码

 三  重要的API。

复制代码

//IO口使能,  注意这里是D口
__HAL_RCC_GPIOD_CLK_ENABLE();

//设置推挽输出的IO口输出电平为低
HAL_GPIO_WritePin(GPIOD, GPIO_PIN_12, GPIO_PIN_RESET);

//设置推挽输出的IO口输出电平为高
HAL_GPIO_WritePin(GPIOD, GPIO_PIN_12, GPIO_PIN_SET);

//初始化一个IO口为输入
GPIO_InitStruct.Pin = GPIO_PIN_11;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_PULLUP;
HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);

//初始化IO为推挽输出
GPIO_InitStruct.Pin = GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);

//读取一个输入IO口的电平
HAL_GPIO_ReadPin(GPIOD,GPIO_PIN_11);

 

出处:https://www.cnblogs.com/feipeng8848/p/7248898.html

 

STM32-GPIO知识 内容来自:基于STM32CubeMX的嵌入式开发基础教程P2 https://www.bilibili.com/video/BV1m7411H7oT?p=2&spm_id_from=pageDriver 实现输入中文 实现小灯闪烁的代码1: 方法二:点击debug 烧录2(上图点setting,之后进入这个画面) 对应代码如下: 来自PPT:(E:\工作室\IOT\STM32-CubeMX原理讲解) 有关下图:PB6(B组6号引.. 阅读详情

相关推荐

HAL库版STM32串口重映射指南:以USART1切换PB6/PB7为例

本文详细介绍了HAL库版STM32串口重映射的实现方法,以USART1切换PB6/PB7为例,对比标准库与HAL库的差异,并深入解析CubeMX可视化配置的每一个细节。通过实战案例,帮助开发者快速掌握串口端口复用技术,解决硬件设计中的引脚冲突问题。

weixin_42561143的博客 335

STM32_HAL基本设置操作

选择芯片,直接输入就行 选择下载方式,硬件BOOT0与BOOT1需拉低。 选择外部高速时钟 时钟倍频不分频 配置PB13输入 配置PB15输出 保存位置 配置输出文件 点击GENERATE CODE创建工程 打开后配置一下keil 基本的设置 GPIO_InitStruct.Pin = GPIO_PIN_13; //端口 GPIO_InitStruct.Mode = GPIO_MODE_INPUT; //输入 ...

qq_24426625的博客 1094

STM32F103/F407/H743不同GPIO速度配置(HAL库)对应的最高速度

详细介绍了STM32F103/F407/H743不同GPIO速度配置(HAL库)对应的最高速度。

kevin1499的博客 5592

STM32【H7】理论——GPIO

文章目录1. GPIO1.1 GPIIO 功能模式分析1.2 推挽输出1.3 开漏输出1.4 复用推挽和开漏1.5 四种输入模式1.6 GPIO 的拉电流负载和灌电流负载能力1.7 IO 补偿单元(高速IO)1.8 GPIIO 兼容 CMOS 和 TTL 电平 使用芯片:STM32H743XIH6 . 开发板:安富莱V7 1. GPIO 对于不使用的引脚,推荐设置为模拟模式,悬空即可。 GPIO 的速度等级高的时候,最好使能 IO 补偿单元。 GPIO 还涉及到一个注入电流的问题,详见:http:/

- 3211

STMicroelectronics 系列:STM32L1 系列_(4).STM32L1系列外设功能

STM32L1系列提供了丰富的外设功能,包括GPIO、UART、I2C和SPI等。通过合理配置这些外设,可以实现多种数据输入输出和通信功能。使用STM32 HAL库可以简化外设的配置和操作过程,提高开发效率。本文档详细介绍了这些外设的基本概念、配置方法和操作示例,希望能对开发STM32L1系列单片机的开发者有所帮助。

2401_87715305的博客 1004

STM32 HAL库本质解析:从时钟树到GPIO映射的工程化认知

嵌入式开发中,HAL库并非黑盒工具,而是建立在ARM Cortex-M内核与ST定制外设协同之上的硬件抽象层。其核心原理源于对时钟树结构、GPIO寄存器映射、外设时钟门控等底层物理机制的精确建模。理解这些原理,是实现稳定UART通信、低功耗设计及跨芯片迁移的技术前提;在实际工程中,它支撑着从LED控制到Modbus协议栈的全栈开发,并直接影响中断响应、波特率精度与EMI性能等关键指标。本文以STM32F103C8T6为载体,深入拆解HAL库背后不可绕过的硬件事实。

weixin_42584507的博客 46

HAL库深入了解--STM32与GPIO

STM32本质上是一款SoC芯片,集成了CPU、存储器、时钟系统、外设控制器等完整系统组件。但在行业中通常被称为MCU(微控制器),以区别于手机处理器等高性能SoC。STM32系列中MP1型号因支持Linux系统而被归类为MPU/SoC。使用GPIO需四个步骤:使能、功能选择、方向设置和输出值配置。借助STM32CubeMX和HAL库可简化前三步操作,底层仍通过寄存器实现控制。HAL库本质是对寄存器操作的封装,开发时通常不直接操作寄存器地址。

2403_87830841的博客 715

STM32F2系列微控制器固件库V1.9.0项目实战

STM32Cube是ST公司提供的一整套用于简化STM32微控制器开发的软件组件和工具的生态系统。它通过可配置的软件组件、图形化配置工具和嵌入式软件库,使得开发者能够轻松配置、生成初始化代码,并快速进入微控制器应用的开发阶段。本章节将首先介绍STM32Cube生态系统的核心组成部分,并通过实战案例展示如何利用这个生态系统进行项目开发。中间件是一种位于操作系统和应用程序之间的软件,它为应用程序提供了一种相对独立的运行环境和一系列公共服务。

weixin_30923011的博客 637

基于stm32的gpio实验HAL库方式实现

这篇文章是自己有感而发,根据自己所拥有的硬件平台进行验证一下,顺便给一些初学者一些启发。

weixin_44317448的博客 472

深入解析CAN总线BusOff故障的检测与恢复机制

本文深入解析了CAN总线BusOff故障的检测与恢复机制。BusOff是CAN节点因发送错误过多而被强制离线的一种严重状态。文章详细阐述了其触发原理,即发送错误计数器(TEC)超过255,并重点介绍了通过软件实现的快慢恢复机制,以增强网络在异常情况下的稳定性和韧性。

weixin_29158047的博客 525

论文阅读------Exposure Fusion: A Simple and Practical Alternative to High Dynamic Range Photography

Mertens T, Kautz J, Van Reeth F. Exposure fusion: A simple and practical alternative to high dynamic range photography[C]//Computer graphics forum. Oxford, UK: Blackwell Publishing Ltd, 2009, 28(1): 161-171. 摘要 本文提出了一种将包围曝光的序列融合到高质量图像中的技术,而无需先转换为高动态范围(HD.

qq_25283239的博客 3397

HAL库 vs 标准库:用STM32CubeMX+Keil5实测GPIO翻转速度差异

本文通过STM32CubeMX+Keil5搭建对比工程,实测了HAL库与标准库在GPIO翻转速度上的显著差异。实验表明,在相同硬件与配置下,标准库的翻转速度比HAL库快50%以上,且代码体积更小。文章深入分析了HAL库因抽象层、状态检查等设计哲学带来的效率瓶颈,并为不同应用场景提供了库选型与优化策略。

h3i4j的博客 761

【数据集介绍】MVTec 3D AD数据集介绍

MVTec AD(MVTec Anomaly Detection)数据集是用于异常检测的计算机视觉数据集。该数据集包含来自工业生产中不同材料和产品的图像,包括玻璃、塑料、纺织品等。每个类别都包含正常样本和异常样本。这些异常样本包括各种常见的生产缺陷,如划痕、裂纹、凹陷等。MVTec AD数据集旨在帮助研究人员和从业者开发和评估用于检测工业制造中物体缺陷的算法和系统。

原来也有北瓜 7753

STM32 HAL 库开启串口中断

stm32 HAL 设置串口中断函数 void HAL_UART_MspInit(UART_HandleTypeDef* huart),该函数位于stm32f0xx_hal_msp.c ,该文件存放板级初始化代码。关键点 HAL_NVIC_SetPriority(USART1_IRQn, 0, 0);设置中断优先级 ,和 开启中断。

dzdesigned的专栏 978

YOLO + SubspaceAD:一张良品图,检出所有未知缺陷

当YOLO遇上子空间建模,工业质检正迎来从“见多识广”到“举一反三”的质变时刻。

①答疑群聊服务;②YOLO大模型知识问答系统;③计算机视觉论文生成智能体; 498

K8S搭建(centos)四、安装K8S

每个人都有惰性,但不断学习是好好生活的根本,共勉!

感谢阅读 2650

STM32:GPIO操作(HAL库)

/连接 AF7 复用为串口 1 的发送引脚。1) 使能 IO 口时钟,调用函数为__HAL_RCC_GPIOX_CLK_ENABLE(其中 X=A~K)。

chn_zx的博客 1426

基于mengzi-t5训练生成式模型

【代码】基于mengzi-t5训练生成式模型。

开卷有益 171

STM32CubeMX:GPIO操作

芯片:STM32F103C8T6 应用管脚:输出:PA0、PA1 输入:PB9 配置界面   /* USER CODE BEGIN WHILE */   while (1)   {   /* USER CODE END WHILE */   /* USER CODE BEGIN 3 */ HAL_GPIO_WritePin(GPIOA,LED0_Pin,(GPIO_PinS

随便写写,记录点点滴滴 4553

在 MATLAB/Simulink 中构建一个固定地面站天线指向控制系统的完整仿真模型

在卫星通信系统中,地面站天线负责与在轨卫星建立高增益、高稳定性的通信链路。对于固定地面站(如卫星测控站、深空站、VSAT主站),天线必须具备高精度指向能力,以确保波束始终对准卫星。然而,卫星(尤其是低轨卫星)在天空中快速移动,地面站天线必须实时跟踪其轨迹。此外,环境扰动(风载、热变形、机械误差)也会导致指向偏差。因此,设计一个高精度、高鲁棒性的天线指向控制系统(Antenna Pointing Control System)至关重要。本文将手把手教你如何在中构建一个固定地面站天线指向控制系统。

amy_mhd的博客 133

嵌入式代码审计中常见的漏洞(四)

经过漫长时间的迭代更新,内容从一开始的碎片化网罗搜集,到排版与整合划分,再到学习与实践验证,最后摒弃初始,用自己的语言与实践结论通俗的将它展现出来。强化知识技能的同时也为读者带来更好的阅读体验。 本篇介绍了以下代码安全问题: 编号 漏洞 1 敏感信息硬编码 2 未初始化安全 3 越界访问 4 迭代器失效 5 迭代器尾部解引用

武天旭的博客 3318

00-HAL库理论

【代码】00.HAL库理论。

qq_37498562的博客 192

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

【2.1】stm32外设:GPIO

引脚设置推挽输出,其特点是可输出高低电平驱动能力强,而设置开漏输出时不能输出高电平,除非有上拉。BSRR寄存器分16位BSRRL(配置IO的置位状态1)和16位BSRRH(配置复位状态)。每组IO口有10个寄存器,如GPIOA~GPIOC有3组,就有3*10=30个寄存器。按键按下会有抖动,需要消抖:软件消抖,即通过延时跳过抖动的时间段,再判断IO输入电平。配置IO需要2位时,32位寄存器配置一组IO口,配置IO口需要1位时,高16位保留。key.c(以上图PE4引脚为例)电路连接:推挽输出控制LED灯。

gouxf_0219的博客 544

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

上一篇: STM32 之二 HAL库详解 及 手动移植
下一篇: Linux命令:修改文件权限命令chmod、chgrp、chown详解
oshan2012
博客等级 码龄15年 300粉丝 91原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值