飞思卡尔xs128单片机的简单定时中断
- 格式:pdf
- 大小:129.34 KB
- 文档页数:5
XS128单片机实验:中断扫描控制循环速度PORTA端口与1个8位拨码开关连接,PORTB端口与8只LED连接,IRQ引脚与一个按键链接,按键按下为低电平。
要求中断源触发,8位拨码开关控制8只LED灯的循环点亮速度。
///////////////////////////////////////////////// ///////////////////////////////////////////////// ///////////////////////////////////////////////// 有一个现象一直困扰着我,当中断按键按下时,程序会整个中断,BDM下载器仿真环境停止;这个原因已经找到了,因为,E0口是非屏蔽中断,E1口是可屏蔽中断,所以要接E1口。
///////////////////////////////////////////////// ///////////////////////////////////////////////// ///////////////////////////////////////////////// /#include ;/* common defines and macros */#include "derivative.h"/* derivative-specific definitions */#include "WQ.h"uchar IRQ_flag;/************************************************ *****************//功能:中断触发后实现流水灯的速度控制//This is the fourth program of mine//we use the interrupt to control the led************************************************* ****************//**********************IRQ 中断服务子程序***********************/#pragma CODE_SEG __NEAR_SEG NON_BANKEDvoid interrupt 6 IRQ_INT (void){IRQ_flag =1;}#pragma CODE_SEG DEFAULTvoid main(void) {uchar loop_index,loop_time;DDRA = 0X00;//A口做输入口;DDRB = 0XFF;//B口做输出口;loop_time = PORTA;loop_index=0;IRQ_flag=0;EnableInterrupts; //允许可屏蔽中断while(1){if(IRQ_flag) {IRQ_flag=0;loop_time=PORTA;}switch(loop_index){case 0:PORTB = 0xFE; break; case 1:PORTB = 0xFD; break;case 2:PORTB = 0xFB; break;case 3:PORTB = 0xF7; break; case 4:PORTB = 0xEF; break; case 5:PORTB = 0xDF; break; case 6:PORTB = 0xBF; break; case 7:PORTB = 0x7F; break;}loop_index++;if(loop_index==8) {loop_index =0;}delay_1(loop_time);}}。
飞思卡尔16位单片机9S12XS128使用(一些初始化)飞思卡尔16位单片机9S12XS128使用最近做一个关于飞思卡尔16位单片机9S12XS128MAA的项目,以前未做过单片机,故做此项目颇有些感触。
现记录下这个艰辛历程。
以前一直是做软件方面的工作,很少接触硬件,感觉搞硬件的人很高深,现在接触了点硬件发现,与其说使用java,C#等语言写程序是搭积木,不如说搞硬件芯片搭接的更像是在搭积木(因为芯片是实实在在拿在手里的东西,而代码不是滴。
还有搞芯片内部电路的不在此列,这个我暂时还不熟悉)。
目前我们在做的这个模块,就是使用现有的很多芯片,然后根据其引脚定义,搭接出我们需要的功能PCB 板,然后为其写程序。
废话不多说,进入正题。
单片机简介:9S12XS128MAA单片机是16位的单片机80个引脚,CPU是CPU12X,内部RAM8KB,EEPROM:2KB,FLASH:128KB,外部晶振16M,通过内部PLL 可得40M总线时钟。
9S12XS128MAA单片机拥有:CAN:1个,SCI:2个,SPI:1个,TIM:8个,PIT:4个,A/D:8个,PWM:8个下面介绍下我们项目用到的几个模块给出初始化代码1、时钟模块初始化单片机利用外部16M晶振,通过锁相环电路产生40M的总线时钟(9S12XS128系列标准为40M),初始化代码如下:view plaincopy to clipboardprint?1/******************系统时钟初始化****************/2void Init_System_Clock()3{4 asm { // 这里采用汇编代码来产生40M的总线5 LDAB #36 STAB REFDV78 LDAB #49 STAB SYNR10 BRCLR CRGFLG,#$08,*//本句话含义为等待频率稳定然后执行下一条汇编语句,选择此频率作为总线频率11 BSET CLKSEL,#$8012 }13}上面的代码是汇编写的,这个因为汇编代码量比较少,所以用它写了,具体含义注释已经给出,主函数中调用此函数即可完成时钟初始化,总线时钟为40M.2、SCI模块初始化单片机电路做好了当然少不了和PC之间的通信,通信通过单片机串口SCI链接到PC端的COM口上去。
1、定时器IC/OC功能选择寄存器TIOSIOS[7..0]IC/OC功能选择通道0 相应通道选择为输入捕捉(IC)1 相应通道选择为输出比较(OC)2、定时器比较强制寄存器 CFORCFOC[7..0]设置该寄存器某个FOCn位为1将导致在相应通道上立即产生一个输出比较动作,在初始化输出通道时候非常有用。
【说明】这个状态和正常状态下输出比较发生后,标志位未被置位后的情况相同。
3、输出比较7屏蔽寄存器 OC7MOC7M[7..0]OC7(即通道7的输出比较)具有特殊地位,它匹配时可以直接改变PT7个输出引脚的状态,并覆盖各个引脚原来的匹配动作结果,寄存器OC7M决定哪些通道将处于OC7的管理之下。
OC7M中的各位与PORTT口寄存器的各位一一对应。
当通过TIOS将某个通道设定为输出比较时,将OC7M中的相应位置1,对应的引脚就是输出状态,与DDR中的对应位的状态无关,但OC7Mn并不改变DDR相应位的状态。
【说明】OC7M具有更高的优先级,它优于通过TCTL1和TCTL2寄存器中的OMn和OLn设定的引脚动作,若OC7M中某个位置1,就会阻止相应引脚上由OM和OL设定的动作。
4、输出比较7数据寄存器 OC7DOC7D[7..0]OC7M对于其他OC输出引脚的管理限于将某个二进制值送到对应引脚,这个值保存在寄存器OC7D中的对应位中。
当OC7匹配成功后,若某个OC7Mn=1,则内部逻辑将OC7Dn送到对应引脚。
OC7D中的各位与PORTT口寄存器的各位一一对应。
当通道7比较成功时,如果OC7M中的某个位为1,OC7D中的对应位将被输出到PORTT的对应引脚。
【总结】通道7的输出比较(OC7)具有特殊的位置,在OC7Mn和OC7Dn两个寄存器设置以后,OC7成功输出后将会引起一系列的动作。
比如:OC7M0=1,则通道0处在OC7的管理下,在OC7成功后,系统会将OC7D0的逻辑数据(仅限0或者1)反应在PT0端口上。
S128学习笔记(一)GPIO 模块S128 IO操作主要有三个寄存器数据寄存器(PORTX)数据方向寄存器(DDRX) 上拉上拉电阻控制寄存器PUCR)一. GPIO概述通用I/O:GPIO(General Purpose I/O),是I/O的最基本形式,它是一组输入或输出引脚,有时也称为并行I/O(parallel I/O)。
作为普通输入引脚,MCU内部程序可以读取该引脚,知道该引脚是“1”(高电平)或“0”(低电平),即开关量输入。
作为普通输出引脚,MCU内部程序由该引脚输出“1”(高电平)或“0”(低电平),即开关量输出。
大多数通用I/O引脚可以通过编程来设定工作方式为输入或输出,称之为双向通用I/O。
2. I/O口的使用方法MC9S12DG128 MCU有10个普通I/O口,分别是A口、B口、E口、H口、J口、K口、M 口、P口、S口、T口。
这些引脚中的大部分具有双重功能,其中A、B、E、K口只用做GPIO 功能,这里仅讨论它们编程方法。
使用这些I/O口主要设置如下寄存器:1)数据方向寄存器(Data Direction Register x,DDRx)DDRx的第7~0位分别记为DDRx7~DDRx0,这些位分别控制着x口引脚PORTx7~PORTx0是输入还是输出,若DDRxn=0,则引脚PORTAxn为输入,若DDRxn=1,则引脚PORTxn为输出。
复位时DDRx为$00。
(注:x代表A、B、E、K口中的某一个,n表示某一位)2)数据寄存器(Port x I/O Register,PORTx)PORTx的第7~0位分别记为PORTx7~PORTx0。
若A口的某一引脚PORTxn被定义。
成输出,程序使x口I/O寄存器PORTx的相应位PORTxn=0,则引脚PORTxn输出“低电平”;程序使PORTxn=1,则引脚PORTxn输出“高电平”。
若x口的某一引脚PORTxn被定义成输入,程序通过读取x口I/O寄存器PORTx,获得输入情况,0表示输入为“低电平”,1表示输入为“高电平”。
XS128智能车整体程序流程图
初始化过程电机启动前2s内完成工作
初始化完成工作
1、初始化锁相环倍频72MHz;
2、设定5个中断优先级分别是SCI0(串口接收中断)、PIT0(速度采集中断)、
TIM0(图像采集行[HREF]中断)、TIM1(图像采集场[VSYNC]中断)、PIT2(启动定时中断);
3、完成舵机初始化设初值为中间值并启动;
4、完成电机初始化设初值为0不启动(在启动定时中断服务程序中启动);
5、完成串口初始化、不启动接收中断
6、完成速度采集初始化、不启动中断
7、完成图像采集初始化、启动场中断,进入场中断服务程序后启动行中断
8、完成参数读入初始化、在PORTA端口读入;
9、完成启动定时初始化、启动定时中断;
10、开启中断使能。
启动定时中断服务程序中完成工作
1)根据电机启动前摄像头适应场地采集的图像计算出的图像二值化阈值并设定
阈值;并根据路径识别给出电机目标值
2)关闭启动定时中断;
3)启动速度采集控制中断;
4)启动串口接收中断;
5)启动电机。
系统初始化部分列表
小车启动后程序运行流程
1.进入图像场中断
2.。
基于飞思卡尔xs128单片机的简单定时中断(PIT)2009-10-08 21:47:40刚开始接触这款单片机,由于看的书基本上都是以dg128为原型来讲解的,故很多东西都是按照dg128的情况来移植到xs128上的,导致出了很多错误。
像定时器模块这部分,查了很多资料,最后发现xs128没有dg128所具有的MDC模数计数器模块,相对应的是定时模块PIT,然后在网上疯狂的找了很多资料,总结下来,自己花了一晚上弄了个最最简单的定时中断程序,实现1秒钟LED灯的闪烁。
PIT说明:S12PIT24B4CV1是一个模数递减计数器。
首先给计数寄存器设定一个初值,每经过一个总线周期,计数器进行一次减一操作,当计数器自减溢出时,触发中断。
因为总线周期是已知的,即可以通过计数器自减实现定时。
在XS128PIT模块中,需要用到得是如下几个寄存器。
1)、PIT Contorl and force Lad Micro Timer Register(PITCFLMT)该寄存器用于PIT模块的使能设置和工作方式设置。
通常设置该寄存器中的PITE为即可,即PITCFLMT_PITE=1,使PIT使能。
2)、PIT Channel Enable Register(PITCE)该寄存器用于对PIT模块中的4个通道使能进行设置。
如果使用某个通道时,对对应位进行置一即可,即PITCE_PCEx=1,其中x代表通道序号,为0~3。
3)、PIT Micro Timer Load Register 0 to 1 (PITMTLD0-1)该寄存器用于设置PIT模块中的8位计数器初值,以实现24位的计数。
设定值为0到255范围。
4)、PIT Load Register 0 to 3(PITLD0-3)该寄存器用于设置PIT模块中的16位计数器初值,和8位计数器配合而成24位计数器。
设定值范围0-65535。
5)、PIT Multiplex Register(PITMUX)该寄存器对定时器通道的8位时基进行选择。
9S12XS128 单片机开发工具包清华Freescale MCU/DSP 应用开发研究中心9S12XS128单片机开发工具包 (1)概述 (3)9S12XS128单片机 (3)9S12XS128开发工具包组件 (3)9S12XS128开发板及与PC 通信 (4)9S12XS128 开发板 (4)开发板的硬件连接 (5)PC机的设置 (6)监控程序及监控命令详解 (8)命令详解 (8)复位、中断向量表 (12)用户可以使用的RAM空间 (12)编译器CodeWarrior for HCS12 使用方法入门 (13)建立工程文件 (13)编写main.c 程序 (15)定义存储空间分配 (17)应用程序的编译 (18)向开发板下载程序 (20)运行应用程序 (21)概述这里描述的是一套9S12XS128 系列单片机开发系统套件。
以后的更新的版本见清华Freescale单片机应用开发研究中心的网站:。
开发系统主要由两个部分组成,分别是调试下载用的TBDML和开发用目标板。
其中TBDML的使用请参见文档“BDM for S12(TTBDM)用户手册V 34.pdf”。
目标板是有异步串行口的驱动的基本系统。
针对9S12XS128 芯片我们编写了9S12XS128目标板监控程序,可以方便地完成应用系统的开发。
用户可以在此基础上设计自己所需的目标母板,完成项目的初期开发。
应用软件完成后,用开发工具板擦除监控程序,下载最终的应用程序。
9S12XS128 单片机S12XS 16 位微控制器系列针对一系列成本敏感型汽车车身电子应用进行了优化。
S12X 产品满足了用户对设计灵活性和平台兼容性的需求,并在一系列汽车电子平台上实现了可升级性、硬件和软件可重用性、以及兼容性。
S12XS 系列可以经济而又兼容地扩展至带XGate 协处理器的S12XE 系列单片机,从而为用户削减了成本,并缩小了封装尺寸。
S12XS系列帮助设计者迅速抓住市场机遇,同时还能降低移植成本。
中断的关闭与开放开放MC56F8257中某个模块中断,通常需要开放总中断及模块中断来实现。
这两部分缺一不可,并且开放总中断在前,开放模块中断在后。
同理,关闭MC56F8257中某个模块中断,需要关闭总中断及模块中断来实现,先关闭模块中断,再关闭总中断;如果允许中断嵌套情况,不需关闭总中断。
开放MC56F8257总中断,通过清中断控制寄存器(INTC_CTRL)的INT_DIS位;关闭总中断,需置该位即可,具体代码如下:#define EnableInterrupt() INTC_CTRL&=~INTC_CTRL_INT_DIS_MASK#define DisableInterrupt() INTC_CTRL|=INTC_CTRL_INT_DIS_MASK开放或关闭模块中断,需设置模块内部的控制寄存器的相应位。
如开放QSCI模块的接收中断0,需置位QSCI控制寄存器1(QSCIx_CTRL1)中的RFIE位;关闭该中断,清RFIE 位即可,具体代码如下:#define EnableQSCIReInt(0) QSCI_C1(0)|=(QSCI1_CTRL1_RFIE_MASK)#define DisableQSCIReInt(0) QSCI_C1(0)&=(QSCI1_CTRL1_RFIE_MASK)中断优先级的设置DSP56800E内核支持5级中断:LP、0、1、2和3,其优先级别依次升高。
最低优先级LP只能由系统SWILP指令产生;0~2优先级用户可以编程设置,主要用于外设和外部中断请求;级别3是最高优先级且不可屏蔽。
具体设置某个中断源的中断优先级,可通过设置中断优先级寄存器(INTC_IPR0~INTC_IPR7)中的相应位。
如设置QSCI中断优先级,通过设置中断优先级寄存器(INTC_IPR2)中的QSCI0_RCV位实现,该位具体含义见表1所示。
从表1看出,QSCI中断可配置三个不同级别,即优先级0、1和2。