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是同一个玩意儿

  • 相关阅读:
    grunt in webstorm
    10+ Best Responsive HTML5 AngularJS Templates
    响应式布局
    responsive grid
    responsive layout
    js event bubble and capturing
    Understanding Service Types
    To add private variable to this Javascript literal object
    Centering HTML elements larger than their parents
    java5 新特性
  • 原文地址:https://www.cnblogs.com/ma77045728/p/8422780.html
Copyright © 2011-2022 走看看