一)SDRAM驱动增加到工程中
1)加入驱动sdram.c文件,文件在上节课里有源代码。
2)在fmc.c文件里指定位置增加代码 SDRAM_Init();另外需要包含文件:#include “sdram.h”
/* USER CODE BEGIN 0 /
#include “sdram.h”
/ USER CODE END 0 */
/* USER CODE BEGIN FMC_Init 2 /
SDRAM_Init();
/ USER CODE END FMC_Init 2 */
3)重写初始化函数
1,加入头文件
#include “sdram.h”
#include “main.h”
2,重写初始化函数:void TouchGFXHAL::initialize()
void TouchGFXHAL::initialize()
{TouchGFXGeneratedHAL::initialize();uint32_t frameSize = DISPLAY_HEIGHT*DISPLAY_WIDTH*2;//开启3重缓存,实现动画效果setFrameBufferStartAddresses((void *)SDRAM_START_ADDR,(void *)(SDRAM_START_ADDR+frameSize),(void *)(SDRAM_START_ADDR+frameSize*2));setFrameRateCompensation(true);//开启帧速率补偿//setFingerSize(200); //设置手指大小HAL_GPIO_WritePin(LCD_BL_GPIO_Port,LCD_BL_Pin,GPIO_PIN_SET);//开启背光
}
4)增加系统文件sys.c和sys.h到工程里的BSP目录中
#include "sys.h"
//大致us延时函数
void delay_us(volatile u32 us)
{volatile u16 i,j; while(us--){for(i=0;i<11;i++)j++;}
}
//大致的ms延时函数
void delay_ms(u32 ms)
{delay_us(ms*1000);
}
//GPIO复用设置
//GPIOx:GPIOA~GPIOI.
//BITx:0~15,代表IO引脚编号.
//AFx:0~15,代表AF0~AF15.
//AF0~15设置情况(这里仅是列出常用的,详细的请见429/746数据手册,Table 12):
//AF0:MCO/SWD/SWCLK/RTC AF1:TIM1/TIM2; AF2:TIM3~5; AF3:TIM8~11
//AF4:I2C1~I2C4; AF5:SPI1~SPI6; AF6:SPI3/SAI1; AF7:SPI2/3/USART1~3/UART5/SPDIFRX;
//AF8:USART4~8/SPDIFRX/SAI2; AF9;CAN1~2/TIM12~14/LCD/QSPI; AF10:USB_OTG/USB_HS/SAI2/QSPI AF11:ETH
//AF12:FMC/SDIO/OTG/HS AF13:DCIM AF14:LCD; AF15:EVENTOUT
void GPIO_AF_Set(GPIO_TypeDef* GPIOx,u8 BITx,u8 AFx)
{ GPIOx->AFR[BITx>>3]&=~(0X0F<<((BITx&0X07)*4));GPIOx->AFR[BITx>>3]|=(u32)AFx<<((BITx&0X07)*4);
}
//GPIO通用设置
//GPIOx:GPIOA~GPIOI.
//BITx:0X0000~0XFFFF,位设置,每个位代表一个IO,第0位代表Px0,第1位代表Px1,依次类推.比如0X0101,代表同时设置Px0和Px8.
//MODE:0~3;模式选择,0,输入(系统复位默认状态);1,普通输出;2,复用功能;3,模拟输入.
//OTYPE:0/1;输出类型选择,0,推挽输出;1,开漏输出.
//OSPEED:0~3;输出速度设置,0,2Mhz;1,25Mhz;2,50Mhz;3,100Mh.
//PUPD:0~3:上下拉设置,0,不带上下拉;1,上拉;2,下拉;3,保留.
//注意:在输入模式(普通输入/模拟输入)下,OTYPE和OSPEED参数无效!!
void GPIO_Set(GPIO_TypeDef* GPIOx,u32 BITx,u32 MODE,u32 OTYPE,u32 OSPEED,u32 PUPD)
{ u32 pinpos=0,pos=0,curpin=0;for(pinpos=0;pinpos<16;pinpos++){pos=1<<pinpos; //一个个位检查 curpin=BITx&pos;//检查引脚是否要设置if(curpin==pos) //需要设置{GPIOx->MODER&=~(3<<(pinpos*2)); //先清除原来的设置GPIOx->MODER|=MODE<<(pinpos*2); //设置新的模式 if((MODE==0X01)||(MODE==0X02)) //如果是输出模式/复用功能模式{ GPIOx->OSPEEDR&=~(3<<(pinpos*2)); //清除原来的设置GPIOx->OSPEEDR|=(OSPEED<<(pinpos*2));//设置新的速度值 GPIOx->OTYPER&=~(1<<pinpos) ; //清除原来的设置GPIOx->OTYPER|=OTYPE<<pinpos; //设置新的输出模式} GPIOx->PUPDR&=~(3<<(pinpos*2)); //先清除原来的设置GPIOx->PUPDR|=PUPD<<(pinpos*2); //设置新的上下拉}}
}
#ifndef __SYS_H__
#define __SYS_H__
#include "stm32f4xx.h"
#ifdef __cplusplus
extern "C" {
#endif
//定义一些常用的数据类型短关键字
//定义一些常用的数据类型短关键字
typedef int32_t s32;
typedef int16_t s16;
typedef int8_t s8;
typedef const int32_t sc32;
typedef const int16_t sc16;
typedef const int8_t sc8;
typedef __IO int32_t vs32;
typedef __IO int16_t vs16;
typedef __IO int8_t vs8;
typedef __I int32_t vsc32;
typedef __I int16_t vsc16;
typedef __I int8_t vsc8;
typedef uint32_t u32;
typedef uint16_t u16;
typedef uint8_t u8;
typedef const uint32_t uc32;
typedef const uint16_t uc16;
typedef const uint8_t uc8;
typedef __IO uint32_t vu32;
typedef __IO uint16_t vu16;
typedef __IO uint8_t vu8;
typedef __I uint32_t vuc32;
typedef __I uint16_t vuc16;
typedef __I uint8_t vuc8;
//位带操作,实现51类似的GPIO控制功能
//具体实现思想,参考<<CM3权威指南>>第五章(87页~92页).M4同M3类似,只是寄存器地址变了.
//IO口操作宏定义
#define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x2000000+((addr &0xFFFFF)<<5)+(bitnum<<2))
#define MEM_ADDR(addr) *((volatile unsigned long *)(addr))
#define BIT_ADDR(addr, bitnum) MEM_ADDR(BITBAND(addr, bitnum))
//IO口地址映射
#define GPIOA_ODR_Addr (GPIOA_BASE+20) //0x40020014
#define GPIOB_ODR_Addr (GPIOB_BASE+20) //0x40020414
#define GPIOC_ODR_Addr (GPIOC_BASE+20) //0x40020814
#define GPIOD_ODR_Addr (GPIOD_BASE+20) //0x40020C14
#define GPIOE_ODR_Addr (GPIOE_BASE+20) //0x40021014
#define GPIOF_ODR_Addr (GPIOF_BASE+20) //0x40021414
#define GPIOG_ODR_Addr (GPIOG_BASE+20) //0x40021814
#define GPIOH_ODR_Addr (GPIOH_BASE+20) //0x40021C14
#define GPIOI_ODR_Addr (GPIOI_BASE+20) //0x40022014
#define GPIOJ_ODR_ADDr (GPIOJ_BASE+20) //0x40022414
#define GPIOK_ODR_ADDr (GPIOK_BASE+20) //0x40022814#define GPIOA_IDR_Addr (GPIOA_BASE+16) //0x40020010
#define GPIOB_IDR_Addr (GPIOB_BASE+16) //0x40020410
#define GPIOC_IDR_Addr (GPIOC_BASE+16) //0x40020810
#define GPIOD_IDR_Addr (GPIOD_BASE+16) //0x40020C10
#define GPIOE_IDR_Addr (GPIOE_BASE+16) //0x40021010
#define GPIOF_IDR_Addr (GPIOF_BASE+16) //0x40021410
#define GPIOG_IDR_Addr (GPIOG_BASE+16) //0x40021810
#define GPIOH_IDR_Addr (GPIOH_BASE+16) //0x40021C10
#define GPIOI_IDR_Addr (GPIOI_BASE+16) //0x40022010
#define GPIOJ_IDR_Addr (GPIOJ_BASE+16) //0x40022410
#define GPIOK_IDR_Addr (GPIOK_BASE+16) //0x40022810
//IO口操作,只对单一的IO口!
//确保n的值小于16!
#define PAout(n) BIT_ADDR(GPIOA_ODR_Addr,n) //输出
#define PAin(n) BIT_ADDR(GPIOA_IDR_Addr,n) //输入
#define PBout(n) BIT_ADDR(GPIOB_ODR_Addr,n) //输出
#define PBin(n) BIT_ADDR(GPIOB_IDR_Addr,n) //输入
#define PCout(n) BIT_ADDR(GPIOC_ODR_Addr,n) //输出
#define PCin(n) BIT_ADDR(GPIOC_IDR_Addr,n) //输入
#define PDout(n) BIT_ADDR(GPIOD_ODR_Addr,n) //输出
#define PDin(n) BIT_ADDR(GPIOD_IDR_Addr,n) //输入
#define PEout(n) BIT_ADDR(GPIOE_ODR_Addr,n) //输出
#define PEin(n) BIT_ADDR(GPIOE_IDR_Addr,n) //输入
#define PFout(n) BIT_ADDR(GPIOF_ODR_Addr,n) //输出
#define PFin(n) BIT_ADDR(GPIOF_IDR_Addr,n) //输入
#define PGout(n) BIT_ADDR(GPIOG_ODR_Addr,n) //输出
#define PGin(n) BIT_ADDR(GPIOG_IDR_Addr,n) //输入
#define PHout(n) BIT_ADDR(GPIOH_ODR_Addr,n) //输出
#define PHin(n) BIT_ADDR(GPIOH_IDR_Addr,n) //输入
#define PIout(n) BIT_ADDR(GPIOI_ODR_Addr,n) //输出
#define PIin(n) BIT_ADDR(GPIOI_IDR_Addr,n) //输入
#define PJout(n) BIT_ADDR(GPIOJ_ODR_Addr,n) //输出
#define PJin(n) BIT_ADDR(GPIOJ_IDR_Addr,n) //输入
#define PKout(n) BIT_ADDR(GPIOK_ODR_Addr,n) //输出
#define PKin(n) BIT_ADDR(GPIOK_IDR_Addr,n) //输入
//Ex_NVIC_Config专用定义
#define GPIO_A 0
#define GPIO_B 1
#define GPIO_C 2
#define GPIO_D 3
#define GPIO_E 4
#define GPIO_F 5
#define GPIO_G 6
#define GPIO_H 7
#define GPIO_I 8
#define FTIR 1 //下降沿触发
#define RTIR 2 //上升沿触发
//GPIO设置专用宏定义
#define GPIO_MODE_IN 0 //普通输入模式
#define GPIO_MODE_OUT 1 //普通输出模式
#define GPIO_MODE_AF 2 //AF功能模式
#define GPIO_MODE_AIN 3 //模拟输入模式
#define GPIO_SPEED_2M 0 //GPIO速度2Mhz
#define GPIO_SPEED_25M 1 //GPIO速度25Mhz
#define GPIO_SPEED_50M 2 //GPIO速度50Mhz
#define GPIO_SPEED_100M 3 //GPIO速度100Mhz
#define GPIO_PUPD_NONE 0 //不带上下拉
#define GPIO_PUPD_PU 1 //上拉
#define GPIO_PUPD_PD 2 //下拉
#define GPIO_PUPD_RES 3 //保留
#define GPIO_OTYPE_PP 0 //推挽输出
#define GPIO_OTYPE_OD 1 //开漏输出
//GPIO引脚编号定义
#define PIN0 1<<0
#define PIN1 1<<1
#define PIN2 1<<2
#define PIN3 1<<3
#define PIN4 1<<4
#define PIN5 1<<5
#define PIN6 1<<6
#define PIN7 1<<7
#define PIN8 1<<8
#define PIN9 1<<9
#define PIN10 1<<10
#define PIN11 1<<11
#define PIN12 1<<12
#define PIN13 1<<13
#define PIN14 1<<14
#define PIN15 1<<15
void delay_us(u32 us);
void delay_ms(u32 ms);
void GPIO_AF_Set(GPIO_TypeDef* GPIOx,u8 BITx,u8 AFx);//GPIO复用功能设置
void GPIO_Set(GPIO_TypeDef* GPIOx,u32 BITx,u32 MODE,u32 OTYPE,u32 OSPEED,u32 PUPD);//GPIO设置函数
#ifdef __cplusplus
}
#endif
#endif