diff --git a/examples/stm32/CMakeLists.txt b/examples/stm32/CMakeLists.txt index cd98033..775344e 100644 --- a/examples/stm32/CMakeLists.txt +++ b/examples/stm32/CMakeLists.txt @@ -13,20 +13,6 @@ set(CMAKE_TOOLCHAIN_FILE ${stm32_cmake_SOURCE_DIR}/cmake/stm32_gcc.cmake) project(${PROJ_NAME} CXX C ASM) set(CMAKE_INCLUDE_CURRENT_DIR TRUE) -set(TARGET_NAME ${PROJ_NAME}) - -add_executable(${TARGET_NAME} - main.c - bsp/blackpill/blackpill.c - nmbs/port.c - ) - -target_include_directories( - ${TARGET_NAME} PRIVATE - ${CMAKE_CURRENT_SOURCE_DIR}/bsp - ${CMAKE_CURRENT_SOURCE_DIR}/nmbs -) - stm32_fetch_cmsis(F4) stm32_fetch_hal(F4) @@ -81,30 +67,60 @@ endif() add_library(nanomodbus ${nanomodbus_SOURCE_DIR}/nanomodbus.c) target_include_directories(nanomodbus PUBLIC ${nanomodbus_SOURCE_DIR}) -target_link_libraries( - ${TARGET_NAME} - STM32::NoSys - CMSIS::STM32::F401CC - HAL::STM32::F4::CORTEX - HAL::STM32::F4::RCC - HAL::STM32::F4::PWR - HAL::STM32::F4::GPIO - HAL::STM32::F4::TIM - HAL::STM32::F4::UART - HAL::STM32::F4::USART - HAL::STM32::F4::SPI - HAL::STM32::F4::DMA - wizchip - freertos_kernel - nanomodbus -) +set(TARGET_NAMES modbus_rtu modbus_tcp) -add_custom_command(TARGET ${TARGET_NAME} POST_BUILD - COMMAND ${CMAKE_SIZE} $ -) -add_custom_command(TARGET ${TARGET_NAME} POST_BUILD -COMMAND ${CMAKE_OBJCOPY} -O ihex $ ${TARGET_NAME}.hex -) -add_custom_command(TARGET ${TARGET_NAME} POST_BUILD -COMMAND ${CMAKE_OBJCOPY} -O binary $ ${TARGET_NAME}.bin -) \ No newline at end of file +foreach(TARGET_NAME ${TARGET_NAMES}) + + add_executable(${TARGET_NAME} + ${TARGET_NAME}.c + bsp/blackpill/blackpill.c + nmbs/port.c + ) + + target_include_directories( + ${TARGET_NAME} PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR}/bsp + ${CMAKE_CURRENT_SOURCE_DIR}/nmbs + ) + + if(${TARGET_NAME} STREQUAL "modbus_rtu") + target_compile_definitions( + ${TARGET_NAME} PRIVATE + NMBS_RTU + ) + elseif(${TARGET_NAME} STREQUAL "modbus_tcp") + target_compile_definitions( + ${TARGET_NAME} PRIVATE + NMBS_TCP + ) + endif() + + target_link_libraries( + ${TARGET_NAME} + STM32::NoSys + CMSIS::STM32::F401CC + HAL::STM32::F4::CORTEX + HAL::STM32::F4::RCC + HAL::STM32::F4::PWR + HAL::STM32::F4::GPIO + HAL::STM32::F4::TIM + HAL::STM32::F4::UART + HAL::STM32::F4::USART + HAL::STM32::F4::SPI + HAL::STM32::F4::DMA + wizchip + freertos_kernel + nanomodbus + ) + + add_custom_command(TARGET ${TARGET_NAME} POST_BUILD + COMMAND ${CMAKE_SIZE} $ + ) + add_custom_command(TARGET ${TARGET_NAME} POST_BUILD + COMMAND ${CMAKE_OBJCOPY} -O ihex $ ${TARGET_NAME}.hex + ) + add_custom_command(TARGET ${TARGET_NAME} POST_BUILD + COMMAND ${CMAKE_OBJCOPY} -O binary $ ${TARGET_NAME}.bin + ) + +endforeach() \ No newline at end of file diff --git a/examples/stm32/modbus_rtu.c b/examples/stm32/modbus_rtu.c new file mode 100644 index 0000000..de9472c --- /dev/null +++ b/examples/stm32/modbus_rtu.c @@ -0,0 +1,77 @@ +#include "blackpill/blackpill.h" +#include "nanomodbus.h" +#include "nmbs/port.h" + +#include "FreeRTOS.h" +#include "task.h" + +#define TEST_SERVER 1 +#define TEST_CLIENT 0 + +static void blink(void* args); +static void modbus(void* args); + +uint32_t HAL_GetTick(void) +{ + return xTaskGetTickCount(); +} + +int main(void) +{ + BSP_Init(); + + xTaskCreate(blink, "blink", 128, NULL, 4, NULL); + xTaskCreate(modbus, "modbus", 128 * 16, NULL, 2, NULL); + + vTaskStartScheduler(); + + for(;;){} +} + +static void blink(void* args) +{ + for(;;) + { + HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_SET); + vTaskDelay(500); + HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_RESET); + vTaskDelay(500); + } +} + +nmbs_t nmbs; +nmbs_server_t nmbs_server = +{ + .id = 0x01, + .coils = {0,}, + .regs = {0,}, +}; + +static void modbus(void* args) +{ +#if TEST_SERVER + nmbs_server_init(&nmbs, &nmbs_server); +#endif + +#if TEST_CLIENT + uint8_t coils_test[32]; + uint16_t regs_test[32]; + nmbs_client_init(&nmbs); +#endif + + for(;;){ +#if TEST_SERVER + nmbs_server_poll(&nmbs); + taskYIELD(); +#endif +#if TEST_CLIENT + nmbs_set_destination_rtu_address(&nmbs, 0x01); + nmbs_error status = nmbs_read_holding_registers(&nmbs, 0, 32, regs_test); + status = nmbs_write_multiple_registers(&nmbs, 0, 32, regs_test); + if(status != NMBS_ERROR_NONE) + { + while(true){} + } +#endif + } +} diff --git a/examples/stm32/main.c b/examples/stm32/modbus_tcp.c similarity index 99% rename from examples/stm32/main.c rename to examples/stm32/modbus_tcp.c index 13e5211..74f84be 100644 --- a/examples/stm32/main.c +++ b/examples/stm32/modbus_tcp.c @@ -76,7 +76,6 @@ int main(void) } } - static void blink(void* args) { for(;;) diff --git a/examples/stm32/nmbs/port.c b/examples/stm32/nmbs/port.c index cb85834..15e0fe0 100644 --- a/examples/stm32/nmbs/port.c +++ b/examples/stm32/nmbs/port.c @@ -197,4 +197,31 @@ int32_t write_socket(const uint8_t *buf, uint16_t count, int32_t byte_timeout_ms { return send(MB_SOCKET, buf, count); } +#endif + +#ifdef NMBS_RTU +static int32_t read_serial(uint8_t* buf, uint16_t count, int32_t byte_timeout_ms, void* arg) +{ + HAL_StatusTypeDef status = HAL_UART_Receive(&MB_UART, buf, count, byte_timeout_ms); + if(status == HAL_OK) + { + return count; + } + else + { + return 0; + } +} +static int32_t write_serial(const uint8_t* buf, uint16_t count, int32_t byte_timeout_ms, void* arg) +{ + HAL_StatusTypeDef status = HAL_UART_Transmit(&MB_UART, buf, count, byte_timeout_ms); + if(status == HAL_OK) + { + return count; + } + else + { + return 0; + } +} #endif \ No newline at end of file diff --git a/examples/stm32/nmbs/port.h b/examples/stm32/nmbs/port.h index e122186..ca80e23 100644 --- a/examples/stm32/nmbs/port.h +++ b/examples/stm32/nmbs/port.h @@ -23,6 +23,7 @@ extern "C" { // modbus rtu #define MB_UART huart1 #define RX_BUF_SIZE 256 +extern UART_HandleTypeDef MB_UART; #endif typedef struct tNmbsServer{