cancel
Showing results for 
Search instead for 
Did you mean: 

Configuring PPP on STM32F407DISC with LTE Modem via USART Using LWIP and Ethernet Without Pin Usage

Noushadalik
Associate III

Hello,
I'm working with an STM32F407DISC and an LTE modem connected via USART. I want to configure PPP communication using LWIP. Could you explain how to set up PPP in this context(ioc file)?
Additionally, is it possible to enable the Ethernet (ETH) interface without using its physical pins, just for PPP over serial?

1 ACCEPTED SOLUTION

Accepted Solutions
KDJEM.1
ST Employee

Hello @Noushadalik ,

 

I confirm that the steps shared in this post are developed to set PPP for STM32H747 MCU but you get inspired from these steps to set PPP for STM32F407. The DCache is not available in STM32F407.

To set PPP in STM32F407G-DISC1:

-1- Configure the ethernet as shown in the below figure ( RMII mode for example)

KDJEM1_0-1728029749989.png

2- Enable LWIP

KDJEM1_1-1728029975471.png

  • Use PPP_SUPPORT requires PPPOS_SUPPORT, PPPOE_SUPPORT or PPPOL2TP_SUPPORT turned on.
  • PPP_SUPPORT needs also PPP_IPV4_SUPPORT and/or PPP_IPV6_SUPPORT turned on.

Currently STM32CubeMx do not give possibility to select LwIp Middleware without to have previously selected Ethernet. So, you can enable LWIP only if ETH IP is configured.

 

Thank you.

Kaouthar

To give better visibility on the answered topics, please click on Accept as Solution on the reply which solved your issue or answered your question.

View solution in original post

6 REPLIES 6
Noushadalik
Associate III

Hello,
Any update Today?

KDJEM.1
ST Employee

Hello @Noushadalik ,

According how to set PPP, I advise you to take a look at this post: Solved: Re: how to set PPP with lte modem - STMicroelectronics Community  may help you.

Thank you.

Kaouthar

To give better visibility on the answered topics, please click on Accept as Solution on the reply which solved your issue or answered your question.

hello @ KDJEM.1,

I saw the thread on STM32H747 MCU PPP configuration. Does it apply to the STM32F407 MCU?
I am unable to set the second step, "Enable DCache," in the STM32F407 IOC file.

Are ETH pins unavailable for other functionalities when using only the lwIP PPP?


 
KDJEM.1
ST Employee

Hello @Noushadalik ,

 

I confirm that the steps shared in this post are developed to set PPP for STM32H747 MCU but you get inspired from these steps to set PPP for STM32F407. The DCache is not available in STM32F407.

To set PPP in STM32F407G-DISC1:

-1- Configure the ethernet as shown in the below figure ( RMII mode for example)

KDJEM1_0-1728029749989.png

2- Enable LWIP

KDJEM1_1-1728029975471.png

  • Use PPP_SUPPORT requires PPPOS_SUPPORT, PPPOE_SUPPORT or PPPOL2TP_SUPPORT turned on.
  • PPP_SUPPORT needs also PPP_IPV4_SUPPORT and/or PPP_IPV6_SUPPORT turned on.

Currently STM32CubeMx do not give possibility to select LwIp Middleware without to have previously selected Ethernet. So, you can enable LWIP only if ETH IP is configured.

 

Thank you.

Kaouthar

To give better visibility on the answered topics, please click on Accept as Solution on the reply which solved your issue or answered your question.

Hi  KDJEM.1
Thanks for your valuable support
I have successfully established a PPP connection and obtained an IP address. However, when I attempted an ICMP ping to Google, I did not receive a successful response. Below is my code snippet; could you check if any changes are needed?
PPOS code snippet:

 

