|
|
楼主 |
发表于 2026-6-26 15:55:18
|
显示全部楼层
我简单做了个DEMO,波形是能显示处理出来,但是波形滚动起来会有闪烁,不知道是什么问题。
一开始用了A、B两个缓冲区来做,以为闪烁是在显示B缓冲区时操作bte copy导致的,就又加了两个缓冲区,
来保证显示其中一个缓冲区时,不会涉及当前缓冲区的操作,但还是有闪烁。
以下是我的main函数
- int main(void)
- {
- /* System Clocks Configuration */
- RCC_Configuration();
- delay_init(72);
- GPIO_Configuration();
- NVIC_Configuration();
- SPI_Peripheral_Init();
- TIM2_Init();
- /* Enable the FSMC Clock */
- RCC_AHBPeriphClockCmd(RCC_AHBPeriph_FSMC, ENABLE);
- delay_ms(1);
- FSMC_LCD_Init_H();
- for(i = 0; i<71; i++)
- {
- coordinateX[i] = 50 + i*10;
- coordinateY[i] = i;
- }
- /*RA8889初始化出现彩虹条*/
- RA8889_Initial();
- Enable_Vsync_Interrupt();
- // Page_Render_001();
- /*用黑色背景填充 缓冲区A*/
- BTE_Solid_Fill(bufferA_addr, canvas_image_width, 0, 0, RGB565_black, LCD_width, LCD_legth);
- /*用黑色背景填充 缓冲区B*/
- BTE_Solid_Fill(bufferB_addr, canvas_image_width, 0, 0, RGB565_black, LCD_width, LCD_legth);
- /*用黑色背景填充 缓冲区C*/
- BTE_Solid_Fill(bufferC_addr, canvas_image_width, 0, 0, RGB565_black, LCD_width, LCD_legth);
- /*用黑色背景填充 缓冲区D*/
- BTE_Solid_Fill(bufferD_addr, canvas_image_width, 0, 0, RGB565_black, LCD_width, LCD_legth);
- Canvas_Image_Start_address(bufferA_addr);
- random_num = rand() % 100;
- Draw_Line(RGB565_blue, 0, random_num, 7, 100);
- while(1)
- {
- if(updateCurve == 1)
- {
- updateCurve = 0;
- last_random = random_num;
- random_num = rand() % 100;
- // random_num = cntX*5;
- if(cntX%4 == 0)
- {
- /*把缓冲区A复制到缓冲区B*/
- BTE_Memory_Copy(
- bufferA_addr, //S0 数据源地址,当前显示区
- 800*2, //S0行宽
- 0, 0, //S0窗口左上角
- 0,0,0,0, //S1未使用
- bufferB_addr, //D 目标地址,后台缓冲区
- 800*2, //D行宽
- 8, 0, //D窗口左上角
- 0x0c, //ROP = S0 直接复制
- 500,100 //拷贝尺寸
- );
- /*在缓冲区B画新线*/
- Canvas_Image_Start_address(bufferB_addr);
- Draw_Line(RGB565_blue, 0, random_num, 7, last_random);
- Check_Vsync_finished();
- /*显示缓冲区A*/
- Main_Image_Start_Address(bufferA_addr);
- /*清缓冲区D*/
- BTE_Solid_Fill(bufferD_addr, canvas_image_width, 0, 0, RGB565_black, LCD_width, LCD_legth);
- }
- else if(cntX%4 == 1)
- {
- /*把缓冲区B右移到缓冲区C*/
- BTE_Memory_Copy(
- bufferB_addr, //S0 数据源地址,当前显示区
- 800*2, //S0行宽
- 0, 0, //S0窗口左上角
- 0,0,0,0, //S1未使用
- bufferC_addr, //D 目标地址,后台缓冲区
- 800*2, //D行宽
- 8, 0, //D窗口左上角
- 0x0c, //ROP = S0 直接复制
- 500,100 //拷贝尺寸
- );
- /*在缓冲区C画*/
- Canvas_Image_Start_address(bufferC_addr);
- Draw_Line(RGB565_blue, 0, random_num, 7, last_random);
- Check_Vsync_finished();
- /*显示缓冲区B*/
- Main_Image_Start_Address(bufferB_addr);
- /*清缓冲区A*/
- BTE_Solid_Fill(bufferA_addr, canvas_image_width, 0, 0, RGB565_black, LCD_width, LCD_legth);
- }
- else if(cntX%4 == 2)
- {
- /*把缓冲区C 复制到缓冲区D*/
- BTE_Memory_Copy(
- bufferC_addr, //S0 数据源地址,当前显示区
- 800*2, //S0行宽
- 0, 0, //S0窗口左上角
- 0,0,0,0, //S1未使用
- bufferD_addr, //D 目标地址,后台缓冲区
- 800*2, //D行宽
- 8, 0, //D窗口左上角
- 0x0c, //ROP = S0 直接复制
- 500,100 //拷贝尺寸
- );
- /*在缓冲区D画*/
- Canvas_Image_Start_address(bufferD_addr);
- Draw_Line(RGB565_blue, 0, random_num, 7, last_random);
- Check_Vsync_finished();
- /*显示缓冲区C*/
- Main_Image_Start_Address(bufferC_addr);
- /*清缓冲区B*/
- BTE_Solid_Fill(bufferB_addr, canvas_image_width, 0, 0, RGB565_black, LCD_width, LCD_legth);
- }
- else if(cntX%4 == 3)
- {
- /*把缓冲区D 复制到缓冲区A*/
- BTE_Memory_Copy(
- bufferD_addr, //S0 数据源地址,当前显示区
- 800*2, //S0行宽
- 0, 0, //S0窗口左上角
- 0,0,0,0, //S1未使用
- bufferA_addr, //D 目标地址,后台缓冲区
- 800*2, //D行宽
- 8, 0, //D窗口左上角
- 0x0c, //ROP = S0 直接复制
- 500,100 //拷贝尺寸
- );
- /*在缓冲区A画*/
- Canvas_Image_Start_address(bufferA_addr);
- Draw_Line(RGB565_blue, 0, random_num, 7, last_random);
- Check_Vsync_finished();
- /*显示缓冲区D*/
- Main_Image_Start_Address(bufferD_addr);
- /*清缓冲区C*/
- BTE_Solid_Fill(bufferC_addr, canvas_image_width, 0, 0, RGB565_black, LCD_width, LCD_legth);
- }
- cntX++;
- if(cntX == 4)
- {
- cntX = 0;
- }
- }
- }
- }
复制代码 |
|