在使用SPI刷屏时能够完美实现刷屏效果。但加入DMA后效果就如视频链接所示,数据产生错位,但又能马上恢复正常,以下是我的刷屏代码,请求帮助.
- /**
- * @brief 指定区域进行颜色填充
- * @param xs:起始列地址
- * @param ys:起始行地址
- * @param xe:结束列地址
- * @param ye:结束行地址
- * @param color:需要填充的颜色
- * @retval 无
- */
- void LCD_ColorFill(uint16_t xs, uint16_t ys, uint16_t xe, uint16_t ye, uint16_t *color)
- {
- uint8_t count=0; /* 定义传输次数 */
- uint16_t t = 1;
- uint32_t num, num1;
- num = (xe - xs+1) * (ye - ys+1);
- LCD_AddressSet(xs, ys, xe, ye); /* 设置显示窗口 */
- SPI_Cmd(BSP_SPI_PORT, DISABLE); /* 失能SPI */
- SPI_DataSizeConfig(BSP_SPI_PORT, SPI_DataSize_16b); /* 设置SPI数据传输宽度:16bit */
- BSP_SPI_CS_Clr();
- SPI_Cmd(BSP_SPI_PORT, ENABLE); /* 使能SPI */
- while (t)
- {
- if (num > 25600)
- {
- num -= 25600;
- num1 = 25600;
- count++;
- }
- else
- {
- t = 0;
- num1 = num;
- if(count!=0)
- {
- color += (25600*count); /* 地址跟随自增 */
- }
- }
- BSP_DMA_ConfigC(BSP_DMA_Channel, (uint32_t)&BSP_SPI_PORT->DR, (uint32_t)color, num1);
- SPI_I2S_DMACmd(BSP_SPI_PORT, SPI_I2S_DMAReq_Tx, ENABLE);
- BSP_DMA_Enable();
- while (1)
- {
- if (DMA_GetFlagStatus(BSP_DMAy_Streamx, BSP_SPI_DMA_TX_FLAG) != RESET) /* 等待通道传输完成 */
- {
- DMA_ClearFlag(BSP_DMAy_Streamx, BSP_SPI_DMA_TX_FLAG); /* 清除通道传输完成标志 */
- break;
- }
- }
- }
- while (SPI_I2S_GetFlagStatus(BSP_SPI_PORT, SPI_I2S_FLAG_BSY) == SET); /* 检测发送完成SPI外设处于空闲状态 */
- BSP_SPI_CS_Set();
- SPI_Cmd(BSP_SPI_PORT, DISABLE); /* 失能SPI */
- SPI_DataSizeConfig(BSP_SPI_PORT, SPI_DataSize_8b); /* 设置SPI数据传输宽度:8bit */
- SPI_Cmd(BSP_SPI_PORT, ENABLE); /* 使能SPI */
- }
复制代码 |