STM32G031无线温湿度仪开源项目 -5,系统EVENT及串口接收

关键词:CubeMX,CubeIDE,STM32G031C8T6,AHT10,DRF1609H

1,系统EVENT的实现

本项目是一个简单的系统,在这个项目中,我们采用了一种Timer3中断计时,时间到了以后,置位EVENT标志,然后再在主程序执行的方案。

while(1)
{
		if( newEVENT_id & EVENT_1)
		{
			newEVENT_id = newEVENT_id & (~EVENT_1);

			newEventStart(EVENT_1,  2000);
		}

      	if( newEVENT_id & EVENT_2)
		{
			newEVENT_id = newEVENT_id & (~EVENT_2);

			newEventStart(EVENT_2,  3000);
		}
}
//-------------------------------------------------
void  newEventStart(uint32_t   inputID,  uint16_t  endTime)
{
      switch(inputID)
      {
           case EVENT_1:
        	   EVENT_1_start=1;
        	   EVENT_1_count=0;
        	   EVENT_1_endTime = endTime;
           break;

           case EVENT_2:
               EVENT_2_start=1;
               EVENT_2_count=0;
               EVENT_2_endTime = endTime;
           break;
       }
 }

EVENT的计时,放在Timer3的中断里面:
到了EndTime以后,则置位EVENT标志

/* USER CODE BEGIN 1 */
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
    if (htim->Instance == htim3.Instance)   //---Timer3 中断入口 ---------
    {
    	newEventCount();
    }
}
//------------------------------------------------
void  newEventCount()
{
   if(EVENT_1_start)
   {
	   EVENT_1_count++;
	   if(EVENT_1_count >= EVENT_1_endTime)
	   {
		   EVENT_1_start = 0;
		   EVENT_1_count =0;
		   newEVENT_id = newEVENT_id | EVENT_1;
	   }
   }

   if(EVENT_2_start)
   {
   	   EVENT_2_count++;
   	   if(EVENT_2_count >= EVENT_2_endTime)
   	   {
   		   EVENT_2_start = 0;
   		   EVENT_2_count =0;
   		   newEVENT_id = newEVENT_id | EVENT_2;
   	   }
   }
}

这样的话,我们开启一个EVENT,来指示系统是否正常运行,就很简单了,下面的简单代码就实现了:

		//--LED1 Indicate the system running-------
		if( newEVENT_id & EVENT_1)
		{
			newEVENT_id = newEVENT_id & (~EVENT_1);

			LED1_status = LED_FLASH_oneTime;
			LED1_FLASH_count=0;

			newEventStart(EVENT_1,  2000);
		}

2,串口的接收

串口接收按以下思路进行:
1,打开串口接收中断,每接收到一个字节即中断一次;
2,在中断里,把收到的字节移入接收数组里,同时启动一个EVENT,如果不断的有新的字节收到,即不断进入中断,即不断重新启动EVENT;
3,当没有新的数据进来的时候,EVENT会不断计数到终止;
4,EVENT计数到终止的时候,会置位串口收到数据的标志;
5,在主程序里面处理收到的数据;
这样串口接收的好处,不需要知道来的数据是否有特殊标志、是否有特殊长度,它实际上是判断如果6MS没有新的数据,即表示当前数据接收完毕。

HAL_UART_Receive_IT(&huart1, aRxBuffer1, 1);          // Enable the USART1 Interrupt
//------------------------
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
   //----UART1收到1个字节后 中断后来到这里----------
   if(huart->Instance == huart1.Instance )
   {
	   UART1_received =1;   //--设置UART1收到数据的标志
	   UART1_receiveData[UART1_receive_len] = aRxBuffer1[0];  //--把数据放在UART1接收数据的数组里
	   UART1_receive_len++;
	   if ( UART1_receive_len >= UART1_receiveBufLen)
	   {
		   UART1_receive_len=0;
	   }
	   UART1_receive_count=0;  //--清零收到数据的计数,该计数在TIMER3中断里面累加,如果累加到6,则认为这次串口接收数据结束
   }
}
/* USER CODE BEGIN 1 */
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
    if (htim->Instance == htim3.Instance)   //---Timer3 中断入口 ---------
    {
    	LED1_FLASH();
    	LED2_FLASH();

    	newEventCount();

    	HAL_UART_ReceivedCount();

    	//HAL_I2C_ReceivedCount();
    }
}
//-------------------------------
void HAL_UART_ReceivedCount()
{
    //---如果UART1收到了数据,则计数累加,到6表明UART1串口接收结束------
    if ( UART1_received )
	{
		UART1_receive_count++;
		if (UART1_receive_count >= 6)   //---Default is 6
		{
			EVENT_DO_UART = EVENT_DO_UART | EVENT_uart1_Received;
			UART1_received=0;
			UART1_receive_count=0;
		}
	}
}
		//----UART1 Received Data Completed-----------------------------------
		if(EVENT_DO_UART & EVENT_uart1_Received)
		{
		   EVENT_DO_UART = EVENT_DO_UART & (~EVENT_uart1_Received);
		   dtk_uart1receivedData(UART1_receiveData, UART1_receive_len);

		   UART1_receive_len=0;
		}
发布了8 篇原创文章 · 获赞 7 · 访问量 557

猜你喜欢

转载自blog.csdn.net/yihua2009/article/details/104295192