S3C2440A串口驱动-WINCE6.0下通过串口和外设进行数据通信(一)

发布者:科技革新者最新更新时间:2021-10-14 来源: eefocus关键字:S3C2440A  WINCE6  串口  外设  数据通信 手机看文章 扫描二维码
随时随地手机看文章

一,开发环境

WINCE6.0下编写串口驱动,使用S3C2440A的UART0和PC进行通信,UART1、UART2和AVR Atemga162单片机进行通信。


二,串口流驱动流程

主要完成 XXX_Init,XXX_Open,XXX_Read,XXX_Write,XXX_Seek,XXX_PowerUp,XXX_PowerDown,XXX_Close,XXX_Deinit,XXX_IOControl函数。下面介绍自己在驱动中用到的函数。


1,XXX_Init()

在XXX_Init()函数中完成驱动中相关变量和资源等的初始化工作。如S3C2440A相关寄存器的初始化,为其分配地址空间。例如串口0控制寄存器的初始化


/*Uart0 Controller Register*/

v_pUART0regs = (volatile S3C2440A_UART_REG *)VirtualAlloc(0,sizeof(S3C2440A_UART_REG),MEM_RESERVE, PAGE_NOACCESS);

if (v_pUART0regs == NULL)

{

RETAILMSG(1,(TEXT("v_pUART0regs: VirtualAlloc failed!rn")));

goto MAP_ERROR;

}

if (!VirtualCopy((PVOID)v_pUART0regs,(PVOID)(S3C2440A_BASE_REG_PA_UART0>>8),sizeof(S3C2440A_UART_REG), PAGE_PHYSICAL | PAGE_READWRITE | PAGE_NOCAC     HE ))

{

RETAILMSG(1,(TEXT("v_pUART0regs: VirtualCopy failed!rn")));

goto MAP_ERROR;

}

RETAILMSG(1,(TEXT("[SRM] v_pUART0regs is mapped to %xnr"), v_pUART0regs));

XXX_Init()中,重要的还有为串口的物理中断申请WINCE系统的逻辑中断。完成映射的方式包括动态映射和静态映射,静态映射可以在SrcCommonIntrintr.c中系统初始化时为物理中断分配系统默认的一些逻辑中断 ,如

OALIntrStaticTranslate(SYSINTR_ETH, IRQ_EINT7);

也可以用动态的方式,通过调用函数KernelIoControl申请逻辑中断号,如以下代码,为串口0中断申请逻辑中断号

if (!KernelIoControl(IOCTL_HAL_REQUEST_SYSINTR, &g_Uart0Irq, sizeof(UINT32), &g_Uart0SysIntr, sizeof(UINT32), NULL))

{

RETAILMSG(1, (TEXT("ERROR: UART0_INIT: Failed to request sysintr value for UART0_INIT interrupt.rn")));

return FALSE;

}

RETAILMSG(1,(TEXT("INFO: UART0: Mapped IRQ_UART0 to SysIntr 0x%x.rn"), g_Uart0SysIntr));


当然我们需要配置串口的寄存器和串口中断服务线程。关于S3C2440A串口中断寄存器相关配置在下一篇文章再详细介绍,在移植WINCE5.0到WINCE6.0串口驱动时,发现和串口的FIFO控制寄存器有很大关系。串口接受 中断线程的初始化代码如下


BOOL UART0_InitInterruptThread()

