[M0] TM10 CKO输出波形例程

[复制链接]
197|6
 楼主 | 2018-10-13 10:10 | 显示全部楼层 |阅读模式
看了官方的主要函数是:
#define Simple_CKO_MainCounter     120
#define Simple_CKO_Prescaler       100
#define Simple_CKO_Source           1
/**
*******************************************************************************
* @brief            Toggle TM10_CKO pin when TM10 counter overflow
* @Details     1.initial & modify TimeBase parameter
*    \n        2.clear TOF flag
*    \n        3.Clock Out config (initial state='1' & enable clock out)
*    \n        4.Start TM10
* @NOTE        if user wants to 1ms period and CK_TM10_PR is 12MHz.
*              The Total clocks is 12M*1ms = 12000.
*              User can set "clock prescaler"=100 and "pulse width"=120 .               
*******************************************************************************
*/
void Sample_TM10_ClockOut(void)
{  
    TM_TimeBaseInitTypeDef TM_TimeBase_InitStruct;   
    // 1.TimeBase structure initial
    TM_TimeBaseStruct_Init(&TM_TimeBase_InitStruct);  ///////¶¨Ê±Ê±»ù³õʼ»¯
    // modify parameter
    TM_TimeBase_InitStruct.TM_Period = Simple_CKO_MainCounter - 1;  ///ÖÜÆÚ³õʼ»¯
    TM_TimeBase_InitStruct.TM_Prescaler = Simple_CKO_Prescaler - 1; ///·ÖƵÆ÷
    TM_TimeBase_InitStruct.TM_CounterMode = Cascade; /////¼ÆÊýģʽ  
    TM_TimeBase_Init(TM10, &TM_TimeBase_InitStruct);   ///ʱ»ù³õʼ»¯
    TM_ClearFlag(TM10, TMx_TOF); ///Çå³ýÖжÏ
    // 3.Clock Out config (initial state='1' & enable clock out)
    TM_ClockOutSource_Select(TM10, (TM_CKOSrcDef) Simple_CKO_Source); ///Êä³öµ½TM10
    TM_CKOOutputState_Init(TM10, SET);                /////Êä³ö״̬ΪSET
    TM_ClockOut_Cmd(TM10, ENABLE);                   //////Êä³öʹÄÜ
    // ----------------------------------------------------
    // 4.Start TM10
    TM_Timer_Cmd(TM10, ENABLE);         ////´ò¿ª¶¨Ê±Æ÷
    return;
}
再看手册的 对应输出口


再贴上整个程序  编译后烧录 示波器没有测试没有波形输出。
//***************************************************
//*********ʵÑéÄ¿µÄ£ºTM10Êä³öPWM²¨ÐÎ************
#include "MG32x02z__Common_DRV.H"
#include "MG32x02z_DRV.H"
#include "MG32x02z_TM_DRV.h"

void ChipInit(void);

#define Simple_CKO_MainCounter     120
#define Simple_CKO_Prescaler       100
#define Simple_CKO_Source           1
/**
*******************************************************************************
* @brief            Toggle TM10_CKO pin when TM10 counter overflow
* @details     1.initial & modify TimeBase parameter
*    \n        2.clear TOF flag
*    \n        3.Clock Out config (initial state='1' & enable clock out)
*    \n        4.Start TM10
* @note        if user wants to 1ms period and CK_TM10_PR is 12MHz.
*              The Total clocks is 12M*1ms = 12000.
*              User can set "clock prescaler"=100 and "pulse width"=120 .               
*******************************************************************************
*/
void Sample_TM10_ClockOut(void)
{  
    TM_TimeBaseInitTypeDef TM_TimeBase_InitStruct;   
    // 1.TimeBase structure initial
    TM_TimeBaseStruct_Init(&TM_TimeBase_InitStruct);  ///////¶¨Ê±Ê±»ù³õʼ»¯
    // modify parameter
    TM_TimeBase_InitStruct.TM_Period = Simple_CKO_MainCounter - 1;  ///ÖÜÆÚ³õʼ»¯
    TM_TimeBase_InitStruct.TM_Prescaler = Simple_CKO_Prescaler - 1; ///·ÖƵÆ÷
    TM_TimeBase_InitStruct.TM_CounterMode = Cascade; /////¼ÆÊýģʽ  
    TM_TimeBase_Init(TM10, &TM_TimeBase_InitStruct);   ///ʱ»ù³õʼ»¯
    TM_ClearFlag(TM10, TMx_TOF); ///Çå³ýÖжÏ
    // 3.Clock Out config (initial state='1' & enable clock out)
    TM_ClockOutSource_Select(TM10, (TM_CKOSrcDef) Simple_CKO_Source); ///Êä³öµ½TM10
    TM_CKOOutputState_Init(TM10, SET);                /////Êä³ö״̬ΪSET
    TM_ClockOut_Cmd(TM10, ENABLE);                   //////Êä³öʹÄÜ
    // ----------------------------------------------------
    // 4.Start TM10
    TM_Timer_Cmd(TM10, ENABLE);         ////´ò¿ª¶¨Ê±Æ÷
    return;
}

