📄 ledon.c
字号:
#include "F2407REGS.H"
#include "ledon.h"
void inline disable()
{
asm(" setc INTM");
}
// 开总中断子程序
void inline enable()
{
asm(" clrc INTM");
}
// 初始化子程序
void Initial()
{
asm(" setc SXM"); // 抑制符号位扩展
asm(" clrc OVM"); // 累加器中结果正常溢出
asm(" clrc CNF"); // B0被配置为数据存储空间
for(i=0;i<40;i++)
{HmrBuff[i]=0;}
i=0x00;
Uj=0;
HmrOn=0x00;
HmrEn=0x00;
*SCSR1=0x81FE; // CLKIN=10M,CLKOUT=2*CLKIN=20M
*WDCR=0x0E8; // 不使能看门狗,因为SCSR2中的WDOVERRIDE
// 即WD保护位复位后的缺省值为1,故可以用
// 软件禁止看门狗
*IMR=0x0000; // 禁止所有中断
*IFR=0x0FFFF; // 清除全部中断标志,"写1清0"
//*MCRA=*MCRA&0x0FF; // IOPB端口配置为一般的I/O功能, TMS320LF240x的
// 端口均为8位,MCRA为16位因此控制了IOPA,和IOPB的设置
*MCRC=*MCRC&0x093FE; //IOPF,E设置
*MCRA=*MCRA&0x0FFF; //IOPA,B设置
*MCRB=*MCRB&0x0FF7E; // IOPC,D设置
*PBDATDIR=*PBDATDIR|0x0F0F0; // IOPB有关端口设置为输出方式,熄灭全部的LED灯
*PCDATDIR=*PCDATDIR|0x8181; // IOPC有关端口设置为输出方式
*PFDATDIR=*PFDATDIR|0x6C6C; // IOPF有关端口设置为输出方式
*PBDATDIR=*PBDATDIR&0x0FFDF; //关蜂鸣器*/
//*IMR=0x0002; // 允许INT2中断
*IMR=0x0003;
*IFR=0x0FFFF; // 清除全部中断标志,"写1清0"
WSGR=0X00; // 禁止所有的等待状态
}
void Timer1Init()
{
*EVAIMRA=*EVAIMRA|0X0080; // 允许定时器1的周期中断
*EVAIFRA=*EVAIFRA&0X0080; // 清除定时器1周期中断标志
*T1CON=0X160C; // Timer1为连续增计数模式,预分频值为64,使用内部时钟
*T1PER=0X0177; // Timer1的周期寄存器的值根据1ms延时和预分频值确定
*T1CNT=0X00; // Timer1的计数器清零
}
// PWM输出初始化
void PwmInit()
{
*MCRC=*MCRC|0X007E; // IOPE1-6被配置为基本功能方式,PWM7-12
*ACTRB=0X0666; // PWM12,10,8 低有效,PWM11,9,7 高有效
*DBTCONB=0X00; // 不使能死区控制
//*DBTCONB=0X0F54; //PWM 9,10间有死区
*T3CON=0X1000; // 定时器3为连续增计数模式
*T3PER=0X6000; // 设置定时器3的周期寄存器,
*T3CNT=0X00;
*CMPR4=0X1000; //并设置CMPR4-6,以确定不同的输出占空比
*CMPR5=0X3000;
*CMPR6=0X5000;
*COMCONB=0X8200; // 使能比较操作
}
// AD初始化子程序
void ADInit()
{
//*T4CNT=0X0000; // T4计数器清0
//*T4CON=0X170C; // T4为连续增计数模式,128分频,且选用内部时钟源
//*T4PER=0X75; // 设置T4的周期寄存器
//*GPTCONB=0X400; // T4周期中断标志触发AD转换
//*EVBIFRB=0X0FFFF; // 清除EVB中断标志,写"1"清0
*ADCTRL1=0X4000; //AD复位
asm(" NOP");
asm(" NOP");
*ADCTRL1=0X0010; // 采样时间窗口预定标位ACQ PS3-ACQ PS0为0,
// 转换时间预定标位CPS为0,AD为启动/停止模式,排
// 序器为级连工作方式,且禁止特殊的两种工作模式
*ADCTRL2=0X0404; // NO可以用EVB的一个事件信号触发AD转换,
// 且用中断模式1
*MAXCONV=0X0F; // 16通道
*CHSELSEQ1=0X3210;
*CHSELSEQ2=0X7654;
*CHSELSEQ3=0XBA98;
*CHSELSEQ4=0XFEDC; // 转换通道是00-77
}
// 启动AD转换子程序(通过软件置位启动)
void ADSOC()
{
//*T4CON=*T4CON|0X40; // 启动定时器4
*ADCTRL2=*ADCTRL2|0X2000; //启动SEQ1
}
// 定时器1周期中断服务程序
void interrupt T1Int()
{
int flag; // 定义一个局部变量
flag=*EVAIFRA&0X0080;
if(flag!=0x0080)
{
asm(" clrc INTM"); // 允许总中断
return; // 如果不是定时器1周期中断,则直接返回
}
// 如果是定时器1周期中断定时器1的周期中断,则执行下面的程序
*T1CNT=0X00; // 定时器1的计数器重新赋0
*EVAIFRA=*EVAIFRA&0X0080; // 清除定时器1周期中断标志,否则以后的中断将被忽略
lednum=lednum+1;
if(lednum==1000)
{
leda=!leda;
lednum=0x00;
}
asm(" clrc INTM"); // 允许总中断,因一进中断服务程序后总中断就自动关闭了
return; // 中断返回
}
// 中断服务程序
void interrupt nothing( )
{
asm(" clrc INTM");
return;
}
// AD中断服务子程序
void interrupt ADInt()
{
asm(" clrc SXM"); // 抑制符号位扩展
j=RESULT0; // 取得RESULT0的地址
for(i=0;i<=15;i++,j++)
{
ADRESULT[i]=*j>>6; // 把AD转换的结果左移6位后存入规定的数组
cesi=ADRESULT[i]; // 检验每个A/D转换的结果
}
*ADCTRL2=*ADCTRL2|0X4200; // 复位SEQ1,且清除INT FLAG SEQ1标志写"1"清0
//ledb=0x0FFFF;
enable(); // 开总中断,因为一进入中断总中断就自动关闭了
}
// 主程序
void main()
{
//int led; // 定义一个局部变量
//int i,k; // 定义其它一些临时变量
//asm(" setc INTM"); // 禁止所有中断
//Initial( ); // 系统初始化
//Timer1Init(); // 定时器1的初始化
//PwmInit(); // PWM输出初始化
//asm(" clrc INTM"); // 使能所有中断
//*T1CON=*T1CON|0X0040; // 启动Timer1
disable(); // 禁止所有中断
Initial(); // 系统初始化
Timer1Init(); // 定时器1的初始化
PwmInit(); // PWM输出初始化
ADInit(); // AD初始化子程序
//UartInit(); // UART初始化子程序,启动
enable(); // 使能所有中断
*T1CON=*T1CON|0X0040; // 启动Timer1
*T3CON=*T3CON|0x0040; // 启动定时器3,启动PWM
ADSOC();
while(1)
{
if(leda==0x00)
*PFDATDIR=*PFDATDIR&0xFFF7;
else
*PFDATDIR=*PFDATDIR|0x0008;
/* for(led=0x0080,i=0;i<8;led=led>>1,i++)
{
*PBDATDIR=*PBDATDIR&0x0FF00; // 首先屏蔽IOPB的各位
*PBDATDIR=*PBDATDIR|led; // 把需要显示的值赋给IOPB端口
// 使LED上显示IOPB端口的值
for(k=0;k<0x0ffff;k++)
k=k; // 为了保证显示时间,给一定时间的延时
}*/
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -