[MM32软件] 【MM32 eMiniBoard测评报告】+ MM32-FDS初体验之TIM呼吸灯

[复制链接]
 楼主| chongdongchen 发表于 2020-4-25 15:46 | 显示全部楼层 |阅读模式

拿到MM32 eMiniBoard,不体验一下MM32-FDS是非常说不过去的。
所以打算通过基于官方例程,实现一个由TIM中断驱动彩色呼吸灯的实验,来体验学习MM32-FDS。
首先去官网下载相关软件包和驱动搭建环境,以及相关资料:
http://www.mm32mcu.com/download.aspx?cid=2542

1、运行mm32_fds_v2.0.16\keil\_mm32_fds_pa.exe,选择MM32L073再点击应用配置。
2、打开其中的例程:mm32_fds_v2.0.16\keil\project\tim\tim_pwm_it.uvprojx
3、如果跳出警告先忽略,然后修改options->device选项卡,选择MM32L073PF;
4、再修改options->C/C++选项卡,将宏定义__MM3N1改为__MM0N1(见mm32_fds_v2.0.16\keil\_mm32_fds_pa.ini,目的是改CPU型号为MM32L073PF)。
这样编译就通过了。

然后打开APP里面的timer_pwm_it.c就能找到熟悉的main函数了,一切从它开始...


 楼主| chongdongchen 发表于 2020-4-25 16:40 | 显示全部楼层
main里面已经初始化好了TIM3,工作频率1K,占空比50%,开了中断,这部分无需修改直接用:
  1. // Step 3:  Assignment DCB structure    --------------->>>>>
  2.     tAPP_TIM_DCB dcb = {
  3. // Base parameter
  4.         .hSub       = emFILE_TIM3,          // 1:TIM1 2:TIM2 2:TIM3 ...
  5.         .mode       = emTIM_PWM,            // emPWM, emCapturePulse, emCapturePWM

  6. // Timer base count configure
  7.         .cntFreq    = 1000000,              // unit: 1Hz ==> timer counter clock = 1MHz
  8.         .period     = 1000,                 // period = 1 MHz * 1000 = 1KHz

  9. // Timer channel configure
  10.         .ch         = emTIM_CH3,            // select config channel
  11.         .pulse      = 500,                  // 500 / 1000 = 50% PWM dutycycle

  12. // Callback function
  13.         .cbUp    = (u32)&UpdateCallback,    //NULL
  14.         .cbCc    = (u32)&CCCallback,        //NULL

  15. // Operation mode
  16.         .type       = emTYPE_IT,            // emTYPE_IT, emTYPE_DMA
  17.         .sync       = emTYPE_Sync,          // emTYPE_Sync, emTYPE_ASync
  18.         .remapEn    = false,                // 0, 1
  19.         .remapIdx   = 0,                    // u8 value
  20.     };
主循环里修改如下:
  1.     while (1) {
  2.         if (SysKeyboard(&vkKey)) {
  3.             if (vkKey == VK_K2) {
  4.                 pwmValue += 10;       // Press K3
  5.             }

  6.             if (vkKey == VK_K3) {
  7.                 pwmValue -= 10;       // Press K4
  8.             }
  9.         }

  10. //        if (pwmValue > dcb.period) pwmValue = 10;   // set TIM CCR1 value < TIM ARR value

  11. //        if (tickFlag) {
  12. //            WriteFile(hTIM, emFILE_TIM3, (u8*)&pwmValue, 1);
  13. //            tickFlag = false;
  14. //        }

  15. #if defined(__SYS_RESOURCE_POLLING)
  16.         if (tickFlag) {
  17.             tickFlag = false;
  18. //            SysDisplay((u8*)&vdLED);
  19. //            if (vdLED == 0) vdLED = 1;
  20. //            else vdLED <<= 1;
  21. //            if (vdLED >= 0x10) vdLED = 0x0001;
  22.             
  23.             //Ìí¼Ó´úÂ룺
  24.             static int8_t dir = 10;
  25.             pwmValue += dir;
  26.             if (pwmValue > dcb.period - 10) dir = -10;
  27.             if (pwmValue < 10) dir = 10;
  28.             WriteFile(hTIM, emFILE_TIM3, (u8*)&pwmValue, 1);
  29.         }
  30. #endif
  31.     }


 楼主| chongdongchen 发表于 2020-4-25 16:42 | 显示全部楼层
中断回调函数控制LED亮灭:
  1. void UpdateCallback(void* fPtr)
  2. {
  3.     if (tickCnt > 0)
  4.         tickCnt++;
  5.     vdLED = 0x0f;
  6.     SysDisplay((u8*)&vdLED);
  7. }

  8. void CCCallback(void* fPtr)
  9. {
  10.     if (tickCnt > 0)
  11.         tickCnt++;
  12.     vdLED = 0x00;
  13.     SysDisplay((u8*)&vdLED);
  14. }
