智能车制作

标题: 新手自学总结lesson1IO编程以及系统工作时钟设置~以后不定时放自学收获 [打印本页]

作者: 信雪神话    时间: 2012-10-29 22:25
标题: 新手自学总结lesson1IO编程以及系统工作时钟设置~以后不定时放自学收获
注意:
1,开始环境搭建,必须选择对应的软件,否则没有对应的单片机型号。
file:///C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\msohtml1\01\clip_image002.jpg2,安装完驱动后,必须将附带的两个dll文件拷贝到安装程序目录下,gdi的子目录里否则,不能下载程序。
3,程序下载完成后,必须点击箭头按钮,程序才能开始运行,与51类单片机自动运行不同,或者也可以拔掉BDM模块给芯片供电也可以使程序运行。
lesson1    IO编程以及系统工作时钟设置
程序设计收获
1,写程序要注意思想,本次在写的过程中点灯时,在点亮后忘了加延时,以至于一直点不亮,幸亏朱学长帮忙,在这里再谢谢了。
2,遗留问题
a,主要是晶振的计算方法,感觉我选的晶振的频率不对,理论生成的晶振频率越高而闪烁的频率越快,可实际运行时不是这样。
b,是驱动的选择没有完成训练!因为关于寄存器的资料不太全
系统时钟设置
free scale mcu 自带时钟模块(CRG),在系统运行前必须进行时钟的初始化操作以设置系统的运行时钟从而完成精确的定时。
与此相关的寄存器有
CRG合成器寄存器(SYNR)
CRG参考分频寄存器(REFDV)
  CRG标志寄存器(CRGFLG)
   CRG中断使能寄存器(CRGINT)
        CRG时钟选择寄存器(CLKSEL)
        CRGPLL控制寄存器(PLLCTL)
        CRG实时中断控制寄存器(RTICTL)
        CRG看门狗控器寄存器(COPCTL)
FVCO=2*FOSC*(SYN+1)/(REF+1)
BUSCLK=PLLCLK/2
§       初始化步骤:
(1)禁止中断;
(2)CLKSEL的第7位置0,选择系统时钟源为OSCCLK,在PLL程序执行前,内部总线频率=OSCCLK/2;
(3)禁止PLL;
(4)根据需要的时钟频率设置SYNR和REFDV寄存器;
(5)打开PLL;
(6)通过判断CRGFLG寄存器的LOCK位,确定PLL是否稳定;
(7)时钟频率稳定后,允许锁相环时钟源作为系统时钟源;
(8)设置是否允许IRQ中断、是否允许看门狗
注意:在没有程序的单片机里,如果不加锁相程序,则总线频率为8M
fosc=8M.
程序实例:
void jingzhen(unsignedint pinl)
{
  CLKSEL=0X00;
  PLLCTL=0XE1;
  switch (pinl)
  {
    //case 11:SYNR=6911;REFDV=9999;break;
    case 24:SYNR=2;REFDV=1;break;
    case 48:SYNR=5;REFDV=1;break;
    case 96:SYNR=5;REFDV=0;break;
    default:break;
  
  }
  PLLCTL=0X60;
  asm NOP;
  asm NOP;
  asm NOP;
  while(!(CRGFLG_LOCK==1));
  CLKSEL=0X80;
}
AB口IO设置
–     输入输出: (1位对应一个端口)
•        方向寄存器A口- DDRA, B口- DDRB
•        0输入,1输出
–     输出时的驱动能力(1位对应一组端口)
•        A口-RDRIV[0]; B口-RDRIV[1];
•        1全额驱动能力,0缩减(全额/3)驱动能力
–     上拉电阻控制 (1位对应一组端口)
•        A口-PUCR[0];B口-PUCR[1];
•        1使用,0不使用
位访问方法:
PORTA |=0x01,//A PART PA1=1;这样写的优点是不干涉其他位的状态。
RDRIV.BIT0=1;
RDRJ_RDRJ7=1;
例程设计
确定使用的端口如下:
PM5, PJ7, PB0~7
#include <hidef.h>      /* common defines and macros */
#include "derivative.h"      /* derivative-specific definitions */
#include <MC9S12XS128.h>
void delay(unsigned int t)   //毫秒级延时
{  
   unsigned int j;
   unsigned char a,b;
   for(j=0;j<t;j++)
    {
     for(b=2;b>0;b--)
       for(a=124;a>0;a--)
       {
         asm NOP;
         asm NOP;
       }
    }
}
   
