0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

瑞萨RA系列FSP库开发实战指南之上手实践FreeRTOS+TCP移植实验

瑞萨嵌入式小百科 来源:野火电子 2026-06-04 09:47 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

32.6

FreeRTOS+TCP移植实验

32.6.1

硬件设计

野火启明6M5开发板的以太网相关电路如图所示。

wKgZPGog2YeAHk5HAAOMNk5qhR4532.png

点击可查看大图

32.6.2

软件设计

32.6.2.1

新建工程

对于e2studio开发环境:在e2studio工作空间中新建工程,工程名为“34_Ethernet_FreeRTOS”。新建工程时要注意选择FreeRTOS。

对于Keil开发环境:首先在指定的路径新建文件夹:“34_Ethernet_FreeRTOS”,用于存放我们即将新建的Keil工程。打开RASC软件来新建工程,工程路径选到“34_Ethernet_FreeRTOS”文件夹下面,工程名为“EBF_RA6M5”。新建工程时要注意选择FreeRTOS。

工程新建好之后,在工程根目录的“src”文件夹下面新建源文件“ether_phy_target_lan8720.c”,该文件是LAN8720的底层驱动文件。再新建源文件和头文件:“net_user_app.c”和“net_user_app.h”。

由于调试需要,可将LED和串口的驱动文件拷贝过来:直接复制前面例程里面的“led”和“debug_uart”文件夹并粘贴到工程根目录的“src”文件夹下面。

工程文件结构如下。

列表1: 文件结构

左右滑动查看完整内容

34_Ethernet_FreeRTOS
├─ ......
└─src
├─ led
│ ├─ bsp_led.c
│ └─ bsp_led.h
├─ debug_uart
│ ├─ bsp_debug_uart.c
│ └─ bsp_debug_uart.h
├─ ether_phy_target_lan8720.c
├─ net_user_app.c
├─ net_user_app.h
├─ net_thread_entry.c
└─ hal_entry.c

其中net_thread_entry.c该源文件若是不存在则会由软件自动生成,若存在,软件生成代码时该文件不会被覆盖。

32.6.2.2

FSP配置

使用e2studio环境的用户使用printf注意需要对工程做如图所示的设置:

wKgZPGog2YeALA5cAAEL28N6ON4239.png

点击可查看大图

在FSP配置界面的BSP页面,分配主栈大小为0x1000、堆大小为0x2000,如下图所示:

wKgZO2og2YeAD2d7AABwdIVFSzo520.png

点击可查看大图

32.6.2.2.1

配置RMII引脚和LAN8720复位引脚

根据硬件原理图,我们需要配置连接PHY LAN8720 的RMII引脚,以及LAN8720复位引脚。LAN8720的复位引脚为P802,由于复位引脚是低电平有效,可直接配置为输出高电平模式即可,如下图所示。

wKgZPGog2YiASrQtAACcod_7C7s878.png

点击可查看大图

RMII 引脚配置如下图所示。

wKgZO2og2YiARB6sAAEQ1ep73A8491.png

点击可查看大图

32.6.2.2.2

配置FreeRTOS和线程

首先新建一个线程:Net Thread(网络线程),该线程用于运行网络协议栈,然后向其中添加:FreeRTOS Heap 4和FreeRTOS+TCP。步骤如下。

在Threads区域点击“New Thread”按钮,新建得到一个默认名为“New Thread”线程。

wKgZPGog2YiAB2SfAACGP-0QagE053.png

点击可查看大图

线程名“New Thread”会在后面对线程进行配置时更改为“Net Thread”。现在让我们先在这个线程下面添加:FreeRTOS Heap 4和FreeRTOS+TCP。

添加FreeRTOS Heap 4步骤:“New Stack”→“RTOS”→“FreeRTOS Heap 4”。

wKgZO2og2YiAV6i2AADKeMtnbRo213.png

点击可查看大图

添加FreeRTOS+TCP步骤:“New Stack”→“Networking”→“FreeRTOS+TCP”。

wKgZO2og2YmAczFpAAIzufSvO3c809.png

点击可查看大图

添加完成后的结果如下图所示。

wKgZPGog2YmAbL30AACVpqUkZkQ202.png

