S12ZVM Bootloader开发设计
文章目录
1 开发环境下载
原本想采用IAR或Keil IDE,由于IAR不支持S12Z内核芯片,故采用NXP CodeWarrior IDE.
官网下载地址:www.nxp.com
官网需要注册帐号,怕麻烦的可以采用以下链接地址: https://download.csdn.net/download/ywtiex/86725562
2 CodeWarrior安装
Next -> Next -> Next, 这里不要详细描述,如有问题,请自行搜索百度。
3 工程创建
1 新建工程,File -> New -> Project, 如下图所示:采用Bareboard Project, 并创建工程名。
2 根据实际需求选择芯片类型和工程类型,Application为应用工程,Library为库工程。
(库工程可以编译打包生成.lib文件,方便给其它应用工程使用,应用工程编译链接生成可执行二进制文件)
3 根据实际情况选择调试连接器选项。
4 编译工具选项(应用工程内存模式需保持一致,否则会提示错误)
5 Processor Expert选项
6 电机控制库默认实现方式
End
4 驱动开发
Processor Expert用于图形化配置硬件驱动的插件,Processor Expert->Show Views可打开配置界面,如下图所示:
工程目录下ProcessorExpert.pe为配置文件,可右键生成代码文件,存放在Generated Code目录下。
4.1 Cpu配置
Cpu配置,根据硬件实际情况,配置时钟选项。
本项目中采用外部晶振8M,故使能外部时钟,设置为8MHz,总线时钟频率设置为50MHz。总线时钟可根据实际情况调整,但所有采用总线时钟源的外设模式需相应调整。
其它外设配置,可通过以下方式新增和删除,鼠标双击Cpu选项后右键Target Processor Package.
以下目前Cpu配置情况,点击右上角Cpu相应外设后右键可新增外设模块。点击左下角相应外设右键可选择删除外设模块。
4.2 定时器配置
定时器配置,由于系统需要1ms定时器,配置如下:
自动生成Enable/Disable函数接口,配置如下:
自动生成TIM0中断处理函数,示图如下:
点击ProcessorExpert.pe后右键生成代码文件,可查看到Event.c文件中代码。
void TIM0_OnInterrupt(void)
{
/* Write your code here ... */
//此处需手动添加相应代码
}
4.3 CAN配置
CAN配置,由于本芯片CAN收发器和控制器都集成在芯片内部,故配置CAN之前,需配置CANPhy外设, 配置如下:
上图主要配置CAN通道和PIN脚的选择。
通过芯片手册可知,MSCAN有两路时钟源,一路为Bus Clock, 一路为Oscillator Clock, 一般推荐使用Oscillator Clock,避免时钟源来极少因倍频后带来的更大的噪点。
CAN配置只支持Bus Clock,那么后续波特率的计算,将使用4.1 Cpu配置的50MHz为输入源。
目前需求配置为500Kbits, 采样率为80%,计算公式如下:
通过芯片手册可知以下公式:
500Kbits波特率位时间为2000ns
2000 = Pre/50 * (1 + TimeSegment1 + TimeSegment2)
假设Bit Time由20个QT组成,那么Pre=5(预分频值),波特率可以设置为500Kbits。
通过上图可得到以下关系式:
1 + TimeSegment1 + TimeSegment2 = 20;
Sample Point(80%) = SYNC_SEG + Time Segment1 / 20;
求解:
TimeSegment1 = 15;
TimeSegment2 = 4;
综上所述,CAN配置设置如下:
Time segment1是TSEG1寄存器的值,Time segment2是TSEG2寄存器的值,RSJ是指SWJ,可以配置为0-3。
4.4 Flash配置
基本配置如下:
自动生动函数接口配置如下:
4.5 EEPROM配置
基本配置如下:
自动生成函数接口配置如下:
5 Bootloader刷写协议
bootloader刷写协议基于UDS协议栈,UDS协议栈不在此详细描述,对此感兴趣的可跳转至以下链接:
https://blog.csdn.net/ywtiex/article/details/126913855?spm=1001.2014.3001.5502
6 Flash空间划分
参数名 | 地址 | 备注 |
---|---|---|
Bootloader_End | 0xFFFFFF | Bootloader结束地址 |
_ResetVectorTable | 0xFFFFFC | Bootloader复位向量 |
_InterruptVectorTable | 0xFFFE10 | Bootloader中断向量 |
Bootloader_Start | 0xFF0000 | Bootloader起始地址 |
Application_End | 0xFEFFFF | Application结束地址 |
_ResetVectorTable | 0xFEFFFC | Application复位向量 |
_InterruptVectorTable | 0xFEFE10 | Application中断向量 |
Application_Start | 0xFC0200 | Application起始地址 |
Bootloader占用64K空间,剩余空间由Application占用。
FLASH空间大小由ProcessorExpert.prm文件决定,如下图所示:
而ProcessorExpert.prm由配置文件生成,配置选项如下:
_ResetVectorTable和 _InterruptVectorTable参数由Vectors.c定义,如下图所示:
那么是如何修改这两个参数呢?经过实验发现手动修改后,会被重新覆盖。ProcessorExpert.pe配置界面没有提供此配置项,通过文本方式打开ProcessorExpert.pe发现,两个参数是有默认参数,通过修改此参数值后,配置自动生成代码,可达到修改此参数值。
7 制作烧录文件和升级文件
7.1 制作说明
烧录文件用于产线烧录程序,一般由Appliation和Bootloader两部分程序组成,需要合并生成。
升级文件用于CAN UDS在线升级,升级文件由FlashDriver、Head、Updata三部分组成,FlashDriver及Head目前采用固定格式(直接提供),Updata文件由于上位机暂不支持多段升级需要填充0xFF。
7.2 制作方法
- 下载HexView软件,链接方式如下: https://pan.baidu.com/s/1dCelcyZdN03XVNMtBCdaCg?pwd=n5pi 提取码: n5pi
- 制作脚本, 新建Production.bat文件,编辑输入以下代码
::HexView软件路径
set HexVierPath=G:\Software\Work\Design\HexView\HexView.exe
::Application源文件名
set AppFileName=EPL_S12Z_Application.s19
::Bootloader源文件名
set BootFileName=EPL_S12Z_Bootloader.s19
::生产烧录生成文件名
set AppBootFileName=EPL_S12Z_AppBoot.s19
::应用升级生成文件名
set AppUpdataFileName=EPL_S12Z_ApplicationUpdata.s19
:: 合并文件
echo "Merage File"
%HexVierPath% /s /mt:%AppFileName%;+%BootFileName%;0:0xFF0000-0xFFFFFF /XS -o %AppBootFileName%
:: 填充字节
%HexVierPath% /s %AppFileName% /FR:0xFC0000-0xFEFFFF /FP:0xFF /XS -o %AppUpdataFileName%
- 复制Application.s19和Bootloader.s19到Production.bat同一目录。
- 双击Production.bat脚本,生成烧录文件和升级文件。
Q&A
Q1 Application工程需要设置哪些参数?
1 Application空间地址,可参照6章节 Flash空间示意图设置。
2 _ResetVectorTable和 _InterruptVectorTable参数设置。
3 IVBR寄存器设置,此寄存器用来设置中断基础向量地址,如果采用配置方式,此地址与_InterruptVectorTable相关联,无需重新配置。
Q2 如何合并Bootloader与Application工程?
通过hexview或jlink工具可以手动合成。
Q3 通过什么方式烧录合并文件?
由于采用PE Micro下载器,去官网搜索烧录软件,目前需要收费,有试用版本。只能退而求其此次,采用CodeWarrior IDE自带的下载功能,界面如下:o真心丑陋,有条件的话可以购买正版烧录软件o
Q4 Bootloader跳转后无法运行?
这个问题卡了1-2个星期,现在梳理一下流程,防止后来者采坑。
MCU整体运行流程,如下图所示:
这里就上图逐一进行讲解分析:
1 MCU上电后从0xFFFFFC地址取址,从下图bootloader.s19文件可知,取址数据为0xFFFF000F。
从编译bootloader.map来看,0xFF000F对应函数_EntryPoint,如下图所示:
从上图可知,MCU采用3字节指令,这也是该问题关键所在。
2 JumpFunction,需要从0xFEFFFC取址,只取低3个字节,并跳转执行,代码如下:
unsigned long int app_vector;
//Jump to main application
app_vector = *(unsigned long int *) (addr);
app_vector <<= 8; //跳转地址取后三个字节
asm LD X, app_vector;
asm JMP (0, X);
该问题出函数,没有取后三个字节,实际跳转至0xFFFC02,程序无法运行。
创作不易,请转载时注明原创链接地址,感谢关注和收藏!!!