金牌会员
 
- 积分
- 1126
- 金钱
- 1126
- 注册时间
- 2015-12-20
- 在线时间
- 119 小时
|
10金钱
硬件平台:STM32F103C8T6 + 1.44寸TFT屏(128*128)
软件平台:IAR for ARM 8.40.2
如果按网上例程,设置画图区域后,基本上每画一个点都要通过SPI发送一次。我使用HAL库,效率恨低。
为了加快速度,采用缓冲,DMA进行批量传输。
在DMA传输过程中,主要程序仍在运行,会出现传输没完成,再次执行下一个显示的指令(SPI传输)。
为了避免冲突,我设置一个全局变量Flag,启动DMA传输前把变量设置为繁忙状态。
传输完成回调函数中设为空闲。
void HAL_SPI_TxCpltCallback(SPI_HandleTypeDef *hspi)
{
if (hspi == &hspi2)
{
HAL_SPI_DMAStop(&hspi2); //停止DMA传输
Scr_CS_OFF; //SPI器件线选关闭
Flag = FREE; //标志位为空闲
}
每次显示都需要先设置显示区域,我为了防止冲突,先检查标志位,如非空闲就继续循环,直到空闲为止。
void LCD7735_SetWindows(uint8_t xStart, uint8_t yStart,uint8_t xEnd,uint8_t yEnd)
{
while (Flag==BUSY) {__NOP;__NOP;__NOP;__NOP;}
......
}
问题,实际运行中发现第一次运行正常,执行过一次DMA后,一直卡死在这循环中
直接用IAR调试,发现一个怪异现象:
让程序运行完回调函数,Flag的确为空闲,但检查一直不通过。
|
|