当然,为了便于调整频率,最好是添加数码显示功能。至于手动脉冲功能,可通过GPIO中的键入程序来改造,每按一次键就产生一个由高到底的电平跳变。 此外,用示例程序Demo_LETMR_Interrupt也可以改造成,方法是用mkl_lptmr.c中的LPTMR0_CMR作为脉冲频率的调整变量。 void lptmrInit (void) { SIM_SCGC5 |= SIM_SCGC5_LPTMR_MASK; /*打开lptmr时钟 */ LPTMR0_CSR |= LPTMR_CSR_TCF_MASK | LPTMR_CSR_TIE_MASK; /* 清除标志位 开启中断 */ LPTMR0_PSR |= LPTMR_PSR_PCS(1); /* 使用1KHz时钟源 */ LPTMR0_CMR = n; /* 默认2分频 n=500即为1s */ LPTMR0_CSR |= LPTMR_CSR_TEN_MASK; /* 开启LPTMR */ } 当n=500时,输出频率=1KHz时钟源/2分频*500=1hz; 当n=5000时,输出频率=0.1 hz; 当n=5时,输出频率=100 hz。 5.译码器功能,它是视输入的情况,按照已规定好的对应关系来确定输出对应值。 以3-8译码器74HC138为例,它有3个输入端A、B、C,8个输出端Y0~Y7。 其程序结构如下: void ledSet() { INT8U ucMode; // 令Y0~Y7皆为“1”; // ucMode=C*4+B*2+A; switch(ucMode) { case 0: { // 令Y0=0; break; } case 1: { // 令Y1=0; break; } case 2: { // 令Y2=0; break; } case 3: { // 令Y3=0; break; } case 4: { // 令Y4=0; break; } case 5: { // 令Y5=0; break; } case 6: { // 令Y6=0; break; } case 7: { // 令Y7=0; break; } } } 由于开发板上不能直接提供3个按键和8个LED指示灯来模拟完成该实验,故这里只给出一个程序的结构以供参考。 6.计数器与频率计的实现,由于示例程序中侧重于定时功能,没涉及脉冲计数,所以需要参考其它资料编写,相关内容如下: u16 LPT_Ctr; // 用于存储脉冲数 int main(void) { // 开启脉冲计数 LPTM_Init(); // LPTM初始化 使用通道2 // 开启PIT中断 PIT_Init(1000); // 开启一个1000MS中断 用于脉冲计数 while(1) { // 显示LPT_Ctr 的计数值 } } //函数名:LPTM_Init //功 能:LPTM模块初始化 //说 明:channel 计数端口号LPTM_CH2,PORTC5 // 计数范围为0~65535 void LPTM_Init() { //开启模块时钟 SIM->SCGC5|=SIM_SCGC5_PORTC_MASK; //开启port口的模块时钟 PORTC->PCR[5]&=~(PORT_PCR_MUX_MASK); PORTC->PCR[5]|=PORT_PCR_MUX(4); //配置io口为LPTM通道 PORTC->PCR[5]|=PORT_PCR_PE_MASK; PORTC->PCR[5]&=~(PORT_PCR_PS_MASK); //下拉电阻配置 SIM->SCGC5|=SIM_SCGC5_LPTIMER_MASK; //开启LPTM模块时钟 LPTMR0->CSR|=LPTMR_CSR_TPS(Ch); //选择输入通道 LPTMR0->CSR&=~LPTMR_CSR_TPP_MASK; //设置上升沿触发计数 LPTMR0->CSR|=LPTMR_CSR_TFC_MASK; //设置在自由运行模式下 LPTMR0->CSR|=LPTMR_CSR_TMS_MASK; // 设置为计数模式 LPTMR0->PSR|=LPTMR_PSR_PBYP_MASK; // 忽略分频及滤波 LPTMR0->CSR|=LPTMR_CSR_TEN_MASK; // 开启模块 } //函数名:LPTM_Counter //功 能:LPTM模块计数器的计数值获取 //说 明: 返回值为十六位的计数值 u16 LPTM_Counter(void) { u16 ch; ch=(LPTMR0->CNR); //读取计数器的计数值 LPTMR0->CSR&=~(LPTMR_CSR_TEN_MASK); //关闭模块 LPTMR0->CSR|=LPTMR_CSR_TEN_MASK; //开启模块,计数器清零 return(ch); } // 函数名:PIT_Init // time 设置定时器的时间,单位ms void PIT_Init(u32 time) { GetProcessorInfo(); //计算系统时钟 time=time*(PInfo.BusClock/1000); //开始定时器配置 SIM->SCGC6|=SIM_SCGC6_PIT_MASK; //开启pit模块时钟 PIT->MCR&=~PIT_MCR_MDIS_MASK; //开启pit模块 PIT->MCR|=PIT_MCR_FRZ_MASK; //开启pit模块 PIT->CHANNEL[pit].LDVAL=(uint32_t)time; //设置延时时间 NVIC_EnableIRQ(PIT0_IRQn);break; //开启内核接受中断 PIT->CHANNEL[pit].TFLG|=PIT_TFLG_TIF_MASK; //清除标志位 PIT->CHANNEL[pit].TCTRL|=(PIT_TCTRL_TEN_MASK|PIT_TCTRL_TIE_MASK);//开启定时器及中断 } //函数名:PIT0_IRQHandler //功 能:PIT中断通道0 void PIT0_IRQHandler(void) { PIT->CHANNEL[0].TFLG|=PIT_TFLG_TIF_MASK;//清标志位 LPT_Ctr=LPTM_Counter(); } 计数器与频率计的主要区别就是一个有计数时间的限制,而另一个却不用。当计数脉冲为单位时基脉冲时,通过进制处理就可形成计时器。 7.串行通讯,在YL-KL26Z开发板上是以虚拟串口的方式由USB口来实现串行通讯的。借助串行通讯可在一定情况下替代数码显示缺失的不足,它是一种重要的程序调试和观察手段。此外,串行通讯也是连接上、下位机的桥梁,有了它就为自动测评提供了基础,通过读取下位机的实验数据就可分析出实验的成绩,为输出成绩报告予以有力的支持。 当然该实验平台的功能不仅局限于此,因为YL-KL26Z开发板的模拟信号处理能力还没有很好的使用,发挥16位ADC和12位DAC的作用,则可以将实验平台的功能延伸到模拟电路实验,从而形成一个综合型的实验平台。 当然YL-KL26Z开发板的潜力还很强大,还需近一步向前探索,以实现多媒体化的操作平台。
|