找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 19212|回复: 24
打印 上一主题 下一主题
收起左侧

轻松应用STM32F429之LTDC液晶显示,ADC_DMA,心电,正弦波,三角波形显示

  [复制链接]
跳转到指定楼层
楼主
本程序实现了LTDC液晶对ADC采集到的数据进行显示,并通过LCD分层显示心电波形,正弦波,方波,三角波等等。程序简单明了,几个函数就可以轻松应用STM32F429 Discovery的高级LTDC液晶分层显示功能,图文并茂如下:






主程序预览:
  1. //------------------------------------------------------------------------------
  2. //工程:LTDC_Display
  3. //作者:xzezhen
  4. //版本:V1.0.0
  5. //日期:2014-06-06
  6. //工具:Keil MDK 4.72a
  7. //描述:程序实现了ADC_DMA模数转换功能,并通过LCD显示电压值,画出电压波形。
  8. //------------------------------------------------------------------------------

  9. #include "Com.h"

  10. #define         MESSAGE1            "  ECG Waveform  "
  11. #define         MESSAGE1_1          "    Display      "
  12. #define         MESSAGE2            "ADC Value:"
  13. #define         MESSAGE5                   " ADC3=%d.%1d V "
  14. #define         LINENUM       0x15

  15. #define ADC3_DR_ADDRESS     ((uint32_t)0x4001224C)

  16. __IO uint16_t uhADC3ConvertedValue = 0;
  17. __IO uint32_t uwADC3ConvertedVoltage = 0;

  18. static uint16_t Xpos=6,Ypos1=249,Ypos2=249,Xpos1=6,Xpos2=6;
  19. static uint16_t DrawData;
  20. static uint16_t Counter=0;

  21. //------------------------------------------------------------------------------
  22. //ADC3通道13 DMA配置
  23. //------------------------------------------------------------------------------
  24. static void ADC3_CH13_DMA_Config(void)
  25. {
  26.   ADC_InitTypeDef       ADC_InitStructure;
  27.   ADC_CommonInitTypeDef ADC_CommonInitStructure;
  28.   DMA_InitTypeDef       DMA_InitStructure;
  29.   GPIO_InitTypeDef      GPIO_InitStructure;

  30.         //打开ADC3,DMA2,GPIO时钟
  31.   RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2 | RCC_AHB1Periph_GPIOC, ENABLE);
  32.   RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC3, ENABLE);

  33.   DMA_InitStructure.DMA_Channel = DMA_Channel_2;  
  34.   DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)ADC3_DR_ADDRESS;
  35.   DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)&uhADC3ConvertedValue;
  36.   DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;
  37.   DMA_InitStructure.DMA_BufferSize = 1;
  38.   DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
  39.   DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Disable;
  40.   DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
  41.   DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
  42.   DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
  43.   DMA_InitStructure.DMA_Priority = DMA_Priority_High;
  44.   DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;         
  45.   DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull;
  46.   DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;
  47.   DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;
  48.   DMA_Init(DMA2_Stream0, &DMA_InitStructure);
  49.   DMA_Cmd(DMA2_Stream0, ENABLE);

  50.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
  51.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;
  52.   GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ;
  53.   GPIO_Init(GPIOC, &GPIO_InitStructure);

  54.   ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent;
  55.   ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div2;
  56.   ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled;
  57.   ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_5Cycles;
  58.   ADC_CommonInit(&ADC_CommonInitStructure);

  59.   ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;
  60.   ADC_InitStructure.ADC_ScanConvMode = DISABLE;
  61.   ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
  62.   ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;
  63.   ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T1_CC1;        
  64.   ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
  65.   ADC_InitStructure.ADC_NbrOfConversion = 1;
  66.   ADC_Init(ADC3, &ADC_InitStructure);

  67.   ADC_RegularChannelConfig(ADC3, ADC_Channel_13, 1, ADC_SampleTime_3Cycles);

  68.   ADC_DMARequestAfterLastTransferCmd(ADC3, ENABLE);

  69.   ADC_DMACmd(ADC3, ENABLE);

  70.   ADC_Cmd(ADC3, ENABLE);
  71. }

  72. //------------------------------------------------------------------------------
  73. //LCD显示电压值主循环
  74. //------------------------------------------------------------------------------
  75. static void ADCValueDisplay_MainLoop(void)
  76. {
  77.   uint32_t uwVoltage =0, uwMVoltage=0;
  78.   uint8_t aTextBuffer[50];

  79.         //把ADC采样值转换成电压值
  80.   uwADC3ConvertedVoltage = uhADC3ConvertedValue *3000/0xFFF;
  81.         
  82.         LCD_SetLayer(LCD_BACKGROUND_LAYER);
  83.   
  84.   LCD_SetBackColor(((220>>3)<<11)|((220>>2)<<5)|(220>>3));
  85.   LCD_SetTextColor( LCD_COLOR_BLUE );
  86.         
  87.   uwVoltage = (uwADC3ConvertedVoltage)/1000;
  88.   uwMVoltage = (uwADC3ConvertedVoltage%1000)/100;

  89.   sprintf((char*)aTextBuffer, MESSAGE5, uwVoltage, uwMVoltage);
  90.   LCD_DisplayStringLine(LCD_LINE_12, (uint8_t*)aTextBuffer);
  91.         
  92.         LCD_SetLayer(LCD_FOREGROUND_LAYER);
  93. }

  94. //------------------------------------------------------------------------------
  95. //电压波形显示主循环
  96. //------------------------------------------------------------------------------
  97. static void ADCWaveformDisp_MainLoop(void)
  98. {
  99.         DrawData = uhADC3ConvertedValue*(178.0/0xFFF);   

  100.         if( ++Counter == 4 )
  101.         {
  102.                 Counter = 0;
  103.                 LCD_SetTextColor( LCD_COLOR_BLACK );
  104.                 LCD_DrawFullRect( Xpos+1, 50, 2, 218);
  105.                 LCD_SetTextColor( LCD_COLOR_GREEN );
  106.                 Xpos=Xpos+1;
  107.                 if(Xpos>232)
  108.                 {
  109.                         Xpos=6;
  110.                         LCD_SetTextColor( LCD_COLOR_BLACK );
  111.                         LCD_DrawLine( Xpos, 50, 218, LCD_DIR_VERTICAL);
  112.                         LCD_SetTextColor( LCD_COLOR_GREEN );
  113.                 }
  114.                 Xpos2=Xpos2+1;
  115.                 Ypos2=249-DrawData;
  116.                 if(Xpos2>232)
  117.                 {
  118.                         Xpos2=6;Xpos1=6;
  119.                 }        
  120.                 LCD_DrawUniLine( Xpos1, Ypos1, Xpos2, Ypos2);
  121.                 Xpos1=Xpos2;
  122.                 Ypos1=Ypos2;
  123.         }        
  124. }

  125. //------------------------------------------------------------------------------
  126. //界面初始化显示
  127. //------------------------------------------------------------------------------
  128. static void LCD_GUIDisplay(void)
  129. {
  130.         uint16_t i;
  131.         
  132.   LCD_SetLayer(LCD_BACKGROUND_LAYER);                //设置为背景层
  133.   LCD_SetTransparency(255);                                                  //背景层透明度
  134.   LCD_Clear( ((220>>3)<<11)|((220>>2)<<5)|(220>>3) );        //把LCD清除为指定颜色

  135.         LCD_SetBackColor(LCD_COLOR_BLUE);
  136.   LCD_SetTextColor(LCD_COLOR_BLACK);
  137.                
  138.         LCD_DrawFullRect(5, 49, 229, 219);

  139.         LCD_SetTextColor( ((180>>3)<<11)|((180>>2)<<5)|(180>>3) );
  140.         LCD_DrawRect( 5, 49, 219, 229);
  141.         
  142.         LCD_SetTextColor( ((180>>3)<<11)|((180>>2)<<5)|(180>>3) );
  143.         LCD_DrawUniLine( 4, 48, 234, 48);
  144.         LCD_DrawUniLine( 4, 48, 4, 268);
  145.         
  146.         LCD_SetTextColor( ((128>>3)<<11)|((128>>2)<<5)|(128>>3) );
  147.         LCD_DrawUniLine( 5, 49, 233, 49);
  148.         LCD_DrawUniLine( 5, 49, 5, 267);

  149.         LCD_SetTextColor( 0XFFFF );
  150.         LCD_DrawUniLine( 235, 49, 235, 269);
  151.         LCD_DrawUniLine( 5, 269, 235, 269);

  152.         LCD_SetTextColor( ((30>>3)<<11)|((30>>2)<<5)|(30>>3) );
  153.         for( i=69; i<269; i+=20 )
  154.                 LCD_DrawUniLine( 6, i, 233, i);
  155.         for( i=44; i<233; i+=38 )
  156.                 LCD_DrawUniLine( i, 50, i, 267);
  157.         
  158.   LCD_SetBackColor(((220>>3)<<11)|((220>>2)<<5)|(220>>3));
  159.   LCD_SetTextColor(LCD_COLOR_BLUE);
  160.         LCD_SetFont(&Font16x24);
  161.         LCD_DisplayStringLine(LCD_LINE_0, (uint8_t*)MESSAGE1);
  162.         LCD_DisplayStringLine(LCD_LINE_1, (uint8_t*)MESSAGE1_1);

  163.         LCD_SetLayer(LCD_FOREGROUND_LAYER);                        //把LCD设置为前景显示层
  164.         LCD_SetTransparency(120);                                                                //前景层透明度
  165.         LCD_Clear( LCD_COLOR_BLACK );        
  166. }

  167. //------------------------------------------------------------------------------
  168. //主函数
  169. //------------------------------------------------------------------------------
  170. int main(void)
  171. {
  172.         
  173.         
  174.   LCD_Init();                                                                                        //LCD初始化
  175.   LCD_LayerInit();                                                                //LCD层次显示初始化  
  176.   
  177.         LTDC_Cmd(ENABLE);                                                                //打开LTDC
  178.   
  179.         LCD_GUIDisplay();
  180.         
  181.   ADC3_CH13_DMA_Config();                                        //配置ADC3
  182.   ADC_SoftwareStartConv(ADC3);                //开始ADC转换

  183.         while(1)
  184.         {   
  185.     ADCValueDisplay_MainLoop();                //显示电压值
  186.                 ADCWaveformDisp_MainLoop();         //波形显示                        
  187.         }
  188. }
