本实验利用Plus1 7021自带的定时计数器介绍基本编程方法,涉及到中断使用7021平台自带的HDMI显示和定时计数器功能介绍基本编程方法,涉及到中断使用, Plus17021系统提供4个通用的16位计数定时器timer0到timer3Plus1 7021系统提供4个通用的16位计数定时器timer0到timer3; 每个计数定时器都支持计数到预设值时产生相应的中断信号。
...
| 中断号 |
Timer0 | 151 |
Timer1 | 152 |
Timer2 | 153 |
Timer3 | 154 |
对应的32位寄存器详细介绍,请参考我们提供的文档QAC628_regfile.pdf请参考我们提供的在线技术文档资料介绍, 如下:
...
这里简单介绍相关寄存器的含义,如下表所示:
| 控制寄存器 | 计数预值控制器 | 计数时钟预处理控制器 | 计数值控制器 |
Timer0 | timer0_ctrl bit[31:16] :保留 bit[15:14] :计数时钟选择 0: 系统时钟(default) 1: STC 90KHZ 时钟 bit13 :操作方式 0:单次操作(default) 1:重复操作 bit12 : 保留 bit11 :开关控制 0:关闭计数器 1:启动计数器 bit[10:0] :保留 | timer0_reload bit[31:16] :保留 bit[15:0] : 16位计数预值设置
|
| timer0_cnt bit[31:16] :保留 bit[15:0] : 16位计数值
|
timer1 | timer1_ctrl bit[31:16] :保留 bit[15:14] :计数时钟选择 0: 系统时钟(default) 1: STC 90KHZ 时钟 bit13 :操作方式 0:单次操作(default) 1:重复操作 bit12 : 保留 bit11 :开关控制 0:关闭计数器 1:启动计数器 bit[10:0] :保留 | timer1_reload bit[31:16] :保留 bit[15:0] : 16位计数预值设置
|
| timer1_cnt bit[31:16] :保留 bit[15:0] : 16位计数值
|
timer2 | timer2_ctrl bit[31:6] :保留 bit[5:2] :计数时钟选择 0: 系统时钟(default) 1: STC 90KHZ 时钟 bit1 :操作方式 0:单次操作(default) 1:重复操作 bit1 : 保留 bit0 :开关控制 0:关闭计数器 1:启动计数器 | timer2_reload bit[31:16] :保留 bit[15:0] : 16位计数预值设置
| timer2_pres_val bit[31:16] :保留 bit[15:0] : 16位计数时钟预值设置
| timer2_cnt bit[31:16] :保留 bit[15:0] : 16位计数值
|
timer3 | timer3_ctrl bit[31:6] :保留 bit[5:2] :计数时钟选择 0: 系统时钟(default) 1: STC 90KHZ 时钟 bit1 :操作方式 0:单次操作(default) 1:重复操作 bit1 : 保留 bit0 :开关控制 0:关闭计数器 1:启动计数器 | timer3_reload bit[31:16] :保留 bit[15:0] : 16位计数预值设置
| timer3_pres_val bit[31:16] :保留 bit[15:0] : 16位计数时钟预值设置
| timer3_cnt bit[31:16] :保留 bit[15:0] : 16位计数值
|
...
unsigned int stc_config; // 12.7
unsignedint timer0_ctrl; // 12.8
unsignedint timer0_cnt; // 12.9
unsignedint timer1_ctrl; // 12.10
unsignedint timer1_cnt; // 12.11
unsigned int timerw_ctrl; // 12.12
...
unsigned int stc_63_48; // 12.15
unsignedint timer2_ctl; // 12.16
unsignedint timer2_pres_val;// 12.17
unsignedint timer2_reload; // 12.18
unsignedint timer2_cnt; // 12.19
unsignedint timer3_ctl; // 12.20
unsignedint timer3_pres_val;// 12.21
unsignedint timer3_reload; // 12.22
unsignedint timer3_cnt; // 12.23
unsigned int stcl_0; // 12.24
...
unsigned int atc_2; // 12.29
unsignedint timer0_reload; // 12.30
unsignedint timer1_reload; // 12.31
};
#define STC_REG ((volatile struct stc_regs *)RF_GRP(12, 0))
定时器控制实验需要如下3个文件,如下:HDMI显示及定时器中断控制实验需要如下3个文件,如下:
1) 安装目录 \SP7021\workspace\sp7021\ 文件夹下的main.c
...
hw_init();
sys_init();
disp_hdmi_init();
timer_test_init();/*interrupt test api */
sp_interrupt_setup(); /* interrupt manager module init */ while(1_setup(); /* interrupt manager module init */
while(1);
}
Step1:首先时系统及硬件初始化:hw_init();sys_init();
Step2: HDMI 显示初始化设置disp_hdmi_init(),如下:
void disp_hdmi_init()
{
sp_disp_init();
sp_enable_log_to_osd();
sp_osd_draw_string("Display and Timer test...",240,50,20,113);
}
首先时系统及硬件初始化:hw_init();sys_init();
sp_enable_log_to_osd()的功能实现将串口调试信息printf()送到HDMI显示接口;
sp_osd_draw_string()的功能实现在HDMI显示画面的指定坐标位置显示ASCII字符
Step3: 然后时调用timer.c中定义的计数定时器初始化函数timer_test_init();
Step4: 最后调用系统中断管理函数sp_interrupt_setup();
...
是对应的中断处理函数操作,将中断的次数显示在IDE 环境的Terminal窗口,如图所示。环境的Terminal窗口,同时也送到HDMI终端显示。
void timer_test_init()
{
static interrupt_operation timer3_opt;
...