<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[FR801xH 硬件定时器能支持us级精度吗，如何支持，目前80us定时不准]]></title><description><![CDATA[<p>参照demo及文档使用定时器有以下几个疑问，希望知到的大佬能解答？</p>
<p>1、使用us级定时时，目前测试80us 和 160us，while循环中直接调用接口函数uint32_t timer_get_current_value(uint32_t timer_addr)获取并打印到的当前计数值非线性递减，而是在定时范围内在随机值，这正常吗？</p>
<p>2、开启中断后，定时80us，在中断中进行IO翻转，通过示波器测量，80us在脉冲实际上变成200us左右在脉冲。每次进中断的间隔，通过打印计数也不准。</p>
<p>3、单次计时模式和周期计时模式的区别是否仅仅是重装定时值的区别，无论哪种模式，中断都会一直进（目前测试是这样，中断标志位每次进中断都会清）。</p>
<p>4、定时器初始化中关于100us以下在定时限制已经注释，上述现象一样存在，目前需求是准确的us级定时，想知道如何实现<br />
uint8_t timer_init(uint32_t timer_addr, uint32_t count_us, uint8_t run_mode)<br />
{<br />
uint8_t sysclk;<br />
uint16_t count;<br />
uint8_t prescale;</p>
<p>//    if(count_us &lt; 100)<br />
//    {<br />
//        return false;<br />
//    }</p>
<pre><code>prescale = timer_calc_prescale(count_us);
if(prescale == TIMER_PRESCALE_MAX)
{
    return false;
}

sysclk = system_get_pclk_config();
if(prescale == TIMER_PRESCALE_1)
{
    count = count_us*sysclk;
}
else if(prescale == TIMER_PRESCALE_16)
{
    count = (count_us * sysclk) &gt;&gt; 4;
}
else if(prescale == TIMER_PRESCALE_256)
{
    count = (count_us * sysclk) &gt;&gt; 8;
}

volatile struct timer *timerp = (volatile struct timer *)timer_addr;

timerp-&gt;control.count_enable = 0;
timerp-&gt;control.count_mode = run_mode;
timerp-&gt;control.pselect = prescale;
timerp-&gt;interrupt_clear.data = 0x01;
timerp-&gt;load_value.load = count;

return true;
</code></pre>
<p>}</p>
]]></description><link>http://www.freqchip.net:4567/topic/848/fr801xh-硬件定时器能支持us级精度吗-如何支持-目前80us定时不准</link><generator>RSS for Node</generator><lastBuildDate>Sat, 11 Apr 2026 14:20:20 GMT</lastBuildDate><atom:link href="http://www.freqchip.net:4567/topic/848.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 09 Nov 2023 02:44:41 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to FR801xH 硬件定时器能支持us级精度吗，如何支持，目前80us定时不准 on Invalid Date]]></title><description><![CDATA[<p>参照demo及文档使用定时器有以下几个疑问，希望知到的大佬能解答？</p>
<p>1、使用us级定时时，目前测试80us 和 160us，while循环中直接调用接口函数uint32_t timer_get_current_value(uint32_t timer_addr)获取并打印到的当前计数值非线性递减，而是在定时范围内在随机值，这正常吗？</p>
<p>2、开启中断后，定时80us，在中断中进行IO翻转，通过示波器测量，80us在脉冲实际上变成200us左右在脉冲。每次进中断的间隔，通过打印计数也不准。</p>
<p>3、单次计时模式和周期计时模式的区别是否仅仅是重装定时值的区别，无论哪种模式，中断都会一直进（目前测试是这样，中断标志位每次进中断都会清）。</p>
<p>4、定时器初始化中关于100us以下在定时限制已经注释，上述现象一样存在，目前需求是准确的us级定时，想知道如何实现<br />
uint8_t timer_init(uint32_t timer_addr, uint32_t count_us, uint8_t run_mode)<br />
{<br />
uint8_t sysclk;<br />
uint16_t count;<br />
uint8_t prescale;</p>
<p>//    if(count_us &lt; 100)<br />
//    {<br />
//        return false;<br />
//    }</p>
<pre><code>prescale = timer_calc_prescale(count_us);
if(prescale == TIMER_PRESCALE_MAX)
{
    return false;
}

sysclk = system_get_pclk_config();
if(prescale == TIMER_PRESCALE_1)
{
    count = count_us*sysclk;
}
else if(prescale == TIMER_PRESCALE_16)
{
    count = (count_us * sysclk) &gt;&gt; 4;
}
else if(prescale == TIMER_PRESCALE_256)
{
    count = (count_us * sysclk) &gt;&gt; 8;
}

volatile struct timer *timerp = (volatile struct timer *)timer_addr;

timerp-&gt;control.count_enable = 0;
timerp-&gt;control.count_mode = run_mode;
timerp-&gt;control.pselect = prescale;
timerp-&gt;interrupt_clear.data = 0x01;
timerp-&gt;load_value.load = count;

return true;
</code></pre>
<p>}</p>
]]></description><link>http://www.freqchip.net:4567/post/1800</link><guid isPermaLink="true">http://www.freqchip.net:4567/post/1800</guid><dc:creator><![CDATA[huluhuluhulu]]></dc:creator><pubDate>Invalid Date</pubDate></item><item><title><![CDATA[Reply to FR801xH 硬件定时器能支持us级精度吗，如何支持，目前80us定时不准 on Invalid Date]]></title><description><![CDATA[<p>你要实现什么功能</p>
]]></description><link>http://www.freqchip.net:4567/post/1811</link><guid isPermaLink="true">http://www.freqchip.net:4567/post/1811</guid><dc:creator><![CDATA[Mars]]></dc:creator><pubDate>Invalid Date</pubDate></item><item><title><![CDATA[Reply to FR801xH 硬件定时器能支持us级精度吗，如何支持，目前80us定时不准 on Invalid Date]]></title><description><![CDATA[<p>希望实现的功能是，通过定时器实现us级延时</p>
<p>如<br />
在任务中开启定时器，定时60us后，在while死循环阻塞，循环中读取定时器当前定时值，定时值为0则退出死循环完成60us延时，目前通过该逻辑的代码无法实现。（不使用延时函数co_delay_10us，实际使用时，误差太大超过10us。）</p>
]]></description><link>http://www.freqchip.net:4567/post/1819</link><guid isPermaLink="true">http://www.freqchip.net:4567/post/1819</guid><dc:creator><![CDATA[huluhuluhulu]]></dc:creator><pubDate>Invalid Date</pubDate></item><item><title><![CDATA[Reply to FR801xH 硬件定时器能支持us级精度吗，如何支持，目前80us定时不准 on Invalid Date]]></title><description><![CDATA[<p>本来我也想用80us定时中断来做遥控器的发送。可是，常常丢包，接着，我把80us做中断分个240us做驱动蜂鸣器，发现蜂鸣器的声音会有破音。所以，你想80us定时准可能有点难，要FAE动到底层。</p>
]]></description><link>http://www.freqchip.net:4567/post/1821</link><guid isPermaLink="true">http://www.freqchip.net:4567/post/1821</guid><dc:creator><![CDATA[xiexie]]></dc:creator><pubDate>Invalid Date</pubDate></item><item><title><![CDATA[Reply to FR801xH 硬件定时器能支持us级精度吗，如何支持，目前80us定时不准 on Invalid Date]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="http://www.freqchip.net:4567/uid/1126">@xiexie</a> 用中断还是可以做在，你把主频调高到48M，代码输入段指定到ram，优化代码，尽量直接操作寄存器。</p>
]]></description><link>http://www.freqchip.net:4567/post/1822</link><guid isPermaLink="true">http://www.freqchip.net:4567/post/1822</guid><dc:creator><![CDATA[huluhuluhulu]]></dc:creator><pubDate>Invalid Date</pubDate></item></channel></rss>