请教一下各位高手 STM32 F103 TIM3中断里 LCD显示的奇怪问题? 有图

和如 2021-03-26 08:42:57
在中断里面 用LCD_ShowIntNum 显示 编码器的数值,结果出现了一个奇怪的现象,每次选择编码器后显示数字,数字的最后一个字就会
出现乱码,显示不完整,自己找了一下原因,现在发现 在中断里面显示每次都是最后显示的数字出问题,如代码中显示,第一个LCD_ShowIntNum 显示正确,怎么旋转编码器都ok,但第二个LCD_ShowIntNum显示的就肯定出现如图显示的乱码,感觉像是执行LCD显示时间不够,但是在中断函数最后加了delay延迟等带LCD显示完,也不行。
另外把第一个和第二个LCD_ShowIntNum互换前后,结果也是最后一个LCD_ShowIntNum显示出现乱码,这样LCD_ShowIntNum本身应该是没有问题的

发个帖子请各位高手指导一下,确实没招了,请各位不惜赐教,谢谢


void TIM3_IRQHandler(void)
{
/* USER CODE BEGIN TIM3_IRQn 0 */


if(LL_TIM_IsActiveFlag_CC1(TIM3) == SET)
{
uwICValue2=LL_TIM_GetCounter(TIM3)/4;
LL_TIM_OC_SetCompareCH1(TIM1, uwICValue2);
LCD_ShowIntNum(180,100,uwICValue2,sizeof(uwICValue2),WHITE,BLACK,32);
LCD_ShowIntNum(150, 20,22,sizeof(22),WHITE,BLACK,32);//显示测试用
}

LL_TIM_ClearFlag_CC1(TIM3);
LL_TIM_EnableIT_CC1(TIM3);


/* USER CODE END TIM3_IRQn 0 */
/* USER CODE BEGIN TIM3_IRQn 1 */

/* USER CODE END TIM3_IRQn 1 */
}


...全文
1680 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
和如 2021-04-07
  • 打赏
  • 举报
回复
好的,谢谢解答
IamReason 2021-04-06
  • 打赏
  • 举报
回复
引用 19 楼 和如 的回复:
[quote=引用 17 楼 IamReason 的回复:]不要把显示放在中断里
中断里改变显存内容
主循环里显示显存内容

再小的系统都要这么作

大师可以在详细一点吗?为什么要这样做,我现在调整了一下,貌似也可以正常显示啊?[/quote]

你这个应用无所谓,如果复杂点的应用,需要改变显示的地方很多,那显示时序就乱了
很可能你在执行显示程序时,被中断然后显示另一段信息
和如 2021-04-05
  • 打赏
  • 举报
回复
引用 17 楼 IamReason 的回复:
不要把显示放在中断里 中断里改变显存内容 主循环里显示显存内容 再小的系统都要这么作
大师可以在详细一点吗?为什么要这样做,我现在调整了一下,貌似也可以正常显示啊?
luj_1768 2021-04-02
  • 打赏
  • 举报
回复
字符显示行不统一:字符都是按行显示的,你设计的显示、行排列是乱的。如果需要按你的设计显示,可能需要一些把屏幕分成不同区域的设计。
IamReason 2021-04-01
  • 打赏
  • 举报
回复
不要把显示放在中断里
中断里改变显存内容
主循环里显示显存内容

再小的系统都要这么作
和如 2021-03-31
  • 打赏
  • 举报
回复
谢谢各位的回复,现在问题我找到解决方法了。
和如 2021-03-30
  • 打赏
  • 举报
回复
没人大神能解答这个问题了吗?
Akira799 2021-03-30
  • 打赏
  • 举报
回复
56+56+56+65+5656655656665+56+56+5656+89+56+56+
和如 2021-03-29
  • 打赏
  • 举报
回复
我的TIM2是定时触发,主要是显示ADC的值,TIM3是编码器EC11触发。我感觉这两个的冲突可能性不会大的啊,我自己也觉得是两个中断关系没处理好,但又想不出什么办法了
Ayyee 2021-03-29
  • 打赏
  • 举报
