summaryrefslogtreecommitdiff
path: root/bsp/stm32
diff options
context:
space:
mode:
authorthread-liu <[email protected]>2020-12-05 11:57:10 +0800
committerthread-liu <[email protected]>2020-12-05 13:38:53 +0800
commitf9e34b4df6f566cb256af523360584cf3fbcd2b5 (patch)
treee0f65b31958281682ee3ad7d2f7ca18889d7e137 /bsp/stm32
parent8880e751f216a0b852bc3cfe132f84df59ab752d (diff)
[add] rs485 driver
Diffstat (limited to 'bsp/stm32')
-rw-r--r--bsp/stm32/libraries/HAL_Drivers/config/mp1/spi_config.h4
-rw-r--r--bsp/stm32/stm32mp157a-st-ev1/board/Kconfig16
-rw-r--r--bsp/stm32/stm32mp157a-st-ev1/board/SConscript3
-rw-r--r--bsp/stm32/stm32mp157a-st-ev1/board/ports/drv_rs485.c111
-rw-r--r--bsp/stm32/stm32mp157a-st-ev1/board/ports/drv_rs485.h25
5 files changed, 155 insertions, 4 deletions
diff --git a/bsp/stm32/libraries/HAL_Drivers/config/mp1/spi_config.h b/bsp/stm32/libraries/HAL_Drivers/config/mp1/spi_config.h
index 69de2adccd..26edfa927c 100644
--- a/bsp/stm32/libraries/HAL_Drivers/config/mp1/spi_config.h
+++ b/bsp/stm32/libraries/HAL_Drivers/config/mp1/spi_config.h
@@ -23,7 +23,6 @@ extern "C" {
{ \
.Instance = SPI1, \
.bus_name = "spi1", \
- .irq_type = SPI1_IRQn, \
}
#endif /* SPI1_BUS_CONFIG */
#endif /* BSP_USING_SPI1 */
@@ -58,7 +57,6 @@ extern "C" {
{ \
.Instance = SPI2, \
.bus_name = "spi2", \
- .irq_type = SPI2_IRQn, \
}
#endif /* SPI2_BUS_CONFIG */
#endif /* BSP_USING_SPI2 */
@@ -93,7 +91,6 @@ extern "C" {
{ \
.Instance = SPI3, \
.bus_name = "spi3", \
- .irq_type = SPI3_IRQn, \
}
#endif /* SPI3_BUS_CONFIG */
#endif /* BSP_USING_SPI3 */
@@ -128,7 +125,6 @@ extern "C" {
{ \
.Instance = SPI4, \
.bus_name = "spi4", \
- .irq_type = SPI4_IRQn, \
}
#endif /* SPI4_BUS_CONFIG */
#endif /* BSP_USING_SPI4 */
diff --git a/bsp/stm32/stm32mp157a-st-ev1/board/Kconfig b/bsp/stm32/stm32mp157a-st-ev1/board/Kconfig
index 971107f30e..37a8a780ba 100644
--- a/bsp/stm32/stm32mp157a-st-ev1/board/Kconfig
+++ b/bsp/stm32/stm32mp157a-st-ev1/board/Kconfig
@@ -104,6 +104,22 @@ menu "Onboard Peripheral Drivers"
bool "Enable Multi Function eXpander"
default n
+ menuconfig BSP_USING_RS485
+ bool "Enable RS485 "
+ default n
+ if BSP_USING_RS485
+ comment "set rts pin number "
+ config BSP_RS485_RTS_PIN
+ int "RS485 rts pin number"
+ range 1 176
+ default 5
+
+ config RS485_UART_DEVICE_NAME
+ string "the uart name for rs485"
+ default "uart3"
+
+ endif
+
endmenu
menu "On-chip Peripheral Drivers"
diff --git a/bsp/stm32/stm32mp157a-st-ev1/board/SConscript b/bsp/stm32/stm32mp157a-st-ev1/board/SConscript
index b3fd565887..833ef7701c 100644
--- a/bsp/stm32/stm32mp157a-st-ev1/board/SConscript
+++ b/bsp/stm32/stm32mp157a-st-ev1/board/SConscript
@@ -70,6 +70,9 @@ if GetDepend(['BSP_USING_PWR']):
if GetDepend(['BSP_USING_LPTIM1']):
src += Glob('ports/drv_lptim.c')
+if GetDepend(['BSP_USING_RS485']):
+ src += Glob('ports/drv_rs485.c')
+
if GetDepend(['BSP_USING_OPENAMP']):
src += Glob('CubeMX_Config/CM4/Src/ipcc.c')
src += Glob('CubeMX_Config/CM4/Src/openamp.c')
diff --git a/bsp/stm32/stm32mp157a-st-ev1/board/ports/drv_rs485.c b/bsp/stm32/stm32mp157a-st-ev1/board/ports/drv_rs485.c
new file mode 100644
index 0000000000..44eba3be91
--- /dev/null
+++ b/bsp/stm32/stm32mp157a-st-ev1/board/ports/drv_rs485.c
@@ -0,0 +1,111 @@
+/*
+ * Copyright (c) 2006-2022, RT-Thread Development Team
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2020-10-24 thread-liu first version
+ */
+
+#include <board.h>
+#include "drv_rs485.h"
+
+#ifdef BSP_USING_RS485
+
+#define RS485_OUT rt_pin_write(BSP_RS485_RTS_PIN, PIN_HIGH)
+#define RS485_IN rt_pin_write(BSP_RS485_RTS_PIN, PIN_LOW)
+
+static rt_device_t serial = {0};
+static struct rt_semaphore rx_sem = {0};
+
+/* uart send data callback function */
+static rt_err_t rs485_output(rt_device_t dev, void * buffer)
+{
+ return RT_EOK;
+}
+
+/* uart receive data callback function */
+static rt_err_t rs485_input(rt_device_t dev, rt_size_t size)
+{
+ rt_sem_release(&rx_sem);
+
+ return RT_EOK;
+}
+
+/* send string */
+int rs485_send_data(char *tbuf, rt_uint16_t t_len)
+{
+ /* change rs485 mode */
+ RS485_OUT;
+
+ /* send data */
+ rt_device_write(serial, 0, tbuf, t_len);
+
+ /* change rs485 mode */
+ RS485_IN;
+
+ return RT_EOK;
+}
+
+static void rs485_thread_entry(void *parameter)
+{
+ char ch;
+
+ while (1)
+ {
+ /* A byte of data is read from a serial port, and if it is not read, it waits for the received semaphore */
+ while (rt_device_read(serial, -1, &ch, 1) != 1)
+ {
+ rt_sem_take(&rx_sem, RT_WAITING_FOREVER);
+ }
+
+ /* The data read through the serial port output dislocation */
+ ch = ch + 1;
+
+ /* send char */
+ rs485_send_data(&ch, 1);
+ }
+}
+
+/* rs485 rts pin init */
+static int rs485_init(void)
+{
+ /* find uart device */
+ serial = rt_device_find(RS485_UART_DEVICE_NAME);
+ if (!serial)
+ {
+ rt_kprintf("find %s failed!\n", RS485_UART_DEVICE_NAME);
+ return RT_ERROR;
+ }
+
+ rt_device_open(serial, RT_DEVICE_FLAG_INT_RX);
+
+ /* set receive data callback function */
+ rt_device_set_rx_indicate(serial, rs485_input);
+
+ /* set the send completion callback function */
+ rt_device_set_tx_complete(serial, rs485_output);
+
+ rt_pin_mode(BSP_RS485_RTS_PIN, PIN_MODE_OUTPUT);
+
+ RS485_IN;
+
+ rt_sem_init(&rx_sem, "rx_sem", 0, RT_IPC_FLAG_FIFO);
+ /* create rs485 thread */
+ rt_thread_t thread = rt_thread_create("rs485", rs485_thread_entry, RT_NULL, 1024, 25, 10);
+
+ if (thread != RT_NULL)
+ {
+ rt_thread_startup(thread);
+ }
+ else
+ {
+ return RT_ERROR;
+ }
+
+ return RT_EOK;
+}
+INIT_DEVICE_EXPORT(rs485_init);
+
+#endif /* bsp_using_RS485 */
diff --git a/bsp/stm32/stm32mp157a-st-ev1/board/ports/drv_rs485.h b/bsp/stm32/stm32mp157a-st-ev1/board/ports/drv_rs485.h
new file mode 100644
index 0000000000..01edf84ae8
--- /dev/null
+++ b/bsp/stm32/stm32mp157a-st-ev1/board/ports/drv_rs485.h
@@ -0,0 +1,25 @@
+/*
+ * Copyright (c) 2006-2022, RT-Thread Development Team
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2020-10-24 thread-liu first version
+ */
+
+#ifndef __DRV_RS485_H__
+#define __DRV_RS485_H__
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define RS485_SEND_MODE 0
+#define RS485_RECV_MODE 1
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* drv_rs485.h */