精华内容
下载资源
问答
  • files at the end of STM32HAL_SOURCES: <pre><code> ... HAL_stm32f4xx_hal_fmc_c_FILE-NOTFOUND HAL_stm32f4xx_hal_fsmc_c_FILE-NOTFOUND HAL_stm32f4xx_hal_sdmmc_c_FILE-NOTFOUND HAL_stm32f4xx_hal_usb_c_...
  • STM32 HAL UART 收发正常

    2018-12-20 10:12:12
    STM32 HAL UART 收发正常,基于HAL库特性定制的。STM32 HAL UART 收发正常,基于HAL库特性定制的。
  • STM32HAL库 F103.rar

    2021-02-08 16:18:40
    HAL库 CUBEMX STM32HAL库编程必备
  • stm32 HAL库 例程

    2018-07-10 15:00:50
    stm32HAL库各种基础例程,可直接使用。
  • stm32 hal库相关文档.zip

    2019-10-11 15:49:35
    主要为stm32一系列的hal文档,STM32HAL库 F103。STM32L1xx HAL驱动说明(描述)
  • STM32HAL库函数用户手册(英文) Description of STM32F4xx HAL drivers
  • STM32 HAL库官方详解

    2017-11-07 16:00:27
    很难得的Hal库驱动文件详解 可以查询Hal库函数 方便STM32 HAL开发
  • stm32 hal库的例程

    2018-08-12 21:21:29
    stm32 hal库的例程, YONG用HALL实现更加方便 大势所趋
  • STM32 HAL库详解

    万次阅读 多人点赞 2019-09-02 14:15:38
    STM32 HAL库整体总结 STM32 之二 HAL库详解 及 手动移植 本篇博客是对以上参考资源的一个二次总结与整理。 1. HAL库文件结构 对于开发人员而言,首先要清楚 HAL 库的文件结构。 根据文件类型可认为以下两大类: 库...

    STM32 HAL库整体总结

    STM32 之二 HAL库详解 及 手动移植

    本篇博客是对以上参考资源的一个二次总结与整理。

    1. HAL库文件结构

    对于开发人员而言,首先要清楚 HAL 库的文件结构。

    根据文件类型可认为以下两大类:

    库文件:
    	stm32f2xx_hal_ppp.c/.h			// 主要的外设或者模块的驱动源文件,包含了该外设的通用API
    	stm32f2xx_hal_ppp_ex.c/.h		// 外围设备或模块驱动程序的扩展文件。这组文件中包含特定型号或者系列的芯片的特殊API。以及如果该特定的芯片内部有不同的实现方式,则该文件中的特殊API将覆盖_ppp中的通用API。
    	stm32f2xx_hal.c/.h				// 此文件用于HAL初始化,并且包含DBGMCU、重映射和基于systick的时间延迟等相关的API
    	其他库文件
    用户级别文件:
    	stm32f2xx_hal_msp_template.c	// 只有.c没有.h。它包含用户应用程序中使用的外设的MSP初始化和反初始化(主程序和回调函数)。使用者复制到自己目录下使用模板。
    	stm32f2xx_hal_conf_template.h	// 用户级别的库配置文件模板。使用者复制到自己目录下使用
    	system_stm32f2xx.c				// 此文件主要包含SystemInit()函数,该函数在刚复位及跳到main之前的启动过程中被调用。 **它不在启动时配置系统时钟(与标准库相反)**。 时钟的配置在用户文件中使用HAL API来完成。
    	startup_stm32f2xx.s				// 芯片启动文件,主要包含堆栈定义,终端向量表等
    	stm32f2xx_it.c/.h				// 中断服务函数的相关实现
    	main.c/.h						//
    

    与我们密切相关的有

    • 主函数: main.c/.h
    • MSP初始化: stm32f2xx_hal_msp_template.c
    • 中断服务函数: stm32f2xx_it.c/.h

    2. HAL库用户代码

    HAL 库对底层进行了抽象,在此结构下,用户代码处理可分为三大部分:

    • 句柄
    • MSP
    • 回调函数

    关于这三点,也可参考这里进行理解,

    1、关于句柄

    HAL库在结构上,对每个外设抽象成了一个称为ppp_HandleTypeDef的结构体,其中ppp就是每个外设的名字。

    与标准库中的结构体相比,HAL 库中的结构体包含了其可能出现的所有定义,比如用户想要使用ADC,只要定义一个ADC_HandleTypeDef的全局变量,针对不同的应用场景配置不同结构体成员就可以满足使用要求。

    2、MSP
    MSP(MCU Specific Package,单片机的具体方案),是指和MCU相关的初始化

    初始化函数包含的内容可分为两部分:

    • 一部分是与MCU无关的,通信协议;
    • 一部分是与MCU相关的,引脚功能。

    这里可以结合博主关于串口的说明USART and UART进行理解。

    以串口为例,在 MX_USART1_UART_Init(void) 函数中初始化串口的波特率、停止位、奇偶校验等,这部分代码是与串口协议相关的,并未涉及到具体的引脚,因此与 MCU 是无关的,是抽象的。

    static void MX_USART1_UART_Init(void)
    {
    
      huart1.Instance = USART1;
      huart1.Init.BaudRate = 115200;  
      huart1.Init.WordLength = UART_WORDLENGTH_8B;
      huart1.Init.StopBits = UART_STOPBITS_1;
      huart1.Init.Parity = UART_PARITY_NONE;
      huart1.Init.Mode = UART_MODE_TX_RX;
      huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
      huart1.Init.OverSampling = UART_OVERSAMPLING_16;
      huart1.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
      huart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
      if (HAL_UART_Init(&huart1) != HAL_OK)
      {
        _Error_Handler(__FILE__, __LINE__);
      }
        __HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE);
    
    }
    

    stm32f0xx_hal_msp.c 文件中的 HAL_UART_MspInit(UART_HandleTypeDef* huart) 函数中将串口所时用的 MCU 引脚模式进行配置,这部分是与 MCU 具体相关的。

    void HAL_UART_MspInit(UART_HandleTypeDef* huart)
    {
      // 关于 GPIO 引脚初始化的流程与上面介绍的“四步”相同
      GPIO_InitTypeDef GPIO_InitStruct;
      if(huart->Instance==USART2)   // USART 2
      {
      /* USER CODE BEGIN USART2_MspInit 0 */
    
      /* USER CODE END USART2_MspInit 0 */
        /* Peripheral clock enable */
        __HAL_RCC_USART2_CLK_ENABLE(); // 使能串口时钟
      
        /**USART2 GPIO Configuration    
        PA2     ------> USART2_TX
        PA3     ------> USART2_RX 
        */
        GPIO_InitStruct.Pin = USART2_TX_Pin|USART2_RX_Pin;  // 收发引脚
        GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;  // 复用推挽输出
        GPIO_InitStruct.Pull = GPIO_NOPULL;
        GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
        GPIO_InitStruct.Alternate = GPIO_AF1_USART2;  // 复用功能配置
        HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);  // 结构体初始化
    
        /* USART2 DMA Init */    // DMA 方式收发初始化
        /* USART2_RX Init */
        hdma_usart2_rx.Instance = DMA1_Channel3;
        hdma_usart2_rx.Init.Direction = DMA_PERIPH_TO_MEMORY;
        hdma_usart2_rx.Init.PeriphInc = DMA_PINC_DISABLE;
        hdma_usart2_rx.Init.MemInc = DMA_MINC_ENABLE;
        hdma_usart2_rx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
        hdma_usart2_rx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
        hdma_usart2_rx.Init.Mode = DMA_NORMAL;
        hdma_usart2_rx.Init.Priority = DMA_PRIORITY_LOW;
        if (HAL_DMA_Init(&hdma_usart2_rx) != HAL_OK)
        {
          _Error_Handler(__FILE__, __LINE__);
        }
    
        __HAL_DMA1_REMAP(HAL_DMA1_CH3_USART2_RX);
    
        __HAL_LINKDMA(huart,hdmarx,hdma_usart2_rx);
    
        /* USART2_TX Init */
        hdma_usart2_tx.Instance = DMA1_Channel4;
        hdma_usart2_tx.Init.Direction = DMA_MEMORY_TO_PERIPH;
        hdma_usart2_tx.Init.PeriphInc = DMA_PINC_DISABLE;
        hdma_usart2_tx.Init.MemInc = DMA_MINC_ENABLE;
        hdma_usart2_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
        hdma_usart2_tx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
        hdma_usart2_tx.Init.Mode = DMA_NORMAL;
        hdma_usart2_tx.Init.Priority = DMA_PRIORITY_LOW;
        if (HAL_DMA_Init(&hdma_usart2_tx) != HAL_OK)
        {
          _Error_Handler(__FILE__, __LINE__);
        }
    
        __HAL_DMA1_REMAP(HAL_DMA1_CH4_USART2_TX);
    
        __HAL_LINKDMA(huart,hdmatx,hdma_usart2_tx);
    
        /* USART2 interrupt Init */
        HAL_NVIC_SetPriority(USART2_IRQn, 0, 0);
        HAL_NVIC_EnableIRQ(USART2_IRQn);
      /* USER CODE BEGIN USART2_MspInit 1 */
    
      /* USER CODE END USART2_MspInit 1 */
      }
    }
    

    3、回调函数
    在标准库中,串口中断了以后,我们要先在中断中判断是否是接收中断,然后读出数据,顺便清除中断标志位,然后再是对数据的处理。这样如果我们在一个中断函数中写这么多代码,就会显得很混乱。

    而在HAL库中,以GPIO为例,进入中断后,直接由HAL库中断函数HAL_GPIO_EXTI_IRQHandler() 进行托管。
    而该函数主要完成两项任务:

    • 清除中断标志位
    • 调用回调函数处理中断
    // EXIT 外部中断服务函数
    void EXTI0_1_IRQHandler(void)
    {
      HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_10);
    }
    
    
    // HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_10)函数如下
    void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin)
    {
      /* EXTI line interrupt detected */
      if(__HAL_GPIO_EXTI_GET_IT(GPIO_Pin) != RESET) 
      { 
        __HAL_GPIO_EXTI_CLEAR_IT(GPIO_Pin);
        HAL_GPIO_EXTI_Callback(GPIO_Pin);
      }
    }
    

    在回调函数内对中断进行处理,这种方式增强了代码的逻辑性,但也增加了文件的嵌套程度。

    3. HAL库编程方式

    在 HAL 库中对外设模型进行了统一,支持三种编程方式:

    • 轮询模式/阻塞模式
    • 中断方式
    • DMA模式

    以IIC为例,三种编程模式对应的函数如下:

    1、轮询模式/阻塞模式

    HAL_I2C_Master_Transmit()HAL_I2C_Master_Receive()HAL_I2C_Slave_Transmit()HAL_I2C_Slave_Receive()
    HAL_I2C_Mem_Write()HAL_I2C_Mem_Read()HAL_I2C_IsDeviceReady()
    

    2、中断模式

    HAL_I2C_Master_Transmit_IT()HAL_I2C_Master_Receive_IT()HAL_I2C_Slave_Transmit_IT()
    HAL_I2C_Slave_Receive_IT()HAL_I2C_Mem_Write_IT()HAL_I2C_Mem_Read_IT()
    

    3、DMA模式

    HAL_I2C_Master_Transmit_DMA()HAL_I2C_Master_Receive_DMA()HAL_I2C_Slave_Transmit_DMA()HAL_I2C_Slave_Receive_DMA()HAL_I2C_Mem_Write_DMA()HAL_I2C_Mem_Read_DMA()
    
    展开全文
  • 基于STM32 HAL库的定时任务调度器例程。 详情可以搜索博文《使用HAL库开发STM32(基于F4):系统时间基础及进阶使用》。
  • STM32 hal库PWM输出程序

    2020-03-15 21:58:53
    STM32 hal库基于定时器TIM的PWM输出基础程序,用STM32CUBEMX配置的程序,只需要简单设置即可,包含了最基础的定时器中断控制,初学者容易学习,
  • STM32 HAL库开发教程

    2016-06-12 09:54:53
    STM32 HAL库开发教程,首家
  • STM32 hal库定时器TIM基础程序,用STM32CUBEMX配置的程序,只需要简单设置即可,最基础的定时器中断控制,初学者容易学习,
  • STM32 HAL

    2020-03-18 20:31:10
    STM32 HALSTM32Cube_FW_F1_V1.8.0 链接:https://pan.baidu.com/s/1OxI0HhQ4gTN_Hv2isjuZHg 提取码:y22d

    1.下载地址

    链接: STM32Cube_FW_F1_V1.8.0
    提取码:y22d

    2.内容介绍

    解压下载好的STM32Cube_FW_F1_V1.8.0.zip,解压好的目录结构如下图所示:
    在这里插入图片描述
    推荐教程:
    STM32CubeMX介绍、下载与安装

    展开全文
  • SH85 温湿度传感器 STM32 HAL 库驱动。使用的是硬件IIC。已经经过测试STM32L433 与STM32F429,驱动好用。资源内附SH85_HAL驱动文件,与STM32F429工程流程。
  • STM32 HAL库 CubeMX系列教程 目录

    千次阅读 2020-02-08 15:46:18
    STM32 HAL库 CubeMX系列教程 目录 已更新: 2020.02.05 STM32 HAL库 CubeMX教程(二)定时器基本使用 2020.02.06 STM32 HAL库 CubeMX教程(三)PWM呼吸灯 2020.02.07 STM32 HAL库 CubeMX教程(四)按键外部中断 2020...
    展开全文
  • 摘要:本期推送介绍使用如何HAL库操作Stm32的UART功能,本文内容对应《Mastering Stm32》8.2、8.3节内容,将介绍UART的初始化以及使用轮询模式发送接收数据,并以如下图的结构展开。1HAL库中UART相关结构体的内容本...
    摘要:本期推送介绍使用如何HAL库操作Stm32的UART功能,本文内容对应《Mastering Stm32》8.2、8.3节内容,将介绍UART的初始化以及使用轮询模式发送接收数据,并以如下图的结构展开。

    9ba3caa6571f684a48b96bf42dcd1be7.png

    fabacdcbc8d58f14a1404e7e107abda4.png

    1

    HAL库中UART相关结构体的内容

    本小节参考《description-of-stm32f0-hal-and-lowlayer-drivers-stmicroelectronics》、《STM32F051x 参考手册中文》。

    64dc2f23588fbfe5292e79e196d67896.png

    UART的结构体有两个,如图,UART_InitTypeDef是初始化结构体,包含UART开始运行时的配置;UART_HandleTypeDef是句柄结构体,包含UART所有运行时的信息。

    c5ec9a455d86afc498bc050d3ab959b1.png

    UART_InitTypeDef初始化结构体中包含,波特率、帧的字长、停止位长度、奇偶校验方式、工作模式、硬件流模式和过(超)采样率设置。

    64688bab2039190464af800e7cc82782.png

    其中过采样的目的类似于一种低通滤波,Stm32通过对一帧进行16次或者8次采样,并对采样结果进行“多数票决”来判断该帧为起始位或是数据位的0或1。详见《STM32F051x 参考手册中文》573页。

    7c68739feead55d0f34fca9844f7035e.png

    硬件流控制是通过硬件对UART传输进行更精细的控制的手段。UART传输中,Stm32通过nCTS端口读取对方的nRTS端口电平,获知对方是否准备好接受新的数据,这种操作可以避免数据寄存器中未被读出的旧数据被新数据刷新掉的情况发生。详见《STM32F051x 参考手册中文》604页。

    0bd5d002062cb377680bd13db99f7eec.png

    UART_HandleTypeDef是UART句柄结构体,包含了UART运行过程中HAL层的所有信息。2

    UART初始化三步

    在介绍Stm32的HAL初始化UART之前,我们先看一下Arduino怎么初始化UART的。

    67ae03bdd758d7a4ccb73df4e73970f5.png

    Arduino使用非常简便的一句话,Serial.begin(波特率); 来初始化UART,这一句话包含了三个内容:
    • UART对象——其代表我们要使用的UART外设;

    • UART启动——其代表根据UART参数启动串口;

    • UART参数——其代表UART以何种配置运行;

    d2a609cf989cb550e77f4f76fac259e3.png

    Stm32的HAL初始化过程也可以进行类比:

    4ae2a5485ef81655112ea298d0324079.png

    我们还可以用填表格来理解这三步操作:

    8770d391a6ef78f473004a234a080419.png

    2.1Step1-申明结构体变量-生成表格

    dda740725a39397987b7e20fb0cccd34.png

    申明一个UART_HandleTypeDef的结构体变量,图中的结构体是在main函数中声明,推荐在main.c的头部申明结构体,使其成为全局变量。

    8ef485aa5fac43fc26eeb4e0e84e5df4.png

    2.2Step2-配置UART参数-填写表格配置UART参数参数包括两步:

    6a1046268001b5e5e48f020b1069b8e6.png

    第一步是要给UART_HandleTypeDef结构体变量赋值

    • 将我们要使用的外设赋值给其instance字段。

    • 将波特率、帧长度等配合赋值给其UART_InitTypeDef初始化结构体变量的相应字段。

    ca70f75a8c5467513da34e96ef1cd7b2.png

    第二步是要配置与所使用的UART连接的GPIO口,因为任何外设想与外界交换数据都需要正确的和使用的GPIO进行绑定。

    在还未介绍的Step3中,我们需要调用HAL_UART_Init()初始化UART,HAL_UART_Init()又会调用HAL_UART_MspInit()对于单片机的Msp(MCU Specific Package 单片机的具体方案)进行配置,这里Msp就指具体配置哪个IO与UART进行连接。HAL_UART_MspInit()中配置GPIO又需要进行如下两步操作:1.定义GPIO_InitTypeDef初始化结构体变量作为所要初始化GPIO的配置的“暂存”。93dfbf92713cf319805e0a5d4a0409c1.png2.然后判断此次调用HAL_UART_MspInit()函数的UART外设,根据不同的UART外设对于相应的GPIO和时钟进行如下操作:
    • 启动所用UART外设的时钟。

    • 启用所用GPIO的时钟。

    • 配置GPIO_InitTypeDef初始化结构体变量(变量值如上图)。

    • 使用初始化函数初始化GPIO。

      44384206307077d3e9130516f40dd8ed.png

    2.3Step3-使用函数初始化UART-提交表格e91b8d049d0a74ddfec5dc05d990e4b0.png

    完成了UART的参数配置和IO配置之后,我们需要使用HAL_UART_Init()函数提交之前配置好的UART_HandleTypeDef结构体变量这个“表格”,使得Stm32按照我们的参数配置、IO配置启动。

    3

    使用轮询模式

    fabacdcbc8d58f14a1404e7e107abda4.png

    3.1UART通信的三种模式UART通信有三种模式,分别为轮询模式、中断模式、DMA模式,本小节介绍轮询模式通信。如果读者学过8位单片机的底层开发,应该能理解轮询模式和中断模式的区别以及中断模式比轮询模式在单片机任务较多时更为高效的原因。《Mastering Stm32》一书的248页也对两者的区别进行了阐述:

    54c6dfa3e54a48bd35984928cc56cfe7.png

    简单来说,轮询模式是内核在规定的阻塞时间内使用while循环读取传输的标志位,直到志位被置位才将数据写入或读出DR寄存器。而中断模式是传输完成的相关中断发生时,内核才放下手中的工作,将数据写入或读出DR寄存器。少了阻塞时间内的循环读取因此更高效。而DMA模式则更为高效,DMA作为内核的二弟,当传输完成中断发生时,帮助大哥将数据写入或读出DR寄存器,不需要打断大哥-内核的工作。3.2轮询模式

    45c2f1eab928b3b0b93fd2cde5c1a22e.png

    在轮询模式发送数据调用函数HAL_UART_Transmit() ,接收数据调用函数HAL_UART_Receive(),两者的传入参数列表,以及返回值意义相同,如下图,摘自《description-of-stm32f0-hal-and-lowlayer-drivers-stmicroelectronics》P572页。

    73b8d58cbe52c7f52edc9af89ffabd61.png

    下面演示两个函数的几种调用案例:

    /* 发送字符数组 */  char buff[2] = {'a','b'};  HAL_UART_Transmit(&huart3,(uint8_t *)buff,                      sizeof(buff),HAL_MAX_DELAY);
    /* 发送字符串 */  HAL_UART_Transmit(&huart3, (uint8_t*)"Hello",                       strlen("Hello"),HAL_MAX_DELAY);
    /* 接受字符数组 */  char readBuf[1];  HAL_UART_Receive(&huart2, (uint8_t*)readBuf, 1, HAL_MAX_DELAY);

    至此本文已经完成了对于Stm32使用HAL初始化UART,以及在轮询模式通信方法的阐述。
    展开全文
  • stm32L151C8T6,通过TIM2_CH2 PWM输出1khz驱动无源蜂鸣器,基于stm32HAL库,已下到板子调试运行,完全没问题。
  • STM32 HAL库 +freeRTOS+Keil 移植基于KEIL的pack库FREERTOS下载包,在STM32芯片的HAL库移植,不需要到FREERTOS下载安装包
  • stm32 HAL库 Flash操作简介目录第一stm32,flash介绍查看代码段,以判断代码长度flash的基本操作规则stm32 HAL库 Flash操作指南stm32f1xx_hal_flash.cstm32f1xx_hal_flash_ex.c代码实例 目录 stm32hal库确实提供...
  • STM32 HAL_LOCK问题

    千次阅读 2020-04-18 14:20:41
    STM32 HAL_LOCK问题 STM32 HAL_LOCK问题 在使用STM32HAL库开发时候,在使用UART和CAN的使用,偶尔会碰到突然不再接收数据的情况.调试发现,信号有的,但是就是软件不再进入接收中断了. 通过调试,最后定位到问题点在于_...
  • stm32f103c8t6, 0.96寸oled, 4线spi控制,基于stm32HAL库,已经在板子上测试通过,完全没问题。连接关键的引脚已经在代码中注释。
  • bmp280_stm32hal库——spi方式
  • STM32HAL_BH1750驱动_模拟IIC.rar
  • STM32 HAL库之GPIO配置

    2020-03-29 21:02:19
    STM32 HAL_GPIO配置
  • STM32HAL库串口截断不定长数据,通过定时器做闹钟计时,博客配套源码 https://blog.csdn.net/geek_monkey/article/details/89326199
  • STM32 HAL库 CUBEMX配置 ADC采集

    千次阅读 2020-10-14 22:56:09
    文章目录STM32 HAL库 CUBEMX配置 ADC采集软硬件型号1.单通道不定时任意时刻采集信号CUBEMX配置代码添加工程源码 STM32 HAL库 CUBEMX配置 ADC采集 软硬件型号 正点原子阿波罗STM32F428IG开发板 STM32CUBEMX+KEIL5...
  • stm32 hal zopt2202

    2018-01-31 10:37:33
    基于stm32f051 hal 库 zopt2202驱动代码 基于stm32f051 hal 库 zopt2202驱动代码 基于stm32f051 hal 库 zopt2202驱动代码
  • STM32 HAL 库开发实战指南—基于F7》
  • STM32 HAL CubeMX USART+DMA收发

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 9,770
精华内容 3,908
关键字:

stm32hal