打印
[MM32软件]

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

[复制链接]
1013|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主

拿到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%,开了中断,这部分无需修改直接用:
// Step 3:  Assignment DCB structure    --------------->>>>>
    tAPP_TIM_DCB dcb = {
// Base parameter
        .hSub       = emFILE_TIM3,          // 1:TIM1 2:TIM2 2:TIM3 ...
        .mode       = emTIM_PWM,            // emPWM, emCapturePulse, emCapturePWM

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

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

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

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

            if (vkKey == VK_K3) {
                pwmValue -= 10;       // Press K4
            }
        }

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

//        if (tickFlag) {
//            WriteFile(hTIM, emFILE_TIM3, (u8*)&pwmValue, 1);
//            tickFlag = false;
//        }

#if defined(__SYS_RESOURCE_POLLING)
        if (tickFlag) {
            tickFlag = false;
//            SysDisplay((u8*)&vdLED);
//            if (vdLED == 0) vdLED = 1;
//            else vdLED <<= 1;
//            if (vdLED >= 0x10) vdLED = 0x0001;
            
            //Ìí¼Ó´úÂ룺
            static int8_t dir = 10;
            pwmValue += dir;
            if (pwmValue > dcb.period - 10) dir = -10;
            if (pwmValue < 10) dir = 10;
            WriteFile(hTIM, emFILE_TIM3, (u8*)&pwmValue, 1);
        }
#endif
    }


使用特权

评论回复
板凳
chongdongchen|  楼主 | 2020-4-25 16:42 | 只看该作者
中断回调函数控制LED亮灭:
void UpdateCallback(void* fPtr)
{
    if (tickCnt > 0)
        tickCnt++;
    vdLED = 0x0f;
    SysDisplay((u8*)&vdLED);
}

void CCCallback(void* fPtr)
{
    if (tickCnt > 0)
        tickCnt++;
    vdLED = 0x00;
    SysDisplay((u8*)&vdLED);
}
系统滴答中断函数里控制呼吸灯快慢:
void AppTaskTick()
{
    if (tickCnt++ >= 50) {
        tickCnt  = 0;
        tickFlag = true;
    }
}


使用特权

评论回复
地板
chongdongchen|  楼主 | 2020-4-25 16:53 | 只看该作者
呼吸效果来了:


使用特权

评论回复
5
chongdongchen|  楼主 | 2020-4-25 17:16 | 只看该作者
本次实验源程序:
////////////////////////////////////////////////////////////////////////////////
/// [url=home.php?mod=space&uid=288409]@file[/url]     TIMER_PWM_IT.C
/// [url=home.php?mod=space&uid=187600]@author[/url]   D Chen
/// [url=home.php?mod=space&uid=895143]@version[/url]  v2.0.0
/// [url=home.php?mod=space&uid=212281]@date[/url]     2019-03-13
/// [url=home.php?mod=space&uid=247401]@brief[/url]    THIS FILE PROVIDES ALL THE TIMER_PWM_IT EXAMPLE.
////////////////////////////////////////////////////////////////////////////////
/// @attention
///
/// THE EXISTING FIRMWARE IS ONLY FOR REFERENCE, WHICH IS DESIGNED TO PROVIDE
/// CUSTOMERS WITH CODING INFORMATION ABOUT THEIR PRODUCTS SO THEY CAN SAVE
/// TIME. THEREFORE, MINDMOTION SHALL NOT BE LIABLE FOR ANY DIRECT, INDIRECT OR
/// CONSEQUENTIAL DAMAGES ABOUT ANY CLAIMS ARISING OUT OF THE CONTENT OF SUCH
/// HARDWARE AND/OR THE USE OF THE CODING INFORMATION CONTAINED HEREIN IN
/// CONNECTION WITH PRODUCTS MADE BY CUSTOMERS.
///
/// <H2><CENTER>© COPYRIGHT 2018-2019 MINDMOTION </CENTER></H2>
////////////////////////////////////////////////////////////////////////////////

// Define to prevent recursive inclusion  --------------------------------------
#define _TIMER_C_

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

#include "system_mm32.h"

#include "drv.h"
#include "timer.h"
#include "resource.h"


////////////////////////////////////////////////////////////////////////////////
/// @addtogroup MM32_Example_Layer
/// @{

////////////////////////////////////////////////////////////////////////////////
/// @addtogroup EXAMPLE_TIM
/// @{

