定时器中断Timer里控制LCD显示,会有杂点出现在LCD上

2019-10-11 15:55发布

1. main函数里执行LCD_Clear(LIGHTBLUE),将LCD画成LIGHTBLUE颜 {MOD};
2. 按照定时器中断例子,main函数初始化Tim3: Timerx_Init(5000,7199);
3. 中断处理函数 void TIM3_IRQHandler(void)
{                 
 if(TIM3->SR&0X0001)//溢出中断
 {
   LCD_ShowString(40, 40, "Tim3");                           
 }      
 TIM3->SR&=~(1<<0);//清除中断标志位     
}

4. main函数
int main(void)
{
 Stm32_Clock_Init(9);//系统时钟设置
 delay_init(72);  //延时初始化
  LCD_Init();
  LCD_Clear(LIGHTBLUE);
 Timerx_Init(5000,7199);
 while(1)
 {  
LCD_ShowString(20, 20, "Main");
 }
}

现在出现的状况是Timer里显示的"Tim3"字串周围有很多杂点。
这是什么原因啊?
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
11条回答
正点原子
1楼-- · 2019-10-12 20:52
回复【7楼】smithlin:
---------------------------------
那就怪了.
jtag仿真一下吧.
smithlin
2楼-- · 2019-10-12 23:26
原子,我大概找到有杂点的原因了?
1. 主线程main里的LCD_Clear(LIGHTBLUE)以及LCD_ShowString(20,20,"Main");  与Tim3里面的LCD_ShowString(40, 40, "Tim3");是并行的。
2. 也就是说main和Tim3在并行的调用:
1)LCD_SetCursor: 写寄存器R32,R33, 
2)LCD_WriteRAM_Prepare: 写寄存器R34,
3)LCD_WR_DATA(POINT_COLOR); 注意:POINT_COLOR是全局变量,

所以,当你真正LCD_WR_DATA画点的时候,R32, R33寄存器里的坐标值可能已经不是之前设置的,而被另一个线程的调用而更改了。而且POINT_COLOR是全局变量,也会是同样的状况,也可能被更改了。所以导致在不该画点的出现花点了。

针对这个问题,如果有操作系统的话,我想可以通过互斥信号量解决。
在目前这样没有系统的情况下,有没有什么解决的方法啊?
正点原子
3楼-- · 2019-10-13 03:39
回复【9楼】smithlin:
---------------------------------
嗯,应该是你说的原因.
方法就是不让中断打断你.
smithlin
4楼-- · 2019-10-13 05:36
 精彩回答 2  元偷偷看……
pjdu
5楼-- · 2019-10-13 08:53
请问没有使用OS的情况下具体是怎么解决的?

一周热门 更多>