refactor: 完成R8裸机lwIP移植并更新文档

This commit is contained in:
2026-03-30 18:08:54 +08:00
parent 68c64959c7
commit 9efa2cdc59
24 changed files with 1845 additions and 3619 deletions
+109 -17
View File
@@ -18,7 +18,6 @@
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "cmsis_os.h"
#include "dma.h"
#include "iwdg.h"
#include "spi.h"
@@ -28,10 +27,17 @@
/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include <stdio.h>
#include <string.h>
#include "CH390.h"
#include "SEGGER_RTT.h"
#include "config.h"
#include "flash_param.h"
#include "ethernetif.h"
#include "lwip/init.h"
#include "lwip/timeouts.h"
#include "tcp_client.h"
#include "tcp_server.h"
#include "uart_trans.h"
/* USER CODE END Includes */
@@ -66,10 +72,11 @@
/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
void MX_FREERTOS_Init(void);
/* USER CODE BEGIN PFP */
static void CH390_HardwareReset(void);
static void LED_Init(void);
static void App_Init(void);
static void App_Poll(void);
/* USER CODE END PFP */
/* Private user code ---------------------------------------------------------*/
@@ -110,6 +117,99 @@ void LED_Toggle(void)
HAL_GPIO_TogglePin(LED_PORT, LED_PIN);
}
static void App_Init(void)
{
const device_config_t *cfg;
ip4_addr_t ipaddr;
ip4_addr_t netmask;
ip4_addr_t gateway;
uart_config_t uart_cfg;
tcp_server_config_t server_cfg;
tcp_client_config_t client_cfg;
config_init();
cfg = config_get();
uart_trans_init();
uart_cfg.baudrate = cfg->uart2_baudrate;
uart_cfg.data_bits = cfg->uart2_databits;
uart_cfg.stop_bits = cfg->uart2_stopbits;
uart_cfg.parity = cfg->uart2_parity;
uart_trans_config(UART_CHANNEL_SERVER, &uart_cfg);
uart_cfg.baudrate = cfg->uart3_baudrate;
uart_cfg.data_bits = cfg->uart3_databits;
uart_cfg.stop_bits = cfg->uart3_stopbits;
uart_cfg.parity = cfg->uart3_parity;
uart_trans_config(UART_CHANNEL_CLIENT, &uart_cfg);
uart_trans_start(UART_CHANNEL_SERVER);
uart_trans_start(UART_CHANNEL_CLIENT);
config_start_reception();
SEGGER_RTT_Init();
SEGGER_RTT_WriteString(0, "\r\nTCP2UART boot\r\n");
lwip_init();
IP4_ADDR(&ipaddr, cfg->ip[0], cfg->ip[1], cfg->ip[2], cfg->ip[3]);
IP4_ADDR(&netmask, cfg->mask[0], cfg->mask[1], cfg->mask[2], cfg->mask[3]);
IP4_ADDR(&gateway, cfg->gw[0], cfg->gw[1], cfg->gw[2], cfg->gw[3]);
lwip_netif_init(&ipaddr, &netmask, &gateway);
server_cfg.port = cfg->server_port;
server_cfg.auto_reconnect = true;
tcp_server_init(&server_cfg);
tcp_server_start();
memcpy(client_cfg.server_ip, cfg->remote_ip, sizeof(client_cfg.server_ip));
client_cfg.server_port = cfg->remote_port;
client_cfg.auto_reconnect = true;
client_cfg.reconnect_interval_ms = cfg->reconnect_interval;
tcp_client_init(&client_cfg);
tcp_client_connect();
}
static void App_Poll(void)
{
uint8_t buffer[128];
int len;
ethernetif_poll();
ethernetif_check_link();
sys_check_timeouts();
tcp_client_poll();
uart_trans_poll();
config_poll();
len = tcp_server_recv(buffer, sizeof(buffer), 0u);
if (len > 0) {
uart_trans_write(UART_CHANNEL_SERVER, buffer, (uint16_t)len);
}
len = tcp_client_recv(buffer, sizeof(buffer), 0u);
if (len > 0) {
uart_trans_write(UART_CHANNEL_CLIENT, buffer, (uint16_t)len);
}
len = (int)uart_trans_read(UART_CHANNEL_SERVER, buffer, sizeof(buffer));
if (len > 0) {
tcp_server_send(buffer, (uint16_t)len);
}
len = (int)uart_trans_read(UART_CHANNEL_CLIENT, buffer, sizeof(buffer));
if (len > 0) {
tcp_client_send(buffer, (uint16_t)len);
}
if (config_is_reset_requested()) {
config_clear_reset_requested();
NVIC_SystemReset();
}
HAL_IWDG_Refresh(&hiwdg);
}
/* USER CODE END 0 */
/**
@@ -154,21 +254,11 @@ int main(void)
/* CH390 硬件复位 */
CH390_HardwareReset();
/* Initialize configuration from Flash (fallback to defaults on invalid data) */
config_init();
App_Init();
/* USER CODE END 2 */
/* Init scheduler */
osKernelInitialize(); /* Call init function for freertos objects (in cmsis_os2.c) */
MX_FREERTOS_Init();
/* Start scheduler */
osKernelStart();
/* We should never get here as control is now taken by the scheduler */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
@@ -176,6 +266,7 @@ int main(void)
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
App_Poll();
}
/* USER CODE END 3 */
}
@@ -228,13 +319,14 @@ void SystemClock_Config(void)
#ifdef __GNUC__
int _write(int file, char *ptr, int len)
{
HAL_UART_Transmit(&huart1, (uint8_t *)ptr, len, HAL_MAX_DELAY);
return len;
(void)file;
return (int)SEGGER_RTT_Write(0, ptr, (unsigned)len);
}
#else
int fputc(int ch, FILE *f)
{
HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, HAL_MAX_DELAY);
(void)f;
SEGGER_RTT_PutChar(0, (char)ch);
return ch;
}
#endif
+4 -16
View File
@@ -20,15 +20,11 @@
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "stm32f1xx_it.h"
#include "FreeRTOS.h"
#include "task.h"
/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "ethernetif.h"
#include "uart_trans.h"
#include "config.h"
/* External functions from freertos.c */
extern void notify_ch390_interrupt_from_isr(void);
/* USER CODE END Includes */
/* Private typedef -----------------------------------------------------------*/
@@ -176,14 +172,6 @@ void SysTick_Handler(void)
/* USER CODE END SysTick_IRQn 0 */
HAL_IncTick();
#if (INCLUDE_xTaskGetSchedulerState == 1 )
if (xTaskGetSchedulerState() != taskSCHEDULER_NOT_STARTED)
{
#endif /* INCLUDE_xTaskGetSchedulerState */
xPortSysTickHandler();
#if (INCLUDE_xTaskGetSchedulerState == 1 )
}
#endif /* INCLUDE_xTaskGetSchedulerState */
/* USER CODE BEGIN SysTick_IRQn 1 */
/* USER CODE END SysTick_IRQn 1 */
@@ -361,9 +349,9 @@ void EXTI0_IRQHandler(void)
if (__HAL_GPIO_EXTI_GET_IT(GPIO_PIN_0))
{
__HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_0);
/* Notify LwIP task */
notify_ch390_interrupt_from_isr();
/* Defer CH390 processing to main loop */
ethernetif_set_irq_pending();
}
}