IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> STM32L051测试 (五、项目移植中遇到的实际问题) -> 正文阅读

[嵌入式]STM32L051测试 (五、项目移植中遇到的实际问题)

经过前面一段时间的测试,我们把STM32L051 的需要用到的基本功能都测试过了,这次我们得把产品替换成L051了。
基本的IO使用都没问题,数据存储EEPROM和flash也没有问题,测试过正常用就可以了
但是在串口的使用上,还是有点需要测试一下。

1、串口接收发送不定长度的数据(非DMA方式)

以前在在标准库STM32F103标准库的使用上用到的IDLE中断接收一帧数据,测试用起来确实好用

void USART2_IRQHandler(void)                	//串口2中断服务程序
	{
	u8 clear=clear;	   //消除编译器没有用到的提醒

	//USART_ClearFlag(USART2,USART_FLAG_TC);
		if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)  
		{
			USART_RX_BUF[RX_Data++] = USART2->DR;
		}
		else if(USART_GetITStatus(USART2, USART_IT_IDLE) != RESET)		  
		{
		 	clear=USART2->SR; //读SR寄存器	可以清空寄存器
        	clear=USART2->DR; //读DR寄存器(先读SR寄存器,再读DR,为了清除IDLE中断)						
	        ReceiveState=1;	  //标记接收到了一帧数据
		}
 }

不需要自己做延时处理,在某些情况下,比如通讯模块的串口3使用中,还是用到了延时处理,具体就是判断串口是否接收到一个字节的数据?如果接收到一个字节的数据,那么延时一定时间,一般是几毫秒(这个延时时间就是干等,等待这一串数据全部接收完成,所以这个时间需要实际使用中不同的测试优化,干等时间太长了不太合理,太短数据接收不完全处理起来会出错),如下:

RETURN_TYPE blue_getTelegram(TEL_RADIO_TYPE *pu8RxRadioTelegram, TEL_PARAM_TYPE *pu8TelParam)
{
//	uint8 i=0;
	uint8 u8CRC = 0;
	uint8 u8Count = 0; 
	uint8 TmpVal = 0;
	uint8 DATA_LEN = 0;
	uint8 n = 0;
	uint8 HEADER_BYTES[4];
	uint8 DatBuf[30] = {0};
	u8state = GET_SYNC_STATE;
	if (Read_pt != Enocean_Data){
		delay_ms(7);  //这里的等待就是干等!从收到第一个字节开始干等
		while (Read_pt != Enocean_Data)
		{
			TmpVal = USART_Enocean_BUF[Read_pt++];
			if(Read_pt >= 100)                        //定义缓存大小,测试时候用100直接替代
			  Read_pt = 0;
			switch(u8state)
			...

自己也使用过环形缓冲区等一些方式进行优化,可能目前的处理方式能够满足大部分功能需求,所以也没有确实的花心思正真去测试优化一个环形缓冲区的使用。

那么现在再L051下面,我们怎么来使用 IDLE 中断呢? 当然我先去网上查找了大神们的各种帖子,然后还是得自己修改一下程序,来一步一步做测试,先回到串口接收简单的测试:

if(test_data != Enocean_Data){
        HAL_Delay(7);
        // printf("Enocean_Data ID is: 0x %d  test_data is : 0x%d \r\n",Enocean_Data,test_data);
        if(Enocean_Data > 10){
          HAL_UART_Transmit(&huart1,USART_Enocean_BUF, Enocean_Data,0xFFFF); //将串口3接收到的数据通过串口1传出 
        }      
        memset(USART_Enocean_BUF, 0, sizeof(USART_Enocean_BUF));   //清空缓存区 
        Enocean_Data=0;
        // (&hlpuart1)->pRxBuffPtr = &USART_Enocean_BUF[Enocean_Data];//用下面的简洁,数组名就可以当做指针用
        (&hlpuart1)->pRxBuffPtr = USART_Enocean_BUF;//这一句很重要,没有这一句,后面接收会出错
    }
    }

在主函数初始化串口后,有这么一句,打开串口中断(这里的中断可不可以理解为打开IT中断)

 HAL_UART_Receive_IT(&hlpuart1, (uint8_t *)&USART_Enocean_BUF[0], 1);

现在我们要开启IDLE中断

 __HAL_UART_ENABLE_IT(&hlpuart1,UART_IT_IDLE);
  HAL_UART_Receive_IT(&hlpuart1, (uint8_t *)&USART_Enocean_BUF[0], 1);

在stm32l0xx_it.c中找到 LPUART1_IRQHandler函数,因为所有中断先是进入 stm32l0xx_it.c 中相应的IRQHandler函数中,调用对应函数,最后才会进入到 自己设置的 Callback函数中,我们这次测试直接在void LPUART1_IRQHandler(void)函数中系统设置的函数前写一个 实现 IDLE中断后操作的函数:

void LPUART1_IRQHandler(void)
{
  /* USER CODE BEGIN LPUART1_IRQn 0 */
  if((__HAL_UART_GET_FLAG(&hlpuart1,UART_FLAG_IDLE) != RESET))
  {
    		__HAL_UART_CLEAR_IDLEFLAG(&hlpuart1);
        ReceiveState = 1;   
  }
  /* USER CODE END LPUART1_IRQn 0 */
  HAL_UART_IRQHandler(&hlpuart1);
  /* USER CODE BEGIN LPUART1_IRQn 1 */

  /* USER CODE END LPUART1_IRQn 1 */
}

用 ReceiveState 来标志是否接受到了一串数据,然后打印函数变成

 if(ReceiveState == 1){
        ReceiveState = 0;      
        HAL_UART_Transmit(&huart1,USART_Enocean_BUF, Enocean_Data,0xFFFF); //将串口3接收到的数据通过串口1传出            
        memset(USART_Enocean_BUF, 0, sizeof(USART_Enocean_BUF));   //清空缓存区 
        Enocean_Data=0;
        (&hlpuart1)->pRxBuffPtr = USART_Enocean_BUF;//这一句很重要,没有这一句,后面接收会出错
    }

结果, 数据异常,就是收不全,结尾会有问题,明天得继续测试优化了,先上个正常的接收,这是上面用HAL_Delay(7)测试得到的正常结果。
在这里插入图片描述

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2021-08-11 12:35:13  更:2021-08-11 12:36:19 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 20:44:05-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码