历史上的今天

今天是:2024年08月26日(星期一)

正在发生

2021年08月26日 | S3C2440A串口驱动-WINCE6.0下通过串口和外设进行数据通信(二)

发布者:平和宽容 来源: eefocus关键字:S3C2440A  串口驱动  WINCE6  串口  外设  数据通信 手机看文章 扫描二维码
随时随地手机看文章

三,串口中断服务线程

串口中断产生以后,具体的数据处理将在中断服务线程里面完成,以BSP包中camera的中断线程为例


DWORD CameraCaptureThread(void)

{

unsigned char tmp=0;

static unsigned int time,old_time;

static unsigned int cam_intr;

DWORD dwCause;

 

//dwDisplayTimeout = INFINITE;

 

SetProcPermissions((DWORD)-1);

while(TRUE)

{

RETAILMSG(0,(TEXT("[CAM_HW] InterruptThread : Waiting For a Single Objectnr")));

dwCause = WaitForSingleObject(CameraEvent, dwDisplayTimeout);

RETAILMSG(MSG_EN_1,(_T("CameraCaptureThread(%d)++rn"), frame_count));

if (dwCause == WAIT_OBJECT_0)

{

Lock();

 

__try

{

 

if (s2440INT->INTSUBMSK & ( 1 << IRQ_SUB_CAM_C ))

{

frame_count++;

cam_intr |= ( 1 << IRQ_SUB_CAM_C );

    

s2440INT->SUBSRCPND  =  (1< s2440INT->INTSUBMSK &= ~(1< //RETAILMSG(1,(_T("CAM_C, ts %drn"), GetTickCount()));

}

 

if (s2440INT->INTSUBMSK & ( 1 << IRQ_SUB_CAM_P ))

{

cam_intr |= ( 1 << IRQ_SUB_CAM_P );

s2440INT->SUBSRCPND  =  (1< s2440INT->INTSUBMSK &= ~(1< //RETAILMSG(1,(_T("CAM_P, ts %drn"), GetTickCount()));

}

 

if (((s2440INT->INTSUBMSK & ( 1 << IRQ_SUB_CAM_C )) == 0) && ((s2440INT->INTSUBMSK & ( 1 << IRQ_SUB_CAM_P )) == 0))

{

RETAILMSG(MSG_EN_1,(_T("[CAM]NOPrn")));

}

InterruptDone(g_CamSysIntr);

//time = GetTickCount();

//RETAILMSG(1,(TEXT("+time:%drn"),(time - old_time)));

// Handle any interrupts on the input source

if (cam_intr & ( 1 << IRQ_SUB_CAM_P ))

{

// display the image

if (DRIVER_PREVIEW_ENABLE == 1)

Display_Cam_Image(LCD_XSIZE_TFT-PREVIEW_X,0,PREVIEW_X, PREVIEW_Y, PORT_A);

 

Buffer_preview_info_update();

cam_intr &= ~( 1 << IRQ_SUB_CAM_P );

}

if (cam_intr & ( 1 << IRQ_SUB_CAM_C ))

{

Buffer_codec_info_update();

cam_intr &= ~( 1 << IRQ_SUB_CAM_C );

}

 

// Enable camera interrupt

//s2440INT->INTSUBMSK &= ~(( 1 << IRQ_SUB_CAM_P )|( 1 << IRQ_SUB_CAM_C ));

//s2440INT->INTMSK &= ~( 1 << IRQ_CAM );

 

//old_time = GetTickCount();

//RETAILMSG(1,(TEXT("-time:%drn"),(old_time-time)));

 

}

__except(EXCEPTION_EXECUTE_HANDLER)

{

RETAILMSG(PM_MSG, (TEXT("Camera.DLL:InterruptThread() - EXCEPTION: %d"), GetExceptionCode()));

}

Unlock();

}

else if (dwCause == WAIT_TIMEOUT)

{

Lock();

RETAILMSG(PM_MSG,(_T("[CAM_HW] InterruptThread Timeout : %d msecrn"), dwDisplayTimeout));

dwDisplayTimeout = INFINITE; // reset timeout until Camera Interrupt occurs

bIdlePwrDown = TRUE; // Codec is off

 

CamInterface_PowerDown();

RETAILMSG(PM_MSG, (TEXT("[CAM_HW] InterruptThread : bIdlePwrDown = TRUErn")));

 

Unlock();

}

else

{

RETAILMSG(PM_MSG, (TEXT("[CAM_HW] InterruptThread : Exit %d, Cause %drn"), GetLastError(), dwCause));

}

}

 

return 0;

}

WaitForSingleObject()函数等待中断事件的方式。既是用在串口中断线程初始化时绑定的事件和逻辑中断 。函数的第二个参数表示等待事件发生的时间,INFINITE表示一直等待。中断触发以后设置中断标志变量cam_intr并且进行开中断的操作。OAL层的中断函数在common目录下的intr.c中实现。子中断寄存器的控制可以在OAL目录下的intr.c中实现。


四,S3C2440A串口寄存器的配置

用到了串口的FIFO模式传输数据,所以关键是配置UFCON和UCON。UFCON设置串口FIFO的中断触发值,如图

第4为用于使能FIFO模式和复位FIFO,高4位设置中断触发值,要是设置成0 ,就相当于没有使用FIFO模式。


UCON中和FIFO相关的是第8和第9位用于设置中断触发模式为LEVEL还是PULSE

Pulse模式的意思是当FIFO中的数据量刚达到你要求的时候就会产生中断. 但是注意,该中断只授那一刻产生,如果那时候你正在处理上一次的中断而把该中断mask掉,那么该中断就会被丢掉,FIFO中数据就会一直增加直到溢出;


Level模式的意思是只要FIFO中的数据量达到你要求的时候就会产生中断,包括比你要求的多的时候.


对于串口接收数据丢失的情况,一般我们设置FIFO接收中断的触发阀值为0,中断触发方式为LEVEL;即当FIFO中的值大于或者等于0个,都会触发接收中断,从而让中断服务线程及时的接收走数据。此外,为了更及时的响应中断,我们可以将中断服务线程中的InterruptDone函数改成自己写入清中断标志和使能中断代替,提高中断效率。

关键字:S3C2440A  串口驱动  WINCE6  串口  外设  数据通信 引用地址:S3C2440A串口驱动-WINCE6.0下通过串口和外设进行数据通信(二)

上一篇:S3C2440A串口驱动-WINCE6.0下通过串口和外设进行数据通信(一)
下一篇:uboot 替代 eboot 烧写、启动 wince

推荐阅读

最近一直在研读正点原子的stm32开发板,在学习SysTick寄存器的过程中查不到该寄存器的地址是在哪里定义的,很是不解。上网搜后发现 http://www.eepw.com.cn/article/246289.htm 部分代码粘贴如下:typedef struct{ __IO uint32_t CTRL; /*!< Offset: 0x000 (R/W) SysTick Control and Status Register */ __IO uint32_t LOAD; ...
数字助听器和人工耳蜗是当今针对听力严重受损患者的听力健康方案。除了微型化和降低功耗的需求,随着5G万物互联时代的到来,智能、互联将成为助听器发展的新趋势。安森美半导体是业界唯一提供专业助听器芯片的供应商,不断研究及开发数字信号处理 (DSP) 及无线技术,并提供一流的开发工具,为助听器制造商提供真正交钥匙的助听器方案,如最新的Ezairo 7160...
苹果今天发布了iOS 14和iPadOS 14第六个开发者测试版,距离上个测试版相隔一周的时间。  这次的新公测版变化没有那么多,但苹果为照片应用增加了隐藏相册选项,并为时钟应用带回了表盘UI。iOS 14有数百项改变和改进,但其中的一些亮点包括:刷新的主屏幕和可定制的小部件、可以轻松找到手机上安装的任何应用的应用库、新的画中画支持、信息、...
  防爆电机绕组的清洁方法  绕组是防爆电动机的重要组成部分,要维护绕组必须从定子内抽出转子。清洁方法有:  1、干擦  当需要清洁的表面易于接近并且要去掉的只是干灰尘时,用一块清洁的无绒布干擦就能得到满意的效果。不能用回丝布,因为绒毛会粘在绝缘面上增加灰尘的集聚。绒毛对于高压电机的绝缘尤为不利,因为有引起电晕放电的可能性。  2...

史海拾趣

问答坊 | AI 解惑

C++学习的门厅---控制台应用程序

C++学习的门厅---控制台应用程序    //WIN程序开发的绚丽舞台,引无数手握空拳者纷至沓来,兴奋之余,竟然很容易忘记WIN开发的基础是C++:( //看中的VC++2005的也好,看中的BCB6.0也罢,均有可以编写、编译、测试的控制台应用程 ...…

查看全部问答∨

wince 如何隐藏语言栏

wince5.0 手动隐藏输入法后,语言栏还在界面上显示,如何手动隐藏关闭这个语言栏 …

查看全部问答∨

瞬联软件招聘,内部推荐,高薪,上海职位。顶者有分。

瞬联软件是国内比较知名的软件外包公司(http://www.cienet.com.cn),总部在北京,在上海,杭州,成都均有分布,客户几乎包含了所有知名的通信厂商,比如诺基亚西门子网络(NSN),摩托罗拉,爱立信等。在程序员中有很好的口碑,提供的待遇和福利也 ...…

查看全部问答∨

EVC下如何正确的获得编辑框内光标的位置

请教怎么在EVC下得到编辑框内光标的位置啊 POINT point; TCHAR a[20],b[20]; point = GetCaretPos(); _ltow(point.x,a,10); _ltow(point.y,b,10); AfxMessageBox(a); AfxMessageBox(b); 结果在编辑框内输入2008,光标在任意位置,显示的结 ...…

查看全部问答∨

电源正负极之间是否短路的测量问题

请问各位大侠:     我用万用表的通断档测量电路板的正负极之间是否短路时,(电路板未加电时测量)     万用表通断档有时显示的是.548,用电阻档测量时阻值为1.5K;有时通断档显示为1.254,电阻档测得阻值为5.2K.   &nb ...…

查看全部问答∨

关于SWIM问题

各位大虾,我在用SWIM DEBUG 过程中,出现这样的问题 error:swim prog error[42004]:memory write error 怎么解决?????…

查看全部问答∨

Verilog描述的基于VGA的乒乓球游戏

求助一个关于Verilog描述的基于VGA的乒乓球游戏的设计方案。我来看看到底是怎么做的。谁有小弟不胜感激,要完整的哈。…

查看全部问答∨

一种电压控制的可变电感电路

通过在电感上加上一个偏置电流来改变磁芯的工作点应该就能够改变电感量,随着偏置电流的加大磁芯的磁通就会向饱和方向移动也就降低了电感。…

查看全部问答∨

一个定时器的延时程序

今天开始学习定时器了,遇到了一些问题来和大家分享一下: 定时器一般无法进入中断:是因为我们没有修改定时器终端的地址:         DCD     IntDefaultHandler      &nb ...…

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved