zoukankan      html  css  js  c++  java
  • rtthread 添加串口 (uart3)

    1.查询uart配置过程

      文件路径: /drivers/board.h

      

       使能RTT uart驱动

      

     2.使能usart3总线  

      打开 /drivers/board.h

      #define BSP_UART3_RX_USING_DMA
      #define BSP_USING_UART3
      #define BSP_UART1_TX_PIN "PB10"
      #define BSP_UART1_RX_PIN "PB11"

    3.使能HAL库相应模块

      打开 /drivers/ stm32f7xx_hal_conf.h

      使能 #define HAL_UART_MODULE_ENABLED

    4.添加硬件初始化代码

      通过 stm32cubemx工具使能uart2硬件,在一下路径
      CoreSrcstm32f7xx_hal_msp.c中将HAL_UART_MspInit拷贝到 /drivers/board.c中

      

    
    
    void HAL_UART_MspInit(UART_HandleTypeDef* uartHandle)
    {
    
      GPIO_InitTypeDef GPIO_InitStruct = {0};
      if(uartHandle->Instance==USART3)
      {
    
        /* USART3 clock enable */
        __HAL_RCC_USART3_CLK_ENABLE();
    
        __HAL_RCC_GPIOB_CLK_ENABLE();
        /**USART3 GPIO Configuration
        PB10     ------> USART3_TX
        PB11     ------> USART3_RX
        */
        GPIO_InitStruct.Pin = GPIO_PIN_10;
        GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
        GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
        HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
    
        GPIO_InitStruct.Pin = GPIO_PIN_11;
        GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
        GPIO_InitStruct.Pull = GPIO_NOPULL;
        HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
      }
    }
    
    
    
     

    5.验证

      

    6.测试代码 

    #include <rtthread.h>
    #define SAMPLE_UART_NAME       "uart3"
    /* 用于接收消息的信号量 */
    static struct rt_semaphore rx_sem;
    static rt_device_t serial;
    
    /* 接收数据回调函数 */
    static rt_err_t uart_input(rt_device_t dev, rt_size_t size)
    {
        /* 串口接收到数据后产生中断,调用此回调函数,然后发送接收信号量 */
        rt_sem_release(&rx_sem);
    
        return RT_EOK;
    }
    
    /**
     * 串口接受线程
     * @param parameter
     */
    static void serial_thread_entry(void *parameter)
    {
        char ch;
    
        while (1)
        {
            /* 从串口读取一个字节的数据,没有读取到则等待接收信号量 */
            while (rt_device_read(serial, -1, &ch, 1) != 1)
            {
                /* 阻塞等待接收信号量,等到信号量后再次读取数据 */
                rt_sem_take(&rx_sem, RT_WAITING_FOREVER);
            }
            /* 读取到的数据通过串口错位输出 */
            ch = ch + 1;
            rt_device_write(serial, 0, &ch, 1);
        }
    }
    
    static int uart_sample(int argc, char *argv[])
    {
        rt_err_t ret = RT_EOK;
        char uart_name[RT_NAME_MAX];
        char str[] = "hello RT-Thread!
    ";
    
        if (argc == 2)
        {
            rt_strncpy(uart_name, argv[1], RT_NAME_MAX);
        }
        else
        {
            rt_strncpy(uart_name, SAMPLE_UART_NAME, RT_NAME_MAX);
        }
    
        /* 查找系统中的串口设备 */
        serial = rt_device_find(uart_name);
        if (!serial)
        {
            rt_kprintf("find %s failed!
    ", uart_name);
            return RT_ERROR;
        }
    
        /* 初始化信号量 */
        rt_sem_init(&rx_sem, "rx_sem", 0, RT_IPC_FLAG_FIFO);
        /* 以中断接收及轮询发送模式打开串口设备 */
        rt_device_open(serial, RT_DEVICE_FLAG_INT_RX);
        /* 设置接收回调函数 */
        rt_device_set_rx_indicate(serial, uart_input);
        /* 发送字符串 */
        rt_device_write(serial, 0, str, (sizeof(str) - 1));
    
        /* 创建 serial 线程 */
        rt_thread_t thread = rt_thread_create("serial", serial_thread_entry, RT_NULL, 1024, 25, 10);
        /* 创建成功则启动线程 */
        if (thread != RT_NULL)
        {
            rt_thread_startup(thread);
        }
        else
        {
            ret = RT_ERROR;
        }
    
        return ret;
    }
    /* 导出到 msh 命令列表中 */
    MSH_CMD_EXPORT(uart_sample, uart device sample);

     

  • 相关阅读:
    数据结构-树与二叉树-思维导图
    The last packet successfully received from the server was 2,272 milliseconds ago. The last packet sent successfully to the server was 2,258 milliseconds ago.
    idea连接mysql报错Server returns invalid timezone. Go to 'Advanced' tab and set 'serverTimezone' property
    redis学习笔记
    AJAX校验注册用户名是否存在
    AJAX学习笔记
    JSON学习笔记
    JQuery基础知识学习笔记
    Filter、Listener学习笔记
    三层架构学习笔记
  • 原文地址:https://www.cnblogs.com/wt88/p/14043262.html
Copyright © 2011-2022 走看看