imx6ul 10 之EPIT定时器

一、EPIT简介
实现精准的定时功能
1、EPIT是一个32位的向下计数器,是最基本的定时器
2、EPIT的时钟源有多种选择,在此选择ipg_clk = 66 mhz
3、可以对时钟源进行分频,12位的分频器,0 ~ 4095分别代表 1 ~ 4096分频
4、开启定时器后,计数寄存器会每个时钟减1,如果和比较寄存器里面的值相等的话,就会触发中断/事件。

EPIT有两种工作模式:
set-and-forget
free-running

5、6ull有两个EPIT定时器EPIT1、EPIT2
每个定时器有五个寄存器
EPIT_CR用于配置EPIT

二、实验原理简介
EPITx_CR
bit0:使能EPIT,( 1,最后set )。
bit1为1,设置初始值为加载寄存器的值。
bit2,使能比较中断。
bit3为1,设置定时器的工作模式为set-and-forget模式下;为0时每次从 0xffff ffff开始加载。
bit15~4 设置分频值。
bit25-24,时钟源选择位,设置为01,选择ipg_clk时钟源。
EPITx_SR
只有bit0有效,表示中断状态,写1清0。当OCIF为1的时候表示中断发生,为0表示中断未发生。我们处理完定时器中断以后需要清除中断标志位OCIF。
EPITx_LR
设置计数器的加载值。计数器每次计时到0以后就会读取LR的值,重新开始计数。
EPITx_CMPR
当计数器的值和CMPR相等以后,就会产生比较中断,必须要 GIC_Enable( 此中断号 )
EPITx_CNR
保存计数器的当前值

本次实验利用EPIT实现500ms周期的定时器,在EPIT中断服务函数里面让LED灯亮灭。

在ClassWizard中响应ID为~Dlg中的WM_TIMER消息。 使用SetTimer(nIDEvent,time,NULL)来建立一个定时器,关闭定时器用KillTimer(nIDEvent)函数。 然后可以响应ON_WM_TIMER消息来响应一个定时器完成一次记时后的程序。 响应方式如下: void CTimeDlg::OnTimer(UINT nIDEvent) { if(nIDEvent==1000)//间隔为5秒 { //处理事件 } elseif(nIDEvent==1001)//间隔为10秒 { //处理事件 } CDialog::OnTimer(nIDEvent); } 以下是给出一个串口通信定时检查接收数据的部分代码 void CMyDlg::OnOpenCom() { // TODO: Add your control notification handler code here if( f_open_com==true ) { f_open_com = false; GetDlgItem(IDC_OPEN_COM)->SetWindowText("打开通信端口"); CloseHandle(hComm); KillTimer(1000); /// 关闭定时器 return ; } SetTimer(1000, 1000, NULL); ///nIDEvent==1000,time=5000ms const char *ComNo; DCB dcb; string temp("COM1"); ComNo = temp.c_str(); hComm = CreateFile( ComNo , GENERIC_READ|GENERIC_WRITE , 0 , NULL , OPEN_EXISTING , 0 , 0); if( hComm==INVALID_HANDLE_VALUE ) /// 如果端口未打开 { MessageBox("打开通信端口出错!" , "Comm Error" , MB_OK); return ; } /// 将dcb地址传入,以取得通信参数 GetCommState(hComm,&dcb); /// 得知目前通信状态 dcb.BaudRate = CBR_9600; dcb.ByteSize = 8; /// 字节为8 dcb.Parity = NOPARITY; /// Parity为None dcb.StopBits = ONESTOPBIT; /// 1个停止位 if( !SetCommState( hComm , &dcb)){ MessageBox("通信端口设置出错!" , "Set Error" , MB_OK ); CloseHandle(hComm); return; } GetDlgItem(IDC_OPEN_COM)->SetWindowText("关闭通信端口"); f_open_com = true; } void CMyDlg::OnTimer(UINT nIDEvent) { // TODO: Add your message handler code here and/or call default char inbuff[1024]; DWORD nBytesRead , dwError; COMSTAT cs; /// 取得状态 ClearCommError( hComm , &dwError , &cs); /// 数据是否大于所准备的缓冲区 if( cs.cbInQue > sizeof(inbuff) ) { PurgeComm(hComm , PURGE_RXCLEAR ); /// 清除通信端口数据 return ; } ReadFile(hComm , inbuff , cs.cbInQue , &nBytesRead , NULL ); //接收通信端口的数据 inbuff[cs.cbInQue] = '\0'; MessageBox("打开通信端口出错!" , "Comm Error" , MB_OK); m_Receive.Format("%s",inbuff); UpdateData(false); CDialog::OnTimer(nIDEvent); } 李杨: for(int i=0; ;i++ ) { ... Sleep(5); if(i>...) {AfxMessageBox("错误XXX"); return;} }//跳出后记得停止一些机器动作
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值