关于stm32cube中UART串口的新库函数的一些东西理解,长久记录

官方虽然给出来好多种既定的封装函数
但是实际应用中感觉都不太好用,额,也许是还没理解怎么用.
他们封装的格式类似HAL_UART......................这样的
实际中只用这种开头的函数不行啊
还要利用__hal_uart_..................这种开头的
这次modbus用到了
if (xRxEnable)
{
__HAL_UART_ENABLE_IT(&huart6,UART_IT_RXNE);
}
else
{
__HAL_UART_DISABLE_IT(&huart6,UART_IT_RXNE);
}
if (xTxEnable)
{
__HAL_UART_ENABLE_IT(&huart6,UART_IT_TXE);
}
else
{
__HAL_UART_DISABLE_IT(&huart6,UART_IT_TXE);
}
已邀请:

admin

赞同来自: zhx227zj ksy207 talenthn

HAL_UART_Transmit(UART_HandleTypeDef huart, uint8_t pData, uint16_t Size, uint32_t Timeout)
这个Timeout是按照毫秒级的,就是ms
因为timeout = HAL_GetTick() + Timeout;
HAL_GetTick()是毫秒级的....
所以当传输一个字节的数据的时候超时时间可以设定为
额,当你波特率是9600 bit/s的时候,那么一秒能传输9600位数据,8位数据一个字节,
这样1s就传输了1200字节,即1200byte
那么一个字节传输的时间就是1000ms/1200byte=0.84ms
于是当在波特率为9600传输一个字节的数据的时候超时时间可以设定为1ms
写作:HAL_UART_Transmit (&huart6 ,(uint8_t *)&ucByte,1,0x01);
那么当你波特率是115200的时候,传输一个字节的超时时间理论是大于0.0695ms也即最小1ms
写作:HAL_UART_Transmit (&huart6 ,(uint8_t *)&ucByte,1,0x01);
同理要是传输10个字节,传输时间乘以10,就是0x0A了

函数中利用了
UART_WaitOnFlagUntilTimeout(huart, UART_FLAG_TXE, RESET, Timeout)
或者UART_WaitOnFlagUntilTimeout(huart, UART_FLAG_TC, RESET, Timeout)
返回的是false或者true,官方写作HAL_OK
上面两个函数完全可以利用下判断超时用,比如用到串口中断里面(猜想)

admin

赞同来自:

串口中断里面用到
void USART6_IRQHandler(void)
{

if(__HAL_UART_GET_IT_SOURCE(&huart6, UART_IT_RXNE)!= RESET)
{
prvvUARTRxISR();//接受中断
}

if(__HAL_UART_GET_IT_SOURCE(&huart6, UART_IT_TXE)!= RESET)
{
prvvUARTTxReadyISR();//发送完成中断
}
//////-------------------------------下面是stm32cubemx生成自带的------------------------------
/ USER CODE END USART1_IRQn 1 /
HAL_NVIC_ClearPendingIRQ(USART6_IRQn);
HAL_UART_IRQHandler(&huart6);
/ USER CODE END USART1_IRQn 1 /
}

从这里要看下两个函数的区别了...
__HAL_UART_GET_IT_SOURCE(&huart6, UART_IT_RXNE)
Checks whether the specified UART interrupt has occurred or not.
* This parameter can be one of the following values:
* @arg UART_IT_CTS: CTS change interrupt (not available for UART4 and UART5)
* @arg UART_IT_LBD: LIN Break detection interrupt
* @arg UART_IT_TXE: Transmit Data Register empty interrupt
* @arg UART_IT_TC: Transmission complete interrupt
* @arg UART_IT_RXNE: Receive Data register not empty interrupt
* @arg UART_IT_IDLE: Idle line detection interrupt
* @arg USART_IT_ERR: Error interrupt

__HAL_UART_GET_FLAG(&huart6 ,UART_FLAG_RXNE)
Checks whether the specified UART flag is set or not.
* This parameter can be one of the following values:
* @arg UART_FLAG_CTS: CTS Change flag (not available for UART4 and UART5)
* @arg UART_FLAG_LBD: LIN Break detection flag
* @arg UART_FLAG_TXE: Transmit data register empty flag
* @arg UART_FLAG_TC: Transmission Complete flag
* @arg UART_FLAG_RXNE: Receive data register not empty flag
* @arg UART_FLAG_IDLE: Idle Line detection flag
* @arg UART_FLAG_ORE: OverRun Error flag
* @arg UART_FLAG_NE: Noise Error flag
* @arg UART_FLAG_FE: Framing Error flag
* @arg UART_FLAG_PE: Parity Error flag
我操,这不差不多一样嘛,我用错了两次,随便貌似没影响,额,可能我程序里面删了也无所谓吧?
第一个检查该中断发生了没有!
第二个检查这个标识位被设置了没设置!
比如,如上所示串口中断中用__HAL_UART_GET_IT_SOURCE(&huart6, UART_IT_RXNE)
来检查是否是RXEN接收非空中断发生了.
是的话运行prvvUARTRxISR();//接受中断
而flag呢?
汗一个,有点晕,其实用起来差不多,区别如下

__HAL_UART_GET_IT_SOURCE主要就是与中断相关的,检查USART中断产生与否,当USART发送完成后会有USART_IT_TC中断,因此可以用来判断,而__HAL_UART_GET_FLAG是USART标志位设置与否,其中就有发送完成标志位USART_Flag_TC所以也可用来判断。而最终都是操作SR寄存器
[quote]__HAL_UART_GET_FLAG仅仅是把SR相应的标志位置位 __HAL_UART_GET_IT_SOURCE还会去操作相应的CR1,CR2,CR3,完了再去进行SR的置位

[/quote]

admin

赞同来自: Tank117 xhdzwzj LUCKB

看到一个代码有意思中断里面用的,记录
//溢出-如果发生溢出需要先读SR,再读DR寄存器则可清除不断入中断的问题
if(USART_GetFlagStatus(USART1,USART_FLAG_ORE)==SET)
{
USART_ClearFlag(USART1,USART_FLAG_ORE); //读SR其实就是清除标志
USART_ReceiveData(USART1); //读DR
}

admin

赞同来自: mantishell LUCKB

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
/ Increment Index for buffer writing /
UserTxBufPtrIn++;

/ To avoid buffer overflow /
if(UserTxBufPtrIn == APP_RX_DATA_SIZE)
{
UserTxBufPtrIn = 0;
}

/ Start another reception: provide the buffer pointer with offset and the buffer size /
HAL_UART_Receive_IT(huart, (uint8_t *)(UserTxBuffer + UserTxBufPtrIn), 1);
}

iwos2610

赞同来自:

谢谢分享,最近正在纠结这个串口的问题

容成及澈

赞同来自:

怎么判断进没进中断,或者说怎么进串口中断,用回传函数和中断有区别吗?

zhx227zj - 90后IT男

赞同来自:

有理解功效 赞一个。

37.5°仰望星空

赞同来自:

声明:HAL_StatusTypeDef HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout);
使用
HAL_UART_Receive(&huart3, pData, 1024, 1000);
读不出数据怎么处理(cube新手求指导)

一见如故

赞同来自:

借鉴,学习

風影旋新月

赞同来自:

我王健就是饿死,从这里跳下去,也不会学习stm32!

嗯~真香

要回复问题请先登录注册