点击可查看大图

接下来继续设置该线程的参数。点击“New Thread”线程,如下图所示。

wKgZPGog2YmADvtUAAK9YeO0sgo070.png

点击可查看大图

上图中出现两个区域的配置属性,其中①是FreeRTOS全局的配置属性,②是“New Thread”这个线程的配置属性。

首先,按照下表的描述来配置“New Thread”线程。

表3:FreeRTOS配置属性:“Thread”部分

wKgZO2og2YqAHrSNAAEntzBzoVU713.png

点击可查看大图

FreeRTOS 全局的配置如下:

FreeRTOS 配置属性:“Common”部分

属性 描述
General > Custom FreeRTOSConfig.h 为自定义 FreeRTOSConfig.h 文件添加路径。
它可用于覆盖此处定义的部分或全部配置,并定义其他配置。
没有自定义文件 FreeRTOSConfig.h 的话留空即可。
General > Use Preemption Enabled
Enabled:使用抢占式RTOS调度。
Disabled:使用协作式RTOS调度。
General > Use Port Optimised Task Selection Disabled
启用端口优化任务选择。
General > Use Tickless Idle Disabled
General > Cpu Clock Hz SystemCoreClock
CPU时钟频率。
General > Tick Rate Hz 100
RTOS 滴答中断的频率。
General > Max Priorities 5
应用程序任务可用的优先级数。任意数量的任务可以共享相同的优先级。
General > Minimal Stack Size 512
空闲任务使用的堆栈的大小。单位为字,而不是字节。
General > Max Task Name Len 16
任务名称的最大允许长度。该长度包括 NULL 终止字节。
General > Use 16-bit Ticks Disabled
使用16位Ticks将大大提高8位和16位架构的性能,
但是会大大减少任务可以延迟或阻塞的最大时间。
General > Idle Should Yield Enabled
General > Use Task Notifications Disabled
使用任务通知。
General > Use Mutexes Disabled
使用互斥量。
General > Use Recursive Mutexes Disabled
使用递归互斥量。
General > Use Counting Semaphores Enabled
使用计数信号量。
General > Queue Registry Size 10
队列注册表大小。
General > Use Queue Sets Disabled
使用队列集。
General > Use Time Slicing Disabled
使用时间切片。
General > Use Newlib Reentrant Disabled
使用Newlib可重入。
General > Enable Backward Compatibility Disabled
使能向后兼容。
General > Num Thread Local Storage Pointers 5
设置每个任务的线程本地存储数组中的索引数。
General > Stack Depth Type uint32_t
栈深度类型。
General > Message Buffer Length Type size_t
FreeRTOS 消息缓冲区使用消息缓冲区长度类型的变量来存储每条消息的长度。
如果没有定义消息缓冲区长度类型,那么它将默认为 size_t。
General > Library Max Syscall Interrupt Priority Priority 1
General > Assert if (!(x)) {__BKPT(0);}
General > Include Application Defined Privileged Functions Disabled
Hooks > Use Idle Hook Enabled
如果希望使用空闲钩子,则将其设置为“启用”,或者“禁用”以省略空闲钩子。
Hooks > Use Malloc Failed Hook Disabled
Hooks > Use Daemon Task Startup Hook Disabled
Hooks > Use Tick Hook Disabled
Hooks > Check For Stack Overflow Disabled
Stats > Use Trace Facility Disabled
Stats > Use Stats Formatting Functions Disabled
Stats > Generate Run Time Stats Disabled
Memory Allocation > Support Static Allocation Enabled
支持静态内存分配。
Memory Allocation > Support Dynamic Allocation Enabled
支持动态内存分配。
Memory Allocation > Total Heap Size 0x8000
FreeRTOS 堆中可用的 RAM 总量。
Memory Allocation > Application Allocated Heap Disabled
Timers > Use Timers Enabled
使用软件定时器功能。
Timers > Timer Task Priority 3
定时器任务优先级。
Timers > Timer Queue Length 10
定时器队列长度。
Timers > Timer Task Stack Depth 128
定时器任务栈深度。
设置分配给软件计时器服务/守护进程任务的堆栈深度。
Optional Functions > vTaskPrioritySet() Function Enabled
包含 vTaskPrioritySet() 函数。
Optional Functions > uxTaskPriorityGet() Function Enabled
包含 uxTaskPriorityGet() 函数。
Optional Functions > vTaskDelete() Function Enabled
包含 vTaskDelete() 函数。
Optional Functions > vTaskSuspend() Function Enabled
包含 vTaskSuspend() 函数。
Optional Functions > xResumeFromISR() Function Disabled
Optional Functions > vTaskDelayUntil() Function Enabled
包含 vTaskDelayUntil() 函数。
Optional Functions > vTaskDelay() Function Enabled
包含 vTaskDelay() 函数。
Optional Functions > xTaskGetSchedulerState() Function Enabled
包含 xTaskGetSchedulerState() 函数。
Optional Functions > xTaskGetCurrentTaskHandle() Function Enabled
包含 xTaskGetCurrentTaskHandle() 函数。
Optional Functions > uxTaskGetStackHighWaterMark() Function Disabled
Optional Functions > xTaskGetIdleTaskHandle() Function Disabled
Optional Functions > eTaskGetState() Function Disabled
Optional Functions > xEventGroupSetBitFromISR() Function Enabled
包含 xEventGroupSetBitFromISR() 函数。
Optional Functions > xTimerPendFunctionCall() Function Disabled
Optional Functions > xTaskAbortDelay() Function Disabled
Optional Functions > xTaskGetHandle() Function Disabled
Optional Functions > xTaskResumeFromISR() Function Enabled
包含 xTaskResumeFromISR() 函数。
RA > Hardware Stack Monitor Disabled
Logging > Print String Function printf(x)
Logging > Logging Max Message Length 192
Logging > Logging Include Time and Task Name Disabled

