STM8G-学习 发表于 2024-12-20 14:59:18

8G1K07-QFN20程序,定时器同时使用问题

<p>问题:我想用uart2输出数据,定时器1定1ms输出一次数据,定时器0计数外部输入,不使能定时器0中断的时候,可以输出数据,使能定时器0中断后就不输出数据了,不知道为什么不能同时使用。</p>
<p>void        Timer_config(void)<br />
{<br />
TMOD =0x00;<br />
TL1 = 0x66;                                 //65536-11.0592M/12/1000<br />
TH1 = 0xfc;</p>
<pre><code>TR1 = 1;                                    //启动定时器
ET1 = 1;                                    //使能定时器中断
</code></pre>
<p>}</p>
<p>void T_count(void)<br />
{<br />
TMOD = 0x04;                              //外部计数模式,自动重载值<br />
TL0 = 0xff;<br />
TH0 = 0xff;<br />
TR0 = 1;                                    //启动定时器<br />
//ET0 = 1;                                    //使能定时器中断<br />
}</p>
<p>void Timer0_ISR_Handler (void) interrupt TMR0_VECTOR                //进中断时已经清除标志<br />
{<br />
READ_COUNT0++;<br />
}</p>
<p>void Timer1_ISR_Handler (void) interrupt TMR1_VECTOR                //进中断时已经清除标志<br />
{</p>
<pre><code>   READ_COUNT1=TH0;
   READ_COUNT1=READ_COUNT1&lt;&lt;8+TL0+READ_COUNT0*65536;
   READ_COUNT0=0;
   TH0=0;TL0=0;
   printf(&quot;%d\r&quot;,READ_COUNT1);
   READ_COUNT1=0;
</code></pre>
<p>}</p>
<p>/******************** task A *************************<em>/<br />
void main(void)<br />
{<br />
EAXSFR();                /</em> 扩展寄存器访问使能 */<br />
GPIO_config();<br />
UART_config();<br />
UART_config();<br />
Timer_config();<br />
T_count();<br />
EA = 1;</p>
<pre><code>printf(&quot;****************printf test********************** \r\n&quot;);

while (1)//改为1ms计数一次判断高低电平
{

}
</code></pre>
<p>}</p>
<p><img src="data/attachment/forum/202412/20/145634wgyhyhw3geg7mcq7.png" alt="image.png" title="image.png" />定时器0 开启ET0=1;后情况</p>
<p><img src="data/attachment/forum/202412/20/145809di5kkl5kllk5i3rz.png" alt="image.png" title="image.png" />定时器0 屏蔽 //ET0=1;后情况</p>

DebugLab 发表于 2024-12-20 15:15:37

修改中断优先级试试

STM8G-学习 发表于 2024-12-20 15:16:40

DebugLab 发表于 2024-12-20 15:15
修改中断优先级试试

好的,我看看,谢谢

乘风飞扬 发表于 2024-12-20 15:38:20

<p>在中断里调用串口打印功能,要注意避免相互锁死。</p>
<p>如果在A中断里发送,而判断标志又是在B中断里清除,并且两个中断优先级又相同的话就会相互锁死。</p>
<p>A中断需要等待B中断执行后才能继续往下执行,B中断需要等待A中断执行结束后才能触发。</p>
<p>还是不行的话请提供可以复现问题的,最简化的,完整的项目程序,这样才好分析。</p>

STM8G-学习 发表于 2024-12-20 16:25:14

乘风飞扬 发表于 2024-12-20 15:38
在中断里调用串口打印功能,要注意避免相互锁死。
如果在A中断里发送,而判断标志又是在B中断里清除,并且 ...

好的,谢谢您,我正在测。

STM8G-学习 发表于 2024-12-20 17:04:54

STM8G-学习 发表于 2024-12-20 15:16
好的,我看看,谢谢

谢谢,已经可以了就是打印输出数据有正有负不知道为什么,我的数据时u16格式的。

STM8G-学习 发表于 2024-12-20 17:06:35

<p><img src="data/attachment/forum/202412/20/170459ne2kwk28bv2f2pbf.png" alt="image.png" title="image.png" /><br />
<img src="data/attachment/forum/202412/20/170538swvpkmk11zv9pa5w.png" alt="image.png" title="image.png" />按道理都应该是正数才对。不应该有负数,而且数据应该稳定不应该有大有小的。</p>

STM8G-学习 发表于 2024-12-20 17:07:32

乘风飞扬 发表于 2024-12-20 15:38
在中断里调用串口打印功能,要注意避免相互锁死。
如果在A中断里发送,而判断标志又是在B中断里清除,并且 ...

您好已经可以了,谢谢您,就是输出数据不对,请有时间也帮我看看吧。

乘风飞扬 发表于 2024-12-20 17:18:44

STM8G-学习 发表于 2024-12-20 17:07
您好已经可以了,谢谢您,就是输出数据不对,请有时间也帮我看看吧。

使用printf输出参考这个帖子:
printf函数 的 格式参数; USB接口 使用 printf 打印数据
https://www.stcaimcu.com/forum.php?mod=viewthread&tid=6864
(出处: 国芯技术交流网站)

STM8G-学习 发表于 2024-12-25 09:40:12

STM8G-学习 发表于 2024-12-20 17:07
您好已经可以了,谢谢您,就是输出数据不对,请有时间也帮我看看吧。
页: [1] 2
查看完整版本: 8G1K07-QFN20程序,定时器同时使用问题