系统滴答中断函数里控制呼吸灯快慢:
  1. void AppTaskTick()
  2. {
  3.     if (tickCnt++ >= 50) {
  4.         tickCnt  = 0;
  5.         tickFlag = true;
  6.     }
  7. }


 楼主| chongdongchen 发表于 2020-4-25 16:53 | 显示全部楼层
呼吸效果来了:
hxd.gif

 楼主| chongdongchen 发表于 2020-4-25 17:16 | 显示全部楼层
本次实验源程序:
  1. ////////////////////////////////////////////////////////////////////////////////
  2. /// [url=home.php?mod=space&uid=288409]@file[/url]     TIMER_PWM_IT.C
  3. /// [url=home.php?mod=space&uid=187600]@author[/url]   D Chen
  4. /// [url=home.php?mod=space&uid=895143]@version[/url]  v2.0.0
  5. /// [url=home.php?mod=space&uid=212281]@date[/url]     2019-03-13
  6. /// [url=home.php?mod=space&uid=247401]@brief[/url]    THIS FILE PROVIDES ALL THE TIMER_PWM_IT EXAMPLE.
  7. ////////////////////////////////////////////////////////////////////////////////
  8. /// @attention
  9. ///
  10. /// THE EXISTING FIRMWARE IS ONLY FOR REFERENCE, WHICH IS DESIGNED TO PROVIDE
  11. /// CUSTOMERS WITH CODING INFORMATION ABOUT THEIR PRODUCTS SO THEY CAN SAVE
  12. /// TIME. THEREFORE, MINDMOTION SHALL NOT BE LIABLE FOR ANY DIRECT, INDIRECT OR
  13. /// CONSEQUENTIAL DAMAGES ABOUT ANY CLAIMS ARISING OUT OF THE CONTENT OF SUCH
  14. /// HARDWARE AND/OR THE USE OF THE CODING INFORMATION CONTAINED HEREIN IN
  15. /// CONNECTION WITH PRODUCTS MADE BY CUSTOMERS.
  16. ///
  17. /// <H2><CENTER>© COPYRIGHT 2018-2019 MINDMOTION </CENTER></H2>
  18. ////////////////////////////////////////////////////////////////////////////////

  19. // Define to prevent recursive inclusion  --------------------------------------
  20. #define _TIMER_C_

  21. // Includes  -------------------------------------------------------------------
  22. #include <string.h>

  23. #include "system_mm32.h"

  24. #include "drv.h"
  25. #include "timer.h"
  26. #include "resource.h"


  27. ////////////////////////////////////////////////////////////////////////////////
  28. /// @addtogroup MM32_Example_Layer
  29. /// @{

  30. ////////////////////////////////////////////////////////////////////////////////
  31. /// @addtogroup EXAMPLE_TIM
  32. /// @{

  33. ////////////////////////////////////////////////////////////////////////////////
  34. /// @addtogroup TIM_Exported_Functions
  35. /// @{

  36. ////////////////////////////////////////////////////////////////////////////////
  37. //  @brief  Timer update event callback
  38. //  @param  TIMHandle: TIM handle.
  39. //  [url=home.php?mod=space&uid=536309]@NOTE[/url]   This example shows a simple way to use timer update event, and you
  40. //          can add your own implementation.
  41. //  @retval None.
  42. ////////////////////////////////////////////////////////////////////////////////
  43. void UpdateCallback(void* fPtr)
  44. {
  45.     if (tickCnt > 0)
  46.         tickCnt++;
  47.     vdLED = 0x0f;
  48.     SysDisplay((u8*)&vdLED);
  49. }

  50. ////////////////////////////////////////////////////////////////////////////////
  51. //  @brief  Timer Compare/Capture event callback
  52. //  @param  UartHandle: TIM handle
  53. //  @note   This example shows a simple way to use timer Compare/Capture event,
  54. //          and you can add your own implementation.
  55. //  @retval None.
  56. ////////////////////////////////////////////////////////////////////////////////
  57. void CCCallback(void* fPtr)
  58. {
  59.     if (tickCnt > 0)
  60.         tickCnt++;
  61.     vdLED = 0x00;
  62.     SysDisplay((u8*)&vdLED);
  63. }

  64. ////////////////////////////////////////////////////////////////////////////////
  65. /// @brief  This function handles App SysTick Handler.
  66. /// @param  None.
  67. /// @retval None.
  68. ////////////////////////////////////////////////////////////////////////////////
  69. void AppTaskTick()
  70. {
  71.     if (tickCnt++ >= 50) {
  72.         tickCnt  = 0;
  73.         tickFlag = true;
  74.     }
  75. }

  76. ////////////////////////////////////////////////////////////////////////////////
  77. /// @brief  Main function, program entry.
  78. /// @param  None.
  79. /// @retval None.
  80. ////////////////////////////////////////////////////////////////////////////////
  81. int main(void)
  82. {
  83. // Step 1:  Setting System Clock     ------------------>>>>>
  84.     /* ====  System Clock & SysTick & AppTaskTick Setting  ==== */
  85.     /* When the parameter is NULL, AppTaskTick function used */
  86.     MCUID = SetSystemClock(emSYSTICK_On, (u32*)&AppTaskTick);
  87.     /* When the parameter is NULL, AppTaskTick function not be used */
  88. //  MCUID = SetSystemClock(emSYSTICK_On, NULL);

  89. // Step 2:  Create File Device   ---------------------->>>>>
  90.     HANDLE hTIM = CreateFile(emIP_TIM);
  91.     if (hTIM == NULL)       while(1);


  92. // Step 3:  Assignment DCB structure    --------------->>>>>
  93.     tAPP_TIM_DCB dcb = {
  94. // Base parameter
  95.         .hSub       = emFILE_TIM3,          // 1:TIM1 2:TIM2 2:TIM3 ...
  96.         .mode       = emTIM_PWM,            // emPWM, emCapturePulse, emCapturePWM

  97. // Timer base count configure
  98.         .cntFreq    = 1000000,              // unit: 1Hz ==> timer counter clock = 1MHz
  99.         .period     = 1000,                 // period = 1 MHz * 1000 = 1KHz

  100. // Timer channel configure
  101.         .ch         = emTIM_CH3,            // select config channel
  102.         .pulse      = 500,                  // 500 / 1000 = 50% PWM dutycycle

  103. // Callback function
  104.         .cbUp    = (u32)&UpdateCallback,    //NULL
  105.         .cbCc    = (u32)&CCCallback,        //NULL

  106. // Operation mode
  107.         .type       = emTYPE_IT,            // emTYPE_IT, emTYPE_DMA
  108.         .sync       = emTYPE_Sync,          // emTYPE_Sync, emTYPE_ASync
  109.         .remapEn    = false,                // 0, 1
  110.         .remapIdx   = 0,                    // u8 value
  111.     };

  112. // Step 3:  Open File Device     ---------------------->>>>>
  113.     if (!OpenFile(hTIM, (void*)&dcb))       while(1);


  114.     u16 pwmValue = dcb.pulse;                // set 50% PWM dutyCycle

  115.     while (1) {
  116.         if (SysKeyboard(&vkKey)) {
  117.             if (vkKey == VK_K2) {
  118.                 pwmValue += 10;       // Press K3
  119.             }

  120.             if (vkKey == VK_K3) {
  121.                 pwmValue -= 10;       // Press K4
  122.             }
  123.         }

  124. //        if (pwmValue > dcb.period) pwmValue = 10;   // set TIM CCR1 value < TIM ARR value

  125. //        if (tickFlag) {
  126. //            WriteFile(hTIM, emFILE_TIM3, (u8*)&pwmValue, 1);
  127. //            tickFlag = false;
  128. //        }

  129. #if defined(__SYS_RESOURCE_POLLING)
  130.         if (tickFlag) {
  131.             tickFlag = false;
  132. //            SysDisplay((u8*)&vdLED);
  133. //            if (vdLED == 0) vdLED = 1;
  134. //            else vdLED <<= 1;
  135. //            if (vdLED >= 0x10) vdLED = 0x0001;
  136.             
  137.             //Ìí¼Ó´úÂ룺
  138.             static int8_t dir = 10;
  139.             pwmValue += dir;
  140.             if (pwmValue > dcb.period - 10) dir = -10;
  141.             if (pwmValue < 10) dir = 10;
  142.             WriteFile(hTIM, emFILE_TIM3, (u8*)&pwmValue, 1);
  143.         }
  144. #endif
  145.     }

  146. }

  147. /// @}

  148. /// @}

  149. /// @}
和HEX文件一起打包:
timer_pwm_it.rar (49.69 KB, 下载次数: 7)
 楼主| chongdongchen 发表于 2020-4-25 17:37 | 显示全部楼层
MM32-FDS把一切看成文件,我猜可能受Linux影响了吧。。
这种架构应用在单片机里非常具有创新意义,在这里只想说一声“很NB,灵动加油”!
今天的实验看到了“文件操作”表面,今后还需要慢慢消化它。
123.jpg
wziyi 发表于 2020-4-26 07:37 | 显示全部楼层
这用的是标准库吗
 楼主| chongdongchen 发表于 2020-4-26 08:24 | 显示全部楼层
wziyi 发表于 2020-4-26 07:37
这用的是标准库吗

是的,就改了timer_pwm_it.c
逗止 发表于 2022-7-30 11:46 | 显示全部楼层
wziyi 发表于 2020-4-26 07:37
这用的是标准库吗

用的是hal库
逗止 发表于 2022-7-31 19:01 来自手机 | 显示全部楼层
楼主,怎样生成f103系列的啊
您需要登录后才可以回帖 登录 | 注册

本版积分规则

55

主题

1235

帖子

10

粉丝
快速回复 返回顶部 返回列表