void PPPosClientThread() { osSemaphoreWait(pppos_mutex, PPPOSMUTEX_TIMEOUT); pppos_task_started = 1; osSemaphoreRelease(pppos_mutex); int gsmCmdIter = 0; int nfail = 0; printf("GSM: Starting Modem thread\r\n"); char* data = (char*) malloc(BUF_SIZE); char PPP_ApnATReq[sizeof(CONFIG_GSM_APN) + 24]; sprintf(PPP_ApnATReq, "AT+CGDCONT=1,\"IP\",\"%s\"\r\n", CONFIG_GSM_APN); cmd_APN.cmd = PPP_ApnATReq; cmd_APN.cmdSize = strlen(PPP_ApnATReq); //_disconnect(1); // Disconnect if connected // FOR testing osSemaphoreWait(pppos_mutex, PPPOSMUTEX_TIMEOUT); pppos_tx_count = 0; pppos_rx_count = 0; gsm_status = GSM_STATE_FIRSTINIT; osSemaphoreRelease(pppos_mutex); // GSM reset pin functionality required enableAllInitCmd(); while (1) { while (gsmCmdIter < GSM_InitCmdsSize) { if (GSM_Init[gsmCmdIter]->skip) { #if GSM_DEBUG infoCommand(GSM_Init[gsmCmdIter]->cmd, GSM_Init[gsmCmdIter]->cmdSize, "Skip command:"); #endif gsmCmdIter++; continue; } if (atCmd_waitResponse(GSM_Init[gsmCmdIter]->cmd, GSM_Init[gsmCmdIter]->cmdResponseOnOk, NULL, GSM_Init[gsmCmdIter]->cmdSize, GSM_Init[gsmCmdIter]->timeoutMs, NULL, 0) == 0) { // * No response or not as expected, start from first initialization command #if GSM_DEBUG printf("GSM: Wrong response, restarting...\r\n"); #endif nfail++; if (nfail > 20) goto exit; osDelay(3000); gsmCmdIter = 0; continue; } if (GSM_Init[gsmCmdIter]->delayMs > 0) osDelay(GSM_Init[gsmCmdIter]->delayMs); GSM_Init[gsmCmdIter]->skip = 1; if (GSM_Init[gsmCmdIter] == &cmd_Reg) GSM_Init[gsmCmdIter]->delayMs = 0; // Next command gsmCmdIter++; } #if GSM_DEBUG printf("GSM: GSM initialized.\r\n"); #endif osSemaphoreWait(pppos_mutex, PPPOSMUTEX_TIMEOUT); if(gsm_status == GSM_STATE_FIRSTINIT) { osSemaphoreRelease(pppos_mutex); // ** After first successful initialization create PPP control block ppp = pppos_create(&ppp_netif, ppp_output_callback, ppp_status_cb, NULL); if (ppp == NULL) { #if GSM_DEBUG printf("GSM: Error initializing PPPoS\r\n"); #endif break; // end task } } else osSemaphoreRelease(pppos_mutex); //ppp_set_default(ppp); netif_set_default(&ppp_netif); //ppp_set_auth(ppp, PPPAUTHTYPE_ANY, "", ""); osSemaphoreWait(pppos_mutex, PPPOSMUTEX_TIMEOUT); gsm_status = GSM_STATE_IDLE; osSemaphoreRelease(pppos_mutex); ppp_connect(ppp,0); while(1) { // === Check if disconnect requested === osSemaphoreWait(pppos_mutex, PPPOSMUTEX_TIMEOUT); if (do_pppos_connect <= 0) { int end_task = do_pppos_connect; do_pppos_connect = 1; osSemaphoreRelease(pppos_mutex); #if GSM_DEBUG printf("\r\n"); printf("GSM: Disconnect requested.\r\n"); #endif ppp_close(ppp, 0); int gstat = 1; while (gsm_status != GSM_STATE_DISCONNECTED) { // Handle data received from GSM memset(data, 0, BUF_SIZE); int len = UART_Read(data, BUF_SIZE, 30); if (len > 0) { pppos_input_tcpip(ppp, (u8_t*)data, len); osSemaphoreWait(pppos_mutex, PPPOSMUTEX_TIMEOUT); pppos_tx_count += len; osSemaphoreRelease(pppos_mutex); } osSemaphoreWait(pppos_mutex, PPPOSMUTEX_TIMEOUT); gstat = gsm_status; osSemaphoreRelease(pppos_mutex); } osDelay(1000); osSemaphoreWait(pppos_mutex, PPPOSMUTEX_TIMEOUT); uint8_t rfoff = gsm_rfOff; osSemaphoreRelease(pppos_mutex); _disconnect(rfoff); // Disconnect GSM if still connected #if GSM_DEBUG printf("GSM: Disconnected.\r\n"); #endif gsmCmdIter = 0; enableAllInitCmd(); osSemaphoreWait(pppos_mutex, PPPOSMUTEX_TIMEOUT); gsm_status = GSM_STATE_IDLE; do_pppos_connect = 0; osSemaphoreRelease(pppos_mutex); if (end_task < 0) goto exit; // === Wait for reconnect request === gstat = 0; while (gstat == 0) { osDelay(100); osSemaphoreWait(pppos_mutex, PPPOSMUTEX_TIMEOUT); gstat = do_pppos_connect; osSemaphoreRelease(pppos_mutex); } #if GSM_DEBUG printf("\r\n"); printf("GSM: Reconnect requested.\r\n"); #endif break; } // === Check if disconnected === if (gsm_status == GSM_STATE_DISCONNECTED) { osSemaphoreRelease(pppos_mutex); #if GSM_DEBUG printf("\r\n"); printf("GSM: Disconnected, trying again...\r\n"); #endif ppp_close(ppp, 0); _disconnect(1); enableAllInitCmd(); gsmCmdIter = 0; gsm_status = GSM_STATE_IDLE; osDelay(10000); break; } else osSemaphoreRelease(pppos_mutex); // === Handle data received from GSM === memset(data, 0, BUF_SIZE); int len = UART_Read(data, BUF_SIZE, 50); if (len > 0) { //printf("RX: %d\r\n", len); //printf("data :%s\r\n",data); pppos_input_tcpip(ppp, (u8_t*)data, len); osSemaphoreWait(pppos_mutex, PPPOSMUTEX_TIMEOUT); pppos_tx_count += len; osSemaphoreRelease(pppos_mutex); } } // Handle GSM modem responses & disconnects loop } // main task loop exit: if (data) free(data); // free data buffer if (ppp) ppp_free(ppp); osSemaphoreWait(pppos_mutex, PPPOSMUTEX_TIMEOUT); pppos_task_started = 0; gsm_status = GSM_STATE_FIRSTINIT; osSemaphoreRelease(pppos_mutex); #if GSM_DEBUG printf("GSM: PPPoS TASK TERMINATED\r\n"); #endif //osThreadTerminate(mythread); }
View more

 

Ping code snippet:

 

void start_ping_action() { //get gateway IP from global net interface ip_addr_t gw_addr = ppp_netif.ip_addr; uint8_t gw_ip_part_1 = ip4_addr1(&gw_addr); //check if DHCP already succeeded by checking against non 0 ip part int ret = 0; if(gw_ip_part_1 != 0) { ip_addr_t target_ping_ip; //select target: //gateway //target_ping_ip = gw_addr; //static IPs //IP_ADDR4(&target_ping_ip, 192,168,1,180); IP_ADDR4(&target_ping_ip, 216,58,213,195); //google.com //IP_ADDR4(&target_ping_ip, 8, 8, 8, 8); // Google's DNS printf("Starting to ping IP: %d.%d.%d.%d.\r\n", (int)ip4_addr1(&target_ping_ip), (int)ip4_addr2(&target_ping_ip), (int)ip4_addr3(&target_ping_ip), (int)ip4_addr4(&target_ping_ip)); if((ret = ping_ip(target_ping_ip)) != PING_ERR_OK) { printf("Error while sending ping: %d\r\n", ret); } } //every 4 seconds, start a new ping attempt sys_timeout(4000, start_ping_action, NULL); } void check_ping_result() { ping_result_t res; memset(&res, 0, sizeof(res)); int retcode = 0; if((retcode = ping_ip_result(&res)) == PING_ERR_OK) { if (res.result_code == PING_RES_ECHO_REPLY) { printf("Good ping from %s %u ms\r\n", ipaddr_ntoa(&res.response_ip), (unsigned) res.response_time_ms); } else { printf("Bad ping err %d\r\n", res.result_code); } } else { //printf("No ping result available yet: %d\n", retcode); } sys_timeout(100, check_ping_result, NULL); } /* USER CODE END 0 */ /** * @brief The application entry point. * @retval int */
View more

 


Output logs:

 

UART6 init done GSM: Starting Modem thread GSM: AT COMMAND: [AT..] GSM: AT RESPONSE: [..OK..] GSM: AT COMMAND: [ATD*99#..] GSM: AT RESPONSE: [..CONNECT 115200..] GSM: GSM initialized. GSM: ppp_status_cb: 0 GSM: status_cb: Connected GSM: ipaddr = 10.220.50.XXX GSM: gateway = 10.64.64.XX GSM: netmask = 255.255.255.255 GSM: LTE Init done Starting StartDefaultTask IP:10.220.50.142 Starting to ping IP: 216.58.213.XXX. Ping timed out Bad ping err 0 Starting to ping IP: 216.58.213.XXX. Ping timed out Bad ping err 0 Starting to ping IP: 216.58.213.XXX. Ping timed out Bad ping err 0 Starting to ping IP: 216.58.213.XXX.

 





 

Hello @Noushadalik ,

 

>I have successfully established a PPP connection and obtained an IP address. However, when I attempted an ICMP ping to Google, I did not receive a successful response. Below is my code snippet; could you check if any changes are needed?

I think your initial request is answered "Could you explain how to set up PPP in this context(ioc file)?".  Could you please create a new thread for receive response issue.

 

Thank you for your contribution in STCommunity.

Kaouthar

To give better visibility on the answered topics, please click on Accept as Solution on the reply which solved your issue or answered your question.