{

BOOL bSuccess = FALSE;

RETAILMSG(DEBUGMODE,(TEXT("+++UART0_InitInterruptThreadn")));

 

m_hUART0InterruptEvent = CreateEvent( NULL, FALSE, FALSE, NULL);

 

if (!m_hUART0InterruptEvent)

{

RETAILMSG(1,(TEXT("+++Create m_hUART0Interrupt Faile n")));

return FALSE;

}

 

bSuccess = InterruptInitialize(g_Uart0SysIntr, m_hUART0InterruptEvent, NULL, 0);

if(!bSuccess)

{

RETAILMSG(1,(TEXT("+++InterruptInitialize Faile n")));

return FALSE;

}

 

m_hUART0InterruptThread  = CreateThread((LPSECURITY_ATTRIBUTES)NULL,

0,

(LPTHREAD_START_ROUTINE)CallUART0InterruptThread,

0,

0,

NULL);

if (!m_hUART0InterruptThread)

{

RETAILMSG(1,(TEXT("----UART0_InitInterruptThread failn")));

return FALSE;

}

 

// Bump up the priority since the interrupt must be serviced immediately.

CeSetThreadPriority(m_hUART0InterruptThread,30);   //change 3

RETAILMSG(DEBUGMODE,(TEXT("----UART0_InitInterruptThreadn")));

return TRUE;

}


首先通过CreateEvent()函数创建一个事件,然后把该事件和前面通过KernelIoControl()申请的逻辑中断号绑定,最后用CreateThread()函数创建接收线程,CeSetThreadPriority()函数设置线程的优先级,优先级的范围如下


0 through 96 Reserved for real-time above drivers.

97 through 152 Used by the default Windows Embedded CE-based device drivers.

153 through 247         Reserved for real-time below drivers.

248 through 255 Maps to non-real-time priorities.


可以根据通信的实时性要求进行不同等级的设置。

串口发送线程的初始化函数如下


BOOL UART0_InitTransmitThread(){

RETAILMSG(DEBUGMODE,(TEXT("+++UART0_InitTransmitThreadn")));

m_hUART0TransmitThread  = CreateThread((LPSECURITY_ATTRIBUTES)NULL,0,(LPTHREAD_START_ROUTINE)CallUART0TransmitThread,0,0,NULL);

if (!m_hUART0TransmitThread)

{

RETAILMSG(1,(TEXT("----CallUART0TransmitThread Failn")));

return FALSE;

}

CeSetThreadPriority(m_hUART0TransmitThread,30);   //change 2

RETAILMSG(DEBUGMODE,(TEXT("----UART0_InitTransmitThreadn")));

return TRUE;

}


2,XXX_IOControl

XXX_IOControl()函数主要用于接受应用程序调用驱动程序时发送的命令,根据命令的不同执行不同操作。函数原型如下


BOOL  DMA_IOControl(DWORD hOpenContext,DWORD dwCode,PBYTE pBufIn,DWORD dwLenIn,

PBYTE pBufOut,DWORD dwLenOut,PDWORD pdwActualOut)


其中dwCode为命令控制码,pBufIn为应用程序传送的参数。

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

上一篇:内核(2.6.14) + 根文件系统 +Qtopia Core 4移植 for S3C2410
下一篇:S3C2440A串口驱动-WINCE6.0下通过串口和外设进行数据通信(二)

推荐阅读最新更新时间:2024-11-13 11:07

