基于KEAZ128的bootloader实现(LIN)

写这段程序之前参考了NXP官网的《AN5400:KEA bootloader》

源代码可下载我发布的资源。编译器使用S32DS。

1、简述:boot loader的实现可以简单理解为在MCU的程序存储区分为两个部分,BOOT和APP。

上电执行BOOT,如有下载请求就下载程序,没有就跳转到APP程序。在实际编程中应该创建两个工程,APP与BOOT。

2、向量地址。

我们要把FLASH区分为两个部分,那自然要要分配不同的起始地址。由于单片机硬复位后PC指针会默认指向0x0000,所以BOOT部分必须以地址0起始,我这里为BOOT预留的地址空间是0x0000-0x4000.由于使用默认地址,所以LD文件不需要修改。 

FLASH_1          (RX)  : ORIGIN = 0x00000000, LENGTH = 0x00000400
  FLASH_CONFIG     (RX)  : ORIGIN = 0x00000400, LENGTH = 0x00000010
  FLASH_2          (RX)  : ORIGIN = 0x00000410, LENGTH = 0x0001FBF0

APP的工程需修改为

  FLASH_1          (RX)  : ORIGIN = 0x00004000, LENGTH = 0x00000400
  FLASH_CONFIG     (RX)  : ORIGIN = 0x00004400, LENGTH = 0x00000010
  FLASH_2          (RX)  : ORIGIN = 0x00004410, LENGTH = 0x0001BBF0

关于LD文件的位置:工程文件夹里

 3、FLASH的读写。

KEAZ128的FLASH擦写操作并不会占用总线(见手册),所以不需要将FLASH的操作程序段放在内存中。直接执行即可,但需注意的是,需要在执行操作时关闭中断,且不能操作正在执行程序的扇区。下面介绍下FLASH的读写方法。

3.1设置保护区以防止误操作。

    //Flash Protection Operation Enable
    FTMRE->FPROT |= FTMRE_FPROT_FPOPEN_MASK;
    //Flash Protection Higher Address Range Disable
    FTMRE->FPROT |= FTMRE_FPROT_FPHDIS_MASK;
    //Flash Protection Lower Address Range Disable
    FTMRE->FPROT &= ~FTMRE_FPROT_FPLDIS_MASK;
    //Flash Protection Lower Address Size, from 0 to 0x3FFF
    FTMRE->FPROT |= FTMRE_FPROT_FPLS_MASK;

3.2初始化

retError |= FLASH_Init(20000000);

3.3擦除扇区 :在向FLASH区写入数据之前要先执行擦除,而擦除是按照扇区执行的,每扇区512字节。

                        FLASH_EraseSector(add);
                        FLASH_EraseVerifySection(add, w);

                        add  扇区的地址

                        w     要验证的字数。注:此处为长字,即1个字四个字节

例如:                        FLASH_EraseSector(0x4000);
                        FLASH_EraseVerifySection(0x4000, 128);

                擦除了0x4000-0x41ff的内容。

3.4写入:下面这段的意思是向地址flash_app_addr连续写入512字节,内容为数组hcBuff[]

                需注意的是无论擦除还是写入都需关闭中断。

                        __disable_irq();
                        int error1=FLASH_Program(flash_app_addr, hcBuff, 512);
                        __enable_irq();

3.5读值 直接使用uchar型指针指向就可以。

                x=*((uint8_t*)(flash_app_addr));

4、如何跳转:在没有请求或者下载完成后需跳转到APP部分。跳转方法为函数指针:

                typedef void(*JumpToPtr)(void);  //函数指针类型 别名JumpToPtr
                #define APP_IMAGE_START     0x4000

            for(i=0;i<8;i++)
                UART_DisableInterrupt(UART0, i);          //跳转前关闭所有打开的外设,这里使用了串口

/*这里禁用所有中断,就不举例了*/

            JumpToPtr jump2app;                       /*定义函数指针*/
           jump2app = (JumpToPtr)*(uint32_t*)(APP_IMAGE_START + 4);
           jump2app();  //跳转

                while(1); 

        PS:其实”在内存中执行函数“也是利用函数指针,只是把指针指向了存储着函数机器码的数组的首地址。

