?? 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 + -