嵌入式课程设计-基于ARM-Cortex-M处理器的图像无线传输.doc_第1页
嵌入式课程设计-基于ARM-Cortex-M处理器的图像无线传输.doc_第2页
嵌入式课程设计-基于ARM-Cortex-M处理器的图像无线传输.doc_第3页
嵌入式课程设计-基于ARM-Cortex-M处理器的图像无线传输.doc_第4页
嵌入式课程设计-基于ARM-Cortex-M处理器的图像无线传输.doc_第5页
已阅读5页,还剩29页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

嵌入式课程设计课程设计名称:基于ARM-Cortex-M处理器的图像无线传输 专业班级: 电科1301班 学生姓名: 学 号: 指导教师: 基于ARM-Cortex-M处理器的图像无线传输一,设计简介本论文主要阐述设计一款以ARM Cortex-M系列微处理器为核心的图像无线传输系统的设计方法和实现细节。论文主要针对未来对于智能家居以及安防设备的日益需求,采用迄今最为流行性能卓越的ARM Cortex-M系列嵌入式微处理器作为嵌入式智能设备的处理核心,并搭载使用Micrium公司的嵌入式实时操作系统uC/OSII。图像无线传输具有十分广阔的应用前景,在军事、国防、工农业、城市管理、生物医疗、环境监测、危险区域等许多领域都有重要的科研价值和潜在的实用价值, 已经引起了人们广泛的关注。美国技术评论杂志把图像无线传感器视为未来新兴十大技术的首位。美国早在上个世纪90年代就着手对无线传感器网络展开了先期研究,并在军方应用与推广。美国军方的远景研究计划局(DARPA)陆续支持了Wins、SmartDust等一系列重要的图像无线传感器项目。二,系统硬件设计1,系统框图摄像头模块发送端处理器ILI9325显示屏SD卡存储单元2.4G无线模块接受端处理器ILI9325显示屏SD卡存储单元2.4G无线模块能源供应部分能源供应部分图1 图像无线传输工作原理框图处理器模块是整个传感器节点的核心部分,包括处理单元和存储单元,它负责控制整个节点的操作,处理所有相关数据;传感器模块是外围的设备的真正接口,负责监测区域内数据的采集和转换;无线通信模块负责与其他传感器节点进行无线通信,并传递数据;能量供应模块也就是传感器节点运行所需的电源,一般直接供电不太实际,通常采用微型电池。此外,还提供与用户的通信接口,方便与用户进行交互。图像无线传输工作原理框图见图1.2,ARM处理器系统核心部分采用ARM处理器。Cortex系列属于ARMv7架构,这是ARM公司最新的指令集架构。ARMv7架构定义了三大分工明确的系列:“A”(Application)系列面向尖端的基于虚拟内存的操作系统和用户应用,处理性能越来越接近于电脑,典型的产品有平板电脑、iphone、安卓手机和windows phone8;“R”(Realtime)系列针面向实时系统;“M”(Microcontroller)系列面向微控制器。由于应用领域不同,基于v7架构的Cortex处理器系列所采用的技术也不相同,基于v7A的称为Cortex-A系列,基于v7R的称为Cortex-R系列,基于v7M的称为Cortex-M系列。本系统设计便使用了Cortex-M系列的处理器。3,发射端核心部分发射端核心部分采用STM32F407VGT6处理器,STM32F407VGT6属于先进的,Cortex-M4F内核,FPU浮点运算能力,增强的DSP处理指令;更多的存储空间,高达1M字节的片上闪存高达196K字节的内嵌SRAM;灵活的外部存储器接口;极致的运行速度,以168MHz高速运行时可达到1.25DMIPS/MHz的处理能力。片上资源有LCD并行接口,8080/6800模式;时钟,复位和电源管理1.8 V至3.6 V供电和I / O的POR,PDR,PVD和BOR4至26 MHz晶体振荡器内部16 MHz工厂调整的RC(精度为1)32 kHz振荡器作为RTC与校准内部32 kHz RC与校准睡眠,停机和待机模式VBAT供应RTC,2032位的备份寄存器+可选的4 KB备份SRAM;3个12位,2.4MSPS一个A/D转换器:多达24通道,三重交叉模式下的性能高达7.2 MSPS;2个12位D / A转换器;通用DMA:具有FIFO和突发支持的16路DMA控制器;多达17个定时器:12个16位定时器,和2个频率高达168MHz的32位定时器,每个定时器都带有4个输入捕获/输出比较/PWM,或脉冲计数器与正交(增量)编码器输入;高级连接功能USB 2.0全速器件/主机/ OTG控制器,带有片上物理层USB的2.0 high-speed/full-speed设备/主机/ OTG控制器的专用DMA,片上全速PHY和ULPI10/100以太网MAC专用DMA:支持IEEE 1588v2的硬件,MII/RMII;14位parallel-照相机接口:速度高达54MB/S。4,通用DMA:具有F?6?7?6?7IFO和突发支持的16路DMA控制器2个12位D / A转换器.LCD并行接口,8080/6800模式该处理器是由ARM专门开发的最新嵌入式处理器,用以满足需要有效且易于使用的控制和信号处理功能混合的数字信号控制市场。高效的信号处理功能与 Cortex-M 处理器系列的低功耗、低成本和易于使用的优点的组合,旨在满足专门面向电动机控制、汽车、电源管理、嵌入式音频和工业自动化市场的新兴类别的灵活解决方案。该处理器是由ARM专门开发的最新嵌入式处理器,用以满足需要有效且易于使用的控制和信号处理功能混合的数字信号控制市场。高效的信号处理功能与 Cortex-M 处理器系列的低功耗、低成本和易于使用的优点的组合,旨在满足专门面向电动机控制、汽车、电源管理、嵌入式音频和工业自动化市场的新兴类别的灵活解决方案。该处理器是由ARM专门开发的最新嵌入式处理器,用以满足需要有效且易于使用的控制和信号处理功能混合的数字信号控制市场。高效的信号处理功能与 Cortex-M 处理器系列的低功耗、低成本和易于使用的优点的组合,旨在满足专门面向电动机控制、汽车、电源管理、嵌入式音频和工业自动化市场的新兴类别的灵活解决方案。接收端核心部分接收端核心部分使用STM32F103ZET6处理器,STM32F103ZET6处理器增强型系列使用高性能的ARM Cortex-M3 32位的RISC内核,ARM的Cortex-M3处理器是最新一代的嵌入式ARM处理器,以72MHz主频运行时可达到1.20 DMIPS/MHz的处理能力,它为实现MCU的需要提供了低成本的平台、缩减的管脚数目、降低的系统功耗,同时提供卓越的计算性能和先进的中断系统响应。 片上资源有LQFP144脚LQFP144脚,512K 片内FLASH(相当于硬盘),64K片内RAM(相当于内存),片内FLASH 支持在线编程(IAP);片内双RC晶振,提供8M和32K的频率;3路共16通道的12位AD输入,2路共2通道的12位DA输出;支持片外独立电压基准;8个定时器;3个SPI接口;2个IIC接口;2个IIS接口;5个USART通信接口;1个SDIO接口;1个USB微控制器;1个CAN微控制器。所有的I/O口都可作为外部中断触发端。5,无线模块图2 NRF24L01+无线模块原理图发送端和接收端的无线模块硬件原理均一致。NRF24L01+是NORDIC公司最近生产的一款工作在2.4GHz2.5GHz的ISM 频段的单片无线收发器,采用FSK调制,内部集成NORDIC自己的Enhanced Short Burst协议。可以实现点对点或是1对6的无线通信。无线通信速度可以达到2M(bps)。无线收发器包括:频率发生器、增强型“SchockBurst”模式控制器、功率放大器、晶体振荡器、调制器和解调器。输出功率频道选择和协议的设置可以通过SPI接口进行设置。几乎可以连接到各种单片机芯片,并完成无线数据传送工作。6,发送端图像采集部分图3 OV7670摄像头图3是OV7670摄像头与处理器的连接图。OV7670图像传感器,体积小、工作电压低,提供单片VGA摄像头和影像处理器的所有功能。通过SCCB 总线控制,可以输出整帧、子采样、取窗口等方式的各种分辨率8位影响数据。该产品VGA图像最高达到30帧/秒。OV7670/7171共有656x488即320128个像素,其中640x480个有效(即307200)。7,SCCB总线,SCCB是欧姆尼图像技术公司(OmniVision)开发的一种总线,并广泛的应用于OV系列图像传感器上。SCCB是一种3线的总线,它由SCCB_E、SIO_C、SIO_D组成。在为了减少引脚的芯片上缩减为2根线,SIO_C和SIO_D。2线的SCCB总线只能是一个主器件对一个从器件控制,但3线SCCB接口可以对多个从器件控制。2线的SCCB总线需要主机具备如下条件中的一个或多个:一、主机必须能够使SIO_D处于第三态,即高阻态。二、主机必须能够驱动SIO_D比正常识别电压更高或更低。图4 SCCB时序图SIO_E:输出(主机发出,单向),低电平有效,总线空闲时主机驱动此引脚为1,驱动为0时表示开始传输或者挂起模式(在表面没有该引脚的芯片中,该引脚默认为可用的,并且保持高电平)。它标志这数据传输的开始和结束,高电平向低电平转变表示开始传输,低电平向高电平转变表示结束传输。在数据传输过程中,SIO_E必须保持为0。SIO_C:输出(主机发出,单向),总线空闲时主机驱动此引脚为1;当驱动SIO_E为0时,主机驱动此引脚为0或1;当挂起时主机驱动SIO_C为0; 它表明每一个传输位;SIO_C为1时表示一个传输位;SIO_D只能在SIO_C为0时发生变化。 SIO_D:I/O口,双向传输线,既可以由主机驱动也可以由从机驱动。当总线空闲时保持浮动,状态不固定(0、1或三态高阻)。当系统挂起时驱动该引脚为0。为了不让该引脚产生未知的状态,主机和从机有职责保持该引脚的电平。SIO_C为1表示传输一位数据,SIO_D只能在SIO_C为0时发生变化。然而,在开始传输和结束传输时却可以存在例外。当SIO_E有效且SIO_C变为0之前,SIO_D可以被驱动为0。在SIO_E失效前,SIO_C转为1时,SIO_D也能被驱动为0。8,摄像头工作时序图5 摄像头工作时序图当图像当中一行的数据来临之际,行中断引脚HREF=0,tPHL过后HREF=1,表示像素数据开始输出,在像素时钟引脚PLCK=0时改变输出数据,PLCK=1是通知处理器数据输出稳定,以此反复输出一行数据。9,LCD显示部分图6 发送端TFT屏电路原理图图7 接受端TFT屏电路原理图发送端和接收端的显示屏均使用ILI9325芯片驱动的显示屏。在ARM cortex-M系列处理器内部,是通过FSMC(静态存储器控制器)来控制ILI9325,ARM cortex-M系列处理器把TFT模块当做一块NOR FLASH来操作。使用FSMC控制器后,可以把FSMC提供的FSMC_A25:0作为地址线,而把FSMC提供的FSMC_D15:0作为数据总线。当存储数据设为16位时,地址各位对应FSMC_A24:0,数据位对应FSMC_D15:0。10,片存储部分图8 SD卡存储部分存储部分使用SD卡,SD存储介质是一种非易失性外部存储器,可满足许多应用场合的要求。SD格式是“多媒体卡”(MMC)格式的继承产品。SD卡存储器一般工作于3.3V电压,具有适度的电流要求。SD卡的容量从几百兆节到最高的几十GB不等。容量范围如此之宽,可为众多应用提供充足的外部存储空间。三,系统软件设计1,无线模块驱动程序设计发送端和接收端的无线模块驱动代码均由以上两个文件组成。对nrf24l01的操作方法见图8。对nrf24l01传送SPI数据设置nrf24l01为发送模式,指定发送速率和发送个数初始化处理器SPI接口发送指定数据发送函数是否返回0NOYES对nrf24l01传送SPI数据设置nrf24l01为接收模式,指定接收速率和接收个数初始化处理器SPI接口接收数据接收函数是否返回0NOYES图3-1-1 nrf24l01发送数据操作流程图图3-1-2 nrf24l01接收数据操作流程图图8 nrf24l01工作在发送和接收的操作流程图对nrf24l01的操作很简单,不论是发送还是接收基本步骤都是先初始化处理器SPI接口,然后传送参数对nrf24l01进行设置,接下来便可以使用nrf24l01进行发送数据(或接收数据)。为了确保不发漏(或接漏)数据,每次发送(或接收)都通过while()循环检查是否发送(或接收)成功,发送(或接收)函数返回0表示无误,返回1表示还没成功或还没完成发送(或接收)。nrf24l01.c提供用户使用的函数有NRF24L01_Init()NRF24L01_Detach()NRF24L01_TxMode()NRF24L01_RxMode()NRF24L01_TxPacket()NRF24L01_RxPacket()NRF24L01_Init()函数初始化ARM处理器的SPI接口,完成SPI初始化后检测接口上是否连接好nrf24l01无线模块。NRF24L01_Detach()函数用于解除nrf24l01无线模块对ARM处理器的SPI接口的占用,也有减低系统功耗功能。NRF24L01_TxMode()设置nrf24l01无线模块为发送模式,包括设置通讯速率,通讯字节个数,本地地址和接收地址,频道的自动答应允许是否使能,允许接受的频道号和频道个数,自动重发时间和次数,输出功率频道选择。NRF24L01_RxMode()设置nrf24l01无线模块为接收模式,包括设置通讯速率,通讯字节个数,本地地址和接收地址,频道的自动答应允许是否使能,允许接受的频道号和频道个数,自动重发时间和次数,输出功率频道选择。NRF24L01_TxPacket()发送具体数据包。具体实现代码:unsigned char NRF24L01_TxPacket(unsigned char* tx_buf, unsigned char len)unsigned char status = 0x00;NRF24L01_CE_LOW();NRF24L01_Write_Buf(RF_WRITE_REG + RX_ADDR_P0, NRF24L01_ADDRESS, NRF24L01_ADR_WIDTH_5B); / 装载接收端地址NRF24L01_Write_Buf(WR_TX_PLOAD, tx_buf, len);/ 装载数据NRF24L01_CE_HIGH();while(NRF24L01_IRQ() != 0);status = NRF24L01_Read_Reg(RF_READ_REG + STATUS);NRF24L01_Write_Reg(RF_WRITE_REG + STATUS, status);if(status & MAX_TX)NRF24L01_Write_Reg(FLUSH_TX, 0x00);return MAX_TX;if(status & TX_OK)return TX_OK;return 0xff;/其他原因发送失败NRF24L01_RxPacket()接收具体数据包。具体实现代码:unsigned char NRF24L01_RxPacket(unsigned char* rx_buf, unsigned char len) unsigned char revale = 0;unsigned char sta = 0;while(NRF24L01_IRQ() != 0);sta = NRF24L01_Read_Reg(RF_READ_REG+STATUS);/ 读取状态寄存其来判断数据接收状况NRF24L01_Write_Reg(RF_WRITE_REG+STATUS, sta); /接收到数据后RX_DR,TX_DS,MAX_PT都置高为1,通过写1来清楚中断标志if(sta & RX_OK) / 判断是否接收到数据NRF24L01_Read_Buf(RD_RX_PLOAD, rx_buf, len);/ read receive payload from RX_FIFO bufferNRF24L01_Write_Reg(FLUSH_RX, 0x00);revale = RX_OK; /读取数据完成标志return revale;2,摄像头驱动程序设计图像采集端的摄像头驱动代码由以上两个文件组成。OV7670的操作流程如图9。初始化处理器SCCB接口和摄像头接口通过SCCB总线对OV7670写设置参数SCCB传送的数据书否完全到达OV7670启动OV7670OV7670采集图像NOYES图9 对OV7670操作流程图ov7670.c提供用户使用的函数有OV7670_Init()OV7670_Start()OV7670_Detach()OV7670_ISR()OV7670_Init()初始化ARM处理器摄像头接口和OV7670模块,并检测OV7670模块是否连接在ARM处理器摄像头接口上。具体实现代码:unsigned char OV7670_Init(void)unsigned char i;DCMI_NVIC_Init();DCIM_GPIO_Init();SCCB_Init();OV7670_Reset();delay_ms(5); for(i = 0; i OV7670_REG_NUM; i+) if(0 = OV7670_WriteReg(OV7670_regi0, OV7670_regi1)return 1; return 0;OV7670_Start()函数启动OV7670模块。此函数跟具体的硬件操作有关,具体实现代码:void OV7670_Start(void)LCD_WriteReg(0x0003, 0x1008); LCD_SetCursor(0, 319);LCD_WriteRAM_Prepare();RCC_AHB2PeriphClockCmd(RCC_AHB2Periph_DCMI, ENABLE);DCMI_ITConfig(DCMI_IT_FRAME, ENABLE);/DCMI中断 DMA_Cmd(DMA2_Stream1, ENABLE); DCMI_Cmd(ENABLE); DCMI_CaptureCmd(ENABLE); LCD_REG = 0x22;OV7670_Detach()用于解除OV7670模块对ARM处理器的摄像头接口的占用,也有减低系统功耗功能。OV7670_ISR()函数是OV7670模块中断服务函数,每当OV7670模块采集完一幅图像后便进入此函数进行关中断。此函数跟具体的硬件操作有很大关联,具体操作步骤和选用处理器有关,具体实现代码:void OV7670_ISR(void)if(DCMI_GetITStatus(DCMI_IT_FRAME) != RESET)DCMI_ClearITPendingBit(DCMI_IT_FRAME);LCD_SetCursor(0, 319); LCD_WriteRAM_Prepare();3,LCD显示驱动程序设计发送端和接受端LCD显示驱动代码由以上两个文件组成。ili9325的操作流程如图10。通过FSMC初始化ili9325初始化处理器FSMC接口写ili9325的寄存器地址写ili9325的寄存器数据图10 ili9325操作流程图ili932x.c提供用户使用的函数有LCD_Initializtion()LCD_SetCursor()LCD_SetWindows()LCD_Clear()LCD_Font()LCD_Dispmd()LCD_GetPoint()LCD_SetPoint()LCD_Initializtion()用于初始化ARM处理器的FSMC接口和LCD模块,有几个重要的参数需要注意:(0x0000,0x0001)开启内部时钟(0x0002,0x0700)电源开启(0x0050,0x0000)水平GRAM起始位置(0x0051,0x00ef)水平GRAM终止位置(0x0052,0x0000)垂直GRAM起始位置(0x0053,0x013f)垂直GRAM终止位置第一个参数是LCD的寄存器地址,第二个值是给对应的寄存器写进对应的数值。LCD_SetCursor()函数是设置LCD的坐标。LCD_SetWindows()函数是设置LCD显示得窗口大小。LCD_Clear()函数是清除LCD并显示全屏为一种单一颜色。LCD_Clear()函数设置LCD显示文字的字体。LCD_Dispmd()函数设置LCD刷屏的方式。LCD_GetPoint()函数读取LCD屏指定像素的RGB值。LCD_SetPoint()函数是在LCD指定的像素设置其RGB值。4,文件系统发送端和接受端SD存储底层驱动代码由以上两个文件组成。sdio_sd.c提供用户使用的函数有SD_Error SD_InitializeCards(void);SD_Error SD_GetCardInfo(SD_CardInfo *cardinfo);SD_Error SD_GetCardStatus(SD_CardStatus *cardstatus);SD_Error SD_EnableWideBusOperation(uint32_t WideMode);SD_Error SD_SelectDeselect(uint32_t addr);SD_Error SD_ReadBlock(uint8_t *readbuff, uint32_t ReadAddr, uint16_t BlockSize);SD_Error SD_ReadMultiBlocks(uint8_t *readbuff, uint32_t ReadAddr, uint16_t BlockSize, uint32_t NumberOfBlocks);SD_Error SD_WaitReadOperation(void);SD_Error SD_WriteBlock(uint8_t *writebuff, uint32_t WriteAddr, uint16_t BlockSize);SD_Error SD_WriteMultiBlocks(uint8_t *writebuff, uint32_t WriteAddr, uint16_t BlockSize, uint32_t NumberOfBlocks);SD_Error SD_WaitWriteOperation(void);SDTransferState SD_GetTransferState(void);SD_Error SD_StopTransfer(void);SD_Error SD_Erase(uint32_t startaddr, uint32_t endaddr);SD_Error SD_SendStatus(uint32_t *pcardstatus);SD_Error SD_SendSDStatus(uint32_t *psdstatus);SD_Error SD_ProcessIRQSrc(void);void SD_ProcessDMAIRQ(void);由于直接操作SD卡存储数据十分复杂,因此移植了FAT文件系统来对SD卡进行管理操作。FAT文件系统是一种由微软发明并拥有部分专利的文档系统,供MS-DOS使用,也是所有非NT内核的微软窗口使用的文件系统。cc936.c文件是拓展了FAT文件系统对中文的支持。diskio.c文件是FAT文件系统调用底层SD卡驱动代码的中间层。ff.c文件是FAT文件系统的核心部分。ffconf.h文件是FAT文件系统的配置文件。fsearch.c文件是FAT文件系统的路径搜索功能文件。integer.c文件定义了FAT文件系统自己的数据类型。四,实时操作系统应用1,uC/OSII实时操作系统介绍uC/OS是一种免费公开源代码、结构小巧、具有可剥夺实时内核的实时操作系统。uC/OS-II的前身是uC/OS,最早出自于1992 年美国嵌入式系统专家Jean J.Labrosse 在嵌入式系统编程杂志的5 月和6 月刊上刊登的文章连载,并把uC/OS 的源码发布在该杂志的BBS上。uC/OS和C/OS-II是专门为计算机的嵌入式应用设计的,绝大部分代码是用C语言编写的。CPU硬件相关部分是用汇编语言编写的、总量约200行的汇编语言部分被压缩到最低限度,为的是便于移植到任何一种其它的CPU 上。用户只要有标准的ANSI的C交叉编译器,有汇编器、连接器等软件工具,就可以将uC/OS-II嵌人到开发的产品中。uC/OS-II 具有执行效率高、占用空间小、实时性能优良和可扩展性强等特点, 最小内核可编译至 2KB 。uC/OS-II 已经移植到了几乎所有知名的CPU 上。其252版本通过了美国航天航空管理局的安全认证,可靠性非常高。uC/OS-II目标是实现一个基于优先级调度的抢占式的实时内核,并在这个内核之上提供最基本的系统服务,如信号量,邮箱,消息队列,内存管理,中断管理等。本课题选用uC/OS-II里最新的2.91版本,该版本最多可以支持256个任务,分别对应优先级0255,其中0为最高优先级。255为最低级,系统保留了4个最高优先级的任务和4个最顶优先级的任务,用户可以使用其他优先级。uC/OS-II提供了任务管理的各种函数调用,包括创建任务,删除任务,改变任务的优先级,任务挂起和恢复等。系统初始化时会自动产生两个任务:一个是空闲任务,它的优先级最低,该任务仅给一个整形变量做累加运算;另一个是系统任务,它的优先级为次低,该任务负责统计当前CPU的利用率。由于uC/OS-II实时性能优异,本课题我选用了该操作系统。2,在uC/OSII运行程序运行任务0是否完整采集一幅图像任务1把一幅完整图像保存到SD卡任务2驱动无线模块发送图像数据系统启动建立任务0,1,2NONOYESYES驱动摄像头采集图像发邮箱通0知任务1图像是否发送完成返回任务0发邮箱通1知任务2,图11 发送端程序流程图见图11,描述了发送端uC/OS-II的整体运行流程。uC/OS-II启动后,建立了任务0,任务1,任务2。任务0负责采集图像和显示采集图像,当一幅图像采集完成后,任务0发邮箱通知任务1保存图像到SD卡,任务1保存好后CPU返回任务0,任务0发邮箱通知任务2驱动无线模块发送图像数据,每发送20字节后等待接收端应答信号,再发送下一组20字节,知道一幅图像发送完成。发送端代码如下:/*发送端主函数*/int main (void) OSInit();/初始化uC/OS-II,实时内核OSTaskCreate(App4_Task0,(void *)0, (OS_STK *)&App4_Task0_Stk512 - 1, 14);OSTaskCreate(App4_Task1, (void *)0, (OS_STK *)&App4_Task1_Stk512 - 1, 13);OSTaskCreate(App4_Task2, (void *)0, (OS_STK *)&App4_Task2_Stk512 - 1, 12); OSStart();/启动操作系统 return (0);OS_EVENT *App4_Mbox2;/*定义两个事件邮箱指针*/* 任务App4_Task0负责摄像头图像采集和显示*/static OS_STK App4_Task0_Stk 512 ;static void App4_Task0 (void *p_arg)char msg1 = 1, msg2 = 2;while(OSTaskDelReq(30) != OS_ERR_TASK_NOT_EXIST)OSTimeDly(10);while(OV7670_Init();OV7670_Start();(void)p_arg; while(OS_TRUE)if (DCMI_GetFlagStatus(DCMI_FLAG_FRAMERI) = SET)DCMI_ClearFlag(DCMI_FLAG_FRAMERI);OV7670_Detach();OSMboxPost(App4_Mbox0, (void *)&msg1);OSMboxPost(App4_Mbox1, (void *)&msg2); OV7670_Start();/* 任务App4_Task1负责图像无线传输*/static OS_STK App4_Task1_Stk 512 ;static void App4_Task1 (void *p_arg)char* msg1;unsigned char err;App4_Mbox0 = OSMboxCreate(void *)0);(void)p_arg; while(OS_TRUE)msg1 = OSMboxPend(App4_Mbox0, 0, &err);if(err = OS_ERR_NONE)if(*msg1 = 1)Image_Transmit();/* 任务App4_Task2负责图像保存*/static OS_STK App4_Task2_Stk 512 ;static void App4_Task2 (void *p_arg)char* msg2;unsigned char err;unsigned int n = 0;App4_Mbox1 = OSMboxCreate(void *)0);(void)p_arg; while(OS_TRUE)msg2 = OSMboxPend(App4_Mbox1, 0, &err);if(err = OS_ERR_NONE)if(*msg2 = 2)while(GUI_PrtScreen(Photog_pathn+);第一个函数是主函数,初始化操作系统,创建了任务App4_Task0、任务App4_Task1、任务App4_Task2,最后启动系统。第二个函数是任务App4_Task0,初始化摄像头,启动摄像头,并在没采集一幅图像后发送系统邮件给任务App4_Task1、任务App4_Task2。第三个函数是任务App4_Task1,建立系统邮件0,并在接收到任务App4_Task0发来的系统邮件后开始发送图像。第四个函数是任务App4_Task2,建立系统邮箱1,并在接收到任务App4_Task0发来的系统邮件后保存图像到SD卡中。任务0把一幅完整图像保存到SD卡任务0驱动无线模块接收图像数据系统启动建立任务0图像是否接收完成NOYES图12 接收端程序流程见图12,描述了接收端uC/OS-II的整体运行流程。uC/OS-II启动后,建立了任务0,当无线模块接收到数据时,它会通知CPU去读取数据,每读完20字节就答应发送端一次,然后发送端再发送下一组20字节数据。当节后完整的一幅图像后,任务0把接收的图像保存到SD中。接受端代码如下:/*接收端主函数*/int main (void) OSInit();/初始化uC/OS-II,实时内核OSTaskCreate(OS_TaskCreate, (void *)0, (OS_STK *)&OS_TaskCreate_Stk128 - 1, 1);/启动实时内核前必须创建一个任务 OSStart();/启动操作系统 return (0);/*接受端的任务App5_Task0完成图像的接受和保存*/static OS_STK App5_Task0_Stk 1024 ;static void App5_Task0 (void *p_arg)unsigned int n = 0;while(OSTaskDelReq(30) != OS_ERR_TASK_NOT_EXIST)OSTimeDly(10);while(NRF24L01_Init(); NRF24L01_RxMode(NRF24L01_PLOAD_WIDTH_20B, NRF24L01_Speed_2Mbps);(void)p_arg; while(OS_TRUE)Image_Receive();while(GUI_PrtScreen(Photog_pathn+);第一个函数是主函数,初始化操作系统,创建了任务App4_Task0、任务App4_Task1、任务App4_Task2,最后启动系统。第二个函数是任务App5_Task0,初始化无线模块后便开始等待数据,当有数据来临便开始接收数据,保存数据到SD卡。五, 系统实现本设计的操作系统和软件程序的开发设计选择在ARM MDK4.5开发环境下完成。ARM MDK前身是KeilC51,Keil公司2005年由ARM公司收购,用于调试ARM7,ARM9,Cortex-M内核。由于ARM MDK对ARM cortex-M处理器的良好支撑,对软件代码的高性能优化和ARM MDK友好的人机交互界面和易于使用,ARM MDK被我选择作为主要的开发工具,得到了良好的开发效率。本人初初接触ARM时使用的开发环境是ADS1.2,由于MDK的编译器是RVCT,ADS1.2是ARM很早的产品,因此,MDK整体性能要好于ADS1.2。实际使用中,MDK支持的ARM Core比ADS1.2多(ADS1.2支持ARM7、ARM9、ARM10,ARM10已经被Inetl买断成为XSCALE架构,目前市面上很少有ARM10的产品,可以忽略,可以说ADS1.2只支持ARM7和ARM9,而MDK支持ARM7、ARM9和Coretex-M/R)。MDK的调试功能也比ADS1.2强。综上所述,ADS1.2无论从价格和性能都落后MDK。而RTOS原本开头使用的是现今国产十分优秀的开源免费操作系统RT-

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论