754|5

2873

帖子

3

资源

版主

[ ST NUCLEO-U575ZI-Q 测评] 串口中断不定长接收 [复制链接]

串口不定长接收,对数据进行分析判断。最近想弄个接收黑白图片的工程,所以要把串口接收再复习一遍:

1、串口stm32cubeMax配置:

image.png   2、配置中断:

image.png  3、配置串口发送PA9为USART1的TX,输出模式为上拉,PA10为USART1的RX:

image.png   生成工程后打开工程。

# 串口接收自定义函数的编写

1、打开main.h,加入如下代码:

/* Exported types ------------------------------------------------------------*/
/* USER CODE BEGIN ET */
extern UART_HandleTypeDef huart1;
typedef uint8_t u8;
typedef uint16_t u16;
typedef uint32_t u32;
#define RXBUFFSIZE 2048
typedef struct{
	UART_HandleTypeDef *huart;
	u8 rx_buf[RXBUFFSIZE]; //接收缓冲区
	u32 tx_count;  //发送完成次数计数标志位
	u32 rx_flage;   //接收完成标志位
	
	void (*init)(void);   //初始化函数指针
} rxtx_it_usart_t;


/* USER CODE END ET */

代码的主要功能是结构体并进行了初始化。

2、stm32u5xxit.c 声明结构体函数:

/* External variables --------------------------------------------------------*/

extern UART_HandleTypeDef huart1;
/* USER CODE BEGIN EV */

3、定义中断函数:

/**
  * [url=home.php?mod=space&uid=159083]@brief[/url] This function handles USART1 global interrupt.
  */
void USART1_IRQHandler(void)
{
  /* USER CODE BEGIN USART1_IRQn 0 */
	HAL_UART_IDLE_HANDLER(&huart1); //自定义空闲中断接收
  /* USER CODE END USART1_IRQn 0 */
  HAL_UART_IRQHandler(&huart1);  //中断接收
  /* USER CODE BEGIN USART1_IRQn 1 */

  /* USER CODE END USART1_IRQn 1 */
}

/* USER CODE BEGIN 1 */
__weak void HAL_UART_IDLE_HANDLER(UART_HandleTypeDef *huart)
{
	UNUSED(huart);
}

4、在main.c主函数中增加初始化函数代码

/* USER CODE BEGIN PFP */
//声明一个结构体并进行初始化
void  uart1_user_init(void);

rxtx_it_usart_t rxtx_it_usart = {
	.huart = &huart1,
	.init = uart1_user_init, //为该指针赋值,指向init函数
};
/* USER CODE END PFP */

增加中断回调处理函数:

/* USER CODE BEGIN 4 */
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
{
	if(rxtx_it_usart.huart == huart)
	{
		rxtx_it_usart.tx_count++;
		
	}
	
}
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
  /* Prevent unused argument(s) compilation warning */
  UNUSED(huart);
  /* NOTE: This function Should not be modified, when the callback is needed,
           the HAL_UART_TxCpltCallback could be implemented in the user file
   */
 
	if(rxtx_it_usart.huart == huart)
	{
		rxtx_it_usart.rx_flage = 1;
	}
}

//初始化空闲中断
void uart1_user_init(void)
{
	__HAL_UART_ENABLE_IT(rxtx_it_usart.huart, UART_IT_IDLE);
	__HAL_UART_CLEAR_IDLEFLAG(rxtx_it_usart.huart);
	HAL_UART_Receive_IT(rxtx_it_usart.huart,rxtx_it_usart.rx_buf,RXBUFFSIZE);
}

//自定义空闲中断处理函数
void HAL_UART_IDLE_HANDLER(UART_HandleTypeDef *huart)
{
   uint32_t isrflags   =  READ_REG(huart->Instance->ISR); 
   if((USART_ISR_IDLE & isrflags) != RESET && ( huart->RxXferCount > 0))
   {
       printf("idle\r\n");
       __HAL_UART_CLEAR_IDLEFLAG(huart);
      /* Disable the UART Data Register not empty Interrupt */
      __HAL_UART_DISABLE_IT(huart, UART_IT_RXNE);
      /* 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);
      /* Rx process is completed, restore huart->RxState to Ready */
      huart1.RxState = HAL_UART_STATE_READY;  
      HAL_UART_RxCpltCallback(huart); 
   }else if((USART_ISR_IDLE & isrflags) != RESET && ( huart->RxXferCount == 0 ))
   { 
       __HAL_UART_CLEAR_IDLEFLAG(huart);

   } 
}

//自定中断错误处理函数

void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart)
{
	if(rxtx_it_usart.huart == huart)
	{
		printf("error %d\r\n",huart->ErrorCode);
		
	}
}
/* USER CODE END 4 */

在main中函数中增加对数据处理的功能:

