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);

     

  • 相关阅读:
    记录下IE7下的input标签bug
    CYQ.Data 轻量数据访问层(一) 概述
    网站安装打包 软件环境检测与安装[二] 上
    记录下关于调用RAR解压缩的问题
    CYQ.Data 轻量数据访问层(六) 构造数据表
    记绕过路由封杀问题
    MapXtreme 2005 学习心得 一些问题(八)
    网站安装打包 修改app.config[六]
    关于控件导出Excel格式问题的新解决方案
    CYQ.Data 轻量数据访问层(二) 构造数据单元(上)
  • 原文地址:https://www.cnblogs.com/wt88/p/14043262.html
Copyright © 2011-2022 走看看