[RISC-V MCU 应用开发] 【RISC-V MCU CH32V103测评】3. 会呼吸的灯

[复制链接]
 楼主| 昱枫 发表于 2020-11-28 16:59 | 显示全部楼层 |阅读模式
本帖最后由 昱枫 于 2020-11-28 17:08 编辑


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

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

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

  1. <blockquote>#ifndef __SIG_OUTPUT_H__


  1. #include "sig_output.h"

  2. #define SIG_OUTPUT_NUM 100

  3. SIG_OUTPUT_MGR  *sigOutputMgr[SIG_OUTPUT_NUM]={NULL};

  4. uint32_t u32tick=0;

  5. void runTick(void)
  6. {
  7.     u32tick++;
  8. }

  9. uint32_t getTickNowMs(void)
  10. {
  11.     return u32tick;
  12. }
  13. uint32_t getTickRunMs(uint32_t u32StartTick)
  14. {
  15.     uint32_t u32RunTick=0;
  16.     if(u32StartTick > getTickNowMs())
  17.     {
  18.         u32RunTick = (0xFFFFFFFF - u32StartTick) + getTickNowMs();
  19.     }
  20.     else
  21.     {
  22.         u32RunTick = getTickNowMs()- u32StartTick;
  23.     }

  24.     return u32RunTick;
  25. }



  26. void sigOutputInit(SIG_OUTPUT_MGR *sigOutput,
  27.       pFunIsRunState pIsRun,
  28.          pFunSetState pSetHigh,
  29.          pFunSetState pSetLow)
  30. {
  31.         uint8_t i = 0;
  32.         for(i=0;i<SIG_OUTPUT_NUM;i++)
  33.         {
  34.                 if(NULL == sigOutputMgr[i])
  35.                 {
  36.                         sigOutputMgr[i] = sigOutput;
  37.                         sigOutput->event = SIG_OUT_INIT;
  38.             sigOutput->pIsRun = pIsRun;
  39.                         sigOutput->pSetHigh = pSetHigh;
  40.                         sigOutput->pSetLow = pSetLow;

  41.                         return;
  42.                 }
  43.         }
  44. }


  45. void sigOutputHdl(SIG_OUTPUT_MGR *sigOutput)
  46. {

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

  48.         switch(sigOutput->event)
  49.         {
  50.                 case          SIG_OUT_INIT:
  51.                     sigOutput->state = SIG_OUT_IDLE_STATE;
  52.                 break;
  53.                
  54.                 case          SIG_OUT_LOW:
  55.                     (sigOutput->pSetLow)();
  56.                     sigOutput->state = SIG_OUT_LOW_STATE;
  57.                 break;
  58.                
  59.                 case          SIG_OUT_HIGH:
  60.                     (sigOutput->pSetHigh)();
  61.                     sigOutput->state = SIG_OUT_HIGH_STATE;
  62.                 break;
  63.                         
  64.             case     SIG_OUT_BLIINK:
  65.                 {
  66.                     //printf(" SIG_OUT_BLIINK  state %d ! \r\n",sigOutput->state);

  67.                     switch(sigOutput->state)
  68.                     {
  69.                     case SIG_OUT_LOW_STATE:
  70.                     if( getTickRunMs(sigOutput->u32TimeVal) >= sigOutput->u32SetLowCount )
  71.                     {
  72.                         (sigOutput->pSetHigh)();
  73.                         sigOutput->state = SIG_OUT_HIGH_STATE;
  74.                         sigOutput->u32TimeVal = getTickNowMs();

  75.                         //printf("  TO  SIG_OUT_HIGH_STATE ! \r\n");
  76.                     }
  77.                     break;

  78.                     case SIG_OUT_HIGH_STATE:

  79.                         if( getTickRunMs(sigOutput->u32TimeVal) >= sigOutput->u32SetHighCount )
  80.                         {
  81.                               sigOutput->state = SIG_OUT_LOW_STATE;
  82.                               sigOutput->u32TimeVal = getTickNowMs();

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

  84.                               sigOutput->u32Count--;
  85.                               if(sigOutput->u32Count==0)
  86.                               {
  87.                                   sigOutput->state = SIG_OUT_IDLE_STATE;

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

  90.                               (sigOutput->pSetLow)();
  91.                         }
  92.                     break;

  93.                     case SIG_OUT_IDLE_STATE:
  94.                     if(sigOutput->u32Count > 0)
  95.                     {
  96.                         (sigOutput->pSetLow)();
  97.                         sigOutput->state = SIG_OUT_LOW_STATE;
  98.                         sigOutput->u32TimeVal = getTickNowMs();

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

  100.                     }
  101.                     break;

  102.                     default:
  103.                         sigOutput->state = SIG_OUT_IDLE_STATE;
  104.                         //printf("sigOutputHdl  default ! \r\n");
  105.                     break;
  106.                     }
  107.                 }

  108.              break;

  109.                 default:
  110.                     sigOutput->state = SIG_OUT_IDLE_STATE;
  111.                 break;
  112.         }
  113. }



  114. void sigOutputTask(void)
  115. {
  116.         uint8_t i = 0;
  117.         runTick();
  118.         for(i=0;i<SIG_OUTPUT_NUM;i++)
  119.         {
  120.                 if(NULL != sigOutputMgr[i])
  121.                 {
  122.                         if(sigOutputMgr[i]->pIsRun())
  123.                         {
  124.                           sigOutputHdl(sigOutputMgr[i]);
  125.                           //printf("sigOutputTask %d  tick %d! \r\n",i, getTickNowMs());
  126.                         }
  127.                 }
  128.         }
  129. }

  130. //high low
  131. void sigOutputReq(SIG_OUTPUT_MGR *sigOutput,SIG_OUT_EVENT event)
  132. {
  133.     sigOutput->event = event;
  134. }

  135. //blink
  136. void sigOutputBlinkReq(SIG_OUTPUT_MGR *sigOutput,SIG_OUT_EVENT event,
  137.         uint32_t u32Count,
  138.         uint32_t u32SetHighCount,
  139.         uint32_t u32SetLowCount)
  140. {
  141.     sigOutput->event = event;
  142.     sigOutput->u32Count = u32Count;
  143.     sigOutput->u32SetHighCount = u32SetHighCount;
  144.     sigOutput->u32SetLowCount = u32SetLowCount;

  145. }


实例应用函数

  1. <blockquote>#include "app.h"



主函数

  1. int main(void)
  2. {
  3.     uint32_t  i=0;
  4.     uint32_t  x =0;
  5.     NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
  6.     Delay_Init();

  7.     USART_Printf_Init(115200);
  8.    
  9.     ledOutputInit();

  10.     printf("SystemClk:%d\r\n",SystemCoreClock);
  11.     //printf("EXTI0 Test\r\n");
  12.    
  13.     //EXTI0_INT_INIT();


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

  19.     while(1)
  20.     {
  21.         sigOutputTask(); //信号输出任务

  22.         if(getLedIsCountZero())
  23.         {

  24.             i += 1;
  25.             if(i>100)
  26.             {
  27.                i = 1;
  28.                x++;
  29.             }

  30.             //printf("COUNT_X_MS i = %d\r\n",i);
  31.             if(1 == x%2)
  32.             {
  33.                ledBlink(1,COUNT_X_MS(i), COUNT_X_MS(100 - i));
  34.             }
  35.             else
  36.             {
  37.                 ledBlink(1,COUNT_X_MS(100 - i), COUNT_X_MS(i));
  38.             }
  39.         }

  40.     }
  41. }


逻辑分析仪获取信号状态
2020-11-28_164754.jpg

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


LED 效果
0c495be09e9b7e0ccdf305922bde8195.gif






您需要登录后才可以回帖 登录 | 注册

本版积分规则

54

主题

679

帖子

4

粉丝
快速回复 在线客服 返回列表 返回顶部