Compare commits
7 Commits
3f91481d00
...
00be10f134
| Author | SHA1 | Date | |
|---|---|---|---|
| 00be10f134 | |||
| ccd69a523e | |||
| eeccfb84a0 | |||
| e3450fd0ad | |||
| afd90d357c | |||
| c8f27e21f1 | |||
| 77da670f5c |
@@ -0,0 +1,7 @@
|
||||
{
|
||||
"keil": {
|
||||
"project": "MDK-ARM/TCP2UART.uvprojx",
|
||||
"target": "TCP2UART",
|
||||
"log_dir": ".embeddedskills/build"
|
||||
}
|
||||
}
|
||||
@@ -28,11 +28,14 @@ MDK-ARM/DebugConfig/
|
||||
MDK-ARM/TCP2UART/
|
||||
build_keil.log
|
||||
MDK-ARM/build.log
|
||||
MDK-ARM/build_capture.txt
|
||||
MDK-ARM/build_output.txt
|
||||
MDK-ARM/keil-build-viewer.log
|
||||
MDK-ARM/keil-build-viewer-record.txt
|
||||
MDK-ARM/keil-build-viewer.exe
|
||||
MDK-ARM/EventRecorderStub.scvd
|
||||
.embeddedskills/build/
|
||||
.embeddedskills/state.json
|
||||
build_current.log
|
||||
uv4_stdout.txt
|
||||
|
||||
|
||||
+8
-8
@@ -23,6 +23,8 @@ static device_config_t g_config;
|
||||
static volatile bool g_reset_requested;
|
||||
static volatile bool g_uart1_tx_busy;
|
||||
static uint8_t g_uart1_rx_buffer[CONFIG_RX_BUFFER_SIZE];
|
||||
static char g_config_cmd_buffer[CONFIG_CMD_MAX_LEN];
|
||||
static char g_config_response_buffer[CONFIG_TX_BUFFER_SIZE];
|
||||
|
||||
static uint32_t config_calc_crc(const device_config_t *cfg)
|
||||
{
|
||||
@@ -632,8 +634,6 @@ static void config_respond_to_uart(route_msg_t *msg, const char *response)
|
||||
void ConfigTask(void *argument)
|
||||
{
|
||||
route_msg_t *msg;
|
||||
char cmd[CONFIG_CMD_MAX_LEN];
|
||||
char response[CONFIG_TX_BUFFER_SIZE];
|
||||
at_result_t result;
|
||||
|
||||
(void)argument;
|
||||
@@ -646,14 +646,14 @@ void ConfigTask(void *argument)
|
||||
continue;
|
||||
}
|
||||
|
||||
if (msg->len >= sizeof(cmd)) {
|
||||
msg->len = sizeof(cmd) - 1u;
|
||||
if (msg->len >= sizeof(g_config_cmd_buffer)) {
|
||||
msg->len = sizeof(g_config_cmd_buffer) - 1u;
|
||||
}
|
||||
memcpy(cmd, msg->data, msg->len);
|
||||
cmd[msg->len] = '\0';
|
||||
memcpy(g_config_cmd_buffer, msg->data, msg->len);
|
||||
g_config_cmd_buffer[msg->len] = '\0';
|
||||
|
||||
result = config_process_at_cmd(cmd, response, sizeof(response));
|
||||
config_respond_to_uart(msg, response);
|
||||
result = config_process_at_cmd(g_config_cmd_buffer, g_config_response_buffer, sizeof(g_config_response_buffer));
|
||||
config_respond_to_uart(msg, g_config_response_buffer);
|
||||
if (result == AT_NEED_REBOOT) {
|
||||
config_respond_to_uart(msg, "Note: Use AT+SAVE then AT+RESET to apply changes\r\n");
|
||||
}
|
||||
|
||||
+4
-5
@@ -16,13 +16,12 @@
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/* Flash configuration for STM32F103R8 (64KB Flash) */
|
||||
/* Flash configuration for the current STM32F103RDT6 target (384KB Flash). */
|
||||
#define FLASH_PARAM_PAGE_SIZE 1024 /* 1KB per page for STM32F103 */
|
||||
#define FLASH_PARAM_START_ADDR 0x0800FC00 /* Last 1KB of 64KB Flash */
|
||||
#define FLASH_PARAM_END_ADDR 0x08010000 /* End of Flash */
|
||||
#define FLASH_PARAM_START_ADDR 0x0805FC00 /* Last 1KB page of 384KB Flash */
|
||||
#define FLASH_PARAM_END_ADDR 0x08060000 /* End of 384KB Flash */
|
||||
|
||||
/* For STM32F103RC (256KB), use: 0x0803FC00 */
|
||||
/* For STM32F103RB (128KB), use: 0x0801FC00 */
|
||||
/* Historical reference: STM32F103RCT6 would use 0x0803FC00 as its last page. */
|
||||
|
||||
/**
|
||||
* @brief Initialize Flash parameter storage
|
||||
|
||||
+31
-7
@@ -9,8 +9,11 @@
|
||||
#include "app_runtime.h"
|
||||
#include "config.h"
|
||||
#include "debug_log.h"
|
||||
#include "ethernetif.h"
|
||||
#include "route_msg.h"
|
||||
|
||||
#define TCP_CLIENT_CONNECT_TIMEOUT_MS 5000
|
||||
|
||||
static err_t tcp_client_worker(struct netconn *conn, uint8_t link_index)
|
||||
{
|
||||
struct netbuf *buf;
|
||||
@@ -62,20 +65,15 @@ static void tcp_client_task(uint8_t link_index)
|
||||
err_t err;
|
||||
uint8_t first_connect_deferred;
|
||||
|
||||
netconn_thread_init();
|
||||
first_connect_deferred = (link_index == CONFIG_LINK_C1) ? 1u : 0u;
|
||||
|
||||
for (;;) {
|
||||
while (g_netif_ready == pdFALSE) {
|
||||
while ((g_netif_ready == pdFALSE) || (ethernetif_link_is_up() == 0u)) {
|
||||
vTaskDelay(pdMS_TO_TICKS(100));
|
||||
}
|
||||
|
||||
cfg = config_get();
|
||||
debug_log_printf("[CLI] idx=%u hwm=%lu en=%u lport=%u rport=%u\r\n",
|
||||
(unsigned int)link_index,
|
||||
(unsigned long)uxTaskGetStackHighWaterMark(NULL),
|
||||
(unsigned int)cfg->links[link_index].enabled,
|
||||
(unsigned int)cfg->links[link_index].local_port,
|
||||
(unsigned int)cfg->links[link_index].remote_port);
|
||||
if (cfg->links[link_index].enabled == 0u) {
|
||||
vTaskDelay(pdMS_TO_TICKS(500));
|
||||
continue;
|
||||
@@ -99,6 +97,10 @@ static void tcp_client_task(uint8_t link_index)
|
||||
if (cfg->links[link_index].local_port != 0u) {
|
||||
err = netconn_bind(conn, IP_ADDR_ANY, cfg->links[link_index].local_port);
|
||||
if (err != ERR_OK) {
|
||||
debug_log_printf("[CLI] idx=%u bind-fail err=%d lport=%u\r\n",
|
||||
(unsigned int)link_index,
|
||||
(int)err,
|
||||
(unsigned int)cfg->links[link_index].local_port);
|
||||
netconn_delete(conn);
|
||||
vTaskDelay(pdMS_TO_TICKS(delay_ms));
|
||||
continue;
|
||||
@@ -111,9 +113,31 @@ static void tcp_client_task(uint8_t link_index)
|
||||
cfg->links[link_index].remote_ip[2],
|
||||
cfg->links[link_index].remote_ip[3]);
|
||||
|
||||
netconn_set_recvtimeout(conn, TCP_CLIENT_CONNECT_TIMEOUT_MS);
|
||||
err = netconn_connect(conn, &remote_ip, cfg->links[link_index].remote_port);
|
||||
if (err == ERR_OK) {
|
||||
debug_log_printf("[CLI] idx=%u connect-ok\r\n", (unsigned int)link_index);
|
||||
(void)tcp_client_worker(conn, link_index);
|
||||
} else {
|
||||
if (err == ERR_TIMEOUT) {
|
||||
debug_log_printf("[CLI] idx=%u connect-timeout ms=%u rip=%u.%u.%u.%u rport=%u\r\n",
|
||||
(unsigned int)link_index,
|
||||
(unsigned int)TCP_CLIENT_CONNECT_TIMEOUT_MS,
|
||||
(unsigned int)cfg->links[link_index].remote_ip[0],
|
||||
(unsigned int)cfg->links[link_index].remote_ip[1],
|
||||
(unsigned int)cfg->links[link_index].remote_ip[2],
|
||||
(unsigned int)cfg->links[link_index].remote_ip[3],
|
||||
(unsigned int)cfg->links[link_index].remote_port);
|
||||
} else {
|
||||
debug_log_printf("[CLI] idx=%u connect-fail err=%d rip=%u.%u.%u.%u rport=%u\r\n",
|
||||
(unsigned int)link_index,
|
||||
(int)err,
|
||||
(unsigned int)cfg->links[link_index].remote_ip[0],
|
||||
(unsigned int)cfg->links[link_index].remote_ip[1],
|
||||
(unsigned int)cfg->links[link_index].remote_ip[2],
|
||||
(unsigned int)cfg->links[link_index].remote_ip[3],
|
||||
(unsigned int)cfg->links[link_index].remote_port);
|
||||
}
|
||||
}
|
||||
|
||||
netconn_close(conn);
|
||||
|
||||
+2
-5
@@ -58,17 +58,14 @@ static void tcp_server_task(uint8_t link_index)
|
||||
struct netconn *listener;
|
||||
struct netconn *newconn;
|
||||
|
||||
netconn_thread_init();
|
||||
|
||||
for (;;) {
|
||||
while (g_netif_ready == pdFALSE) {
|
||||
vTaskDelay(pdMS_TO_TICKS(100));
|
||||
}
|
||||
|
||||
cfg = config_get();
|
||||
debug_log_printf("[SRV] idx=%u hwm=%lu en=%u port=%u\r\n",
|
||||
(unsigned int)link_index,
|
||||
(unsigned long)uxTaskGetStackHighWaterMark(NULL),
|
||||
(unsigned int)cfg->links[link_index].enabled,
|
||||
(unsigned int)cfg->links[link_index].local_port);
|
||||
if (cfg->links[link_index].enabled == 0u) {
|
||||
vTaskDelay(pdMS_TO_TICKS(500));
|
||||
continue;
|
||||
|
||||
@@ -192,6 +192,7 @@ static void uart_send_tcp_msg_to_uarts(route_msg_t *msg)
|
||||
|
||||
static void uart_route_mux_frame(uart_channel_t source_channel, const uart_mux_frame_t *frame)
|
||||
{
|
||||
const device_config_t *cfg = config_get();
|
||||
uint32_t i;
|
||||
uint8_t source_conn = (source_channel == UART_CHANNEL_U1) ? ROUTE_CONN_UART3 : ROUTE_CONN_UART2;
|
||||
uint8_t out_frame[ROUTE_MSG_MAX_PAYLOAD + 6u];
|
||||
@@ -209,6 +210,9 @@ static void uart_route_mux_frame(uart_channel_t source_channel, const uart_mux_f
|
||||
}
|
||||
|
||||
for (i = 0; i < CONFIG_LINK_COUNT; ++i) {
|
||||
if (cfg->links[i].enabled == 0u) {
|
||||
continue;
|
||||
}
|
||||
uint8_t endpoint = config_link_index_to_endpoint((uint8_t)i);
|
||||
if ((frame->dst_mask & endpoint) != 0u) {
|
||||
(void)route_send(xLinkTxQueues[i], frame->src_id, endpoint, source_conn, frame->payload, frame->payload_len, pdMS_TO_TICKS(10));
|
||||
|
||||
@@ -44,6 +44,7 @@
|
||||
|
||||
/* USER CODE BEGIN Includes */
|
||||
/* Section where include file can be added */
|
||||
#include "debug_log.h"
|
||||
/* USER CODE END Includes */
|
||||
|
||||
/* Ensure definitions are only used by the compiler, and not by the assembler. */
|
||||
@@ -65,7 +66,7 @@
|
||||
#define configTICK_RATE_HZ ((TickType_t)1000)
|
||||
#define configMAX_PRIORITIES ( 7 )
|
||||
#define configMINIMAL_STACK_SIZE ((uint16_t)128)
|
||||
#define configTOTAL_HEAP_SIZE ((size_t)15360)
|
||||
#define configTOTAL_HEAP_SIZE ((size_t)21760)
|
||||
#define configMAX_TASK_NAME_LEN ( 16 )
|
||||
#define configUSE_TRACE_FACILITY 1
|
||||
#define configUSE_16_BIT_TICKS 0
|
||||
@@ -86,6 +87,8 @@
|
||||
#define configTIMER_TASK_PRIORITY ( 2 )
|
||||
#define configTIMER_QUEUE_LENGTH 10
|
||||
#define configTIMER_TASK_STACK_DEPTH 256
|
||||
#define configCHECK_FOR_STACK_OVERFLOW 2
|
||||
#define configUSE_MALLOC_FAILED_HOOK 1
|
||||
|
||||
/* Set the following definitions to 1 to include the API function, or zero
|
||||
to exclude the API function. */
|
||||
@@ -137,7 +140,7 @@ See http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html. */
|
||||
/* Normal assert() semantics without relying on the provision of an assert.h
|
||||
header file. */
|
||||
/* USER CODE BEGIN 1 */
|
||||
#define configASSERT( x ) if ((x) == 0) {taskDISABLE_INTERRUPTS(); for( ;; );}
|
||||
#define configASSERT( x ) do { if ((x) == 0) { debug_log_fault_context("config-assert", __FILE__, __LINE__); taskDISABLE_INTERRUPTS(); for( ;; ) { } } } while (0)
|
||||
/* USER CODE END 1 */
|
||||
|
||||
/* Definitions that map the FreeRTOS port interrupt handlers to their CMSIS
|
||||
@@ -164,13 +167,13 @@ standard names. */
|
||||
|
||||
/* Application task stack sizes (in words) */
|
||||
#define TASK_STACK_TCPIP 512
|
||||
#define TASK_STACK_NET_POLL 384
|
||||
#define TASK_STACK_TCP_SERVER 384
|
||||
#define TASK_STACK_TCP_CLIENT 384
|
||||
#define TASK_STACK_UART_RX 256
|
||||
#define TASK_STACK_NET_POLL 512
|
||||
#define TASK_STACK_TCP_SERVER 512
|
||||
#define TASK_STACK_TCP_CLIENT 512
|
||||
#define TASK_STACK_UART_RX 384
|
||||
#define TASK_STACK_ROUTE 512
|
||||
#define TASK_STACK_CONFIG 256
|
||||
#define TASK_STACK_DEFAULT 128
|
||||
#define TASK_STACK_CONFIG 384
|
||||
#define TASK_STACK_DEFAULT 192
|
||||
|
||||
/* Route message pool for zero-copy inter-task communication */
|
||||
#define ROUTE_MSG_POOL_SIZE 8
|
||||
|
||||
@@ -17,6 +17,7 @@ void debug_log_printf(const char *fmt, ...);
|
||||
void debug_log_boot(const char *tag);
|
||||
void debug_log_fault(const char *tag);
|
||||
void debug_log_runtime_snapshot(void);
|
||||
void debug_log_fault_context(const char *tag, const char *file, int line);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
||||
+1
-1
@@ -38,7 +38,7 @@ extern IWDG_HandleTypeDef hiwdg;
|
||||
|
||||
/* USER CODE END Private defines */
|
||||
|
||||
void MX_IWDG_Init(void);
|
||||
HAL_StatusTypeDef MX_IWDG_Init(void);
|
||||
|
||||
/* USER CODE BEGIN Prototypes */
|
||||
|
||||
|
||||
+14
-1
@@ -45,7 +45,7 @@ void debug_log_write(const char *msg)
|
||||
|
||||
void debug_log_printf(const char *fmt, ...)
|
||||
{
|
||||
char buffer[128];
|
||||
char buffer[256];
|
||||
va_list args;
|
||||
int len;
|
||||
|
||||
@@ -75,6 +75,19 @@ void debug_log_fault(const char *tag)
|
||||
debug_log_printf("[FAULT] %s\r\n", (tag != NULL) ? tag : "(null)");
|
||||
}
|
||||
|
||||
void debug_log_fault_context(const char *tag, const char *file, int line)
|
||||
{
|
||||
debug_log_printf("[FAULT] %s file=%s line=%d free=%lu min=%lu seq=%lu drop=%lu last_drop=%lu\r\n",
|
||||
(tag != NULL) ? tag : "(null)",
|
||||
(file != NULL) ? file : "(null)",
|
||||
line,
|
||||
(unsigned long)xPortGetFreeHeapSize(),
|
||||
(unsigned long)xPortGetMinimumEverFreeHeapSize(),
|
||||
(unsigned long)g_rtt_log_seq,
|
||||
(unsigned long)g_rtt_log_drop_count,
|
||||
(unsigned long)g_rtt_log_last_drop_seq);
|
||||
}
|
||||
|
||||
void debug_log_runtime_snapshot(void)
|
||||
{
|
||||
UBaseType_t default_hwm;
|
||||
|
||||
+32
-21
@@ -36,48 +36,70 @@ static TaskHandle_t xTcpSrvTaskS2Handle = NULL;
|
||||
static TaskHandle_t xTcpCliTaskC1Handle = NULL;
|
||||
static TaskHandle_t xTcpCliTaskC2Handle = NULL;
|
||||
static TaskHandle_t xDefaultTaskHandle = NULL;
|
||||
static BaseType_t xNetworkTasksStarted = pdFALSE;
|
||||
|
||||
void app_start_network_tasks(void)
|
||||
{
|
||||
#if !DIAG_TASK_ISOLATION
|
||||
BaseType_t rc;
|
||||
const device_config_t *cfg;
|
||||
|
||||
if (xTcpSrvTaskS1Handle != NULL) {
|
||||
if (xNetworkTasksStarted != pdFALSE) {
|
||||
debug_log_write("[NET] start-network-tasks already\r\n");
|
||||
return;
|
||||
}
|
||||
|
||||
cfg = config_get();
|
||||
|
||||
debug_log_printf("[NET] start-network-tasks enter free=%lu min=%lu\r\n",
|
||||
(unsigned long)xPortGetFreeHeapSize(),
|
||||
(unsigned long)xPortGetMinimumEverFreeHeapSize());
|
||||
|
||||
if (cfg->links[CONFIG_LINK_S1].enabled != 0u) {
|
||||
rc = xTaskCreate(TcpSrvTask_S1, "TcpSrvS1", TASK_STACK_TCP_SERVER, NULL, TASK_PRIORITY_TCP_SERVER, &xTcpSrvTaskS1Handle);
|
||||
debug_log_printf("[NET] create TcpSrvS1 rc=%ld free=%lu min=%lu\r\n",
|
||||
(long)rc,
|
||||
(unsigned long)xPortGetFreeHeapSize(),
|
||||
(unsigned long)xPortGetMinimumEverFreeHeapSize());
|
||||
configASSERT(rc == pdPASS);
|
||||
} else {
|
||||
debug_log_write("[NET] skip TcpSrvS1 en=0\r\n");
|
||||
}
|
||||
|
||||
if (cfg->links[CONFIG_LINK_S2].enabled != 0u) {
|
||||
rc = xTaskCreate(TcpSrvTask_S2, "TcpSrvS2", TASK_STACK_TCP_SERVER, NULL, TASK_PRIORITY_TCP_SERVER, &xTcpSrvTaskS2Handle);
|
||||
debug_log_printf("[NET] create TcpSrvS2 rc=%ld free=%lu min=%lu\r\n",
|
||||
(long)rc,
|
||||
(unsigned long)xPortGetFreeHeapSize(),
|
||||
(unsigned long)xPortGetMinimumEverFreeHeapSize());
|
||||
configASSERT(rc == pdPASS);
|
||||
} else {
|
||||
debug_log_write("[NET] skip TcpSrvS2 en=0\r\n");
|
||||
}
|
||||
|
||||
if (cfg->links[CONFIG_LINK_C1].enabled != 0u) {
|
||||
rc = xTaskCreate(TcpCliTask_C1, "TcpCliC1", TASK_STACK_TCP_CLIENT, NULL, TASK_PRIORITY_TCP_CLIENT, &xTcpCliTaskC1Handle);
|
||||
debug_log_printf("[NET] create TcpCliC1 rc=%ld free=%lu min=%lu\r\n",
|
||||
(long)rc,
|
||||
(unsigned long)xPortGetFreeHeapSize(),
|
||||
(unsigned long)xPortGetMinimumEverFreeHeapSize());
|
||||
configASSERT(rc == pdPASS);
|
||||
} else {
|
||||
debug_log_write("[NET] skip TcpCliC1 en=0\r\n");
|
||||
}
|
||||
|
||||
if (cfg->links[CONFIG_LINK_C2].enabled != 0u) {
|
||||
rc = xTaskCreate(TcpCliTask_C2, "TcpCliC2", TASK_STACK_TCP_CLIENT, NULL, TASK_PRIORITY_TCP_CLIENT, &xTcpCliTaskC2Handle);
|
||||
debug_log_printf("[NET] create TcpCliC2 rc=%ld free=%lu min=%lu\r\n",
|
||||
(long)rc,
|
||||
(unsigned long)xPortGetFreeHeapSize(),
|
||||
(unsigned long)xPortGetMinimumEverFreeHeapSize());
|
||||
configASSERT(rc == pdPASS);
|
||||
} else {
|
||||
debug_log_write("[NET] skip TcpCliC2 en=0\r\n");
|
||||
}
|
||||
|
||||
xNetworkTasksStarted = pdTRUE;
|
||||
|
||||
debug_log_printf("[NET] start-network-tasks exit free=%lu min=%lu\r\n",
|
||||
(unsigned long)xPortGetFreeHeapSize(),
|
||||
@@ -87,33 +109,22 @@ void app_start_network_tasks(void)
|
||||
|
||||
static void StartDefaultTask(void *argument)
|
||||
{
|
||||
TickType_t last_snapshot = xTaskGetTickCount();
|
||||
BaseType_t alive_logged = pdFALSE;
|
||||
BaseType_t iwdg_ready = pdFALSE;
|
||||
|
||||
(void)argument;
|
||||
debug_log_boot("default-task");
|
||||
|
||||
if (MX_IWDG_Init() == HAL_OK) {
|
||||
debug_log_write("[BOOT] iwdg-started\r\n");
|
||||
iwdg_ready = pdTRUE;
|
||||
} else {
|
||||
debug_log_write("[BOOT] iwdg-init-fail\r\n");
|
||||
}
|
||||
|
||||
for (;;) {
|
||||
HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13);
|
||||
if (iwdg_ready == pdTRUE) {
|
||||
HAL_IWDG_Refresh(&hiwdg);
|
||||
if (alive_logged == pdFALSE) {
|
||||
debug_log_write("[RTOS] alive\r\n");
|
||||
alive_logged = pdTRUE;
|
||||
}
|
||||
if ((xTaskGetTickCount() - last_snapshot) >= pdMS_TO_TICKS(5000)) {
|
||||
debug_log_printf("[RTOS] seq=%lu drops=%lu last=%lu free=%lu min=%lu self_hwm=%lu\r\n",
|
||||
(unsigned long)g_rtt_log_seq,
|
||||
(unsigned long)g_rtt_log_drop_count,
|
||||
(unsigned long)g_rtt_log_last_drop_seq,
|
||||
(unsigned long)xPortGetFreeHeapSize(),
|
||||
(unsigned long)xPortGetMinimumEverFreeHeapSize(),
|
||||
(unsigned long)uxTaskGetStackHighWaterMark(NULL));
|
||||
if (xNetPollTaskHandle != NULL) {
|
||||
debug_log_printf("[RTOS] net_phase=%lu net_hwm=%lu\r\n",
|
||||
(unsigned long)g_netif_phase,
|
||||
(unsigned long)uxTaskGetStackHighWaterMark(xNetPollTaskHandle));
|
||||
}
|
||||
last_snapshot = xTaskGetTickCount();
|
||||
}
|
||||
vTaskDelay(pdMS_TO_TICKS(500));
|
||||
}
|
||||
|
||||
+3
-3
@@ -27,7 +27,7 @@
|
||||
IWDG_HandleTypeDef hiwdg;
|
||||
|
||||
/* IWDG init function */
|
||||
void MX_IWDG_Init(void)
|
||||
HAL_StatusTypeDef MX_IWDG_Init(void)
|
||||
{
|
||||
|
||||
/* USER CODE BEGIN IWDG_Init 0 */
|
||||
@@ -42,12 +42,12 @@ void MX_IWDG_Init(void)
|
||||
hiwdg.Init.Reload = 4095;
|
||||
if (HAL_IWDG_Init(&hiwdg) != HAL_OK)
|
||||
{
|
||||
Error_Handler();
|
||||
return HAL_ERROR;
|
||||
}
|
||||
/* USER CODE BEGIN IWDG_Init 2 */
|
||||
|
||||
/* USER CODE END IWDG_Init 2 */
|
||||
|
||||
return HAL_OK;
|
||||
}
|
||||
|
||||
/* USER CODE BEGIN 1 */
|
||||
|
||||
+23
-3
@@ -142,7 +142,6 @@ int main(void)
|
||||
/* Initialize all configured peripherals */
|
||||
MX_GPIO_Init();
|
||||
MX_DMA_Init();
|
||||
MX_IWDG_Init();
|
||||
MX_USART1_UART_Init();
|
||||
MX_USART2_UART_Init();
|
||||
MX_USART3_UART_Init();
|
||||
@@ -231,7 +230,28 @@ void SystemClock_Config(void)
|
||||
*/
|
||||
void Debug_TrapWithRttHint(const char *tag)
|
||||
{
|
||||
debug_log_fault(tag);
|
||||
debug_log_fault_context(tag, __FILE__, __LINE__);
|
||||
}
|
||||
|
||||
void vApplicationMallocFailedHook(void)
|
||||
{
|
||||
debug_log_fault_context("malloc-failed", __FILE__, __LINE__);
|
||||
__disable_irq();
|
||||
for (;;)
|
||||
{
|
||||
}
|
||||
}
|
||||
|
||||
void vApplicationStackOverflowHook(TaskHandle_t xTask, char *pcTaskName)
|
||||
{
|
||||
debug_log_printf("[FAULT] stack-overflow task=%s\r\n",
|
||||
(pcTaskName != NULL) ? pcTaskName : "(null)");
|
||||
debug_log_fault_context("stack-overflow", __FILE__, __LINE__);
|
||||
(void)xTask;
|
||||
__disable_irq();
|
||||
for (;;)
|
||||
{
|
||||
}
|
||||
}
|
||||
|
||||
/* USER CODE END 4 */
|
||||
@@ -244,7 +264,7 @@ void Error_Handler(void)
|
||||
{
|
||||
/* USER CODE BEGIN Error_Handler_Debug */
|
||||
/* User can add his own implementation to report the HAL error return state */
|
||||
debug_log_fault("error-handler");
|
||||
debug_log_fault_context("error-handler", __FILE__, __LINE__);
|
||||
__disable_irq();
|
||||
while (1)
|
||||
{
|
||||
|
||||
@@ -1395,7 +1395,13 @@ lwip_netconn_do_connect(void *m)
|
||||
#if LWIP_TCPIP_CORE_LOCKING
|
||||
LWIP_ASSERT("state!", msg->conn->state == NETCONN_CONNECT);
|
||||
UNLOCK_TCPIP_CORE();
|
||||
sys_arch_sem_wait(LWIP_API_MSG_SEM(msg), 0);
|
||||
if (sys_arch_sem_wait(LWIP_API_MSG_SEM(msg), msg->conn->recv_timeout) == SYS_ARCH_TIMEOUT) {
|
||||
if (msg->conn->state == NETCONN_CONNECT) {
|
||||
msg->conn->current_msg = NULL;
|
||||
msg->conn->state = NETCONN_NONE;
|
||||
msg->err = ERR_TIMEOUT;
|
||||
}
|
||||
}
|
||||
LOCK_TCPIP_CORE();
|
||||
LWIP_ASSERT("state!", msg->conn->state != NETCONN_CONNECT);
|
||||
#endif /* LWIP_TCPIP_CORE_LOCKING */
|
||||
|
||||
@@ -24,6 +24,7 @@ err_t ethernetif_init(struct netif *netif);
|
||||
void ethernetif_input(struct netif *netif);
|
||||
void lwip_netif_init(const ip4_addr_t *ipaddr, const ip4_addr_t *netmask, const ip4_addr_t *gw);
|
||||
void ethernetif_check_link(void);
|
||||
uint8_t ethernetif_link_is_up(void);
|
||||
void ethernetif_poll(void);
|
||||
|
||||
void print_netif(struct netif *netif);
|
||||
|
||||
@@ -457,6 +457,8 @@ void ethernetif_diag_poll_status(void)
|
||||
*/
|
||||
static void ethernetif_update_link(uint8_t link_status)
|
||||
{
|
||||
LOCK_TCPIP_CORE();
|
||||
|
||||
if (link_status)
|
||||
{
|
||||
if (!netif_is_link_up(&ch390_netif))
|
||||
@@ -464,9 +466,7 @@ static void ethernetif_update_link(uint8_t link_status)
|
||||
netif_set_link_up(&ch390_netif);
|
||||
if ((s_garp_sent == 0u) && netif_is_up(&ch390_netif))
|
||||
{
|
||||
LOCK_TCPIP_CORE();
|
||||
etharp_gratuitous(&ch390_netif);
|
||||
UNLOCK_TCPIP_CORE();
|
||||
s_garp_sent = 1u;
|
||||
}
|
||||
}
|
||||
@@ -479,6 +479,8 @@ static void ethernetif_update_link(uint8_t link_status)
|
||||
s_garp_sent = 0u;
|
||||
}
|
||||
}
|
||||
|
||||
UNLOCK_TCPIP_CORE();
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -561,3 +563,8 @@ void ethernetif_check_link(void)
|
||||
|
||||
ethernetif_update_link(link_status);
|
||||
}
|
||||
|
||||
uint8_t ethernetif_link_is_up(void)
|
||||
{
|
||||
return netif_is_link_up(&ch390_netif) ? 1u : 0u;
|
||||
}
|
||||
|
||||
@@ -63,6 +63,12 @@ void ethernetif_diag_poll_status(void);
|
||||
*/
|
||||
void ethernetif_check_link(void);
|
||||
|
||||
/**
|
||||
* @brief Query whether physical Ethernet link is currently up
|
||||
* @return 1 if link is up, 0 otherwise
|
||||
*/
|
||||
uint8_t ethernetif_link_is_up(void);
|
||||
|
||||
/**
|
||||
* @brief Process all pending RX packets
|
||||
* @note Call this from the LwIP task when RX interrupt occurs
|
||||
|
||||
@@ -92,7 +92,7 @@ Revision: $Rev: 24316 $
|
||||
#endif
|
||||
|
||||
#ifndef BUFFER_SIZE_UP
|
||||
#define BUFFER_SIZE_UP (512) // Size of the buffer for terminal output of target, up to host (Default: 1k)
|
||||
#define BUFFER_SIZE_UP (2048) // Size of the buffer for terminal output of target, up to host (Default: 1k)
|
||||
#endif
|
||||
|
||||
#ifndef BUFFER_SIZE_DOWN
|
||||
@@ -100,7 +100,7 @@ Revision: $Rev: 24316 $
|
||||
#endif
|
||||
|
||||
#ifndef SEGGER_RTT_PRINTF_BUFFER_SIZE
|
||||
#define SEGGER_RTT_PRINTF_BUFFER_SIZE (64u) // Size of buffer for RTT printf to bulk-send chars via RTT (Default: 64)
|
||||
#define SEGGER_RTT_PRINTF_BUFFER_SIZE (128u) // Size of buffer for RTT printf to bulk-send chars via RTT (Default: 64)
|
||||
#endif
|
||||
|
||||
#ifndef SEGGER_RTT_MODE_DEFAULT
|
||||
|
||||
+3
-3
@@ -113,8 +113,8 @@ USE_HAL_DRIVER,STM32F103xE
|
||||
========================================
|
||||
|
||||
确认 ROM 和 RAM 配置正确:
|
||||
- IROM1: 0x08000000, Size: 0x40000 (256KB)
|
||||
- IRAM1: 0x20000000, Size: 0xC000 (48KB)
|
||||
- IROM1: 0x08000000, Size: 0x60000 (384KB)
|
||||
- IRAM1: 0x20000000, Size: 0x10000 (64KB)
|
||||
|
||||
========================================
|
||||
六、编译验证
|
||||
@@ -138,7 +138,7 @@ Debug 选项卡:
|
||||
|
||||
Utilities 选项卡:
|
||||
- 选择正确的 Flash 算法
|
||||
- STM32F10x High-density Flash (256KB)
|
||||
- STM32F10x High-density Flash (384KB / 0x60000)
|
||||
|
||||
========================================
|
||||
快速添加方法(可选)
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
+10
-10
@@ -14,16 +14,16 @@
|
||||
<uAC6>0</uAC6>
|
||||
<TargetOption>
|
||||
<TargetCommonOption>
|
||||
<Device>STM32F103RC</Device>
|
||||
<Device>STM32F103RD</Device>
|
||||
<Vendor>STMicroelectronics</Vendor>
|
||||
<PackID>Keil.STM32F1xx_DFP.2.4.1</PackID>
|
||||
<PackURL>https://www.keil.com/pack/</PackURL>
|
||||
<Cpu>IRAM(0x20000000,0x0000C000) IROM(0x08000000,0x00040000) CPUTYPE("Cortex-M3") CLOCK(12000000) ELITTLE</Cpu>
|
||||
<Cpu>IRAM(0x20000000,0x00010000) IROM(0x08000000,0x00060000) CPUTYPE("Cortex-M3") CLOCK(12000000) ELITTLE</Cpu>
|
||||
<FlashUtilSpec></FlashUtilSpec>
|
||||
<StartupFile></StartupFile>
|
||||
<FlashDriverDll>UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32F10x_HD -FS08000000 -FL040000 -FP0($$Device:STM32F103RC$Flash\STM32F10x_HD.FLM))</FlashDriverDll>
|
||||
<FlashDriverDll>UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32F10x_512 -FS08000000 -FL080000 -FP0($$Device:STM32F103RD$Flash\STM32F10x_512.FLM))</FlashDriverDll>
|
||||
<DeviceId>0</DeviceId>
|
||||
<RegisterFile>$$Device:STM32F103RC$Device\Include\stm32f10x.h</RegisterFile>
|
||||
<RegisterFile>$$Device:STM32F103RD$Device\Include\stm32f10x.h</RegisterFile>
|
||||
<MemoryEnv></MemoryEnv>
|
||||
<Cmp></Cmp>
|
||||
<Asm></Asm>
|
||||
@@ -33,7 +33,7 @@
|
||||
<SLE66CMisc></SLE66CMisc>
|
||||
<SLE66AMisc></SLE66AMisc>
|
||||
<SLE66LinkerMisc></SLE66LinkerMisc>
|
||||
<SFDFile>$$Device:STM32F103RC$SVD\STM32F103xx.svd</SFDFile>
|
||||
<SFDFile>$$Device:STM32F103RD$SVD\STM32F103xx.svd</SFDFile>
|
||||
<bCustSvd>0</bCustSvd>
|
||||
<UseEnv>0</UseEnv>
|
||||
<BinPath></BinPath>
|
||||
@@ -138,7 +138,7 @@
|
||||
</Flash1>
|
||||
<bUseTDR>1</bUseTDR>
|
||||
<Flash2>BIN\UL2CM3.DLL</Flash2>
|
||||
<Flash3>"" ()</Flash3>
|
||||
<Flash3></Flash3>
|
||||
<Flash4></Flash4>
|
||||
<pFcarmOut></pFcarmOut>
|
||||
<pFcarmGrp></pFcarmGrp>
|
||||
@@ -247,12 +247,12 @@
|
||||
<IRAM>
|
||||
<Type>0</Type>
|
||||
<StartAddress>0x20000000</StartAddress>
|
||||
<Size>0xc000</Size>
|
||||
<Size>0x10000</Size>
|
||||
</IRAM>
|
||||
<IROM>
|
||||
<Type>1</Type>
|
||||
<StartAddress>0x8000000</StartAddress>
|
||||
<Size>0x40000</Size>
|
||||
<Size>0x60000</Size>
|
||||
</IROM>
|
||||
<XRAM>
|
||||
<Type>0</Type>
|
||||
@@ -277,7 +277,7 @@
|
||||
<OCR_RVCT4>
|
||||
<Type>1</Type>
|
||||
<StartAddress>0x8000000</StartAddress>
|
||||
<Size>0x40000</Size>
|
||||
<Size>0x60000</Size>
|
||||
</OCR_RVCT4>
|
||||
<OCR_RVCT5>
|
||||
<Type>1</Type>
|
||||
@@ -302,7 +302,7 @@
|
||||
<OCR_RVCT9>
|
||||
<Type>0</Type>
|
||||
<StartAddress>0x20000000</StartAddress>
|
||||
<Size>0xc000</Size>
|
||||
<Size>0x10000</Size>
|
||||
</OCR_RVCT9>
|
||||
<OCR_RVCT10>
|
||||
<Type>0</Type>
|
||||
|
||||
@@ -1,8 +0,0 @@
|
||||
*** Using Compiler 'V5.06 update 7 (build 960)', folder: 'C:\Keil_v5\ARM\ARMCC\Bin'
|
||||
Build target 'TCP2UART'
|
||||
compiling tcp_client.c...
|
||||
linking...
|
||||
Program Size: Code=84560 RO-data=2496 RW-data=432 ZI-data=47056
|
||||
FromELF: creating hex file...
|
||||
"TCP2UART\TCP2UART.axf" - 0 Error(s), 0 Warning(s).
|
||||
Build Time Elapsed: 00:00:01
|
||||
@@ -39,7 +39,7 @@ __initial_sp
|
||||
; <o> Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>
|
||||
; </h>
|
||||
|
||||
Heap_Size EQU 0x200
|
||||
Heap_Size EQU 0x400
|
||||
|
||||
AREA HEAP, NOINIT, READWRITE, ALIGN=3
|
||||
__heap_base
|
||||
|
||||
+8
-8
@@ -70,11 +70,11 @@ FREERTOS.configCHECK_FOR_STACK_OVERFLOW=2
|
||||
FREERTOS.configMAX_PRIORITIES=7
|
||||
FREERTOS.configMINIMAL_STACK_SIZE=128
|
||||
FREERTOS.configSUPPORT_DYNAMIC_ALLOCATION=1
|
||||
FREERTOS.configSUPPORT_STATIC_ALLOCATION=0
|
||||
FREERTOS.configSUPPORT_STATIC_ALLOCATION=1
|
||||
FREERTOS.configTICK_RATE_HZ=1000
|
||||
FREERTOS.configTOTAL_HEAP_SIZE=10240
|
||||
FREERTOS.configTOTAL_HEAP_SIZE=15360
|
||||
FREERTOS.configUSE_COUNTING_SEMAPHORES=1
|
||||
FREERTOS.configUSE_IDLE_HOOK=0
|
||||
FREERTOS.configUSE_IDLE_HOOK=1
|
||||
FREERTOS.configUSE_MALLOC_FAILED_HOOK=1
|
||||
FREERTOS.configUSE_MUTEXES=1
|
||||
FREERTOS.configUSE_PREEMPTION=1
|
||||
@@ -83,7 +83,7 @@ FREERTOS.configUSE_TICK_HOOK=0
|
||||
File.Version=6
|
||||
GPIO.groupedBy=Group By Peripherals
|
||||
KeepUserPlacement=false
|
||||
Mcu.CPN=STM32F103RCT6
|
||||
Mcu.CPN=STM32F103RDT6
|
||||
Mcu.Family=STM32F1
|
||||
Mcu.IP0=DMA
|
||||
Mcu.IP1=FREERTOS
|
||||
@@ -123,7 +123,7 @@ Mcu.Pin20=VP_TIM4_VS_ClockSourceINT
|
||||
Mcu.PinsNb=21
|
||||
Mcu.ThirdPartyNb=0
|
||||
Mcu.UserConstants=
|
||||
Mcu.UserName=STM32F103RCTx
|
||||
Mcu.UserName=STM32F103RDTx
|
||||
MxCube.Version=6.16.1
|
||||
MxDb.Version=DB.6.0.161
|
||||
NVIC.BusFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false
|
||||
@@ -182,7 +182,7 @@ PC13-TAMPER-RTC.Signal=GPIO_Output
|
||||
PCC.Checker=false
|
||||
PCC.Line=STM32F103
|
||||
PCC.MCU=STM32F103R(C-D-E)Tx
|
||||
PCC.PartNumber=STM32F103RCTx
|
||||
PCC.PartNumber=STM32F103RDTx
|
||||
PCC.Series=STM32F1
|
||||
PCC.Temperature=25
|
||||
PCC.Vdd=3.3
|
||||
@@ -200,12 +200,12 @@ ProjectManager.CoupleFile=true
|
||||
ProjectManager.CustomerFirmwarePackage=
|
||||
ProjectManager.DefaultFWLocation=true
|
||||
ProjectManager.DeletePrevious=true
|
||||
ProjectManager.DeviceId=STM32F103RCTx
|
||||
ProjectManager.DeviceId=STM32F103RDTx
|
||||
ProjectManager.FirmwarePackage=STM32Cube FW_F1 V1.8.7
|
||||
ProjectManager.FreePins=false
|
||||
ProjectManager.FreePinsContext=
|
||||
ProjectManager.HalAssertFull=false
|
||||
ProjectManager.HeapSize=0x200
|
||||
ProjectManager.HeapSize=0x400
|
||||
ProjectManager.KeepUserCode=true
|
||||
ProjectManager.LastFirmware=true
|
||||
ProjectManager.LibraryCopy=0
|
||||
|
||||
@@ -520,8 +520,8 @@ FreeRTOS 可管理的中断优先级必须 >= `configMAX_SYSCALL_INTERRUPT_PRIOR
|
||||
| Flash | 256 KB | 384 KB |
|
||||
| SRAM | 48 KB | 64 KB |
|
||||
| 引脚 | LQFP64 | LQFP64(完全兼容) |
|
||||
| 启动文件 | `startup_stm32f103xe.s` | `startup_stm32f103xd.s` |
|
||||
| 宏定义 | `STM32F103xE` | `STM32F103xD` |
|
||||
| 启动文件 | `startup_stm32f103xe.s` | `startup_stm32f103xe.s` |
|
||||
| 宏定义 | `STM32F103xE` | `STM32F103xE` |
|
||||
| Flash 算法 | `STM32F10x_HD` | `STM32F10x_HD`(相同) |
|
||||
| SRAM 大小 | `0xC000` | `0x10000` |
|
||||
| Flash 大小 | `0x40000` | `0x60000` |
|
||||
|
||||
Reference in New Issue
Block a user