南京师范大学硕十学位论文单片机程序 主CPU程序
5.4.4串口驱动程序图5.17键盘工作流程图串口在本系统中扮演着极为重要的角色,它既要处理与子系统的通信,又要控制
WaveCom模块的操作。串口与WaveCom模块的通信不同于简单的上下位机通信。
一般的上下位机通信是这样实现的:首先上下位机互相发几个数据实现“握手”,然后开始数据通信,最后再互相发几个数据实现“分手”。这样的串口数据处理模式在处理上下位机通信时是有效的,但是在处理被动方式的数据传输时显然是很不科学的。这里的所谓“被动’’,就是ARM微控制器预先并不知道串口什么时候将要接受数据,也不知道接受数据的具体数量是多少,更不知道数据的协议是什么?比如
WaveCom模块的反馈信息有时候是简单的“OK”,有的时候则是复杂的PDU短信数据。但是WaveCom模块在发出“OK”或PDU短信数据之前,并不会额外地发出一个提示,说明下面将要发两个字节的数据,且是“OK’’,或将要发若干个数据(短信的长度不可预知)的PDU短信数据。假如采用查询或中断的方式来直接接收WaveCom
模块的反馈信息,一个字节是肯定可以收到的,但问题是并不知道某个时刻WaveCom
模块会发什么信息,也不知道信息的具体长度是多少,此时怎么分辨数据的结尾?又怎么知道数据的开头呢?当然,在接收短消息时,如果接收的是PDU类型的短信(在这里要注意了,这里只是假设接收到的短消息是PDU类型的,而短消息还有其他类型,它们的数据格式都不尽相同),在数据的第29个字节有接收数据的长度信息,在程序中可以通过判断将数据接收下来,而WaveCom模块在发送一串字符串给ARM
时,并没有事先通知ARM,下面将要发送的字符串是PDU类型的短消息。这样下来,
在程序中必须加上复杂的判断,这样就会令程序太复杂,甚至于不可以实现。所以在本系统中有必要设计一个不同与上下位机通信的串口数据处理方式,在这里,称之为
43
塑室堑翌奎兰堡主堂堡丝塞
“主动”方式。
为了实现串口数据安全、高效地传输,本系统设计采用了前后台的设计思想,即串口处理在前台,普通操作在后台。在前台,通过调用入栈函数将串口数据放到串口数据缓冲区中;在后台,各种任务在进行,当某些任务需要用到串口数据时,再通过一个读串口缓冲区数据的函数将数据取走使用,如图5.18所示。馨言囊螽夫栈————[二二二至三至三至三三二二卜串口数据入栈———叫 串口数据缓冲区卜—_
前台:
后台:
图5-18前后台串口数据传送示意图一、入列入列函数主要实现将一个数加入到队列缓冲区中。入列的过程就是改动队列的过程,因为入列时队列缓冲区中的每个数都需要相应左移一位,且入列后,队列中的数据个数加一,改动的数超过一个。指针作为函数的参数,可以实现任意个数的修改,
所以在此函数中用Queue结构指针变量sQueue来作为函数的参数,图5.19是入列过程的流程图。需要注意的是,当入列的数据个数大于队列缓冲区的长度时,多出的部分将被舍弃。所以在开辟缓冲区的时候,要考虑实际使用时的最大接收数据个数,留有充足的裕量。
图5-19入列流程图
44
南京师范大学硕:L学位论文图5.20是字符串WELCOME入列了五个数的示意图。
RXD
图5.20入列不意图二、OutQueueFIFO(将一个数出列FIFO)
出列函数主要实现将一个数从队列缓冲区中取走以供使用。同样,出列的过程也要改动队列的内容,出列时队列缓冲区虽然只需要将最高字节取走,但队列的数据个数也要减一,所以此函数改动的参数超过一个。指针作为函数的参数,可以实现任意个数的修改,所以在此函数中用指针变量sQueue来作为函数的参数,图5.21是出列过程的流程图。需要注意的是,当队列被完全出列后,队列缓冲区中数据个数等于0。
图5-21出列流程图图5.22所示是字符串WELCOME出列了四个数的示意图。
MSB pNum。7 LSB
图5-22出列示意图三、SioRead(将串口数据缓冲区的内容读到用户数据缓冲区供使用)
前面已经讨论了使用前后台的工作方式来处理串口数据的接收,接下来讨论后台
45
南京师范大学硕十学位论文的主程序怎样使用前台程序接收到的数据。串口数据的接收全部在前台完成,只要有数据发送到串口,前台程序就将之入栈,不管之前入栈的数据有没有被后台程序拿走。
当有新的数据到来时,如果后台程序没有将串口缓冲区中的数据及时取走,则这些数据将会被新的数据冲掉。所以有必要设计一个函数来及时地将前台数据取走,避免前台数据遗失。
图5.23是读串口缓冲区数据的流程图,它的入口参数有两个,一个是接受数据缓冲区,另一个是接受数据缓冲区长度。同样要在此函数中将串口数据缓冲区拿到接受数据缓冲区中,接受数据缓冲区参数必须是指针。此函数除了有读串口数据缓冲区数据的功能,它还有对串口数据接收情况指示。当函数返回0时,说明串口中没有数据,或者读串口数据缓冲区错误。不管怎样,只要调用此函数,就会将串口数据缓冲区中的内容抽空。这也是必要的,因为只有将串口数据缓冲区的内容抽空了,才能为前台程序接收下一次数据做准备。 。
图5.23读串口数据流程图图5.24形象地描述后台程序是怎样从前台程序处理的串口数据缓冲区中将有效数据读走。以下是SioRead()函数正在执行的情况,它已经从串口数据缓冲区读了四个数据,最后它将会将串口数据缓冲区的内容抽空,并将被抽空的内存填上’\o’。
南京师范大学硕士学位论文
5.4.5看门狗
MSB pNum=7 LSB
>buf—MSB—LSB使用
X,m,蚺_,士【I][工]二[工]二[工]二匡卫殛啾裂循佚■
LPC2214内部自带看门狗,WDT溢出时间计算如下:
溢出时间=N×tyak×4
其中,N为WDTC的设置值。
看门狗基本操作方法如下:
设置WDT定时器重装值(WDTC);
设置WDT工作模式,启动WDT(WDMOD);
对WDFEED操作,实现喂狗。
由于看门狗实现简单,所以不作详细分析。
5.5功能测试
5.5.1 LCD测试首先,编了一个测试程序,来检查LCD模块接上LPC2214后,工作是否正常。
测试程序如下:
47
5.4.4串口驱动程序图5.17键盘工作流程图串口在本系统中扮演着极为重要的角色,它既要处理与子系统的通信,又要控制
WaveCom模块的操作。串口与WaveCom模块的通信不同于简单的上下位机通信。
一般的上下位机通信是这样实现的:首先上下位机互相发几个数据实现“握手”,然后开始数据通信,最后再互相发几个数据实现“分手”。这样的串口数据处理模式在处理上下位机通信时是有效的,但是在处理被动方式的数据传输时显然是很不科学的。这里的所谓“被动’’,就是ARM微控制器预先并不知道串口什么时候将要接受数据,也不知道接受数据的具体数量是多少,更不知道数据的协议是什么?比如
WaveCom模块的反馈信息有时候是简单的“OK”,有的时候则是复杂的PDU短信数据。但是WaveCom模块在发出“OK”或PDU短信数据之前,并不会额外地发出一个提示,说明下面将要发两个字节的数据,且是“OK’’,或将要发若干个数据(短信的长度不可预知)的PDU短信数据。假如采用查询或中断的方式来直接接收WaveCom
模块的反馈信息,一个字节是肯定可以收到的,但问题是并不知道某个时刻WaveCom
模块会发什么信息,也不知道信息的具体长度是多少,此时怎么分辨数据的结尾?又怎么知道数据的开头呢?当然,在接收短消息时,如果接收的是PDU类型的短信(在这里要注意了,这里只是假设接收到的短消息是PDU类型的,而短消息还有其他类型,它们的数据格式都不尽相同),在数据的第29个字节有接收数据的长度信息,在程序中可以通过判断将数据接收下来,而WaveCom模块在发送一串字符串给ARM
时,并没有事先通知ARM,下面将要发送的字符串是PDU类型的短消息。这样下来,
在程序中必须加上复杂的判断,这样就会令程序太复杂,甚至于不可以实现。所以在本系统中有必要设计一个不同与上下位机通信的串口数据处理方式,在这里,称之为
43
塑室堑翌奎兰堡主堂堡丝塞
“主动”方式。
为了实现串口数据安全、高效地传输,本系统设计采用了前后台的设计思想,即串口处理在前台,普通操作在后台。在前台,通过调用入栈函数将串口数据放到串口数据缓冲区中;在后台,各种任务在进行,当某些任务需要用到串口数据时,再通过一个读串口缓冲区数据的函数将数据取走使用,如图5.18所示。馨言囊螽夫栈————[二二二至三至三至三三二二卜串口数据入栈———叫 串口数据缓冲区卜—_
前台:
后台:
图5-18前后台串口数据传送示意图一、入列入列函数主要实现将一个数加入到队列缓冲区中。入列的过程就是改动队列的过程,因为入列时队列缓冲区中的每个数都需要相应左移一位,且入列后,队列中的数据个数加一,改动的数超过一个。指针作为函数的参数,可以实现任意个数的修改,
所以在此函数中用Queue结构指针变量sQueue来作为函数的参数,图5.19是入列过程的流程图。需要注意的是,当入列的数据个数大于队列缓冲区的长度时,多出的部分将被舍弃。所以在开辟缓冲区的时候,要考虑实际使用时的最大接收数据个数,留有充足的裕量。
图5-19入列流程图
44
南京师范大学硕:L学位论文图5.20是字符串WELCOME入列了五个数的示意图。
RXD
图5.20入列不意图二、OutQueueFIFO(将一个数出列FIFO)
出列函数主要实现将一个数从队列缓冲区中取走以供使用。同样,出列的过程也要改动队列的内容,出列时队列缓冲区虽然只需要将最高字节取走,但队列的数据个数也要减一,所以此函数改动的参数超过一个。指针作为函数的参数,可以实现任意个数的修改,所以在此函数中用指针变量sQueue来作为函数的参数,图5.21是出列过程的流程图。需要注意的是,当队列被完全出列后,队列缓冲区中数据个数等于0。
图5-21出列流程图图5.22所示是字符串WELCOME出列了四个数的示意图。
MSB pNum。7 LSB
图5-22出列示意图三、SioRead(将串口数据缓冲区的内容读到用户数据缓冲区供使用)
前面已经讨论了使用前后台的工作方式来处理串口数据的接收,接下来讨论后台
45
南京师范大学硕十学位论文的主程序怎样使用前台程序接收到的数据。串口数据的接收全部在前台完成,只要有数据发送到串口,前台程序就将之入栈,不管之前入栈的数据有没有被后台程序拿走。
当有新的数据到来时,如果后台程序没有将串口缓冲区中的数据及时取走,则这些数据将会被新的数据冲掉。所以有必要设计一个函数来及时地将前台数据取走,避免前台数据遗失。
图5.23是读串口缓冲区数据的流程图,它的入口参数有两个,一个是接受数据缓冲区,另一个是接受数据缓冲区长度。同样要在此函数中将串口数据缓冲区拿到接受数据缓冲区中,接受数据缓冲区参数必须是指针。此函数除了有读串口数据缓冲区数据的功能,它还有对串口数据接收情况指示。当函数返回0时,说明串口中没有数据,或者读串口数据缓冲区错误。不管怎样,只要调用此函数,就会将串口数据缓冲区中的内容抽空。这也是必要的,因为只有将串口数据缓冲区的内容抽空了,才能为前台程序接收下一次数据做准备。 。
图5.23读串口数据流程图图5.24形象地描述后台程序是怎样从前台程序处理的串口数据缓冲区中将有效数据读走。以下是SioRead()函数正在执行的情况,它已经从串口数据缓冲区读了四个数据,最后它将会将串口数据缓冲区的内容抽空,并将被抽空的内存填上’\o’。
南京师范大学硕士学位论文
5.4.5看门狗
MSB pNum=7 LSB
>buf—MSB—LSB使用
X,m,蚺_,士【I][工]二[工]二[工]二匡卫殛啾裂循佚■
LPC2214内部自带看门狗,WDT溢出时间计算如下:
溢出时间=N×tyak×4
其中,N为WDTC的设置值。
看门狗基本操作方法如下:
设置WDT定时器重装值(WDTC);
设置WDT工作模式,启动WDT(WDMOD);
对WDFEED操作,实现喂狗。
由于看门狗实现简单,所以不作详细分析。
5.5功能测试
5.5.1 LCD测试首先,编了一个测试程序,来检查LCD模块接上LPC2214后,工作是否正常。
测试程序如下:
47