[STM32F1] 模拟串口设计

[复制链接]
 楼主| jkl21 发表于 2024-9-22 17:33 | 显示全部楼层 |阅读模式


  1. #include "UartSet.h"
  2. #include "string.h"

  3. typedef enum
  4. {
  5.     TimeRecvStartStep1 = 0,
  6.     TimeRecvStep2 = 1,
  7.     TimeRecvStep3 = 2,
  8.     TimeRecvStep1 = 3,
  9.     TimeSendStep = 4,

  10. } TimeStep;

  11. uint16_t TimeSet[5];

  12. uint16_t TimeSetBuff[][5] = {{1199, 59, 59, 2378, 2498 }, //1200
  13.     {539, 59, 59, 1128, 1247 },  //2400
  14.     {239, 59, 59, 503, 624  },   //4800
  15.     {149, 29, 29, 251, 311  },   //9600
  16.     {0, 0, 0, 0, 0    },         //预留
  17. };

  18. UART gsUARTBuff;                //定义串口

  19. uint8_t ucRecvData = 0;         //每次接收的字节
  20. uint8_t ucAcquCx = 0;           //三次滤波计数
  21. uint8_t ucRecvBitCx = 0;        //接收位计数
  22. uint8_t ucSendBitCx = 0;        //发送位计数
  23. uint8_t ucSendLengCx = 0;       //发送长度计数

  24. uint8_t ucRecvBitBuff = 0;       //采集位保存


  25. TIM_HandleTypeDef htim6;

  26. void MX_TIM6_Init(void)
  27. {

  28.     __HAL_RCC_TIM6_CLK_ENABLE();

  29.     htim6.Instance = TIM6;
  30.     htim6.Init.Prescaler = 15;
  31.     htim6.Init.CounterMode = TIM_COUNTERMODE_UP;
  32.     htim6.Init.Period = TimeSet[TimeRecvStartStep1];
  33.     htim6.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE;

  34.     HAL_NVIC_SetPriority(TIM6_IRQn, 0, 0);
  35.     HAL_NVIC_EnableIRQ(TIM6_IRQn);

  36.     HAL_TIM_Base_Init(&htim6);

  37. }


  38. void UART_GPIO_Init(void)
  39. {
  40.     GPIO_InitTypeDef GPIO_InitStruct = {0};

  41.     __HAL_RCC_GPIOB_CLK_ENABLE();

  42.     GPIO_InitStruct.Pin = COM_TX_Pin;
  43.     GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  44.     GPIO_InitStruct.Pull = GPIO_PULLUP;
  45.     GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  46.     HAL_GPIO_Init(COM_TX_GPIO_Port, &GPIO_InitStruct);

  47.     GPIO_InitStruct.Pin = COM_RX_Pin;
  48.     GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING;
  49.     GPIO_InitStruct.Pull = GPIO_PULLUP;
  50.     HAL_GPIO_Init(COM_RX_GPIO_Port, &GPIO_InitStruct);

  51.     HAL_NVIC_SetPriority(EXTI4_15_IRQn, 0, 0);
  52.     HAL_NVIC_EnableIRQ(EXTI4_15_IRQn);

  53. }


  54. /*******************************************************************************
  55. * @FunctionName   : UART_Init.
  56. * [url=home.php?mod=space&uid=1841158]@description[/url]    : 模拟串口结构体初始化.
  57. * [url=home.php?mod=space&uid=108799]@Input[/url]          : None.
  58. * [url=home.php?mod=space&uid=327807]@output[/url]         : None.
  59. * [url=home.php?mod=space&uid=266161]@return[/url]         : None.
  60. * @Author&Data    : MrShuCai  2019.4.11.
  61. *******************************************************************************/
  62. void UART_Init(void)
  63. {
  64.     gsUARTBuff.CheckType = NONE;
  65.     gsUARTBuff.UartMaxLength = Uartlength;
  66.     gsUARTBuff.UartStat = COM_NONE_BIT_DEAL;
  67.     UART_GPIO_Init();

  68.     if(BaudRate == 1200)
  69.     {
  70.         memcpy(TimeSet, &TimeSetBuff[0][0], sizeof(TimeSet));
  71.     }
  72.     else if(BaudRate == 2400)
  73.     {
  74.         memcpy(TimeSet, &TimeSetBuff[1][0], sizeof(TimeSet));
  75.     }
  76.     else if(BaudRate == 4800)
  77.     {
  78.         memcpy(TimeSet, &TimeSetBuff[2][0], sizeof(TimeSet));
  79.     }
  80.     else if(BaudRate == 9600)
  81.     {
  82.         memcpy(TimeSet, &TimeSetBuff[3][0], sizeof(TimeSet));
  83.     }
  84.     else
  85.     {

  86.     }

  87.     MX_TIM6_Init();
  88. }


  89. /*******************************************************************************
  90. * @FunctionName   : UART_Send_Data.
  91. * @Description    : 模拟串口发送数据接口.
  92. * @Input          : None.
  93. * @Output         : None.
  94. * @Return         : None.
  95. * @Author&Data    : MrShuCai  2019.4.11.
  96. *******************************************************************************/
  97. void UART_Send_Data(uint8_t * data, uint8_t size)
  98. {
  99.     gsUARTBuff.Sendlength = size;
  100.     memcpy(gsUARTBuff.UART_Send_buf, data, size);
  101.    
  102.       if(gsUARTBuff.UartStat == COM_NONE_BIT_DEAL)
  103.         {
  104.             gsUARTBuff.TxEn = 1;
  105.             gsUARTBuff.RxEn = 0;
  106.             gsUARTBuff.UartStat = COM_START_BIT_DEAL;

  107.             TIM6->ARR = TimeSet[TimeSendStep];
  108.             TIM6->EGR = TIM_EGR_UG;

  109.             HAL_TIM_Base_Start_IT(&htim6);
  110.         }
  111.       
  112. }


  113. /*******************************************************************************
  114. * @FunctionName   : EXTI4_15_IRQHandler.
  115. * @Description    : 接收引脚外部中断,下降沿触发,触发后即进入起始位判断.
  116. * @Input          : None.
  117. * @Output         : None.
  118. * @Return         : None.
  119. * @Author&Data    : MrShuCai  2019.4.11.
  120. *******************************************************************************/
  121. void EXTI4_15_IRQHandler(void)
  122. {
  123.     if(__HAL_GPIO_EXTI_GET_IT(GPIO_PIN_4) != RESET)
  124.     {
  125.         __HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_4);

  126.         if(gsUARTBuff.UartStat == COM_NONE_BIT_DEAL)
  127.         {
  128.             gsUARTBuff.RxEn = 1;
  129.             ucRecvData = 0;
  130.             gsUARTBuff.UartStat = COM_START_BIT_DEAL;

  131.             TIM6->ARR = TimeSet[TimeRecvStartStep1];
  132.             TIM6->EGR = TIM_EGR_UG;                  //初始化定时器
  133.                       EXTI->IMR &= ~(0x10);
  134.                       EXTI->EMR &= ~(0x10);
  135.             HAL_TIM_Base_Start_IT(&htim6);
  136.         }
  137.     }

  138. }


  139. /*******************************************************************************
  140. * @FunctionName   : BitValueChk.
  141. * @Description    : 判断采集bit值,三次中为1的次数大于等于2则值为1否则为0.
  142. * @Input          : n 采集记录的位值.
  143. * @Output         : BitValue.
  144. * @Return         : BitValue.
  145. * @Author&Data    : MrShuCai  2019.5.1.
  146. *******************************************************************************/
  147. uint8_t BitValueChk(uint8_t n)
  148. {
  149.     uint8_t BitValCx = 0;

  150.     for(BitValCx = 0; n; n >>= 1)
  151.     {
  152.         BitValCx += n & 0x01;
  153.     }

  154.     return (BitValCx < 2) ? (0) : (1);

  155. }

  156. /*******************************************************************************
  157. * @FunctionName   : TIM6_IRQHandler.
  158. * @Description    : 中断处理函数,包括发送和接收两部分.
  159. * @Input          : None.
  160. * @Output         : None.
  161. * @Return         : None.
  162. * @Author&Data    : MrShuCai  2019.4.11.
  163. *******************************************************************************/
  164. void TIM6_IRQHandler(void)
  165. {

  166.     HAL_TIM_IRQHandler(&htim6);

  167.     if(gsUARTBuff.TxEn == 1)         /*数据发送,发送优先,无发送后才进入接收状态*/
  168.     {
  169.         switch(gsUARTBuff.UartStat)  /*串口发送位状态判断*/
  170.         {
  171.         case COM_START_BIT_DEAL :
  172.         {
  173.             HAL_GPIO_WritePin(COM_TX_GPIO_Port, COM_TX_Pin, GPIO_PIN_RESET);
  174.             gsUARTBuff.UartStat = COM_DATA_BIT_DEAL;
  175.             ucSendBitCx = 0;
  176.         }
  177.         break;

  178.         case COM_DATA_BIT_DEAL :
  179.         {
  180.             HAL_GPIO_WritePin(COM_TX_GPIO_Port, COM_TX_Pin, (GPIO_PinState)((gsUARTBuff.UART_Send_buf[ucSendLengCx] >> ucSendBitCx) & 0x01));

  181.             ucSendBitCx ++;

  182.             if(ucSendBitCx >= 8)
  183.             {
  184.                 if(gsUARTBuff.CheckType == NONE)
  185.                 {
  186.                     gsUARTBuff.UartStat = COM_STOP_BIT_DEAL;
  187.                 }
  188.                 else
  189.                 {
  190.                     gsUARTBuff.UartStat = COM_CHECK_BIT_DEAL;
  191.                 }
  192.             }

  193.         }
  194.         break;

  195.         case COM_CHECK_BIT_DEAL :
  196.         {

  197.         }
  198.         break;

  199.         case COM_STOP_BIT_DEAL :
  200.         {
  201.             HAL_GPIO_WritePin(COM_TX_GPIO_Port, COM_TX_Pin, GPIO_PIN_SET);

  202.             ucSendBitCx = 0;

  203.             if(ucSendLengCx < gsUARTBuff.Sendlength - 1)
  204.             {
  205.                 gsUARTBuff.UartStat = COM_START_BIT_DEAL;
  206.                 ucSendLengCx ++;
  207.             }
  208.             else
  209.             {
  210.                 ucSendLengCx = 0;
  211.                 gsUARTBuff.UartStat = COM_NONE_BIT_DEAL;
  212.                 gsUARTBuff.TxEn = 0;
  213.                 gsUARTBuff.RxEn = 1;
  214.                 HAL_TIM_Base_Stop_IT(&htim6);
  215.                               EXTI->IMR |= 0x10;
  216.                           EXTI->EMR |= 0x10;
  217.                 TIM6 ->CNT = 0;
  218.             }

  219.         }
  220.         break;

  221.         default:
  222.             break;

  223.         }
  224.     }


  225.     if(gsUARTBuff.RxEn == 1)
  226.     {
  227.         switch(gsUARTBuff.UartStat)
  228.         {
  229.                     case COM_START_BIT_DEAL :
  230.                     {
  231.                             ucRecvBitBuff = (ucRecvBitBuff << 1) | (HAL_GPIO_ReadPin(COM_RX_GPIO_Port, COM_RX_Pin) & 0x01);

  232.                             if(++ ucAcquCx >= 3)
  233.                             {
  234.                                     if(BitValueChk(ucRecvBitBuff) == 0)                        
  235.                                     {
  236.                                             gsUARTBuff.UartStat = COM_DATA_BIT_DEAL;
  237.                                             TIM6->ARR = TimeSet[ucAcquCx];
  238.                                     }
  239.                                     else
  240.                                     {
  241.                                             gsUARTBuff.UartStat = COM_STOP_BIT_DEAL;
  242.                                     }
  243.                                     
  244.                                     ucRecvBitBuff = 0;
  245.                                     ucAcquCx = 0;
  246.                             }
  247.                             else
  248.                             {
  249.                                     TIM6->ARR = TimeSet[ucAcquCx];
  250.                             }


  251.                     }
  252.                     break;

  253.                     case COM_DATA_BIT_DEAL :                         //数据位
  254.                     {

  255.                             ucRecvBitBuff = (ucRecvBitBuff << 1) | (HAL_GPIO_ReadPin(COM_RX_GPIO_Port, COM_RX_Pin) & 0x01);

  256.                             if(++ ucAcquCx >= 3)
  257.                             {
  258.                                     ucRecvData |= (BitValueChk(ucRecvBitBuff) & 0x01) << ucRecvBitCx;

  259.                                     if(ucRecvBitCx >= 7)
  260.                                     {
  261.                                             ucRecvBitCx = 0;

  262.                                             if(gsUARTBuff.CheckType == NONE)
  263.                                             {
  264.                                                     gsUARTBuff.UartStat = COM_STOP_BIT_DEAL;
  265.                                             }
  266.                                             else
  267.                                             {
  268.                                                     gsUARTBuff.UartStat = COM_CHECK_BIT_DEAL;
  269.                                             }
  270.                                     }
  271.                                     else
  272.                                     {
  273.                                             ucRecvBitCx ++;
  274.                                     }

  275.                                     TIM6->ARR = TimeSet[ucAcquCx];

  276.                                     ucAcquCx = 0;
  277.                                     ucRecvBitBuff = 0;
  278.                             }
  279.                             else
  280.                             {
  281.                                     TIM6->ARR = TimeSet[ucAcquCx];
  282.                             }
  283.                     }
  284.                     break;

  285.                     case COM_CHECK_BIT_DEAL :                         //校验位
  286.                     {

  287.                     }
  288.                     break;

  289.                     case COM_STOP_BIT_DEAL :                         //停止位
  290.                     {

  291.                         ucRecvBitBuff = (ucRecvBitBuff << 1) | (HAL_GPIO_ReadPin(COM_RX_GPIO_Port, COM_RX_Pin) & 0x01);

  292.                             if( ++ ucAcquCx >= 3)
  293.                             {
  294.                                     if(BitValueChk(ucRecvBitBuff) == 1)   
  295.                                     {
  296.                                             if(gsUARTBuff.Recvlength < gsUARTBuff.UartMaxLength)
  297.                                             {
  298.                                                     gsUARTBuff.UART_Recv_buf[gsUARTBuff.Recvlength] = ucRecvData;
  299.                                                     gsUARTBuff.Recvlength ++;
  300.                                             }

  301.                                             gsUARTBuff.UartStat = COM_NONE_BIT_DEAL;
  302.                                             HAL_TIM_Base_Stop_IT(&htim6);
  303.                                             
  304.                                             EXTI->IMR |= 0x10;
  305.                                             EXTI->EMR |= 0x10;
  306.                                             TIM6->CNT = 0;
  307.                                     }
  308.                                     else
  309.                                     {
  310.                                             ucAcquCx = 0;
  311.                                     }
  312.                                     
  313.                                     ucRecvBitBuff = 0;
  314.                                     ucAcquCx = 0;
  315.                             }
  316.                             else
  317.                             {
  318.                                     TIM6->ARR = TimeSet[ucAcquCx];
  319.                             }
  320.                     }
  321.                     break;

  322.                     default:
  323.                             break;
  324.                     }
  325.     }
  326. }


qsrg51 发表于 2024-9-29 23:25 来自手机 | 显示全部楼层
mod=space&uid=1841158]@description[/url]    : 模拟串口结构体初始化
您需要登录后才可以回帖 登录 | 注册

本版积分规则

40

主题

3652

帖子

2

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

40

主题

3652

帖子

2

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