查看: 333|回复: 0

[原创] STM32L476 NUCLEO 开发板使用 FreeRTOS + 串口

[复制链接]

94

主题

3

好友

1764

积分

进士

Rank: 5Rank: 5

  • TA的每日心情

    2016-11-20 10:28
  • 签到天数: 6 天

    [LV.2]偶尔看看I

    发表于 2016-9-26 17:35:28 |显示全部楼层
    QQ图片20160926171835.jpg

    1. 首先拿到板子,先跑了一下freertos系统。
    函数简单介绍下:
    // 定义一些线程的参数,优先级,堆栈之类的。
    osThreadDef(THREAD_1, LED_Thread1, osPriorityNormal, 0, configMINIMAL_STACK_SIZE);
    // 创建线程
    LEDThread1Handle = osThreadCreate(osThread(THREAD_1), NULL);
    // 阻塞线程,这个函数很有用的,可以先记住。
    osThreadSuspend(LEDThread1Handle);
    // 系统开始
    osKernelStart();
    总的来说,ST肯定在freertos源码的基础上,他们封装了一层函数。所以名字变了,本来是task,现在称呼为thread。

    2. 上面的不是关键,要说串口这个BUG。
    这个路径的例程。
    \en.stm32cubel4\STM32Cube_FW_L4_V1.5.0\Projects\STM32L476RG-Nucleo\Examples\UART\UART_TwoBoards_ComIT\Src
    为什么说这个函数,我觉得这个函数有问题,或者是我用的不对。  
    if(HAL_UART_Receive_IT(&UartHandle, (uint8_t *)aRxBuffer, RXBUFFERSIZE) != HAL_OK)
      {
        Error_Handler();
      }

    我理解是,串口接收指定长度的数据,数据接收满就会退出。但是实际测试效果不好。基本是乱码。
    串口自发自收就是这个结果了。
    2.jpg



    3. 然后看了下函数原型。风格和我以前用的不一样,估计要好好研究了。我怀疑串口接收是在中断接收的,不是这个函数。
    这个函数估计只是设置用的。
    HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
    {
      /* Check that a Rx process is not already ongoing */
      if(huart->RxState == HAL_UART_STATE_READY)
      {
        if((pData == NULL ) || (Size == 0))
        {
          return HAL_ERROR;
        }

        /* Process Locked */
        __HAL_LOCK(huart);

        huart->pRxBuffPtr = pData;
        huart->RxXferSize = Size;
        huart->RxXferCount = Size;

        /* Computation of UART mask to apply to RDR register */
        UART_MASK_COMPUTATION(huart);

        huart->ErrorCode = HAL_UART_ERROR_NONE;
        huart->RxState = HAL_UART_STATE_BUSY_RX;

        /* Process Unlocked */
        __HAL_UNLOCK(huart);

        /* Enable the UART Parity Error Interrupt */
        SET_BIT(huart->Instance->CR1, USART_CR1_PEIE);

        /* Enable the UART Error Interrupt: (Frame error, noise error, overrun error) */
        SET_BIT(huart->Instance->CR3, USART_CR3_EIE);

        /* Enable the UART Data Register not empty Interrupt */
        SET_BIT(huart->Instance->CR1, USART_CR1_RXNEIE);

        return HAL_OK;
      }
      else
      {
        return HAL_BUSY;
      }
    }

    不过串口中断函数太复杂了,先不研究了。。void HAL_UART_IRQHandler(UART_HandleTypeDef *huart)
    qhq
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    关闭

    站长推荐上一条 /6 下一条


    手机版|爱板网 |网站地图  

    GMT+8, 2016-12-7 00:05 , Processed in 0.146286 second(s), 11 queries , Memcache On.

    苏公网安备 32059002001056号

    Powered by Discuz!

    回顶部