嵌入式系统原理及应用 第四章习题

第四章 硬件作业习题
7、编写一程序,用查询的方式,对S3C2410X激光投影键盘的A/D转换器的第0通道连续进行100A/D转换,然后将其结果求平均值。注意:A/D转换器有独立的模拟信号输入引脚AIN0---AIN9
解:
1)计算预分频值
由于A/D转换器的最高输入时钟为2.5MHz,取为1MHz,
预分频值+1 = 50M/1M = 50
所以  预分频值 = 49
2)程序如下:
#define rADCCON (*(volatile unsigned *)0x58000000)
#define rADCDAT0 (*(volatile unsigned *)0x5800000c)
#define pref 49
#define ch 0
int adc(int chan)
{
rADCCON=(1<<14)|(pref<<6)|(ch<<3)|1; //设置预分频、通道、启动转换
while(rADCCON&0x8000==0);            //查询转换是否结束
return rADCDAT0&0x3ff;              //读取并返回转换结果
}
void main()
{
int adc_data=0, i;
for(i=0;i<100;i++)
adc_data+=adc(ch);
adc_data=adc_data/100;
printf("adc average is: %d\n"adc_data);
}
9S3C2410X中断控制器的工作过程是怎样的?对于IRQ,整个中断过程是怎样的(中断控制器处理,向CPU请求,转到中断入口,转去获得中断服务程序的首地址,执行中断服务程序)?
答:S3C2410X中断控制器有56个中断源,对外提供24个外中断输入引脚,内部所有设备都有中断请求信号,例如DMA控制器、UARTIIC等等。
    S3C2410XARM920T内核有两个中断,IRQ中断和快速中断FIQ
中断仲裁:当中断控制器接收到多个中断请求时,其内的优先级仲裁器裁决后向CPU发出优先级最高的中断请求信号或快速中断请求信号。
中断系统结构:主要由中断源和控制寄存器两大部分构成,其寄存器主要有4种:模式、屏蔽、优先级、挂起(标志)寄存器等。
(1)中断控制器的工作过程:
中断源
中断源
(无子中断)
(有子中断)
                     
FIQ
                                             
IRQ
(2)接收到IRQ中断时,由中断控制器处理,经过中断源挂起寄存器(如果是有子中断的中断源还要经过子中断源挂起寄存器和子中断源屏蔽寄存器),查看是否有中断请求,有中断请求经过中断模式寄存器标志IRQ中断,经过中断屏蔽寄存器查看允许中断,允许中断再经过中断挂起寄存器查看是否有中断请求,有中断请求向CPU请求,转到中断入口,转去获得中断服务程序的首地址,执行中断服务程序
10、编写一程序,使用外部中断EINT0,用中断方式对端口C做数据输入。(注意对中断系统和相关引脚进行初始化)
解:
#include <stdio.h>
#define rGPCCON    (*(volatile unsigned *)0x56000020)     //
#define rGPCDAT      (*(volatile unsigned *)0x56000024)     //
#define rGPFCON      (*(volatile unsigned *)0x56000050)     //
#define rSRCPND      (*(volatile unsigned *)0x4a000000)     //
涉水喉
#define rINTMSK      (*(volatile unsigned *)0x4a000008)     //
#define rINTPND      (*(volatile unsigned *)0x4a000010)     //
#define rEXTINT0  (*(volatile unsigned *)0x56000088)     //
#define pISR_EINT0  (*(volatile unsigned *)(_ISR_STARTADDRESS+0x48)) //
void    gpio_test(void)
{
    Uart_Printf(GPIO C Input test!\n);
    rGPCCON = 0x00;                                    //设置C口为输入
    rGPFCON = rGPFCON & (0x03) | 0x02;//上位置F口的第0位为中断输入激光绣花机
    rSRCPND &= 0x01;                        //清除外中断0请求标志
    rINTMSK &= 0x01;                        //开外中断0的屏蔽
pISR_EINT0 = (int)Eint0Int;            //设置中断向量
   
Uart_Printf(Press the EINT0/1 buttons or Press any key to exit.\n);
Uart_Getch( );                         //等待按键退出
    rINTMSK |= 0x01;                    //屏蔽外中断0
}
static void __irq Eint0Int(void)
{
    int    dd;
    dd = rGPCDAT & 0xffff;                         //读取C口输入的数据
Uart_Printf("Test GPIO C dd = %d\n,dd);        //显示读入的数据
rSRCPND |= 0x01;                                    //清除外中断0请求标志
rINTPND |= 0x01;                                    //清除外中断0服务标志
}
12、编写一程序,使用timer0产生并输出频率为10KHz、占空比为1/2的方波。设f pclk=50MHz。(注意对timer0和相关引脚初始化)
解:
1)计算预分频值、分频值、计数值
三者总值 = 50M/10K = 5000
取计数值为100、分频值为1/2,则
预分频值+1 = (5000/100)*1/2 = 25
预分频值 = 25-1 = 24 = 0x18
2盛泽坯布网)计算比较寄存器初值
已知计数初值为100,方波的占空比为1/2,则:
比较寄存器初值 = 100*1/2 = 50
   