35.6.2.2.3.配置 FreeRTOS+TCP

点击“FreeRTOS+TCP”模块,如下图所示。

FreeRTOS+TCP 的属性配置如下:

FreeRTOS+TCP 的配置属性

属性 描述
Print debug messages Disabled
打印调试信息。
Print info messages Disabled
打印 info 信息。
Byte order of the target MCU pdFREERTOS_LITTLE_ENDIAN
IP/TCP/UDP checksums Enabled
计算 IP/TCP/UDP 校验和。
Receive Block Time 2000
FreeRTOS_recv() 阻塞的时间量。可以使用 setsockopt() 设置每个套接字的超时。
Send Block Time 2000
FreeRTOS_send() 阻塞的时间量。可以使用 setsockopt() 设置每个套接字的超时。
DNS caching Disabled
DNS 缓存。
DNS Request Attempts 5
DNS 请求尝试。
IP stack task priority configMAX_PRIORITIES - 1
设置执行IP栈任务的优先级。
Stack size in words (not bytes) configMINIMAL_STACK_SIZE * 10
为 FreeRTOS+TCP 设置栈大小,单位为字。
Network Events call vApplicationIPNetworkEventHook Disabled
当网络连接或断开时,vApplicationIPNetworkEventHook 会被调用。
Max UDP send block time 15000 / portTICK_PERIOD_MS
最大 UDP 发送块时间。
Use DHCP Enabled
使用 DHCP。
DHCP Register Hostname Enabled
使用 DHCP 时注册主机名。
DHCP Uses Unicast Enabled
DHCP 使用单播。
DHCP Send Discover After Auto IP Enabled
DHCP callback function Enabled
需提供 DHCP 回调函数:xApplicationDHCPHook。
Interval between transmissions 120000 / portTICK_PERIOD_MS
ARP Cache Entries 6
ARP 缓存条目。
ARP Request Retransmissions 5
ARP 请求重传次数。
Maximum time before ARP table entry becomes stale 150
创建或刷新 ARP 表中的条目与删除该条目之间的最长时间。
Use string for IP Address Enabled
使用字符串表示IP地址。
Total number of available network buffers 16
网络数据包缓冲的总数
Set the maximum number of events ipconfigNUM_NETWORK_BUFFER_DESCRIPTORS + 5
Enable FreeRTOS_sendto() without calling Bind Disabled
TTL values for UDP packets 128
TTL values for TCP packets 128
Use TCP and all its features Enabled
使用 TCP 及其所有特性。
Let TCP use windowing mechanism Disabled
让 TCP 使用滑动窗口机制。
Maximum number of bytes the payload of a network frame can contain 1500
MTU 大小。
Basic DNS client or resolver Enabled
基本的 DNS 客户端/解析器
Reply to incoming ICMP echo (ping) requests Enabled
应答 ICMP echo (ping) 请求。
FreeRTOS_SendPingRequest() is available Enabled
允许使用 FreeRTOS_SendPingRequest()。
对应 ipconfigREPLY_TO_INCOMING_PINGS 宏配置。
FreeRTOS_select() (and associated) API function is available Disabled
Filter out non Ethernet II frames. Enabled
过滤掉非以太网 II 格式的以太网帧。
Responsibility of the Ethernet interface to filter out packets Disabled
Send RST packets, when receive unknown packets. Enabled
Access 32-bit fields in the IP packets 2
Size of the pool of TCP window descriptors 240
Size of Rx buffer for TCP sockets 3000
Size of Tx buffer for TCP sockets 3000
TCP keep-alive Enabled
TCP keep-alive interval 120
The socket semaphore to unblock the MQTT task (USER_SEMAPHORE) Disabled
The socket semaphore to unblock the MQTT task (WAKE_CALLBACK) Enabled
The socket semaphore to unblock the MQTT task (USE_CALLBACKS) Disabled
The socket semaphore to unblock the MQTT task (TX_DRIVER) Disabled
The socket semaphore to unblock the MQTT task (RX_DRIVER) Disabled
Possible optimisation for expert users Disabled