回复
引用 9 楼 和如 的回复:
不过还是想弄清楚为什么不能,我就没想明白这个,我尝试了很多种方法,我直接在TIM3的中断服务函数里面把TIM2的中断关了,等TIM3里面的LCD运行完毕,在打开TIM3中断,按道理来说这样就不会影响LCD写屏了啊,但为什么还是会影响呢?我试过把TIM2里面的LCD注释掉,但不关不TIM2,这样LCD也显示正常呢?? 还是没搞懂原理,我程序就只有这两个中断,还有那里会影响呢? 谢谢
你的中断用的不是很好,有一楼说的比较好,定时器中断里面放标志位,然后用标志位来处理显示会比较好。中断不建议干活,这个你可以搜专题。据你排查,两个中断肯定是互相影响了。在你看来,你是让一个执行完了,再开另一个中断,但会不会存在,你进2的时候,其实差不多同步快触发了3的中断?比较极限,但存在。看下你两个定时器触发的时间吧。
xws245925587 2021-03-29
  • 打赏
  • 举报
回复
中断有优先级,高优先级可以抢占低优先级
和如 2021-03-28
  • 打赏
  • 举报
回复
应该是5楼老师说的问题,我mian里面倒是没有放代码是放在TIM2里面 ,但是我在TIM3触发的适合把TIM2关了还是不行 这是TIM2 的代码 里面只要加了LCD_Show TIM3编码器旋转时显示的数字就会有乱码。但是只要把LCD_Show 注释掉 就没问题。
void TIM2_IRQHandler(void)
{
  /* USER CODE BEGIN TIM2_IRQn 0 */
	LL_TIM_DisableIT_CC1(TIM2);
	LCD_ShowString(73,35,"0.00",CYAN,BLACK,24,0);
	 LL_TIM_ClearFlag_CC1(TIM2);
	 LL_TIM_EnableIT_CC1(TIM2);
  /* USER CODE END TIM2_IRQn 0 */
  /* USER CODE BEGIN TIM2_IRQn 1 */

  /* USER CODE END TIM2_IRQn 1 */
}
我在TIM3里面用: 先关:LL_TIM_DisableIT_CC1(TIM2); LL_TIM_DisableCounter(TIM2); LL_TIM_DisableIT_CC1(TIM3); 再开: LL_TIM_EnableIT_CC1(TIM3); LL_TIM_EnableCounter(TIM2); LL_TIM_EnableIT_CC1(TIM2); 这样处理还是问题一样,请各位帮忙看看呢
seedundersnow 2021-03-28
  • 打赏
  • 举报
回复
大概是硬件访问的进程安全问题。 猜测是MAIN进程和中断都有访问LCD,中断改变了LCD的寄存器,回到MAIN没有恢复成原来的值,导致MAIN的LCD访问产生未知结果。
和如 2021-03-28
  • 打赏
  • 举报
回复
还有一个问题,两处中断写了LCD,设置了中断的优先级单片机不应该先执行完一个中断里面的LCD 在执行另外一个中断里面的LCD吗? main函数里面也是一行LCD接着一行LCD,为什么有没有出现乱码呢?不解???
和如 2021-03-28
  • 打赏
  • 举报
回复
不过还是想弄清楚为什么不能,我就没想明白这个,我尝试了很多种方法,我直接在TIM3的中断服务函数里面把TIM2的中断关了,等TIM3里面的LCD运行完毕,在打开TIM3中断,按道理来说这样就不会影响LCD写屏了啊,但为什么还是会影响呢?我试过把TIM2里面的LCD注释掉,但不关不TIM2,这样LCD也显示正常呢?? 还是没搞懂原理,我程序就只有这两个中断,还有那里会影响呢? 谢谢
和如 2021-03-28
  • 打赏
  • 举报
回复
初学STM32
forget345 2021-03-28
  • 打赏
  • 举报
回复
无语,你TIM2 和 TIM3 都有 写 LCD ? 肯定不能这样做,劝你 LCD 操作都放 main 里,定时器里放标志位,让main读标志位来 操作 LCD
和如 2021-03-27
  • 打赏
  • 举报
回复
但是我看网上的代码,也有把LCD显示放中断里面的操作。这个是需要其他特殊的处理吗?
forget345 2021-03-27
  • 打赏
  • 举报
回复
耗时代码不可放中断,你都猜测是运行时间不够了,还放定时中断里,还加延时,加了延时它就不中断了吗?怎么想的?定时中断里加延时能推迟定时中断?
forget345 2021-03-27
  • 打赏
  • 举报
回复
中断时间够长就可以,你设成2秒钟试试,但不建议这样做
加载更多回复(1)

27,375

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