电科1301嵌入式结课作业基于ARMCortexM处理器图像无线传输.docx
《电科1301嵌入式结课作业基于ARMCortexM处理器图像无线传输.docx》由会员分享,可在线阅读,更多相关《电科1301嵌入式结课作业基于ARMCortexM处理器图像无线传输.docx(28页珍藏版)》请在冰点文库上搜索。
电科1301嵌入式结课作业基于ARMCortexM处理器图像无线传输
嵌入式课程设计
课程设计名称:
基于ARM-Cortex-M处理器的图像无线传输
专业班级:
电科1301班
学生姓名:
学号:
2013160
指导教师:
金广锋
基于ARM-Cortex-M处理器的图像无线传输
一,设计简介
本论文主要阐述设计一款以ARMCortex-M系列微处理器为核心的图像无线传输系统的设计方法和实现细节。
论文主要针对未来对于智能家居以及安防设备的日益需求,采用迄今最为流行性能卓越的ARMCortex-M系列嵌入式微处理器作为嵌入式智能设备的处理核心,并搭载使用Micrium公司的嵌入式实时操作系统uC/OS–II。
图像无线传输具有十分广阔的应用前景,在军事、国防、工农业、城市管理、生物医疗、环境监测、危险区域等许多领域都有重要的科研价值和潜在的实用价值,已经引起了人们广泛的关注。
美国《技术评论》杂志把图像无线传感器视为未来新兴十大技术的首位。
美国早在上个世纪90年代就着手对无线传感器网络展开了先期研究,并在军方应用与推广。
美国军方的远景研究计划局(DARPA)陆续支持了Wins、SmartDust等一系列重要的图像无线传感器项目。
二,系统硬件设计
1,系统框图
图1图像无线传输工作原理框图
处理器模块是整个传感器节点的核心部分,包括处理单元和存储单元,它负责控制整个节点的操作,处理所有相关数据;传感器模块是外围的设备的真正接口,负责监测区域内数据的采集和转换;无线通信模块负责与其他传感器节点进行无线通信,并传递数据;能量供应模块也就是传感器节点运行所需的电源,一般直接供电不太实际,通常采用微型电池。
此外,还提供与用户的通信接口,方便与用户进行交互。
图像无线传输工作原理框图见图1.
2,ARM处理器
系统核心部分采用ARM处理器。
Cortex系列属于ARMv7架构,这是ARM公司最新的指令集架构。
ARMv7架构定义了三大分工明确的系列:
“A”(Application)系列面向尖端的基于虚拟内存的操作系统和用户应用,处理性能越来越接近于电脑,典型的产品有平板电脑、iphone、安卓手机和windowsphone8;“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.8V至3.6V供电和I/O的POR,PDR,PVD和BOR4至26MHz晶体振荡器内部16MHz工厂调整的RC(精度为1%)32kHz振荡器作为RTC与校准内部32kHzRC与校准睡眠,停机和待机模式VBAT供应RTC,20×32位的备份寄存器+可选的4KB备份SRAM;3个12位,2.4MSPS一个A/D转换器:
多达24通道,三重交叉模式下的性能高达7.2MSPS;2个12位D/A转换器;通用DMA:
具有FIFO和突发支持的16路DMA控制器;多达17个定时器:
12个16位定时器,和2个频率高达168MHz的32位定时器,每个定时器都带有4个输入捕获/输出比较/PWM,或脉冲计数器与正交(增量)编码器输入;高级连接功能USB2.0全速器件/主机/OTG控制器,带有片上物理层USB的2.0high-speed/full-speed设备/主机/OTG控制器的专用DMA,片上全速PHY和ULPI10/100以太网MAC专用DMA:
支持IEEE1588v2的硬件,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处理器增强型系列使用高性能的ARMCortex-M332位的RISC内核,ARM的Cortex-M3处理器是最新一代的嵌入式ARM处理器,以72MHz主频运行时可达到1.20DMIPS/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,无线模块
图2NRF24L01+无线模块原理图
发送端和接收端的无线模块硬件原理均一致。
NRF24L01+是NORDIC公司最近生产的一款工作在2.4GHz~2.5GHz的ISM频段的单片无线收发器,采用FSK调制,内部集成NORDIC自己的EnhancedShortBurst协议。
可以实现点对点或是1对6的无线通信。
无线通信速度可以达到2M(bps)。
无线收发器包括:
频率发生器、增强型“SchockBurst”模式控制器、功率放大器、晶体振荡器、调制器和解调器。
输出功率频道选择和协议的设置可以通过SPI接口进行设置。
几乎可以连接到各种单片机芯片,并完成无线数据传送工作。
6,发送端图像采集部分
图3OV7670摄像头
图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比正常识别电压更高或更低。
图4SCCB时序图
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芯片驱动的显示屏。
在ARMcortex-M系列处理器内部,是通过FSMC(静态存储器控制器)来控制ILI9325,ARMcortex-M系列处理器把TFT模块当做一块NORFLASH来操作。
使用FSMC控制器后,可以把FSMC提供的FSMC_A[25:
0]作为地址线,而把FSMC提供的FSMC_D[15:
0]作为数据总线。
当存储数据设为16位时,地址各位对应FSMC_A[24:
0],数据位对应FSMC_D[15:
0]。
10,片存储部分
图8SD卡存储部分
存储部分使用SD卡,SD存储介质是一种非易失性外部存储器,可满足许多应用场合的要求。
SD格式是“多媒体卡”(MMC)格式的继承产品。
SD卡存储器一般工作于3.3V电压,具有适度的电流要求。
SD卡的容量从几百兆节到最高的几十GB不等。
容量范围如此之宽,可为众多应用提供充足的外部存储空间。
三,系统软件设计
1,无线模块驱动程序设计
发送端和接收端的无线模块驱动代码均由以上两个文件组成。
对nrf24l01的操作方法见图8。
图8nrf24l01工作在发送和接收的操作流程图
对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()发送具体数据包。
具体实现代码:
unsignedcharNRF24L01_TxPacket(unsignedchar*tx_buf,unsignedcharlen)
{
unsignedcharstatus=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);
returnMAX_TX;
}
if(status&TX_OK)
{
returnTX_OK;
}
return0xff;//其他原因发送失败
}
NRF24L01_RxPacket()接收具体数据包。
具体实现代码:
unsignedcharNRF24L01_RxPacket(unsignedchar*rx_buf,unsignedcharlen)
{
unsignedcharrevale=0;
unsignedcharsta=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);//readreceivepayloadfromRX_FIFObuffer
NRF24L01_Write_Reg(FLUSH_RX,0x00);
revale=RX_OK;//读取数据完成标志
}
returnrevale;
}
2,摄像头驱动程序设计
图像采集端的摄像头驱动代码由以上两个文件组成。
OV7670的操作流程如图9。
图9对OV7670操作流程图
ov7670.c提供用户使用的函数有
OV7670_Init()
OV7670_Start()
OV7670_Detach()
OV7670_ISR()
OV7670_Init()初始化ARM处理器摄像头接口和OV7670模块,并检测OV7670模块是否连接在ARM处理器摄像头接口上。
具体实现代码:
unsignedcharOV7670_Init(void)
{
unsignedchari;
DCMI_NVIC_Init();
DCIM_GPIO_Init();
SCCB_Init();
OV7670_Reset();
delay_ms(5);
for(i=0;i{
if(0==OV7670_WriteReg(OV7670_reg[i][0],OV7670_reg[i][1]))
{
return1;
}
}
return0;
}
OV7670_Start()函数启动OV7670模块。
此函数跟具体的硬件操作有关,具体实现代码:
voidOV7670_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模块采集完一幅图像后便进入此函数进行关中断。
此函数跟具体的硬件操作有很大关联,具体操作步骤和选用处理器有关,具体实现代码:
voidOV7670_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。
图10ili9325操作流程图
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_ErrorSD_InitializeCards(void);
SD_ErrorSD_GetCardInfo(SD_CardInfo*cardinfo);
SD_ErrorSD_GetCardStatus(SD_CardStatus*cardstatus);
SD_ErrorSD_EnableWideBusOperation(uint32_tWideMode);
SD_ErrorSD_SelectDeselect(uint32_taddr);
SD_ErrorSD_ReadBlock(uint8_t*readbuff,uint32_tReadAddr,uint16_tBlockSize);
SD_ErrorSD_ReadMultiBlocks(uint8_t*readbuff,uint32_tReadAddr,uint16_tBlockSize,uint32_tNumberOfBlocks);
SD_ErrorSD_WaitReadOperation(void);
SD_ErrorSD_WriteBlock(uint8_t*writebuff,uint32_tWriteAddr,uint16_tBlockSize);
SD_ErrorSD_WriteMultiBlocks(uint8_t*writebuff,uint32_tWriteAddr,uint16_tBlockSize,uint32_tNumberOfBlocks);
SD_ErrorSD_WaitWriteOperation(void);
SDTransferStateSD_GetTransferState(void);
SD_ErrorSD_StopTransfer(void);
SD_ErrorSD_Erase(uint32_tstartaddr,uint32_tendaddr);
SD_ErrorSD_SendStatus(uint32_t*pcardstatus);
SD_ErrorSD_SendSDStatus(uint32_t*psdstatus);
SD_ErrorSD_ProcessIRQSrc(void);
voidSD_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文件系统自己的数据类型。
四,实时操作系统