3)程序如下:
#include <stdio.h>
#define rGPBCON (*(volatile unsigned *)0x56000010) //GPB口配置寄存器
#define rTCFG0  (*(volatile unsigned *)0x51000000) //定时器配置寄存器0
#define rTCFG1  (*(volatile unsigned *)0x51000004) //定时器配置寄存器1
#define rTCON  (*(volatile unsigned *)0x51000008) //定时器寄存器
#define rTCNTB0 (*(volatile unsigned *)0x5100000C) //定时器0计数初值寄存器
#define rTCMPB0  (*(volatile unsigned *)0x51000010) //定时器0比较初值寄存器
void  Timer0_ test (void)
{
    variable0 = 0;variable1 = 0;variable2 = 0;
    variable3 = 0;variable4 = 0;
Uart_Printf("\nTest  Timer0!\n");
    rGPBCON = rGPHCON & ~(0x03) | (0x02);        //设置GPB0T0输出
rTCFG0 = rTCFG0 & ~(0xffffff) | 0x000018; //死区宽度=0,T0预分频为0x18
    rTCFG1  =rTCFG1 & ~(0xf) | 0x0;          //设置T0分频值为1/2,其它不变
               
rTCNTB0 = 100;                              //设置T0计数初值
rTCMPB0 = 0x18;                              //设置T0比较初值
    rTCON = rTCON & ~(0xff) | 0x0a;                 //自动重装、手动装载T0
    rTCON = rTCON & ~(0xffffff) | 0x599901;        //自动重装、启动T0
}
15、编写一程序,使用S3C2410XUART2进行串行数据收发,要求用脉冲请求中断的方式、使用收/FIFO8个数据位、1个停止位、不校验,波特率为125kb/s。设Pclk50MHz。(提示:主程序对UART2初始化、引脚配置、中断初始化等,并进行一次发送;中断服务程序进行收发,并且清除中断请求标志和中断服务标志)
解:
程序如下:
#define        rUBRDIV2    (*(unsigned int*)0x50008028)
#define        rULCON2  (*(unsigned int*)0x50008000)
#define        rUCON2      (*(unsigned int*)0x50008004)
#define        rUFCON2    (*(unsigned int*)0x50008008)
#define        rURXH        (*(unsigned int*)0x50008024)
#define        rUTXH        (*(unsigned int*)0x50008028)
#define    www.537m    GPHCON   
#define   
#define        rINTMSK
#define        rINTSUBMSK
#define        pISR_UART2
#define        BIT_RXD2        1<<6
#define        BIT_TXD2        1<<7
#define        BIR_ERR2        1<<8
#define        BIT_UART2    1<<15
int        rx_num=0,     tx_num=0;
char        rx_array[210];
cwmp

本文发布于:2024-09-22 05:30:21,感谢您对本站的认可!

本文链接:https://www.17tex.com/tex/2/215538.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:中断   寄存器   中断请求   进行
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议