你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【经验分享】STM32G031无线温湿度仪开源项目 -5,系统EVENT及串口接收

[复制链接]
STMCU小助手 发布时间:2021-11-12 23:01
1,系统EVENT的实现
本项目是一个简单的系统,在这个项目中,我们采用了一种Timer3中断计时,时间到了以后,置位EVENT标志,然后再在主程序执行的方案。

  1. while(1)
  2. {
  3.                 if( newEVENT_id & EVENT_1)
  4.                 {
  5.                         newEVENT_id = newEVENT_id & (~EVENT_1);

  6.                         newEventStart(EVENT_1,  2000);
  7.                 }

  8.               if( newEVENT_id & EVENT_2)
  9.                 {
  10.                         newEVENT_id = newEVENT_id & (~EVENT_2);

  11.                         newEventStart(EVENT_2,  3000);
  12.                 }
  13. }
复制代码
  1. //-------------------------------------------------
  2. void  newEventStart(uint32_t   inputID,  uint16_t  endTime)
  3. {
  4.       switch(inputID)
  5.       {
  6.            case EVENT_1:
  7.                    EVENT_1_start=1;
  8.                    EVENT_1_count=0;
  9.                    EVENT_1_endTime = endTime;
  10.            break;

  11.            case EVENT_2:
  12.                EVENT_2_start=1;
  13.                EVENT_2_count=0;
  14.                EVENT_2_endTime = endTime;
  15.            break;
  16.        }
  17. }
复制代码

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

  1. /* USER CODE BEGIN 1 */
  2. void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
  3. {
  4.     if (htim->Instance == htim3.Instance)   //---Timer3 中断入口 ---------
  5.     {
  6.             newEventCount();
  7.     }
  8. }
复制代码
  1. //------------------------------------------------
  2. void  newEventCount()
  3. {
  4.    if(EVENT_1_start)
  5.    {
  6.            EVENT_1_count++;
  7.            if(EVENT_1_count >= EVENT_1_endTime)
  8.            {
  9.                    EVENT_1_start = 0;
  10.                    EVENT_1_count =0;
  11.                    newEVENT_id = newEVENT_id | EVENT_1;
  12.            }
  13.    }

  14.    if(EVENT_2_start)
  15.    {
  16.               EVENT_2_count++;
  17.               if(EVENT_2_count >= EVENT_2_endTime)
  18.               {
  19.                       EVENT_2_start = 0;
  20.                       EVENT_2_count =0;
  21.                       newEVENT_id = newEVENT_id | EVENT_2;
  22.               }
  23.    }
  24. }
复制代码
这样的话,我们开启一个EVENT,来指示系统是否正常运行,就很简单了,下面的简单代码就实现了:

  1.                 //--LED1 Indicate the system running-------
  2.                 if( newEVENT_id & EVENT_1)
  3.                 {
  4.                         newEVENT_id = newEVENT_id & (~EVENT_1);

  5.                         LED1_status = LED_FLASH_oneTime;
  6.                         LED1_FLASH_count=0;

  7.                         newEventStart(EVENT_1,  2000);
  8.                 }
复制代码

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

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

  8.             newEventCount();

  9.             HAL_UART_ReceivedCount();

  10.             //HAL_I2C_ReceivedCount();
  11.     }
  12. }
复制代码
  1. //-------------------------------
  2. void HAL_UART_ReceivedCount()
  3. {
  4.     //---如果UART1收到了数据,则计数累加,到6表明UART1串口接收结束------
  5.     if ( UART1_received )
  6.         {
  7.                 UART1_receive_count++;
  8.                 if (UART1_receive_count >= 6)   //---Default is 6
  9.                 {
  10.                         EVENT_DO_UART = EVENT_DO_UART | EVENT_uart1_Received;
  11.                         UART1_received=0;
  12.                         UART1_receive_count=0;
  13.                 }
  14.         }
  15. }
复制代码

            
  1.                //----UART1 Received Data Completed-----------------------------------
  2.                 if(EVENT_DO_UART & EVENT_uart1_Received)
  3.                 {
  4.                    EVENT_DO_UART = EVENT_DO_UART & (~EVENT_uart1_Received);
  5.                    dtk_uart1receivedData(UART1_receiveData, UART1_receive_len);

  6.                    UART1_receive_len=0;
  7.                 }
复制代码


收藏 评论0 发布时间:2021-11-12 23:01

举报

0个回答

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版