5、烧写的内容

        BOOT接受到下载请求下载程序,将程序烧写0x4000起始的位置。程序信息是由16进制的机器码形式保存的,也是就是用APP工程编译出BIN文件中的内容。

6、关于通信。

        BOOT中的通信与正常编程是相同的,只是需要在跳转前关闭在BOOT中打开的外设。

源代码中使用的通讯方式是LIN总线。19200波特率 帧间隔20ms。关于客户协议的部分就不赘述了,我想对于大家来说这都不是难题。

对于刚接触bootloader的工程师来说需要的无非就那么几点,如何在C语言中跳转PC指针、FLASH的操作接口、在哪里设置向量地址、以及总线条件不允许时如何在内存中执行程序等。简单写一下算是抛砖引玉,欢迎交流。

  • 5
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
### 回答1: Keaz128pack固件库是一个用于Keaz128微控制器的软件代码库,它包含了各种功能模块和驱动程序,可以帮助开发者轻松地实现各种应用,实现代码重用和快速开发。 Keaz128pack固件库的组成部分包括ADC(模数转换器)、比较器、CRC(循环冗余校验)、GPIO(通用输入输出)、I2C、SPI、UART、PWM(脉冲宽度调制)等多个模块。 除了这些功能模块,Keaz128pack固件库还提供了多个常用驱动程序,例如时钟控制、DMA(直接存储器访问)、闪存编程等等。这些驱动程序可以大大降低开发者的工作量,同时也可以提高代码的可重用性。 Keaz128pack固件库还提供了完整的实验文档和示例代码,方便开发者学习和参考。开发者可以根据自己的实际需求,选择需要的模块和驱动程序进行集成,并根据实验文档和示例代码进行开发和测试。 总之,Keaz128pack固件库是一个功能完备、易于使用、具有高可重用性的软件代码库,可以帮助开发者快速开发出各种应用,提高开发效率和代码质量。 ### 回答2: keaz128pack固件库是由NXP公司开发提供的一个基于Keil MDK中的CMSIS-DAP调试器所支持的固件库。它是专门用于Keaz128版本的微控制器开发的,其中Keaz128是一种低功耗、高精度、高可靠性的MCU,可用于许多不同的应用方案中。 keaz128pack固件库包含了许多不同的代码库,例如驱动器和库例程,用于简化开发人员在开发Keaz128设备时的工作。这些库包括了许多常用的功能,例如串口通信、中断处理、时钟管理、GPIO控制和ADC等功能。 使用keaz128pack固件库还可以方便地开发Keaz128设备的模块、驱动程序和应用程序。同时,这个固件库还提供了一些不同的开发工具,例如Eclipse、CodeWarrior、IAR Systems、Atollic TrueSTUDIO和Keil等。 总的来说,keaz128pack固件库是一个非常有用的工具,可以帮助开发人员更加轻松地开发基于Keaz128微控制器的应用程序,提高开发效率和开发质量。 ### 回答3: Keaz128pack固件库是一个为Keaz128微控制器提供支持的固件库。Keaz128微控制器是一种低功耗高性能的微处理芯片,被广泛应用于自动化、嵌入式系统、通讯控制等领域。Keaz128pack固件库提供了丰富的外设支持和功能,包括GPIO控制、UART通讯、SPI通讯、I2C通讯、ADC采集、PWM输出、定时器和中断等。通过Keaz128pack固件库,用户可以快速轻松地开发出各种应用程序,并部署到Keaz128微控制器上。 Keaz128pack固件库提供了通用的API接口,允许用户在不同的编程环境下使用,如C语言、汇编语言等。同时,在Keaz128pack固件库的基础上,用户可以针对特定的应用领域进行二次开发和定制,实现更加高效的应用程序。 总之,Keaz128pack固件库是一款非常适合Keaz128微控制器的固件库,它提供了全面的功能和支持,可以帮助用户快速开发出各种应用程序,同时也为用户提供了一种方便的二次开发和定制的方式。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值