📄 main.c
字号:
#include "lf2407regs.h"
#include "math.h"
// 该程序用于测试DSP的CAPTURE模块,由TIMER1的比较模块输出一个PWM 波形,
//或输入CAP1引脚,选择通用定时器TIMER2作为时基,待CAP1捕捉该PWM的10次上升沿后,停止捕捉,并把10
// 次捕捉值存于数组result[10]中
// 初始化子程序
int result[10000]; // 定义一个存储结果的数组
int k=0; // 定义的中断次数值
// 系统初始化子程序
int initial()
{
asm(" setc INTM"); // 禁止所有中断
asm(" setc SXM"); // 抑制符号位扩展
asm(" clrc OVM"); // 累加器中结果正常溢出
asm(" clrc CNF"); // B0被配置为数据存储空间
*SCSR1=0x81FE; // CLKIN=10M,CLKOUT=4*CLKIN=40M
*WDCR=0x0E8; // 不使能看门狗,因为SCSR2中的WDOVERRIDE
// 即WD保护位复位后的缺省值为1,故可以用
// 软件禁止看门狗
*IMR=0x0000; // 禁止所有中断
*IFR=0x0FFFF; // 清除全部中断标志,"写1清0"
}
// 捕获单元1初始化子程序
int CAP1INT()
{
*T2PER=0X07ff; // 通用定时器2的周期寄存器为0XFFFF
*T2CON=0X1400; // 通用定时器2为连续增计数模式
*T2CNT=0X00; // 计数器清0
WSGR=0x0000; // 禁止所有等待状态
*CAPCONA=0X2040; // 设置捕获单元1为检测上升沿,且选择TIMER2为时钟
asm(" clrc INTM"); // 开总中断
*IMR=0X08; // 允许中断优先级4的中断
*EVAIMRC=*EVAIMRC|0X0001; // 允许CAPTURE1中断
*EVAIFRC=*EVAIFRC|0X0FFFF;
}
// 定时器1初始化子程序,使其比较单元输出一个PWM波形
/*int timer1int()
{
*MCRA=*MCRA|0X1008; // 配置IOPB4口为定时器1的比较输出
// 配置IOPA3口为捕捉功能
*GPTCONA=*GPTCONA|0X0042; //使能比较输出,通用定时器1比较输出极性高有效
*T1PER=0X1FE; // 给定时器1的周期寄存器赋值
*T1CON=0X1442; // 允许TIMER1比较输出,并且TIMER1为连续增计数
// 模式,使能定时器操作 ,16分频
*T1CNT=0X00; // 定时器1的计数器清0
*T1CMP=0X0FF; // 给定时器1的比较寄存器赋值
} */
// EVA模块的PWM初始化程序
int pwminitial()
{
*MCRA=*MCRA|0X0fc8; // IOPE1-6被配置为基本功能方式,PWM1-6 ,配置IOPA3口为捕捉功能
*ACTRA=0X0666; // PWM6,4,2 低有效,PWM5,3,1 高有效
*DBTCONA=0X0000; // 禁止死区
*CMPR1=0X0010;
*CMPR2=0X0020;
*CMPR3=0X0030;
*T1PER=0X0040; // 设置定时器1的周期寄存器,并设置CMPR1-3,以确定不
// 同的输出占空比
*COMCONA=0X8200; // 使能比较操作
*T1CON=0X1000; // 定时器1为连续增计数模式
}
// 主程序
main()
{
initial(); // 系统初始化
pwminitial(); //pwm初始化
//timer1int(); // 定时器1初始化,使其输出一个PWM波形供捕捉
CAP1INT(); // 捕获单元1初始化
*T1CON=*T1CON|0X0040;
*T2CON=*T2CON|0X0040; // 启动定时器2
while(1)
{
if(k==10000) break; // k保存中断次数值,是全局变量
}
asm(" setc INTM"); // 捕捉10次后,禁止再中断
while(1);
}
// 若是由于干扰引起其它中断,则执行此子程序
void interrupt INT_ALL()
{
asm(" clrc INTM"); // 返回前开中断
return;
}
// 捕捉中断服务程序
void interrupt capint()
{
int flag;
flag=*EVAIFRC&0X01; // 判断是否是CAP1中断
if(flag!=0x01)
{
asm(" clrc INTM"); // 返回前开中断
return; // 如果不是CAP4中断,则直接返回
}
load(); // 如果是CAP1中断,则装载捕捉值
*EVAIFRC=*EVAIFRC|0x01; // 写"1"清除CAP1中断标志
asm(" clrc INTM"); // 返回前开中断
return; // 中断返回
}
// 装载捕捉值子程序
int load()
{
result[k]=*CAP1FIFO; // 读取捕捉值,存于相应的数组
k++;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -