400 likes | 570 Views
第二章 9S12XS 单片机 内部结构分析. 单片机是如何工作的?. 吉林大学通信工程学院 单片机教学团队编写 2011.08. 陈万忠 2012.09.25 改版. 内部结构和管脚. 教材. CPU. 单片机的认识与实践. Lecture4 Page 3. CPU. 1. 程序计数器. 2. 指令寄存器. 3. 控制单元:译码、控制. 指令存储器. 4. 执行的运算. 7.CCR 寄存器. 数据存储器. 6. 运算结果. 5./6./8. 寄存器堆. 5. 运算数及来源. 2.2.3 核心寄存器组.
E N D
第二章 9S12XS单片机 内部结构分析 单片机是如何工作的? 吉林大学通信工程学院 单片机教学团队编写 2011.08 陈万忠2012.09.25改版 单片机的认识与实践
内部结构和管脚 教材
CPU 单片机的认识与实践 Lecture4 Page3
CPU 1.程序计数器 2.指令寄存器 3.控制单元:译码、控制 指令存储器 4.执行的运算 7.CCR寄存器 数据存储器 6.运算结果 5./6./8.寄存器堆 5.运算数及来源 单片机的认识与实践
2.2.3 核心寄存器组 1.累加器A、B2.变址寄存器X、Y3.堆栈指针(SP)4.程序计数器(PC)5.条件码寄存器(CCR)
2.2.3 核心寄存器组 书22页 图2-8 核心寄存器组
2.3 存储器 2.3.1 基本存储空间 后讲 2.3.2 扩展地址空间2.3.3 全局存储器映射2.3.4 MC9S12XS128全局存储器映射
2.3.1 基本存储空间 图2-9 S12X 64KB地址空间分布
堆栈 0x1FFB xx 0x1FFC 0x30 0x1FFD 0x0C 0x1FFE 0x56 0x1FFF 0x34 SP = 0x1FFE PC = 0x300C A = 0x34 B = 0x56 Register file after this instruction 0x3005: NOP 0x3006: LDS $2000 0x3008: PSHA 0x3009: PSHB 0x300A: JSR SubFunc 0x300C: PULLA 0x300D: PULLB ………..… SubFunc: 0x4050: NOP 0x4052: RTS 当前PC进栈 AB数据进栈 完成AB互换 当前栈顶内容送PC current executed instruction current stack pointer 单片机的认识与实践 Lecture4 Page9
Run 0x1FFB xx 0x1FFC xx 0x1FFD xx Register file after this instruction 0x1FFE xx 0x1FFF xx SP = undefined PC = 0x3006 A = 0x34 B = 0x56 current executed instruction 0x3005: NOP 0x3006: LDS $2000 0x3008: PSHA 0x3009: PSHB 0x300A: JSR SubFunc 0x300C: PULLA 0x300D: PULLB ………..… SubFunc: 0x4050: NOP 0x4052: RTS NOP: no operation, do nothing LDS : load stack pointer with a value PSHx: push the contains of register ‘x’ into stack PULLx: pull from the stack and put in register ‘x’ JSR : jump to subroutine RTS : return from subroutine
Run 0x1FFB xx 0x1FFC xx 0x1FFD xx Register file after this instruction 0x1FFE xx 0x1FFF xx SP = 0x2000 PC = 0x3008 A = 0x34 B = 0x56 current stack pointer 0x3005: NOP 0x3006: LDS $2000 0x3008: PSHA 0x3009: PSHB 0x300A: JSR SubFunc 0x300C: PULLA 0x300D: PULLB ………..… SubFunc: 0x4050: NOP 0x4052: RTS current executed instruction
Run 0x1FFB xx 0x1FFC xx 0x1FFD xx Register file after this instruction 0x1FFE xx 0x1FFF 0x34 SP = 0x1FFF PC = 0x3009 A = 0x34 B = 0x56 0x3005: NOP 0x3006: LDS $2000 0x3008: PSHA 0x3009: PSHB 0x300A: JSR SubFunc 0x300C: PULLA 0x300D: PULLB ………..… SubFunc: 0x4050: NOP 0x4052: RTS current executed instruction current stack pointer
Run 0x1FFB xx 0x1FFC xx 0x1FFD xx Register file after this instruction 0x1FFE 0x56 0x1FFF 0x34 SP = 0x1FFE PC = 0x300A A = 0x34 B = 0x56 0x3005: NOP 0x3006: LDS $2000 0x3008: PSHA 0x3009: PSHB 0x300A: JSR SubFunc 0x300C: PULLA 0x300D: PULLB ………..… SubFunc: 0x4050: NOP 0x4052: RTS current executed instruction current stack pointer
Run 0x1FFB xx 0x1FFC 0x30 0x1FFD 0x0C Register file after this instruction 0x1FFE 0x56 0x1FFF 0x34 SP = 0x1FFC PC = 0x4050 A = 0x34 B = 0x56 0x3005: NOP 0x3006: LDS $2000 0x3008: PSHA 0x3009: PSHB 0x300A: JSR SubFunc 0x300C: PULLA 0x300D: PULLB ………..… SubFunc: 0x4050: NOP 0x4052: RTS current executed instruction current stack pointer
Run 0x1FFB xx 0x1FFC 0x30 0x1FFD 0x0C Register file after this instruction 0x1FFE 0x56 0x1FFF 0x34 SP = 0x1FFC PC = 0x4052 A = 0x34 B = 0x56 0x3005: NOP 0x3006: LDS $2000 0x3008: PSHA 0x3009: PSHB 0x300A: JSR SubFunc 0x300C: PULLA 0x300D: PULLB ………..… SubFunc: 0x4050: NOP 0x4052: RTS current executed instruction current stack pointer
Run 0x1FFB xx 0x1FFC 0x30 0x1FFD 0x0C Register file after this instruction 0x1FFE 0x56 0x1FFF 0x34 SP = 0x1FFE PC = 0x300C A = 0x34 B = 0x56 0x3005: NOP 0x3006: LDS $2000 0x3008: PSHA 0x3009: PSHB 0x300A: JSR SubFunc 0x300C: PULLA 0x300D: PULLB ………..… SubFunc: 0x4050: NOP 0x4052: RTS current executed instruction current stack pointer
Run 0x1FFB xx 0x1FFC 0x30 0x1FFD 0x0C Register file after this instruction 0x1FFE 0x56 0x1FFF 0x34 SP = 0x1FFF PC = 0x300D A = 0x56 B = 0x56 0x3005: NOP 0x3006: LDS $2000 0x3008: PSHA 0x3009: PSHB 0x300A: JSR SubFunc 0x300C: PULLA 0x300D: PULLB ………..… SubFunc: 0x4050: NOP 0x4052: RTS current executed instruction current stack pointer
Run 0x1FFB xx 0x1FFC 0x30 0x1FFD 0x0C Register file after this instruction 0x1FFE 0x56 0x1FFF 0x34 SP = 0x2000 PC = 0x300E A = 0x56 B = 0x34 0x3005: NOP 0x3006: LDS $2000 0x3008: PSHA 0x3009: PSHB 0x300A: JSR SubFunc 0x300C: PULLA 0x300D: PULLB ………..… SubFunc: 0x4050: NOP 0x4052: RTS current executed instruction current stack pointer
2.4 并行I/O口 2.4.1 A、B、E和K口2.4.2 T、S、M、P、H和J口2.4.3 AD口
2.4.1 A、B、E和K口 1.数据方向寄存器2.数据寄存器3.上拉控制寄存器(PUCR)4.低功耗驱动寄存器(RDRIV)
1.数据方向寄存器 图2-15 A口数据方向寄存器(DDRA) 1=输出 0=输入
2.数据寄存器 图2-16 A口数据寄存器(PORTA)
3.上拉控制寄存器(PUCR) 图2-17 上拉控制寄存器(PUCR)
4.低功耗驱动寄存器(RDRIV) 图2-18 低功耗驱动寄存器(RDRIV)
4.低功耗驱动寄存器(RDRIV) 表2-4 A、B、E和K口I/O寄存器地址
2.4.2 T、S、M、P、H和J口 书28页 1.数据方向寄存器2.数据寄存器3.输入寄存器4.低功耗驱动寄存器5.上拉或下拉使能寄存器6.上拉或下拉选择寄存器
1.数据方向寄存器 图2-19 T口数据方向寄存器(DDRT) 1=输出 0=输入
2.数据寄存器 图2-20 T口数据寄存器PTT
3.输入寄存器 图2-21 T口输入寄存器PTIT
4.低功耗驱动寄存器 图2-22 T口低功耗驱动寄存器(RDRT)
5.上拉或下拉使能寄存器 图2-23 T口上拉或下拉使能寄存器(PERT)
6.上拉或下拉选择寄存器 ① T口对应的引脚被设置为输入;② 此引脚上拉或下拉被使能。
6.上拉或下拉选择寄存器 图2-24 T口上拉或下拉选择寄存器(PPST)
2.4.3 AD口 AD口有16个I/O引脚,数据方向寄存器、数据寄存器、低功耗驱动寄存器和上拉使能寄存器各有两个,用法与A口类似。开发应用系统时,它常作为A-D转换的模拟信号输入。
2.5.1 时钟模块 内部总线时钟为竞争是中的二分频 f bus=f osc/2 若外部时钟16MHz,则内部总线时钟为8MHz 后讲: 1.时钟分频寄存器(REFDV)2.时钟合成寄存器(SYNR)3. CRG时钟后分频寄存器(POSTDIV)4. CRG标志寄存器(CRGFLG)5. CRG时钟选择寄存器(CLKSEL)6. PLL控制寄存器(PLLCTL)
复位 • 初始化微控制器内部电路 • 将所有寄存器恢复成默认值 • 确认MCU的工作模式 • 禁止全局中断 • 关闭外设 • 将IO置为高阻输入状态 • 等待时钟振荡趋于稳定 • 从固定地址取得复位向量并开始执行指令 自动完成 单片机的认识与实践
中断向量表 YES, It is also the programmer’s responsibility to find this information from the datasheet. 单片机的认识与实践
复位 • 有多种引起复位的因素,有相应的标志位和向量(可以进行不同的初始化流程) • 上电复位 • 电源丢失复位 • 外部产生的手动复位信号 • 执行复位指令引发的复位 • 非法指令引起的复位 illegal instruction • 时钟丢失引起的复位 • 看门狗复位 • ……… 单片机的认识与实践
单片机的启动过程 外设寄存器 变量、堆栈 程序代码 上电复位后-> 单片机的认识与实践
明确了单片机的结构和工作过程,那么如何让单片机听我们的指挥,来为我们工作呢?明确了单片机的结构和工作过程,那么如何让单片机听我们的指挥,来为我们工作呢? • 进入第三章单片机最小系统 单片机的认识与实践