找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 20911|回復(fù): 24
收起左側(cè)

輕松應(yīng)用STM32F429之LTDC液晶顯示,ADC_DMA,心電,正弦波,三角波形顯示

  [復(fù)制鏈接]
ID:113472 發(fā)表于 2016-4-11 22:59 | 顯示全部樓層 |閱讀模式
本程序?qū)崿F(xiàn)了LTDC液晶對(duì)ADC采集到的數(shù)據(jù)進(jìn)行顯示,并通過(guò)LCD分層顯示心電波形,正弦波,方波,三角波等等。程序簡(jiǎn)單明了,幾個(gè)函數(shù)就可以輕松應(yīng)用STM32F429 Discovery的高級(jí)LTDC液晶分層顯示功能,圖文并茂如下:
ecc3fdd59bc2541da1bc0d98382ee000.png
d9c939e9d29db1354c1aaf5a32c3cfaf.png
268a118d7b362a3511ad1db30eeec8f5.png
47d778db902322e341df69697e930afb.png
f69eca923f7acafd85e1bae2eb92a08e.png

主程序預(yù)覽:
  1. //------------------------------------------------------------------------------
  2. //工程:LTDC_Display
  3. //作者:xzezhen
  4. //版本:V1.0.0
  5. //日期:2014-06-06
  6. //工具:Keil MDK 4.72a
  7. //描述:程序?qū)崿F(xiàn)了ADC_DMA模數(shù)轉(zhuǎn)換功能,并通過(guò)LCD顯示電壓值,畫(huà)出電壓波形。
  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.         //打開(kāi)ADC3,DMA2,GPIO時(shí)鐘
  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顯示電壓值主循環(huán)
  74. //------------------------------------------------------------------------------
  75. static void ADCValueDisplay_MainLoop(void)
  76. {
  77.   uint32_t uwVoltage =0, uwMVoltage=0;
  78.   uint8_t aTextBuffer[50];

  79.         //把ADC采樣值轉(zhuǎn)換成電壓值
  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. //電壓波形顯示主循環(huán)
  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);                //設(shè)置為背景層
  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設(shè)置為前景顯示層
  164.         LCD_SetTransparency(120);                                                                //前景層透明度
  165.         LCD_Clear( LCD_COLOR_BLACK );        
  166. }

  167. //------------------------------------------------------------------------------
  168. //主函數(shù)
  169. //------------------------------------------------------------------------------
  170. int main(void)
  171. {
  172.         
  173.         
  174.   LCD_Init();                                                                                        //LCD初始化
  175.   LCD_LayerInit();                                                                //LCD層次顯示初始化  
  176.   
  177.         LTDC_Cmd(ENABLE);                                                                //打開(kāi)LTDC
  178.   
  179.         LCD_GUIDisplay();
  180.         
  181.   ADC3_CH13_DMA_Config();                                        //配置ADC3
  182.   ADC_SoftwareStartConv(ADC3);                //開(kāi)始ADC轉(zhuǎn)換

  183.         while(1)
  184.         {   
  185.     ADCValueDisplay_MainLoop();                //顯示電壓值
  186.                 ADCWaveformDisp_MainLoop();         //波形顯示                        
  187.         }
  188. }
復(fù)制代碼

工程文件如下: LTDC_Display.7z (328.94 KB, 下載次數(shù): 354)

評(píng)分

參與人數(shù) 3黑幣 +40 收起 理由
he33504898 + 25 很棒
qjzyx + 3 贊一個(gè)!
YJGG + 12 很給力!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

ID:23606 發(fā)表于 2016-8-5 13:43 | 顯示全部樓層
感謝分享,共享資料!
回復(fù)

使用道具 舉報(bào)

ID:83761 發(fā)表于 2016-10-25 21:56 | 顯示全部樓層
挺好
回復(fù)

使用道具 舉報(bào)

ID:217970 發(fā)表于 2017-7-7 18:58 | 顯示全部樓層
uwVoltage = (uwADC3ConvertedVoltage)/1000;
  uwMVoltage = (uwADC3ConvertedVoltage%1000)/100;