35.6.2.2.4.配置 ETHERC 和 PHY

点击“g_ether0”模块,如下图所示。

在左下角属性配置窗口进行配置,g_ether0 的属性配置如下:

g_ether0 的配置属性

属性 描述
Common > Parameter Checking Default (BSP)
Common > ET0_LINKSTA Pin Status Flag Fall -> Rise
设置 LINKSTA 状态变化。
Common > Link Signal Change Flag Unused
使用 LINKSTA 信号检测链路状态变化。
General > Name g_ether0
General > Channel 0
General > MAC address 00:11:22:33:44:55
General > Zero-copy Mode Disabled
General > Flow control functionality Disabled
Filters > Multicast Mode Enabled
Filters > Promiscuous Mode Disabled
Filters > Broadcast filter 0
Buffers > Number of TX buffer 4
Buffers > Number of RX buffer 4
Buffers > Allocate RX buffer Enabled
Buffers > Buffer size 1514
Buffers > Padding size Disabled
自动插入到接收数据包中的填充大小。
Buffers > Padding offset 1
在接收缓冲区中插入填充字节的偏移量。
Interrupts > Interrupt priority Priority 12
选择 EDMAC 中断优先级。
Interrupts > Callback vEtherISRCallback
该中断回调函数是固定的,无法变更。

点击“g_ether_phy0”模块,如下图所示。

在左下角属性配置窗口进行配置,PHY 的属性配置如下:

Common 部分

属性 描述
Parameter Checking Default
Select PHY(DEPRECATED) Default
KSZ8091RNZ Target Disabled
KSZ8041 Target Disabled
DP83620 Target Disabled
ICS1894 Target Disabled
Reference Clock Default

Ethernet PHY 的配置属性

属性 描述
Name g_ether_phy0
Channel 0
PHY-LSI Address 0
PHY-LSI Reset Completion Timeout 0x00020000
Select MII type RMII
Phy LSI type Kit Component
MII/RMII Register Access Wait-time 8
Flow Control Disabled

35.6.2.3.PHY底层驱动函数

