s12单片机模块应用及程序下载调试
本次智能车邀请赛采用的mc9s12dg128(以下简称dg128)是freescale公司推出的s12系列单片机中的一款增强型16位单片机,片内资源丰富,接口模块包括spi、sci、iic、a/d、pwm等,在汽车电子应用领域具有广泛的用途。dg128在flash存储控制及加密方面也有很强的功能,加解密可配合第三方软件使用。
dg128单片机采用增强型16位hcs12 cpu,片内总线时钟最高可达25mhz;片内资源包括8k ram、128k flash、2k eeprom; sci、spi、pwm串行接口模块;脉宽调制模块(pwm)可设置成4路8位或者2路16位,逻辑时钟选择频率宽。它包括两个8路10位精度a/d转换器,控制器局域网模块(can),增强型捕捉定时器并支持背景调试模式。dg128有112-pin和80-pin两种封装形式,80-pin封装的单片机没有引出用于扩展的端口,只引出了一个8路a/d接口。
常用接口模块及外部应用
pwm(pulse width modulate)模块:pwm脉宽调制波是一种可用程序来控制波形占空比、周期、相位的波形。它在电机驱动、d/a变换等场合有着广泛的应用。本次大奖赛使用的电机驱动芯片为mc33886,其输入信号即为一路pwm信号。mc33886根据pwm信号的周期和占空比来控制电机的转向和速度。大奖赛中使用的舵机也是用pwm来控制的。pwm信号的周期大于某一域值后可驱动舵机工作,保持周期、调节pwm的占空比即可调节舵机的转动方向。在没有电机、舵机的具体参数的情况下,可写一个可调周期、占空比的pwm输出程序进行测试。
a/d(analog/digital)模块:a/d模数转换模块内部可分为三个部分:ip总线接口、转换模式控制/寄存器列表、自定义模拟量。ip总线接口负责该模块与总线的连接,实现a/d模块和通用i/o的目的。转换模式控制寄存器列表中有控制该模块的所有的寄存器。自定义模拟量负责实现模拟量到数字量的转换。为了与外部信号同步进行a/d转换,a/d有一个外部触发转换通道,用户可以选择触发方式(沿触发、电平触发)。
a/d模块设有时钟分频机制。需要用户注意的是,a/d模块的最大转换时钟为2mhz,最小转换时钟为500khz,用户需要查看自己芯片的内部总线时钟,必须使得分频以后的转换时钟处于两者之间,否则可能得不到正确的转换结果。用户可以设定转换结果为有符号或是无符号数。比如,对于vrh为5.12v,vrl为0v时,输入5.12v,8位有符号的结果是-$7f,无符号的结果是$ff。a/d模块允许设置顺序转换,最大的顺序转换序列长度是8。
大奖赛中车模对跑道的识别有可能会用到a/d模块,识别电路的前端数据采集系统有很多种实现方案,如红外发光二极管或是cmos摄像头来进行数据采集。
codewarrior软件使用
大赛中采用codewarrior 3.1 for hcs12作为推荐的程序编译软件。codewarrior for s12 是面向以hc12或s12为cpu的单片机嵌入式应用开发的软件包。包括集成开发环境ide、处理器专家库、全芯片仿真、可视化参数显示工具、项目工程管理器、c交叉编译器、汇编器、链接器以及调试器。在codewarrior软件中可以使用汇编语言或c语言,以及两种语言的混合编程
工程建立以后,需要定义装载地址。default.prm文件用于定义目标代码的装载地址,用户应当根据使用单片机的内存分配情况修改这个文件。codewarrior 自动生成的 .prm 文件默认dg128 的ram 在:
ram = read_write 0x0400 to 0x1fff;
这个默认区间必须修改,因为在这一空间有 1k 的i/o 寄存器空间 和2k eeprom 空间。使用默认定义会丢失1k ram 和 2k eeprom。
我们在监控程序中修改ram空间:
ram = read_write 0x2000 to 0x3fff;
当然也可以修改到:
ram = read_write 0x1000 to 0x2fff。
建议用户采用我们的定义。
另外,我们使用:
stacktop 替代 stacksize
因为stacksize 0x100 在ram低端留 0x100 空间,而使用 stacktop 0x3f00 可以将sp定义到ram 高端。但是如果采用这种定义的方法,需要在前面定义ram的时候,定义修改为:ram=read_write 0x2000 to 0x3eff。另外还需要对于工程文件中 start12.c中函数 :
void __interrupt 0 _startup(void) 中
#ifdef _hcs12_serialmon
.......
.......
#endif
两句宏命令注释掉,使得其中的对于eeprom,ram起始位置控制寄存器初始化语句有效。这样,下载后程序可以运行正常。
利用监控程序下载用户程序:
监控程序(monitor)的主要功能是对应用系统硬件及底层软件进行调试,也称为debug程序,是最基本的调试工具。dg128的flash有128k,ram有8k,而监控程序源代码占用不到3k flash,占用23字节ram。这对用户程序的空间影响并不大。异步串行口是要用来做与pc通讯服务的,监控程序可以用,应用程序当然也可以使用。
下载用户程序至片内资源是监控程序的基本功能。清华大学freescale mcu & dsp应用研发中心开发的基于dg128的监控程序代码小于4kb,起始地址为$f000处,它把$ff80的中断向量表移到ef80处,顺序不变。用户可以使用$ef80处的中断向量表,此中断向量表和mc9s12dg128手册上的中断向量表顺序相同,只是从$ff80移到了$ef80。监控程序起来时,如果串口在4秒内没有收到数据,就会检查$effe-$efff(用户复位向量表)是否为ffff。如果不是,说明flash中有用户程序,程序自动调转到$effe-$efff所指向的用户程序。如果程序起来4秒内串口接到数据或者$effe-$efff为$ffff,则进入debug监控程序。该监控程序中f命令下载程序到flash中,可识别s1或s2格式的s19文件。按“f”键后,开发板上的单片机等待接收来自串行口的数据文件。然后选择“发送” -→“发送文本文件”,找到要下载的*.s19文件,按“打开(o)”,这样,就把文件下载到flash中去了。注意,文件类型应选“所有文件”。待再次出现提示符说明程序已下载完成。
从pc寄存器的地址处,开始运行程序。可以用ctrl+p 命令修改pc指针到拟运行程序的起始地址。如果是汇编的代码从下载地址开始执行即可;但如果是c语言编译生成的代码,需要加29后的地址再执行。这是因为工程是从start12.c开始执行,然后再执行用户的main.c。这是codewarrior内部规定的。用户只需要知道就可以了。用户程序的入口地址是用户在default.prm文件中定义的代码地址加上29。然后键入“g”命令。这时便可以执行用户程序了。如果用户程序中无法从主循环中跳出,需要停止用户程序的时候按一下复位键即可。
PXI规范概览与最新发展
集无线充电、迷你冰箱、蓝牙音响、LED灯和智能睡眠等功能于一体的床头柜
苹果也发声明了:反对美国政府加征关税
关于ROLL与慢扫描的区别及应用的分析和介绍
国产特斯拉Model 3开启了降价活动起售价将低于30万元
S12单片机模块应用及程序下载调试
iPhone8什么时候上市?iPhone8最新消息:iPhone8全面屏现身+分辨率曝光,供应商回应iPhone8三大功能
E现场:Galaxy S20 Ultra 1.08亿像素+100倍变焦售价 11999
什么是Speculative execution/SPEC/
智能手表和普通手表有什么区别
三星投资1160亿美元晶圆代工,能得偿所愿成为龙头老大吗
格芯在半导体领域正走上新征程
无人驾驶飞机系统可实现战术ISR
Rockchip 瑞芯微电子 开发板使用入门指南
防水连接器金属和塑胶连接器之前有什么区别
华硕ROG推出首款ROG THOR电源,正面加入OLED屏幕及LED灯
电暖桌otp语音芯片的解决方案
环境光传感器在智能照明中的应用
智能办会为武汉的数字经济发展创造新机遇,助力武汉产业转型升级
英飞凌将在奥地利新建一座全自动化芯片工厂 用于制造300毫米薄晶圆