int main()
{
    ChipInit();
    Sample_TM10_ClockOut();
    while(1)
    {

    }
}



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
| 2018-10-15 08:57 | 显示全部楼层
GPIO口有使能输出吗?
 楼主 | 2018-10-15 09:23 | 显示全部楼层
GPIO已经使能了
| 2018-10-15 09:43 | 显示全部楼层
本帖最后由 noctor 于 2018-10-15 10:36 编辑

你使能输出的功能复用是复用的什么功能,你直接点击回复我吧,不然我收不到提醒很容易看不到你回复,另外我自己测试了一下,是没问题的,我的猜测就是你使能GPIO的功能复用不对,GPIO的功能应该是TM10_ClockOut
 楼主 | 2018-10-15 17:48 | 显示全部楼层
noctor 发表于 2018-10-15 09:43
你使能输出的功能复用是复用的什么功能,你直接点击回复我吧,不然我收不到提醒很容易看不到你回复,另外 ...

//***************************************************
//*********ʵÑéÄ¿µÄ£ºTM10Êä³öPWM²¨ÐÎ************


#include "MG32x02z__Common_DRV.H"
#include "MG32x02z_DRV.H"
#include "MG32x02z_TM_DRV.h"

void ChipInit(void);

#define Simple_CKO_MainCounter     120       
#define Simple_CKO_Prescaler       100
#define Simple_CKO_Source           1
/**
*******************************************************************************
* @brief            Toggle TM10_CKO pin when TM10 counter overflow
* @details     1.initial & modify TimeBase parameter
*    \n        2.clear TOF flag
*    \n        3.Clock Out config (initial state='1' & enable clock out)
*    \n        4.Start TM10
* @note        if user wants to 1ms period and CK_TM10_PR is 12MHz.
*              The Total clocks is 12M*1ms = 12000.
*              User can set "clock prescaler"=100 and "pulse width"=120 .               
*******************************************************************************
*/

void CSC_Init ()
{
              CSC_PLL_TyprDef CSC_PLL_CFG;                       
                                UnProtectModuleReg(MEMprotect);             // Setting flash wait state
                                MEM_SetFlashWaitState(MEM_FWAIT_ONE);        // 50MHz> Sysclk >=25MHz
                                ProtectModuleReg(MEMprotect);
                                UnProtectModuleReg(CSCprotect);
                                CSC_CK_APB_Divider_Select(APB_DIV_1);        // Modify CK_APB divider        APB=CK_MAIN/1
                                CSC_CK_AHB_Divider_Select(AHB_DIV_1);        // Modify CK_AHB divider        AHB=APB/1
                                CSC_IHRCO_Select(IHRCO_12MHz);                        // IHRCO Sel 12MHz
                                CSC_IHRCO_Cmd(ENABLE);
                                while(CSC_GetSingleFlagStatus(CSC_IHRCOF) == DRV_Normal);
                                CSC_ClearFlag(CSC_IHRCOF);
                                CSC_CK_HS_Select(HS_CK_IHRCO);                        // CK_HS select IHRCO
                                CSC_PLL_CFG.InputDivider=PLLI_DIV_2;        // 12M/2=6M
                                CSC_PLL_CFG.Multiplication=PLLIx16;                // 6M*16=96M
                                CSC_PLL_CFG.OutputDivider=PLLO_DIV_2;        // PLLO=96M/2=48M
                                CSC_PLL_Config(&CSC_PLL_CFG);
                                CSC_PLL_Cmd(ENABLE);
                                while(CSC_GetSingleFlagStatus(CSC_PLLF) == DRV_Normal);
                                CSC_ClearFlag(CSC_PLLF);
                                CSC_CK_MAIN_Select(MAIN_CK_HS);       
                                /* Configure peripheral clock */
                                CSC_PeriphOnModeClock_Config(CSC_ON_PortA,ENABLE);                                          // Enable Port A clock
                                CSC_PeriphOnModeClock_Config(CSC_ON_PortB,ENABLE);                                          // Enable Port B clock
                                CSC_PeriphOnModeClock_Config(CSC_ON_PortC,ENABLE);                                          // Enable Port C clock
                                CSC_PeriphOnModeClock_Config(CSC_ON_PortE,ENABLE);                                          // Enable Port D clock
                                CSC_PeriphProcessClockSource_Config(CSC_TM10_CKS, CK_APB);

                                ProtectModuleReg(CSCprotect);   
}


