STM32 HAL库之串口详细篇】的更多相关文章

https://www.cnblogs.com/Mysterious/p/4804188.html STM32L0 HAL库 UART 串口读写功能 串口发送功能: uint8_t TxData[10]= "01234abcde"; HAL_UART_Transmit(&huart2,TxData,10,0xffff);//把TxData的内容通过uart2发送出去,长度是10,timeout的时间是最大值0xffff 串口接收功能1: uint8_t value='F'; H…
1.情景描述: 最近在做一个项目,X86的上位机通过串口控制MCU,使用串口中断接收上位机数据时,MCU在上电的情况下烧录程序,可以正常接收上位机的数据,在断电重启后,一直进入不了中断回调函数,上电的情况是X86上电,MCU也同时上电. 2.原因分析: 造成这个的原因是因为硬件上电的时候,因为X86跟MCU是同时上电的,上电后会把串口的电平拉高,这个高电平触发了MCU的串口中断,导致MCU的串口中断误以为接收到了一个数据,例如 HAL_UART_Receive_IT(&huart1, (uint…
一.查询模式 1. 二.中断模式 1.中断接收. 1.1先看中断接收的流程(以 USART2 为例) 在启动文件中找到中断向量 USART2_IRQHandler 找到USART2_IRQHandler的函数定义 可以看到这里又转到另一个函数里去了,再找下去: 该函数的源码: /** * @brief This function handles UART interrupt request. * @param huart: pointer to a UART_HandleTypeDef stru…
从今天起,每天开始连载一章<STM32 HAL 库开发实战指南—基于F7>.欢迎各位阅读.点评.学习. 第1章  如何使用本书 1.1  本书的参考资料 本书参考资料为:<STM32F76xxx参考手册>和<Cortex®-M7内核编程手册>,这两本是ST官方的手册,属于精华版,面面俱到,无所不包.限于篇幅问题,本书不可能面面具到,着重框图分析和代码讲解,有关寄存器的详细描述则略过,在学习本书的时候,涉及到寄存器描述部分还请参考这两本手册,这样学习效果会更佳. 1.2…
最近在设计四旋翼飞行器,用stm32f407,有三种开发方式可以选择:一.寄存器开发.二:库函数开发.三:HAL库开发,考虑了一下,选择了HAL库,原因如下: 1. 寄存器开发相对较慢,寄存器很多,配置起来会占用很长时间,而且在调试的时候如果再对程序修改,还要配置寄存器,耗时长. 2. 库函数和HAL库看起来差不多,都是配置功能结构体,在把结构体扔到初始化函数中进行初始化,用户只需要配置需要的功能即可,具体的配置过程系统函数帮忙做了(配置各种寄存器),很方便.但是HAL库是st官方目前主推的库,…
源: STM32 HAL库详解 及 手动移植…
昨天分析了普通io口的使用,和初始化代码流程,回顾一下,首先定义一个配置io口功能的结构体,然后开启时钟,再去配置这个结构体里面的各个成员变量,每个成员变量都有很多种选择,可以看各个成员变量 后面的注释,找到可选的配置即可,把这个结构体配置完了之后,把它扔到hal库提供的io口初始化函数中,另一个参数是ABC...中的一个,指定端口. 同理,操作串口的流程大致和上面叙述的过程差不多,但是串口多了收发数据,中断等等功能.在Cubemx里面配置串口,然后打开工程,跟踪代码,了解详细的过程.首先,串口…
参考:https://blog.csdn.net/u014470361/article/details/79206352 我这里使用的芯片是 F1 系列的,主要是利用 DMA 数据传输方式实现的,在配置工程的时候要注意配置好 DMA,并开启中断. 1.利用STM32 cubemx 建立一个工程,工程建立请参考我以前的文章:https://www.cnblogs.com/xingboy/p/9597464.html 2.利用STM32 cubemx 生成代码后,我们先定义一些变量来使用 /* 自己…
普通函数与回调函数的区别:就是ST将中断封装,给使用者的API,就是标准库的中断函数 对普通函数的调用: 调用程序发出对普通函数的调用后,程序执行立即转向被调用函数执行,直到被调用函数执行完毕后,再返回调用程序继续执行.从发出调用的程序的角度看,这个过程为"调用-->等待被调用函数执行完毕-->继续执行" 对回调函数调用: 调用程序发出对回调函数的调用后,不等函数执行完毕,立即返回并继续执行.这样,调用程序执和被调用函数同时在执行.当被调函数执行完毕后,被调函数会反过来调用…
串口的发送接收函数:HAL_UART_Transmit();串口轮询模式发送,使用超时管理机制.HAL_UART_Receive();串口轮询模式发送,使用超时管理机制.HAL_UART_Transmit_IT();串口中断模式发送,HAL_UART_Receive_IT();串口中断模式发送HAL_UART_Transmit_DMA();串口DMA模式发送HAL_UART_Receive_DMA();串口DMA模式发送 串口相关的中断函数:HAL_UART_TxHalfCpltCallback…
先上一个采用串口直接传输的Demo: 此处的思路是完全采用HAL库来实现的,核心是运用HAL_UART_Transmit_IT和HAL_UART_Receive_IT两个函数来实现的,可以作为一个Demo来测试使用: 直接上代码,其串口的配置和上一章完全一致,因此忽略不计: 思路大致是将aTxStartMessage字符串发送出去,接收一个总长度为15个字符的数据到aRxBuffer中,等待接收完毕: 将接收到的aRxBuffer发送出去,等待发送完成,最后将aTxEndMessage发送出去:…
今天介HAL库操作普通IO口,就是输入/输出. 如果用CubeMX配置io工程,打开以后可以看到如下代码: GPIO_InitTypeDef GPIO_Initure; __HAL_RCC_GPIOB_CLK_ENABLE(); // 根据名字,这是使能B端口 GPIO_Initure.Pin=GPIO_PIN_0; // 0口 GPIO_Initure.Mode=GPIO_MODE_OUTPUT_PP; // 推挽输出 GPIO_Initure.Pull=GPIO_PULLUP; // 上拉…
cube基本配置,外设开启编码器,串口2 可能大家在设置的时候有这个错误 错误:error:  #20: identifier "TIM_ICPOLARITY_BOTHEDGE" is undefined 意思是,高级.通用定时器不能用BothEdge,只有基本定时器才能用BothEdge 针对具体的芯片举几个例子:基本都是大同小异 F4系列: /* 编码器初始化及使能编码器模式 */ ENCODER_TIMx_Init(); HAL_TIM_Encoder_Start(&ht…
ADC工作均为非阻塞状态 轮询模式 中断模式 DMA模式 库函数: HAL_StatusTypeDef HAL_ADC_Start(ADC_HandleTypeDef* hadc);//轮询模式,需放在循环中不断开启 HAL_StatusTypeDef HAL_ADC_Stop(ADC_HandleTypeDef* hadc); HAL_StatusTypeDef HAL_ADC_PollForConversion(ADC_HandleTypeDef* hadc, uint32_t Timeou…
应用情景 使用定时器配置编码器模式,发现STM32只有两个定时器是32位,16位的测量值不够用,发现是可以使用两个16位定时器级联为32位的. 我是在使用编码器计数电机转速时使用,但是最终实现的效果不好,不过主要原因是我没有使用编码器的Z线(100个引脚全部被使用,实在是没有可用资源了) 8个控制电机只能使用普通IO模拟pwm控制了 两种方式: 1.软件配置 这个基本思路是16位使用结束后触发另一个16位继续计数,写的代码没有验证就不在这里贴了,有想探讨的可以联系我.   2.硬件配置 这个我没…
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) { //添加回调后的程序逻辑 if (htim->Instance == htim2.Instance) //判断是否定时器2 { } } void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { //添加回调后的程序逻辑 if(huart->Instance == USART1) //判断是否串口1 { } } 中断…
以前用DMA实现接收不定长数据,DMA的方法接收串口助手的数据,全部没问题,不过如果接收模块返回的数据,而这些数据如果包含回车换行的话就会停止接收,例如接收:AT\r\nOK\r\n,就只能接收到AT\r,导致没有接收完成,具体原因还没搞懂,有了解的,希望可以告知一下,DMA不定长接收方法传输门:https://www.cnblogs.com/xingboy/p/9714907.html. 好了,不多说了,现在进入正文.首先建立一个STM32Cumebx的工程,打开串口中断,完成配置,具体的配置…
功能需求: (1)对接收的字符串原样返回(每10个字符一次). (2)发送一个字符串完成后改变LED的状态. 1.创建工程 使用的是F407Discovery,4个LED对应PD12-PD14. (1)使用外部高速时钟 (2)推挽输出4个LED输出端口 (3)使用usart2 (4)外部8M,使用HSE,频率设置为最高(168MHz,这个可随便) (5)如下,设置用中断 (6)设置使用中断(在usart2中断下边的是外部中断,我测试的时候用的可不用管) (7)点击这个小齿轮生成工程 2.程序设计…
基本流程: 1.配置定时器 2.开启定时器 3.动态改变pwm输出,改变值  HAL_TIM_PWM_Start(&htim4, TIM_CHANNEL_1); 函数总结: __HAL_TIM_SET_COMPARE() // 是设置CCRx,一般是用在PWM输出的,控制PWM占空比 __HAL_TIM_GET_COMPARE // 是用来读取CCRx的,一般用于捕获处理 PWM输出配置: 频率设置: static void MX_TIM2_Init(void) { TIM_MasterConf…
1   自带的hal_delay 函数    毫秒级延迟 void HAL_Delay(__IO uint32_t Delay) { uint32_t tickstart = HAL_GetTick(); //获取tick值(毫秒) uint32_t wait = Delay; /* Add a period to guarantee minimum wait */ if (wait < HAL_MAX_DELAY) { wait++;//传参,延时的时间 } while((HAL_GetTic…
GPIO 库函数 基本就是使用以下几个函数 GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin); void HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState); void HAL_GPIO_TogglePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin); HAL…
测量脉冲宽度或者测量频率   基本方法 1.设置TIM2 CH1为输入捕获功能:  2.设置上升沿捕获:  3.使能TIM2 CH1捕获功能:  4.捕获到上升沿后,存入capture_buf[0],改为捕获下降沿:  5.捕获到下降沿后,存入capture_buf[1],改为捕获上升沿:  6.捕获到上升沿后,存入capture_buf[2],关闭TIM2 CH1捕获功能:  7.计算:capture_buf[2] - capture_buf[0]就是周期,capture_buf[1] - c…
1.I2C函数中HAL_I2C_Mem_Write和HAL_I2C_Master_Transmit有啥区别?{ 使用HAL_I2C_Mem_Write等于 先使用HAL_I2C_Master_Transmit传输第一个寄存器地址,再用HAL_I2C_Master_Transmit传输写入第一个寄存器的数据. HAL_I2C_Mem_Write一样可以传输多个数据,有一个参数设置数据大小. 在传输过程,寄存器地址和源数据地址是会自加的. 至于读函数也是如此,因此用HAL_I2C_Mem_Write…
// 添加这个函数 int fputc(int ch,FILE *f) { uint8_t temp[]={ch}; HAL_UART_Transmit(&UartHandle,temp,,); } MDK设置:勾选Use Micro LIB 测试板子:STM32F746NG-DISCOVERY main.c文件 /* Includes ------------------------------------------------------------------*/ #include &qu…
串口发送功能: uint8_t TxData[]= "01234abcde"; HAL_UART_Transmit(&huart2,TxData,,0xffff);//把TxData的内容通过uart2发送出去,长度是10,timeout的时间是最大值0xffff 串口接收功能1: uint8_t value='F'; HAL_UART_Receive(&huart2,(uint8_t *)&value,,);//在这个语句停留1000ms内等待接收1个字节数据…
/* 第1个参数为I2C操作句柄 第2个参数为从机设备地址 第3个参数为从机寄存器地址 第4个参数为从机寄存器地址长度 第5个参数为发送的数据的起始地址 第6个参数为传输数据的大小 第7个参数为操作超时时间 */HAL_I2C_Mem_Write(&hi2c2,salve_add,0,0,PA_BUFF,sizeof(PA_BUFF),0x10); HAL_I2C_Mem_Write_IT(): HAL_I2C_Mem_Read(); HAL_I2C_Mem_Read_IT(); HAL_I2C…
@2019-01-25 [小记] 工具化.易控制.易配置.效率高: 驱动控制文件<stm32f1xx_hal_conf.h>中驱动模块使能由STM32CubeMX工具配置使能…
基本方法 1.设置TIM2 CH1为输入捕获功能: 2.设置上升沿捕获: 3.使能TIM2 CH1捕获功能: 4.捕获到上升沿后,存入capture_buf[0],改为捕获下降沿: 5.捕获到下降沿后,存入capture_buf[1],改为捕获上升沿: 6.捕获到上升沿后,存入capture_buf[2],关闭TIM2 CH1捕获功能: 7.计算:capture_buf[2] - capture_buf[0]就是周期,capture_buf[1] - capture_buf[0]就是高电平所占时…
完整教程下载地址:http://www.armbbs.cn/forum.php?mod=viewthread&tid=86980 第29章       STM32H7的USART串口基础知识和HAL库API 本章节为大家讲解USART(Universal synchronous asynchronous receiver transmitter,通用同步异步收发器)的基础知识和对应的HAL库API.相比之前的F1和F4系列,增加了不少新特性. 29.1 初学者重要提示 29.2 串口基础知识 2…
写在前面 最近需要使用一款STM32L4系列的芯片进行开发,需要学习使用HAL库.在进行串口中断使用的时候遇到了一些小麻烦,写下解决方案供大家参考. 1.UART相关的头文件引用错误 由于本人直接使用MDK进行开发,没有使用CubeMX,所以一些初始化需要手动进行.在引用UART相关的头文件时,记得将"stm32l4xx_hal_conf.h"文件中的相关宏定义取消注释,如下图: 2.如何接收字符串(多次进入中断) 接收字符串主要有两种方法,一种是对中断函数进行改造,另一种是对接收回调…