////////////////////////////////////////////////////////////////////////////////
/// @addtogroup TIM_Exported_Functions
/// @{

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

////////////////////////////////////////////////////////////////////////////////
//  @brief  Timer Compare/Capture event callback
//  @param  UartHandle: TIM handle
//  @note   This example shows a simple way to use timer Compare/Capture event,
//          and you can add your own implementation.
//  @retval None.
////////////////////////////////////////////////////////////////////////////////
void CCCallback(void* fPtr)
{
    if (tickCnt > 0)
        tickCnt++;
    vdLED = 0x00;
    SysDisplay((u8*)&vdLED);
}

////////////////////////////////////////////////////////////////////////////////
/// @brief  This function handles App SysTick Handler.
/// @param  None.
/// @retval None.
////////////////////////////////////////////////////////////////////////////////
void AppTaskTick()
{
    if (tickCnt++ >= 50) {
        tickCnt  = 0;
        tickFlag = true;
    }
}

////////////////////////////////////////////////////////////////////////////////
/// @brief  Main function, program entry.
/// @param  None.
/// @retval None.
////////////////////////////////////////////////////////////////////////////////
int main(void)
{
// Step 1:  Setting System Clock     ------------------>>>>>
    /* ====  System Clock & SysTick & AppTaskTick Setting  ==== */
    /* When the parameter is NULL, AppTaskTick function used */
    MCUID = SetSystemClock(emSYSTICK_On, (u32*)&AppTaskTick);
    /* When the parameter is NULL, AppTaskTick function not be used */
//  MCUID = SetSystemClock(emSYSTICK_On, NULL);

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


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

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

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

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

// Operation mode
        .type       = emTYPE_IT,            // emTYPE_IT, emTYPE_DMA
        .sync       = emTYPE_Sync,          // emTYPE_Sync, emTYPE_ASync
        .remapEn    = false,                // 0, 1
        .remapIdx   = 0,                    // u8 value
    };

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


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

    while (1) {
        if (SysKeyboard(&vkKey)) {
            if (vkKey == VK_K2) {
                pwmValue += 10;       // Press K3
            }

            if (vkKey == VK_K3) {
                pwmValue -= 10;       // Press K4
            }
        }

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

//        if (tickFlag) {
//            WriteFile(hTIM, emFILE_TIM3, (u8*)&pwmValue, 1);
//            tickFlag = false;
//        }

#if defined(__SYS_RESOURCE_POLLING)
        if (tickFlag) {
            tickFlag = false;
//            SysDisplay((u8*)&vdLED);
//            if (vdLED == 0) vdLED = 1;
//            else vdLED <<= 1;
//            if (vdLED >= 0x10) vdLED = 0x0001;
            
            //Ìí¼Ó´úÂ룺
            static int8_t dir = 10;
            pwmValue += dir;
            if (pwmValue > dcb.period - 10) dir = -10;
            if (pwmValue < 10) dir = 10;
            WriteFile(hTIM, emFILE_TIM3, (u8*)&pwmValue, 1);
        }
#endif
    }

}

/// @}

/// @}

/// @}
和HEX文件一起打包:
timer_pwm_it.rar (49.69 KB)

使用特权

评论回复
6
chongdongchen|  楼主 | 2020-4-25 17:37 | 只看该作者
MM32-FDS把一切看成文件,我猜可能受Linux影响了吧。。
这种架构应用在单片机里非常具有创新意义,在这里只想说一声“很NB,灵动加油”!
今天的实验看到了“文件操作”表面,今后还需要慢慢消化它。

使用特权

评论回复
7
wziyi| | 2020-4-26 07:37 | 只看该作者
这用的是标准库吗

使用特权

评论回复
8
chongdongchen|  楼主 | 2020-4-26 08:24 | 只看该作者
wziyi 发表于 2020-4-26 07:37
这用的是标准库吗

是的,就改了timer_pwm_it.c

使用特权

评论回复
9
逗止| | 2022-7-30 11:46 | 只看该作者
wziyi 发表于 2020-4-26 07:37
这用的是标准库吗

用的是hal库

使用特权

评论回复
10
逗止| | 2022-7-31 19:01 | 只看该作者
楼主,怎样生成f103系列的啊

使用特权

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

本版积分规则

54

主题

1232

帖子

10

粉丝