浙有正能量
2024-06-02 13:10:15
最佳回答
1【1】打开keil uv**ion5建立好相应的工程项目,添加相应的文件和头文件路径,在建立工程过程中需要使用keil插件,可到官网去下载,亦可联系我。 【2】.初始化spi gpio配置。spi_mosi、spi_m**o、spi_sck、spi_cs配置为复用输出模式,spi_cs亦可配置为普通输出模式。若是使用模拟spi方式直接配置为普通模式输出即可。#define tft_spi0_mosi_pingpio_pin_a13#define tft_spi0_m**o_pingpio_pin_a12#define tft_spi0_sck_pingpio_pin_a11#define tft_spi0_cs_pingpio_pin_a10static void vtft_spi0_gpio_configuration(void){gpio_initsettingtype gpio_initstructure;gpio_initstructure.signal = gpio_pin_signal_digital;//digital pin gpio_initstructure.dir = gpio_direction_output;//output mode gpio_initstructure.func = gpio_reuse_func3;//reuse functio3 gpio_initstructure.ode = gpio_ode_output_d**able;//open drain d**able gpio_initstructure.ds = gpio_ds_output_strong;//strong output gpio_initstructure.pue = gpio_pue_input_d**able;//pull up d**able gpio_initstructure.pde = gpio_pde_input_d**able;//pull down d**ablegpio_init(tft_spi0_m**o_pin, &gpio_initstructure);//init tft_spi0_m**o_pingpio_init(tft_spi0_mosi_pin, &gpio_initstructure);//init tft_spi0_mosi_pingpio_init(tft_spi0_sck_pin, &gpio_initstructure);//init tft_spi0_sck_pingpio_initstructure.signal = gpio_pin_signal_digital;//digital pin gpio_initstructure.dir = gpio_direction_output;//output mode gpio_initstructure.func = gpio_reuse_func0;//reuse functio0 gpio_initstructure.ode = gpio_ode_output_d**able;//open drain d**able gpio_initstructure.ds = gpio_ds_output_strong;//strong output gpio_initstructure.pue = gpio_pue_input_d**able;//pull up d**able gpio_initstructure.pde = gpio_pde_input_d**able;//pull down d**ablegpio_init(tft_spi0_cs_pin, &gpio_initstructure);//init tft_spi0_cs_pin} 【3】配置spi。spi频率、数据格式、通讯模式、发送帧位宽、延时接收使能、发送间隔使能、发送间隔周期。若使用模拟spi方式此步骤可以忽略,最后初始化spi。static void vtft_spi0_configuration(void){spi_initstrutype spi_initstructure;spi_initstructure.spi_freq = 10000000;//spi frequencyspi_initstructure.spi_df = spi_fallsendr**erec;//data r**e send fall recievespi_initstructure.spi_mode = spi_mode_master;//work modespi_initstructure.spi_dw = 7;//data bit widthspi_initstructure.spi_delayrec = d**able;//delay recievespi_initstructure.spi_delaysend = d**able;//delay sendspi_initstructure.spi_senddelayperoid = 0;//delay send peroidspi_init(spi0, &spi_initstructure);//init spi0spi0_enable();//spi0 enable} void vtft_spi0_initialization(void){vtft_spi0_gpio_configuration();vtft_spi0_configuration();} 【4】配置tft gpio。tft_reset、tft_rs配置为普通模式输出。#define tft_reset_pingpio_pin_a15#define tft_rs_pingpio_pin_a14static void vtft_gpio_configuration(void){gpio_initsettingtype gpio_initstructure;gpio_initstructure.signal = gpio_pin_signal_digital;//digital pin gpio_initstructure.dir = gpio_direction_output;//output mode gpio_initstructure.func = gpio_reuse_func0;//reuse function 0 gpio_initstructure.ode = gpio_ode_output_d**able;//open drain d**able gpio_initstructure.ds = gpio_ds_output_normal;//normal output gpio_initstructure.pue = gpio_pue_input_d**able;//pull up d**able gpio_initstructure.pde = gpio_pde_input_d**able;//pull down d**ablegpio_init(tft_reset_pin, &gpio_initstructure);//init tft_reset_pingpio_init(tft_rs_pin, &gpio_initstructure);//init tft_rs_pin}2【1】编写写指令、写数据函数,这两个函数是最核心的函数。若使用模拟spi方式,重点也是修改这两个函数。 #define tft_cs_set()gpio_setbit(tft_spi0_cs_pin)#define tft_cs_clr()gpio_resetbit(tft_spi0_cs_pin) #define tft_rs_set()gpio_setbit(tft_rs_pin)#define tft_rs_clr()gpio_resetbit(tft_rs_pin) 写字节命令函数void vtft_writebyte_command(u8 cmd){tft_cs_clr();tft_rs_clr();spi_sendbyte(spi0, cmd);while(spi_getstatus(spi0, spi_sta_idle) == reset);tft_cs_set();} 写字节数据函数void vtft_writebyte_data(u8 dat){tft_cs_clr();tft_rs_set();spi_sendbyte(spi0, dat);while(spi_getstatus(spi0, spi_sta_idle) == reset);tft_cs_set();} 写u16数据函数void vtft_write_data(u16 dat){tft_cs_clr();tft_rs_set();spi_sendbyte(spi0, (u8)(dat >> 8));while(spi_getstatus(spi0, spi_sta_idle) == reset);spi_sendbyte(spi0, (u8)dat);while(spi_getstatus(spi0, spi_sta_idle) == reset);tft_cs_set();}3【1】配置滴答定时器做延时使用,有毫秒级和微秒级的延时,最低10us的倍数延时。 滴答定时器为24bit倒计时计数器,属于内核定时器,在arm cortex-m0/m3/m4上都有。u8 fac_us = 0; u16 fac_ms = 0;void vsystick_delay_initialization(void){systick_initstrutype systick_initstructure; fac_us = (systemcoreclock / 3000000) * 10;//systick value=10usfac_ms = fac_us * 100;//1mssystick_initstructure.systick_clksource = systick_clks_base;//systick colck = hclk/3 = 16msystick_initstructure.systick_itenable = d**able;//d**able systick interruptsystick_init(&systick_initstructure);//init systick} 毫秒级延时void delay_ms(u16 nms) {u32 temp = 0;systick->load = (u32)nms*fac_ms;//auto reload value systick->val = 0x00;//systick current valuesystick->ctrl |= systick_ctrl_enable_msk;//enable systick do{temp = systick->ctrl;}while((temp&0x01) && (!(temp&(1<<16))));//enable systick and count non-arrival systick->ctrl &= ~systick_ctrl_enable_msk;//d**able systicksystick->val = 0x00;//systick current value} 10微秒级延时void delay_10us(u32 nus){u32 temp = 0;systick->load = (u32)nus*fac_us;//auto reload value systick->val = 0x00;//systick current valuesystick->ctrl |= systick_ctrl_enable_msk;//enable systick do{temp = systick->ctrl;}while((temp&0x01)&& (!(temp&(1<<16))));//enable systick and count non-arrival systick->ctrl &= ~systick_ctrl_enable_msk;//d**able systicksystick->val = 0x00;//systick current value }4【1】编写tft出厂参数校准函数,这个函数里才参数都是有tft lcd厂家调试好的参数,直接拿过来用就行,需要设置的参数比较多,这里只展示一部分。 static void vtft_default_set(void){tft_reset_clr();delay_ms(500);tft_reset_set();delay_ms(100);tft_cs_clr();vtft_writebyte_command(0xcb); vtft_writebyte_data(0x39); vtft_writebyte_data(0x2c); vtft_writebyte_data(0x00); vtft_writebyte_data(0x34); vtft_writebyte_data(0x02); vtft_writebyte_command(0x36);//memory access control #if ( tft_d**play_mode_level > 0 )//横屏 竖屏选择 vtft_writebyte_data(0xe8);#elsevtft_writebyte_data(0x48);#endif vtft_writebyte_command(0x3a); vtft_writebyte_data(0x55); .......}5【1】设置光标位置void vtft_setcursor_position(u16 x, u16 y){vtft_writebyte_command(0x2a);//set x linevtft_writebyte_data(x>>8); vtft_writebyte_data(x&0xff); vtft_writebyte_command(0x2b); //set y rowvtft_writebyte_data(y>>8); vtft_writebyte_data(y&0xff);} 【2】绘制窗口void vtft_set_window(u16 x0, u16 y0, u16 x1, u16 y1, u16 color){u16 x = 0;u16 y = 0;vtft_writebyte_command(0x2a);//set x linevtft_writebyte_data(x0>>8);vtft_writebyte_data(x0&0xff);vtft_writebyte_data(x1>>8);vtft_writebyte_data(x1&0xff); vtft_writebyte_command(0x2b);//set y rowvtft_writebyte_data(y0>>8);vtft_writebyte_data(y0&0xff);vtft_writebyte_data(y1>>8);vtft_writebyte_data(y1&0xff);vtft_writebyte_command(0x2c);//write gram for(x=x0; x<=x1; x++){for(y=y0; y<=y1; y++)vtft_write_data(color);}} 【3】画点函数void vtft_drawing_point(u16 x, u16 y, u16 color){vtft_setcursor_position(x, y);vtft_writebyte_command(0x2c);vtft_write_data(color);} 【4】在指定位置显示一个字符,可设置背景色和前景色,共有三种字体选择void vtft_show_chars(u16 x, u16 y, u8 size, u8 chr, u16 backcolor, u16 fontcolor){u16 starty = 0;u8 fontbyte = 0;u8 strpoint = 0;u8 m=0, i=0;starty = y;chr = chr - ' ';//ascii the first character ** empty,value 32fontbyte = ((size/8) + ((size%8) ? 1 : 0)) * (size/2);//char bytefor(i=0; i<fontbyte; i++){if(size == tft_font_size_1206)//1206strpoint = ascii_1206[chr][i]; if(size == tft_font_size_1608)//1608strpoint = ascii_1608[chr][i];else if(size == tft_font_size_2412)//2412strpoint = ascii_2412[chr][i];else return;for(m=0; m<8; m++){ if(strpoint & 0x80)vtft_drawing_point(x, y, fontcolor);//char colorelsevtft_drawing_point(x, y, backcolor);//background colorstrpoint <<= 1; if(++y >= tft_yheight_max)//y maxreturn;if((y - starty) == size){y = starty;if(++x >= tft_xwidth_max)//x maxreturn;break;}} }} 【5】在指定位置显示字符串,超出范围可自动换行显示,可设置背景色和前景色,共有三种字体选择。void vtft_show_sting(u16 x, u16 y, u8 size, u8 *pstr, u16 backcolor, u16 fontcolor){while((*pstr >= ' ') && (*pstr <= '~'))//while('\n' != *psting){if((x + size/2) > tft_xwidth_max)//next char start position{x = 0;y = y + size;//next fong high}if((y + size) > tft_yheight_max)return;vtft_show_chars(x, y, size ,*pstr, backcolor, fontcolor);//tft show charx = x + size/2;pstr++;//next char}}6【1】在指定位置显示数字,static u32 uxtft_resolve_num(u8 m, u8 n){u32 result=1;while(n--)result *= m; return result;} void vtft_show_number(u16 x, u16 y, u8 size, u32 num, u8 len, u16 backcolor, u16 fontcolor){u8 i,temper = 0;for(i=0; i<len; i++){if((x + size/2) > tft_xwidth_max)//next char start position{x = 0;y = y + size;//next fong high}if((y+ size) > tft_yheight_max)return;temper = (num/uxtft_resolve_num(10, len-i-1))%10;vtft_show_chars(x, y, size ,(temper + '0'), backcolor, fontcolor);x = x + size/2;}}7【1】配置系统时钟为48mhz,使能需要的外设时钟,失能不需要的外设时钟,着这样可以降低功耗。static void vperipheral_clock_configuration(void){deviceclock_config(scu_succlk, enable);//enable suc clockdeviceclock_config(scu_gpioclk, enable);//enable gpio clockdeviceclock_config(scu_spioclk, enable);//enable spi0 clockdeviceclock_config(scu_uart1clk, enable);//enable uart1 clockdeviceclock_config(scu_t16n2clk, enable);//enable t16n2 clockdeviceclock_config(scu_iapclk, d**able);//d**able iap clockdeviceclock_config(scu_t16n0clk, d**able);//d**able t16n0 clockdeviceclock_config(scu_t16n3clk, d**able);//d**able t16n3 clockdeviceclock_config(scu_uart0clk, d**able);//d**able uart0 clockdeviceclock_config(scu_wdtclk, d**able);//d**able wdt clockdeviceclock_config(scu_t16n1clk, d**able);//d**able t16n1 clockdeviceclock_config(scu_rtcclk, d**able);//d**able rtc clockdeviceclock_config(scu_euart0clk, d**able);//d**able euart0 clockdeviceclock_config(scu_spi1clk, d**able);//d**able spi1 clockdeviceclock_config(scu_i2c0clk, d**able);//d**able i2c0 clockdeviceclock_config(scu_adcclk, d**able);//d**able adc clockdeviceclock_config(scu_t32n0clk, d**able);//d**able t32n0 clock} void vsystem_clock_configuration(void){scu_regunlock();//unlock scu reg**terdeviceclock_config(scu_succlk, enable);//enable suc clockscu_sysclkselect(scu_clk_hrc);//system clock hrc = 16mpllclock_config(enable ,scu_pll_in16m, scu_pll_48m, enable);//system clock pll = 48m scu->sclken0.sysclk_div = 0;//system clock later div=0 sys=48mscu_re**();//lock scu reg**ter d**able_global_interrupt();vperipheral_clock_configuration();//vperipheral clock configurationeanble_user_interrupt();}8【1】编写tft初始化函数 void vtft_initialization(void){vtft_gpio_configuration();vtft_default_set();vtft_clear_screen(white);vtft_writebyte_command(0x28);vtft_set_window(0, 0, tft_xwidth_max, 30, black);vtft_show_sting(80, 3, 24, "tft lcd study", black, white);vtft_windowrange(0, 0, 320, 240);vtft_show_sting(5, 40, 12, "1206 font: string 0123456789 abcdef !@#$%^&*()_+{}|<", red, black);vtft_show_sting(5, 55, 16, "1608 font: string 0123 abc !@#$%^&*()", black, yellow);vtft_show_sting(5, 75, 24, "2412 font: string 123 abc", blue, white); vtft_drawing_line(0, 108, 320, 108, red);vtft_drawing_line(0, 110, 320, 110, blue);vtft_drawing_line(0, 112, 320, 112, black);vtft_drawing_circular(70, 175, 55, blue);vtft_drawing_circular(70, 175, 35, red);vtft_drawing_circular(70, 175, 15, red);vtft_show_sting(150, 120, 24, "number test:", green, black);vtft_show_sting(150, 155, 24, "dec:", white, black);vtft_show_number(200, 155, 24, 0, 4, black, white);vtft_show_sting(150, 185, 24, "hex:", white, black);vtft_show_bytehex(200, 185, 24, 0, blue, white);vtft_writebyte_command(0x29);vtft_windowrange(0, 0, 320, 240);} 【2】编写系统初始化函数static void system_initialization(void){systeminit();vsystem_clock_configuration();vsystick_delay_initialization();vtft_spi0_initialization();vtft_initialization();delay_ms(500);}9编写主函数,编译代码,有错误修改,直到无错误,下载到板子上查看效果。int main(void){u16 i = 0;system_initialization(); while(1){i++;vtft_show_number(200, 155, 24, i, 4, black, white);vtft_show_bytehex(200, 185, 24, (u8)i, blue, white);delay_ms(1000);}}end 20210311