精华内容
下载资源
问答
  • HAL库驱动详解.pdf

    2020-01-02 09:59:30
    STM32Cube HAL是STM32抽象层嵌入式软件,可确保最大化 跨STM32产品组合的可移植性 一套一致的中间件组件,例如RTOS,USB,TCP / IP,图形 所有嵌入式软件实用程序均附带全套示例。 HAL驱动程序层提供了一...
  • HAL 库有提供延时函数,只不过它只能实现简单的毫秒级别延时,没有实现 us 级别延时。 下面我们列出HAL 库实现延时相关的函数。首先是功能配置函数: //调用 HAL_SYSTICK_Config 函数配置每隔 1ms 中断一次 __weak ...
  • STM32正点原子Mini板例程源码,标准库例程源码。
  • app通过hal调用访问led

    2021-01-03 18:22:28
    app通过hal调用访问ledapp通过hal调用访问ledAndroid5.0app调用hal架构介绍以led为例向系统添加hal接口一、添加app访问的ILedService接口二、向系统添加ledservice三、JNI 提供本地方法四、分析JNI 是如何获取到我们...
  • gd32vf103xx-hal 适用于gd32vf103变体的HAL 该项目由开发和维护。 替代 执照 版权所有2019 特此授予以任何目的使用,复制,修改和/或分发此软件的许可,无论是否收费,只要上述版权声明和此许可声明出现在所有...
  • 有要hal部分视频的同学,正好也有,分享出来也当备个份 ----------------------------------- 总共分上部分和下部分,这是下部分,解压完一共10个视频 单个文件大小240M的限制,因此使用的是7-Zip压缩格式...
  • STM32 HAL库之USB

    2021-01-06 09:06:11
    stm32f1xx_hal_msp.c 文件定义了两个函数 HAL_MspInit 和 HAL_MspDeInit。这两个函数分别被文件 stm32f1xx_hal.c 中的 HAL_Init 和 HAL_DeInit 所调用。HAL_MspInit 函数的主要作用是进行 MCU相关的硬件初始化操作。...
  • STM32 HAL_LOCK问题

    2021-01-20 11:00:59
    STM32 HAL_LOCK问题 STM32 HAL_LOCK问题 在使用STM32的HAL库开发时候,在使用UART和CAN的使用,偶尔会碰到突然不再接收数据的情况.调试发现,信号有的,但是就是软件不再进入接收中断了. 通过调试,最后定位到问题点在于_...
  • HAL_PCDEx_SetRxFiFo 和 HAL_PCDEx_SetTxFiFo 这两个函数的作用是:该EndPoint数据传输最大数量的限定 除前面贴子里廛的影响数据传输量的函数外,这两个HAL_PCDEx_SetRxFiFo / HAL_PCDEx_SetTxFiFo函数也值得注意。 ...
  • 【STM32】HAL库 STM32CubeMX教程四---UART串口通信详解

    万次阅读 多人点赞 2019-08-11 08:57:51
    今天我们学习STM32CubeMX串口的操作,以及HAL库串口的配置,我们会详细的讲解各个模块的使用和具体功能,并且基于HAL库实现Printf函数功能重定向,UART中断接收,本系列教程将HAL库与STM32CubeMX结合在一起讲解,使...

    前言: 

    今天我们学习STM32CubeMX串口的操作,以及HAL库串口的配置,我们会详细的讲解各个模块的使用和具体功能,并且基于HAL库实现Printf函数功能重定向,UART中断接收,本系列教程将HAL库与STM32CubeMX结合在一起讲解,使您可以更快速的学会各个模块的使用

     

    所用工具

    1、芯片: STM32F407ZET6

    2、STM32CubeMx软件

    3、IDE: MDK-Keil软件

    4、STM32F1xx/STM32F4xxHAL库 

    5、串口: 使用USART1 PA9,PA10

    知识概括:

    通过本篇博客您将学到:

    STM32CubeMX创建串口例程

    HAL库UATR函数库

    重定义printf函数

    HAL库,UART中断接收

    HAL库UATR接收与发送例程

    工程创建

     

    1设置RCC

    • 设置高速外部时钟HSE 选择外部时钟源

    2设置串口

    • 1点击USATR1   
    • 2设置MODE为异步通信(Asynchronous)       
    • 3基础参数:波特率为115200 Bits/s。传输数据长度为8 Bit。奇偶检验无,停止位1      接收和发送都使能 
    • 4GPIO引脚设置 USART1_RX/USART_TX
    • 5 NVIC Settings 一栏使能接收中断

    3设置时钟

    我的是  外部晶振为8MHz 

    • 1选择外部时钟HSE 8MHz   
    • 2PLL锁相环倍频72倍
    • 3系统时钟来源选择为PLL
    • 4设置APB1分频器为 /2

    32的时钟树框图  如果不懂的话请看《【STM32】系统时钟RCC详解(超详细,超全面)》

     

    4项目文件设置

    • 1 设置项目名称
    • 2 设置存储路径
    • 3 选择所用IDE

    5创建工程文件

    然后点击GENERATE CODE  创建工程

    配置下载工具

    新建的工程所有配置都是默认的  我们需要自行选择下载模式,勾选上下载后复位运行

    HAL库UART函数库介绍

     

      UART结构体定义

    UART_HandleTypeDef huart1;

    UART的名称定义,这个结构体中存放了UART所有用到的功能,后面的别名就是我们所用的uart串口的别名,默认为huart1

    可以自行修改

    1、串口发送/接收函数

    • HAL_UART_Transmit();串口发送数据,使用超时管理机制 
    • HAL_UART_Receive();串口接收数据,使用超时管理机制
    • HAL_UART_Transmit_IT();串口中断模式发送  
    • HAL_UART_Receive_IT();串口中断模式接收
    • HAL_UART_Transmit_DMA();串口DMA模式发送
    • HAL_UART_Transmit_DMA();串口DMA模式接收

    这几个函数的参数基本都是一样的,我们挑两个讲解一下

    串口发送数据:

    HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)

    功能:串口发送指定长度的数据。如果超时没发送完成,则不再发送,返回超时标志(HAL_TIMEOUT)。

    参数:

    • UART_HandleTypeDef *huart      UATR的别名    如 :   UART_HandleTypeDef huart1;   别名就是huart1  
    • *pData      需要发送的数据 
    • Size    发送的字节数
    • Timeout   最大发送时间,发送数据超过该时间退出发送   
    举例:   HAL_UART_Transmit(&huart1, (uint8_t *)ZZX, 3, 0xffff);   //串口发送三个字节数据,最大传输时间0xffff

    中断接收数据:

    HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)

    功能:串口中断接收,以中断方式接收指定长度数据。
    大致过程是,设置数据存放位置,接收数据长度,然后使能串口接收中断。接收到数据时,会触发串口中断。
    再然后,串口中断函数处理,直到接收到指定长度数据,而后关闭中断,进入中断接收回调函数,不再触发接收中断。(只触发一次中断)

    参数:

    • UART_HandleTypeDef *huart      UATR的别名    如 :   UART_HandleTypeDef huart1;   别名就是huart1  
    • *pData      接收到的数据存放地址
    • Size    接收的字节数
    举例:    HAL_UART_Receive_IT(&huart1,(uint8_t *)&value,1);   //中断接收一个字符,存储到value中

    2、串口中断函数

     

    • HAL_UART_IRQHandler(UART_HandleTypeDef *huart);  //串口中断处理函数
    • HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart);  //串口发送中断回调函数
    • HAL_UART_TxHalfCpltCallback(UART_HandleTypeDef *huart);  //串口发送一半中断回调函数(用的较少)
    • HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart);  //串口接收中断回调函数
    • HAL_UART_RxHalfCpltCallback(UART_HandleTypeDef *huart);//串口接收一半回调函数(用的较少)
    • HAL_UART_ErrorCallback();串口接收错误函数

    串口接收中断回调函数:

    HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart);  

    功能:HAL库的中断进行完之后,并不会直接退出,而是会进入中断回调函数中,用户可以在其中设置代码,

               串口中断接收完成之后,会进入该函数,该函数为空函数,用户需自行修改,

    参数:

    • UART_HandleTypeDef *huart      UATR的别名    如 :   UART_HandleTypeDef huart1;   别名就是huart1  
    举例:   HAL_UART_RxCpltCallback(&huart1){           //用户设定的代码               }

    串口中断处理函数

    HAL_UART_IRQHandler(UART_HandleTypeDef *huart);  

    功能:对接收到的数据进行判断和处理  判断是发送中断还是接收中断,然后进行数据的发送和接收,在中断服务函数中使用

     

    如果接收数据,则会进行接收中断处理函数

     /* UART in mode Receiver ---------------------------------------------------*/
      if((tmp_flag != RESET) && (tmp_it_source != RESET))
      { 
        UART_Receive_IT(huart);
      }
    

    如果发送数据,则会进行发送中断处理函数

      /* UART in mode Transmitter ------------------------------------------------*/
      if (((isrflags & USART_SR_TXE) != RESET) && ((cr1its & USART_CR1_TXEIE) != RESET))
      {
        UART_Transmit_IT(huart);
        return;
      }

    3串口查询函数

      HAL_UART_GetState();  判断UART的接收是否结束,或者发送数据是否忙碌

      举例:     

    while(HAL_UART_GetState(&huart4) == HAL_UART_STATE_BUSY_TX)   //检测UART发送结束

     

    USART接收与发送

     

    重新定义printf函数

    • 在 stm32f4xx_hal.c中包含#include <stdio.h>
    #include "stm32f4xx_hal.h"
    #include <stdio.h>
    extern UART_HandleTypeDef huart1;   //声明串口
    • 在 stm32f4xx_hal.c 中重写fget和fput函数
    • /**
        * 函数功能: 重定向c库函数printf到DEBUG_USARTx
        * 输入参数: 无
        * 返 回 值: 无
        * 说    明:无
        */
      int fputc(int ch, FILE *f)
      {
        HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xffff);
        return ch;
      }
      
      /**
        * 函数功能: 重定向c库函数getchar,scanf到DEBUG_USARTx
        * 输入参数: 无
        * 返 回 值: 无
        * 说    明:无
        */
      int fgetc(FILE *f)
      {
        uint8_t ch = 0;
        HAL_UART_Receive(&huart1, &ch, 1, 0xffff);
        return ch;
      }
      
      在main.c中添加
     #define RXBUFFERSIZE  256
    char RxBuffer[RXBUFFERSIZE]; 
    
      while (1)
      {
        /* USER CODE END WHILE */
    			printf("Z小旋测试\n");
    			HAL_Delay(1000);
        /* USER CODE BEGIN 3 */
      }

    之后便可以使用Printf函数和Scanf,getchar函数

    UART接收中断

    因为中断接收函数只能触发一次接收中断,所以我们需要在中断回调函数中再调用一次中断接收函数

    具体流程:

    1、初始化串口

    2、在main中第一次调用接收中断函数

    3、进入接收中断,接收完数据  进入中断回调函数

    4、修改HAL_UART_RxCpltCallback中断回调函数,处理接收的数据,

    5  回调函数中要调用一次HAL_UART_Receive_IT函数,使得程序可以重新触发接收中断

    函数流程图:

    HAL_UART_Receive_IT(中断接收函数   ->  USART2_IRQHandler(void)(中断服务函数)    ->    HAL_UART_IRQHandler(UART_HandleTypeDef *huart)(中断处理函数)    ->    UART_Receive_IT(UART_HandleTypeDef *huart) (接收函数)   ->    HAL_UART_RxCpltCallback(huart);(中断回调函数)

    HAL_UART_RxCpltCallback函数就是用户要重写在main.c里的回调函数。

    代码实现:

        并在main.c中添加下列定义:

    #include <string.h>
    
    #define RXBUFFERSIZE  256     //最大接收字节数
    char RxBuffer[RXBUFFERSIZE];   //接收数据
    uint8_t aRxBuffer;			//接收中断缓冲
    uint8_t Uart1_Rx_Cnt = 0;		//接收缓冲计数
    

    在main()主函数中,调用一次接收中断函数

    /* USER CODE BEGIN 2 */
    	HAL_UART_Receive_IT(&huart1, (uint8_t *)&aRxBuffer, 1);
    /* USER CODE END 2 */
    

    在main.c下方添加中断回调函数

    /* USER CODE BEGIN 4 */
    
    void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
    {
      /* Prevent unused argument(s) compilation warning */
      UNUSED(huart);
      /* NOTE: This function Should not be modified, when the callback is needed,
               the HAL_UART_TxCpltCallback could be implemented in the user file
       */
     
    	if(Uart1_Rx_Cnt >= 255)  //溢出判断
    	{
    		Uart1_Rx_Cnt = 0;
    		memset(RxBuffer,0x00,sizeof(RxBuffer));
    		HAL_UART_Transmit(&huart1, (uint8_t *)"数据溢出", 10,0xFFFF); 	
            
    	}
    	else
    	{
    		RxBuffer[Uart1_Rx_Cnt++] = aRxBuffer;   //接收数据转存
    	
    		if((RxBuffer[Uart1_Rx_Cnt-1] == 0x0A)&&(RxBuffer[Uart1_Rx_Cnt-2] == 0x0D)) //判断结束位
    		{
    			HAL_UART_Transmit(&huart1, (uint8_t *)&RxBuffer, Uart1_Rx_Cnt,0xFFFF); //将收到的信息发送出去
                while(HAL_UART_GetState(&huart1) == HAL_UART_STATE_BUSY_TX);//检测UART发送结束
    			Uart1_Rx_Cnt = 0;
    			memset(RxBuffer,0x00,sizeof(RxBuffer)); //清空数组
    		}
    	}
    	
    	HAL_UART_Receive_IT(&huart1, (uint8_t *)&aRxBuffer, 1);   //再开启接收中断
    }
    /* USER CODE END 4 */
    

    发送数据被正常返回

     

     

    展开全文
  • 解决方法后边有红色大字提醒,直接看后边就可以,如果你没有时间想去了解HAL库的接收思想。 ST推的HAL库,在整个接收过程中,是没有用到串口的接收空闲中断,它的处理有三种,分别是轮询,接收完成中断(每一个字节...
  • STM32使用HAL库读写内部FLASH 测试环境: STM32F103RB 20KBytes RAM 128KBytes FLASH 头文件: //////////////////////////////////////////////////////////////////////////////////////////////////////////// ...
  • HAL库函数手册 .docx

    2020-06-01 19:31:05
    本资源为hal库函数的文档版,可以进行修改和翻译,里面详细的介绍了hal库中各个函数的用法,可以让你快速的掌握和了解HAL库的用法
  • STM32 HAL 库开发实战指南,可以直接进行参考并进行参考,非常非常详细。
  • HAL库中,进入接收中断的方法与标准库很不一样,具体方法如下 u8 Res[1] ; //声明一个U8数组 HAL_UART_Receive_IT(&huart1,Res,1); // 初始化中打开串口1接收中断 //重写函数HAL_UART_RxCpltCallback,放在任意...
  • STM32H7 HAL驱动库英文版的用户手册; STMCubeTM 可降低开发人员的开发工作量、开发时间还有开发成本,使开发人员的生活更轻松; HAL驱动层提供了一组简单的通用多实例api来与上层(应用程序、库和堆栈)交互。 ...
  • HAL库函数文档.zip

    2020-03-12 14:39:21
    看懂HAL库,学会Cubemax,新手入手STM32就基本没问题了,挺憨的。还可以减少不少开发时间。
  • stm32例程 用于学习目的 例程为stm32g系列 若其他系列需修改gpio引脚
  • HAL库手册非常全面

    2019-11-18 10:46:25
    stm32 HAL库函数手册,对于初学HAL库的小伙伴们有很大帮助。 简单明了!!能查看函数说明,宏定义,变量说明等
  • STM32 HAL库之GPIO配置

    2021-01-06 08:10:42
    HAL_GPIO_Init(GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *GPIO_Init) 定义结构体变量 GPIO_InitTypeDef GPIO_InitStructure; //定义一个结构体变量 使能时钟 __HAL_RCC_GPIOA_CLK_ENABLE(); //打开A端口时钟 __HAL_...
  • 多个串口要输出printf怎么办,,下载这个库就可以了。还直接写发送函数?那多不方便,就不能使用printf函数里面的各种数据类型转换的方便了
  • 基于HAL库使用STM32CUBEMX编写的串口485程序
  • HAL库函数说明

    2019-01-18 16:34:51
    适合新手入手STM32,看懂HAL库,学会Cubemax,基本32就可以用起来了。节省不少开发时间。
  • nrf-hal 用于 nRF51、nRF52 和 nRF91 系列微控制器的 请参阅以查看最新版本中的更改。 板条箱 每个 nRF 芯片都有自己的板条箱,如下所列: 箱 文档 crates.io 目标 thumbv6m-none-eabi thumbv7em-none-eabi ...
  • 基于STM32CubeMX+hal库UCOSIII移植,用STM32CubeMX生成基础工程,移植UCOSIII,生成KEIL工程,移植到战舰开发板上,成功运行。
  • PS2手柄HAL库+CubeMX源码

    2020-07-19 12:22:37
    PS2手柄HAL库+CubeMX源码 详情看:https://lindoglog.blog.csdn.net/article/details/105781595
  • android7 gps hal

    2019-10-17 16:04:27
    android 7 gps 底层代码的 hal层代码,这个代码是c语言编写,打开串口和波特率需要自己修改
  • STM32F1系列的HAL库函数手册原版内容。根据库函数加速开发自己的产品。HAL库函数原版。Description of STM32F1 HAL and Low-layer drivers
  • 本系列教程将HAL库与STM32CubeMX结合在一起讲解,使您可以更快速的学会各个模块的使用 在之前的标准库中,STM32的硬件IIC非常复杂,更重要的是它并不稳定,所以都不推荐使用。 但是在我们的HAL库中,对硬件IIC做了...
  • 本内容主要描述STM32BootLoader升级以及内部flash操作的常规步骤,本资料仅为相关代码的编辑,仅供参考

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 85,244
精华内容 34,097
关键字:

hal