精华内容
下载资源
问答
  • STM32_HAL库&STD用户手册下载
    千次阅读
    更多相关内容
  • STM32F4xx系列官方资料包括固件手册(标准HAL库用户手册资料合集: 1-STM32官方手册.zip 2-STM32F4官方固件手册(标准) 3-HAL库用户手册.zip F1 Hal&LL文档.pdf F2 Hal&LL文档.pdf F3 Hal&LL文档.pdf...
  • STM32F4xx HAL库详解

    2018-08-30 10:09:36
    说到STM32HAL库,就不得不提STM32CubeMX,其作为一个可视化的配置工具,对于开发者来说,确实大大节省了开发时间。STM32CubeMX就是以HAL库为基础的,且目前仅支持HAL库及LL
  • Description of STM32F4xx HAL drivers.pdf Description of STM32F4xx HAL drivers.pdfDescription of STM32F4xx HAL drivers.pdf
  • 上传一份STM32F4HAL库使用手册,英文的。有需要就下载吧。
  • 传感器系列资料包括每种传感器的原理图及配套程序。 每种传感器均配套裸机部分例程及协议栈例程。部分没有配套协议栈例程的传感器,请参考实战演练中其他传感器移植方法自行移植。 ...部分传感器只配套zibgee平台...
  • 本资源包含最新版的STM32CubeMX中文版教程,非常适合入门CubeMX的初学者,有详细的解释,同时包含L4系列HAL库资料,这种库函数资料较少,可在使用CubeMX时使用。加强理解。
  • stm32HAL 库函数手册,对于初学HAL库的小伙伴们有很大帮助。
  • STM32HAL库函数用户手册(英文) Description of STM32F4xx HAL drivers
  • 一、STM32CubeMX 简介 STM32CubeMX 是 ST 意法半导体近几年来大力推荐的 STM32 芯片图形化配置工具, 允许用户使用图形化向导生成 C 初始化代码,可以大大减轻开发工作,时间和费用。 STM32CubeMX几乎覆盖了 STM32 ...

    一、STM32CubeMX 简介

    STM32CubeMX 是 ST 意法半导体近几年来大力推荐的 STM32 芯片图形化配置工具, 允许用户使用图形化向导生成 C 初始化代码,可以大大减轻开发工作,时间和费用。 STM32CubeMX几乎覆盖了 STM32 全系列芯片。它具有如下特性:
    ① 直观的选择 MCU 型号,可指定系列、封装、外设数量等条件
    ② 微控制器图形化配置
    ③ 自动处理引脚冲突
    ④ 动态设置时钟树,生成系统时钟配置代码
    ⑤ 可以动态设置外围和中间件模式和初始化
    ⑥ 功耗预测
    ⑦ C 代码工程生成器覆盖了 STM32 微控制器初始化编译软件,如 IAR, KEIL, GCC。
    ⑧ 可以独立使用或者作为 Eclipse 插件使用

    对于 STM32CubeMX 和 STM32Cube 的关系这里我们还需要特别说明一下, STM32Cube包含 STM32CubeMX 图形工具和 STM32Cube 库两个部分,使用 STM32CubeMX 配置生成的代码,是基于 STM32Cube 库的。也就是说,我们使用 STM32CubeMX 配置出来的初始化代码,和 STM32Cube 库兼容,例如硬件抽象层代码就是使用的 STM32 的 HAL 库。不同的 STM32 系列芯片,会有不同的 STM32Cube 库支持,而 STM32CubeMX 图形工具只有一种。所以我们配置不同的 STM32 系列芯片,选择不同的 STM32Cube 库即可。

    stm32cubemx用户手册中文版下载:
    https://www.st.com/zh/development-tools/stm32cubemx.html#
    在这里插入图片描述
    在这里插入图片描述

    二、STM32CubeMX 运行环境搭建

    STM32CubeMX 运行环境搭建包含两个部分。首先是 Java 运行环境安装,其次是
    STM32CubeMX 软件安装。 对于 Java 运行环境,大家可以到 Java 官网 www.java.com 下载最新的 Java 软件。这里大家需要注意, STM32CubeMX 的 Java 运行环境版本必须是 V1.7 及以上,如果你的电脑安装过 V1.7 以下版本,请先删掉后重新安装最新版本。
    安装完 Java 运行环境之后, 为了检测是否正常安装,我们可以打开 Windows 的命令输入框,输入: java -version 命令,如果显示 Java 版本信息,则安装成功。
    在这里插入图片描述
    按照提示安装STM32CubeMX,安装完成后打开软件,界面如下图:
    在这里插入图片描述
    在线安装HAL库:
    打开安装好的 STM32CubeMX 软件 点上面的Help -> Manage embedded software packages
    在这里插入图片描述
    会跳出来一个选择型号界面 勾选上你要安装的HAL库, 点击“Install Now” 直到安装成功。
    在这里插入图片描述

    三、使用 STM32CubeMX 工具配置工程模板

    大多数情况下,我们都只使用STM32CubeMX来生成工程的时钟系统初始化代码以及外设的初始化代码,因为用户控制逻辑代码是无法在STM32CubeMX中完成的,需要用户自己根据需求来实现。使用STM32CubeMX配置工程的一般步骤是:
    1)工程初步建立和保存
    2)RCC设置
    3)时钟系统(时钟树)配置
    4)GPIO功能引脚设置
    5)生成工程源码
    6)编写用户代码
    接下来我们将按照上面6个步骤,依次教大家使用STM32CubeMX工具生成一个完整的工程。

    1、工程初步建立和保存

    工程建立的方法有两种,第一种方法是打开STM32CubeMX之后再主界面点击 New Project 按钮,第二种方法是在菜单栏依次点击 File->New Project。
    在这里插入图片描述
    点击新建工程按钮之后,会弹出MCU选择窗口。我们依次在选项卡 Series, Lines 和 Package之下选择与我们使用的芯片 STM32F407ZGT6 对应的参数, 然后选择对应的芯片型号, 最后点击Start Project按钮。
    在这里插入图片描述
    进入Pinout选项卡,这个时候界面会展示芯片完整引脚图。
    在这里插入图片描述
    在引脚图,我们可以对引脚功能进行配置。图中黄色的引脚主要是一些电源和GND引脚。如果某个引脚被使用,那么会显示为绿色。

    外设和中间件树面板中使用的图标和颜色方案:
    在这里插入图片描述

    2、RCC设置

    对于STM32芯片而言,RCC配置的重要性不言而喻。在STM32CubeMX中,RCC相关设置却非常简单,因为它把时钟系统独立出来设置。在操作界面,搜搜RCC,点击进入RCC配置栏。
    在这里插入图片描述
    设置:
    设置选项 High Speed Clock( HSE )的值为Crystal/Ceramic Resonator(使用晶振/陶瓷振荡器)
    在这里插入图片描述

    3、时钟系统(时钟树)配置

    在使用STM32CubeMX配置时钟树之前,大家需要充分理解STM32时钟系统。
    Clock Configuration 选项卡即可进入时钟系统配置栏。
    在这里插入图片描述
    进入Clock Configuration配置栏之后可以看到,界面展现一个完整的STM32F407时钟系统框图。从这个时钟配置图可以看出,配置的主要是外部晶振大小,分频系数,倍频系数以及选择器。在我们配置的工程中,时钟值会动态更新,如果某个时钟值在配置过程中超过允许值,那么相应的选项框会红色提示。
    我们把系统时钟配置分为6个步骤,分别用①~⑥标号表示,详细过程为:
    ① 时钟源参数设置: HSE 或者 HSI 配置。这里我们选择 HSE 为时钟源,所以我们之前必须在 RCC 配置中我们开启 HSE。
    ② 时钟源选择: HSE 还是 HSI。这里我们配置选择器选择 HSE 即可。
    ③ PLL 分频系数 M 配置。分频系数 M 我们设置为 25。
    ④ 主 PLL 倍频系数 N 配置。倍频系数 N 我们设置为 336。
    ⑤ 主 PLL 分频系数 P 配置。分频系数 P 我们配置为 2。
    ⑥ 系统时钟时钟源选择: PLL,HSI 还是 HSE。 这里毫无疑问,我们选择 PLL,选择器选择PLLCLK 即可。
    经过上面6个步骤,就会生成标准的180MHz系统时钟。接下来我们只需要配置AHB,APB1,APB2和Systick的分频系数,就可以完全实现函数Stm_Clock_Init配置的时钟系统。
    AHB, APB1 和 APB2 总线时钟以及 Systick 时钟的最终来源都是系统时钟 SYSCLK。其中AHB 总线时钟 HCLK 是由 SYSCLK 经过 AHB 预分频器之后的来,如果我们要设置 HCLK 为180MHz,那么我们只需要配置图中标号⑦的地方为 1 即可。得到 HCLK 之后, 接下来我们将在图标号⑧~⑩处同样的方法依次配置 Systick, APB 以及 APB2 分频系数分别为 1, 4 和 2 即可 。 配 置 完 成 之 后 , 那 么 HCLK=168MHZ , Systick 时 钟 为 168/1MHz=168MHz ,PCLK1=168MHz/4=42MHz, PCLK2=168MHz/2=84MHz。

    4、GPIO功能引脚设置

    可以在搜索栏输入要搜索的引脚,在引脚图上会显示该引脚的位置。
    在这里插入图片描述
    引脚图中点击PC8,会出现该IO口的功能选项。
    在这里插入图片描述
    在这里插入图片描述
    GPIO output level: 引脚电平设置 高/低
    GPIO mode: GPIO模式 推挽输出/开漏输出
    GPIO Pull-up/Pull-down: 上拉下拉电阻 上拉电阻/下拉电阻/无上拉或下拉
    Maxinum output speed: 引脚速度设置 低速/中速/高速
    User Label: 用户标签 给引脚设置名称 如LED0

    5、UART设置

    点击Mode选择Asynchronous(异步)
    在这里插入图片描述
    在这里插入图片描述
    设置波特率为115200 Bits/s。传输数据长度为8 Bit。奇偶检验无,停止位1 接收和发送都使能
    在这里插入图片描述
    DMA Settings,点击Add,选择UART5_RX,UART5_TX; Priority 优先级选择 Very High 非常高。
    在这里插入图片描述
    设置中断 UART5 global interrupt 在Enabled 列打对勾。
    在这里插入图片描述

    6、设置定时器

    Activated 激活
    在这里插入图片描述

    7、看门狗设置

    在这里插入图片描述
    IWDG时钟预分频系数 64分频
    计数器重装载值 4095 RLR
    超出(溢出)时间计算:
    Tout=((64×2^PRER) ×RLR)/LSI时钟频率

    8、生成工程源码

    在这里插入图片描述
    在这里插入图片描述
    然后点击GENERATE CODE 创建工程
    在这里插入图片描述

    展开全文
  • STM32HAL库使用详解

    万次阅读 多人点赞 2020-07-15 11:13:51
    用户手册和固态函数按照以下章节所描述的规范编写。 1.1缩写 Table1 本文档所有缩写定义 缩写 外设/单元 ADC 模数转换器 BKP 备份寄存器 CAN 控制器局域网模块 DMA 直接内存存取控制器 EXTI 外部...

    1. 文档和库规范本

    用户手册和固态函数库按照以下章节所描述的规范编写。

    1.1缩写

    Table1 本文档所有缩写定义

    缩写外设/单元
    ADC模数转换器
    BKP备份寄存器
    CAN控制器局域网模块
    DMA直接内存存取控制器
    EXTI外部中断事件控制器
    FLASH闪存存储器
    GPIO通用输入输出
    I2C内部集成电路
    IWDG独立看门狗
    NVIC嵌套中断向量列表控制器
    PWR电源/功耗控制
    RCC复位与时钟控制器
    RTC实时时钟
    SPI串行外设接口
    SysTick系统嘀嗒定时器
    TIM通用定时器
    TIM1高级控制定时器
    USART通用同步异步接收发射端
    WWDG窗口看门狗

    1.2命名规则

    固态函数库遵从以下命名规则 PPP表示任一外设缩写,例如:ADC。更多缩写相关信息参阅章节1.1 缩写

    系统、源程序文件和头文件命名都以“stm32f10x_hal”作为开头,例如:stm32f10x_hal_conf.h。

    常量仅被应用于一个文件的,定义于该文件中;被应用于多个文件的,在对应头文件中定义。所有常量都由英文字母大写书写。寄存器作为常量处理。他们的命名都由英文字母大写书写。

    在大多数情况下,他们采用与缩写规范与本用户手册一致。

    外设函数的命名以HAL加该外设的缩写加下划线为开头。每个单词的第一个字母都由英文字母大写书写,例如:HAL_I2C_Master_Transmit。在函数名中,以HAL开头加下划线加外设缩写,用以分隔外设缩写和函数名的其它部分。名为HAL_PPP_Init的函数,其功能是根据HAL_StatusTypeDef中指定的参数,初始化外设PPP,例如HAL_I2C_Init.

    2. HAL函数库文件结构

    2.1压缩包描述

    STM32Fxx HAL函数库被压缩在一个zip文件中。解压该文件会产生一个文件夹:STM32Cube_FW_F1_V1.0.0,包含如下所示的子文件夹:

    STM32 HAL固件库是Hardware Abstraction Layer的缩写,中文名称是:硬件抽象层。HAL库是ST公司为STM32的MCU最新推出的抽象层嵌入式软件,为更方便的实现跨STM32产品的最大可移植性。HAL库的推出,可以说ST也慢慢的抛弃了原来的标准固件库,这也使得很多老用户不满。但是HAL库推出的同时,也加入了很多第三方的中间件,有RTOS,USB,TCP / IP和图形等等。

    和标准库对比起来,STM32的HAL库更加的抽象,ST最终的目的是要实现在STM32系列MCU之间无缝移植,甚至在其他MCU也能实现快速移植。

    2.2HAL 库文件调用结构

    image-20200714213700726

    3.HAL的初始化

    HAL层被调用前要先运行初始化函数HAL_init(),它包含在针对HAL自身的全局操作操作的源文件hal.c里。

    HAL全局结构

    这里写图片描述

    4.STM32 HAL库句柄、MSP函数、Callback函数

    4.1.句柄

    句柄(handle),有多种意义,其中第一种是指程序设计,第二种是指Windows编程。现在大部分都是指程序设计/程序开发这类

    • 第一种解释:句柄是一种特殊的智能指针 。当一个应用程序要引用其他系统(如数据库、操作系统)所管理的内存块或对象时,就要使用句柄。
    • 第二种解释:整个Windows编程的基础。一个句柄是指使用的一个唯一的整数值,即一个4字节(64位程序中为8字节)长的数值,来标识应用程序中的不同对象和同类中的不同的实例,诸如,一个窗口,按钮,图标,滚动条,输出设备,控件或者文件等。应用程序能够通过句柄访问相应的对象的信息,但是句柄不是指针,程序不能利用句柄来直接阅读文件中的信息。如果句柄不在I/O文件中,它是毫无用处的。 句柄是Windows用来标志应用程序中建立的或是使用的唯一整数,Windows大量使用了句柄来标识对象。

    STM32的标准库中,句柄是一种特殊的指针,通常指向结构体!

    在STM32的标准库中,假设我们要初始化一个外设(这里以USART为例),我们首先要初始化他们的各个寄存器。在标准库中,这些操作都是利用固件库结构体变量+固件库Init函数实现的:

    	USART_InitTypeDef USART_InitStructure;
    
    	USART_InitStructure.USART_BaudRate = bound;//串口波特率
    	USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式
    	USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位
    	USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验位
    	USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制
    	USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;	//收发模式
    
    	USART_Init(USART3, &USART_InitStructure); //初始化串口1
    
    

    可以看到,要初始化一个串口,需要:

    • 1、对六个位置进行赋值,
    • 2、然后引用Init函数,

    USART_InitStructure并不是一个全局结构体变量,而是只在函数内部的局部变量,初始化完成之后,USART_InitStructure就失去了作用。

    而在HAL库中,同样是USART初始化结构体变量,我们要定义为全局变量。

    UART_HandleTypeDef UART1_Handler;
    

    右键查看结构体成员

    typedef struct
    {
    	USART_TypeDef                 *Instance;    /*!< UART registers base address       */
    	UART_InitTypeDef              Init;         /*!< UART communication parameters     */
    	uint8_t                       *pTxBuffPtr;  /*!< Pointer to UART Tx ansferBuffer   */
        uint16_t                      TxXferSize;   /*!< UART Tx Transfer size             */
    	uint16_t                      TxXferCount;  /*!< UART Tx Transfer Counter          */
    	uint8_t                       *pRxBuffPtr;  /*!< Pointer to UART Rx transfer Buffer*/
    	uint16_t                      RxXferSize;   /*!< UART Rx Transfer size             */
    	uint16_t                      RxXferCount;  /*!< UART Rx Transfer Counter          */ 
        DMA_HandleTypeDef             *hdmatx;      /*!< UART Tx DMA Handle parameters     */ 
    	DMA_HandleTypeDef             *hdmarx;      /*!< UART Rx DMA Handle parameters     */
    	HAL_LockTypeDef               Lock;         /*!< Locking object                    */
        __IO HAL_UART_StateTypeDef    State;        /*!< UART communication state          */
    	__IO uint32_t                 ErrorCode;    /*!< UART Error code                   */
    }UART_HandleTypeDef;
    

    我们发现,与标准库不同的是,该成员不仅:

    • 1、包含了之前标准库就有的六个成员(波特率,数据格式等),
    • 2、还包含过采样、(发送或接收的)数据缓存、数据指针、串口 DMA 相关的变量、各种标志位等等要在整个项目流程中都要设置的各个成员。
      该 UART1_Handler就被称为串口的句柄,它被贯穿整个USART收发的流程,比如开启中断:
    HAL_UART_Receive_IT(&UART1_Handler, (u8 *)aRxBuffer, RXBUFFERSIZE);
    

    比如后面要讲到的MSP与Callback回调函数:

    void HAL_UART_MspInit(UART_HandleTypeDef *huart);
    void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart);
    

    在这些函数中,只需要调用初始化时定义的句柄UART1_Handler就好。

    4.2.MSP函数

    MSP: MCU Specific Package 单片机的具体方案

    MSP是指和MCU相关的初始化,引用一下正点原子的解释,个人觉得说的很明白:

    我们要初始化一个串口,首先要设置和 MCU 无关的东西,例如波特率,奇偶校验,停止
    位等,这些参数设置和 MCU 没有任何关系,可以使用 STM32F1,也可以是 STM32F2/F3/F4/F7
    上的串口。而一个串口设备它需要一个 MCU 来承载,例如用 STM32F4 来做承载,PA9 做为发
    送,PA10 做为接收,MSP 就是要初始化 STM32F4 的 PA9,PA10,配置这两个引脚。所以 HAL
    驱动方式的初始化流程就是:

    HAL_USART_Init()—>HAL_USART_MspInit() ,先初始化与 MCU无关的串口协议,再初始化与 MCU 相关的串口引脚。

    在 STM32 的 HAL 驱动中HAL_PPP_MspInit()作为回调,被 HAL_PPP_Init()函数所调用。当我们需要移植程序到 STM32F1平台的时候,我们只需要修改 HAL_PPP_MspInit 函数内容而不需要修改 HAL_PPP_Init 入口参数内容。

    在HAL库中,几乎每初始化一个外设就需要设置该外设与单片机之间的联系,比如IO口,是否复用等等,可见,HAL库相对于标准库多了MSP函数之后,移植性非常强,但与此同时却增加了代码量和代码的嵌套层级。可以说各有利弊。

    同样,MSP函数又可以配合句柄,达到非常强的移植性:

    void HAL_UART_MspInit(UART_HandleTypeDef *huart);
    

    入口参数仅仅需要一个串口句柄,这样有能看出句柄的方便。

    4.3.Callback函数

    类似于MSP函数,个人认为Callback函数主要帮助用户应用层的代码编写。

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

    void USART3_IRQHandler(void)                	//串口1中断服务程序
    {
    	u8 Res;
    	if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET)  //接收中断(接收到的数据必须是0x0d 0x0a结尾)
    	{
    		Res =USART_ReceiveData(USART3);	//读取接收到的数据
    		/*数据处理区*/
    		}   		 
         } 
    } 
    

    而在HAL库中,进入串口中断后,直接由HAL库中断函数进行托管:

    void USART1_IRQHandler(void)                	
    { 
    	HAL_UART_IRQHandler(&UART1_Handler);	//调用HAL库中断处理公用函数
    	/***************省略无关代码****************/	
    }
    

    HAL_UART_IRQHandler这个函数完成了判断是哪个中断(接收?发送?或者其他?),然后读出数据,保存至缓存区,顺便清除中断标志位等等操作。
    比如我提前设置了,串口每接收五个字节,我就要对这五个字节进行处理。
    在一开始我定义了一个串口接收缓存区:

    /*HAL库使用的串口接收缓冲,处理逻辑由HAL库控制,接收完这个数组就会调用HAL_UART_RxCpltCallback进行处理这个数组*/
    /*RXBUFFERSIZE=5*/
    u8 aRxBuffer[RXBUFFERSIZE];
    

    在初始化中,我在句柄里设置好了缓存区的地址,缓存大小(五个字节)

    /*该代码在HAL_UART_Receive_IT函数中,初始化时会引用*/
    	huart->pRxBuffPtr = pData;//aRxBuffer
        huart->RxXferSize = Size;//RXBUFFERSIZE
        huart->RxXferCount = Size;//RXBUFFERSIZE
    

    则在接收数据中,每接收完五个字节,HAL_UART_IRQHandler才会执行一次Callback函数:

    void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart);
    

    在这个Callback回调函数中,我们只需要对这接收到的五个字节(保存在aRxBuffer[]中)进行处理就好了,完全不用再去手动清除标志位等操作。
    所以说Callback函数是一个应用层代码的函数,我们在一开始只设置句柄里面的各个参数,然后就等着HAL库把自己安排好的代码送到手中就可以了~

    综上,就是HAL库的三个与标准库不同的地方之个人见解。
    个人觉得从这三个小点就可以看出HAL库的可移植性之强大,并且用户可以完全不去理会底层各个寄存器的操作,代码也更有逻辑性。但与此带来的是复杂的代码量,极慢的编译速度,略微低下的效率。看怎么取舍了。

    5.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()
    

    6.例程和帮助文档

    STM32 HAL库包含大量的库函数的使用例程和库函数API接口帮助文档,在开发过程中如果遇到任何问题可以通过库文件自带的例程和帮助文档获得帮助。

    6.1 例程文档结构图

    6.2 HAL用户手册

    参考:

    https://blog.csdn.net/weixin_43186792/article/details/88759321

    https://blog.csdn.net/ZCShouCSDN/article/details/54613202?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.nonecase&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.nonecase

    https://blog.csdn.net/adam_embedded/article/details/46453171

    https://blog.csdn.net/sinat_37853238/article/details/85141168

    展开全文
  • stm32F4 hal库之CAN通信的实现

    万次阅读 多人点赞 2019-02-23 22:24:52
    本文的目的是为了能够实现功能,故写的时候比较简略。...通过can总线,用stm32的CAN模块实现对电机驱动发送指令,从而实现对电机的控制。 硬件设计: ①收发芯片的功能:把单片机送来的信号通过收发芯...

    本文的目的是为了能够实现功能,故写的时候比较简略。

    参考资料:https://blog.csdn.net/u012308586/article/details/81001102

                     正点原子开发手册

    目标:

    通过can总线,用stm32的CAN模块实现对电机驱动发送指令,从而实现对电机的控制。

    硬件设计:

    ①收发芯片的功能:把单片机送来的信号通过收发芯片的转换从而实现信号的具体传输。

    ②120欧终端电阻:主要是为了防止信号的干扰,一般来说,终端设备的CAN_H和CAN_L也要加上120欧终端电阻。

    软件设计基本知识:

    其实各种通信方式的本质都是一样的,均分为两个部分;①波特率:以何种速度来通信②具体准则:发送端和接收端对发送来的数据的解释。

    特色:CAN工作于4种模式;类似于手机的飞行模式,正常模式,待机状态,是一种感觉。

               CAN常用的工作模式是(1)回环模式:也就是自己发,自己收。(2)正常工作模式,也就是用于正常的接收,发送。

     

    一.公共部分(发送端和接收端都会用到的部分)

    ①波特率:

    通过配置挂在APB1总线上的CAN1模块的几个参数设置从而得到通信速率。也就是通过设置挂在APB1外设总线上的速率 

    42Mhz。 

          

    然后通过波特率计算公式(波特率= APB1外设总线速率  * (1/(相位缓冲段 1+相位缓冲段 2+重新同步跳跃段)*(预分频系数)))来设置波特率

    这个参数代表波特率=42M/(2*(14+6+1))=1M bps

    注意:①相位缓冲段1设置范围:1-16 ②相位缓冲段2设置范围:1-8  ③重新同步跳跃段一般设置为1

    二.发送端:

    (1)设置的数据格式

    CAN协议规定发送的数据有几种:数据帧,遥控帧,错误帧,过载帧,间隔帧。我们取其一种:数据帧来举例,故名思意,这种帧就是用来发送数据的,也是应用最广泛的一种数据帧。

    帧的格式如下图

    对于我们来说我们只需要关注以下几点:①仲裁段(ID)  ②数据段的长度(DLC)③帧的类型

    ①ID;这是CAN总线的特色,它有两个含义

    (1)代表每个单元的地址

    (2)代表优先级,CAN总线可以用于多主多从结构,简而言之,在一个系统里面,每个单元都可以收发,那么当有多个单元想要占用总线的时候,那么我给谁用呢?于是这个时候多个单元都来到总线上进行仲裁,优先级高的占据总线使用权。

    ②数据长度:就是明确的指出我发的这一帧数据里面有几个数据(一帧最多发送8字节的数据)

    ③帧的类型:有标准帧(11位)和扩展帧(29位)两种,这是为整个网络考虑,当整个网络节点个数多,则用扩展帧。小型网络标准帧足够。

    (2)发送邮箱

    用于存放要发送的数据。

    程序选择 1 个空置的邮箱(TME=1)-->设置标识符(ID)数据长度(DLC)和发送数据(数据帧)-->设置 CAN_TIxR 的 TXRQ 位为 1,请求发送-->邮箱挂号(等待成为最高优先级)-->预定发送(等待总线空闲)-->发送-->邮箱空置。

    (3)发送仲裁

    问题来源:用CAN发送多个数据的时候,出现了发送字节乱序的问题。

    参考博客:https://blog.csdn.net/zhangxufei/article/details/52334278

    如果三个邮箱中同时存在多个待发送的报文时,此时存在一个问题,即先送哪个邮箱中的报文好呢?此时,存在一个发送优先级的问题。此时,非空发送邮箱进入发送仲裁,发送仲裁有两种策略:ID模式和FIFO模式。

    • ID模式:当有超过1个发送邮箱在挂号时,发送顺序由邮箱中报文的标识符决定。根据CAN协议,标识符数值最低的报文具有最高的优先级。如果标识符的值相等,那么邮箱号小的报文先被发送。此模式通过对CAN主控寄存器CAN_MCR的TXFP位清0来设置。
    • FIFO模式:通过对CAN_MCR寄存器(CAN主控寄存器)的TXFP位置’1’,可以把发送邮箱配置为发送FIFO。在该模式下,发送的优先级由发送请求次序决定。该模式对分段发送很有用。

    三.接收端

    对于我们来说我们只需要关注以下几点:①过滤器

    ①过滤器:

    (1)顾名思义,通过它来得到我们想要的ID的数据,当总线上的数据经过仲裁后,终于到达目的地(接收端)了,那么这个时候还要让接收端看看这是不是我想要的数据,怎么看呢?通过ID。

    (2)工作模式:列表模式;得到一组帧,通过设置仅关心ID的几位来实现。

                              标志位掩码模式:得到特定ID的帧。过来的帧的ID必须与过滤器的ID一摸一样。


    4.代码实现

    https://github.com/zion6135/codesave/tree/master/can_test

    展开全文
  • STM32F4 HAL驱动描述手册(UM1725)目前只有英文版,可以在https://www.stmcu.com.cn/Index/search?search_keywords=HAL,通过搜索关键字找到。 PS:不要嫌英文版繁琐。 搜一圈发现,还是官方手册写的详细!
  • 里面的文档是我从花了好长时间找出来的,有的是英文版,因为最近项目开发需要就收集了一下,有需要的下载吧,积分不多。
  • 2022年最新收集的STM32F4开发手册,可用于STM32F4的代码开发中。 包含: 2022年最新英文版数据手册、参考手册HAL库函数手册 2013中文版参考手册
  • stm32f4xx固件说明文档

    热门讨论 2013-03-31 15:35:23
    如果需要固件文件可以给我留言,我后续再上传。
  • STM32F4 HAL USER MANUAL.pdf

    2021-10-26 13:18:47
    STM32 F4 系列CPU 用户手册
  • 本用户手册主要介绍了HAL驱动程序概述,低层驱动程序概述,HAL和LL驱动程序的共存,每个外围设备驱动程序的详细说明:配置结构,功能以及如何使用给定的API来构建您的应用程序
  • 手册介绍了 32 位基于 ARM 微控制器 STM32F101xx 与 STM32F103xx 的固件函数。 该函数是一个固件函数包,它由程序、数据结构和宏组成,包括了微控制器所有外设的性能特征。该函 数还包括每一个外设的驱动...
  • STM32HAL库

    万次阅读 多人点赞 2019-05-12 11:27:08
    1 STM32的三种开发方式 通常新手在入门STM32的时候,首先都要先选择一种要用的开发方式,不同的开发方式会导致你编程的架构是完全不一样的。一般大多数都会选用标准HAL库,而极少部分人会通过直接配置寄存器进行...
  • 触发输入作为外部时钟或者按周期的电流管理(TIM9~TIM14 不支持) 由于 STM32F4 通用定时器比较复杂,这里我们不再多介绍,请大家直接参考《STM32F4xx中文参考手册》第 392 页,通用定时器一章。 二、定时器中断实验...
  • 下载链接:STM32F4xxHALdrivers手册.rar-嵌入式文档类资源-CSDN下载 全篇完。 本人是一个嵌入式未入门小白,博客仅仅代表我个人主观见解,记录成长笔记。 笔记是以最简单的方式,只展示最核心的原理。 若有与 大神...
  • stm32f4xx标准+datasheet,标准是最新的v1.8.0。官方最后一次更新是2016年,估计以后都使用hal库了吧,用习惯了标准的我表示还是标准香。
  • 本系列教程将 对应外设原理,HAL库STM32CubeMX结合在一起讲解,使您可以更快速的学会各个模块的使用 所用工具: 1、芯片: STM32F407ZET6/ STM32F103ZET6 2、STM32CubeMx软件 3、IDE: MDK-Keil软件 4、STM32F1xx/...
  • 第12章 STM32F429的HAL库框架设计学习 通过本章节,主要是想让大家对HAL库程序设计的基本套路有个了解,防止踩坑。 12.1 初学者重要提示 12.2 HAL库的配置文件 12.3 HAL库的时间基准 12.4 HAL库的启动流程 ...
  • STM32F4HAL库 CubeMX(一)--------创建工程(点亮LED)

    千次阅读 多人点赞 2020-10-06 21:16:17
    前言 STM32CubeMX 是 ST 意法半导体... 总结 恭喜你已经完成了CubeMX的入门啦,接下来将持续更新CubeMX和HAL库配置STM32的串口、定时器、ADC、IIC等等 第一次写博客,有不正确的地方,各位大佬评论出来或者私信,谢谢。
  • 参看:STM32F407ZGT6芯片手册 Table 6. STM32F40x pin and ball definitions
  • STM32F4 HAL库DMA学习

    万次阅读 2017-06-14 23:06:38
    用了一段时间HAL库,不知道是不是用外设固件时间长一点的原因,个人感觉没有固件来的直接。看DMA部分看的有点乱,捋一下。 DMA的使用方法及细节直接看官方的手册就可以了,注意的是如果原地址和目的地址的数据...
  • STM32HAL库 STM32CubeMX教程九---ADC

    万次阅读 多人点赞 2019-08-16 17:05:31
    本系列教程将 对应外设原理,HAL库STM32CubeMX结合在一起讲解,使您可以更快速的学会各个模块的使用 所用工具: 1、芯片: STM32F407ZET6/ STM32F103ZET6 2、STM32CubeMx软件 3、IDE: MDK-Keil软件 4、STM32...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,043
精华内容 417
关键字:

stm32f4hal库中文手册

友情链接: CCoolBar.zip