freeelectron 发表于 2022-3-8 17:44

【BLE 5.3无线MCU CH582】3、非阻塞方式点灯

<p>系列文章:</p>

<p><a href="https://bbs.eeworld.com.cn/thread-1195192-1-1.html" target="_blank">【BLE 5.3无线MCU CH582】1、初识CH582开发板(开箱)</a></p>

<p><a href="https://bbs.eeworld.com.cn/thread-1195464-1-1.html" target="_blank">【BLE 5.3无线MCU CH582】2、MounRiver IDE初体验</a></p>

<p>&nbsp;</p>

<p><span style="font-size:26px;">1、前言</span></p>

<p><span style="font-size:16px;">阻塞方式点灯,即就是死等,在等待期间mcu干不了其他事情(中断除外),这种方式不太友好,本文使用非阻塞方式点灯。</span></p>

<p>&nbsp;</p>

<p><span style="font-size:26px;">2、硬件连接</span></p>

<p>&nbsp;开发板上板载了两个LED灯,本文分别将两个灯连接到PB18和PB19上面。</p>

<p>&nbsp;</p>

<p><span style="font-size:26px;">3、思路</span></p>

<p>利用定时器中断,每1ms中断一次,整个系统维护一个tick计数;</p>

<p>记录某一时刻的tick,用A表示,再获取当前的tick,用B表示,如果当前的B-A大于等于500(这里500ms闪烁一次),那么就执行一次led翻转,同时也更新A的值。</p>

<p>&nbsp;</p>

<p><span style="font-size:26px;">4、软件实现</span></p>

<p>(1)利用定时器中断,每1ms中断一次,整个系统维护一个tick计数</p>

<pre>
<code class="language-cpp">static uint32_t Systick=0;

void TimerConfig(void)
{
TMR0_TimerInit( FREQ_SYS / 1000 );                // 设置定时时间 1ms
TMR0_ITCfg( ENABLE, TMR0_3_IT_CYC_END );          // 开启中断
PFIC_EnableIRQ( TMR0_IRQn );
}

uint32_t SystemGetTick(void)
{
return Systick;
}

__INTERRUPT
__HIGH_CODE
void TMR0_IRQHandler( void )      // TMR0 定时中断
{
if ( TMR0_GetITFlag( TMR0_3_IT_CYC_END ) )
{
    TMR0_ClearITFlag( TMR0_3_IT_CYC_END );      // 清除中断标志
    Systick++;
}
}</code></pre>

<p>(2)LED翻转</p>

<pre>
<code class="language-cpp">void LedInit(void)
{
    GPIOB_SetBits( GPIO_Pin_18|GPIO_Pin_19 );
    GPIOB_ModeCfg( GPIO_Pin_18|GPIO_Pin_19, GPIO_ModeOut_PP_5mA );
}

void SystemRun(void)
{
    static uint32_t tick=0;

    if(SystemGetTick()-tick&gt;500)
    {
      tick=SystemGetTick();

      GPIOB_InverseBits(GPIO_Pin_18|GPIO_Pin_19);
    }
}</code></pre>

<p>&nbsp;</p>

<p>(3)主函数轮询</p>

<pre>
<code class="language-cpp">int main()
{
SetSysClock( CLK_SOURCE_PLL_60MHz );
TimerConfig();
LedInit();

while( 1 )
{
      SystemRun();
}
}</code></pre>

<p><span style="font-size:26px;">5、现象</span></p>

<p> &nbsp;</p>

<p>&nbsp;</p>

<p>&nbsp;</p>

<p>&nbsp;</p>

<p>&nbsp;</p>

<p>&nbsp;</p>

Gen_X 发表于 2022-3-9 10:39

<p>不错,这就是系统&ldquo;扫描&rdquo;的意义,很多误差要求不高的控制、告警、甚至通讯,都可以采用这种方式,这样就采用了一个公共时钟,完成了很多不同时间的&ldquo;定时任务&rdquo;。节省了中断资源。也很好的协调了个&ldquo;任务&rdquo;之间的关系。</p>

freeelectron 发表于 2022-3-9 13:52

Gen_X 发表于 2022-3-9 10:39
不错,这就是系统&ldquo;扫描&rdquo;的意义,很多误差要求不高的控制、告警、甚至通讯,都可以采用这种方式 ...

<p>是的哦,整个系统维护一个tick即可。</p>

lugl4313820 发表于 2022-3-11 11:49

<p>直接上TMOS呀,蓝牙有TMOS的,新建一个任务事件就行了。</p>

freeelectron 发表于 2022-3-14 08:56

lugl4313820 发表于 2022-3-11 11:49
直接上TMOS呀,蓝牙有TMOS的,新建一个任务事件就行了。

<p>那个的确可以</p>
页: [1]
查看完整版本: 【BLE 5.3无线MCU CH582】3、非阻塞方式点灯