一:按键计数器。
将四个LED作为二进制输出,按键中断K2作为累加计数,每按下一下,LED二进制数加一,按键中断K3作为累减计数,每按下一下,LED二进制数减一,并将结果通过串口终端输出显示。在此基础上,可以进一步融合构思其它控制功能。
#include "exynos_4412.h"
static int num = 0;
/**********************************************************************
* @brief IRQ Interrupt Service Routine program body
* @param[in] None
* @return None
**********************************************************************/
void do_irq(void )
{
int irq_num;
irq_num = (CPU0.ICCIAR & 0x3FF);
switch (irq_num) {
case 58: //turn on LED2;turn off LED3
GPX2.GPX2DAT = 0x1 << 7;
GPX1.GPX1DAT &= ~0x1;
printf("IRQinterrupt !! turn on LED2; turn off LED3\n");
//Clear Pend
EXT_INT41_PEND|= 0x1 << 2;
ICDICPR.ICDICPR1 |= 0x1 <<26;
break;
case 57: //Turn on Led3;Turn off Led2
GPX2.GPX2DAT &= ~(0x1<< 7);
GPX1.GPX1DAT |= 0x1;
printf("IRQinterrupt !! Turn on LED3; Turn off LED2\n");
//Clear Pend
EXT_INT41_PEND |= 0x1 << 1;
ICDICPR.ICDICPR1 |= 0x1 <<26;
break;
}
// End ofinterrupt
CPU0.ICCEOIR = (CPU0.ICCEOIR & ~(0x1FF)) |irq_num;
}
void mydelay_ms(int ms)
{
int i, j;
while(ms--)
{
for (i = 0; i < 5;i++)
for (j = 0; j <514; j++);
}
}
int main(void)
{
//LED2 GPX2_7
GPX2.GPX2CON |= 0x1 <<28;
//LED3 GPX1_0
GPX1.GPX1CON |= 0x1;
//Led4 GPF3_4
GPF3.GPF3CON |= 0x1 <<16;
//Key_2 Interrupt GPX1_1
GPX1.GPX1PUD = GPX1.GPX1PUD & ~(0x3<< 2); // Disables Pull-up/Pull-down
GPX1.GPX1CON = (GPX1.GPX1CON & ~(0xF<< 4)) | (0xF << 4); //GPX1_1: WAKEUP_INT1[1](EXT_INT41[1])
EXT_INT41_CON =(EXT_INT41_CON & ~(0x7 << 4)) | 0x2 << 4;
EXT_INT41_MASK =(EXT_INT41_MASK & ~(0x1 << 1)); // Bit: 1 = Enables interrupt
//Key_3 Interrupt GPX1_2
GPX1.GPX1PUD = GPX1.GPX1PUD & ~(0x3<< 4); // Disables Pull-up/Pull-down
GPX1.GPX1CON = (GPX1.GPX1CON & ~(0xF<< 8)) | (0xF << 8); //GPX1_2:WAKEUP_INT1[2] (EXT_INT41[2])
EXT_INT41_CON =(EXT_INT41_CON & ~(0x7 << 8)) | 0x2 << 8;
EXT_INT41_MASK =(EXT_INT41_MASK & ~(0x1 << 2)); // Bit: 1 = Enables interrupt
/*
* GIC interrupt controller:
* */
// Enables thecorresponding interrupt SPI25, SPI26 -- Key_2, Key_3
ICDISER.ICDISER1 |= (0x1 <<25) | (0x1 << 26);
CPU0.ICCICR |= 0x1; //Global enablefor signaling of interrupts
CPU0.ICCPMR = 0xFF; //The prioritymask level.Priority filter. threshold
ICDDCR = 1; //Bit1: GICmonitors the peripheral interrupt signals and
// forwards pending interrupts to the CPUinterfaces2
ICDIPTR.ICDIPTR14 = 0x01010101; //SPI25 SPI26 interrupts are sent to processor 0
printf("\n********* GIC test ********\n");
while (1){
GPF3.GPF3DAT |= 0x1 << 4;
mydelay_ms(500);
GPF3.GPF3DAT &= ~(0x1<< 4);
mydelay_ms(500);
}
return 0;
}
二:串口终端命令控制器
通过串口终端输入来控制LED,
当串口输入”A”,回车,第1个LED亮,其它灭;
当串口输入”B”, 回车,第2个LED亮,其它灭;
当串口输入”C”, 回车, 第3个LED亮,其它灭;
当串口输入”C”, 回车,第4个LED亮,其它灭;
当串口输入”LEFT”, 回车,4个LED实现左流水灯;
当串口输入”RIGHT”, 回车,4个LED实现右流水灯;
在此基础上,可以进一步融合构思其它控制功能。
#include "exynos_4412.h"
void mydelay_ms(int time)
{
int i, j;
while(time--)
{
for (i = 0; i < 5; i++)
for (j = 0; j < 514; j++);
}
}
void uart_init(void)
{
/*UART2 initialize*/
GPA1.GPA1CON = (GPA1.GPA1CON & ~0xFF ) | (0x22); //GPA1_0:RX;GPA1_1:TX
UART2.ULCON2 = 0x3; //Normal mode, Noparity,One stop bit,8 data bits
UART2.UCON2 = 0x5; //Interrupt request or polling mode
/*
* Baud-rate 115200:src_clock:100Mhz
* DIV_VAL = (100*10^6 /(115200*16) -1) = (54.3 - 1) = 53.3
* UBRDIV2 = (Integer partof 53.3) = 53 = 0x35
* UFRACVAL2 = 0.3*16 = 0x5
* */
UART2.UBRDIV2 = 0x35;
UART2.UFRACVAL2 = 0x5;
}
void putc(const char data)
{
while(!(UART2.UTRSTAT2 & 0X2));
UART2.UTXH2 = data;
if (data == '\n')
putc('\r');
}
void puts(const char *pstr)
{
while(*pstr != '\0')
putc(*pstr++);
}
unsigned char getchar()
{
unsigned char c;
while(!(UART2.UTRSTAT2 & 0X1));
c = UART2.URXH2;
return c;
}
int main(void) {
char c, str[] = "uarttest!! \n";
//LED
GPX2.GPX2CON = 0x1 << 28;
uart_init();
while(1)
{
//Turn on LED
GPX2.GPX2DAT = GPX2.GPX2DAT | 0x1 << 7;
puts(str);
mydelay_ms(500);
//Turn off LED
GPX2.GPX2DAT = GPX2.GPX2DAT & ~(0x1 << 7);
mydelay_ms(500);
}
return 0;
}
|