前言:
通过旋转编码器控制LED亮度的实验,来讲解HT66F2390的外部中断的配置。可以根据这个流程来熟练整个板子的中断和定时器相关的配置。
实验演示和代码:
1.接线图:
旋转编码器接线:
![](https://i-blog.csdnimg.cn/blog_migrate/6fdb46dffd0a282afdee387723218188.png)
LED接线:
根据自己型号的旋转编码器接对口就好,本文主要是学习如何设置外部中断。
旋转编码器的相关知识可以看下下方链接的博文。
旋转编码器原理|正反转判定
2.视频演示:
HT66F2390,旋转编码器控制LED亮度变化|演示视频
3.实验代码:
#include "HT66F2390.h"
const int Period = 4000; // 定义PWM周期
void Set_PWM(unsigned long Duty);
void delay(unsigned long count);
void PWM_Init(void);
void EntInter_Init(void);
int count_PWM = 0; //用来区分亮度的挡位
void main()
{
_wdtc=0b10101011; //关闭看门狗
EntInter_Init(); //外部中断初始化
PWM_Init(); //PWM初始化
while(1)
{
}
}
void EntInter_Init(void) //外部中断初始化
{
_pas0=0x00000100; //引脚功能选择
// _pds0=0x00000001;
_integ = 0x00000001; //设置int0为上升沿触发中断;其余为0;
_int0ps = 0;//设置int0 的输入源为PA1;
_int0e = 1;//int0中断使能位开启;
_emi = 1; //开启总中断;
}
DEFINE_ISR(A_down,0x04) //中断函数 ,自定跳转
{
if(_pd0 ==1)//逆时针转代码
{
count_PWM--;
if(count_PWM>0&&count_PWM<10) //旋转梯度设定
{
Set_PWM(count_PWM); //设置占空比
}
else
{
count_PWM = 0;
}
}
else if(_pd0 == 0)//顺时针转代码
{
count_PWM++;
if(count_PWM >10)
{
count_PWM = 10;
}
Set_PWM(count_PWM);
}
_int0f = 0; //软件除能 中断申请标志位
}
void Set_PWM(unsigned long Duty) //占空比设置
{
if(Duty>=0)
{
_ptm3ah =Duty*40/256;
_ptm3al =Duty*40%256;
}
}
void PWM_Init(void) //PWM 初始化 配置
{
_ptm3c0=0b00001000; // 时钟选择
_ptm3c1=0b10101000; //选择为PWM输出且高有效
_ptm3rph=Period/256; //周期设置,写入CCRP的两个寄存器之中这个是把16位的数据划分成高8位和低8位
_ptm3rpl=Period%256;
//输出引脚选择
_pbs0=0b00110000; //PTP3输出,引脚接的是PB2
_emi=1; //开启总中断
}
代码内有一些合泰板子的PWM输出配置的代码,这里就不赘述了,会用到里面的原理,本文不懂的代码或有兴趣可以去看看这篇文。
合泰杯(HT66F2390)通过PWM呼吸灯实验,了解定时器基础知识(手把手看手册)
正文:
外部中断的设置:
只看红框内容,外部中断的触发需要用到INT0~INT3,这四个引脚任何一个都可以实现外部中断功能,本文只用到INT0(其他的设置也一样)。
下面的红框说明:中断是自动复位,可以自发跳转执行中断函数。
以下是HT66F2390 所有中断的操作,我们需要什么中断,就将下面的一条通路打通(配置好),红框就是我们要本次配置的外部中断0(INT0)的通路。
流程:
条件触发中断(INT0)→中断请求标志位开启(INT0F)→中断控制位开启(INT0E)→进入总中断(EMI)→判别优先级→执行
搜索INT0,找到配置它的四个操作寄存器[PAS0,INTEG,INTC0,IFS2]
接下来我们一一配置(按照上图红框的寄存器顺序)
PAS0 选择共用引脚的功能选择;
实验代码:
_pas0=0x00000100; //引脚功能选择
INTEG寄存器选择外部中断(INT0~INT3)的触发条件,这里我们实验选择上升沿触发
(在引脚接收到由低电平到高电平的变化时,触发中断)
实验代码:
_integ = 0x00000001; //设置int0为上升沿触发中断;其余为0;
接下来配置中断通路的最后两个步骤:使能中断控制位,开启总中断
因为此寄存器还可以设置其他中断,为了方便以后的修改和代码的移植,这里直接用寄存器每一位的名称(就是上图红框的内容)来直接配置,PS:仅限可以按位取址的寄存器
代码:
_int0e = 1;//int0中断使能位开启;
_emi = 1; //开启总中断;
每个外部中断有两个输入源可以选择,实验选择的是PA1
实验代码:
_int0ps = 0;//设置int0 的输入源为PA1;
等等!还漏了一步?
并不是,中断请求标志位在条件触发中断的时候已经自动赋值为1了,
值得注意的是,这一位在中断函数执行完之后要软件进行复位,
代码示例:
DEFINE_ISR(A_down,0x04) //中断函数 ,自定跳转
{
//中断函数的主体
_int0f = 0; //软件除能 中断申请标志位
}
上面的代码就是中断函数的格式
两个参数:"A_down"是自己定义的,"0x04"是中断的优先级,看下图选择的通路配置。
小结:
以上就是外部中断配置的流程,旋转编码器的部分还未进行软件消抖,感兴趣的可以深入学习。
HT66F2390 设置PWM输出代码的部分这里就不赘述了。
以上就是本文的主要内容,如有错误,还望指出。