void jingzhen(unsigned int pinl)
{
CLKSEL=0X00;
PLLCTL=0XE1;
switch (pinl)
  {
   //case 11:SYNR=6911;REFDV=9999;break;
   case 24:SYNR=2;REFDV=1;break;
   case 48:SYNR=5;REFDV=1;break;
   case 96:SYNR=5;REFDV=0;break;
   default:break;
  
  }
PLLCTL=0X60;
  asmNOP;
  asmNOP;
  asmNOP;
//while(!(CRGFLG_LOCK==1));
delay(100);
CLKSEL=0X80;  
}
void main(void) {
  /*put your own code here */
  
       EnableInterrupts;
//PM5, PTJ7, PB0~7
DDRA=0X00;
  DDRM=0XFF;
DDRJ=0XFF;
DDRB=0XFF;
jingzhen(48);
  
for(;;)
  {
   _FEED_COP(); /* feeds the dog */
  PTM_PTM5=1;
  PTJ_PTJ7=1;
  PORTB=0X00;
  PTM_PTM5=0;
  PTJ_PTJ7=0;
  delay(500);
  PTM_PTM5=1;
  PTJ_PTJ7=1;
  PORTB=0Xff;
  PTM_PTM5=0;
  PTJ_PTJ7=0;
  delay(500);
   
  }/* loop forever */
  /*please make sure that you never leave main */
}


作者: 信雪神话    时间: 2012-10-29 22:28
努力努力再努力!加油加油再加油!{:soso_e130:}
作者: 信雪神话    时间: 2012-10-29 22:37
遗留问题
a,主要是晶振的计算方法,感觉我选的晶振的频率不对,理论生成的晶振频率越高而闪烁的频率越快,可实际运行时不是这样。
b,是驱动的选择没有完成训练!因为关于寄存器的资料不太全

系统时钟设置
c,while(!(CRGFLG_LOCK==1));语句依然没办法实现。不知道问题在哪。但是delay(100),可以跳过貌似可以执行。


守候大神降临!!!


作者: 信雪神话    时间: 2012-10-30 10:10
竟然没有回复~~唉~~
作者: wangzhen123    时间: 2012-10-30 19:45
加油哈。。。

作者: 信雪神话    时间: 2012-10-30 19:59
wangzhen123 发表于 2012-10-30 19:45
加油哈。。。

一起~~哦~~

作者: 信雪神话    时间: 2012-10-30 20:03
今天学PWM~~
作者: 信雪神话    时间: 2012-10-31 18:16
第二课太多了

作者: 信雪神话    时间: 2012-11-8 22:42
lesson1.IO编程以及系统工作时钟设置补充版
程序设计收获
1,写程序要注意思想,本次在写的过程中点灯时,在点亮后忘了加延时,以至于一直点不亮,幸亏朱学长帮忙,在这里再谢谢了。
2,遗留问题
a,主要是晶振的计算方法,感觉我选的晶振的频率不对,理论生成的晶振频率越高而闪烁的频率越快,可实际运行时不是这样。
b,while(!(CRGFLG_LOCK==1));;语句依然没办法实现。不知道问题在哪(后面就可以实现了)。
c,驱动功率以及上下拉电阻的选用依然没有使用,因为寄存器不熟啊。
系统时钟设置
free scale mcu 自带时钟模块(CRG),在系统运行前必须进行时钟的初始化操作以设置系统的运行时钟从而完成精确的定时。
3,后期终于发现了时钟设置秘密
VCOFRQ1  VCOFRQ0  SYNR5  SYNR4  SYNR3  SYNR2  SYNR1  SYNR0
  0                 0   对应晶振频率小于24大于16
  0                        1        对应晶振频率小于24大于40
  1                        1        对应晶振频率小于40大于60
如果这一组寄存器未设置好则PLL是不能运行的。
相关寄存器
        PLL就是锁相环,作用就是提高总线的工作频率。平时我们用的晶振也就几M到十几M吧,但是这样的话系统运行速度比较慢,有时我们需要把总线时钟提高到40M或者80M等等,这个是后就要用到PLL了,根据下面这三个公式设置总线频率。

注意:当POSTDIV=0时,fPLL=fVCO

SYNDIV由SYNR寄存器的0-5位设定:
注意:写操作的条件PLLSEL=1,即在PLL启动后写无效了。只有没启用PLL时才可以写。
SYNR寄存器的7、6位(即VCOFRQ[0~1])怎么设定呢,看下图。可见这2位由fVCO的大小决定。

REFDIV由REVDV寄存器的0-5位决定:
假设外部晶振我们选用16M,欲设置fBUS=40M,怎么设置呢?
        要设置fBUS=40M,则fPLL=80M,令POSTDIV=0,则fPLL=fVCO=80M,则令VCOFRQ=01, 80M=2*16M*(SYNDIV+1)/(REFDIV+1),即(SYNDIV+1)/(REFDIV+1)=5/2,可以设SYNDIV=4,REFDIV=1.这样系统的时钟就设置成了40M。
