基於STM32音響控制系統原始碼(一)(音樂頻譜顯示)
阿新 • • 發佈:2019-02-04
效果圖:
TFT.c
#include "TFT.h" U16 TFT_ChipID; static void __FSMCConfig(void) { FSMC_NORSRAMInitTypeDef FSMC_NORSRAMInitStructure; FSMC_NORSRAMTimingInitTypeDef p; /*-- FSMC Configuration ------------------------------------------------------*/ RCC_AHBPeriphClockCmd(RCC_AHBPeriph_FSMC, ENABLE); /* FSMC_Bank1_NORSRAM4 timing configuration */ p.FSMC_AddressSetupTime = 1; p.FSMC_AddressHoldTime = 0; p.FSMC_DataSetupTime = 5; p.FSMC_BusTurnAroundDuration = 0; p.FSMC_CLKDivision = 0; p.FSMC_DataLatency = 0; p.FSMC_AccessMode = FSMC_AccessMode_B; /* FSMC_Bank1_NORSRAM4 configured as follows: - Data/Address MUX = Disable - Memory Type = SRAM - Data Width = 16bit - Write Operation = Enable - Extended Mode = Disable - Asynchronous Wait = Disable */ FSMC_NORSRAMInitStructure.FSMC_Bank = FSMC_Bank1_NORSRAM4; FSMC_NORSRAMInitStructure.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable; FSMC_NORSRAMInitStructure.FSMC_MemoryType = FSMC_MemoryType_NOR; FSMC_NORSRAMInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_16b; FSMC_NORSRAMInitStructure.FSMC_BurstAccessMode = FSMC_BurstAccessMode_Disable; FSMC_NORSRAMInitStructure.FSMC_WaitSignalPolarity = FSMC_WaitSignalPolarity_Low; FSMC_NORSRAMInitStructure.FSMC_WrapMode = FSMC_WrapMode_Disable; FSMC_NORSRAMInitStructure.FSMC_WaitSignalActive = FSMC_WaitSignalActive_BeforeWaitState; FSMC_NORSRAMInitStructure.FSMC_WriteOperation = FSMC_WriteOperation_Enable; FSMC_NORSRAMInitStructure.FSMC_WaitSignal = FSMC_WaitSignal_Disable; FSMC_NORSRAMInitStructure.FSMC_ExtendedMode = FSMC_ExtendedMode_Disable; FSMC_NORSRAMInitStructure.FSMC_WriteBurst = FSMC_WriteBurst_Disable; FSMC_NORSRAMInitStructure.FSMC_ReadWriteTimingStruct = &p; FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct = &p; FSMC_NORSRAMInit(&FSMC_NORSRAMInitStructure); /* Enable FSMC_Bank1_NORSRAM4 */ FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM4, ENABLE); } static void __GpioConfig(void) { GPIO_InitTypeDef GPIO_InitStructure; #ifndef FSMC_TFT RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE|RCC_APB2Periph_GPIOD, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(TFT_DATA_PIN, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = TFT_CS|TFT_RS|TFT_WR|TFT_RD|TFT_RESET; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(TFT_COTROL_PIN, &GPIO_InitStructure); GPIO_ResetBits(TFT_COTROL_PIN, TFT_RESET); GPIO_SetBits(TFT_COTROL_PIN, TFT_CS); GPIO_SetBits(TFT_COTROL_PIN, TFT_RS); GPIO_SetBits(TFT_COTROL_PIN, TFT_WR); GPIO_SetBits(TFT_COTROL_PIN, TFT_RD); GPIO_SetBits(TFT_COTROL_PIN, TFT_RESET); #else /*FSMC*/ /* Enable GPIOD, GPIOE, GPIOF, GPIOG and AFIO clocks */ RCC_APB2PeriphClockCmd (RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOE | RCC_APB2Periph_GPIOF | RCC_APB2Periph_GPIOG | RCC_APB2Periph_GPIOB |RCC_APB2Periph_AFIO, ENABLE); /* Set PG.15(REST), Out put*/ GPIO_InitStructure.GPIO_Pin = TFT_RESET; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(TFT_COTROL_PIN, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = TFT_LED; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure); /* Set PD.00(D2), PD.01(D3), PD.04(NOE), PD.05(NWE), PD.08(D13), PD.09(D14), PD.10(D15), PD.14(D0), PD.15(D1) as alternate function push pull */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_14 | GPIO_Pin_15; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_Init(GPIOD, &GPIO_InitStructure); /* Set PE.07(D4), PE.08(D5), PE.09(D6), PE.10(D7), PE.11(D8), PE.12(D9), PE.13(D10), PE.14(D11), PE.15(D12) as alternate function push pull */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15; GPIO_Init(GPIOE, &GPIO_InitStructure); /* Set PF.00(A0 (RS)) as alternate function push pull */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; GPIO_Init(GPIOF, &GPIO_InitStructure); /* Set PG.12(NE4 (LCD/CS)) as alternate function push pull - CE3(LCD /CS) */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12; GPIO_Init(GPIOG, &GPIO_InitStructure); GPIO_SetBits(TFT_COTROL_PIN, TFT_RESET); #endif /*FSMC_TFT*/ } #ifndef FSMC_TFT static void __DB_AS_InPut(void) { GPIO_InitTypeDef GPIO_InitStructure; // DB15--0 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(TFT_DATA_PIN, &GPIO_InitStructure); } static void __DB_AS_OutPut(void) { GPIO_InitTypeDef GPIO_InitStructure; // DB15--0 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(TFT_DATA_PIN, &GPIO_InitStructure); } #endif /*FSMC_TFT*/ static void __WriteReg(U32 tftReg,U32 tftRegValue) { #ifndef FSMC_TFT /* Write 16-bit Index, then Write Reg */ GPIO_ResetBits (TFT_COTROL_PIN, TFT_CS);//ClrCs GPIO_ResetBits (TFT_COTROL_PIN, TFT_RS);//ClrRs GPIO_ResetBits (TFT_COTROL_PIN, TFT_WR);//ClrWr GPIO_Write (TFT_DATA_PIN, tftReg);//LCD_Write(TFT_Reg); GPIO_SetBits (TFT_COTROL_PIN, TFT_WR);//SetWr /* Write 16-bit Reg */ GPIO_SetBits (TFT_COTROL_PIN, TFT_RS);//SetRs GPIO_ResetBits (TFT_COTROL_PIN, TFT_WR);//ClrWr GPIO_Write (TFT_DATA_PIN, tftRegValue);//LCD_Write(TFT_RegValue); GPIO_SetBits (TFT_COTROL_PIN, TFT_WR);//SetWr GPIO_SetBits (TFT_COTROL_PIN, TFT_CS);//SetCs #else /*FSMC*/ /* Write 16-bit Index, then Write Reg */ TFT->TFT_REG = tftReg; /* Write 16-bit Reg */ TFT->TFT_RAM = tftRegValue; #endif /*FSMC_TFT*/ } static U32 __ReadReg(U32 tftReg) { #ifndef FSMC_TFT U32 data; /* Write 16-bit Index (then Read Reg) */ GPIO_ResetBits (TFT_COTROL_PIN, TFT_CS);//ClrCs GPIO_ResetBits (TFT_COTROL_PIN, TFT_RS);//ClrRs GPIO_ResetBits (TFT_COTROL_PIN, TFT_WR);//ClrWr GPIO_Write (TFT_DATA_PIN, TFT_Reg);//LCD_Write(LCD_Reg); GPIO_SetBits (TFT_COTROL_PIN, TFT_WR);//SetWr /* Read 16-bit Reg */ GPIO_SetBits (TFT_COTROL_PIN, TFT_RS);//SetRs __DB_AS_InPut(); GPIO_ResetBits (TFT_COTROL_PIN, TFT_RD);//ClrRd GPIO_SetBits (TFT_COTROL_PIN, TFT_RD);//SetRd data = GPIO_ReadInputData(TFT_DATA_PIN); GPIO_SetBits (TFT_COTROL_PIN, TFT_CS);//SetCs __DB_AS_OutPut(); return data; #else /*FSMC*/ /* Write 16-bit Index (then Read Reg) */ TFT->TFT_REG = tftReg; /* Read 16-bit Reg */ //data = TFT->TFT_RAM; return (TFT->TFT_RAM); #endif /*FSMC_TFT*/ } #if 0 static void __WriteGRAM(U16 *pRGB_Code,U32 pixelNum) { #ifndef FSMC_TFT //u32 i=0; GPIO_ResetBits(TFT_COTROL_PIN, TFT_CS);//ClrCs GPIO_ResetBits(TFT_COTROL_PIN, TFT_RS);//ClrRs GPIO_ResetBits(TFT_COTROL_PIN, TFT_WR);//ClrWr GPIO_Write(TFT_DATA_PIN, 0x0022); GPIO_SetBits(TFT_COTROL_PIN, TFT_WR);//SetWr GPIO_SetBits(TFT_COTROL_PIN, TFT_RS);//SetRs while(pixelNum>0) { GPIO_ResetBits(TFT_COTROL_PIN, TFT_WR);//ClrWr GPIO_Write(TFT_DATA_PIN, *pRGB_Code); GPIO_SetBits(TFT_COTROL_PIN, TFT_WR);//SetWr pixelNum--; pRGB_Code++; } GPIO_SetBits(TFT_COTROL_PIN, TFT_CS);//SetCs #else /*FSMC*/ /* Write 16-bit Index, then Write Reg */ TFT->TFT_REG = 0x0022; /* Write 16-bit RGB */ while(pixelNum>0) { TFT->TFT_RAM = *pRGB_Code; pixelNum--; pRGB_Code++; } #endif /*FSMC_TFT*/ } #endif void TFT_ClearAll(U32 color) { U32 i=0; __WriteReg(0x50, 0x0000); // Horizontal GRAM Start Address __WriteReg(0x51, 0x00EF); // Horizontal GRAM End Address __WriteReg(0x52, 0x0000); // Vertical GRAM Start Address __WriteReg(0x53, 0x013F); // Vertical GRAM Start Address __WriteReg(0x20, 0); // GRAM horizontal Address __WriteReg(0x21, 0); /* Write 16-bit Index, then Write Reg */ TFT->TFT_REG = 0x0022; while(i<TFT_H_PIXEL*TFT_V_PIXEL) { /* Write 16-bit RGB */ TFT->TFT_RAM = color; i++; } } void TFT_SetBackLED(U32 data) { TIM_OCInitTypeDef TIM_OCInitStructure; TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM2; TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable; TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_High; TIM_OCInitStructure.TIM_Pulse=data; TIM_OC3Init(TIM3, &TIM_OCInitStructure); } U8 TFT_Init(void) { U8 statues=0; U32 i; __GpioConfig(); __FSMCConfig(); TFT_ChipID=__ReadReg(0); __WriteReg(0xE5, 0x8000); // Set the internal vcore voltage __WriteReg(0x00,0x0001); for(i=50000;i>0;i--); __WriteReg(0x01,0x0100); //Driver Output Contral. 0x0100 __WriteReg(0x02,0x0700); //LCD Driver Waveform Contral. __WriteReg(0x03,0x0030); //Entry Mode Set. 0x1018 0x1030 __WriteReg(0x04,0x0000); //Scalling Contral. __WriteReg(0x08,0x0202); //Display Contral 2.(0x0207) __WriteReg(0x09,0x0000); //Display Contral 3.(0x0000) __WriteReg(0x0a,0x0000); //Frame Cycle Contal.(0x0000) __WriteReg(0x0c,0x0000); //Extern Display Interface Contral 1.(0x0000) __WriteReg(0x0d,0x0000); //Frame Maker Position. __WriteReg(0x0f,0x0000); //Extern Display Interface Contral 2. __WriteReg(0x2b,0x0020); //frame rate and color control(0x0000) __WriteReg(0x10,0x0000); //Power Control 1.(0x16b0) __WriteReg(0x11,0x0004); //Power Control 2.(0x0001) __WriteReg(0x12,0x0000); //Power Control 3.(0x0138) __WriteReg(0x13,0x0000); //Power Control 4. for(i=60000;i>0;i--); __WriteReg(0x10, 0x17B0); // SAP, BT[3:0], AP, DSTB, SLP, STB __WriteReg(0x11, 0x0001); // DC1[2:0], DC0[2:0], VC[2:0] for(i=60000;i>0;i--); // Delay 50ms __WriteReg(0x12, 0x013e); // VREG1OUT voltage for(i=60000;i>0;i--); // Delay 50ms __WriteReg(0x13, 0x1c00); // VDV[4:0] for VCOM amplitude __WriteReg(0x29, 0x001e); // VCM[4:0] for VCOMH for(i=60000;i>0;i--); __WriteReg(0x20, 0x0000); // GRAM horizontal Address __WriteReg(0x21, 0x0000); // GRAM Vertical Address // ----------- Adjust the Gamma Curve ----------// __WriteReg(0x30, 0x0002); __WriteReg(0x31, 0x0606); __WriteReg(0x32, 0x0501); __WriteReg(0x35, 0x0206); __WriteReg(0x36, 0x0504); __WriteReg(0x37, 0x0707); __WriteReg(0x38, 0x0306); __WriteReg(0x39, 0x0007); __WriteReg(0x3C, 0x0700); __WriteReg(0x3D, 0x0700); //------------------ Set GRAM area ---------------// __WriteReg(0x50, 0x0000); // Horizontal GRAM Start Address __WriteReg(0x51, 0x00EF); // Horizontal GRAM End Address __WriteReg(0x52, 0x0000); // Vertical GRAM Start Address __WriteReg(0x53, 0x013F); // Vertical GRAM End Address __WriteReg(0x60, 0x2700); // Gate Scan Line __WriteReg(0x61, 0x0001); // NDL,VLE, REV __WriteReg(0x6A, 0x0000); // set scrolling line //-------------- Partial Display Control ---------// __WriteReg(0x80, 0x0000); __WriteReg(0x81, 0x0000); __WriteReg(0x82, 0x0000); __WriteReg(0x83, 0x0000); __WriteReg(0x84, 0x0000); __WriteReg(0x85, 0x0000); //-------------- Panel Control -------------------// __WriteReg(0x90, 0x0010); __WriteReg(0x92, 0x0000); __WriteReg(0x93, 0x0003); __WriteReg(0x95, 0x0110); __WriteReg(0x97, 0x0000); __WriteReg(0x98, 0x0000); __WriteReg(0x07, 0x0173); // 262K color and display ON TFT_ClearAll(BACKGROUND_COLOR);//黑屏 return statues; } void TFT_SetPixelIndex(S32 x, S32 y, U32 pixelIndex) { if((x<0)||(y<0)||(x>=TFT_H_PIXEL)||(y>=TFT_V_PIXEL)) return; __WriteReg(0x20, x); // GRAM horizontal Address __WriteReg(0x21, y); // GRAM Vertical Address /* Write 16-bit Index, then Write Reg */ TFT->TFT_REG = 0x0022; /* Write 16-bit RGB */ TFT->TFT_RAM = pixelIndex; } U16 TFT_GetPixelIndex(S32 x, S32 y) { U32 tempData=0; if((x<0)||(y<0)||(x>=TFT_H_PIXEL)||(y>=TFT_V_PIXEL)) return 0; __WriteReg(0x20, x); // GRAM horizontal Address __WriteReg(0x21, y); // GRAM Vertical Address /* Write 16-bit Index, then Write Reg */ TFT->TFT_REG = 0x0022; /* Write 16-bit RGB */ tempData=TFT->TFT_RAM; tempData=TFT->TFT_RAM; return (tempData); } void TFT_XorPoint(S32 x,S32 y) { U32 temp=0; if((x<0)||(y<0)||(x>=TFT_H_PIXEL)||(y>=TFT_V_PIXEL)) return; __WriteReg(0x20, x); // GRAM horizontal Address __WriteReg(0x21, y); // GRAM Vertical Address /* Write 16-bit Index, then Write Reg */ TFT->TFT_REG = 0x0022; /* Write 16-bit RGB */ temp = TFT->TFT_RAM; temp = TFT->TFT_RAM; TFT->TFT_RAM = 0xFFFF-temp; } void TFT_DrawHLine(S32 x0, S32 y, S32 x1, U32 color) { U32 pixelNum =0; if((x0>=TFT_H_PIXEL)||(y>=TFT_V_PIXEL)||(y<0)) return ; if(x0<0) x0=0; if(x1>=TFT_H_PIXEL) x1=TFT_H_PIXEL-1; pixelNum = x1-x0+1; __WriteReg(0x50, x0); // Horizontal GRAM Start Address __WriteReg(0x51, x1); // Horizontal GRAM End Address __WriteReg(0x52, y); // Vertical GRAM Start Address __WriteReg(0x53, y); // Vertical GRAM End Address __WriteReg(0x20, x0); // GRAM horizontal Address __WriteReg(0x21, y); // GRAM Vertical Address /* Write 16-bit Index, then Write Reg */ TFT->TFT_REG = 0x0022; /* Write 16-bit RGB */ while(pixelNum>0) { TFT->TFT_RAM = color; pixelNum--; } __WriteReg(0x50, 0x0000); // Horizontal GRAM Start Address __WriteReg(0x51, 0x00EF); // Horizontal GRAM End Address __WriteReg(0x52, 0x0000); // Vertical GRAM Start Address __WriteReg(0x53, 0x013F); // Vertical GRAM End Address } void TFT_DrawVLine(S32 x, S32 y0, S32 y1, U32 color) { U32 pixelNum =0; if((x>=TFT_H_PIXEL)||(y0>=TFT_V_PIXEL)||(x<0)) return ; if(y1>=TFT_V_PIXEL) y1=TFT_V_PIXEL-1; pixelNum = y1-y0+1; __WriteReg(0x50, x); // Horizontal GRAM Start Address __WriteReg(0x51, x); // Horizontal GRAM End Address __WriteReg(0x52, y0); // Vertical GRAM Start Address __WriteReg(0x53, y1); // Vertical GRAM End Address __WriteReg(0x20, x); // GRAM horizontal Address __WriteReg(0x21, y0); // GRAM Vertical Address /* Write 16-bit Index, then Write Reg */ TFT->TFT_REG = 0x0022; /* Write 16-bit RGB */ while(pixelNum>0) { TFT->TFT_RAM = color; pixelNum--; } __WriteReg(0x50, 0x0000); // Horizontal GRAM Start Address __WriteReg(0x51, 0x00EF); // Horizontal GRAM End Address __WriteReg(0x52, 0x0000); // Vertical GRAM Start Address __WriteReg(0x53, 0x013F); // Vertical GRAM End Address } void TFT_FillRect(S32 x0, S32 y0, S32 x1, S32 y1,U32 color) { U32 pixelNum =0; if((x0>=TFT_H_PIXEL)||(y0>=TFT_V_PIXEL)) return ; if(x0<0) x0=0; if(y0<0) y0=0; if(x1>=TFT_H_PIXEL) x1=TFT_H_PIXEL-1; if(y1>=TFT_V_PIXEL) y1=TFT_V_PIXEL-1; pixelNum = (x1-x0+1)*(y1-y0+1); __WriteReg(0x50, x0); // Horizontal GRAM Start Address __WriteReg(0x51, x1); // Horizontal GRAM End Address __WriteReg(0x52, y0); // Vertical GRAM Start Address __WriteReg(0x53, y1); // Vertical GRAM End Address __WriteReg(0x20, x0); // GRAM horizontal Address __WriteReg(0x21, y0); // GRAM Vertical Address /* Write 16-bit Index, then Write Reg */ TFT->TFT_REG = 0x0022; /* Write 16-bit RGB */ while(pixelNum>0) { TFT->TFT_RAM = color; pixelNum--; } __WriteReg(0x50, 0x0000); // Horizontal GRAM Start Address __WriteReg(0x51, 0x00EF); // Horizontal GRAM End Address __WriteReg(0x52, 0x0000); // Vertical GRAM Start Address __WriteReg(0x53, 0x013F); // Vertical GRAM End Address } void TFT_InverseRect(S32 x0, S32 y0, S32 x1, S32 y1) { U32 pixelNum =0; U16 tempData=0; if((x0>=TFT_H_PIXEL)||(y0>=TFT_V_PIXEL)) return ; if(x0<0) x0=0; if(y0<0) y0=0; if(x1>=TFT_H_PIXEL) x1=TFT_H_PIXEL-1; if(y1>=TFT_V_PIXEL) y1=TFT_V_PIXEL-1; pixelNum = (x1-x0+1)*(y1-y0+1); __WriteReg(0x50, x0); // Horizontal GRAM Start Address __WriteReg(0x51, x1); // Horizontal GRAM End Address __WriteReg(0x52, y0); // Vertical GRAM Start Address __WriteReg(0x53, y1); // Vertical GRAM End Address __WriteReg(0x20, x0); // GRAM horizontal Address __WriteReg(0x21, y0); // GRAM Vertical Address /* Write 16-bit Index, then Write Reg */ TFT->TFT_REG = 0x0022; /* Write 16-bit RGB */ while(pixelNum>0) { tempData=TFT->TFT_RAM; tempData=TFT->TFT_RAM; tempData=0xffff-tempData; TFT->TFT_RAM = tempData; pixelNum--; } __WriteReg(0x50, 0x0000); // Horizontal GRAM Start Address __WriteReg(0x51, 0x00EF); // Horizontal GRAM End Address __WriteReg(0x52, 0x0000); // Vertical GRAM Start Address __WriteReg(0x53, 0x013F); // Vertical GRAM End Address } void TFT_PutChar(FontStyle_Typedef *pFontStyle, S32 x,S32 y,S8 data) { U8 i,j,tempData; OU8 *p; data -= 0x20; p = &pFontStyle->pFontSize->pFontBuffer[data * pFontStyle->pFontSize->FontVNum * pFontStyle->pFontSize->FontHNum]; for (i = 0; i < pFontStyle->pFontSize->FontHigh; i++) { tempData = p[i]; for (j=0;j<pFontStyle->pFontSize->FontWide;j++) { if ((tempData&0x01)==0x01) TFT_SetPixelIndex(x+j,y+i,pFontStyle->FontColor); else { if(pFontStyle->FontBackgroundColor<=0xffff) TFT_SetPixelIndex(x+j,y+i,pFontStyle->FontBackgroundColor); } tempData>>=1; } } } void TFT_PutString(FontStyle_Typedef *pFontStyle, S32 x, S32 y, S8 *pData) { S32 xStart=x; if(x<0) xStart=0; while(*pData) { switch(*pData) { case '\n': { y+=pFontStyle->pFontSize->FontHigh; }break; case '\t': { x+=((4-((x - xStart) / pFontStyle->pFontSize->FontWide % 4)) * pFontStyle->pFontSize->FontWide); if(x>(TFT_H_PIXEL-pFontStyle->pFontSize->FontWide)) { x=xStart; y+=pFontStyle->pFontSize->FontHigh; } }break; case '\r': { x=xStart; }break; default: { if((*pData>=0x20)&&(*pData<=0x7e)) { TFT_PutChar(pFontStyle,x,y,*pData); x+=pFontStyle->pFontSize->FontWide; if(x>(TFT_H_PIXEL-pFontStyle->pFontSize->FontWide)) { x=xStart; y+=pFontStyle->pFontSize->FontHigh; } } /* else if((*pChar>=0xa1)&&(*pChar<=0xf7)) { LCD_PutDZK16(x,y,pBuffer,&ZDK_RAM_Data[GetFontAddr(pChar)],FontColor,BackgroundColor); x+=16; if(x>(LCD_LevelPixels-16)) { x=0; y+=16; } pChar++; } */ else { TFT_PutChar(pFontStyle,x,y,''); x+=pFontStyle->pFontSize->FontWide; if(x>(TFT_H_PIXEL-pFontStyle->pFontSize->FontWide)) { x=xStart; y+=pFontStyle->pFontSize->FontHigh; } } }break; } pData++; } }
TFT.h
#ifndef TFT_H_ #define TFT_H_ #include "stm32f10x.h" #include "CodeStyle.h" #include "Font.h" #define TFT_CHIP_ID 0x9320 #define TFT_H_PIXEL 240 #define TFT_V_PIXEL 320 #define FSMC_TFT #define TFT_LED GPIO_Pin_0 #ifndef FSMC_TFT //{ #define TFT_CSGPIO_Pin_1//SER #define TFT_RSGPIO_Pin_2// #define TFT_WRGPIO_Pin_3// #define TFT_RDGPIO_Pin_4// #define TFT_RESETGPIO_Pin_5// #define TFT_COTROL_PINGPIOD #define TFT_DATA_PINGPIOE //} #else //{ /*FSMC define*/ typedef struct { __IO uint16_t TFT_REG; __IO uint16_t TFT_RAM; } TFT_Typedef; /* LCD is connected to the FSMC_Bank1_NOR/SRAM4 and NE4 is used as ship select signal */ #define TFT_BASE ((uint32_t)(0x60000000 | 0x0C000000)) #define TFT ((TFT_Typedef *) TFT_BASE) #define TFT_RESETGPIO_Pin_15// #define TFT_COTROL_PINGPIOG //} #endif /*FSMC_TFT*/ #define TFT_BLUE 0x001F//藍色 #define TFT_GREEN 0x07E0//綠色 #define TFT_RED 0xF800//紅色 #define TFT_CYAN 0x07FF//藍綠色 #define TFT_MAGENTA 0xF8EF//品紅色 #define TFT_YELLOW 0xFFE0//黃色 /* #define TFT_LIGHTBLUE 0xFF8080//淡藍色 #define TFT_LIGHTGREEN 0x80FF80//淡綠色 #define TFT_LIGHTRED 0x8080FF//淡紅色 #define TFT_LIGHTCYAN 0xFFFF80//淡藍綠色 #define TFT_LIGHTMAGENTA 0xFF80FF//淡品紅色 #define TFT_LIGHTYELLOW 0x80FFFF//淡黃色 #define TFT_DARKBLUE 0x800000//深藍色 #define TFT_DARKGREEN 0x008000//深綠色 #define TFT_DARKRED 0x000080//深紅色 #define TFT_DARKCYAN 0x808000//深藍綠色 #define TFT_DARKMAGENTA 0x800080//深品紅色 #define TFT_DARKYELLOW 0x008080//深黃色 */ #define TFT_WHITE 0xFFFF//白色 /* #define TFT_LIGHTGRAY 0xD3D3D3//淡灰色 #define TFT_GRAY 0x808080//灰色 #define TFT_DARKGRAY 0x404040//深灰色 */ #define TFT_BLACK 0x0000//黑色 #define BACKGROUND_COLOR TFT_BLACK #define NULL_BACKGROUND_COLOR 0x80000000 extern U16 TFT_ChipID; extern void TFT_ClearAll(U32 color); extern void TFT_SetBackLED(U32 data); extern U8 TFT_Init(void); extern void TFT_SetPixelIndex(S32 x, S32 y, U32 pixelIndex); extern void TFT_XorPoint(S32 x,S32 y); extern U16 TFT_GetPixelIndex(S32 x, S32 y); extern void TFT_DrawHLine(S32 x0, S32 y, S32 x1, U32 color); extern void TFT_DrawVLine(S32 x, S32 y0, S32 y1, U32 color); extern void TFT_FillRect(S32 x0, S32 y0, S32 x1, S32 y1,U32 color); extern void TFT_InverseRect(S32 x0, S32 y0, S32 x1, S32 y1); extern void TFT_PutChar(FontStyle_Typedef *pFontStyle, S32 x,S32 y,S8 data); extern void TFT_PutString(FontStyle_Typedef *pFontStyle, S32 x, S32 y, S8 *pData); #endif /* TFT_H_ */
Task.c
#include "Task.h" #include <math.h> #define FFT_VALUE_START_NUM 3 #define MAG_VALUE_MAX 700 #define MAG_NUM 80 S32 OutFFT[NPT],InFFT[NPT],MagFFT[MAG_NUM],DisplayFFT[2][MAG_NUM]; OS_STK Task_MusicSpectrumStk[TASK_MUSIC_SPECTRUM_STK_SIZE]; OS_STK Task_StatusBarStk[TASK_STATUS_BAR_STK_SIZE]; OS_EVENT *UseTFTSem; static void __DrawVBar(U32 x,U32 y,U32 len,U32 data0,U32 data1) { U32 y1; if(data0>len-2) data0=len-2; if(data1>len) data1=len; y1=y+len; TFT_FillRect(x, y, x+1, y1-data0,0x0); TFT_FillRect(x, y1-data0, x+1, y1,0xe7e0); TFT_FillRect(x, y1-data1, x+1, y1-data1+1,0xffff); } void Task_MusicSpectrum(void *p_arg) { INT8U err; U32 i; float x,y; (void) p_arg; OS_CPU_SysTickInit(); while(1) { //輸入需要FFT變換的資料 for(i=0;i<NPT;i++) { InFFT[i]=ADC_ConvertedValue[i]&0xffffffc; InFFT[i]<<=20; } //再次啟動ADC的DMA ADC_RestartDMA(NPT); //FFT變換 cr4_fft_256_stm32(OutFFT, InFFT, NPT); //功率計算 for(i=0;i<MAG_NUM;i++) { x=NPT*((float)((OutFFT[i+FFT_VALUE_START_NUM]<<16)>>16))/32768; /* sine_cosine --> cos */ y=NPT*((float)(OutFFT[i+FFT_VALUE_START_NUM] >> 16))/32768; /* sine_cosine --> sin */ MagFFT[i]=(U32)(sqrt(x*x+ y*y)/NPT*MAG_VALUE_MAX); if(MagFFT[i]>DisplayFFT[0][i]) DisplayFFT[0][i]=MagFFT[i]; else if(DisplayFFT[0][i]>1) DisplayFFT[0][i]-=2; else DisplayFFT[0][i]=0; if(MagFFT[i]>DisplayFFT[1][i]) { DisplayFFT[1][i]=MagFFT[i]; } else if(DisplayFFT[1][i]>2) { DisplayFFT[1][i]-=1; } else { DisplayFFT[1][i]=2; } //顯示 //TFT操作,等待其他任務釋放資源 OSSemPend(UseTFTSem,0,&err); __DrawVBar(i*3,17,301,DisplayFFT[0][i],DisplayFFT[1][i]); //TFT操作結束,釋放TFT資源的佔用 OSSemPost(UseTFTSem); } OSTimeDlyHMSM(0, 0, 0, 10); } } void Task_StatusBar(void *p_arg) { INT8U err; /* U32 i; U32 x,y; */ U8 h=0,m=0,s=0; FontStyle_Typedef StatusBarFontStyle; StatusBarFontStyle.FontBackgroundColor=BACKGROUND_COLOR; (void) p_arg; OSStatInit(); while(1) { s++; if(s==60) { s=0; m++; if(m==60) { m=0; h++; if(h==24) h=0; } } StatusBarFontStyle.FontColor=FONT_CYAN; StatusBarFontStyle.pFontSize=&Font6x8; //TFT操作,等待其他任務釋放資源 ///* OSSemPend(UseTFTSem,0,&err); //-------------------------------------------------------------// TFT_PutString(&StatusBarFontStyle, 0, 0, " : : "); TFT_PutChar(&StatusBarFontStyle, 0,0,0x30+h/10); TFT_PutChar(&StatusBarFontStyle, 6,0,0x30+h%10); TFT_PutChar(&StatusBarFontStyle, 18,0,0x30+m/10); TFT_PutChar(&StatusBarFontStyle, 24,0,0x30+m%10); TFT_PutChar(&StatusBarFontStyle, 36,0,0x30+s/10); TFT_PutChar(&StatusBarFontStyle, 42,0,0x30+s%10); TFT_PutString(&StatusBarFontStyle, 0, 8, "2014-05-08"); StatusBarFontStyle.pFontSize=&Font8x16; TFT_PutString(&StatusBarFontStyle, 180, 0, "CPU: %"); TFT_PutChar(&StatusBarFontStyle, 212,0,0x30+OSCPUUsage/10); TFT_PutChar(&StatusBarFontStyle, 220,0,0x30+OSCPUUsage%10); StatusBarFontStyle.FontColor=FONT_BLUE; TFT_PutString(&StatusBarFontStyle, 68, 0, "MusicSpectrum"); TFT_DrawHLine(0, 16, 239, TFT_YELLOW); //------------------------------------------------------------// //TFT操作結束,釋放TFT資源的佔用 OSSemPost(UseTFTSem); //*/ OSTimeDlyHMSM(0, 0, 1, 0); } } void Task_Init(void) { UseTFTSem=OSSemCreate(1); OSTaskCreate(Task_MusicSpectrum,(void *)0,(OS_STK *)&Task_MusicSpectrumStk[TASK_MUSIC_SPECTRUM_STK_SIZE - 1],TASK_MUSIC_SPECTRUM_PRIO); OSTaskCreate(Task_StatusBar,(void *)0,(OS_STK *)&Task_StatusBarStk[TASK_STATUS_BAR_STK_SIZE - 1],TASK_STATUS_BAR_PRIO); }
main.c
/**********************************************************
* | | \ / \ / |----| /--------------------
* |\ /| \ / \ / |---| / @沐雨迎風工作室
* | \/ | | | | / Data:2014-5-5
* | | | | | / Project:STM32
* ----------------------/ File:main.c
**********************************************************
Modification History:
versions Date Name Comment
--- -------- -------- -----------
1 2014/5/5 Zhan Lei New
*/
/*------------Include file---------------*/
#include "Global.h"
#include <math.h>
/*------------Typedef---------------*/
/*------------Macro definition---------------*/
#define PI2 6.28318530717959
/*------------Define variables---------------*/
U16 dutyRatio=300;
/*------------Define functions---------------*/
void TIM3_Configuration(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
//TIM_OCInitTypeDef TIM_OCInitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
TIM_DeInit(TIM3);
TIM_TimeBaseStructure.TIM_Prescaler=0;
TIM_TimeBaseStructure.TIM_Period=600;
TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;
TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure);
TFT_SetBackLED(dutyRatio);
TIM_Cmd(TIM3,ENABLE);
}
void NVIC_Configuration(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
/* Configure one bit for preemption priority */
#if defined (VECT_TAB_RAM)
/* Set the Vector Table base location at 0x20000000 */
NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);
#elif defined(VECT_TAB_FLASH_IAP)
NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x2000);
#else /* VECT_TAB_FLASH */
/* Set the Vector Table base location at 0x08000000 */
NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);
#endif
/* Configure the NVIC Preemption Priority Bits */
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
NVIC_Init(&NVIC_InitStructure);
}
int main(void)
{
CPU_IntDis();
NVIC_Configuration();
TIM3_Configuration();
ADC_UserInit();
Font_Init();
TFT_Init();
RTC_Init();
OSInit();
Task_Init();
OSTimeSet(0);
OSStart();
while(1);
}
#ifdef USE_FULL_ASSERT
/**
* @brief Reports the name of the source file and the source line number
* where the assert_param error has occurred.
* @param file: pointer to the source file name
* @param line: assert_param error line source number
* @retval None
*/
void assert_failed(uint8_t* file, uint32_t line)
{
/* User can add his own implementation to report the file name and line number,
ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
/* Infinite loop */
while (1)
{
}
}
#endif