基于arm_cortex-m处理器图像无线传输的应用_毕业设计(论文)(编辑修改稿)内容摘要:

CD的RD脚;FSMC NWE: 写使能,连接LCD的RW脚;FSMC Ax: 用在LCD显示RAM和寄存器之间进行选择的地址线,即该线用于选择LCD的RS脚,该线可用地址线的任意一根线,范围:FSMC_A[25:0]。 注:RS = 0时,表示读写寄存器;RS = 1,表示读写数据RAM。 片存储部分图28 SD卡存储部分存储部分使用SD卡,SD存储介质是一种非易失性外部存储器,可满足许多应用场合的要求。 SD格式是“多媒体卡”(MMC)格式的继承产品。 ,具有适度的电流要求。 SD卡的容量从几百兆节到最高的几十GB不等。 容量范围如此之宽,可为众多应用提供充足的外部存储空间。 SD 总线有6 根通信线和三根电源供应线:CMD: 命令线是双向信号线。 主机和卡通过push pull 模式工作。 DAT03: 数据线是双向信号线。 主机和卡通过push pull 模式工作。 CLK: 时钟是从主机到卡的信号。 CLK 通过push pull 模式操作。 VDD: 是所有卡的电源供应线。 VSS[1:2]:2根地线。 SD 卡可以通过单数据线(DAT0)或四根数据线(DAT0DAT3)进行数据传输。 单根数据线传输最大传输速率为25 Mbit/s,四根数据线最大传输速率为100 Mbit/s。 本次课题设计的系统使用四根数据线。 第3章 系统软件设计本章介绍了图像无线传输系统各硬件的驱动程序的设计。 无线模块驱动程序设计 发送端和接收端的无线模块驱动代码均由以上两个文件组成。 对nrf24l01的操作方法见图31。 对nrf24l01传送SPI数据设置nrf24l01为发送模式,指定发送速率和发送个数初始化处理器SPI接口发送指定数据发送函数是否返回0NOYES对nrf24l01传送SPI数据设置nrf24l01为接收模式,指定接收速率和接收个数初始化处理器SPI接口接收数据接收函数是否返回0NOYES图311 nrf24l01发送数据操作流程图图312 nrf24l01接收数据操作流程图图31 nrf24l01工作在发送和接收的操作流程图对nrf24l01的操作很简单,不论是发送还是接收基本步骤都是先初始化处理器SPI接口,然后传送参数对nrf24l01进行设置,接下来便可以使用nrf24l01进行发送数据(或接收数据)。 为了确保不发漏(或接漏)数据,每次发送(或接收)都通过while()循环检查是否发送(或接收)成功,发送(或接收)函数返回0表示无误,返回1表示还没成功或还没完成发送(或接收)。 (完整形式参见附录1 )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 amp。 MAX_TX) { NRF24L01_Write_Reg(FLUSH_TX, 0x00)。 return MAX_TX。 } if(status amp。 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 amp。 RX_OK) // 判断是否接收到数据 { NRF24L01_Read_Buf(RD_RX_PLOAD, rx_buf, len)。 // read receive payload from RX_FIFO buffer NRF24L01_Write_Reg(FLUSH_RX, 0x00)。 revale = RX_OK。 //读取数据完成标志 } return revale。 } 摄像头驱动程序设计 图像采集端的摄像头驱动代码由以上两个文件组成。 OV7670的操作流程如图32。 初始化处理器SCCB接口和摄像头接口通过SCCB总线对OV7670写设置参数SCCB传送的数据书否完全到达OV7670启动OV7670OV7670采集图像NOYES图32 对OV7670操作流程图(完整形式参见附录1 ) 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_reg[i][0], OV7670_reg[i][1])) { 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()。 }} LCD显示驱动程序设计发送端和接受端LCD显示驱动代码由以上两个文件组成。 ili9325的操作流程如图33。 通过FSMC初始化ili9325初始化处理器FSMC接口写ili9325的寄存器地址写ili9325的寄存器数据图33 ili9325操作流程图(完整形式参见附录1 )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_SetPo。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。