这里会显示出您选择的修订版和当前版本之间的差别。
两侧同时换到之前的修订记录 前一修订版 后一修订版 | 前一修订版 | ||
icore4t_60 [2020/09/23 18:35] zgf |
icore4t_60 [2022/04/01 10:58] (当前版本) sean |
||
---|---|---|---|
行 2: | 行 2: | ||
|技术支持电话|**0379-69926675-801**||| | |技术支持电话|**0379-69926675-801**||| | ||
|技术支持邮件|Gingko@vip.163.com||| | |技术支持邮件|Gingko@vip.163.com||| | ||
- | |技术论坛|http://www.eeschool.org||| | ||
^ 版本 ^ 日期 ^ 作者 ^ 修改内容 ^ | ^ 版本 ^ 日期 ^ 作者 ^ 修改内容 ^ | ||
| V1.0 | 2020-09-23 | gingko | 初次建立 | | | V1.0 | 2020-09-23 | gingko | 初次建立 | | ||
- | ===== STM32CubeMX教程六十——LCD实验——驱动4.3寸液晶屏(草稿未完) ===== | + | ===== STM32CubeMX教程六十——LCD实验驱动4.3寸液晶屏 ===== |
1.在主界面选择File-->New Project 或者直接点击ACCEE TO MCU SELECTOR | 1.在主界面选择File-->New Project 或者直接点击ACCEE TO MCU SELECTOR | ||
- | {{ :icore4t:icore4t_cube_32_1.png?direct |}} | + | {{ :icore4t:icore4t_cube_60_1.png?direct |}} |
2.出现芯片型号选择,搜索自己芯片的型号,双击型号,或者点击Start Project进入配置 | 2.出现芯片型号选择,搜索自己芯片的型号,双击型号,或者点击Start Project进入配置 | ||
在搜索栏的下面,提供的各 种查找方式,可以选择芯片内核,型号,等等,可以帮助你查找芯片。本实验选取的芯片型号为:STM32H750IBKx。 | 在搜索栏的下面,提供的各 种查找方式,可以选择芯片内核,型号,等等,可以帮助你查找芯片。本实验选取的芯片型号为:STM32H750IBKx。 | ||
- | {{ :icore4t:icore4t_cube_32_2.png?direct |}} | + | {{ :icore4t:icore4t_cube_60_2.png?direct |}} |
3.配置RCC,使用外部时钟源 | 3.配置RCC,使用外部时钟源 | ||
- | {{ :icore4t:icore4t_cube_32_3.png?direct |}} | + | {{ :icore4t:icore4t_cube_60_3.png?direct |}} |
4.时基源选择SysTick | 4.时基源选择SysTick | ||
- | {{ :icore4t:icore4t_cube_32_4.png?direct |}} | + | {{ :icore4t:icore4t_cube_60_4.png?direct |}} |
- | 5.将PA10,PB7,PB8设置为GPIO_Output | + | 5.配置GPIO和引脚模式,引脚为PA10,PB4,PB7,PB8,PF6,PI1,PI2,PI3。 |
- | {{ :icore4t:icore4t_cube_32_5.png?direct |}} | + | {{ :icore4t:icore4t_cube_60_5.png?direct |}} |
- | 6.引脚模式配置 | + | 6.配置LTDC,引脚为PA8,PC7,PD3,PF10,PG6,PG7,PG10,PG12,PH9,PH10,PH11,PH12,PH13,PH15,PI0,PI5,PI6,PI7,PI9,PI10。 |
- | {{ :icore4t:icore4t_cube_32_6.png?direct |}} | + | {{ :icore4t:icore4t_cube_60_6.png?direct |}} |
- | {{ :icore4t:icore4t_cube_32_7.png?direct |}} | + | {{ :icore4t:icore4t_cube_60_7.png?direct |}} |
- | + | {{ :icore4t:icore4t_cube_60_8.png?direct |}} | |
- | + | 7.配置TIM12。 | |
- | 10.时钟源设置,选择外部高速时钟源,配置为最大主频 | + | {{ :icore4t:icore4t_cube_60_9.png?direct |}} |
- | {{ :icore4t:icore4t_cube_32_11.png?direct |}} | + | {{ :icore4t:icore4t_cube_60_10.png?direct |}} |
- | 11.工程文件的设置, 这里就是工程的各种配置 我们只用到有限几个,其他的默认即可 IDE我们使用的是 MDK V5.27 | + | 8.配置FMC,引脚为PD0,PD1,PD8,PD9,PD10,PD14,PD15,PE0,PE1,PE7,PE8,PE9,PE10,PE11,PE12,PE13,PE14,PE15,PF0,PF1,PF2,PF3,PF4,PF5,PF11,PF12,PF13,PF14,PF15,PG0,PG1,PG2,PG4,PG5,PG8,PG15,PH2,PH3,PH5。 |
- | {{ :icore4t:icore4t_cube_32_12.png?direct |}} | + | {{ :icore4t:icore4t_cube_60_11.png?direct |}} |
- | 12.点击Code Generator,进行进一步配置 | + | 9.时钟源设置,选择外部高速时钟源,配置为最大主频。 |
- | {{ :icore4t:icore4t_cube_32_13.png?direct |}} | + | {{ :icore4t:icore4t_cube_60_12.png?direct |}} |
+ | {{ :icore4t:icore4t_cube_60_13.png?direct |}} | ||
+ | 10.工程文件的设置, 这里就是工程的各种配置 我们只用到有限几个,其他的默认即可 IDE我们使用的是 MDK V5.27 | ||
+ | {{ :icore4t:icore4t_cube_60_14.png?direct |}} | ||
+ | 11.点击Code Generator,进行进一步配置 | ||
+ | {{ :icore4t:icore4t_cube_60_15.png?direct |}} | ||
* **Copy all used libraries into the project folder** | * **Copy all used libraries into the project folder** | ||
* 将HAL库的所有.C和.H都复制到所建工程中 | * 将HAL库的所有.C和.H都复制到所建工程中 | ||
行 43: | 行 47: | ||
* 缺点:复制到其他电脑上或者软件包位置改变,就需要修改相对应的路径 | * 缺点:复制到其他电脑上或者软件包位置改变,就需要修改相对应的路径 | ||
* 自行选择方式即可 | * 自行选择方式即可 | ||
- | 13.然后点击GENERATE CODE 创建工程 | + | 12.然后点击GENERATE CODE 创建工程 |
- | {{ :icore4t:icore4t_cube_32_14.png?direct |}} | + | {{ :icore4t:icore4t_cube_60_16.png?direct |}} |
创建成功,打开工程。 | 创建成功,打开工程。 | ||
\\ | \\ | ||
\\ | \\ | ||
\\ | \\ | ||
- | ===== 实验六十:LCD实验——驱动4.3寸液晶屏 ===== | + | ===== 实验六十:LCD实验驱动4.3寸液晶屏 ===== |
==== 一、 实验目的与意义 ==== | ==== 一、 实验目的与意义 ==== | ||
- | + | - 了解STM32 LTDC结构 | |
- | - 了解STM32 驱动LCD液晶屏的方法。 | + | - 了解STM32 LTDC特征 |
- | - 掌握KEIL MDK 集成开发环境使用方法。 | + | - 掌握LCD液晶屏的使用方法 |
+ | - 掌握STM32 HAL库中LTDC属性的配置方法 | ||
+ | - 掌握KEIL MDK 集成开发环境使用方法 | ||
==== 二、 实验设备及平台 ==== | ==== 二、 实验设备及平台 ==== | ||
- | + | - iCore4T 双核心板 | |
- | - iCore4T 双核心板。 | + | - iCore4T 扩展底板 |
- | - JLINK(或相同功能)仿真器。[[https://item.taobao.com/item.htm?id=554869837940|点击购买]] | + | - iCore 4.3寸液晶屏底板 |
- | - Micro USB线缆。 | + | - JLINK(或相同功能)仿真器 |
- | - Keil MDK 开发平台。 | + | - Micro USB线缆 |
- | - STM32CubeMX开发平台。 | + | - Keil MDK 开发平台 |
- | - 装有WIN XP(及更高版本)系统的计算机。 | + | - STM32CubeMX开发平台 |
+ | - 装有WIN XP(及更高版本)系统的计算机 | ||
==== 三、 实验原理 ==== | ==== 三、 实验原理 ==== | ||
- | === 1.SDMMC简介 === | + | === LCD-TFT显示控制器(LTDC) 简介 === |
+ | LCD-TFT(液晶显示器——薄膜晶体管)显示器控制器提供并行数字 RGB(红色、绿色、 蓝色)以及水平同步、垂直同步、像素时钟和数据使能信号,这些信号直接输出到不同 LCD 和 TFT 面板的接口。STM32H750xx 的 LTDC 主要特性如下: | ||
+ | * 24 位 RGB 并行像素输出;每像素 8 位数据(RGB888) | ||
+ | * 2 个带有专用 FIFO 的显示层(FIFO 深度 64x64 位) | ||
+ | * 支持查色表 (CLUT),每层高达 256 种颜色(256x24 位) | ||
+ | * 可针对不同显示面板编程时序 | ||
+ | * 可编程背景色 | ||
+ | * 可编程 HSync、VSync 和数据使能(DE)信号的极性 | ||
+ | * 每层有多达 8 种颜色格式可供选择:ARGB8888、RGB888、RGB565、ARGB1555、ARGB4444、L8(8 位 Luminance 或 CLUT)、AL44(4 位 alpha+4 位 luminance)和 AL88(8 位 alpha+8位 luminance) | ||
+ | * 每通道的低位采用伪随机抖动输出(红色、绿色、蓝色的抖动宽度为 2 位) | ||
+ | * 使用 alpha 值(每像素或常数)在两层之间灵活混合 | ||
+ | * 色键(透明颜色) | ||
+ | * 可编程窗口位置和大小 | ||
+ | * 支持薄膜晶体管 (TFT) 彩色显示器 | ||
+ | * AXI 主接口支持 16 个双字的突发 | ||
+ | * 高达 4 个可编程中断事件 | ||
+ | LTDC 控制器主要包含:信号线、图像处理单元、AXI 接口、配置和状态寄存器以及时钟部分,其框图如下所示: | ||
+ | {{ :icore4t:iCore4T_ARM_HAL_60_1.png?direct |}} | ||
- | * (1) SDMMC指的是SD、SDIO 、MMC卡主机接口,提供APB2外设总线和多媒体卡(MMCs),数字安全记忆卡(SD)和SDIO卡。 | + | === 2.LCD的DE同步模式和HV同步模式 === |
- | === 2.USB模块介绍 === | + | 通常,STM32H7都是用SDRAM作为LCD的显存,LTDC控制器会从SDRAM读取数据刷新到LCD显示屏上。刷新模式有DE同步模式和HV同步模式两种。一般大分辨率显示屏用DE同步模式,小分辨率的显示屏用HV同步模式。 |
- | * USB模块为PC主机和微控制器所实现的功能之间提供了符 | + | * DE同步模式 |
- | === 3.USB MSC简介 === | + | DE模式需要LCD_DE和LCD_CLK信号来控制刷新。比如一个800x480分辨率的裸屏,在DE有效信号的时候(高电平或低电平),就有800个LCD_CLK输出时钟来确认行中800个点。每个时钟有效的时候,从显存读取一次RGB数据。因为存在回扫信号,所以DE是个方波。一个周期的LCD_DE信号,裸屏就扫描一行。扫描480行后,又从第一行扫描开始。这个规律由裸屏的驱动IC所决定的。 |
- | * USB大容量存储设备 | + | * HV同步模式 |
- | === 4.原理图 === | + | HV模式需要LCD_CLK时钟信号,行同步信号LCD_HSYNC和场同步信号LCD_VSYNC来控制刷新。比如一个480x272分辨率的裸屏,有一个行同步信号LCD_HSYNC产生时(高电平或者低电平脉冲),就有480个LCD_CLK输出时钟来确认行中480个点。每个时钟有效的时候,从显存读取一次RGB数据。再来一个行同步信号LCD_HSYNC产生时(高电平或者低电平脉冲),切换到下一行,继续行同步和时钟输出,扫描272行后,发送一个场同步信号LCD_VSYNC,又重新从第一行扫描开始。 |
+ | |||
+ | === 3.LTDC的时序配置 === | ||
+ | {{ :icore4t:iCore4T_ARM_HAL_60_2.png?direct |}} | ||
+ | LTDC的时序控制就是下面几个参数的设置,这几个参数都可以通过寄存器进行配置。 | ||
+ | |||
+ | * HSYNC width水平同步宽度设置,以LCD_CLK的像素时钟输出为单位。 | ||
+ | * HBP(horizontal back porch period)水平后沿周期设置,以LCD_CLK的像素时钟输出为单位。 | ||
+ | * Active width有效宽度设置,以LCD_CLK的像素时钟输出为单位。以480*272分辨率为例,Active width = 480。 | ||
+ | * HFP(horizontal front porch period)水平前沿周期设置,以LCD_CLK的像素时钟输出为单位。 | ||
+ | * VSYNC width垂直同步宽度设置,以LCD_CLK的像素时钟输出为单位。 | ||
+ | * VBP(vertical back porch period)垂直后沿周期设置,以LCD_CLK的像素时钟输出为单位。 | ||
+ | * Active height有效高度设置,以LCD_CLK的像素时钟输出为单位。以480*272分辨率为例,Active height = 272。 | ||
+ | * VFP(vertical front porch period)垂直前沿周期设置,以LCD_CLK的像素时钟输出为单位。 | ||
+ | |||
+ | === 4.窗口 === | ||
+ | |||
+ | 可为每个层定位和调整大小,各个层必须位于有效显示区域内。 | ||
+ | 窗口位置和大小通过左上和右下的 X/Y 位置以及包含同步、后沿大小和有效数据区域的内部时序发生器配置。 | ||
+ | 可编程层位置和大小定义了一行中的第一个/最后一个可见像素和窗口中的第一个/最后一个可见行。它允许显示完整的图像帧,也允许只显示图像帧的一部分。 | ||
+ | * 层中的第一个和最后一个可见像素通过配置 LTDC_LxWHPCR 寄存器中WHSTPOS[11:0] 和WHSPPOS[11:0] 进行设置。 | ||
+ | * 层中的第一个和最后一个可见行通过配置 LTDC_LxWVPCR 寄存器中的 WVSTPOS[10:0] 和 WVSPPOS[10:0] 进行设置。 | ||
+ | {{ :icore4t:iCore4T_ARM_HAL_60_3.png?direct |}} | ||
+ | |||
+ | === 5.LTDC层混合 === | ||
+ | |||
+ | LTDC除了图层1和图层2两个硬件图层以外,还有一个背景层。由于背景层的刷新不需要显存空间,所以可以用这个图层验证LTDC时序配置是否有问题。 | ||
+ | {{ :icore4t:iCore4T_ARM_HAL_60_4.png?direct |}} | ||
+ | |||
+ | 背景层仅支持单色设置,固定颜色格式RGB888(LTDC_HandleTypeDef hltdc)我们这里将背景设置为白色: | ||
+ | hltdc.Init.Backcolor.Blue = 255 | ||
+ | hltdc.Init.Backcolor.Green = 255 | ||
+ | hltdc.Init.Backcolor.Red = 255 | ||
+ | |||
+ | 对于图层1和图层2来说,支持如下8种颜色格式: | ||
+ | |||
+ | - ARGB8888 | ||
+ | - RGB888 | ||
+ | - RGB565 | ||
+ | - ARGB1555 | ||
+ | - ARGB4444 | ||
+ | - L8(8 位 Luminance 或 CLUT) | ||
+ | - AL44(4 位 alpha + 4 位 luminance) | ||
+ | - AL88(8 位 alpha + 8 位 luminance) | ||
+ | |||
+ | 实现Alpha混合的关键是要有一个变量可以设置各种透明度。对此,STM32H7准备了两个Alpha供使用: | ||
+ | * 一个是常数Alpha(0x00表示完全透明,0xFF表示完全不透明),所有颜色格式都可以使用。 | ||
+ | * 另一个是像素Alpha,也就是ARGB8888,ARGB1555,ARGB4444等颜色格式的Alpha通道数值,也就是我们为图层每个位置绘制的实际颜色值。 | ||
+ | |||
+ | STM32H7的参考手册给出了具体的混合公式: | ||
+ | BC = BF1 x C + BF2 x Cs | ||
+ | 混合后的颜色= 混合系数1 x 当前层颜色 + 混合系数2 x 底层混合后的颜色 | ||
- | * 本实验编写4.3寸液晶屏驱动并进行简单操作。 | ||
==== 四、 实验程序 ==== | ==== 四、 实验程序 ==== | ||
行 85: | 行 159: | ||
<code c> | <code c> | ||
int main(void) | int main(void) | ||
+ | { | ||
+ | int i; | ||
+ | HAL_Init(); | ||
+ | /* Configure the system clock */ | ||
+ | SystemClock_Config(); | ||
+ | /* USER CODE BEGIN SysInit */ | ||
+ | i2c.initialize(); //I2C初始化 | ||
+ | axp152.initialize(); //电源芯片配置 | ||
+ | axp152.set_dcdc1(3500);//[ARM & FPGA BK1/2/6 &OTHER] | ||
+ | axp152.set_dcdc2(1200);//[FPGA INT & PLL D] | ||
+ | axp152.set_aldo1(2500);//[FPGA PLL A] | ||
+ | axp152.set_dcdc4(3300);//[POWER_OUTPUT] | ||
+ | axp152.set_dcdc3(3300);//[FPGA BK4][Adjustable] | ||
+ | axp152.set_aldo2(3300);//[FPGA BK3][Adjustable] | ||
+ | axp152.set_dldo1(3300);//[FPGA BK7][Adjustable] | ||
+ | axp152.set_dldo2(3300);//[FPGA BK5][Adjustable] | ||
+ | HAL_Delay(500); | ||
+ | /* USER CODE END SysInit */ | ||
+ | /* Initialize all configured peripherals */ | ||
+ | MX_GPIO_Init(); //GPIO初始化 | ||
+ | MX_FMC_Init(); //FMC初始化 | ||
+ | MX_LTDC_Init(); //LTDC初始化 | ||
+ | MX_TIM12_Init(); //TIM12初始化 | ||
+ | BSP_SDRAM_Init(); //SDRAM初始化 | ||
+ | HAL_TIM_PWM_Start(&htim12,TIM_CHANNEL_1); //定时器使能,通道1 | ||
+ | LED_ON; | ||
+ | |||
+ | //帧缓冲区地址映射二维数组 | ||
+ | for(i = 0;i < LCD_HEIGHT;i ++)address_sdram[i] = LCD_SDRAM_ADDRESS + (i * LCD_WIDTH) * 2; | ||
+ | |||
+ | demo(); //运行弹球demo | ||
+ | LCD_ON; | ||
+ | while (1) | ||
+ | { } | ||
+ | } | ||
</code> | </code> | ||
- | === 2.SDMMC1初始化函数 === | + | === 2.弹球demo函数 === |
<code c> | <code c> | ||
- | void MX_SDMMC1_SD_Init(void) | + | void demo(void){ |
+ | int bg = WHITE; //背景色 | ||
+ | int colo[7] = {RED,BLUE,YELLOW,GREEN,0x7BEF,0x0000,0x03E0};//颜色列表 | ||
+ | int x=35,y=35,xs=1,ys=2; //圆心起始坐标,速度的xy分量 | ||
+ | int oldx,oldy,co=0,i,j; | ||
+ | int r=30; //圆半径 | ||
+ | clear_screen(bg); | ||
+ | draw_circle(x, y, r, RED, 1); | ||
+ | |||
+ | while(1){ | ||
+ | oldx = x; | ||
+ | oldy = y; | ||
+ | x = x + xs; | ||
+ | y = y + ys; | ||
+ | if((x+r)>=480 || (x-r)<=0){ | ||
+ | xs=-1*xs; | ||
+ | x = x + 2*xs; | ||
+ | co++; | ||
+ | if(co==7)co=0; | ||
+ | } | ||
+ | if((y+r)>=272 || (y-r)<=0){ | ||
+ | ys=-1*ys; | ||
+ | y = y + 2*ys; | ||
+ | co++; | ||
+ | if(co==7)co=0; | ||
+ | } | ||
+ | draw_circle(x, y, r, colo[co], 1); //画圆 | ||
+ | for(j = oldx-r-2;j < oldx+r+2;j ++){ | ||
+ | for(i = oldy-r-2;i < oldy+r+2;i ++){ | ||
+ | if(j<1 || j>479 || i<1 || i>271)continue; | ||
+ | if( (int)(x-j)*(x-j) + (int)(y-i)*(y-i) > (int)r*r ){ | ||
+ | *(volatile unsigned short int *) (address_sdram[i] + (j << 1)) = bg; | ||
+ | }}} | ||
+ | HAL_Delay(6); //延时 | ||
+ | } | ||
+ | } | ||
+ | </code> | ||
+ | |||
+ | === 3.LTDC驱动配置 === | ||
+ | <code c> | ||
+ | void MX_LTDC_Init(void) | ||
+ | { | ||
+ | LTDC_LayerCfgTypeDef pLayerCfg = {0}; | ||
+ | LTDC_LayerCfgTypeDef pLayerCfg1 = {0}; | ||
+ | hltdc.Instance = LTDC; | ||
+ | hltdc.Init.HSPolarity = LTDC_HSPOLARITY_AL; //水平同步极性 | ||
+ | hltdc.Init.VSPolarity = LTDC_VSPOLARITY_AL; //垂直同步极性 | ||
+ | hltdc.Init.DEPolarity = LTDC_DEPOLARITY_AL; //数据使能极性 | ||
+ | hltdc.Init.PCPolarity = LTDC_PCPOLARITY_IPC; //像素时钟极性 | ||
+ | hltdc.Init.HorizontalSync = 0; //水平同步宽度 | ||
+ | hltdc.Init.VerticalSync = 0; //垂直同步宽度 | ||
+ | hltdc.Init.AccumulatedHBP = 20; //水平同步后沿宽度 | ||
+ | hltdc.Init.AccumulatedVBP = 9; //垂直同步后沿高度 | ||
+ | hltdc.Init.AccumulatedActiveW = 500;//有效宽度 | ||
+ | hltdc.Init.AccumulatedActiveH = 281;//有效高度 | ||
+ | hltdc.Init.TotalWidth = 524; //总宽度 | ||
+ | hltdc.Init.TotalHeigh = 287; //总高度 | ||
+ | hltdc.Init.Backcolor.Blue = 255; //背景RGB数值,白色 | ||
+ | hltdc.Init.Backcolor.Green = 255; | ||
+ | hltdc.Init.Backcolor.Red = 255; | ||
+ | if (HAL_LTDC_Init(&hltdc) != HAL_OK) | ||
+ | {Error_Handler();} | ||
+ | pLayerCfg.WindowX0 = 0; //屏幕像素宽 | ||
+ | pLayerCfg.WindowX1 = 480; | ||
+ | pLayerCfg.WindowY0 = 0; //屏幕像素高 | ||
+ | pLayerCfg.WindowY1 = 272; | ||
+ | pLayerCfg.PixelFormat = LTDC_PIXEL_FORMAT_RGB565; //屏幕格式 | ||
+ | pLayerCfg.Alpha = 0xff; //透明度,不透明 | ||
+ | pLayerCfg.Alpha0 = 0; //默认透明度 | ||
+ | pLayerCfg.BlendingFactor1 = LTDC_BLENDING_FACTOR1_CA; | ||
+ | pLayerCfg.BlendingFactor2 = LTDC_BLENDING_FACTOR2_CA; | ||
+ | pLayerCfg.FBStartAdress = 0xC0000000; //帧缓冲区起始地址 | ||
+ | pLayerCfg.ImageWidth = 480; //图层宽 | ||
+ | pLayerCfg.ImageHeight = 272; //图层高 | ||
+ | pLayerCfg.Backcolor.Blue = 255; //图层背景RGB数值,白色 | ||
+ | pLayerCfg.Backcolor.Green = 255; | ||
+ | pLayerCfg.Backcolor.Red = 255; | ||
+ | if (HAL_LTDC_ConfigLayer(&hltdc, &pLayerCfg, 0) != HAL_OK) | ||
+ | { Error_Handler();} | ||
+ | } | ||
+ | |||
+ | </code> | ||
+ | === 4.画点函数 === | ||
+ | <code c> | ||
+ | int set_pixel(int x, int y, int color) { | ||
+ | if(x<0 || x>480 || y<0 || y>272)return 0; | ||
+ | *(volatile unsigned short int *) (address_sdram[y] + (x << 1)) = color; | ||
+ | return 1; | ||
+ | } | ||
+ | </code> | ||
+ | === 5.清屏函数 === | ||
+ | <code c> | ||
+ | void clear_screen(int color) | ||
+ | { | ||
+ | int i,j; | ||
+ | for(j = 0;j < LCD_WIDTH;j ++){ | ||
+ | for(i = 0;i < LCD_HEIGHT;i ++){ | ||
+ | *(volatile unsigned short int *) (address_sdram[i] + (j << 1)) = color; | ||
+ | }}} | ||
+ | </code> | ||
+ | === 6.画圆函数 === | ||
+ | <code c> | ||
+ | int draw_circle(int x, int y, int r, int color, int fill) { | ||
+ | int i,j; | ||
+ | if(x<0 || x>480 || y<0 || y>272)return 0; | ||
+ | for(j = x-r;j < x+r;j ++){ | ||
+ | for(i = y-r;i < y+r;i ++){ | ||
+ | if(fill == 1){ | ||
+ | if( (int)(x-j)*(x-j) + (int)(y-i)*(y-i) <= (int)r*r ){ | ||
+ | *(volatile unsigned short int *) (address_sdram[i] + (j << 1)) = color; | ||
+ | } | ||
+ | } | ||
+ | else{ | ||
+ | if( (x-i)*(x-i) + (y-j)*(y-j) >= (r-2)*(r) && (x-i)*(x-i) + (y-j)*(y-j) <= (r+1)*(r) ){ | ||
+ | *(volatile unsigned short int *) (address_sdram[i] + (j << 1)) = color; | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | return 1; | ||
+ | } | ||
</code> | </code> | ||
行 96: | 行 325: | ||
- 把仿真器与iCore4T的SWD调试口相连(直接相连或者通过转接器相连); | - 把仿真器与iCore4T的SWD调试口相连(直接相连或者通过转接器相连); | ||
- 把iCore4T通过Micro USB线与计算机相连,为iCore4T供电; | - 把iCore4T通过Micro USB线与计算机相连,为iCore4T供电; | ||
+ | - 将屏幕连接到4.3寸液晶屏底板上,并将液晶屏底板与iCore4T底板通过排线相连。 | ||
- 打开Keil MDK 开发环境,并打开本实验工程; | - 打开Keil MDK 开发环境,并打开本实验工程; | ||
- 烧写程序到iCore4T上; | - 烧写程序到iCore4T上; | ||
行 101: | 行 331: | ||
==== 六、 实验现象 ==== | ==== 六、 实验现象 ==== | ||
- | * 在,如下图: | + | 有一个小球在屏幕中来回弹,触碰到边界时小球颜色改变。 |