Art pi 添加 UART5

在Art Pi 的工业拓展板上RS485 接口使用的是UART5 ,需要手工添加,具体的方法如下:

使用STM32CubeMX 工具打开UART5

点击 board->CubeMX_Config 下的CubeMX_Config.ioc 会自动启动STM32CubeMX 运行,配置好后,点击GENERATE Code。

注意: 在art Pi 开发板上

UART5_tx 为PB13

UART5_rx 为PB12 

与STM32CubeMX 默认不符,记得改过来。

另外,要记得开中断!

然后手动删除 board->CubeMX_Config->Core->Src 目录下的一些文件,仅保留 stm32h7xx_hal_msp.c 文件(RT-Thread 只使用该文件)。

修改libraries 目录下的Kconfig 文件

其中添加UART5

 menuconfig BSP_USING_UART
        bool "Enable UART"
        default n
        select RT_USING_SERIAL
        if BSP_USING_UART
            config BSP_USING_UART1
                bool "Enable UART1"
                default n
            config BSP_USING_UART3
                bool "Enable UART3"
                default n
            config BSP_USING_UART4
                bool "Enable UART4"
                default n
            config BSP_USING_UART5
                bool "Enable UART5"
                default n
            config BSP_USING_UART6
                bool "Enable UART6"
                default n
        endif

只有这样在RT-Thread 配置时 硬件中才能选择UART5

 

 修改board.h

     添加UART5 的引脚定义

#ifdef BSP_USING_UART4
#define BSP_UART4_TX_PIN       "PA0"
#define BSP_UART4_RX_PIN       "PI9"
#endif
#ifdef BSP_USING_UART5
#define BSP_UART5_TX_PIN       "PB13"
#define BSP_UART5_RX_PIN       "PB12"
#endif
#ifdef BSP_USING_UART6
#define BSP_UART6_TX_PIN       "PC6"
#define BSP_UART6_RX_PIN       "PC7"
#endif

      编译会出错找不到 Error_Handler();   把它括掉就可以了。     

 UART 中断方式收发程序

接收字符的过程

1 定义 一个串口serial

2 定义一个中断回调函数

3 判断uart5 是否在程序中存在

4 配置速率

5 打开

6 接收到字符时产生中断,进入回调函数rx_ok_flg =true

7 结收字符到缓存区。

uint8_t rk_ok_flag = 0;
static rt_device_t serial;
#define SAMPLE_UART_NAME       "uart5"
struct serial_configure config = RT_SERIAL_CONFIG_DEFAULT; 

static rt_err_t uart_recv_callback(rt_device_t dev, rt_size_t size)
{
    rk_ok_flag = 1;
    return RT_EOK;
}

int main(void)
{
    char ch;
    int i = 0;
    static int count = 1;
    char buf[25] = { 0 };
    serial = rt_device_find(SAMPLE_UART_NAME);
    if (!serial)
    {
        rt_kprintf("find %s failed!\n", SAMPLE_UART_NAME);
        return RT_ERROR;
    }
    config.baud_rate = BAUD_RATE_115200;      
    if(RT_EOK != rt_device_control(serial, RT_DEVICE_CTRL_CONFIG, &config))
    {
        rt_kprintf("fail\n");
        return RT_ERROR;
    }

    if(RT_EOK != rt_device_open(serial, RT_DEVICE_FLAG_INT_RX))
    {
        rt_kprintf("fail\n");
        return RT_ERROR;
    }

    rt_device_set_rx_indicate(serial, uart_recv_callback);
//main loop
    while (1)
    {
        if (1 == rk_ok_flag && 0 == rt_device_read(serial, -1, &ch, 1))
        {
            rk_ok_flag = 0;
            buf[i++] = ch;
            if (buf[i - 2] == '\r' && buf[i - 1] == '\n')
            {
                i = 0;
                count++;        
                rt_kprintf("Data:%s\n", buf);
                memset(buf, 0, 25);
            }
        }
    }
    return RT_EOK;
}

中断发送字符的过程

以中断收发方式打开串口

 rt_device_open(serial, RT_DEVICE_FLAG_INT_RX | RT_DEVICE_FLAG_INT_TX);

设置tx 回调函数

rt_device_set_tx_complete(serial, serial_tx_ind);

又有人说使用DMA发送模式才会调用这个回调函数 。 OS 内部是通过中断发送一串数据的么?

下面是别人写的代码

static rt_err_t uart_intput(rt_device_t dev, rt_size_t size)
{    
    return RT_EOK;
}

static rt_device_t uart_device = RT_NULL;
static char* str ="lissettecarlr";
int main(void)
{
      uart_device=rt_device_find("uart2");
      rt_device_set_rx_indicate(uart_device, uart_intput);
      rt_device_open(uart_device, RT_DEVICE_OFLAG_RDWR | RT_DEVICE_FLAG_INT_RX );  
      rt_device_write(uart_device, 0, str, strlen(str));
    return 0;
}

这些内容仅为笔记,没有实际调试

猜你喜欢

转载自blog.csdn.net/yaojiawan/article/details/120701598
pi
今日推荐