国内经典网站,移动商城型网站开发,济南建设网站的公司哪家好,网页设计与网站建设案例课堂萌新的STM32学习-27–USART异步通信配置步骤
USART/UART 异步通信配置步骤
1.配置串口工作参数 HAL_UART_Init() 我们会在此处调用MSP中的回调函数
2.串口底层初始化 用户定义HAL_UART_MspInit() 配置GPIO NVIC CLOCK 等
3.开启串口异步接收中断 HAL_UART_Receive_IT()
4.…萌新的STM32学习-27–USART异步通信配置步骤
USART/UART 异步通信配置步骤
1.配置串口工作参数 HAL_UART_Init() 我们会在此处调用MSP中的回调函数
2.串口底层初始化 用户定义HAL_UART_MspInit() 配置GPIO NVIC CLOCK 等
3.开启串口异步接收中断 HAL_UART_Receive_IT()
4.设置优先级使能中断 HAL_NVIC_SetPriority() HAL_NVIC_EnableIRQ()
5.编写中断服务函数 USARTx_IRQHandler() UARTx_IRQHandler()
6.串口数据发送 USART_DR HAL_UART_Transmit()
下列介绍HAL库相关函数介绍 HAL_StatusTypeDef HAL_UART_Init(UART_HandleTypeDef * huart) 这就有点类似是我们的int caozuo( int* a ) 嘿嘿 指针类型班门弄斧 就是表示输入一个指针型变量 返回一个整型 那么这里的话来说就是会返回一个HAL_StatusTypeDef 这种玩意 我内心想说一句 这啥 结构体吗 还能这样
我们来看异步通信的.c文件了解一下 哦呼这是一种枚举类型的东西 这个枚举类型所携带的信息量是 表示这个串口当前在干嘛 如何如何的 毕竟这里来说他是第一步 起到了 配置串口工作参数 我们来看有 HAL_OK 初始化成功 HAL_ERROR 初始化错误 HAL_BUSY 初始化忙 HAL_TIMEOUT 初始化超时 其实只有返回第一的时候初始化才标志着成功
我们现在看另一个形参的句柄 就是用的指针的类型引导 UART_HandleTypeDef * 我们一般来说只会在意的是 我们更加详细的介绍在书本上展示出来
我们要使用一个外设首先要对它进行初始化所以先看串口的初始化函数 目的 用于初始化异步模式的收发器。 HAL_StatusTypeDef HAL_UART_Init(UART_HandleTypeDef *huart); 这句话很长 它返回的是一个状态值 就是有4种状态告诉你返回的是否成功 HAL_StatusTypeDef 枚举类型的值有 4 个分别是 HAL_OK 表示成功HAL_ERROR 表示错误HAL_BUSY 表示忙碌HAL_TIMEOUT 超时。后续遇到该结构体也是一样的。 而后一整个大的枚举类型的细分 1Instance指向 UART 寄存器基地址。实际上这个基地址 HAL 库已经定义好了可以选择范围USART1~ USART3、UART4、UART5。2InitUART 初始化结构体用于配置通讯参数如波特率、数据位数、停止位等等。下面我们再详细讲解这个结构体。3pTxBuffPtrTxXferSizeTxXferCount分别是指向发送数据缓冲区的指针发送数据的大小发送数据的个数。4pRxBuffPtrRxXferSizeRxXferCount分别是指向接收数据缓冲区的指针接受数据的大小接收数据的个数5hdmatxhdmarx配置串口发送接收数据的 DMA 具体参数。6Lock对资源操作增加操作锁保护功能可选 HAL_UNLOCKED 或者 HAL_LOCKED 两个参数。如果 gState 的值等于 HAL_UART_STATE_RESET则可认为串口未被初始化此时分配锁资源并且调用 HAL_UART_MspInit 函数来对串口的 GPIO 和时钟进行初始化。 7gStateRxState分别是 UART 的发送状态、工作状态的结构体和 UART 接受状态的结构体。HAL_UART_StateTypeDef 是一个枚举类型列出串口在工作过程中的状态值有些值只适用于 gState如 HAL_UART_STATE_BUSY。8ErrorCode串口错误操作信息。主要用于存放串口操作的错误信息。 一般来说只用1 2 我们现在仔细剖析一下里面的部分 UART_InitTypeDef UART_InitTypeDef是上面这个大型的UART_HandleTypeDef中的一部分 1BaudRate波特率设置。一般设置为 2400、9600、19200、115200。2WordLength数据帧字长可选 8 位或 9 位。这里我们设置为 8 位字长数据格式。3StopBits停止位设置可选 0.5 个、1 个、1.5 个和 2 个停止位一般我们选择 1 个停止位。4Parity奇偶校验控制选择我们设定为无奇偶校验位。5ModeUART 模式选择可以设置为只收模式只发模式或者收发模式。这里我们设置为全双工收发模式。6HwFlowCtl硬件流控制选择我们设置为无硬件流控制。7OverSampling过采样选择选择 8 倍过采样或者 16 过采样一般选择 16 过采样。 我们在这里会产生一个疑问 为什么这里的操作这么复杂既有UART_HandleTypeDef 又整出一个 UART_InitTypeDef 我记得以前写的按键啊流水灯啊没有这么复杂的 对 兄弟此言差矣 我们来看之前的 因为GPIO_InitTypeDef 本来和上面的 UART_InitTypeDef 也是一个结构体类型 因为认识不断成长的 我们现在要用的东西寄存器只会越来越多 别守着你那三瓜两枣了 往大了看是不是我完整的串口初始化 肯定包括了部分串口的设置了
2.HAL_UART_Receive_IT 函数是开启串口接收中断函数。 HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huart,uint8_t *pData, uint16_t Size); 作用用于开启以中断的方式接收指定字节。数据接收在中断处理函数里面实现。 形参 1 是 UART_HandleTypeDef 结构体指针类型的串口句柄。 形参 2 是要接收的数据地址。 形参 3 是要接收的数据大小以字节为单位。
3.HAL_UART_IRQHandler 函数是 HAL 库中断处理公共函数。 形参 1 是 UART_HandleTypeDef 结构体指针类型的串口句柄。 该函数是 HAL 库已经定义好用户一般不能随意修改。如果用户要在中断中实现自己的逻辑代码可以直接在函数 HAL_UART_IRQHandler 的前面或者后面添加新代码也可以直接在HAL_UART_IRQHandler 调用的各种回调函数里面执行这些回调都是弱定义的方便用户直接在其它文件里面重定义。 HAL_StatusTypeDef HAL_UART_Transmit( UART_HandleTypeDef huart , uint8_tpData , uint16_t Size , uint32_t Timeout) 作用: 以阻塞的方式发送指定字节的数据 形参1 UART_Handle TypeDef 结构体类型指针变量 形参2 指向要发送的数据地址 形参3 要发送的数据大小以字节为单位 形参4 设置的超时时间以ms单位