ARM实现URAT通信,看门狗中断,裸机开发
1、URAT通信
实现思路,原理图,芯片手册,通过查看原理图,找到对应的引脚,然后进行查找芯片手册,找到对应的控制器,现在我们用到的就是UART2这个控制器,然后配置对应的寄存器,让其开启工作,这样一个编程我们称之为寄存器编程,
#include "exynos_4412.h"
#define GPA1CON (*((unsigned int *)0x11400020))
#define ULCON (*((unsigned int *)0x13820000))
#define UCON (*((unsigned int *)0x13820004))
#define UBRDIV (*((unsigned int *)0x13820028))
#define UFRACVAL (*((unsigned int *)0x1382002c))
#define UTXH (*((unsigned int *)0x13820020))
#define URXH (*((unsigned int *)0x13820024))
#define UTRSTAT (*((unsigned int *)0x13820010))
void uart_init()
{
//初始化引脚 GPA1_0 GPA1_1
GPA1CON = GPA1CON & ~0xff | 0x22;
//初始化uart控制器
//ULCON
//ULCON = 0x3; //0b 0000011
UART2.ULCON2 = 0x3;
//UCON:开启了uart的发送与接收
//UCON = UCON & ~0xf | 0x5; // 0101
UART2.UCON2 = UART2.UCON2 & ~0xf | 0x5;
//波特率
//UBRDIV = 53;
//UFRACVAL = 4;
UART2.UBRDIV2 = 53;
UART2.UFRACVAL2 = 4;
}
void putc(char c)
{
//判断之前的发送完没有(发送寄存器是否还有数据)
while( !(UTRSTAT & 1 << 1) ) ;
//赋值给发送寄存器,开始发送
UTXH = c;
}
void puts(char * str)
{
while(*str)
{
putc(*str++);
}
}
char getc(void)
{
//串口控制器自动接收存储到接收寄存器
//判断是否接收到数据
while( !(UTRSTAT & 1) ) ;
//从接收寄存器中读取字符
char c;
c = URXH;
return c;
}
int main()
{
char c;
uart_init();
puts("hello world\r\n");
while(1)
{
c = getc();
puts("recv:");
putc(c);
puts("\r\n");
}
//printf();打印
//1、组织字符串:把要打印的内容转为字符串 "abcd %d %s",10,"hello" printf源码
//2、发送字符串:串口操作 puts()
return 0;
}
2、看门狗中断
#include"exynos_4412.h"
#include"uart.h"
void delay()
{
int i,j;
for(i = 0;i < 1000;i++)
{
for(j = 0;j < 10000;j++);
}
}
void wdt_init()
{
//10s
//复位模式
//设置预分频
WDT.WTCON = WDT.WTCON & ~(0xff<<8) | 249<<8;
//设置固定分频
WDT.WTCON = WDT.WTCON & ~(0x3<<3) | 3<<3;
//设置复位
WDT.WTCON |= 1;
//配置重载器
WDT.WTDAT = 31250;
//配置计数器
WDT.WTCNT = 31250;
}
void wdt_start()
{
//启动看门狗
WDT.WTCON |= 1<<5;
}
void wdt_stop()
{
//关闭看门狗
WDT.WTCON &= ~(1<<5);
}
int main()
{
int a = 100;
char c;
uart_init();
//printf("hello!a=%d\r\n",a);
puts("hello world\r\n");
wdt_init();
wdt_start();
while(1)
{
c = getc();
//喂狗
WDT.WTCNT = WDT.WTDAT;
printf("recv data is :%c\r\n",c);//1、解析格式化字符串;2、puts()发送
//delay();
}
return 0;
}
3、按键中断
#include"exynos_4412.h"
#include"uart.h"
//裸机开发,设置key2中断
void key2_exit_init()
{
//GPIO控制器
//中断初始化,引脚GPX1_1
GPX1.CON=GPX1.CON & ~(0xf<<4)|(0xf<<4);
//设置触发模式
EXT_INT41_CON=EXT_INT41_CON & ~(0x7<<4) |(0x3<<4);
//使能中断
EXT_INT41_MASK=EXT_INT41_MASK & (~(0x1<<1));
//GIC中断控制器
//使能中断
ICDDCR=1;
//使能ID
ICDISER.ICDISER1=ICDISER.ICDISER1 | (1<<25);
//设置优先级,先移位清0,再设置优先级
ICDIPR.ICDIPR14=ICDIPR.ICDIPR14 & ~(0xff<<8)| (0x1<<8);
//将信号发送给CPU0,通过一个40个寄存器管理,每个寄存器管理4个,每8位表示一个ID
//ICDIPR14是对应管理的寄存器,设置这个寄存器会达到这样的操作
ICDIPTR.ICDIPTR14=ICDIPTR.ICDIPTR14 & ~(0xff<<8) |(0x1<<8);
//设置CPU使能,每个CPU对应一个寄存器
CPU0.ICCICR=1;
//设置过滤优先级
CPU0.ICCPMR=CPU0.ICCPMR & ~(0xff) | 0xff;
}
void do_irq()
{
int irq_num;
//触发中断处理
printf("irq\r\n");
//获取到中断ID
irq_num=CPU0.ICCIAR & 0x3ff;
printf("irq_num=%d\r\n",irq_num);
switch(irq_num)
{
case 57:
//清除中断源的挂起
EXT_INT41_PEND=EXT_INT41_PEND | 1<<1;
//清除中断ID的挂起
ICDICPR.ICDICPR1=ICDICPR.ICDICPR1 | 1<<25;
break;
case 58:
break;
};
CPU0.ICCEOIR=irq_num;
return ;
}
int main()
{
int a = 100;
uart_init();
printf("hello!a=%d\r\n",a);
//开启按键中断
key2_exit_init();
while(1);
return 0;
}