历史上的今天
今天是:2025年03月24日(星期一)
2019年03月24日 | STM32CubeMX串口接收中断
2019-03-24 来源:eefocus
才接触到cube,目前只实现了固定长度的接收。配置好后,在while(1)前加入配置接收中断。我也是跟踪代码慢慢找到这句的,目前对于cube的库函数一点都不了解。
if(HAL_UART_Receive_IT(&huart1,usart1_rxBuf,5)!=HAL_OK)Error_Handler();
打开it.c。找到
void USART1_IRQHandler(void)
{
/* USER CODE BEGIN USART1_IRQn 0 */
/* USER CODE END USART1_IRQn 0 */
HAL_UART_IRQHandler(&huart1);
/* USER CODE BEGIN USART1_IRQn 1 */
/* USER CODE END USART1_IRQn 1 */
}
跟踪进中断函数。找到接收中断处。
tmp_flag = __HAL_UART_GET_FLAG(huart, UART_FLAG_RXNE);
tmp_it_source = __HAL_UART_GET_IT_SOURCE(huart, UART_IT_RXNE);
/* UART in mode Receiver ---------------------------------------------------*/
if((tmp_flag != RESET) && (tmp_it_source != RESET))
{
UART_Receive_IT(huart);
}
再次跟踪金UART_Receive_IT()
if(huart->Init.Parity == UART_PARITY_NONE)
{
*huart->pRxBuffPtr++ = (uint8_t)(huart->Instance->DR & (uint8_t)0x00FF);
}
else
{
*huart->pRxBuffPtr++ = (uint8_t)(huart->Instance->DR & (uint8_t)0x007F);
}
这里是直接把接收数据装入pRxBuffPtr指向的buf里了。
然后就是下面这个if里的
if(--huart->RxXferCount == 0)
{
__HAL_UART_DISABLE_IT(huart, UART_IT_RXNE);
/* Check if a transmit process is ongoing or not */
if(huart->State == HAL_UART_STATE_BUSY_TX_RX)
{
huart->State = HAL_UART_STATE_BUSY_TX;
}
else
{
/* Disable the UART Parity Error Interrupt */
__HAL_UART_DISABLE_IT(huart, UART_IT_PE);
/* Disable the UART Error Interrupt: (Frame error, noise error, overrun error) */
__HAL_UART_DISABLE_IT(huart, UART_IT_ERR);
huart->State = HAL_UART_STATE_READY;
}
HAL_UART_RxCpltCallback(huart);
return HAL_OK;
}
这里看到,第一句话就把接收终端给关闭了。然后就是处理各种标记,我一个都看不懂。。。。。。然后就调用回调函数了。终于找到需要的东西了。跟踪进去,说这个函数不能更改,你要用的话自己重新定义实现就好了。
于是我就重新定义了该函数
void HAL_UART_RxCpltCallback(UART_HandleTypeDef*UartHandle)
{
if(UartHandle->Instance == USART1)
{
HAL_UART_Transmit_IT(&huart1, huart1.pRxBuffPtr-huart1.RxXferSize, huart1.RxXferSize);
HAL_UART_Receive_IT(&huart1,usart1_rxBuf,5);//开启下一次接收中断
// __HAL_UART_ENABLE_IT(&huart1,UART_IT_RXNE);
}
}
解释下,首先判断是否为自己用的那个USART。然后打印测试的数据出来。发送中断函数第二个参数为buf地址,因为在接收的时候pRxBuffPtr一直在不断累加了,所以这里需要减RxXferSize,就到了接收buf的头了。第三个参数就是长度了。
打印之后,重新加载一次接收中断。里边我主要就看了这几句话,其他没仔细研究。
huart->pRxBuffPtr = pData;
huart->RxXferSize = Size;
huart->RxXferCount = Size;
这里是赋值接收的ptr,Size,Couont。之所以要赋值Count,是因为没接收到一个字节,Count自减一次,直到为0了,就可以调用回调函数。
别漏了,最后它还调用了
/* Enable the UART Data Register not empty Interrupt */
__HAL_UART_ENABLE_IT(huart, UART_IT_RXNE);
因为在UART_Receive_IT()里似乎关闭了接收中断的,所以必须要打开。
现在还不知道怎么接收不定长度的数据,期待哪位大哥给讲解一下,不胜感激。
史海拾趣
|
北京照明集团招聘: 研发总监(负责灯具研发、10-15k+其他) 工作职责: 1.负责公司技术中心的管理工作,制定技术人员的培训计划、负责日常工作协调、员工沟通、绩效考核等; 2.负责研究同行业节能改造的发展方向, ...… 查看全部问答> |
|
使用平台vxworks6.6 开发环境worksbench3.0 在config.h文件中添加了相应的FTP宏定义: #define INCLUDE_IPFTPC #define INCLUDE_IPFTPS 在编译bootrom.bin的时候,系统提示错误: undefined reference to \'ipftps_create\' unde ...… 查看全部问答> |
|
cpu/arm920t/s3c24x0/libs3c24x0.a lib_arm/libarm.a fs/cramfs/libcramfs.a fs/fat/libfat.a fs/fdos/libfdos.a fs/jffs2/libjffs2.a fs/reiserfs/libreiserfs.a fs/ext2/libext2fs.a net/libnet.a disk/libdisk.a rtc/librtc.a dtt/libdtt.a driv ...… 查看全部问答> |
|
红色部分用IAR编译的时候提示 undefined,换成绿色的却没有问题?? void NVIC_Configuartion(void) { NVIC_InitTypeDef NVIC_InitStructure; /*Config the NVIC Preemption Priority Bits*/ NVIC_PriorityGrou ...… 查看全部问答> |