這是為什么呢
回復(fù)

使用道具 舉報(bào)

ID:221578 發(fā)表于 2017-7-22 13:35 | 顯示全部樓層
剛好項(xiàng)目有用到,,謝謝。
回復(fù)

使用道具 舉報(bào)

ID:232933 發(fā)表于 2017-9-13 19:25 | 顯示全部樓層
不能下載
回復(fù)

使用道具 舉報(bào)

ID:284145 發(fā)表于 2018-2-15 10:37 | 顯示全部樓層
good, 手上有塊429的disc板子,學(xué)習(xí)學(xué)習(xí),thanks。
回復(fù)

使用道具 舉報(bào)

ID:266116 發(fā)表于 2018-2-15 14:42 | 顯示全部樓層
謝謝分享
回復(fù)

使用道具 舉報(bào)

ID:281751 發(fā)表于 2018-2-28 18:32 | 顯示全部樓層
感謝您的分享 !!!
回復(fù)

使用道具 舉報(bào)

ID:296103 發(fā)表于 2018-3-23 21:41 | 顯示全部樓層
剛好項(xiàng)目有用到,,謝謝。
回復(fù)

使用道具 舉報(bào)

ID:312423 發(fā)表于 2018-4-20 14:56 | 顯示全部樓層
謝謝分享
回復(fù)

使用道具 舉報(bào)

ID:346607 發(fā)表于 2018-6-10 23:12 | 顯示全部樓層
__IO uint16_t uhADC3ConvertedValue = 0;想問(wèn)。為什么等于零。(別懟,新手,求教
回復(fù)

使用道具 舉報(bào)

ID:283449 發(fā)表于 2018-7-29 20:55 | 顯示全部樓層
不錯(cuò)啊樓主!加油!
回復(fù)

使用道具 舉報(bào)

ID:433227 發(fā)表于 2019-3-26 21:29 | 顯示全部樓層
謝謝分享
回復(fù)

使用道具 舉報(bào)

ID:493913 發(fā)表于 2019-3-27 09:24 | 顯示全部樓層
好厲害,學(xué)習(xí)了
回復(fù)

使用道具 舉報(bào)

ID:578921 發(fā)表于 2019-7-6 16:58 | 顯示全部樓層
真的真的很給力。!
回復(fù)

使用道具 舉報(bào)

ID:630982 發(fā)表于 2019-10-27 17:38 | 顯示全部樓層
北岸最后一只貓 發(fā)表于 2017-7-7 18:58
**** 作者被禁止或刪除 內(nèi)容自動(dòng)屏蔽 ****

上面那行是整數(shù)部份 下面是小數(shù)
回復(fù)

使用道具 舉報(bào)

ID:369039 發(fā)表于 2020-3-3 08:21 | 顯示全部樓層
上面那行是整數(shù)部份 下面是小數(shù)
回復(fù)

使用道具 舉報(bào)

ID:701628 發(fā)表于 2020-3-3 12:06 | 顯示全部樓層
感謝分享啊,看看學(xué)學(xué)
回復(fù)

使用道具 舉報(bào)

ID:504404 發(fā)表于 2020-3-18 12:12 | 顯示全部樓層
大佬,感謝分享
回復(fù)

使用道具 舉報(bào)

ID:323191 發(fā)表于 2020-3-19 19:46 | 顯示全部樓層
謝謝分享
回復(fù)

使用道具 舉報(bào)

ID:147215 發(fā)表于 2020-6-20 15:52 | 顯示全部樓層
謝謝分享!,,,,
回復(fù)

使用道具 舉報(bào)

ID:822447 發(fā)表于 2020-11-27 19:37 | 顯示全部樓層
感謝樓主的好例程!
回復(fù)

使用道具 舉報(bào)

ID:140183 發(fā)表于 2020-12-6 16:33 | 顯示全部樓層
太好啦!正想學(xué)習(xí)這方面的。
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表