代码清单34-1:PHY底层驱动函数

 /* Access to peripherals and board defines. */
 #include "bsp_api.h"
 #include "r_ether_phy.h"

 #include "hal_data.h"
 #include "stdio.h"

 /***********************************************************************************************************************
 * Macro definitions
 ***********************************************************************************************************************/

 /***********************************************************************************************************************
 * Typedef definitions
 ***********************************************************************************************************************/


 /* LAN8720 */
 #define ETHER_PHY_REG_SPECIAL_CONTROL_INDICATION    27
 #define ETHER_PHY_AMDIXCTRL_DISABLE                 (1u<<15)
 #define ETHER_PHY_CH_SELECT                         (0u<<13)

 /* Standard PHY Registers */
 #define ETHER_PHY_REG_CONTROL                   (0)
 #define ETHER_PHY_REG_STATUS                    (1)
 #define ETHER_PHY_REG_IDENTIFIER1               (2)
 #define ETHER_PHY_REG_IDENTIFIER2               (3)
 #define ETHER_PHY_REG_AN_ADVERTISEMENT          (4)
 #define ETHER_PHY_REG_AN_LINK_PARTNER           (5)
 #define ETHER_PHY_REG_AN_EXPANSION              (6)


 /***********************************************************************************************************************
 * Exported global variables (to be accessed by other files)
 ***********************************************************************************************************************/

 /***********************************************************************************************************************
 * Exported global function
 ***********************************************************************************************************************/
 void ether_phy_targets_initialize(ether_phy_instance_ctrl_t * p_instance_ctrl);
 bool ether_phy_targets_is_support_link_partner_ability(ether_phy_instance_ctrl_t * p_instance_ctrl,
                                                       uint32_t                    line_speed_duplex);
 extern uint32_t ether_phy_read(ether_phy_instance_ctrl_t * p_instance_ctrl, uint32_t reg_addr);
 extern void     ether_phy_write(ether_phy_instance_ctrl_t * p_instance_ctrl, uint32_t reg_addr, uint32_t data);

 /***********************************************************************************************************************
 * Private global variables and functions
 ***********************************************************************************************************************/

 /***********************************************************************************************************************
 * Functions
 **********************************************************************************************************************/

 /***********************************************************************************************************************
 * Function Name: ether_phy_targets_initialize
 * Description  : PHY-LSI specific initialization processing
 * Arguments    : p_api_ctrl -
 *                    Ethernet channel number
 * Return Value : none
 ***********************************************************************************************************************/
 void ether_phy_targets_initialize (ether_phy_instance_ctrl_t * p_instance_ctrl)
 {
     uint32_t reg;

     /* HP Auto-MDIX */
     /* Read the special control/status indications register (Register Index: 27) */
     reg = ether_phy_read(p_instance_ctrl, ETHER_PHY_REG_SPECIAL_CONTROL_INDICATION);
     /* Disable Auto-MDIX and set MDI (TX=transmits, RX=receives) */
     reg |= (uint16_t) (ETHER_PHY_AMDIXCTRL_DISABLE | ETHER_PHY_CH_SELECT);
     /* Write the settings back to the special control/status indications register (Register Index: 27) */
     ether_phy_write(p_instance_ctrl, ETHER_PHY_REG_SPECIAL_CONTROL_INDICATION, reg);

 #ifdef ETHERNET_PHY_DEBUG
     //Dump PHY registers for debugging purpose
     lan8720DumpPhyReg(p_instance_ctrl);
 #endif
 }

 /***********************************************************************************************************************
 * Function Name: ether_phy_targets_is_support_link_partner_ability
 * Description  : Check if the PHY-LSI connected Ethernet controller supports link ability
 * Arguments    : p_instance_ctrl -
 *                    Ethernet control block
 *                line_speed_duplex -
 *                    Line speed duplex of link partner PHY-LSI
 * Return Value : bool
 ***********************************************************************************************************************/
 bool ether_phy_targets_is_support_link_partner_ability (ether_phy_instance_ctrl_t * p_instance_ctrl,
                                                         uint32_t                    line_speed_duplex)
 {
     FSP_PARAMETER_NOT_USED(p_instance_ctrl);
     FSP_PARAMETER_NOT_USED(line_speed_duplex);

     /* This PHY-LSI supports half and full duplex mode. */
     return true;
 }                                      /* End of function ether_phy_targets_is_support_link_partner_ability() */

35.6.2.4.用户需要实现的函数

用户需要实现的以下函数:

