查看: 4188|回复: 0

STM32L476 NUCLEO 开发板使用 FreeRTOS + 串口

[复制链接]
  • TA的每日心情
    无聊
    2016-12-23 14:05
  • 签到天数: 7 天

    连续签到: 1 天

    [LV.3]偶尔看看II

    发表于 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
    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

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



    手机版|小黑屋|与非网

    GMT+8, 2024-3-29 19:47 , Processed in 0.107308 second(s), 16 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2020, Tencent Cloud.