从今天开始定时更新一下有关STM32 HAL库学习的过程,主要是对HAL库函数的所有讲解。本章是关于uart串口的函数。
1、HAL_USART_Init(USART_HandleTypeDef * husart)
初始化串口的的函数:
用法为
UART_HandleTypeDef huart1;
huart1.xxx = ssss;
...
HAL_USART_Init(&huart1); //需要注意点的是函数的输入参数是指针类型?
UART_HandleTypeDef huart4;
huart4.Instance = UART4;
huart4.Init.BaudRate = 115200;
huart4.Init.WordLength = UART_WORDLENGTH_8B;
huart4.Init.StopBits = UART_STOPBITS_1;
huart4.Init.Parity = UART_PARITY_NONE;
huart4.Init.Mode = UART_MODE_TX_RX;
huart4.Init.HwFlowCtl = UART_HWCONTROL_NONE;
huart4.Init.OverSampling = UART_OVERSAMPLING_16;
huart4.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
huart4.Init.ClockPrescaler = UART_PRESCALER_DIV1;
huart4.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
if (HAL_UART_Init(&huart4) != HAL_OK)
2、void HAL_USART_MspInit (USART_HandleTypeDef * husart)
串口回调函数,主要进行硬件部分的初始化
例如开启串口的时钟和管脚的配置,本函数被上一个函数自动调用。
void HAL_UART_MspInit(UART_HandleTypeDef* uartHandle)
{GPIO_InitTypeDef GPIO_InitStruct = {0};
if(uartHandle->Instance==UART4)
{
/* USER CODE BEGIN UART4_MspInit 0 */
/* USER CODE END UART4_MspInit 0 */
/* UART4 clock enable */
__HAL_RCC_UART4_CLK_ENABLE();
__HAL_RCC_GPIOI_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE();
/**UART4 GPIO Configuration
PI9 ------> UART4_RX
PA0 ------> UART4_TX
*/
GPIO_InitStruct.Pin = GPIO_PIN_9;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
GPIO_InitStruct.Alternate = GPIO_AF8_UART4;
HAL_GPIO_Init(GPIOI, &GPIO_InitStruct);
GPIO_InitStruct.Pin = GPIO_PIN_0;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
GPIO_InitStruct.Alternate = GPIO_AF8_UART4;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
/* UART4 interrupt Init */
HAL_NVIC_SetPriority(UART4_IRQn, 1, 2);
HAL_NVIC_EnableIRQ(UART4_IRQn);
/* USER CODE BEGIN UART4_MspInit 1 */
/* USER CODE END UART4_MspInit 1 */
}
3.HAL_StatusTypeDef HAL_USART_Transmit (USART_HandleTypeDef * husart, uint8_t * pTxData, uint16_t Size, uint32_t Timeout);
串口发送数据的函数,最重要的函数之一。单工以阻塞模式发送大量数据。
huart :要发送数据的串口指针,ptxData:要发送的数据,注意此处的指针形式,Size:发送数据的长度(字节数) Timeout:发送数据超时时间
发送数据的大小要注意是u8类型的(0-255)
?
HAL_UART_Transmit(&huart4,"222",3,2);
//发送一个字符串
u8 num = 10;
HAL_UART_Transmit(&huart4,&num,1,2);
//发送一个数字
u16 num = 0xffde;
u8 temp;
temp = num>>8;
HAL_UART_Transmit(&huart4,&temp,1,1);
temp = num;
HAL_UART_Transmit(&huart4,&temp,1,1);
//发送一个十六位的数据
注意:使用本函数发送十六位或者二十四位数据的时候下面的方法是错误的:
u16 num = 0x1234;
HAL_UART_Transmit(&huart4,&num,2,2);
此方法打印出的数据为 34 12 。不是想要输出的1234需要注意。
4、HAL_StatusTypeDef HAL_UART_Receive (UART_HandleTypeDef * huart, uint8_t * pData, uint16_t Size,uint32_t Timeout)
串口接收数据的库函数,阻塞的方式接收数据。
huart :要发送数据的串口指针,pData:接收数据缓存地址,注意此处的指针形式,Size:接收数据的长度(字节数) Timeout:数据接收等待时间,CPU等待这个时间用来接收数据。
注意本函数不会因为设置接收接收字符数和实际接收到的数据量不一致而发生冲突,接收到的数据小于设定接收量时少的那部分补零,多于设定量时直截取需要的数据量。
uint16_t numd[3];
HAL_UART_Receive(&huart4,numd,3,1000);
HAL_UART_Transmit(&huart4,numd,3,1);
//等一秒时间接收三位数据
5、HAL_StatusTypeDef? HAL_UART_Transmit_IT (UART_HandleTypeDef * huart, uint8_t * pData, uint16_t Size)
使用中断的方式发送数据,对应上面的阻塞方式发送数据。
本函数的使用需要慎重考虑前后程序,要注意本函数发送方式为中断方式,如果本函数后面直接跟着用HAL_UART_Transmit函数,那么后面数据不会发送。可通过增加短延时解决
?
uint16_t numd[3];
HAL_UART_Receive(&huart4,numd,3,1000);
while(HAL_UART_Transmit_IT(&huart4,numd,3)==HAL_OK);
HAL_Delay(10); //不加延时以下数据无法使用阻塞方式发送
num1= num23>>8;
HAL_UART_Transmit(&huart4,&num1,1,1);
num1 = num23;
HAL_UART_Transmit(&huart4,&num1,1,1);
6、HAL_StatusTypeDef HAL_UART_Receive_IT (UART_HandleTypeDef * huart, uint8_t * pData, uint16_t Size)
一种中断模式接收数据的函数。
huart :接收数据串口指针。pdata 接收区的指针? size 接受数据量字节长度,一般设置接收长度为1,每次接受一个字节的数据就进入中断处理。
注意如果设置接收数据不为1,而是某个固定的值,当串口接受的数据量不满足这个值的时候,串口中断不会被触发。一直等待接收数据满足设定值才会触发中断。
本函数必须在接受回调函数中再次调用才能经行下一次的接收。
#define num 1
uint16_t numd[num];
void UART_Init()
{
.....
HAL_UART_Receive_IT(&huart4,numd,num);
}
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart);//接收完成回调函数
{
HAL_UART_Receive_IT(&huart,numd,num);
}
7、HAL_StatusTypeDef HAL_UART_Transmit_DMA (UART_HandleTypeDef * huart, uint8_t * pData, uint16_t Size)
huart :接收数据串口指针。pdata 发送数据数组的首地址? size 发送数据量字节长度。使用这个函数之前需要做uart函数关于DMA设置的初始化。
#define SEND_BUF_SIZE 6
u8 SendBuff[SEND_BUF_SIZE]="123456"; //发送数据缓冲区
UART_HandleTypeDef UART1_Handler;
HAL_UART_Transmit_DMA(&UART1_Handler,SendBuff,SEND_BUF_SIZE);//开启DMA传输
?
?
1、静态网页与动态比较: 1)静态网页: 优势:A、 对搜索引擎友好,被收录的质...
1.准备工作 1.1PHP集成环境 这里我们使用的是XAMPP,XAMPP是一个功能强大的建站...
当我们在使用关系型数据库时,主键(Primary Key)是无法避开的概念,主键的作用就...
今天看了第5章几个例子,有点收获,记录下来当作回顾也当作分享。 关于匹配字符...
Protobuf 是google开发的一个序列化和反序列化的协议库,我们可以自己设计传递数...
在实现分库分表的情况下,数据库自增主键已无法保证自增主键的全局唯一。为此,M...
本文实例讲述了PHP code 验证码生成类定义和简单使用。分享给大家供大家参考,具...
客户端部分: 复制代码 代码如下: html head meta http-equiv="Content-Type" co...
1.算法效率 算法效率分析分为两种第一种是时间效率第二种是空间效率。时间效率被...
前言 好久没冒泡了,算起来估计有快半年没更新博客了,估计是我第一次停更如此之...