用户需要实现的函数

 void updateDhcpResponseToUsr(void)

 eDHCPCallbackAnswer_t xApplicationDHCPHook( eDHCPCallbackPhase_t eDHCPPhase,
                                             uint32_t ulIPAddress )

 const char *pcApplicationHostnameHook(void)

 uint32_t ulRand();
 uint32_t ulApplicationGetNextSequenceNumber( uint32_t ulSourceAddress,
                                             uint16_t usSourcePort,
                                             uint32_t ulDestinationAddress,
                                             uint16_t usDestinationPort );
 uint32_t isNetworkUp(void);
 BaseType_t vSendPing( const char *pcIPAddress);
 void print_ipconfig(void);
 void print_pingResult(void);
 void dnsQuerryFunc(char *domain_name);

限于篇幅,暂不对这些函数进行详细地讲解,读者可参考例程源代码。

35.7.2.5.net_thread_entry入口函数

在使用 RTOS 并新建了一个线程的情况下,hal_entry 已经不再需要,并且网络线程的入口函数被设置为 net_thread_entry。 net_thread_entry 入口函数如下所示。

代码清单34-3:net_thread_entry入口函数

 #include "net_thread.h"
 #include "net_user_app.h"


 extern char *domain_name;
 extern char *remote_ip_address;

 extern uint8_t ucMACAddress[ 6 ];
 extern uint8_t ucIPAddress[ 4 ];
 extern uint8_t ucNetMask[ 4 ];
 extern uint8_t ucGatewayAddress[ 4 ];
 extern uint8_t ucDNSServerAddress[ 4 ];

 extern ping_data_t ping_data;
 uint32_t  usrPingCount  = RESET_VALUE;
 static uint32_t usr_print_ability = RESET_VALUE;



 /* Net Thread entry function */
 /* pvParameters contains TaskHandle_t */
 void net_thread_entry(void * pvParameters)
 {
     FSP_PARAMETER_NOT_USED(pvParameters);

     BaseType_t status = pdFALSE;
     fsp_pack_version_t version = {RESET_VALUE};


     /* 调试串口初始化 */
     Debug_UART4_Init();
     printf("Hello! FreeRTOS-Plus-TCP\r\n"
           "这是一个以太网 DNS & Ping 示例,请把网线接到开发板和路由器进行联网\r\n");

     /* 获取 FSP 库版本 */
     R_FSP_VersionGet(&version);
     /* 打印 FSP 库版本 */
     printf("Flex Software Pack Version  %d.%d.%d\r\n",
             version.version_id_b.major, version.version_id_b.minor, version.version_id_b.patch);

     printf("\r\n预置ipconfig:");
     print_ipconfig();

     /* FreeRTOS IP Initialization: This init initializes the IP stack  */
     status = FreeRTOS_IPInit(ucIPAddress, ucNetMask, ucGatewayAddress, ucDNSServerAddress, ucMACAddress);
     if(pdFALSE == status)
     {
         printf("FreeRTOS_IPInit Failed\r\n"
               "Returned Error Code: 0x%x\r\n", status);
         __asm("BKPT #0\n"); /* trap upon the error  */
     }


     /* TODO: add your own code here */
     while(1)
     {
         /* Check if Both the Ethernet Link and IP link are UP */
         if(SUCCESS == isNetworkUp())
         {
             /* usr_print_ability is added to avoid multiple UP messages or Down Messages repeating*/
             if(!(PRINT_UP_MSG_DISABLE & usr_print_ability))
             {
                 printf("\r\nNetwork is Up\r\n");
                 usr_print_ability |= PRINT_UP_MSG_DISABLE;
             }

             if(!(PRINT_NWK_USR_MSG_DISABLE & usr_print_ability))
             {
 #if( ipconfigUSE_DHCP != 0 )
                 /* Display the New IP credentials obtained from the DHCP server */
                 updateDhcpResponseToUsr();
 #endif
                 /* Updated IP credentials on to the RTT console */
                 printf("更新ipconfig:");
                 print_ipconfig();
                 /* DNS lookup for the Domain name requested. This is Synchronous Activity */
                 dnsQuerryFunc(domain_name);
             }

             if(!(PRINT_NWK_USR_MSG_DISABLE & usr_print_ability))
             {
                 printf("\r\nPinging %s:\r\n\r\n",(char *)remote_ip_address);
             }

             while (usrPingCount < USR_PING_COUNT)
             {
                 /* Send a ICMP Ping request to the requested IP address
                 * USR_PING_COUNT (100) is used in this Example Project
                 * For Continuous testing the count can be increased to bigger number
                 */
                 status =  vSendPing((char *)remote_ip_address);
                 if(status != pdFALSE)
                 {
                     ping_data.sent++;
                     printf("!");    // Ping请求发送成功
                 }
                 else
                 {
                     ping_data.lost++;
                     printf(".");
                 }
                 usrPingCount++;
                 /* Add some delay between Pings */
                 vTaskDelay(10);
             }

             if(!(PRINT_NWK_USR_MSG_DISABLE & usr_print_ability))
             {
                 print_pingResult();
                 usr_print_ability |= PRINT_NWK_USR_MSG_DISABLE;
             }
         }
         else
         {
             if(!(PRINT_DOWN_MSG_DISABLE & usr_print_ability))
             {
                 printf("\r\nNetwork is Down");
                 usr_print_ability |= PRINT_DOWN_MSG_DISABLE;
             }
             else
             {
                 printf(".");
             }
         }
         vTaskDelay(100);
     }
 }

