zoukankan      html  css  js  c++  java
  • STM32CubeMX的串口配置,以及驱动代码

    1.STM32CubeMX的配置没啥子好说的,使能然后改一下波特率和字长,然后在将中断勾选,把中断等级调到1(一定要比systick的优先级垃圾!!!)

    2.驱动代码

    在生成的it.c文件中,例如用的是串口3,防止串口的ORE的bug粗现

    void USART1_IRQHandler(void)
    {
      /* USER CODE BEGIN USART1_IRQn 0 */
    	  if(__HAL_UART_GET_FLAG(&huart1, UART_FLAG_ORE)!=RESET)
         __HAL_UART_CLEAR_OREFLAG(&huart1);
      /* USER CODE END USART1_IRQn 0 */
      HAL_UART_IRQHandler(&huart1);
      /* USER CODE BEGIN USART1_IRQn 1 */
    
      /* USER CODE END USART1_IRQn 1 */
    }
    

      

    在用户文件userUtility.c中,第一个函数也是为了防止串口出ORE的bug,第二个函数用于接收

    void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart)
    {
    	  if(__HAL_UART_GET_FLAG(huart, UART_FLAG_ORE)!=RESET)
         __HAL_UART_CLEAR_OREFLAG(huart);
    }
    /*-----------------------------------------------------------*/
    
    /*-----------------------------------------------------------*/
    void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
    {
        if(huart == &huart1)
        {
          vUart1RecData();
        }
    		else if(huart == &huart4)
    		{
    			vUart4RecData();
    		}
    }
    

      

    串口的驱动文件中

    #define UARTX_RX_BUF_MAX_LEN 32
    #define UARTX_TX_BUF_MAX_LEN 32
    
    static uc prv_ucUartxRxBuf[UARTX_RX_BUF_MAX_LEN];
    static uc prv_ucUartxRxLen;
    static uc prv_ucUartxTxBuf[UARTX_TX_BUF_MAX_LEN];
    static uc prv_ucUartxTxLen;
    
    void vStartUartxRecIt(void)//初始化函数,开启串口接收中断
    {
        HAL_UART_Receive_IT(&huart1, prv_ucUartxRxBuf,1);
    }
    
    void vUartxRecData(void)
    {
        prv_ucUartxRxLen=1;
        while(HAL_UART_Receive(&huart1, &prv_ucUartxRxBuf[prv_ucUartxRxLen], 1, 2)==HAL_OK)//进入阻塞接收2ms接不到就不算在同一包数据中,就是因为这里内部用了sysytick来延时,所以要注意中断优先级
        {
            prv_ucUartxRxLen++;
            if(prv_ucUartxRxLen>=UARTX_RX_BUF_MAX_LEN)
            {
                break;
            }
        }
        controlData.ucUart1RxFlg=1;    
    }
    
    void vHandleUartxRxBuf(void)
    {
        if(controlData.ucUart1RxFlg==1)//通过一个Flg来耦合接收和处理函数,处理函数看情况放在userWhile中或者直接放在TIM6的回调函数中,多少ms执行一次,充当实时任务
        {
            //
            //Handle code
            //
        memset((uc *)&prv_ucUartxRxBuf,0,sizeof(prv_ucUartxRxBuf));
        controlData.ucUart1RxFlg=0;
        vStartUartxRecIt();
        }
    }

     3.串口发送数据的时候

    HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)

    这个函数最好用

    __disable_irq();


    __enable_irq();

    夹起来,一来是为了防止发送的时候,有中断来造成数据传输有“断包”的现象,二来是避免发送数据的时候同时接到数据

    产生ORE这种BUG

    PS;有的人看到可能会说CLEAR_LG这个宏函数,要求输入的参数和GET_ERROR返回的值,参数类型不一样,但其实看一下底层的宏定义会发现,

    就tm是同一个玩意儿

  • 相关阅读:
    Shell脚本sed命令
    Shell脚本常用unix命令
    Shell的case语句
    3.5.2 数值之间的转换
    3.5.1 数学函数与常量
    3.5 运算符
    3.4.2 常量
    3.4.1 变量初始化
    3.4 变量
    Python异常捕捉的一个小问题
  • 原文地址:https://www.cnblogs.com/ma77045728/p/8422780.html
Copyright © 2011-2022 走看看