STM32F10x 的USART 支持DMA 方式,并且在DMA完成后可以产生中断。这对于需要接收或发送大量数据的应用情景是很有帮助的。
在普通的8位或16位单片机中很少有包含DMA控制器的,所以可能许多嵌入式程序员对DMA方式并不熟悉。简单的说,直接存储器存取(DMA)用来提供在外设和存储器之间或者存储器和存储器之间的高速数据传输。由于无须CPU干预,数据可以通过DMA快速地移动,这就节省了CPU的资源来做其他操作。
STM32F10x 上具有两个DMA控制器,共有12个通道(DMA1有7个通道,DMA2有5个通道),每个通道专门用来管理来自于一个或多个外设对存储器访问的请求。还有一个仲裁器来协调各个DMA请求的优先权。
按照STM32参考手册上的说法:“DMA控制器和Cortex™-M3核心共享系统数据总线,执行直接存储器数据传输。当CPU和DMA同时访问相同的目标(RAM或外设)时,DMA请求会暂停CPU访问系统总线达若干个周期,总线仲裁器执行循环调度,以保证CPU至少可以得到一半的系统总线(存储器或外设)带宽。”所以我们不必担心DMA控制器霸占总线资源。CPU总是可以得到一般的总线时间的。
下面我们以USART2 的数据发送为例来介绍DMA。首先由STM32 参考手册的图22可知。USART2 的发送功能可以使用DMA1 的第7 个通道。
利用的DMA 传输的设置工作大体可以分为6步:
1. 在DMA1_CPAR7寄存器中设置外设寄存器的地址。发生外设数据传输请求时,这个地址将是数据传输的源或目标。
2. 在DMA1_CMAR7寄存器中设置数据存储器的地址。发生外设数据传输请求时,传输的数据将从这个地址读出或写入这个地址。
3. 在DMA1_CNDTR7寄存器中设置要传输的数据量。在每个数据传输后,这个数值递减。
4. 在DMA1_CCR7寄存器的PL[1:0]位中设置通道的优先级。
5. 在DMA1_CCR7寄存器中设置数据传输的方向、循环模式、外设和存储器的增量模式、外设和存储器的数据宽度、传输一半产生中断或传输完成产生中断。
6. 设置DMA1_CCR7寄存器的ENABLE位,启动该通道。
第1步对应的代码为:
DMA1_Channel7->CPAR = (uint32_t) &(USART2->DR);
第2步对应的代码如下,其中p_str 是一个指针,指向要传输的数据的首地址:
DMA1_Channel7->CMAR = (uint32_t) p_str;第3步对应的代码如下,cnt 为要传输的数据量,串口数据是以字节为传输单位的,所以这里cnt就是要传输数据的字节数。
DMA1_Channel7->CNDTR = cnt;第4步对应的代码如下,DMA 通道的优先级分为4级,分别是:DMA_Priority_VeryHigh、DMA_Priority_High、DMA_Priority_Medium、DMA_Priority_Low。这里设为最低。
DMA1_Channel7->CCR |= DMA_Priority_Low;第5步对应的代码如下:
DMA1_Channel7->CCR |= DMA_DIR_PeripheralDST | DMA_Mode_Normal | DMA_PeripheralInc_Disable | DMA_MemoryInc_Enable | DMA_PeripheralDataSize_Byte | DMA_MemoryDataSize_Byte | DMA_M2M_Disable;第6步对应的代码如下:
DMA1_Channel7->CCR |= DMA_CCR1_EN;
实际上在这
首先采用uname -a查看服务器类型
$ uname -a
HP-UX WEBDB1 B.11.31 U ia64 0749665296 unlimited-user license
服务器的为HP-UX
服务的名字:WEBDB1
服务器的版本:B.11.31
$
$ machinfo
CPU info: #CPU信息
4 Intel(R) Itanium 2 9100 series processors (1.59 GHz, 18 MB) #4个CPU
532 MT/s bus, CPU version A1
8 logical processors (2 per socket) #8个处理器,4个CPU,表示双核
Memory: 32737 MB (31.97 GB) #表示物理内存的大小
Firmware info: #固件信息
Firmware revision: 04.21
FP SWA driver revision: 1.18
IPMI is supported on this system.
BMC firmware revision: 5.38
Platform info: #平台信息
Model: "ia64 hp server BL870c" # 服务器为ia64的hp 型号为BL870c惠普c级刀片服务器
Machine ID number: 2caefc10-70d8-11df-b289-35a8ab4110df #服务器的编号
Machine serial number: SGH50171B9 # 服务器的序列号
OS info: #系统信息
Nodename: WEBDB1 #节点名称,服务器名称
Release: HP-UX B.11.31 #发布版本
Version: U (unlimited-user license)
Machine: ia64 #操作系统型号
ID Number: 0749665296
vmunix _release_version:
@(#) $Revision: vmunix: B.11.31_LR FLAVOR=perf
以上为machinfo命令为我们提供个主要信息。
在SUSE中查看系统的版本使用:
lsb_release
jpegsrc.v6b.tar.gz http://www.ijg.org/
libpng-1.2.7.tar.tar http://sourceforge.net/projects/libpng/
zlib-1.2.2.tar.gz http://sourceforge.net/projects/zlib/
freetype-2.1.9.tar.gzhttp://sourceforge.net/projects/freetype/
安装前先创建jpeg安装文件所需(如下)目录,防止提示类似“无法创建一般文件‘/usr/local/jpeg/***’: 没有那个文件或目录" 的错误
3、安装 libpng
./configure --prefix=/usr/local/gd2 --with-jpeg=/usr/local/jpeg/ --with-png=/usr/local/libpng/ --with-zlib=/usr/local/zlib/ --with-freetype=/usr/local/freetype/
(如果出错见下文)
6、集成PHP GD扩展 到PHP里
切换到PHP源码包
(如果出现未知配置项--with-png**,--with-freetype之类的错误 在配置项后面加上-dir参数即可:既修编译参数为: ./configure --with-php-config=[php安装目录]/bin/php-config --with-jpeg-dir=[jpeg安装目录] --with-png-dir=[libpng安装目录] --with-freetype-dir=[freetype安装目录] --with-zlib=[zlib安装目录] --with-gd=[gd安装目录] 即可
)
./configure --with-php-config=/usr/local/php/bin/php-config --with-jpeg-dir=/usr/local/jpeg --with-png-dir=/usr/local/libpng --with-freetype-dir=/usr/local/freetype --with-zlib-dir=/usr/local/zlib --with-gd=/usr/local/gd2
执行编译安装
具体操作流程如下:
$ cd <php源码>/ext/gd $ /usr/local/php5/bin/phpize $ ./configure --with-gd=/usr/local/gd --with-jpeg-dir=/usr/local/jpeg --with-png-dir=/usr/local/libpng --with-freetype-dir=/usr/local/freetype --with-zlib-dir=/usr/local/zlib --with-php-config=/usr/local/php/bin/php-config $ make && make install 修改php.ini $ make && make install 添加extension=gd.so 最后,重启apache
可能出现的错误以及解决方法:
编译GD库时如果出现以下错误:
在./configure GD库,安装时出现了一个问题,下面是报错信息 gd_png.c:16:53: error: png.h: No such file or directory gd_png.c:47: error: expected specifier-qualifier-list before ‘jmp_buf’ gd_png.c:54: error: expected ‘)’ before ‘png_ptr’ gd_png.c:82: error: expected ‘)’ before ‘png_ptr’ gd_png.c:92: error: expected ‘)’ before ‘png_ptr’ gd_png.c:98: error: expected ‘)’ before ‘png_ptr’ gd_png.c: In function ‘gdImageCreateFromPngCtx’: gd_png.c:125: error: ‘png_byte’ undeclared (first use in this function) gd_png.c:125: error: (Each undeclared identifier is reported only once gd_png.c:125: error: for each function it appears in.) gd_png.c:125: error: expected ‘;’ before ‘sig’ gd_png.c:126: error: ‘png_structp’ undeclared (first use in this function) gd_png.c:126: error: expected ‘;’ before ‘png_ptr’ gd_png.c:127: error: ‘png_infop’ undeclared (first use in this function) gd_png.c:127: error: expected ‘;’ before ‘info_ptr’ gd_png.c:128: error: ‘png_uint_32′ undeclared (first use in this function) gd_png.c:128: error: expected ‘;’ before ‘width’ gd_png.c:131: error: ‘png_colorp’ undeclared (first use in this function) gd_png.c:131: error: expected ‘;’ before ‘palette’ gd_png.c:132: error: ‘png_color_16p’ undeclared (first use in this function) gd_png.c:132: error: expected ‘;’ before ‘trans_gray_rgb’ gd_png.c:133: error: expected ‘;’ before ‘trans_color_rgb’ gd_png.c:134: error: ‘png_bytep’ undeclared (first use in this function) gd_png.c:134: error: expected ‘;’ before ‘trans’ gd_png.c:135: error: expected ‘;’ before ‘image_data’ gd_png.c:136: error: ‘png_bytepp’ undeclared (first use in this function) gd_png.c:136: error: expected ‘;’ before ‘row_pointers’ gd_png.c:144: error: ‘sig’ undeclared (first use in this function) gd_png.c:157: error: ‘png_ptr’ undeclared (first use in this function) gd_png.c:157: error: ‘PNG_LIBPNG_VER_STRING’ undeclared (first use in this function) gd_png.c:157: error: ‘gdPngErrorHandler’ undeclared (first use in this function) gd_png.c:166: error: ‘info_ptr’ undeclared (first use in this function) gd_png.c:182: error: ‘jmpbuf_wrapper’ has no member named ‘jmpbuf’ gd_png.c:192: error: ‘gdPngReadData’ undeclared (first use in this function) gd_png.c:195: error: ‘width’ undeclared (first use in this function) gd_png.c:195: error: ‘height’ undeclared (first use in th