第四章 硬件作业习题
7、编写一程序,用查询的方式,对S3C2410X激光投影键盘的A/D转换器的第0通道连续进行100次A/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);
}
9、S3C2410X的中断控制器的工作过程是怎样的?对于IRQ,整个中断过程是怎样的(中断控制器处理,向CPU请求,转到中断入口,转去获得中断服务程序的首地址,执行中断服务程序)? 答:S3C2410X中断控制器有56个中断源,对外提供24个外中断输入引脚,内部所有设备都有中断请求信号,例如DMA控制器、UART、IIC等等。 S3C2410X的ARM920T内核有两个中断,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); //设置GPB0为T0输出
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、编写一程序,使用S3C2410X的UART2进行串行数据收发,要求用脉冲请求中断的方式、使用收/发FIFO,8个数据位、1个停止位、不校验,波特率为125kb/s。设Pclk为50MHz。(提示:主程序对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