F429接口没有提供构造方法的接口有哪些

全套200集视频教程和1000PDF教程请到秉火论坛下载:

野火视频教程优酷观看网址:/firege

第二组解码类型名字的长度

第二组解码类型名字:QR-Code

第二组解码数据长度的高八位

第二组解码数据长度的低八位

第二组解码数据:123

第三组解码类型名字的长度

    QR_decoder为解码函数,用户可以直接调用这个函数,返回值为解码成功的个数。get_image函数为获取图片的函数,通过指定存放图片的首地址,图片的分辨率来获取图片。

我们需要通过OV5640摄像头采集的图像数据传递到解码库解码,在帧中断提取一帧图片用来解码,见代码清单 243

1 //使用帧中断重置line_num,可防止有时掉数据的时候DMA传送行数出现偏移

4 /*判断帧中断标志位是否被置位*/

6 /*传输完一帧,计数复位*/

13 /*绘制扫描窗口里边的扫描线,放在这里主要是避免屏幕闪烁*/

17 /*清除帧中断标志位*/

DCMI中断函数中增加获取图片函数,先停止摄像头的采集,然后通过get_image 函数获取一帧图片,这个函数传递的第一个参数FSMC_LCD_ADDRESS是图片存放的首地址,第二个参数LCD_PIXEL_WIDTH为图片宽度,第三个参数是LCD_PIXEL_HEIGHT为图片高度,图片通过这个函数传递给解码函数进行解码,主函数将介绍如何调用解码函数。

通过LCD_Line_Scan_ARGB8888函数来绘制扫描线,绘制完后再启动摄像头的采集。LCD_Line_Scan_ARGB8888函数放在这个位置解决了当同时操作液晶的前景层和背景层时闪烁的问题。

F429LTDC支持双层叠加显示功能,具体可以参考我们LTDC部分章节的详细介绍。现在主要介绍如何绘制扫描窗口。我们定义背景层为显示摄像头图像层,前景层为扫描框显示层,代码清单

4 /*扫描框线条参数*/

8 //指定扫描窗口里边扫描线的初始位置

67 //提取各通道的颜色值

72 //指定绘制的首地址

98 //等待传输完成

119 //绘制水平方向的线条

124 //绘制垂直方向的线条

143 //提取各通道的颜色值

149 //指定绘制的首地址

197 //设置当前颜色为透明

223 //设置图形颜色为透明

225 //画一条透明颜色的线条,即清除上一次绘制的线条

230 //判断线条是否越界

234 //设置图形颜色为红色

236 //绘制一条线线条

LCD_Clear_ARGB8888为清屏函数,配置DMA2D模式为R2M,意思是寄存器到存储器,颜色为ARGB8888模式,Alpha_Value为透明度的设置参数,范围是0~255,0为全透明,255为不透明,半透明取中间值127即可。

LCD_DrawLine_ARGB8888为绘制线条函数,通过配置DMA2D来绘制,跟RGB565模式类似,主要注意每个像素的大小为4个字节。

LCD_DrawRect_ARGB8888为绘制矩形框函数,实际上就是画线,画四条线条组成一个矩形。

LCD_View_Finder_ARGB8888是绘制扫描框的函数,首先是绘制一个矩形,然后将各个边上的线的中间部分刷一遍透明色,就成了扫描框。

LCD_Line_Scan_ARGB8888为扫描线条函数,目的是为了在扫描窗口里边的从上往下画线形成扫描线的效果。需要注意的是每次画线之前先清掉上一次画的线条。

图像处理部分已经封装到解码库里边,并预留了与之相关的接口,通过宏定义QR_FRAME_BUFFER确保图像处理的数据缓冲区有3M字节的空间。同时摄像头需要采集到图像并传递到解码库即可。其他图像数据的处理全部在解码库里边完成。

数据解码部分已经封装到解码库里边,并预留了与之相关的接口,通过调用QR_decoder解码函数对经过图像处理的数据进行解码,返回解码成功的条码个数。并将解码结果存进decoded_buf二维数组。

接下来需要配置USART1的工作模式,我们通过编写Debug_USART_Config函数完成该功能,见代码清单 244

//串口状态,1表示正在发送,0表示空闲