void Sample_TM10_ClockOut(void)
{  
    TM_TimeBaseInitTypeDef TM_TimeBase_InitStruct;   
    TM_TimeBaseStruct_Init(&TM_TimeBase_InitStruct);  ///////¶¨Ê±Ê±»ù³õʼ»¯
    TM_TimeBase_InitStruct.TM_Period = Simple_CKO_MainCounter - 1;  ///ÖÜÆÚ³õʼ»¯
    TM_TimeBase_InitStruct.TM_Prescaler = Simple_CKO_Prescaler - 1; ///·ÖƵÆ÷
    TM_TimeBase_InitStruct.TM_CounterMode = Cascade; /////¼ÆÊýģʽ  
    TM_TimeBase_Init(TM10, &TM_TimeBase_InitStruct);   ///ʱ»ù³õʼ»¯
    TM_ClearFlag(TM10, TMx_TOF);                       ///Çå³ýÖжÏ
    TM_ClockOutSource_Select(TM10, (TM_CKOSrcDef) Simple_CKO_Source); ///Êä³öµ½TM10
    TM_CKOOutputState_Init(TM10, SET);                /////Êä³ö״̬ΪSET
    TM_ClockOut_Cmd(TM10, ENABLE);                   //////Êä³öʹÄÜ
    TM_Timer_Cmd(TM10, ENABLE);                        ////´ò¿ª¶¨Ê±Æ÷
   
}
//********************************************************************************************
void GPIOInit(void)
{
                                uint16_t  ReadData;
                                PIN_InitTypeDef PINX_InitStruct;   
                                PINX_InitStruct.PINX_Mode                                  = PINX_Mode_OpenDrain_O;            //ÅäÖÃÍÆÍìÊä³ö                                                                                                                                                                                                                                                                                                                                //     1.QB: Quasi-Bidirection mode only for PC )
                                PINX_InitStruct.PINX_PUResistant        = PINX_PUResistant_Enable;          //ÄÚ²¿ÉÏÀ­
                                PINX_InitStruct.PINX_Speed              = PINX_Speed_Low;                   //ÉèÖÃËٶȠ                                                                                                                                                                                                                                                                                      
                                PINX_InitStruct.PINX_OUTDrive           = PINX_OUTDrive_Level0;             //Êä³öÄÜÁ¦ÉèÖà                                                                                                                                                                                                                                                                                                      
                                PINX_InitStruct.PINX_FilterDivider      = PINX_FilterDivider_Bypass;        //Ñ¡ÔñÊäÈëµÄÂ˲¨·ÖƵÆ÷
                                PINX_InitStruct.PINX_Inverse            = PINX_Inverse_Disable;             //ÊäÈëÐźÅÊÇ·ñ·´×ª
                                PINX_InitStruct.PINX_Alternate_Function = 5;                                //Ñ¡ÔñTM10CKOģʽ
                                GPIO_PinMode_Config(PINB(1),&PINX_InitStruct);                              //PB1ÅäÖÃ

}
//********************************************************************************************
int main()
{
    CSC_Init();
          GPIOInit();
                Sample_TM10_ClockOut();  
    while(1)
    {
             
    }
}


还是不行
| 2018-10-16 08:46 | 显示全部楼层
   PINX_InitStruct.PINX_Alternate_Function = 5; //这儿你要改成4,alternate function是从0开始算的,5是TIM16_TRGO,4才是TIM10 CKO。
 楼主 | 2018-10-16 09:39 | 显示全部楼层
已经弄好了,原来如此。感谢 。。
扫描二维码,随时随地手机跟帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复

您需要登录后才可以回帖
登录 | 注册
高级模式
我要创建版块 申请成为版主

论坛热帖

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