




已阅读5页,还剩10页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
以DMA方式将电位器电压ADC转换输出到串口PC和液晶LCD的设计 学院:机电工程学院 专业:农业工程 姓名:梁晔 学号:201490905891、 设计思路以野火ISO-MINI为硬件基础,编写程序使电位器两端电压经过模数转换,以DMA(Direct Memory Access,直接内存存取)方式将电位器两端电压进过ADC模数转换串口输出到PC和LCD液晶显示屏。1、直接内存访问DMADMA(Direct Memory Access,直接内存存取) 是所有现代电脑的重要特色,它允许不同速度的硬件装置来沟通,而不需要依赖于 CPU 的大量中断负载。否则,CPU 需要从来源把每一片段的资料复制到暂存器,然后把它们再次写回到新的地方。在这个时间中,CPU 对于其他的工作来说就无法使用。DMA原理:DMA 传输将数据从一个地址空间复制到另外一个地址空间。当CPU初始化这个传输动作,传输动作本身是由 DMA 控制器来实行和完成。典型的例子就是移动一个外部内存的区块到芯片内部更快的内存区。像是这样的操作并没有让处理器工作拖延,反而可以被重新排程去处理其他的工作。DMA 传输对于高效能 嵌入式系统算法和网络是很重要的。在实现DMA传输时,是由DMA控制器直接掌管总线,因此,存在着一个总线控制权转移问题。即DMA传输前,CPU要把总线控制权交给DMA控制器,而在结束DMA传输后,DMA控制器应立即把总线控制权再交回给CPU。一个完整的DMA传输过程必须经过DMA请求、DMA响应、DMA传输、DMA结束4个步骤DMA请求:CPU对DMA控制器初始化,并向I/O接口发出操作命令,I/O接口提出DMA请求。DMA响应:DMA控制器对DMA请求判别优先级及屏蔽,向总线裁决逻辑提出总线请求。当CPU执行完当前总线周期即可释放总线控制权。此时,总线裁决逻辑输出总线应答,表示DMA已经响应,通过DMA控制器通知I/O接口开始DMA传输。DMA传输:DMA控制器获得总线控制权后,CPU即刻挂起或只执行内部操作,由DMA控制器输出读写命令,直接控制RAM与I/O接口进行DMA传输;在DMA控制器的控制下,在存储器和外部设备之间直接进行数据传送,在传送过程中不需要中央处理器的参与。开始时需提供要传送的数据的起始位置和数据长度。DMA结束:当完成规定的成批数据传送后,DMA控制器释放总线控制权,并向I/O接口发出结束信号。当I/O接口收到结束信号后,一方面停止I/O设备的工作,另一方面向CPU提出中断请求,使CPU从不介入的状态解脱,并执行一段检查次DMA传输操作正确性的代码。最后,带着本次操作结果及状态继续执行原来的程序。 由此可见,DMA传输方式无需CPU直接控制传输,也没有中断处理方式那样保留现场和恢复现场的过程,通过硬件为RAM与I/O设备开辟一条直接传送数据的通路,使CPU的效率大为提高。2、模数转换器ADC简介ADC (Analog to Digital Converter),模/数转换器。在模拟信号需要以数字形式处理、存储或传输时,模/数转换器几乎必不可少。野火STM32开发板用的是STM32F103VET6,属于增强型的CPU,它有18个通道,可测量16个外部和2个内部信号源。各通道的A/D转换可以单次、连续、扫描或间断模式执行。ADC的结果可以左对齐或右对齐方式存储在16位数据寄存器中。模拟看门狗特性允许应用程序检测输入电压是否超出用户定义的高/低阀值。 3、液晶显示屏LCD简介LCD,即液晶显示器,因为其功耗低、体积小,承载的信息量大,因而被广泛用于信息输出、与用户进行交互,目前仍是各种电子显示设备的主流。 因为 STM32 内部没有集成专用的液晶屏和触摸屏的控制接口,所以在显示面板中应自带含有这些驱动芯片的驱动电路(液晶屏和触摸屏的驱动电路是独立的),STM32 芯片通过驱动芯片来控制液晶屏和触摸屏。以野火 3.2 寸液晶屏(240*320)为例,它使用ILI9341芯片控制液晶屏。4、ILI9341 控制器结构 液晶屏的控制芯片内部结构非常复杂,见下图。最主要的是位于中间的GRAM(Graphics RAM),可以理解为显存。GRAM 中每个存储单元都对应着液晶面板的一个像素点。它右侧的各种模块共同作用把 GRAM 存储单元的数据转化成液晶面板的控制信号,使像素点呈现特定的颜色,而像素点组合起来则成为一幅完整的图像。 框图的左上角为 ILI9341 的主要控制信号线和配置引脚,根据其不同状态设置可以使芯片工作在不同的模式,如每个像素点的位数是 6、16 还是 18位;使用 SPI 接口还是 8080 接口与 MCU 进行通讯;使用 8080 接口的哪种模式。MCU 通过 SPI 或 8080 接口与 ILI9341 进行通讯,从而访问它的控制寄存器(CR)、地址计数器(AC)、及 GRAM。 在 GRAM 的左侧还有一个 LED 控制器(LED Controller)。LCD 为非发光性的显示装置,它需要借助背光源才能达到显示功能,LED 控制器就是用来控制液晶屏中的 LED 背光源。5、英文字模LCD的显示是有一个一个的小晶格组合而成的,用字模生成软件,以字符的形状转化成16进制编码生成字模文件,进行编号后的字模文件供LCD显示函数调用,常用的ASCII码如下:2、 设计内容1、主函数程序如下/ * * file main.c * author liangye * version V1.0 * date 2014-12-11 * brief ADC采集电位器电压传输到PC及LCD * * attention * * 实验平台:野火 ISO-MINI STM32 开发板 */#include stm32f10x.h#include bsp_usart1.h#include bsp_ili9341_lcd.h#include bsp_adc.hextern void Lcd_Delay(_IO uint32_t nCount);/ ADC1转换的电压以DMA方式传到SRAMextern _IO uint16_t ADC_ConvertedValue;/ 局部变量,用于保存转换计算后的电压值 float ADC_ConvertedValueLocal; /定义采集完成转换后的ADC数值类型/*软件延时*/void Delay(_IO uint32_t nCount) for(; nCount != 0; nCount-); /* * brief 主函数 * param 无 * retval 无 */int main(void)/*LCD显示的配置*/ LCD_Init(); /LCD初始化LCD_Clear(0, 0, 240, 320, BACKGROUND);/配置LCD液晶的显示高度,分辨率 LCD_DispStr(80, 60, (uint8_t *)THE Voltage is, WHITE);/LCD上显示标题 /*串口及ADC配置*/USART1_Config(); /配置串口USART1ADC1_Init(); /配置ADC1和把ADC1配置成DMA模式while (1)ADC_ConvertedValueLocal =(float) ADC_ConvertedValue/4096*3.3; / 读取转换的AD值 printf(rn -ADC(DMA) to PC-rn); /向pc发送标题信printf(rn The current AD value = 0x%04X rn, ADC_ConvertedValue); /向PC输出16进制电压值printf(rn The current AD value = %f V rn,ADC_ConvertedValueLocal); /向PC输出10进制电压值LCD_DispStr(160, 100, (uint8_t *)V, BLUE2); /LCD液晶在160,100位置显示字母V,颜色为浅蓝色LCD_DisTsl(100, 100, ADC_ConvertedValueLocal, GREEN); /将10进制AD值通过LCD_DisTsl函数输出到100,100位置Lcd_Delay(0xAFFf4);/LCD显示延时Delay(0xffffee); /软件延时/*END OF FILE*/2、 程序解读1) 将程序头文件包含进来#include stm32f10x.h/是标准外设库的入口,使用标准外设库的代码中 必须包含该头文件#include bsp_usart1.h/是串口通信头文件#include bsp_ili9341_lcd.h/是ili9341LCD的头文件#include bsp_adc.h/是ADC模数转换的头文件2) 定义变量设置DMA方式extern void Lcd_Delay(_IO uint32_t nCount);/ ADC1转换的电压以DMA方式传到SRAMvoid Lcd_Delay(_IO uint32_t nCount) /定义LCD延时函数 for(; nCount != 0; nCount-);extern _IO uint16_t ADC_ConvertedValue;/ 局部变量,用于保存转换计算后的电压值 强制定义一个16位变量ADC_ConvertedValuefloat ADC_ConvertedValueLocal; /定义采集完成转换后的ADC数值类型void Delay(_IO uint32_t nCount) for(; nCount != 0; nCount-); 软件延时3) LCD显示的配置 LCD_Init();/LCD初始化在bsp_ili9341_lcd.c中void LCD_Init(void)LCD_GPIO_Config();/LCD的GPIO配置LCD_FSMC_Config();/片上外设的配置LCD_Rst();/LCD复位配置LCD_REG_Config();/LCD颜色配置LCD_Clear(0, 0, 240, 320, BACKGROUND);/配置LCD液晶的显示高度,分辨率 void LCD_Clear(uint16_t x, uint16_t y, uint16_t width, uint16_t height, uint16_t color)uint32_t i = 0;/* 列地址控制设置*/LCD_ILI9341_CMD(0X2A);LCD_ILI9341_Parameter( x 8 ); /*先高8位后低8位*/LCD_ILI9341_Parameter( x & 0xff ); /* 列开始位置 */ LCD_ILI9341_Parameter( (x+width-1) 8 ); /* 列结束位置 */LCD_ILI9341_Parameter( (x+width-1) & 0xff );/* 页地址控制设置 */ LCD_ILI9341_CMD(0X2B); LCD_ILI9341_Parameter( y 8 );/* 页开始 */LCD_ILI9341_Parameter( y & 0xff );LCD_ILI9341_Parameter( (y+height-1) 8); /* 页结束 */LCD_ILI9341_Parameter( (y+height-1) & 0xff);/* 内存写入 */LCD_ILI9341_CMD(0x2c);for( i=0; i width*height; i+ )LCD_WR_Data( color );/Delay(0x0FFf);LCD_DispStr(80, 60, (uint8_t *)THE Voltage is, WHITE);/LCD显示字符串函数,此条命令用于显示标题 LCD_DispChar、LCD_DispStr、LCD_DisNum、LCD_DisTsl等函数后面单独介绍4) 串口及ADC配置USART1_Config();/配置串口USART1void USART1_Config(void)GPIO_InitTypeDef GPIO_InitStructure;USART_InitTypeDef USART_InitStructure;/* 配置串口时钟*/RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE);/* 串口通信GPIO配置 */* 配置串口PA.9工作在推挽输出模式 */GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;/复用推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;/速度50MhzGPIO_Init(GPIOA, &GPIO_InitStructure); /定义成一个结构体 /* 配置串口PA.10工作在浮空输入模式 */GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;/浮空输入GPIO_Init(GPIOA, &GPIO_InitStructure);/定义成一个结构体/* 串口通信模式设置 */USART_InitStructure.USART_BaudRate = 115200;/波特率设置在115200USART_InitStructure.USART_WordLength = USART_WordLength_8b;USART_InitStructure.USART_StopBits = USART_StopBits_1;USART_InitStructure.USART_Parity = USART_Parity_No ; USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None;USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;USART_Init(USART1, &USART_InitStructure);/* 使能串口1接收中断*/USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);USART_Cmd(USART1, ENABLE); USART_ClearFlag(USART1, USART_FLAG_TC); USART1_NVIC_Config();ADC1_Init();/配置ADC1和把ADC1配置成DMA模式5) While循环ADC_ConvertedValueLocal =(float) ADC_ConvertedValue/4096*3.3; / 读取转换的AD值printf(rn The current AD value = 0x%04X rn, ADC_ConvertedValue);/向PC输出16进制电压值printf(rn The current AD value = %f V rn,ADC_ConvertedValueLocal); /向PC输出10进制电压值printf(rn -ADC(DMA) to PC-rn);/向pc发送标题信6) LCD_DispChar、LCD_DispStr、LCD_DisTsl函数LCD_DispCharvoid LCD_DispChar(uint16_t x, uint16_t y, uint8_t ascii, uint16_t color)/x,y位置,与对应ascii信息,颜色uint16_t page, column, temp, i;i = ascii - ;LCD_OpenWindow(x, y, STR_WIDTH, STR_HEIGHT);/LCD分辨率配置函数,配置LCD高度与宽度LCD_ILI9341_CMD(0X2C);for( page=0; page STR_HEIGHT; page+ )temp = asc2_1206ipage;for( column=0; column = 1;/* 一行写完 */* 全部写完 */LCD_DispStrvoid LCD_DispStr(uint16_t x, uint16_t y, uint8_t *pstr, uint16_t color)/x,y位置,ascii中对应的编号,颜色while( *pstr != 0 )if( x (COLUMN-STR_WIDTH) )x = 0;y += STR_HEIGHT;if( y (PAGE-STR_HEIGHT) )x = 0;y = 0;LCD_DispChar(x, y, *pstr, color);/字符显示函数x += STR_WIDTH;pstr+;LCD_DisTsl/*变量转换成字符串,显示输出函数*/void LCD_DisTsl(uint1
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年机械安全操作指南与试题
- 桥梁墩柱施工知识培训课件
- 2025年会计基础技能考核预测试题及答案公布
- 2026届贵州省毕节市赫章县高三化学第一学期期末联考试题含解析
- 2025年篮球能力测试题及答案
- 2025年环保企业项目经理招聘笔试预测试题集
- 2025篮球明星试题分析及答案
- 2025年校友会招聘考试题库分析与解题技巧
- 2025年注册验船师资格考试(A级船舶检验专业案例分析)考前模拟试题及答案一
- 2025年保健品培训考试题及答案
- 糖尿病眼底病变
- 《中医饮食护理》课件
- 银行运营管理新员工培训
- 月嫂培训高级班
- 中式烹调师高级技师考试模拟题与参考答案
- 园林绿化工(技师) 技能鉴定理论考试题及答案
- 《童年》课外阅读备课教案
- 神经病学-第十章-脑血管病的介入诊疗
- 初中生物人教版教材解读
- 无接触式戴无菌手套操作规程及评分细则
- 丧葬服务行业的行业伦理与规范
评论
0/150
提交评论