Overview
本文针对tiny6410裸机程序中的Led、Button、Timer、Interrupt 等控制程序进行分析,部分代码由国嵌相关代码修改得到。
(PS:需安装好jlink和rvds2.2,对于代码中所有include到的文件可以在Reference中找到)
Led
电路图
Tiny6410核心板的LED1、LED2、LED3、LED4分别连接到了GPK4、GPK5、GPK6、GPK7。电路图如下:
led.h
使用 #ifndef LED 来避免重复的包含文件(每个头文件都建议加上)
module_cfg.h 里进行了模块名的定义 #define LED
使用#ifdef LED判断是否已经定义模块,已经定义则使宏定义和函数声明有效(配合module_cfg.h可以方便的关闭对应的模块,减少不必要的编译)
1 |
|
led.c
LedDelay 只为简单的延时函数,需要准确的计时可查看Timer章节
LedPortInit 为初始化对应的GPIO为输出模式(翻查s3c6410芯片手册的GPK寄存器可知)
LedRun 为流水灯程序,根据LED电路图可知:IO输出为低电平时,LED点亮;IO输出为高电平时,LED熄灭
1 |
|
Button
电路图
Tiny6410底板按键button18 分别连接到GPN05、GPL11、GPL12,电路图如下:
使用轮循方式实现按键识别
设置GPN03 为输入3 对应LED1~4,按键按下时,对应的LED会被点亮
轮循GPNDAT判断按键是否按下
GPN0
led_io.h
1 |
|
led_io.c
1 |
|
使用中断方式识别按键
The interrupt controller in the S3C6410X is composed of 2 VIC’s (Vectored Interrupt Controller, ARM PrimeCell PL192) and 2 TZIC’s (TrustZone Interrupt Controller, SP890).
Two TZIC’s and VIC’s are daisy-chained to support up to 64 interrupt sources. (可以查看s3c6410芯片手册看到对应的64个中断源)
GPN03对应中断源为INT_EINT0,该中断源对应了三个中断信号(External interrupt 0 ~ 3 )3为外部中断模式(GPNCON),禁止上拉下拉电阻(GPNPUD),配置中断方式为GPN0、1为低电平触发,GPN2、3为上升沿触发(EINT0CON0)
程序入口需要Enable VIC、Enable IRQ、Disable All INT(可查看Reference里面的main.c)
主要配置流程如下
设置GPN0
清除对应的中断悬起位(EINT0PEND)
配置中断服务地址程序(VIC0VECTADDR)
使能中断源(VIC0INTENABLE)
清除中断屏蔽位(EINT0MASK)
具体代码如下:
key_int.h
1 |
|
key_int.c
1 |
|
Timer
s3c6410定时器概述
The S3C6410X RISC microprocessor comprises of five 32-bit timers. These timers are used to generate internal interrupts to the ARM subsystem. In addition, Timers 0 and 1 include a PWM function (Pulse Width Modulation), which can drive an external I/O signal. The PWM for timer 0 and 1 have an optional dead-zone generator capability, which can be utilized to support a large current device. Timer 2, 3 and 4 are internal timers with no output pins.
一般的配置流程如下:
- 程序入口需要Enable VIC、Enable IRQ、Disable All INT(可查看Reference里面的main.c)
- 停止所有的定时器(TCON)
- 配置定时器:获取g_PCLK,设置Prescaler(TCFG0),设置MUX(TCFG1),设置TCNTBn。(主要配置了定时器产生中断间隔,如果需要输出PWM,需要配置TCMPBn,同时使能PWM输出)
- 清除中断悬起位(TINT_CSTAT)
- 配置中断服务程序地址(VIC0VECTADDR+NUM_TIMERn*4)
- 使能对应中断源(VIC0INTENABLE)
- 清除中断屏蔽位(TINT_CSTAT)
- 启动定时器(TCON)
timer.h
1 |
|
timer.c
1 |
|
Reference
该章节包含如下文件(描述可能比较模糊,大部分在s3c6410官方裸机测试代码里均可找到):
main.c – 程序入口
inc.h – 包含的头文件
module_cfg.h – 模块配置
def.h – 类型定义
gpio.h – gpio地址
library.h – 地址操作宏定义
intc.h – 中断寄存器地址
intc.c – 屏蔽所有中断操作函数
sfr6410.h – SFR地址
sysc.h – 系统控制函数头文件
sysc.c – 系统控制函数
system.h
option.h
main.c
1 |
|
inc.h
1 |
|
module_cfg.h
1 |
|
def.h
1 | /************************************************************************************** |
gpio.h
1 | /************************************************************************************** |
library.h
1 | /************************************************************************************** |
intc.h
1 | /************************************************************************************** |
intc.c
1 | /************************************************************************************** |
sfr6410.h
1 | /************************************************************************************** |
sysc.h
1 | /************************************************************************************** |
sysc.c
1 | /************************************************************************************** |
system.h
1 | /************************************************************************************** |
option.h
1 | /************************************************************************************** |