35.6.3.下载验证

注解

运行此以太网例程需要先切换芯片DLM状态:从出厂的“CM”切换到“SSD”状态, 然后重要的是要设置 IDAU 边界。否则,Ethernet 和 EDMAC 将无法使用。

NOTE : On RA MCUs with TrustZone, IDAU boundaries are programmed by this project due to the use of Ethernet and EDMAC peripherals. Consequentially, it is necessary to connect the serial programming interface to meet this requirement.

可按照以下两种方法当中的其中任意一种进行操作后,即可正常使用本实验的以太网例程:

使用 Renesas Flash Programmer 软件手动切换RA6M5芯片的DLM状态,并且设置 IDAU 边界, 具体方法步骤请参考本教程第3章内容。

使用 J-Link 和 e2 studio 的用户可实现自动切换。 需要注意,这里的 J-Link 需要 J-Link V10 及后续的硬件版本,以前的版本以及 JLink EDU mini 不支持该功能。 J-Link 需要通过JTag接口连接到启明6M5开发板,SWD接口无法操作, 因为该操作必须在控制 P109(TDO / TXD9)和 P110(TDI / RXD9)、MD 引脚以及复位(RESET)的情况下完成。 然后在启动调试之前还需将J17排针上的跳线帽拔出,并插到J23排针上短接 SCK 和 MD 引脚, 然后使用 J-Link 在 e2 studio 环境下启动一次调试即可。

首先编译程序,并按照上述方法设置 IDAU 边界,确保能正常使用 Ethernet 和 EDMAC 外设。

将程序下载到开发板后,连接串口并打开串口助手,复位板子让程序运行。

如下图所示,可以看到程序会首先打印提示信息:

当连接网线到路由器上之后,稍等片刻,可以看到正常的程序运行结果如下图所示:

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 以太网
    +关注

    关注

    41

    文章

    6347

    浏览量

    182097
  • 瑞萨
    +关注

    关注

    38

    文章

    22552

    浏览量

    91794
  • 移植
    +关注

    关注

    1

    文章

    418

    浏览量

    29635
  • TCP
    TCP
    +关注

    关注

    8

    文章

    1441

    浏览量

    83979
  • FreeRTOS
    +关注

    关注

    14

    文章

    502

    浏览量

    67536

原文标题:上手实践FreeRTOS+TCP移植实验——瑞萨RA系列FSP库开发实战指南(117)