串口的IO的配置跟之前的串口实验是一样的,这里说一下串口中断优先级的配置,首先要声明NVIC_InitStructure中断向量初始化的结构体,然后依次填入串口1的中断通道USART1_IRQn,串口1的中断抢占式优先级0,响应优先级0,并使能USART1中断通道,最后初始化这个结构体即可完串口中断优先级的配置。定义全局变量uart_send_state为串口发送状态的标志,通过get_send_sta函数获取当前的串口发送状态。uart_send_buf函数将待发送的数据写入待发送缓冲区,然后使能串口1发送中断,开始发送数据。USART1_IRQ函数是串口1的中断响应函数的回调函数,当发送数据的缓冲区非空就一直会进入中断发送数据,直到发送完毕,才将串口发送状态的标志清零,等待发送数据。

使用TIM2定时器延时

扫描二维码的时候我们需要用到蜂鸣器作为提示,蜂鸣器是有源的,给电就响掉电就不响,我们通过定时器2的计时来为蜂鸣器响的持续时间延时,TIM2的初始化,见代码清单 475

代码清单 475 使用TIM2定时器延时

TIM2_IRQHandler中断函数调用Time2_IRQ函数,设定延时8*10ms=80ms初始值,如果解码成功,beep_on_flag被置为1,蜂鸣器通过宏BEEP_ON来触发响声,BeepTime开始倒计时,直到BeepTime0,重新设定延时初始值80ms,复位蜂鸣器状态标志位,关闭蜂鸣器。蜂鸣器的使用可以参考蜂鸣器的相关章节介绍。

最后我们来编写main函数,利用前面讲解的函数,扫描二维码并输出结果,见代码清单 2414

16 LED灯共用引脚,不要同时使用LED和摄像头*/

21 时间到后触发定时中断,

38 /*初始化后默认使用前景层*/

57 /* 读取摄像头芯片ID,确定摄像头正常连接 */

70 没有检测到OV5640,请重新检查

90 /*DMA直接传输摄像头数据到LCD屏幕显示*/

92 //二维码识别,返回识别条码的个数

96 //识别成功,蜂鸣器响标志

99 //解码的数据是按照识别条码的个数封装好的

100 二维数组,这些数据需要

101 //根据识别条码的个数,按组解包并通过串口

102 发送到上位机串口终端

105 //获取解码类型长度

109 //获取解码类型名称

112 //获取解码数据长度高8

114 //获取解码数据长度低8

124 //串口发送分隔符

130 //串口发送分隔符

main函数中,首先初始化了串口,然后初始化系统滴答定时器,再初始化液晶屏,注意它是把摄像头使用的液晶层初始化成RGB565格式。第二层为半透明的扫描窗口,先是通过LCD_Clear_ARGB8888函数整屏填充一个半透明的矩形,然后通过LCD_DrawFullRect_ARGB8888函数在液晶的中心位置再画一个全透明的矩形,这样就显示一个扫描窗口,再用LCD_View_Finder_ARGB8888函数将二维码的扫描框画出来。扫描框的大小和颜色都是可以通过宏定义来定义。

摄像头控制部分,首先调用了OV5640_HW_Init函数初始化DCMII2C,然后调用OV5640_ReadID函数检测摄像头与实验板是否正常连接,若连接正常则调用OV5640_Init函数初始化DCMI的工作模式及配置DMA,再调用OV5640_RGB565Config函数向OV5640写入寄存器配置,再调用OV5640_AUTO_FOCUS函数初始化OV5640自动对焦功能,最后,一定要记住调用库函数DCMI_CmdDCMI_CaptureCmd函数使能DCMI开始捕获数据,这样才能正常开始工作。

使用蜂鸣器时需要初始化定时器2,用作解码成功时蜂鸣器动作持续的延时。

大循环里边直接调用QR_decoder函数来对二维码数据进行解码,返回值为解码成功的条码个数,通过二维数组保存解码结果。然后将解码结果拆包,发送解码类型和解码的数据。扫描中文二维码的时候特别注意上位机一定要支持UTF-8编码,否则输出结果会乱码。

最后特别注意,这个解码库消耗的堆栈比较大,我们需要调大堆栈的大小保证程序能正常稳定运行。

OV5640接到实验板的摄像头接口中,用USB线连接开发板,编译程序下载到实验板,并上电复位,打开串口终端助手,液晶屏会显示摄像头扫描框,对准二维码扫描即可把扫描结果发送到串口终端。

1.    为什么液晶屏扫描框里的循环扫描的线条一定要放在场中断里边进行?

我要回帖

更多关于 接口没有提供构造方法 的文章

 

随机推荐