在GD32F4xx上移植LWIP

今天继续总结LWIP的移植过程。

参考代码

LWIP源码包

在官网下载的源码包:lwip-2.1.3.zip

还有移植软件包:contrib-2.1.0.zip

GD32固件库

GD32F4xx_Firmware_Library_V3.1.0.7z

重点关注TELNET例程:

GD32F4xx_Firmware_Library_V3.1.0.7z\GD32F4xx_Firmware_Library_V3.1.0\Examples\ENET\Telnet

移植过程

拷贝代码

1,拷贝lwip的src目录;

lwip-2.1.3.zip\lwip-2.1.3\src

2,拷贝GD的ENET例程下的arch和Basic目录;

GD32F4xx_Firmware_Library_V3.1.0\Examples\ENET\Telnet\lwip-2.1.2\port\GD32F4xx\arch

GD32F4xx_Firmware_Library_V3.1.0\Examples\ENET\Telnet\lwip-2.1.2\port\GD32F4xx\Basic

3,拷贝GD的ENET例程中src目录下的netconf.c, netconf.h, lwipopts.h

4,拷贝应用层程序:tcp_echo

contrib-2.1.0\apps\tcpecho_raw下面的tcpecho_raw.c和tcpecho.h文件:

也可以参考ST的tcp_echoserver:

STSW_STM32070_V1.1.1.zip\STM32F4x7_ETH_LwIP_V1.1.1\Project\Standalone\tcp_echo_server\src\tcp_echoserver.c

或者:

STM32Cube\Repository\STM32Cube_FW_F4_V1.27.0\Projects\STM32469I_EVAL\Applications\LwIP\LwIP_TCP_Echo_Server\Src\tcp_echoserver.c

改写代码

新建一个任务,代替main函数。

原始main函数:

int main(void)
{

    /* setup ethernet system(GPIOs, clocks, MAC, DMA, systick) */
    enet_system_setup();

    /* initilaize the LwIP stack */
    lwip_stack_init();

    while(1) {

        /* check if any packet received */
        if(enet_rxframe_size_get()) {
            /* process received ethernet packet */
            lwip_pkt_handle();
        }

        /* handle periodic timers for LwIP */
        lwip_periodic_handle(g_localtime);

    }
}

新建一个模块,代替gd32f4xx_enet_eval.c文件。里面的主要内容是:

/*!
    \brief      setup ethernet system(GPIOs, clocks, MAC, DMA, systick)
    \param[in]  none
    \param[out] none
    \retval     none
*/
void enet_system_setup(void)
{
    uint32_t ahb_frequency = 0;

#ifdef USE_ENET_INTERRUPT
    nvic_configuration();
#endif /* USE_ENET_INTERRUPT */

    /* configure the GPIO ports for ethernet pins */
    enet_gpio_config();

    /* configure the ethernet MAC/DMA */
    enet_mac_dma_config();

    if(0 == enet_init_status) {
        while(1) {
        }
    }

#ifdef USE_ENET_INTERRUPT
    enet_interrupt_enable(ENET_DMA_INT_NIE);
    enet_interrupt_enable(ENET_DMA_INT_RIE);
#endif /* USE_ENET_INTERRUPT */

#ifdef SELECT_DESCRIPTORS_ENHANCED_MODE
    enet_desc_select_enhanced_mode();
#endif /* SELECT_DESCRIPTORS_ENHANCED_MODE */

    /* configure systick clock source as HCLK */
    systick_clksource_set(SYSTICK_CLKSOURCE_HCLK);

    /* an interrupt every 10ms */
    ahb_frequency = rcu_clock_freq_get(CK_AHB);
    SysTick_Config(ahb_frequency / 100);
}

/*!
    \brief      configures the ethernet interface
    \param[in]  none
    \param[out] none
    \retval     none
*/
static void enet_mac_dma_config(void)
{
    ErrStatus reval_state = ERROR;

    /* enable ethernet clock  */
    rcu_periph_clock_enable(RCU_ENET);
    rcu_periph_clock_enable(RCU_ENETTX);
    rcu_periph_clock_enable(RCU_ENETRX);

    /* reset ethernet on AHB bus */
    enet_deinit();

    reval_state = enet_software_reset();
    if(ERROR == reval_state) {
        while(1) {}
    }

    /* configure the parameters which are
### 可能的原因分析 当执行 `git push` 命令时遇到 `Permission denied (publickey)` 错误,通常意味着 SSH 密钥验证过程出现问题。尽管能够成功通过 `ssh -T [email protected]` 验证身份,这表明 SSH 连接本身正常工作,但仍然可能由于其他原因导致推送操作失败[^1]。 ### 推荐的排查步骤 #### 1. 检查远程仓库URL配置 确认当前项目的 `.git/config` 文件中的 `[remote "origin"] url` 是否指向正确的地址。对于 Gitee 平台而言,应确保 URL 使用的是 SSH 形式的路径而非 HTTPS 形式: ```bash [remote "origin"] url = [email protected]:username/repository.git ``` 如果发现 URL 不正确,则可以通过如下命令更新它: ```bash git remote set-url origin [email protected]:username/repository.git ``` #### 2. 确认SSH Agent状态并加载私钥 有时即使生成了公钥/私钥对并且将其添加到了 Gitee 账户下,也需要显式地启动 SSH agent 来管理这些密钥,并将对应的私钥加入其中: ```bash eval "$(ssh-agent -s)" ssh-add ~/.ssh/id_rsa_gitee # 如果有多个密钥文件,请指定具体名称 ``` #### 3. 添加Gitee账号下的SSH Key 再次检查是否已将本地计算机上的公共 SSH key 正确添加至 Gitee 用户设置页面内的 SSH Keys 列表里。注意每条记录都应该是唯一的;重复项可能会引起冲突而阻止认证流程完成。 #### 4. 测试连接稳定性 尝试重新运行测试命令来检验新的更改是否生效: ```bash ssh -T [email protected] ``` 预期输出应该类似于:“Hi username! You've successfully authenticated...” ### 处理特定于Gitee平台的情况 考虑到提问中提到的目标是解决针对 Gitee 的问题而不是 GitHub,在上述通用建议之外还需要特别关注以下几点: - **多账户环境**:如果有多个不同的 Git 托管服务提供商(比如同时使用GitHub 和 Gitee),则需为各自创建独立的一套 SSH 密钥,并在每次交互前切换相应的代理会话。 - **企业级安全策略**:部分组织内部部署的企业版 Gitee 实例或许会有额外的安全措施影响外部提交行为,此时应当联系管理员获取进一步指导和支持。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值