关于HKF32030M串口接收导致死机得问题(是否为底层配置错误而导致)

[复制链接]
 楼主| 永远的三爷 发表于 2021-5-24 15:16 | 显示全部楼层 |阅读模式
串口配置如下:
  1. /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

  2.                                                          Í·Îļþ¶¨ÒåÇøÓò                                                                       

  3. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
  4. #include "hk32f030m.h"
  5. #include "my_struct.h"
  6. /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

  7.                                                          ½Ó¿Ú¶¨ÒåÇø                                                                               

  8. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/

  9. #define  USART1_TX_PORT         GPIOA
  10. #define  USART1_TX_PIN          GPIO_Pin_3
  11. #define  USART1_TX_IO_CLK_EN()  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE)
  12.        
  13. #define  USART1_RX_PORT         GPIOD
  14. #define  USART1_RX_PIN          GPIO_Pin_6
  15. #define  USART1_RX_IO_CLK_EN()  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOD, ENABLE)

  16. /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  17.                                                          ±äÁ¿¶¨ÒåÇø                                                                       

  18. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/              
  19. unsigned char   Rcv_data[31];//½ÓÊÕÊý×é
  20. unsigned char   Rcv_flag=0;//½ÓÊÕ±êÖ¾
  21. unsigned char   Cnt_cart=0;//½ÓÊÕÊý¾Ý³¤¶È

  22. /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  23.                                                          º¯Êý¶¨ÒåÇø                                                                               

  24. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/


  25. /**************************************************************************************************
  26. * [url=home.php?mod=space&uid=288409]@file[/url]      usart_async_tx_no_int_rx_rxneint.c
  27. * [url=home.php?mod=space&uid=247401]@brief[/url]     Òì²½´®¿ÚͨÐÅÀý³Ì, ͨ¹ý²éѯTXE±êÖ¾·¢ËÍÊý¾Ý,ͨ¹ýRXNEÖжϽÓÊÕÊý¾Ý,µ±ÖжϽÓÊÕµ½Êý¾Ýºó»á½«
  28. *            ÊÕµ½µÄÊý¾ÝÔ­Ñùͨ¹ýTXÒý½Å·¢ËͳöÈ¥
  29. * [url=home.php?mod=space&uid=187600]@author[/url]    veiko.c
  30. * [url=home.php?mod=space&uid=212281]@date[/url]      20200202
  31. **************************************************************************************************/
  32. static void USART_NVIC_Configurature(void)
  33. {
  34.         NVIC_SetPriority(USART1_IRQn,0);
  35.         NVIC_EnableIRQ(USART1_IRQn);
  36. }
  37. static void USART_GPIO_Configurature(void)
  38. {
  39.         GPIO_InitTypeDef m_gpio;
  40.        
  41.         USART1_TX_IO_CLK_EN();
  42.         USART1_RX_IO_CLK_EN();
  43.        
  44.         m_gpio.GPIO_Mode = GPIO_Mode_AF;
  45.         m_gpio.GPIO_OType = GPIO_OType_PP;
  46.         m_gpio.GPIO_Pin = USART1_TX_PIN;
  47.         m_gpio.GPIO_PuPd = GPIO_PuPd_NOPULL;
  48.         m_gpio.GPIO_Speed = GPIO_Speed_10MHz;
  49.         GPIO_Init(USART1_TX_PORT, &m_gpio);
  50.         GPIO_PinAFConfig(USART1_TX_PORT,GPIO_PinSource3,GPIO_AF_1);
  51.        
  52.         m_gpio.GPIO_Pin = USART1_RX_PIN;
  53.         GPIO_Init(USART1_RX_PORT, &m_gpio);
  54.         GPIO_PinAFConfig(USART1_RX_PORT,GPIO_PinSource6,GPIO_AF_1);
  55. }
  56. void USART_Configurature(void)
  57. {
  58. //        USART_InitTypeDef USART_InitStructure;
  59. //        USART_GPIO_Configurature();//IO¿ÚÅäÖÃ
  60. //        // USART1  ÅäÖÃ
  61. //        RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);//¿ªÆôURATʱÍâÉèʱÖÓ
  62. //        USART_InitStructure.USART_BaudRate = 9696;
  63. //        USART_InitStructure.USART_WordLength = USART_WordLength_8b;//8λÊý¾Ýλ
  64. //        USART_InitStructure.USART_StopBits = USART_StopBits_1;//1λֹͣλ
  65. //        USART_InitStructure.USART_Parity = USART_Parity_No;//ÎÞÆæÅ¼Ð£Ñé
  66. //        USART_InitStructure.USART_Mode = USART_Mode_Rx;//RXģʽ
  67. //        USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//½ûÓÃÁ÷Á¿Ó²¼þ¿ØÖÆ
  68. //        USART_Init(USART1, &USART_InitStructure);
  69. //  USART_SWAPPinCmd(USART1, ENABLE);// ²»»¥»»TXºÍRXÒý½Å
  70. ////        USART_Cmd(USART1, DISABLE);// ʹÄÜ USART
  71. //  USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//´®¿Ú½ÓÊÕÍê³ÉÖжÏ
  72. //         // Enable the USARTy Interrupt
  73. //        USART_NVIC_Configurature();//ÆôÓÃUSARTyÖжÏ
  74.         USART_InitTypeDef m_usart;
  75.        
  76.         USART_GPIO_Configurature();
  77.        
  78.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
  79.         m_usart.USART_BaudRate = 9600;
  80.         m_usart.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  81.         m_usart.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
  82.         m_usart.USART_Parity = USART_Parity_No;
  83.         m_usart.USART_StopBits = USART_StopBits_1;
  84.         m_usart.USART_WordLength = USART_WordLength_8b;
  85.         USART_Init(USART1, &m_usart);
  86.         USART_Cmd(USART1, ENABLE);
  87.        
  88.         USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
  89.        
  90.         USART_NVIC_Configurature();

  91. }
  92. //´®¿ÚÔËÐк¯Êý
  93. //¹¦ÄÜ ½âÎöÄæ±äÆ÷´®¿ÚЭÒé
  94. //²ÎÊý void
  95. //·µ»Ø void
  96. //µ÷¶ÈÖÜÆÚ 250ms
  97. void uart_Run(void)//Êý¾Ý´¦Àíº¯Êý
  98. {
  99.   static unsigned int /*last_Voltage_state=0,*/last_Electricity_state=0;/*last_Byte_state=0,last_model_state=0*/;
  100.   unsigned int temp1=0,temp2=0;
  101.   unsigned long temp3=0;  
  102.   if(Rcv_flag==1)
  103.   {
  104.      ERR_TIME++;
  105.      Rcv_flag = 0;
  106.                  Cnt_cart = 0;
  107.      if((Rcv_data[0]==0xF0)    //Êý¾ÝÍ·
  108.          &&(Rcv_data[30]==0xFA) //Êý¾Ýβ
  109.          &&(Rcv_data[1]==28))    //ÓÐЧ³¤¶È
  110.      {  
  111. //¹ÊÕÏÊý¾Ý»ñÈ¡
  112. //err¹ÊÕÏ 0 2 4 6 8 10
  113.      err = Rcv_data[6];//´íÎ󱨾¯
  114. //·¢µç»úÐͺŠ  model
  115. // ·¢µç»úµçѹ  Voltage
  116. // ·¢µç»úµçÁ÷  Electricity
  117.      temp1 = Rcv_data[7];//״̬Âë
  118.      model = temp1&0X38;//µçѹ״̬
  119. /**************************³ÌÐòÂë»ñÈ¡****************************/
  120.      temp2 = Rcv_data[8]+((unsigned int)Rcv_data[9]<<8); //³ÌÐòÂëµÍËÄλÓë×óÒÆ°ËλÊý¾Ý½øÐкϲ¢
  121.      CXM =  temp2 ; //³ÌÐòÂë
  122. /**************************µçÁ÷»ñÈ¡********************************/
  123.      temp3 = Rcv_data[22]+((unsigned int)Rcv_data[23]<<8);//µçѹµÍËÄλÓë×óÒÆ°ËλÊý¾Ý½øÐкϲ¢
  124.      Electricity = Rcv_data[24]+((unsigned int)Rcv_data[25]<<8);//µçÁ÷µÍËÄλÓë×óÒÆ°ËλÊý¾Ý½øÐкϲ¢
  125. // ·¢µç»úƵÂÊ»ñÈ¡  Frequency
  126.      if((temp1&0X04)==0x04)  
  127.      {
  128.         Frequency =600;//60HZ
  129.      }else
  130.      {
  131.         Frequency = 500;//50HZ
  132.      }  
  133. /*********************230vÄæ±äÆ÷ϵÁÐ*****************************************************/  
  134.      if(model==24)//230v  011
  135.      {
  136. //µçѹ¼ÆËã
  137.       Voltage = temp3*10/333;//µçѹ»ñÈ¡´¦Àí   
  138. //½ÓÊÕÂ˲¨´¦Àí²¿·Ö
  139. /*  if((Electricity>1020||Rcv_data[1]!=28)&&last_Voltage_state !=0)//ÅжÏÒ»Ö¡Êý¾ÝÓÐЧÐÔ
  140.     {
  141.       Voltage =  last_Voltage_state;
  142.       Electricity =  last_Electricity_state;
  143.       Rcv_data[1] = last_Byte_state;
  144.       model = last_model_state;
  145.     }//¸üÐÂÉϴμǼ
  146.      last_Voltage_state =  Voltage;
  147.      last_Electricity_state = Electricity;
  148.      last_Byte_state =  Rcv_data[1];
  149.      last_model_state = model;*/
  150.     }

  151. /*********************120vÄæ±äÆ÷ϵÁÐ*****************************************************/  
  152.       if(model==8&&temp2!=33657)//120v
  153.      {
  154. //µçѹ¼ÆËã
  155.       Voltage = temp3*10/600;//µçѹ»ñÈ¡´¦Àí  
  156. //½ÓÊÕÂ˲¨³·À벿·Ö
  157.   /*  if((Electricity>1020||Rcv_data[1]!=28)&&last_Voltage_state !=0)//ÅжÏÒ»Ö¡Êý¾ÝÓÐЧÐÔ
  158.     {
  159.      Voltage =  last_Voltage_state;
  160.      Electricity =  last_Electricity_state;
  161.      Rcv_data[1] = last_Byte_state;
  162.      model = last_model_state;
  163.     }//¸üÐÂÉϴμǼ
  164.     last_Voltage_state =  Voltage;
  165.     last_Electricity_state = Electricity;
  166.     last_Byte_state =  Rcv_data[1];
  167.     last_model_state = model;*/
  168.     }
  169.   /*********************100vÄæ±äÆ÷*****************************************************/  
  170.       if(model==0&&temp2==5823)//120v
  171.      {
  172. //µçѹ¼ÆËã
  173.       Voltage = temp3*10/615;//µçѹ»ñÈ¡´¦Àí   
  174. //½ÓÊÕÂ˲¨´¦Àí²¿·Ö
  175.   /*  if((Electricity>950||Rcv_data[1]!=28)&&last_Voltage_state !=0)//ÅжÏÒ»Ö¡Êý¾ÝÓÐЧÐÔ
  176.      Voltage =  last_Voltage_state;
  177.      Electricity =  last_Electricity_state;
  178.      Rcv_data[1] = last_Byte_state;
  179.      model = last_model_state;
  180.     }//¸üÐÂÉϴμǼ
  181.     last_Voltage_state =  Voltage;
  182.     last_Electricity_state = Electricity;
  183.     last_Byte_state =  Rcv_data[1];
  184.     last_model_state = model;*/
  185.     }
  186. /*********************3.5KW/120vÄæ±äÆ÷*****************************************************/
  187.      if(model==8 && temp2 == 33657)//120v
  188.      {
  189. //µçѹ¼ÆËã
  190.       Voltage = temp3*10/630;//µçѹ»ñÈ¡´¦Àí  
  191. //½ÓÊÕÂ˲¨´¦Àí²¿·Ö
  192. /*   if((Electricity>1020||Rcv_data[1]!=28)&&last_Voltage_state !=0)//ÅжÏÒ»Ö¡Êý¾ÝÓÐЧÐÔ
  193.     {
  194.      Voltage =  last_Voltage_state;
  195.      Electricity =  last_Electricity_state;
  196.      Rcv_data[1] = last_Byte_state;
  197.      model = last_model_state;
  198.     }//¸üÐÂÉϴμǼ
  199.     last_Voltage_state =  Voltage;
  200.     last_Electricity_state = Electricity;
  201.     last_Byte_state =  Rcv_data[1];
  202.     last_model_state = model;*/
  203.     }
  204. /*ͨÐÅʱ´æÔÚÊý¾Ý²¨¶¯£¬Í¨¹ýÏÞÖÆÄ³Ò»¶Îʱ¼äÄÚÊý¾Ý·¢ÉúÍ»±ä¶Ô»ñÈ¡µÄÊý¾Ý½øÐжªÆú*/
  205.                 if(last_Electricity_state != Electricity)//ÉÏÒ»´ÎµÄµçÁ÷ÖµÓë±¾´ÎµçÁ÷Öµ²»ÏàµÈ
  206.                         {
  207.                                 ERR_TIME = 0; //¼ÆÊ±ÇåÁã
  208.                                 last_Electricity_state = Electricity;//²»¸üÐÂÉϴμǼ
  209.                         }
  210.                 if(ERR_TIME >= 5)//Á¬Ðø2.5S
  211.                         {
  212.                                 Elect = Electricity;//¸üÐÂÉϴμǼ
  213.                         }
  214.                 if(err != 0)
  215.                         {
  216.                                 Voltage = 0;
  217.                                 Elect = 0;
  218.                                 Frequency =  0;
  219.                         }
  220.                 }
  221.   }
  222. }
  223. //??????????
  224. //?? ?????????
  225. //?? void
  226. //?? void
  227. //???? 250ms
  228. void rcv_Cache(void)//??????
  229. {
  230.   static unsigned char temp0=0,temp1=0;
  231.    temp1++;//??
  232.    if(Rcv_flag==1)
  233.    {
  234.        temp0++;////??????????
  235.    }
  236.    if(temp1==10)//???????????
  237.    {   
  238.       if(err!=0)
  239.      {
  240.        Voltage = 0;//????
  241.        Electricity = 0;//????
  242.        Frequency = 0;
  243.        model = 0;
  244.      }
  245.      temp0 = 0;     //??????
  246.      temp1 = 0;  //??????
  247.    }
  248.   
  249. }
  250. void USART1_IRQHandler(void)
  251. {
  252.         if((USART1->ISR & USART_ISR_RXNE) != 0)
  253.         {
  254.                 Rcv_flag=1;//½ÓÊÕ±êÖ¾1
  255.     Rcv_data[Cnt_cart]=USART1->RDR;//½ÓÊÕµÄÊý¾Ý´æÈëÊý×é
  256.     Cnt_cart++;//¼ÆÊýÖµÀÛ¼Ó
  257.     if(Cnt_cart>31)//¼ÆÊý
  258.     {
  259.       Cnt_cart=0;
  260.     }
  261.         }
  262. }
aoyi 发表于 2021-6-7 11:14 | 显示全部楼层
请问 每一次死机的位置一样的吗?有没有什么规律性啊
gwsan 发表于 2021-6-7 11:15 | 显示全部楼层
观察一下 是只要接收数据就死机  还是接收到一定时间数据量变多的时候死机呢
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

5

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部

1

主题

5

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部