文章出处:【微信号:瑞萨嵌入式小百科,微信公众号:瑞萨嵌入式小百科】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    RA系列FSP开发实战指南之I2C读写EEPROM实验

    使用官方提供的FPS进行编程,官方提供的FPS具有方便、快捷、简洁的特性。
    的头像 发表于 01-27 10:02 3978次阅读
    <b class='flag-5'>瑞</b><b class='flag-5'>萨</b><b class='flag-5'>RA</b><b class='flag-5'>系列</b><b class='flag-5'>FSP</b><b class='flag-5'>库</b><b class='flag-5'>开发</b><b class='flag-5'>实战</b><b class='flag-5'>指南</b>之I2C读写EEPROM<b class='flag-5'>实验</b>

    RA8系列高性能MCU开发上手体验

    大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家介绍的是RA8系列高性能MCU开发上手体验。
    的头像 发表于 08-08 15:21 3036次阅读
    <b class='flag-5'>瑞</b><b class='flag-5'>萨</b><b class='flag-5'>RA</b>8<b class='flag-5'>系列</b>高性能MCU<b class='flag-5'>开发上手</b>体验

    e2studio(1)----芯片之搭建FSP环境

    视频教学 样品申请 请勿添加外链 e2studio软件 e2studio是的集成开发环境,FSP 提供了众多可提高效率的工具,用于开发
    发表于 09-30 15:28

    RA-Eco-RA4M2开发板评测】+VS Code 下 RA4M2 开发环境搭建与 GPIO 点灯实验教程

    软件烧录芯片程序——RA系列FSP开发
    发表于 04-15 15:12

    RA4系列开发板体验】开发环境搭建和新手点灯指南

    RA4系列开发板体验】开发环境搭建和新手点灯指南
    发表于 11-24 22:54

    RA4系列开发板体验】10. 我的试用总结

    之前发帖:【RA4系列开发板体验】1. 新建工程+按键控制LED【
    发表于 12-10 22:34

    RA4系列开发板体验】体验过程

    拿到板子之后,做了几个实验过程,过程如下:1、在好奇心驱动下,逐步接触;参照网上的实例,学习开发环境一、开箱验货二、搭建环境参考“ 【
    发表于 12-18 16:20

    RA4系列开发板体验】+ 开发环境搭建

    太多” 的公司。笔者以前用过国产的GD 国外的ST和NXP,这些公司会尽可能提供简洁的,方便用户移植。而则是提供一个无比复杂的(
    发表于 12-21 23:50

    【有奖直播预报名】电子RA系列产品开发工具之FSP4.0.0新特性介绍

    本演讲在介绍FSP的基础上,着重介绍FSP最新版本4.0.0的一些新特性。希望通过此次演讲,让各位工程师了解并熟悉RA
    的头像 发表于 11-22 12:20 1860次阅读

    【视频教程】RA单片机FSP开发(3)FSP架构-解释Blinky架构[上]

    干货分享 前篇回顾 【视频教程】RA单片机FSP开发(1)环境搭建(带RASC) 【视频教程】
    的头像 发表于 12-06 12:15 2319次阅读

    RA FreeRTOS任务创建

    开发环境e 2 studio完美支持FreeRTOS,无需额外手动移植。以下介绍如何用e 2 studio创建
    的头像 发表于 03-10 14:35 2508次阅读

    RA6M3 开发实践指南-UART实践

    RT-Thread即将发布一系列RA6M3外设驱动的实践指南,我们将使用
    的头像 发表于 09-23 12:15 3303次阅读

    RA FreeRTOS任务创建

    开发环境e2 studio完美支持FreeRTOS,无需额外手动移植。以下介绍如何用e2 studio创建
    的头像 发表于 07-12 10:00 1708次阅读
    <b class='flag-5'>RA</b> <b class='flag-5'>FreeRTOS</b>任务创建

    电子RA系列微控制器的可扩展性强的配置软件包 (FSP)安装下载与使用指南

    电子RA系列微控制器的可扩展性强的配置软件包 (FSP)安装下载与使用指南
    的头像 发表于 06-11 17:21 2494次阅读

    RA8系列教程 | RA8 开发环境搭建,并点亮一个LED

    今天就给大家讲讲基于Cortex-M85内核RA8单片机快速上手指南
    的头像 发表于 06-04 17:32 2130次阅读
    <b class='flag-5'>瑞</b><b class='flag-5'>萨</b><b class='flag-5'>RA</b>8<b class='flag-5'>系列</b>教程 | <b class='flag-5'>瑞</b><b class='flag-5'>萨</b> <b class='flag-5'>RA</b>8 <b class='flag-5'>开发</b>环境搭建,并点亮一个LED