历史上的今天
返回首页

历史上的今天

今天是: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()里似乎关闭了接收中断的,所以必须要打开。

现在还不知道怎么接收不定长度的数据,期待哪位大哥给讲解一下,不胜感激。


推荐阅读

史海拾趣

C&H Technology公司的发展小趣事

随着技术实力的不断提升,C&H Technology开始积极拓展海外市场。公司首先在欧洲设立了办事处,通过与当地电信运营商和设备制造商的合作,成功将产品打入欧洲市场。随后,公司又进军北美和亚洲其他地区,逐步建立了全球化的销售网络。在市场拓展的过程中,C&H Technology始终坚持以客户为中心的服务理念,不断优化产品性能和服务质量,赢得了客户的信赖和好评。

Fremont_Micro_Devices_USA公司的发展小趣事

随着智能手机市场的快速发展,C&H Technology意识到单纯的芯片制造已经不能满足市场需求。于是,公司开始加大研发投入,致力于在5G通信、人工智能等前沿技术领域取得突破。经过多次试验和失败,C&H Technology的研发团队终于成功开发出了一款集成5G通信功能的手机芯片,并获得了多项专利。这一技术突破不仅提升了公司在行业内的地位,也为公司的未来发展奠定了坚实的基础。

Fagor Electrónica公司的发展小趣事

进入1960年代,Fagor Electrónica迎来了其发展的第一个重大里程碑。1964年,公司成功启动了第一批硅整流器的制造。这一创新不仅提高了产品的性能,还为公司带来了更大的市场份额。硅整流器的推出标志着Fagor Electrónica在电子制造技术上的领先地位,也为其后续的发展奠定了坚实的基础。

Advanced Thermal Solutions公司的发展小趣事

ATS始终坚持以创新为驱动力,不断提升研发创新能力。公司设立了专门的研发团队,负责新技术和新产品的研发工作。通过与高校和研究机构的合作,ATS不断引入前沿的科技成果和人才资源,为公司的创新发展提供了有力支持。此外,ATS还建立了完善的研发流程和质量控制体系,确保每一款产品都能达到最高的性能和质量标准。

Gruner AG公司的发展小趣事
将光耦合器接入实际电路中,测试其是否能正常传输信号并实现电气隔离。
Cal Crystal Lab Inc / Comclok Inc公司的发展小趣事

随着全球化的加速推进,国际化战略成为了企业发展的重要方向。Cal Crystal Lab Inc在稳固国内市场的基础上,积极实施国际化战略。公司不仅在海外设立了研发中心和生产基地,还加大了对国际市场的开拓力度。通过与当地企业的合作与交流,Cal Crystal Lab Inc不断适应国际市场的需求和变化,提升了公司在全球市场的竞争力。

这五个故事只是虚构的示例,并不代表任何真实公司的历史。实际的电子行业公司发展历程往往更加复杂和多样,受到市场、技术、政策等多种因素的影响。如果您需要了解特定公司的真实发展故事,建议查阅相关资料或咨询相关人士。

问答坊 | AI 解惑

一块单片机上实现

一块单片机上实现 12位AD、DA转换,CAN接口在总线上扩展 数据传输的RS485用75176加一个P1.X口 还有红外遥控,声光报警,方波输出如果一个功能一个脚,那P1口足够用了,不够用还是在总线上扩(用373做输出,244做输入) LED数码显示或键盘也用37 ...…

查看全部问答>

LabVIEW 实践教学教程

  一个自己用了后,感觉效率很高的LabVIEW 学习教程,两个星期包你学会使用!…

查看全部问答>

招聘照明行业研发总监

北京照明集团招聘: 研发总监(负责灯具研发、10-15k+其他) 工作职责:     1.负责公司技术中心的管理工作,制定技术人员的培训计划、负责日常工作协调、员工沟通、绩效考核等;     2.负责研究同行业节能改造的发展方向, ...…

查看全部问答>

武汉高校内部赛题

本帖最后由 paulhyde 于 2014-9-15 09:19 编辑  …

查看全部问答>

vxworks6.6 FTP 加载错误

使用平台vxworks6.6   开发环境worksbench3.0 在config.h文件中添加了相应的FTP宏定义: #define INCLUDE_IPFTPC #define INCLUDE_IPFTPS 在编译bootrom.bin的时候,系统提示错误: undefined reference to \'ipftps_create\' unde ...…

查看全部问答>

uboot移植的问题

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 ...…

查看全部问答>

LCD上电初始化

    在使用LM6029A 128*64的LCD模块时,LCD的复位信号由复位电路提供,控制器是S6B0724A01。第一次上电初始化LCD总是不成功,紧接着再上电LCD可以成功初始化,然后隔四五分钟或者更长时间,再上电,LCD还是不能成功初始化。后来用I/O 口 ...…

查看全部问答>

UART4_IRQn定义

红色部分用IAR编译的时候提示 undefined,换成绿色的却没有问题?? void NVIC_Configuartion(void) {   NVIC_InitTypeDef NVIC_InitStructure; /*Config the NVIC Preemption Priority Bits*/   NVIC_PriorityGrou ...…

查看全部问答>

好东东

本帖最后由 paulhyde 于 2014-9-15 09:26 编辑 东东  …

查看全部问答>