今天调LCD使用Lcd_ColorBox进行清屏。但是出现了二次清屏的时候总是卡死的问题,于是尝试解决。首先Lcd矩形填充函数定义如下。
/**********************************************
函数名:Lcd矩形填充函数
入口参数:xStart x方向的起始点
ySrart y方向的终止点
xLong 要选定矩形的x方向长度
yLong 要选定矩形的y方向长度
返回值:无
***********************************************/
void Lcd_ColorBox(unsigned int xStart,unsigned int yStart,unsigned int xLong,unsigned int yLong,unsigned int Color)
{
unsigned int temp;
uint8_t * data_color;
data_color=(uint8_t *)malloc(sizeof(uint8_t)* xLong);
BlockWrite(xStart,xStart+xLong-1,yStart,yStart+yLong-1);
SPI_CS(0);
LCD_WriteByteSPI(0X72);
for (temp=0; temp<xLong*yLong; temp++)
{
data_color[2*(temp%xLong)] = Color>>8;
data_color[2*(temp%xLong)+1] = Color;
if((temp+1) % xLong == 0)
HAL_SPI_Transmit(&hspi4,data_color,2*xLong,10);
}
SPI_CS(1);
free(data_color);
}
调试通过就会显示卡在了BlockWrite(xStart,xStart+xLong-1,yStart,yStart+yLong-1);这一条语句里。
显示出来就是不断地在HardFault_Handler里。
void HardFault_Handler(void)
{
/* USER CODE BEGIN HardFault_IRQn 0 */
/* USER CODE END HardFault_IRQn 0 */
while (1)
{
/* USER CODE BEGIN W1_HardFault_IRQn 0 */
/* USER CODE END W1_HardFault_IRQn 0 */
}
}
看网上资料说大多数是产生了堆栈溢出等问题,开始我还以为是数组定义的问题,用malloc动态分配以后并没有什么改变。最后单独调试发现其中一旦出现重复的相同颜色清屏如下
Lcd_ColorBox(0,0,XSIZE_PHYS,YSIZE_PHYS,White);
Lcd_ColorBox(0,0,XSIZE_PHYS,YSIZE_PHYS,White);就会出现这个问题。所以解决方式就是先用别的颜色清屏再换回白色清屏,因为速度很快并不会影响实际的清屏效果。
Lcd_ColorBox(0,0,XSIZE_PHYS,YSIZE_PHYS,White);
Lcd_ColorBox(0,0,XSIZE_PHYS,YSIZE_PHYS,Black);
Lcd_ColorBox(0,0,XSIZE_PHYS,YSIZE_PHYS,White);
这样就解决了。
但具体产生这个问题的原因并没有分析出来,如果有了解的大神欢迎评论区讨论解答!