实际应用:
将系统时钟设置成40M,并根据此设置定时器,每隔400ms led闪烁一次。
CLKSEL=0X00; // 初始化PLL前先使用外部晶振
PLLCTL_PLLON=1; // 开启 PLL
SYNR =0x40 | 0x04; // pllclock=2*osc*(1+SYNR)/(1+REFDV)=80MHz;
REFDV=0x80 | 0x01;
POSTDIV=0x00;
_asm(nop); // BUS CLOCK=40M
_asm(nop);
while(!(CRGFLG_LOCK==1)); //等待PLL稳定
CLKSEL_PLLSEL =1

CRG合成器寄存器(SYNR)
        CRG参考分频寄存器(REFDV)
        CRG标志寄存器(CRGFLG)
        CRG中断使能寄存器(CRGINT)
                CRG时钟选择寄存器(CLKSEL)
                CRG PLL控制寄存器(PLLCTL)
                CRG实时中断控制寄存器(RTICTL)
                CRG看门狗控器寄存器(COPCTL)
FVCO=2*FOSC*(SYN+1)/(REF+1)

BUSCLK=PLLCLK/2

初始化步骤
(1)禁止中断;
(2)CLKSEL的第7位置0,选择系统时钟源为OSCCLK,在PLL程序执行前,内部总线频率=OSCCLK/2;
(3)禁止PLL;
(4)根据需要的时钟频率设置SYNR和REFDV寄存器;
(5)打开PLL;
(6)通过判断CRGFLG寄存器的LOCK位,确定PLL是否稳定;
(7)时钟频率稳定后,允许锁相环时钟源作为系统时钟源;
(8)设置是否允许IRQ中断、是否允许看门狗
注意:在没有程序的单片机里,如果不加锁相程序,则总线频率为8M
fosc=8M.
        原因如下:单片机在复位时,时钟选择寄存器CLKSEL初始全为0,其中                                     PLLSEL置0表示bus clock=oscclk/2.
程序实例:
void jingzhen(unsigned int pinl)
{
  CLKSEL=0X00;
  PLLCTL=0XE1;
  switch (pinl)
  {
    case 11:SYNR=0x00 | 0x07; REFDV=0x80|0x0a;break;
    case 24:SYNR=0x00 | 0x02;REFDV=0x80|0x01;break;
         case 40:SYNR=0x40 | 0x04;REFDV=0x80|0x01;break;
    case 48:SYNR=0xb0 | 0x05;REFDV=0x80|0x01;break;
         case 60:SYNR=0xb0 | 0x0a;;REFDV=0x80|0x01;break;
    default:break;
  }
  PLLCTL=0X60;
  POSTDIV=0x00;
  asm NOP;
  asm NOP;
  asm NOP;
  while(!(CRGFLG_LOCK==1));
  CLKSEL=0X80;  
}


作者: 信雪神话    时间: 2012-12-1 16:41
BDM坏了一周~~终于又能学习了~~~



哈哈~~任意超频子函数~~有用的收藏者了
void jingzhen(unsigned int pinl)
{
  CLKSEL=0X00;
  PLLCTL=0XE1;
  switch (pinl)
  {
    case 8:break;
    case 11:SYNR=0x00 | 0x07;REFDV=0x80|0x0a;break;
    case 16:SYNR=0x00 | 0x01;REFDV=0x80|0x01;break;
    case 24:SYNR=0x00 | 0x02;REFDV=0x80|0x01;break;
    case 32:SYNR=0x00 | 0x03;REFDV=0x80|0x01;break;
          case 40:SYNR=0x00 | 0x04;REFDV=0x80|0x01;break;
    case 48:SYNR=0x40 | 0x05;REFDV=0x80|0x01;break;
    case 56:SYNR=0x40 | 0x06;REFDV=0x80|0x01;break;
          case 64:SYNR=0x40 | 0x07;REFDV=0x80|0x01;break;
          case 72:SYNR=0x40 | 0x08;REFDV=0x80|0x01;break;
          case 80:SYNR=0xc0 | 0x09;REFDV=0x80|0x01;break;
          case 88:SYNR=0xc0 | 0x0a;REFDV=0x80|0x01;break;
          case 96:SYNR=0xc0 | 0x0b;REFDV=0x80|0x01;break;
    default:break;
  }
  PLLCTL=0X60;
  POSTDIV=0x00;
  asm NOP;
  asm NOP;
  asm NOP;
  while(!(CRGFLG_LOCK==1));
  CLKSEL=0X80;  
}
作者: 诚_诺    时间: 2013-3-28 20:35
请问楼主是拿什么资料来一课一课的学习?
作者: dlyt03    时间: 2013-3-29 23:00
学习了!!




欢迎光临 智能车制作 (http://dns.znczz.com/) Powered by Discuz! X3.2