EasyARM_RT1052的BootLoader程序

xmodem1k_client

在这里插入图片描述
  此函数按照1K XMODEM协议,操作串口,将数据传递到FLASH里面。有两个入口参数,第一个入口参数按照地址和数据长度操作FLASH;第二个入口参数为串口相关的操作函数。

boot_data_program

  操作FLASH,写入程序。

gp_xmodem_fun

在这里插入图片描述

总结

  一个串口有收发功能,我们把这些功能起一个抽象的函数名,然后把这些抽象的函数打包成一个结构体,此处打包成了结构体xmodem_fun_handle。
在这里插入图片描述
  使用时,我们拿着结构体,当做入口参数进行调用。
  这个过程一直是抽象地进行,即我们把具体的函数名换了一个比较体面的假名字,用假的、抽象的名字进行功能的实现。

在这里插入图片描述

抽象实例化

  将具体的函数名称赋值给抽象函数的指针,这就实现了抽象的函数具体化。
在这里插入图片描述
  uartreadnoblock 即具体的值,也是函数功能的具体实现。

uint8_t uartreadnoblock (uint8_t *p_ch)
{
    uint32_t statusFlag;
#if defined(FSL_FEATURE_LPUART_HAS_7BIT_DATA_SUPPORT) && FSL_FEATURE_LPUART_HAS_7BIT_DATA_SUPPORT
    uint32_t ctrl = LPUART1->CTRL;
    bool isSevenDataBits =
        ((ctrl & LPUART_CTRL_M7_MASK) || ((!(ctrl & LPUART_CTRL_M_MASK)) && (ctrl & LPUART_CTRL_PE_MASK)));
#endif

#if defined(FSL_FEATURE_LPUART_HAS_FIFO) && FSL_FEATURE_LPUART_HAS_FIFO
    if (0 == ((LPUART1->WATER & LPUART_WATER_RXCOUNT_MASK) >> LPUART_WATER_RXCOUNT_SHIFT))
#else
    if (!(LPUART1->STAT & LPUART_STAT_RDRF_MASK))
#endif
    {
        statusFlag = LPUART_GetStatusFlags(LPUART1);

        if (statusFlag & kLPUART_RxOverrunFlag)
        {
            LPUART_ClearStatusFlags(LPUART1, kLPUART_RxOverrunFlag);
            return 0;
        }

        if (statusFlag & kLPUART_NoiseErrorFlag)
        {
            LPUART_ClearStatusFlags(LPUART1, kLPUART_NoiseErrorFlag);
            return 0;
        }

        if (statusFlag & kLPUART_FramingErrorFlag)
        {
            LPUART_ClearStatusFlags(LPUART1, kLPUART_FramingErrorFlag);
            return 0;
        }

        if (statusFlag & kLPUART_ParityErrorFlag)
        {
            LPUART_ClearStatusFlags(LPUART1, kLPUART_ParityErrorFlag);
            return 0;
        }

        return 0;
    }
#if defined(FSL_FEATURE_LPUART_HAS_7BIT_DATA_SUPPORT) && FSL_FEATURE_LPUART_HAS_7BIT_DATA_SUPPORT
    if (isSevenDataBits)
    {
        *p_ch = (LPUART1->DATA & 0x7F);
    }
    else
    {
        *p_ch = LPUART1->DATA;
    }
#else
    *p_ch = (uint8_t)(LPUART1->DATA);
#endif

    return 1;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

卡姆图拉夫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值