打印
[RISC-V MCU 应用开发]

【RISC-V MCU CH32V103测评】3. 会呼吸的灯

[复制链接]
446|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
昱枫|  楼主 | 2020-11-28 16:59 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 昱枫 于 2020-11-28 17:08 编辑


最近学习关于一种对象的思维进行MCU的开发
写程序就有点像写系统那种

目前写了一个输出的控制的API
以LED控制为实例

1.定义输出对象功能如下

<blockquote>#ifndef __SIG_OUTPUT_H__


#include "sig_output.h"

#define SIG_OUTPUT_NUM 100

SIG_OUTPUT_MGR  *sigOutputMgr[SIG_OUTPUT_NUM]={NULL};

uint32_t u32tick=0;

void runTick(void)
{
    u32tick++;
}

uint32_t getTickNowMs(void)
{
    return u32tick;
}
uint32_t getTickRunMs(uint32_t u32StartTick)
{
    uint32_t u32RunTick=0;
    if(u32StartTick > getTickNowMs())
    {
        u32RunTick = (0xFFFFFFFF - u32StartTick) + getTickNowMs();
    }
    else
    {
        u32RunTick = getTickNowMs()- u32StartTick;
    }

    return u32RunTick;
}



void sigOutputInit(SIG_OUTPUT_MGR *sigOutput,
      pFunIsRunState pIsRun,
         pFunSetState pSetHigh,
         pFunSetState pSetLow)
{
        uint8_t i = 0;
        for(i=0;i<SIG_OUTPUT_NUM;i++)
        {
                if(NULL == sigOutputMgr[i])
                {
                        sigOutputMgr[i] = sigOutput;
                        sigOutput->event = SIG_OUT_INIT;
            sigOutput->pIsRun = pIsRun;
                        sigOutput->pSetHigh = pSetHigh;
                        sigOutput->pSetLow = pSetLow;

                        return;
                }
        }
}


void sigOutputHdl(SIG_OUTPUT_MGR *sigOutput)
{

    //printf("sigOutputHdl enent %d ! \r\n",sigOutput->event);

        switch(sigOutput->event)
        {
                case          SIG_OUT_INIT:
                    sigOutput->state = SIG_OUT_IDLE_STATE;
                break;
               
                case          SIG_OUT_LOW:
                    (sigOutput->pSetLow)();
                    sigOutput->state = SIG_OUT_LOW_STATE;
                break;
               
                case          SIG_OUT_HIGH:
                    (sigOutput->pSetHigh)();
                    sigOutput->state = SIG_OUT_HIGH_STATE;
                break;
                        
            case     SIG_OUT_BLIINK:
                {
                    //printf(" SIG_OUT_BLIINK  state %d ! \r\n",sigOutput->state);

                    switch(sigOutput->state)
                    {
                    case SIG_OUT_LOW_STATE:
                    if( getTickRunMs(sigOutput->u32TimeVal) >= sigOutput->u32SetLowCount )
                    {
                        (sigOutput->pSetHigh)();
                        sigOutput->state = SIG_OUT_HIGH_STATE;
                        sigOutput->u32TimeVal = getTickNowMs();

                        //printf("  TO  SIG_OUT_HIGH_STATE ! \r\n");
                    }
                    break;

                    case SIG_OUT_HIGH_STATE:

                        if( getTickRunMs(sigOutput->u32TimeVal) >= sigOutput->u32SetHighCount )
                        {
                              sigOutput->state = SIG_OUT_LOW_STATE;
                              sigOutput->u32TimeVal = getTickNowMs();

                              //printf("  TO  SIG_OUT_LOW_STATE! \r\n");

                              sigOutput->u32Count--;
                              if(sigOutput->u32Count==0)
                              {
                                  sigOutput->state = SIG_OUT_IDLE_STATE;

                                  //printf("  TO  SIG_OUT_IDLE_STATE! \r\n");
                              }

                              (sigOutput->pSetLow)();
                        }
                    break;

                    case SIG_OUT_IDLE_STATE:
                    if(sigOutput->u32Count > 0)
                    {
                        (sigOutput->pSetLow)();
                        sigOutput->state = SIG_OUT_LOW_STATE;
                        sigOutput->u32TimeVal = getTickNowMs();

                        //printf("  TO  SIG_OUT_LOW_STATE! \r\n");

                    }
                    break;

                    default:
                        sigOutput->state = SIG_OUT_IDLE_STATE;
                        //printf("sigOutputHdl  default ! \r\n");
                    break;
                    }
                }

             break;

                default:
                    sigOutput->state = SIG_OUT_IDLE_STATE;
                break;
        }
}



void sigOutputTask(void)
{
        uint8_t i = 0;
        runTick();
        for(i=0;i<SIG_OUTPUT_NUM;i++)
        {
                if(NULL != sigOutputMgr[i])
                {
                        if(sigOutputMgr[i]->pIsRun())
                        {
                          sigOutputHdl(sigOutputMgr[i]);
                          //printf("sigOutputTask %d  tick %d! \r\n",i, getTickNowMs());
                        }
                }
        }
}

//high low
void sigOutputReq(SIG_OUTPUT_MGR *sigOutput,SIG_OUT_EVENT event)
{
    sigOutput->event = event;
}

//blink
void sigOutputBlinkReq(SIG_OUTPUT_MGR *sigOutput,SIG_OUT_EVENT event,
        uint32_t u32Count,
        uint32_t u32SetHighCount,
        uint32_t u32SetLowCount)
{
    sigOutput->event = event;
    sigOutput->u32Count = u32Count;
    sigOutput->u32SetHighCount = u32SetHighCount;
    sigOutput->u32SetLowCount = u32SetLowCount;

}


实例应用函数

<blockquote>#include "app.h"



主函数

int main(void)
{
    uint32_t  i=0;
    uint32_t  x =0;
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
    Delay_Init();

    USART_Printf_Init(115200);
   
    ledOutputInit();

    printf("SystemClk:%d\r\n",SystemCoreClock);
    //printf("EXTI0 Test\r\n");
   
    //EXTI0_INT_INIT();


    //57.459 - 41.886 = 15.6s      SystemCoreClock/100
    //34.574- 33.014  =1.56s       SystemCoreClock/1000 = 72000
    //34.574- 33.014  =1.56s       SystemCoreClock/1000 = 72000
    //1ms                          720/8/2 = 180/4 = 45
    ledBlink(10,COUNT_X_MS(200), COUNT_X_MS(200));

    while(1)
    {
        sigOutputTask(); //信号输出任务

        if(getLedIsCountZero())
        {

            i += 1;
            if(i>100)
            {
               i = 1;
               x++;
            }

            //printf("COUNT_X_MS i = %d\r\n",i);
            if(1 == x%2)
            {
               ledBlink(1,COUNT_X_MS(i), COUNT_X_MS(100 - i));
            }
            else
            {
                ledBlink(1,COUNT_X_MS(100 - i), COUNT_X_MS(i));
            }
        }

    }
}


逻辑分析仪获取信号状态


可以看见
占空比由 1% - 100% - 1% 这样不但循环


LED 效果







使用特权

评论回复

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

53

主题

676

帖子

4

粉丝