复制代码

工程文件如下: LTDC_Display.7z (328.94 KB, 下载次数: 352)

评分

参与人数 3黑币 +40 收起 理由
he33504898 + 25 很棒
qjzyx + 3 赞一个!
YJGG + 12 很给力!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏4 分享淘帖 顶4 踩
回复

使用道具 举报

沙发
ID:23606 发表于 2016-8-5 13:43 | 只看该作者
感谢分享,共享资料!
回复

使用道具 举报

板凳
ID:83761 发表于 2016-10-25 21:56 | 只看该作者
挺好
回复

使用道具 举报

地板
ID:217970 发表于 2017-7-7 18:58 | 只看该作者
uwVoltage = (uwADC3ConvertedVoltage)/1000;
  uwMVoltage = (uwADC3ConvertedVoltage%1000)/100;
这是为什么呢
回复

使用道具 举报

5#
ID:221578 发表于 2017-7-22 13:35 | 只看该作者
刚好项目有用到,,谢谢。
回复

使用道具 举报

6#
ID:232933 发表于 2017-9-13 19:25 | 只看该作者
不能下载
回复

使用道具 举报

7#
ID:284145 发表于 2018-2-15 10:37 | 只看该作者
good, 手上有块429的disc板子,学习学习,thanks。
回复

