视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
嵌入式ARM复习题2(含答案
2025-09-26 16:30:16 责编:小OO
文档
六、要求在P0.9引脚输出如图周期信号,已知Fpclk=11.0592M,请在用定时器实现代码。

________

|        |_____

 0.5s      0.1s

1. 定时器定时方法(查询)

void  Time0Init(void)

{  

    T0PR =  9;                    // 设置定时器0分频为10分频,得110592Hz

    T0MCR = 0x03;                   // 匹配通道0匹配中断并复位T0TC

    T0MR0 = 110592;            // 比较值(0.1S定时值)

    T0TCR = 0x01; 

}

int  main(void)

{  

    int i=0;

    PINSEL0 = 0x00000000;                    // 设置管脚连接GPIO   

IO0DIR = 1<<9;                         // 设置I/O为输出

    Time0Init();                                // 初始化定时器0    

    while(1)    

    {  

        while( (T0IR&0x01) == 0 );             // 等待定时时间到

        T0IR = 0x01;                         // 清除中断标志 

        i++;

if(i<=5) 

        {

IO0SET = 1<<9;    

        }

        else  

        {

            i=0;

IO0CLR = 1<<9;    

        }                

   }

   return(0);

}

定时器定时方法(中断)

void   __irq IRQ_Timer0(void)

{

        T0IR = 0x01;                            // 清除中断标志 

        i++;

if(i<=5) {  IO0SET = 1<<9;      }

        else {

             i=0;

IO0CLR = 1<<9;    

        }                

        VICVectAddr = 0;                    // 向量中断结束

}

void  INT_Init(void)

{

    VICIntSelect = 0x00000000;           

    VICVectCntl0 = 0x20|4;

    VICVectAddr0 = (int)IRQ_Timer0;   

VICIntEnable = 1<<4;    

}

void  Time0Init(void)

{  

    T0PR = 9;                 // 设置定时器0分频为100分频,得110592Hz

    T0MCR = 0x03;               // 匹配通道0匹配中断并复位T0TC

    T0MR0 = 110592;             // 比较值(0.1S定时值)

    T0TCR = 0x01; 

}

int i;

int  main(void)

{  

    IRQEnable();                        

    PINSEL0 = 0x00000000;                        // 设置管脚连接GPIO   

IO0DIR = 1<<9;                             // 设置I/O为输出

Time0Init();                                // 初始化定时器0    

INT_Init();

    while(1);

   return(0);

}

七、P236 请用程序实现通过P0.0口测量图中低电平脉冲的宽度。

T0TC = 0;

    T0PR = 0;

    while((IO0PIN & 0x01) != 0);

    T0TCR = 0x01;

    while((IO0PIN & 0x01) == 0);

    T0TCR = 0x00;

    time = T0TC;

八(1)、要求在P0.9引脚输出如图周期信号,已知Fpclk=11.0592M,请用PWM方法实现代码。

________

|        |_____

 0.5s      0.1s

      

int  main(void){  

PINSEL0 = 2<<18;                // 设置PWM6连接到P0.9管脚

PWMPR = 0x00;                    // 不分频,计数频率为Fpclk

PWMPCR = (0<<6)|(1<<14);     // 允许PWM6输出,单边PWM

    PWMMCR = 0x02;                // 设置PWMMR0匹配时复位PWMTC

    PWMMR0 = Fpclk*0.6 ;      // 设置PWM周期

    PWMMR6 = Fpclk*0.5 ;      // 设置PWM占空比

   

    PWMLER = 1|(1<<6);            // PWMMR0、PWMMR6锁存

PWMTCR = 0x09;                // 启动定时器,PWM使能

    While(1);

    return(0);

}

八(2)、要求在P0.9引脚输出如图周期信号,已知Fpclk=11.0592M,信号频率为5 Hz,请用PWM方法实现代码。

            _____________________

    ______ |                      |_______

      %  20              %60         %20

int  main(void){  

PINSEL0 = 2<<18;                // 设置PWM6连接到P0.9管脚

PWMPR = 0x00;                    // 不分频,计数频率为Fpclk

    PWMPCR = (1<<6)|(1<<14);     // 允许PWM6输出,双边PWM

    PWMMCR = 0x02;                // 设置PWMMR0匹配时复位PWMTC

    PWMMR0 = Fpclk/5 ;      // 设置PWM周期

    PWMMR5 = (Fpclk/5)*0.2 ;   

PWMMR6 = (Fpclk/5)*0.8 ;      

   

    PWMLER = 1|(1<<5)|(1<<6);    // PWMMR0、PWMMR5、PWMMR6锁存

PWMTCR = 0x09;                // 启动定时器,PWM使能

    while(1);

    return(0);

}

九、一个工程为了让LED常年不断闪烁引入了看门狗。看门狗的工程一般应用方法:用定时器产生一个固定中断时间,在中断服务程序里喂狗。

定时器初始化:

void  Time0Init(void)

{      

T0PR = 99;                        // 设置定时器0分频为100分频,得110592Hz

T0MCR = 0x03;                   // 匹配通道0匹配中断并复位T0TC

T0MR0 = 3*110592;                  // 比较值(3S定时值)

T0TCR = 0x03;                     // 启动并复位T0TC

T0TCR = 0x01;     

VICIntSelect = 0x00;              // 所有中断通道设置为IRQ中断

VICVectCntl0 = 0x24;        

VICVectAddr0 = (uint32)ISR_Time;   // 设置中断服务程序地址向量 

VICIntEnable = 0x00000010;            // 使能定时器0中断

}

看门狗初始化:

void WDT_INI()

{

    WDTC =  Fpclk ;          // 设置WDTC,喂狗重装值

    WDMOD = 0x03;              // 复位并启动WDT 

    WdtFeed();               // 进行喂狗操作 

}

中断里定时喂狗:

void __irq  ISR_Time(void)

{  

     WdtFeed();                     

    T0IR = 0x01;               // 清除中断标志

    VICVectAddr = 0x00;    // 通知VIC中断处理结束

}

主功能函数;

int  main(void)

{  

    PINSEL0 = 0x00000000;           // 设置管脚连接GPIO       

    IRQEnable();

    IO2DIR = LEDCON;   

    Time0Init();                       // 初始化定时器0及使能中断  

    WDT_INI();

    while(1){

            if( (IO2SET&LEDCON) == 0 )    {  IO2SET =LEDCON;       }

            else   {   IO2CLR =LEDCON;    }    

                DelayNS(50);   

    }

return(0);

}下载本文

显示全文
专题