PIC16C63单片机串口通信程序
;******************************************* ;MCU-PIC16C63A,WDT=ON,HS,16MHZ ;本例将寄存器BUFFER1和BUFFER2中的数据串口发送出去,没有中断调用,单片机选用PIC16C63A ;******************************************* LIST P=PIC16C63A INCLUDE P16C63A.INC ORG 0000H GOTO MAIN BUFFER1 EQU 20H BUFFER2 EQU 21H MAIN MOVLW 0X55 MOVWF BUFFER1 MOVLW 0X56 MOVWF BUFFER2
[单片机]
LabVIEW串口调试笔记
使用LabVIEW 2011简体中文版,然后需要安装VISA驱动(关于驱动和LabVIEW软件你可以在电驴上面下载,只是电驴上面的LabVIEW是英文版的,如果需要简体中文版的可以在这里下载 http://ftp.ni.com/evaluation/labview/ekit/other/downloader/2011LV-WinChn.exe ) 使用虚拟串口调试工具(软件下载地址: http://www.skycn.com/soft/30517.html 说明书下载地址: http://www.gzputian.com.cn/PDF/TCP/VSPM���⴮��˵����.pdf ):这个工具的原理是模拟两个串口,然后通过TCP/
[测试测量]
C51通用串口收发数据C语言程序
#include reg52.h //C51通用串口收发数据C语言程序模块 #define uchar unsigned char #define uint unsigned int uchar shu; bit i; sbit led1=P0^0; void delayms(uint xms) //1ms; { uint i,j; for(i=xms;i 0;i--) for(j=110;j 0;j--) ; } /************************************************************************/ void UART_ini
[单片机]
STM32F030C8T6串口接收不定长数据
usart.c文件代码。 #include usart.h #include gpio.h UART_HandleTypeDef huart1; /* USART1 init function */ void MX_USART1_UART_Init(void) { huart1.Instance = USART1; huart1.Init.BaudRate = 115200; huart1.Init.WordLength = UART_WORDLENGTH_8B; huart1.Init.StopBits = UART_STOPBITS_1; huart1.Init.Parity = UART_P
[单片机]
AVR单片机串口USART与PC通讯实例,讲解原理和程序
“并行”通讯:是指8位数据同时通过并行线进行传送,这样数据传送速度大大提高,但并行传送的线路长度受到限制,因为长度增加,干扰就会增加,数据也就容易出错。 “串行”通讯:形容一下就是 一条车道,而并口就是有8个车道同一时刻能传送8位(一个字节)数据。但是并不是并口快,由于8位通道之间的互相干扰。传输时速度就受到了限制。而且当传输出错时,要同时重新传8个位的数据。串口没有干扰,传输重发一位就可以了。所以要比并口快。 串行通讯协议较多,单片机常用的有USART,SPI,TWI,1-Wire 等。 串行通讯有分为同步和异步通讯:通俗讲 同步就是你叫我去吃饭,我听到了就和你去吃饭;如果没有听到,你就不停的叫,直到我告诉 你听到了
[单片机]
AVR单片机<font color='red'>串口</font>USART与PC通讯实例,讲解原理和程序
通过串口烧录N76E003 单片机(ISP)
一、N76E003烧录模式介绍 Flash存储器支持硬件编程和应用编程(IAP)。如果产品在研发阶段或产品需要更新软固件时,硬件编程就显得不太方便,采用在系统编程(ISP)方式,可使这一过程变得方便。执行ISP不需要将控制器从系统板上拆下来。通过软件控制可以重新编程设备。因此这使得更新应用程序固件ISP得到广泛的应 用。 用户可以开发自己的引导代码放在LDROM中。LDROM最大为4KB。用户开发的引导代码可以通过并行 烧录器或是电路编程器(ICP)下载到LDROM中去。 一般来说,ISP是PC与MCU之间进行通讯。PC通过串口传输新的用户代码给MCU。然后引导代码接收 这些数据,将这些数据通过IA
[单片机]
通过<font color='red'>串口</font>烧录N76E003 单片机(ISP)
STM8L051F3基础功能:内部时钟;TIM2定时器;串口及printf
STM8L051调试笔记之基础功能: 系统时钟、串口、定时器都是基础而且必须的功能,这里放在一起统一记录,之所以用TIM2定时器,是因为想实现STM32的滴答定时器功能 这些基础功能没什么好理解的,就直接贴代码了main.c: main.c: void main(void) { enableInterrupts(); Sysclk_Init(); LED_Init(); Uart1_Init(); printf( This is a STM8 code!!!rn ); while (1) { if(secondClock_flag) { secondCl
[单片机]
STM8L051F3基础功能:内部时钟;TIM2定时器;<font color='red'>串口</font>及printf
三通道12位模数转换MAX1241串口传输单片机C程序
今天完成数据传输硬件程序,才用8位传输,位数太多就拆开,分高8位和低8位,电路图在这里: http://www.51hei.com/mcu/2273.html 程序可以参考使用: #include reg51.h #define uchar unsigned char #define uint unsigned int #define High 1 #define Low 0 int t1,t2,t3,t4,t5,t6,t7,t11,t12,t21,t22,t31,t32; int t; sbit cs=P2^7; sbit sclk=P2^6; sbit dout=P2^5; sbit cs2=P2^4; sbit sclk2
[单片机]

推荐帖子

红外体温计标定方法
红外体温计标定方法是怎么样的?用体温计去测试黑体炉温度?黑体炉设置不同的温度,体温计测试后再比对黑体炉显示的温度?如果有偏差就修正,找出对应的函数关系?是不是这样的思路?同行都是怎样的标定方法?哪种方法更准一些红外体温计标定方法用的什么传感器标定方法用黑体,是利用普朗克黑体辐射的定律。理想化的黑体,表面的发射率为1。红外测温仪测量,调节仪器发射率值,直到所测温度与真实温度相等,现在的经验值,红外测温一般都是将发射率设为0.95原理就是黑体辐射不同的
QWE4562009 模拟电子
一种应用于网络视频记录/数码录影机系统的备电方案
作者:Frank,Xiao图一是简单的安防系统框图,主要分为前端产品和后端产品。其中后端产品NVR(NetworkVideoRecord)和前端IPcamera对接,一般情况下一个NVR可对接4个,8个,16个IPC。在某些特定情况下,NVR系统需要短时掉电备份以保证数据非丢失。因此NVR的电池的备电系统成为安防行业一个研究方向。DVR(DigitalVideoRecorder)与CVI/TVI/AHD模拟相机对接,虽然传输信号是模拟信号,但是对备电系统的需求与NV
alan000345 模拟与混合信号
基于sensortag的智能管家系统
总体实现这个系统的架构的可能性。是TIsensortag能够实现通用的单元模块,发挥板载传感器的同时,能够把剩余的端口利用起来,以实现不同检测,控制的功能要求。让懒人更懒一些。基于sensortag的智能管家系统
蓝雨夜 无线连接
【2023 DigiKey大赛参与奖】开箱帖 Raspberry Pi 5 4G
感谢得捷和EEWORLD,这次活动获得了参与奖。我用参与奖购买了一个RaspberryPi54G【2023DigiKey大赛参与奖】开箱帖RaspberryPi54G不错参与奖购买了RaspberryPi54G非常好,拍个图片看看电路板什么样子的。你这还投入了不少资金啊,RaspberryPi54G也得500啊Pi5得近600了吧。
eew_dy9f48 DigiKey得捷技术专区
【TI 无线主题征集】xbee模块
本帖最后由fjfhjmh于2014-12-316:11编辑 xbee模块是美国DIGI的zigbee模块,XBEE只是型号,是一种远距离低功耗的数传模块,频段有2.4G,900M,868M三种同时可兼容802.15.4协议。可组mesh网络,每个模块都可以做为路由节点,协调器,以及终端节点。模块是内置协议栈,可通过X-CTU以及ZigbeeOperator这两款软件进行调试,模块的配置方式有两种,分别是AP和ATI命令。模块有嵌入式和贴片两种,即插即用自组网,更
fjfhjmh 无线连接
《Cmake构建实战》5 onnxruntime手写识别实践(libpng引用失败)
1工程设计设计目标实现包括手写数字识别库以及一个识别命令行工具,识别库能够被C语言等其他编程语言所调用。目录结构├─cli├─cmake├─include├─models└─src└─CMakeList.txt接口设计 初始化手写数字识别库NUM_RECOGNIZER_EXPORTvoidnum_recognizer_init(); 识别器创建NUM_RECOGNIZER_EXPORTvoidnum_recognizer
maskmoo 嵌入式系统
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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