基于J1939的bootloader

在做正式的产品时候,经常我们的产品需要可以升级固件,这时候就需要bootloader引导,而在车载上,基于J1939的bootloader可靠性非常重要。要能够快速,有效且安全的更新固件。

    一般来说我们需要将flash划分bootloader区和应用程序区,还有连接区来存放一些配置,如开始地址,CRC结果,版本等。这一部分通常叫Bootloader Configuration Area(BCA)这部分通常可以放在应用程序开始的一段地址上。bootloader开始的时候会初始.data和。bss段,读取配置信息等。对跑在J1939通信上的bootloader,跟我们以前做bootloader考虑的一样,只是换了个通信方式和接口,一般情况下,如果是自定义的PGN,一般放在PGN61184用专有A来作为bootloader的参数组。

    通常我们在设备上电时候,bootloader需要检查是否存在有效的应用,如果有,那么跳转到应用程序,如果没有则开始尝试接收应用程序。并且应用程序要能够有启动bootloader的命令。

做基于J1939通信的bootloader,需要考虑三种帧来传输地址包,数据包,和命令包。通常基于其他通信的bootloader,我们也需要来考虑这几种传输,如果你对J1939协议比较清楚,应该是很容易实现的,最近我在电子发烧友学院做《带你跨越J1939通信开发之路》的直播,相信你学完后,一定可以自己做基于J1939的开发项目。有兴趣的可以去电子发烧友学院看看,微信,网页端,APP都可以。

640?wx_fmt=jpeg

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个基于 C 语言编写的 ATmega128 Bootloader 程序的示例代码: ```c #include <avr/io.h> #include <avr/boot.h> #include <avr/interrupt.h> #define BAUD 9600 #define F_CPU 8000000UL #define UART_BAUDRATE (((F_CPU / (BAUD * 16UL))) - 1) void uart_init(void) { UBRR0H = (uint8_t)(UART_BAUDRATE >> 8); UBRR0L = (uint8_t)(UART_BAUDRATE); UCSR0B = (1 << TXEN0) | (1 << RXEN0); UCSR0C = (1 << UCSZ01) | (1 << UCSZ00); } void uart_putc(uint8_t data) { while (!(UCSR0A & (1 << UDRE0))); UDR0 = data; } void uart_puts(char *str) { while (*str) { uart_putc(*str++); } } void jump_to_app(void) { void (*app_start_addr)(void) = 0x0000; app_start_addr(); } int main(void) { uart_init(); sei(); uart_puts("ATmega128 Bootloader\r\n"); if (!(PINB & (1 << PINB0))) { uart_puts("Entering Bootloader Mode\r\n"); while (1) { uint8_t data = uart_getc(); if (data == 'u') { uart_puts("Unlocking Application\r\n"); boot_lock_bits(0x00); } else if (data == 'e') { uart_puts("Erasing Application\r\n"); boot_page_erase(0x0000); boot_spm_busy_wait(); } else if (data == 'w') { uart_puts("Writing Application\r\n"); uint16_t address = 0x0000; uint8_t *buffer = (uint8_t *)(0x0000); for (uint16_t i = 0; i < SPM_PAGESIZE; i += 2) { uint16_t data = uart_getc(); data |= uart_getc() << 8; buffer[i] = data & 0xFF; buffer[i + 1] = data >> 8; } boot_page_write(address, buffer); boot_spm_busy_wait(); boot_rww_enable(); } else if (data == 'j') { uart_puts("Jumping to Application\r\n"); jump_to_app(); } } } else { jump_to_app(); } return 0; } ``` 这个程序基于 UART 模块实现 ATmega128 的 Bootloader 功能。当启动程序时,它会检测 PINB0 引脚是否为低电平,如果是,则进入 Bootloader 模式,等待来自串口的指令,以擦除、编程和解锁 Flash 存储器。如果 PINB0 引脚为高电平,则跳转到应用程序地址开始执行应用程序。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值