Art pi 添加 UART5
Posted 姚家湾
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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;
}
这些内容仅为笔记,没有实际调试
以上是关于Art pi 添加 UART5的主要内容,如果未能解决你的问题,请参考以下文章
RT-Thread&ART-PI工业拓展版-以太网(ETH)的使用
RT-Thread&ART-PI工业拓展版-以太网(ETH)的使用
RT-Thread&ART-PI工业拓展版-以太网(ETH)的使用