if (( HAL_GetTick()-tickend )>5000)
        {
            tickend = HAL_GetTick();
            HAL_UART_Transmit_IT(rxtx_it_usart.huart,send_data,sizeof(send_data)-1);
        }
        //发送成功一次,就发送send done
        if(rxtx_it_usart.tx_count>0)
        {
            rxtx_it_usart.tx_count --;
            printf("send done\r\n");
        }
        
        if(rxtx_it_usart.rx_flage == 1)
        {
            rxtx_it_usart.rx_flage = 0;
            //回显接收到的数据
            printf("\r\nrcv done:\r\n");
            printf("%s\r\n", rxtx_it_usart.rx_buf);
            //重新开始接收20个字节数据
            memset(rxtx_it_usart.rx_buf,0,sizeof(rxtx_it_usart.rx_buf));
            HAL_UART_Receive_IT(rxtx_it_usart.huart,rxtx_it_usart.rx_buf,RXBUFFSIZE);
        }

 

下载后的效果如下:

image.png  

此帖出自RF/无线论坛

回复

1605

帖子

1

资源

版主

不定长数据接收感觉还是感觉串口空闲中断加DMA最理想

此帖出自RF/无线论坛

点评

DMA还没有弄好,按理来讲有dma还是优秀一些,一下子摸不透呀。  详情 回复 发表于 2023-1-13 10:44

回复

2873

帖子

3

资源

版主

秦天qintian0303 发表于 2023-1-13 09:07 不定长数据接收感觉还是感觉串口空闲中断加DMA最理想

DMA还没有弄好,按理来讲有dma还是优秀一些,一下子摸不透呀。

此帖出自RF/无线论坛

回复

1145

帖子

1

资源

纯净的硅(高级)

不错,有时间也试试。

此帖出自RF/无线论坛

点评

老师,你弄这个是小马菜了,有时间写点例程我学习学习。  详情 回复 发表于 2023-1-16 22:46

回复

2873

帖子

3

资源

版主

jinglixixi 发表于 2023-1-16 11:48 不错,有时间也试试。

老师,你弄这个是小马菜了,有时间写点例程我学习学习。

此帖出自RF/无线论坛

点评

中断的我真的还没弄到,毕竟有许多事要做,有现成的要省时间。  详情 回复 发表于 2023-1-17 12:34

回复

1145

帖子

1

资源

纯净的硅(高级)

lugl4313820 发表于 2023-1-16 22:46 老师,你弄这个是小马菜了,有时间写点例程我学习学习。

中断的我真的还没弄到,毕竟有许多事要做,有现成的要省时间。

此帖出自RF/无线论坛

回复
您需要登录后才可以回帖 登录 | 注册

相关帖子
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
推荐帖子
[与春天约会]一个棒棒糖引发的战争

春暖花开的日子,也是逛公园的好时机! 前几天,我跟爸爸、妈妈,还有姑姑、姐姐一起去逛公园了! 春天里的公园真是好玩啊,绿 ...

【FPGA开源教程连载】第十一章 串口发送模块设计与验证

串口发送模块设计与验证 https://imgcache.qq.com/tencentvideo_v1/playerv3/TPout.swf?max_age=86400&v=20161117&vid=t0188lae ...

一个C++有关构造函数的问题,没想明白

本帖最后由 wsmysyn 于 2018-10-26 21:07 编辑 如题,C++高级特性不怎么经常用,一直当C来用,偶尔调用别人的C++ 类的API,{: ...

继电器走线

PCB上有继电器(G6S-2),,走线时需要特别注意什么么

D类功放中,调制器、D类功放、低通滤波三个阶段输出波形

D类功放中,调制器、D类功放、低通滤波三个阶段输出波形是怎样的

漫画科普:天线的原理

小时候家里的收音机、电视机,都带着可以灵活转动拉伸的杆子,大家一定对这个可以转来转去的杆子记忆犹新,或许也好奇的发现这个 ...

【礼品发放说明】普源精电2020新品发布会暨行业论坛

直播详情:普源精电2020新品发布会暨行业论坛 关于礼品发放 本场直播礼品由普源精电(RIGOL )根据大家在抽奖时留下的 ...

【花雕动手做】有趣好玩的音乐可视化系列小项目(13)---有机棒立柱灯

徒步的路上,在草丛里面捡到一些报废的有机棒 625364

嵌入式Qt-控制硬件:滑动条控制RGB灯

前面的几篇文章,介绍Qt例程,都是和硬件无关的,Windows平台和嵌入式平台都能运行。 本篇,来测试一下Qt界面控制 ...

关闭
站长推荐上一条 1/5 下一条

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区知春路23号集成电路设计园量子银座1305 电话:(010)82350740 邮编:100191

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2022 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表