使用HCS12微控制器的设计与应用.docx
《使用HCS12微控制器的设计与应用.docx》由会员分享,可在线阅读,更多相关《使用HCS12微控制器的设计与应用.docx(68页珍藏版)》请在冰豆网上搜索。
![使用HCS12微控制器的设计与应用.docx](https://file1.bdocx.com/fileroot1/2022-11/20/b582707a-bc92-4bd4-8abb-b9f52bda447c/b582707a-bc92-4bd4-8abb-b9f52bda447c1.gif)
使用HCS12微控制器的设计与应用
1.1.1嵌入式系统与单片机
嵌入式系统的由来(通用计算机系统、嵌入式计算机系统)
单片机的含义
MCU与嵌入式系统的关系
1.1.2MCU的发展简史
发展趋势
大容量、高性能化
小容量、低价格化
外围电路内装化
8位→16位→32位→64位
1.2.1与硬件相关的术语
封装(Package)
印刷电路板(PCB)
动态可读/写随机存储器(DRAM)
静态可读/写随机存储器(SRAM)
只读存储器(ROM)
Flash存储器(FlashMemory)
模拟量
开关量
1.2.2与通信相关的术语
并行通信
串行通信
串行外设接口(SPI)
集成电路互连总线I2C
通用串行总线USB
控制器局域网CAN
背景调试模式BDM
边界扫描测试协议JTAG
1.2.3与功能模块相关的术语
通用输入/输出GPIO
A/D与D/A
脉冲宽度调制器PWM
看门狗
液晶显示器LCD
发光二极管LED
键盘
1.2.4与嵌入式软件相关的术语
中断
中断服务程序
实时操作系统RTOS
µC/OS-II
临界区
1.3.1嵌入式产品的一般构成
1.3.2嵌入式产品的一般开发方法
1基本输入/输出分析
2选择MCU的基本方法
3选择评估系统并对与MCU相关的硬件进行初步评估
4设计并制作硬件系统
5进行硬件系统的模块测试
6软件系统设计
7系统测试
8进一步工作
1.4.1嵌入式系统的特点
资源受限
开发需要专用工具和特殊方法
要求较高可靠性和稳定性
有实时约束
通常极其关注成本
大多要求低功耗
专用性很强
技术含量高
具有很长生命周期
1.4.2嵌入式系统的学习建议
明确学习的目的
选择好入门的机型
必要的记忆
勤于实践
学习各种接口的原理
与时俱进,不断改进自己的学习方式
从底层抓起,一点一滴打好基础
2.1.1FreescaleHCS12系列MCU的命名规则
MC9S12Dх256BхххE
①②③④⑤⑥⑦⑧
①:
产品状态
②:
存储器类型标志
③:
CPU标志
④:
系列标志
⑤:
存储空间大小及版本
⑥:
工作温度范围标志
⑦:
封装标志
⑧:
无铅组装标志
2.1.2HCS12各子系列MCU简介
系列
B系列
C系列
A系列
D系列
E系列
GC系列
H系列
NE系列
Q系列
T系列
UF系列
相同点
工作电压一般为5V
不同点
ROM大小
RAM大小
EEPROM大小
Flash容量
I/O口数
串行借口
A/D转换器
2.1.1FreescaleHCS12系列MCU的命名规则
MC9S12Dх256BхххE
①②③④⑤⑥⑦⑧
①:
产品状态
②:
存储器类型标志
③:
CPU标志
④:
系列标志
⑤:
存储空间大小及版本
⑥:
工作温度范围标志
⑦:
封装标志
⑧:
无铅组装标志
2.1.2HCS12各子系列MCU简介
系列
B系列
C系列
A系列
D系列
E系列
GC系列
H系列
NE系列
Q系列
T系列
UF系列
相同点
工作电压一般为5V
不同点
ROM大小
RAM大小
EEPROM大小
Flash容量
I/O口数
串行借口
A/D转换器
2.3.1MCU性能概述
1.时钟和复位产生模块、存储器与封装形式
2.丰富的I/O接口
2.3.2运行模式
1.单片运行模式
2.扩展运行模式
2.3.3内部结构简图、引脚图及引脚功能
80引脚
112引脚
2.3.4MC9S12DG128MCU的最小系统设计
2.4MC9S12DG128的存储器映像
2.5.1I/O接口的基本概念
2.5.2A口、B口、E口和K口
数据方向寄存器
分别为DDRA、DDRB、DDRE、DDRK
0:
定义输入1:
定义输出
I/O寄存器
分别为PORTA、PORTB、PORTE、PORTK
输出时,0:
输出低电平1:
输出高电平
输入时,0:
外部输入低电平1:
外部输入高电平
上拉电阻控制寄存器
PUCR
四口共用
0:
没有内部上拉电阻1:
有内部上拉电阻
2.5.3H口、J口、M口、P口、S口和T口
1.端口的寄存器
数据方向寄存器
I/O寄存器
输入寄存器
低功耗驱动寄存器
0:
输出功耗正常1:
输出功耗为正常的1/6
上拉下拉使能寄存器
0:
禁用上拉或下拉电阻1:
允许上拉或下拉电阻
上拉下拉选择寄存器
0:
上拉1:
下拉
2.端口的复用功能
T口:
接收输入捕捉功能
S口:
SCI、SPI模块关联作为通信接口
M口:
与ByteFlight、BDLC、CAN、SPI模块关联作为通信接口
P口:
与PWM、SPI模块关联作为通信接口
H口:
与SPI模块关联作为通信接口
J口:
与CAN、IIC模块关联作为通信接口
2.5.4其他I/O口
A/D口:
作为AD转换模块的模拟量输入口和外界触发脉冲的输入口
也可以做为普通输入口
3.1CPU12基本组成
3.2寻址方式
1.内在寻址方式(INH)
2.立即寻址方式(IMM)
3.直接寻址方式(DIR)
4.扩展寻址方式(EXT)
5.相对变址寻址方式(REL)
6.变址寻址方式(IDX)
7.5位偏移量变址方式
8.9位偏移量变址方式
9.16位偏移量变址方式
10.16位间接变址方式
11.自增自减变址寻址方式
12.累加器偏移变址寻址方式
13.累加器D间接寻址
3.3指令系统
1算术运算(加、减、乘、除、加1、减1、……)
2逻辑运算(与、或、异或、……)
3位操作(位测试、置位、……)
4移位(算术/逻辑/循环左/右移、……)
5程序控制(转移、比较相等转移、……)
6模糊指令
7数据传送(取数、存数、进栈、出栈、……)
8其他指令
3.3.1数据传送类指令
取数指令
存数指令
传递指令
交换指令
MOVE指令
堆栈指令
3.3.2算术运算类指令
加、减法指令
自增、自减指令
比较指令
测试指令
逻辑运算指令
清零指令
取反/求补指令
乘/除法指令
最大/最小值指令
乘积累加指令
记忆标志位:
C—进/借位标志
V—溢出标志
H—加法半字节进位标志
N—正负标志位
Z—零标志位
3.3.3位操作类指令
位测试指令BITA、BITB
位置1指令BSET
位清零指令BCLR
3.3.4移位类指令
算术左移(ASL)
逻辑左移(LSL)
算术右移(ASR)
逻辑右移(LSR)
循环左移(ROL)
循环右移(ROR)
协助记忆:
算术:
Arithmetic
逻辑:
Logic
左:
Left
右:
Right
循环:
Rotate
3.3.5程序控制类指令
短转移指令(地址偏移量:
-128~+127)
长转移指令(地址偏移量:
-32768~+32767)
位条件转移指令(地址偏移量:
-128~+127)
BRCLR
BREST
循环控制指令
跳转指令
无条件转移JMP
绝对转移调用JSR
相对转移调用BSR
3.3.6模糊指令
MEM
REV
REVW
WAV
3.3.7其他指令
表插补指令
中断指令
变址操作指令
指针和变址计算指令
条件码指令
停止与等待模式指令
后台模式与空操作
3.4CPU12与CPU08的比较
3.5.1HCS12汇编源代码格式
基本概念
编译器
伪指令
语句元素
标号
操作码
操作数(常数、#、圆点)
注释
3.5.2MT-IDEforHCS12开发环境中的汇编伪指令
变量定义
A1:
.balign1
A2:
.balignw1
数字常数与字符串常数定义
常数赋值与文本替代符伪指令
.definePI=3.14
存储定位伪指令
文件包含伪指令
.include
3.5.3CodeWarriorforHCS12开发环境中的汇编伪指令
变量定义
LABEL1:
DS.B1
LABEL2:
DS.W1
数字常数与字符串常数定义
常数赋值与文本替代符伪指令
PI:
EQU3.14
存储定位伪指令
文件包含伪指令
INCLUDE
MT-IDEforHCS12集成开发环境
简称MT环境
Freescale公司
CodeWarriorforHCS12集成开发环境
简称CW环境
4.1.1MT-IDEforHCS12集成开发环境
4.1.2CodeWarriorforHCS12集成开发环境
4.2.1嵌入式系统工程文件组织
4.2.2列表文件(*.LIS或*.LST)
列表文件的行内容格式:
4.2.3目标代码文件(*.S19)
目标代码文件是以S记录(八种)格式表示的机器码文件
4.2.4与链接相关的地址信息文件
4.3.1小灯闪烁汇编工程在MT环境下的文件组织
1与芯片相关的程序文件
DG128ASM.h--定义芯片映像寄存器名
Vector.s--定义中断向量表
Isr.s--中断处理子程序
Start12.s--系统启动文件
MCUInit.h--芯片初始化头文件
MCUInit.s--芯片初始化文件
2硬件对象控制文件
LED.h–小灯控制引脚宏定义
包含小灯驱动所需头文件
小灯控制引脚宏定义
小灯驱动子程序声明
LED.s–小灯驱动子程序
定义子程序LEDInit:
初始化
定义子程序LED_L_A:
驱动小灯"亮","暗"
3通用程序文件
Includes.h–总头文件
工程中用到的头文件
有关常量命名
GeneralFun.s–通用子程序
定义子程序DelayX:
延时
4主程序文件
main.s–主程序
工程描述
包含总头文件
主程序
内部直接调用子程序
子程序编写规范(以LED.s为例)
4.3.2MT环境下第一个汇编工程的链接信息文件
链接信息文件linker.ld
链接有两种模式
内存直接模式
内存扩展模式
4.3.3MT环境下第一个汇编工程的执行过程
4.4.1小灯闪烁C工程在MT环境下的文件组织
4.4.2MT环境下第一个C工程的链接信息文件
链接信息文件linker.ld
内容与汇编链接信息相同
4.4.3MT环境下第一个C工程的执行过程
4.5.1小灯闪烁汇编工程在CW环境下的文件组织
4.5.2CW环境下第一个汇编工程中的链接信息文件
4.5.3CW环境下第一个汇编工程的执行过程
4.6.1小灯闪烁C工程在CW环境下的文件组织4.6.2CW环境下第一个C工程中的链接信息文件
4.6.3CW环境下第一个C工程的执行过程
4.6.1小灯闪烁C工程在CW环境下的文件组织4.6.2CW环境下第一个C工程中的链接信息文件
4.6.3CW环境下第一个C工程的执行过程
映像寄存器名
C工程中调用汇编语句的格式
中断函数的声明
5.1.1基本概念
1.异步串行通信的格式(NRZ)
2.串行通信的波特率
定义:
每秒内传送的位数。
单位:
b/s或bps
常用:
1200bps、4800bps、9600bps……
3.奇偶校验
奇校验:
校验位为0或1,使得1的数目是奇数
偶校验:
校验位为0或1,使得1的数目是偶数
4.串行通信的传输方式
单工:
1根数据线
全双工:
2根数据线
半双工:
1根数据线
5.1.2RS-232C总线标准
1.采用负逻辑
逻辑“1”:
-15V~-3V
逻辑“0”:
+3V~+15V
2.传输距离≤30m,通信速率≤20Kbps
3.接口
9芯、25芯
地线、发送数据线、接收数据线
5.2.1SCI的外围硬件电路
5.2.2SCI的基本编程原理
SCI的主要功能是:
接收时,把外部的单线输入的数据变成一个字节的并行数据送入MCU内部;
发送时,把需要发送的一个字节的并行数据转换为单线输出。
5.3.1SCI波特率寄存器
根据波特率设置寄存器的公式:
BR=fBUS/(16×Bt)
举例:
总线频率fBUS=19.6608MHz,
定义波特率Bt=9600(针对SCI0)
SCI0BDL=0x80;//须先给低8位赋值
SCI0BDH=0x00;//再给高5位赋值
5.3.2SCI控制寄存器1
缩写:
SCI0CR1、SCI1CR1
位定义:
举例:
设置允许SCI、正常码输出、8位数据、无校验
SCI0CR1=Ox00;
5.3.3SCI控制寄存器2
缩写:
SCI0CR2、SCI1CR2
位定义:
举例:
设置允许发送、允许接收,查询方式收发
SCI0CR2=0x0C;
5.3.4SCI状态寄存器1
缩写:
SCI0SR1、SCI1SR1
位定义:
只读
常用:
D7=1:
可以发送数据;D7=0:
不可以发送数据,需等待
D5=1:
可以取出数据;D5=0:
不可以取出数据,需等待
5.3.5SCI状态寄存器2
缩写:
SCI0SR2、SCI1SR2
位定义:
只读
常用:
D0=1:
正在接收数据;
5.3.6SCI数据寄存器
缩写:
SCI0DRH、SCI0DRL、SCI1DRH、SCI1DRL
位定义:
5.4.1SCI初始化
5.4.2发送一个数据与接收一个数据
5.5.1串行通信子函数
SCI.h:
串行通信头文件
串行通信寄存器及标志位定义
串行通信相关函数声明
SCIInit.c:
串行口SCI0初始化函数
voidSCIInit(void)
SCI.c:
串行发送与接收通用子函数
voidSCISend1(INT8Uo)
voidSCISendN(INT8Un,INT8Uch[])
INT8USCIRe1(INT8U*p)
INT8USCIReN(INT8Un,INT8Uch[])
5.5.2查询方式收发测试工程
查询方式收发测试工程主函数文件main.c
中断方式测试工程辅助工具
中断方式HCS12C语言主程序
串行中断子函数声明(isr.h)
#ifndefISR_H//避免重复定义
#defineISR_H
voidISR_Receive(void);//接收中断函数声明
void__attribute__((interrupt))ISR_Empty(void);
void_start(void);//复位函数(StartCode.s中定义,特殊)
//芯片开关总中断的宏定义
#defineENABLE_INTERRUPTS__asm__("cli")//开中断
#defineDISABLE_INTERRUPTS__asm__("sei")//关中断
//开关各模块中断的宏定义
//开放或禁止SCI0的接收中断的宏定义
#defineEnableSCIReIntSCI0CR2|=0x20//开放SCI0接收中断
#defineDisableSCIReIntSCI0CR2&=0xDF//禁止SCI0接收中断
#endif
串行中断函数(isr.c)
//ISR_Receive:
SCI0接收中断函数
void__attribute__((interrupt))ISR_Receive(void)
{
INT8Ui;
INT8USerialBuff[1];//存放接收数据的数组
DISABLE_INTERRUPTS;//关总中断
i=SCIReN(1,SerialBuff);//等待接收1个数据
if(i==0)SCISendN(1,SerialBuff);//发送接到的数据
ENABLE_INTERRUPTS;//开总中断
}
//ISR_Empty:
空中断函数定义
void__attribute__((interrupt))ISR_Empty(void)
{
}
5.6.1将串口端用作电源
5.6.2握手
5.6.3唤醒功能
空闲线唤醒
地址标志唤醒
6.1.1键盘模型及接口
键盘模型(通、断)
键盘接口:
独立式键盘、矩阵式键盘
6.1.2键盘的基本问题
键的识别
抖动问题
重键问题
键值计算方法(以符号“1”为例)
6.2.1键盘函数定义头函数(KB.h)
//键盘扫描识别寄存器及标志位定义
#defineKB_PPTH//键盘接在PTH口上
#defineKB_DDDRH//相应的方向寄存器
#defineKB_PEPERH//相应的上拉下拉电阻允许寄存器
#defineKB_PSPPSH//相应的极性选择寄存器
#defineKB_IEPIEH//相应的中断允许寄存器
#defineKB_IFPIFH//相应的中断标志寄存器
///键盘扫描识别函数声明
voidKB_Init(void);//键盘初始化
INT8UKB_Scan1(void);//扫描读取键值
INT8UKB_Def(INT8UKB_valve);//键值转为定义值
INT8UKB_ScanN(INT8UKB_count);//多次扫描键盘
6.2.2键盘函数定义(KB.c)
键盘初始化的函数
voidKB_Init(void)
扫描一次读取键值的函数
INT8UKB_Scan1(void)
扫描KB_count次读取键值的函数
INT8UKB_ScanN(INT8UKB_count)
将键值KB_valve转为定义值的函数
INT8UKB_Def(INT8UKB_valve)
6.2.3测试工程的主函数(main.c)
6.3.1扫描法LED显示编程原理
8段数码管由8个发光二极管(LED)组成
需有8位(即1个字节)数据来控制各个位段的亮灭
6.3.1扫描法LED显示编程原理
6.3.2接口实例
6.3.3数码管HCS12C语言实例
1.LED函数定义头文件(LED.h)
2.LED函数定义文件(LED.c)
4连排LED初始化函数
voidLEDInit(void)
在4连排LED上显示以Buf为首地址的4个数据
voidLEDShow(INT8U*Buf)
在第i个LED上显示数字c
voidLEDShow1(INT8Ui,INT8Uc)
3.测试工程的主函数(main.c)
第1步:
禁止总中断
第2步:
芯片初始化
第3步:
SCI模块初始化、LED控制引脚初始化
第4步:
LED初始显示“0123”
第5步:
开放SCI接收中断
第6步:
开放总中断
第7步:
若正确收到数据,刷新显示缓冲区
第8步:
转第7步
6.4.1LCD的特点
低电压微功耗
平板型结构
使用寿命长
被动显示
显示信息量大且易于彩色化
无电磁辐射
6.4.2LCD的分类
按电光效应分类
电场效应类
电流效应类
电热写入效应类
热效应类
按显示内容分类
字段型
点阵字符型
点阵图形型
按LCD的采光方式分类
带背光源
不带背光源
6.5.1点阵字符型液晶显示模块的基本特点
字符群:
5×8或5×11点阵块
主控制电路:
HD44780
内部具有字符发生器
自定义字符RAM
数据显示RAM
标准接口特性
模块结构紧凑、轻巧、装配容易。
单+5V电源供电
低功耗、高可靠性。
6.5.2HD44780的引脚与时序---引脚
6.5.3HD44780的编程结构
1.指令寄存器(IR)
2.数据寄存器(DR)
3.忙标志(BF)
4.地址计数器(AC)
5.显示数据寄存器(DDRAM)
6.字符发生器ROM(CGROM)
7.字符发生器RAM(CGRAM)
6.5.4HD44780的指令集
点阵字符型LCD编程
6.6.1LCD函数定义头文件(LCD.h)
液晶显示寄存器及标志位定义
液晶显示相关函数声明
6.6.2LCD函数定义(LCD.c)
初始化LCD函数
voidLCDInit(void)
HD44780显示屏显示str所指向的32个数据
voidLCDShow(INT8Ustr[])
执行给定的cmd命令,且延时
voidLCD_Command(unsignedcharcmd)
6.6.3测试工程的主函数(main.c)
第1步:
定义初始显示缓存并赋初值
第2步:
禁止总中断
第3步:
芯片初始化
第4步:
串行口初始化、LCD初始化
第5步:
开放总中断
第6步:
LCD显示初始化
第7步:
若正确收到32个数据,则显示到LCD
第8步:
转第7步
7.1.1功能描述
7.1.2SPI模块的I/O引脚
从机选择引脚
主出从入引脚MOSI
主入从出引脚MISO
SPI串行时钟引脚SPSCK
7.2.1SPI模块的寄存器
7.2.2SPI编程基本方法
SPI初始化
第1步:
写控制字到SPICR,确定是否允许SPI接收中断、SPI的工作方式、时钟极性、时钟相位、是否允许SPI等。
第2步:
写控制字到SPISCR,确定SPI的波特率。
发送与接