使用道具 举报

8#
ID:266116 发表于 2018-2-15 14:42 | 只看该作者
谢谢分享
回复

使用道具 举报

9#
ID:281751 发表于 2018-2-28 18:32 | 只看该作者
感謝您的分享 !!!
回复

使用道具 举报

10#
ID:296103 发表于 2018-3-23 21:41 | 只看该作者
刚好项目有用到,,谢谢。
回复

使用道具 举报

11#
ID:312423 发表于 2018-4-20 14:56 | 只看该作者
谢谢分享
回复

使用道具 举报

12#
ID:346607 发表于 2018-6-10 23:12 | 只看该作者
__IO uint16_t uhADC3ConvertedValue = 0;想问。为什么等于零。(别怼,新手,求教
回复

使用道具 举报

13#
ID:283449 发表于 2018-7-29 20:55 | 只看该作者
不错啊楼主!加油!
回复

使用道具 举报

14#
ID:433227 发表于 2019-3-26 21:29 | 只看该作者
谢谢分享
回复

使用道具 举报

15#
ID:493913 发表于 2019-3-27 09:24 | 只看该作者
好厉害,学习了
回复

使用道具 举报

16#
ID:578921 发表于 2019-7-6 16:58 | 只看该作者
真的真的很给力!!!
回复

使用道具 举报

17#
ID:630982 发表于 2019-10-27 17:38 | 只看该作者
北岸最后一只猫 发表于 2017-7-7 18:58
**** 作者被禁止或删除 内容自动屏蔽 ****

上面那行是整数部份 下面是小数
回复

使用道具 举报

18#
ID:369039 发表于 2020-3-3 08:21 | 只看该作者
上面那行是整数部份 下面是小数
回复

使用道具 举报

19#
ID:701628 发表于 2020-3-3 12:06 | 只看该作者
感谢分享啊,看看学学
回复

使用道具 举报

20#
ID:504404 发表于 2020-3-18 12:12 | 只看该作者
大佬,感谢分享
回复

使用道具 举报

21#
ID:323191 发表于 2020-3-19 19:46 | 只看该作者
谢谢分享
回复

使用道具 举报

22#
ID:147215 发表于 2020-6-20 15:52 | 只看该作者
谢谢分享!,,,,
回复

使用道具 举报

23#
ID:822447 发表于 2020-11-27 19:37 | 只看该作者
感谢楼主的好例程!
回复

使用道具 举报

24#
ID:140183 发表于 2020-12-6 16:33 | 只看该作者
太好啦!正想学习这方面的。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表