5.18 TIM 使用说明

本章说明 N32G033 标准外设库中 TIM 驱动的文件组成、146 个公开函数,以及 6Steps、ComplementarySignals、DMA、DMABurst、ExtTrigger_Synchro、InputCapture、OCActive、OCInactive、OCToggle、OnePulse、PWM_Input、PWM_Output、TimeBase、TimeBasic_TIM1、TimeBasic_TIM3、TimeBasic_TIM4、TimeBasic_TIM6、TimeBasic6_wakeup、TIMx_Synchro 19 个示例。时基与计数模式、输入捕获与输出比较、刹车与死区、编码器接口与主从同步请配合用户手册的“TIM1”“TIM3”“TIM4”“TIM6”章节阅读,芯片已知问题以勘误手册为准。

5.18.1 相关文件

相对路径 作用
firmware/n32g033_std_periph_driver/inc/n32g033_tim.h 定义 TIM_TimeBaseInitType、OCInitType、TIM_ICInitType、TIM_BDTRInitType、TIM_FiltInitType 结构体,以及计数模式、输出比较模式、通道极性、刹车与死区、输入滤波、中断与标志等宏,并按复位与时基、通道初始化、时钟与编码器接口、输出比较、触发与从模式、非对称与滤波等类别声明 146 个公开函数
firmware/n32g033_std_periph_driver/src/n32g033_tim.c 实现上述 146 个函数:TIMx 复位、时基与通道初始化、时钟与编码器接口、输出比较与极性、刹车与死区、触发与从模式、寄存器读写、标志与中断处理、非对称模式与输入滤波、编码器数据读取
projects/n32g033_EVAL/examples/TIM/ TIM 示例根目录,含 6Steps、ComplementarySignals、DMA、DMABurst、ExtTrigger_Synchro、InputCapture、OCActive、OCInactive、OCToggle、OnePulse、PWM_Input、PWM_Output、TimeBase、TimeBasic_TIM1、TimeBasic_TIM3、TimeBasic_TIM4、TimeBasic_TIM6、TimeBasic6_wakeup、TIMx_Synchro 19 个示例
projects/n32g033_EVAL/examples/TIM/PWM_Output/ 该示例的工程目录组成:MDK-ARM/、EWARM/、inc/、src/、readme.txt
projects/n32g033_EVAL/bsp/ 示例共用的板级支持文件:delay.h 的 SysTick 毫秒级延时接口(TimeBasic6_wakeup 使用)

5.18.2 API 参考

搜索 API共 146 个函数

以下 146 个公开函数按 n32g033_tim.h 的声明顺序分为 12 组;每个条目给出功能摘要与 n32g033_tim.c 中该函数正上方的注释原文。

复位、时基与通道初始化

TIM_DeInit、TIM_InitTimeBase、TIM_InitOc1、TIM_InitOc2、TIM_InitOc3、TIM_InitOc4、TIM_InitOc5、TIM_InitOc6、TIM_InitOc7、TIM_ICInit、TIM_ConfigPwmIc、TIM_ConfigBkdt、TIM_BreakFiltConfig、TIM_BreakFiltEnable、TIM_BreakInputSourceEnable

结构体默认值填充

TIM_InitTimBaseStruct、TIM_InitOcStruct、TIM_InitIcStruct、TIM_InitBkdtStruct

使能、中断、事件与 DMA

TIM_Enable、TIM_EnableCtrlPwmOutputs、TIM_ConfigInt、TIM_GenerateEvent、TIM_ConfigDma、TIM_EnableDma

时钟、计数模式与编码器接口

TIM_ConfigInternalClk、TIM_ConfigInternalTrigToExt、TIM_ConfigExtTrigAsClk、TIM_ConfigExtClkMode1、TIM_ConfigExtClkMode2、TIM_ConfigPrescaler、TIM_ConfigCntMode、TIM_ConfigEncoderInterface、TIM_ConfigEncoderInterface2

强制输出比较、预装载与 OCREF 控制

TIM_ConfigForcedOc1、TIM_ConfigForcedOc2、TIM_ConfigForcedOc3、TIM_ConfigForcedOc4、TIM_ConfigForcedOc5、TIM_ConfigForcedOc6、TIM_ConfigForcedOc7、TIM_ConfigArPreload、TIM_SelectComEvt、TIM_SelectCapCmpDmaSrc、TIM_EnableCapCmpPreloadControl、TIM_ConfigOc1Preload、TIM_ConfigOc2Preload、TIM_ConfigOc3Preload、TIM_ConfigOc4Preload、TIM_ConfigOc5Preload、TIM_ConfigOc6Preload、TIM_ConfigOc7Preload

输出比较快速功能与 OCREF 清除

TIM_ConfigOc1Fast、TIM_ConfigOc2Fast、TIM_ConfigOc3Fast、TIM_ConfigOc4Fast、TIM_ConfigOc5Fast、TIM_ConfigOc6Fast、TIM_ConfigOc7Fast、TIM_ClrOc1Ref、TIM_ClrOc2Ref、TIM_ClrOc3Ref、TIM_ClrOc4Ref、TIM_ClrOc5Ref、TIM_ClrOc6Ref、TIM_ClrOc7Ref、TIM_ClrOcRefInputSource

极性、捕获比较使能与输出比较模式

TIM_ConfigOc1Polarity、TIM_ConfigOc1NPolarity、TIM_ConfigOc2Polarity、TIM_ConfigOc2NPolarity、TIM_ConfigOc3Polarity、TIM_ConfigOc3NPolarity、TIM_ConfigOc4Polarity、TIM_ConfigOc4NPolarity、TIM_ConfigOc5Polarity、TIM_ConfigOc6Polarity、TIM_ConfigOc7Polarity、TIM_EnableCapCmpCh、TIM_EnableCapCmpChN、TIM_SelectOcMode

更新事件、从模式与单脉冲

TIM_EnableUpdateEvt、TIM_ConfigUpdateEvt、TIM_ConfigUpdateRequestIntSrc、TIM_SelectHallSensor、TIM_SelectOnePulseMode、TIM_SelectOutputTrig、TIM_SelectSlaveMode、TIM_SelectMasterSlaveMode

寄存器写入与输入触发

TIM_SetCnt、TIM_SetAutoReload、TIM_SetCmp1、TIM_SetCmp2、TIM_SetCmp3、TIM_SetCmp4、TIM_SetCmp5、TIM_SetCmp6、TIM_SetCmp7、TIM_SetCmp1D、TIM_SetCmp2D、TIM_SetCmp3D、TIM_SetCmp4D、ConfigTI1、ConfigTI2、ConfigTI3、ConfigTI4、TIM_SetInCap1Prescaler、TIM_SetInCap2Prescaler、TIM_SetInCap3Prescaler、TIM_SetInCap4Prescaler、TIM_SelectInputTrig、TIM_ConfigExtTrig、TIM_SetClkDiv

捕获、计数器与状态读取

TIM_GetCap1、TIM_GetCap2、TIM_GetCap3、TIM_GetCap4、TIM_GetCap5、TIM_GetCap6、TIM_GetCap7、TIM_GetCap1D、TIM_GetCap2D、TIM_GetCap3D、TIM_GetCap4D、TIM_GetCnt、TIM_GetPrescaler、TIM_GetAutoReload、TIM_GetCCENStatus、TIM_GetFlagStatus、TIM_ClearFlag、TIM_GetIntStatus、TIM_ClrIntPendingBit

非对称模式与输入滤波

TIM_AsymmetricEnable、TIM_IC1FiltConfig、TIM_IC2FiltConfig、TIM_IC3FiltConfig、TIM_IC1FiltEnable、TIM_IC2FiltEnable、TIM_IC3FiltEnable、TIM_GetFiltStatus

ENCLVR 装载与编码器数据

TIM_TrgiLoadLvrToCNTEnable、TIM_GetLVR、TIM_CH3LoadLvrToCNTEnable、TIM_CH3LoadLvrToCNTPolarity、TIM_GetENCDAT、TIM_GetENCDATSign

void TIM_DeInit(TIM_Module* TIMx)复位 TIMx 相关寄存器。
源码注释
name    TIM_DeInit
fun     Deinitializes the TIMx registers.
param   TIMx (The input parameters must be the following values):
          - TIM1
          - TIM3
          - TIM4
          - TIM6
return  none
void TIM_InitTimeBase(TIM_Module* TIMx, TIM_TimeBaseInitType* TIM_TimeBaseInitStruct)初始化 TIMx 时基单元。
源码注释
name    TIM_InitTimeBase
fun     Initializes the TIMx time base unit.
param   TIMx (The input parameters must be the following values):
          - TIM1
          - TIM3
          - TIM4
          - TIM6
param   TIM_TimeBaseInitStruct: refer to the definition of TIM_TimeBaseInitType
          - Prescaler
            * 0x0000 ~ 0xFFFF
          - CounterMode
            * TIM_CNT_MODE_UP
            * TIM_CNT_MODE_DOWN
            * TIM_CNT_MODE_CENTER_ALIGN1
            * TIM_CNT_MODE_CENTER_ALIGN2
            * TIM_CNT_MODE_CENTER_ALIGN3
          - Period
            * 0x00000000 ~ 0xFFFFFFFF
          - ClkDiv
            * 0x00~ 0x1F
          - RepetCnt
            * 0x00 ~ 0xFF
          - CapCh1Sel
            * TIM_CAPCH1SEL_IOM
            * TIM_CAPCH1SEL_COMP
          - EtrOrClr
            * TIM_ETRSEL
            * TIM_COMPSEL
return  none
void TIM_InitOc1(TIM_Module* TIMx, OCInitType* TIM_OCInitStruct)初始化 TIMx 通道 1。
源码注释
name    TIM_InitOc1
fun     Initializes the TIMx Channel 1.
param   TIMx (The input parameters must be the following values):
          - TIM1
          - TIM3
          - TIM4
param   TIM_OCInitStruct: refer to the definition of OCInitType
          - OCMode
            * TIM_OCMODE_TIMING
            * TIM_OCMODE_ACTIVE
            * TIM_OCMODE_INACTIVE
            * TIM_OCMODE_TOGGLE
            * TIM_FORCED_ACTION_INACTIVE
            * TIM_FORCED_ACTION_ACTIVE
            * TIM_OCMODE_PWM1
            * TIM_OCMODE_PWM2
          - OutputState
            * TIM_OUTPUT_STATE_DISABLE
            * TIM_OUTPUT_STATE_ENABLE
          - OutputNState
            * TIM_OUTPUT_NSTATE_DISABLE
            * TIM_OUTPUT_NSTATE_ENABLE
          - Pulse
            * 0x00000000 ~ 0xFFFFFFFF
          - OCPolarity
            * TIM_OC_POLARITY_HIGH
            * TIM_OC_POLARITY_LOW
          - OCNPolarity
            * TIM_OCN_POLARITY_HIGH
            * TIM_OCN_POLARITY_LOW
          - OCIdleState
            * TIM_OC_IDLE_STATE_SET
            * TIM_OC_IDLE_STATE_RESET
          - OCNIdleState
            * TIM_OCN_IDLE_STATE_SET
            * TIM_OCN_IDLE_STATE_RESET
return  none
void TIM_InitOc2(TIM_Module* TIMx, OCInitType* TIM_OCInitStruct)初始化 TIMx 通道 2。
源码注释
name    TIM_InitOc2
fun     Initializes the TIMx Channel 2.
param   TIMx (The input parameters must be the following values):
          - TIM1
          - TIM3
          - TIM4
param   TIM_OCInitStruct: refer to the definition of OCInitType
          - OCMode
            * TIM_OCMODE_TIMING
            * TIM_OCMODE_ACTIVE
            * TIM_OCMODE_INACTIVE
            * TIM_OCMODE_TOGGLE
            * TIM_FORCED_ACTION_INACTIVE
            * TIM_FORCED_ACTION_ACTIVE
            * TIM_OCMODE_PWM1
            * TIM_OCMODE_PWM2
          - OutputState
            * TIM_OUTPUT_STATE_DISABLE
            * TIM_OUTPUT_STATE_ENABLE
          - OutputNState
            * TIM_OUTPUT_NSTATE_DISABLE
            * TIM_OUTPUT_NSTATE_ENABLE
          - Pulse
            * 0x00000000 ~ 0xFFFFFFFF
          - OCPolarity
            * TIM_OC_POLARITY_HIGH
            * TIM_OC_POLARITY_LOW
          - OCNPolarity
            * TIM_OCN_POLARITY_HIGH
            * TIM_OCN_POLARITY_LOW
          - OCIdleState
            * TIM_OC_IDLE_STATE_SET
            * TIM_OC_IDLE_STATE_RESET
          - OCNIdleState
            * TIM_OCN_IDLE_STATE_SET
            * TIM_OCN_IDLE_STATE_RESET
return  none
void TIM_InitOc3(TIM_Module* TIMx, OCInitType* TIM_OCInitStruct)初始化 TIMx 通道 3。
源码注释
name    TIM_InitOc3
fun     Initializes the TIMx Channel 3.
param   TIMx (The input parameters must be the following values):
          - TIM1
          - TIM3
          - TIM4
param   TIM_OCInitStruct: refer to the definition of OCInitType
          - OCMode
            * TIM_OCMODE_TIMING
            * TIM_OCMODE_ACTIVE
            * TIM_OCMODE_INACTIVE
            * TIM_OCMODE_TOGGLE
            * TIM_FORCED_ACTION_INACTIVE
            * TIM_FORCED_ACTION_ACTIVE
            * TIM_OCMODE_PWM1
            * TIM_OCMODE_PWM2
          - OutputState
            * TIM_OUTPUT_STATE_DISABLE
            * TIM_OUTPUT_STATE_ENABLE
          - OutputNState
            * TIM_OUTPUT_NSTATE_DISABLE
            * TIM_OUTPUT_NSTATE_ENABLE
          - Pulse
            * 0x00000000 ~ 0xFFFFFFFF
          - OCPolarity
            * TIM_OC_POLARITY_HIGH
            * TIM_OC_POLARITY_LOW
          - OCNPolarity
            * TIM_OCN_POLARITY_HIGH
            * TIM_OCN_POLARITY_LOW
          - OCIdleState
            * TIM_OC_IDLE_STATE_SET
            * TIM_OC_IDLE_STATE_RESET
          - OCNIdleState
            * TIM_OCN_IDLE_STATE_SET
            * TIM_OCN_IDLE_STATE_RESET
return  none
void TIM_InitOc4(TIM_Module* TIMx, OCInitType* TIM_OCInitStruct)初始化 TIMx 通道 4。
源码注释
name    TIM_InitOc4
fun     Initializes the TIMx Channel 4.
param   TIMx (The input parameters must be the following values):
          - TIM1
          - TIM3
param   TIM_OCInitStruct: refer to the definition of OCInitType
          - OCMode
            * TIM_OCMODE_TIMING
            * TIM_OCMODE_ACTIVE
            * TIM_OCMODE_INACTIVE
            * TIM_OCMODE_TOGGLE
            * TIM_FORCED_ACTION_INACTIVE
            * TIM_FORCED_ACTION_ACTIVE
            * TIM_OCMODE_PWM1
            * TIM_OCMODE_PWM2
          - OutputState
            * TIM_OUTPUT_STATE_DISABLE
            * TIM_OUTPUT_STATE_ENABLE
          - OutputNState
            * TIM_OUTPUT_NSTATE_DISABLE
            * TIM_OUTPUT_NSTATE_ENABLE
          - Pulse
            * 0x00000000 ~ 0xFFFFFFFF
          - OCPolarity
            * TIM_OC_POLARITY_HIGH
            * TIM_OC_POLARITY_LOW
          - OCNPolarity
            * TIM_OCN_POLARITY_HIGH
            * TIM_OCN_POLARITY_LOW
          - OCIdleState
            * TIM_OC_IDLE_STATE_SET
            * TIM_OC_IDLE_STATE_RESET
          - OCNIdleState
            * TIM_OCN_IDLE_STATE_SET
            * TIM_OCN_IDLE_STATE_RESET
return  none
void TIM_InitOc5(TIM_Module* TIMx, OCInitType* TIM_OCInitStruct)初始化 TIMx 通道 5。
源码注释
name    TIM_InitOc5
fun     Initializes the TIMx Channel 5.
param   TIMx (The input parameters must be the following values):
          - TIM1
param   TIM_OCInitStruct: refer to the definition of OCInitType
          - OCMode
            * TIM_OCMODE_TIMING
            * TIM_OCMODE_ACTIVE
            * TIM_OCMODE_INACTIVE
            * TIM_OCMODE_TOGGLE
            * TIM_FORCED_ACTION_INACTIVE
            * TIM_FORCED_ACTION_ACTIVE
            * TIM_OCMODE_PWM1
            * TIM_OCMODE_PWM2
          - OutputState
            * TIM_OUTPUT_STATE_DISABLE
            * TIM_OUTPUT_STATE_ENABLE
          - Pulse
            * 0x00000000 ~ 0xFFFFFFFF
          - OCPolarity
            * TIM_OC_POLARITY_HIGH
            * TIM_OC_POLARITY_LOW
return  none
void TIM_InitOc6(TIM_Module* TIMx, OCInitType* TIM_OCInitStruct)初始化 TIMx 通道 6。
源码注释
name    TIM_InitOc6
fun     Initializes the TIMx Channel 6.
param   TIMx (The input parameters must be the following values):
          - TIM1
param   TIM_OCInitStruct: refer to the definition of OCInitType
          - OCMode
            * TIM_OCMODE_TIMING
            * TIM_OCMODE_ACTIVE
            * TIM_OCMODE_INACTIVE
            * TIM_OCMODE_TOGGLE
            * TIM_FORCED_ACTION_INACTIVE
            * TIM_FORCED_ACTION_ACTIVE
            * TIM_OCMODE_PWM1
            * TIM_OCMODE_PWM2
          - OutputState
            * TIM_OUTPUT_STATE_DISABLE
            * TIM_OUTPUT_STATE_ENABLE
          - Pulse
            * 0x0000 ~ 0xFFFF
          - OCPolarity
            * TIM_OC_POLARITY_HIGH
            * TIM_OC_POLARITY_LOW
return  none
void TIM_InitOc7(TIM_Module* TIMx, OCInitType* TIM_OCInitStruct)初始化 TIMx 通道 7。
源码注释
name    TIM_InitOc7
fun     Initializes the TIMx Channel 7.
param   TIMx (The input parameters must be the following values):
          - TIM1
param   TIM_OCInitStruct: refer to the definition of OCInitType
          - OCMode
            * TIM_OCMODE_TIMING
            * TIM_OCMODE_ACTIVE
            * TIM_OCMODE_INACTIVE
            * TIM_OCMODE_TOGGLE
            * TIM_FORCED_ACTION_INACTIVE
            * TIM_FORCED_ACTION_ACTIVE
            * TIM_OCMODE_PWM1
            * TIM_OCMODE_PWM2
          - OutputState
            * TIM_OUTPUT_STATE_DISABLE
            * TIM_OUTPUT_STATE_ENABLE
          - Pulse
            * 0x0000 ~ 0xFFFF
          - OCPolarity
            * TIM_OC_POLARITY_HIGH
            * TIM_OC_POLARITY_LOW
return  none
void TIM_ICInit(TIM_Module* TIMx, TIM_ICInitType* TIM_ICInitStruct)按 TIM_ICInitStruct 中的指定参数初始化定时器。
源码注释
name    TIM_ICInit
fun     Initializes the TIM peripheral according to the specified
            parameters in the TIM_ICInitStruct.
param   TIMx (The input parameters must be the following values):
          - TIM1
          - TIM3
          - TIM4
param   TIM_ICInitStruct: refer to the definition of TIM_ICInitType
          - Channel
            * TIM_CH_1
            * TIM_CH_2
            * TIM_CH_3
            * TIM_CH_4
          - ICPolarity
            * TIM_IC_POLARITY_RISING
            * TIM_IC_POLARITY_FALLING
          - ICSelection
            * TIM_IC_SELECTION_DIRECTTI
            * TIM_IC_SELECTION_INDIRECTTI
            * TIM_IC_SELECTION_TRC
          - ICPrescaler
            * TIM_IC_PSC_DIV1
            * TIM_IC_PSC_DIV2
            * TIM_IC_PSC_DIV4
            * TIM_IC_PSC_DIV8
          - ICFilter
            * ICFilter can be a number between 0x0 and 0xF
return  none
void TIM_ConfigPwmIc(TIM_Module* TIMx, TIM_ICInitType* TIM_ICInitStruct)按 TIM_ICInitStruct 中的指定参数配置定时器以测量外部 PWM 信号。
源码注释
name    TIM_ConfigPwmIc
fun     Configures the TIM peripheral according to the specified
            parameters in the TIM_ICInitStruct to measure an external PWM signal.
param   TIMx (The input parameters must be the following values):
          - TIM1
          - TIM3
          - TIM4
param   TIM_ICInitStruct: refer to the definition of TIM_ICInitType
          - Channel
            * TIM_CH_1
            * TIM_CH_2
          - ICPolarity
            * TIM_IC_POLARITY_RISING
            * TIM_IC_POLARITY_FALLING
          - ICSelection
            * TIM_IC_SELECTION_DIRECTTI
            * TIM_IC_SELECTION_INDIRECTTI
          - ICPrescaler
            * TIM_IC_PSC_DIV1
            * TIM_IC_PSC_DIV2
            * TIM_IC_PSC_DIV4
            * TIM_IC_PSC_DIV8
          - ICFilter
            * ICFilter can be a number between 0x0 and 0xF
return  none
void TIM_ConfigBkdt(TIM_Module* TIMx, TIM_BDTRInitType* TIM_BDTRInitStruct)配置刹车功能、死区时间、锁定级别、OSSI 与 OSSR 状态以及自动输出使能。
源码注释
name    TIM_ConfigBkdt
fun     Configures the: Break feature, dead time, Lock level, the OSSI,
            the OSSR State and the AOE(automatic output enable).
param   TIMx (The input parameters must be the following values):
          - TIM1
          - TIM3
param   TIM_BDTRInitStruct: refer to the definition of TIM_BDTRInitType
          - OSSRState
            * TIM_OSSR_STATE_ENABLE
            * TIM_OSSR_STATE_DISABLE
          - OSSIState
            * TIM_OSSI_STATE_ENABLE
            * TIM_OSSI_STATE_DISABLE
          - LOCKLevel
            * TIM_LOCK_LEVEL_OFF
            * TIM_LOCK_LEVEL_1
            * TIM_LOCK_LEVEL_2
            * TIM_LOCK_LEVEL_3
          - DeadTime
            * DeadTime can be a number between 0x00 and 0xFF
          - Break
            * TIM_BREAK_IN_ENABLE
            * TIM_BREAK_IN_DISABLE
          - BreakPolarity
            * TIM_BREAK_POLARITY_LOW
            * TIM_BREAK_POLARITY_HIGH
          - AutomaticOutput
            * TIM_AUTO_OUTPUT_ENABLE
            * TIM_AUTO_OUTPUT_DISABLE
return  none
void TIM_BreakFiltConfig(TIM_Module* TIMx, TIM_FiltInitType* TIM_FiltInitStruct)配置刹车输入的滤波器。
源码注释
name    TIM_BreakFiltConfig
fun     Config the filter of break input.
param   TIMx:
          - TIM1
          - TIM3
param   TIM_FiltInitStruct:
          - refer to the definition of TIM_FiltInitType
return  none
void TIM_BreakFiltEnable(TIM_Module* TIMx,FunctionalState Cmd)使能或禁止刹车输入的滤波器。
源码注释
name    TIM_BreakFiltEnable
fun     Enable or disable the filter of break input.
param   TIMx:
          - TIM1
          - TIM3
param   Cmd :
          - ENABLE
          - DISABLE
return  none
void TIM_BreakInputSourceEnable(TIM_Module* TIMx, uint32_t Source, uint32_t Polarity, FunctionalState Cmd)使能或禁止刹车输入源,并设置刹车输入源的极性。
源码注释
name    TIM_BreakInputSourceEnable
fun     Enable or disable the break input source , and set the polarity of the break input source.
param   TIMx (The input parameters must be the following values):
          - TIM1
          - TIM3
param   Source
          - TIM_BREAK_LOCKUP
          - TIM_BREAK_PVD
          - TIM_BREAK_IOM1
          - TIM_BREAK_IOM2
          - TIM_BREAK_IOM3
          - TIM_BREAK_IOM4
          - TIM_BREAK_COMP1
param   Polarity
          - TIM_BREAK_IOM_COMP_POLARITY_INVERT
          - TIM_BREAK_IOM_COMP_POLARITY_NONINVERT
param   Cmd
          - ENABLE
          - DISABLE
return  none
note Only a system reset can reset TIM_BREAK_LOCKUP/TIM_BREAK_PVD after they are enabled.
void TIM_InitTimBaseStruct(TIM_TimeBaseInitType* TIM_TimeBaseInitStruct)将 TIM_TimeBaseInitStruct 的每个成员填充为默认值。
源码注释
name    TIM_InitTimBaseStruct
fun     Fills each TIM_TimeBaseInitStruct member with its default value.
param   TIM_TimeBaseInitStruct: refer to the definition of TIM_TimeBaseInitType
          - Prescaler
            * 0x0000 ~ 0xFFFF
          - CounterMode
            * TIM_CNT_MODE_UP
            * TIM_CNT_MODE_DOWN
            * TIM_CNT_MODE_CENTER_ALIGN1
            * TIM_CNT_MODE_CENTER_ALIGN2
            * TIM_CNT_MODE_CENTER_ALIGN3
          - Period
            * 0x00000000 ~ 0xFFFFFFFF
          - ClkDiv
            * 0x00~ 0x1F
          - RepetCnt
            * 0x00 ~ 0xFF
          - CapCh1Sel
            * TIM_CAPCH1SEL_IOM
            * TIM_CAPCH1SEL_COMP
          - ClrSel
            * TIM_ETRSEL
            * TIM_COMPSEL
return  none
void TIM_InitOcStruct(OCInitType* TIM_OCInitStruct)将 TIM_OCInitStruct 的每个成员填充为默认值。
源码注释
name    TIM_InitOcStruct
fun     Fills each TIM_OCInitStruct member with its default value.
param   TIM_OCInitStruct: refer to the definition of OCInitType
          - OCMode
            * TIM_OCMODE_TIMING
            * TIM_OCMODE_ACTIVE
            * TIM_OCMODE_INACTIVE
            * TIM_OCMODE_TOGGLE
            * TIM_FORCED_ACTION_INACTIVE
            * TIM_FORCED_ACTION_ACTIVE
            * TIM_OCMODE_PWM1
            * TIM_OCMODE_PWM2
          - OutputState
            * TIM_OUTPUT_STATE_DISABLE
            * TIM_OUTPUT_STATE_ENABLE
          - OutputNState
            * TIM_OUTPUT_NSTATE_DISABLE
            * TIM_OUTPUT_NSTATE_ENABLE
          - Pulse
            * 0x00000000 ~ 0xFFFFFFFF
          - OCPolarity
            * TIM_OC_POLARITY_HIGH
            * TIM_OC_POLARITY_LOW
          - OCNPolarity
            * TIM_OCN_POLARITY_HIGH
            * TIM_OCN_POLARITY_LOW
          - OCIdleState
            * TIM_OC_IDLE_STATE_SET
            * TIM_OC_IDLE_STATE_RESET
          - OCNIdleState
            * TIM_OCN_IDLE_STATE_SET
            * TIM_OCN_IDLE_STATE_RESET
return  none
void TIM_InitIcStruct(TIM_ICInitType* TIM_ICInitStruct)将 TIM_ICInitStruct 的每个成员填充为默认值。
源码注释
name    TIM_InitIcStruct
fun     Fills each TIM_ICInitStruct member with its default value.
param   TIM_ICInitStruct: refer to the definition of TIM_ICInitType
          - Channel
            * TIM_CH_1
            * TIM_CH_2
            * TIM_CH_3
            * TIM_CH_4
          - ICPolarity
            * TIM_IC_POLARITY_RISING
            * TIM_IC_POLARITY_FALLING
          - ICSelection
            * TIM_IC_SELECTION_DIRECTTI
            * TIM_IC_SELECTION_INDIRECTTI
            * TIM_IC_SELECTION_TRC
          - ICPrescaler
            * TIM_IC_PSC_DIV1
            * TIM_IC_PSC_DIV2
            * TIM_IC_PSC_DIV4
            * TIM_IC_PSC_DIV8
          - ICFilter
            * ICFilter can be a number between 0x0 and 0xF
return  none
void TIM_InitBkdtStruct(TIM_BDTRInitType* TIM_BDTRInitStruct)将 TIM_BDTRInitStruct 的每个成员填充为默认值。
源码注释
name    TIM_InitBkdtStruct
fun     Fills each TIM_BDTRInitStruct member with its default value.
param   TIM_BDTRInitStruct: refer to the definition of TIM_BDTRInitType
          - OSSRState
            * TIM_OSSR_STATE_ENABLE
            * TIM_OSSR_STATE_DISABLE
          - OSSIState
            * TIM_OSSI_STATE_ENABLE
            * TIM_OSSI_STATE_DISABLE
          - LOCKLevel
            * TIM_LOCK_LEVEL_OFF
            * TIM_LOCK_LEVEL_1
            * TIM_LOCK_LEVEL_2
            * TIM_LOCK_LEVEL_3
          - DeadTime
            * DeadTime can be a number between 0x00 and 0xFF
          - Break
            * TIM_BREAK_IN_ENABLE
            * TIM_BREAK_IN_DISABLE
          - BreakPolarity
            * TIM_BREAK_POLARITY_LOW
            * TIM_BREAK_POLARITY_HIGH
          - AutomaticOutput
            * TIM_AUTO_OUTPUT_ENABLE
            * TIM_AUTO_OUTPUT_DISABLE
return  none
void TIM_Enable(TIM_Module* TIMx, FunctionalState Cmd)使能或禁止指定的 TIM 外设。
源码注释
name    TIM_Enable
fun     Enables or disables the specified TIM peripheral.
param   TIMx (The input parameters must be the following values):
          - TIM1
          - TIM3
          - TIM4
          - TIM6
param   Cmd :
          - ENABLE
          - DISABLE
return  none
void TIM_EnableCtrlPwmOutputs(TIM_Module* TIMx, FunctionalState Cmd)使能或禁止 TIM 外设的主输出。
源码注释
name    TIM_EnableCtrlPwmOutputs
fun     Enables or disables the TIM peripheral Main Outputs.
param   TIMx (The input parameters must be the following values):
          - TIM1
          - TIM3
param   Cmd :
          - ENABLE
          - DISABLE
return  none
void TIM_ConfigInt(TIM_Module* TIMx, uint32_t TIM_IT, FunctionalState Cmd)使能或禁止指定的 TIM 中断。
源码注释
name    TIM_ConfigInt
fun     Enables or disables the specified TIM interrupts.
param   TIMx (The input parameters must be the following values):
          - TIM1
          - TIM3
          - TIM4
          - TIM6
param   TIM_IT:
          - TIM_INT_CC1
          - TIM_INT_CC2
          - TIM_INT_CC3
          - TIM_INT_CC4
          - TIM_INT_CC5
          - TIM_INT_CC6
          - TIM_INT_CC7
          - TIM_INT_C3LDCNT
          - TIM_INT_UPDATE
          - TIM_INT_TRIG
          - TIM_INT_BREAK
          - TIM_INT_COM
param   Cmd :
          - ENABLE
          - DISABLE
return  none
void TIM_GenerateEvent(TIM_Module* TIMx, uint32_t TIM_EventSource)配置由软件产生 TIMx 事件。
源码注释
name    TIM_GenerateEvent
fun     Configures the TIMx event to be generate by software.
param   TIMx (The input parameters must be the following values):
          - TIM1
          - TIM3
          - TIM4
          - TIM6
param   TIM_EventSource:
          - TIM_EVT_SRC_CC1
          - TIM_EVT_SRC_CC2
          - TIM_EVT_SRC_CC3
          - TIM_EVT_SRC_CC4
          - TIM_EVT_SRC_UPDATE
          - TIM_EVT_SRC_COM
          - TIM_EVT_SRC_TRIG
          - TIM_EVT_SRC_BREAK
return  none
void TIM_ConfigDma(TIM_Module* TIMx, uint32_t TIM_DMABase, uint32_t TIM_DMABurstLength)配置 TIMx 的 DMA 接口。
源码注释
name    TIM_ConfigDma
fun     Configures the TIMx's DMA interface.
param   TIMx (The input parameters must be the following values):
          - TIM1
          - TIM3
          - TIM4
param   TIM_DMABase:
          - TIM_DMABASE_CTRL1
          - TIM_DMABASE_CTRL2
          - TIM_DMABASE_STS
          - TIM_DMABASE_EVTGEN
          - TIM_DMABASE_SMCTRL
          - TIM_DMABASE_DMAINTEN
          - TIM_DMABASE_CAPCMPMOD1
          - TIM_DMABASE_CAPCMPMOD2
          - TIM_DMABASE_CAPCMPMOD3
          - TIM_DMABASE_CAPCMPEN
          - TIM_DMABASE_CAPCMPDAT1
          - TIM_DMABASE_CAPCMPDAT2
          - TIM_DMABASE_CAPCMPDAT3
          - TIM_DMABASE_CAPCMPDAT4
          - TIM_DMABASE_CAPCMPDAT5
          - TIM_DMABASE_CAPCMPDAT6
          - TIM_DMABASE_PSC
          - TIM_DMABASE_AR
          - TIM_DMABASE_CNT
          - TIM_DMABASE_REPCNT
          - TIM_DMABASE_BKDT
          - TIM_DMABASE_CAPCMPDAT7
          - TIM_DMABASE_BKFR
          - TIM_DMABASE_C1FILT
          - TIM_DMABASE_C2FILT
          - TIM_DMABASE_C3FILT
          - TIM_DMABASE_FILTO
          - TIM_DMABASE_AF1
          - TIM_DMABASE_ENCDAT
          - TIM_DMABASE_ENCMCTRL
          - TIM_DMABASE_ENCLVR
param   TIM_DMABurstLength:
          - This parameter can be one value between:
            TIM_DMABURST_LENGTH_1TRANSFER and TIM_DMABURST_LENGTH_37TRANSFERS.
return  none
void TIM_EnableDma(TIM_Module* TIMx, uint32_t TIM_DMASource, FunctionalState Cmd)使能或禁止 TIMx 的 DMA 请求。
源码注释
name    TIM_EnableDma
fun     Enables or disables the TIMx's DMA Requests.
param   TIMx (The input parameters must be the following values):
          - TIM1
          - TIM3
          - TIM4
          - TIM6
param   TIM_DMASource:
          - TIM_DMA_CC1
          - TIM_DMA_CC2
          - TIM_DMA_CC3
          - TIM_DMA_CC4
          - TIM_DMA_UPDATE
          - TIM_DMA_COM
          - TIM_DMA_TRIG
param   Cmd:
          - DISABLE
          - ENABLE
return  none
void TIM_ConfigInternalClk(TIM_Module* TIMx)配置 TIMx 的内部时钟。
源码注释
name    TIM_ConfigInternalClk
fun     Configures the TIMx internal Clock
param   TIMx (The input parameters must be the following values):
          - TIM1
          - TIM3
          - TIM4
return  none
void TIM_ConfigInternalTrigToExt(TIM_Module* TIMx, uint32_t TIM_InputTriggerSource)将 TIMx 的内部触发配置为外部时钟。
源码注释
name    TIM_ConfigInternalTrigToExt
fun     Configures the TIMx Internal Trigger as External Clock
param   TIMx (The input parameters must be the following values):
          - TIM1
          - TIM3
          - TIM4
param   TIM_InputTriggerSource:
          - TIM_TRIG_SEL_IN_TR0
          - TIM_TRIG_SEL_IN_TR1
          - TIM_TRIG_SEL_IN_TR2
          - TIM_TRIG_SEL_IN_TR3
return  none
void TIM_ConfigExtTrigAsClk(TIM_Module* TIMx, uint32_t TIM_TIxExternalCLKSource, uint32_t IcPolarity, uint32_t ICFilter)将 TIMx 的触发器配置为外部时钟。
源码注释
name    TIM_ConfigExtTrigAsClk
fun     Configures the TIMx Trigger as External Clock
param   TIMx (The input parameters must be the following values):
          - TIM1
          - TIM3
          - TIM4
param   TIM_TIxExternalCLKSource:
          - TIM_TRIG_SEL_TI1F_ED
          - TIM_TRIG_SEL_TI1FP1
          - TIM_TRIG_SEL_TI2FP2
param   ICPolarity
          - TIM_IC_POLARITY_RISING
          - TIM_IC_POLARITY_FALLING
param   ICFilter
          - ICFilter can be a number between 0x0 and 0xF
return  none
void TIM_ConfigExtClkMode1(TIM_Module* TIMx,uint32_t TIM_ExtTRGPrescaler,uint32_t TIM_ExtTRGPolarity,uint32_t ExtTRGFilter)配置外部时钟模式 1。
源码注释
name    TIM_ConfigExtClkMode1
fun     Configures the External clock Mode1
param   TIMx (The input parameters must be the following values):
          - TIM1
          - TIM3
          - TIM4
param   TIM_ExtTRGPrescaler:
          - TIM_EXT_TRG_PSC_OFF
          - TIM_EXT_TRG_PSC_DIV2
          - TIM_EXT_TRG_PSC_DIV4
          - TIM_EXT_TRG_PSC_DIV8
param   TIM_ExtTRGPolarity
          - TIM_EXT_TRIG_POLARITY_INVERTED
          - TIM_EXT_TRIG_POLARITY_NONINVERTED
param   ExtTRGFilter
          - ExtTRGFilter can be a number between 0x0 and 0xF
return  none
void TIM_ConfigExtClkMode2(TIM_Module* TIMx,uint32_t TIM_ExtTRGPrescaler,uint32_t TIM_ExtTRGPolarity,uint32_t ExtTRGFilter)配置外部时钟模式 2。
源码注释
name    TIM_ConfigExtClkMode2
fun     Configures the External clock Mode2
param   TIMx (The input parameters must be the following values):
          - TIM1
          - TIM3
          - TIM4
param   TIM_ExtTRGPrescaler:
          - TIM_EXT_TRG_PSC_OFF
          - TIM_EXT_TRG_PSC_DIV2
          - TIM_EXT_TRG_PSC_DIV4
          - TIM_EXT_TRG_PSC_DIV8
param   TIM_ExtTRGPolarity
          - TIM_EXT_TRIG_POLARITY_INVERTED
          - TIM_EXT_TRIG_POLARITY_NONINVERTED
param   ExtTRGFilter
          - ExtTRGFilter can be a number between 0x0 and 0xF
return  none
void TIM_ConfigPrescaler(TIM_Module* TIMx, uint32_t Prescaler, uint32_t TIM_PSCReloadMode)配置 TIMx 的预分频器。
源码注释
name    TIM_ConfigPrescaler
fun     Configures the TIMx Prescaler.
param   TIMx (The input parameters must be the following values):
          - TIM1
          - TIM3
          - TIM4
          - TIM6
param   Prescaler:
          - 0x0000 ~ 0xFFFF
param   TIM_PSCReloadMode
          - TIM_PSC_RELOAD_MODE_UPDATE
          - TIM_PSC_RELOAD_MODE_IMMEDIATE
return  none
void TIM_ConfigCntMode(TIM_Module* TIMx, uint32_t CntMode)指定要使用的 TIMx 计数模式。
源码注释
name    TIM_ConfigCntMode
fun     Specifies the TIMx Counter Mode to be used.
param   TIMx (The input parameters must be the following values):
          - TIM1
          - TIM3
          - TIM4
param   CntMode
          - TIM_CNT_MODE_UP
          - TIM_CNT_MODE_DOWN
          - TIM_CNT_MODE_CENTER_ALIGN1
          - TIM_CNT_MODE_CENTER_ALIGN2
          - TIM_CNT_MODE_CENTER_ALIGN3
return  none
void TIM_ConfigEncoderInterface(TIM_Module* TIMx,uint32_t TIM_EncoderMode,uint32_t TIM_IC1Polarity,uint32_t TIM_IC2Polarity)配置 TIMx 编码器接口。
源码注释
name    TIM_ConfigEncoderInterface
fun     Configures the TIMx Encoder Interface.
param   TIMx (The input parameters must be the following values):
          - TIM1
          - TIM3
param   TIM_EncoderMode
          - TIM_ENCODE_QUA_MODE_TI1
          - TIM_ENCODE_QUA_MODE_TI2
          - TIM_ENCODE_QUA_MODE_TI12
param   TIM_IC1Polarity
          - TIM_IC_POLARITY_FALLING
          - TIM_IC_POLARITY_RISING
param   TIM_IC2Polarity
          - TIM_IC_POLARITY_FALLING
          - TIM_IC_POLARITY_RISING
return  none
void TIM_ConfigEncoderInterface2(TIM_Module* TIMx,uint32_t TIM_EncoderMode,uint32_t TIM_IC1Polarity,uint32_t TIM_IC2Polarity)配置 TIMx 编码器接口。
源码注释
name    TIM_ConfigEncoderInterface2
fun     Configures the TIMx Encoder Interface.
param   TIMx (The input parameters must be the following values):
          - TIM4
param   TIM_EncoderMode
          - TIM_ENCODE2_DISABLE
          - TIM_ENCODE2_QUA_MODE_TI1
          - TIM_ENCODE2_QUA_MODE_TI2
          - TIM_ENCODE2_QUA_MODE_TI12
          - TIM_ENCODE2_QUA_MODE_SINGLE_TI1
          - TIM_ENCODE2_QUA_MODE_SINGLE_TI2
          - TIM_ENCODE2_DUL_CLKPLUS_MODE1
          - TIM_ENCODE2_DUL_CLKPLUS_MODE2
          - TIM_ENCODE2_SINGLE_CLKPLUS_MODE1
          - TIM_ENCODE2_SINGLE_CLKPLUS_MODE2
          - TIM_ENCODE2_CCW_MODE1
          - TIM_ENCODE2_CCW_MODE2
param   TIM_IC1Polarity
          - TIM_IC_POLARITY_FALLING
          - TIM_IC_POLARITY_RISING
param   TIM_IC2Polarity
          - TIM_IC_POLARITY_FALLING
          - TIM_IC_POLARITY_RISING
return  none
note  When using this function, the slave mode must be disabled.
void TIM_ConfigForcedOc1(TIM_Module* TIMx, uint32_t TIM_ForcedAction)将 TIMx 输出 1 的波形强制为有效或无效电平。
源码注释
name    TIM_ConfigForcedOc1
fun     Forces the TIMx output 1 waveform to active or inactive level.
param   TIMx (The input parameters must be the following values):
          - TIM1
          - TIM3
          - TIM4
param   TIM_ForcedAction
          - TIM_FORCED_ACTION_ACTIVE
          - TIM_FORCED_ACTION_INACTIVE
return  none
void TIM_ConfigForcedOc2(TIM_Module* TIMx, uint32_t TIM_ForcedAction)将 TIMx 输出 2 的波形强制为有效或无效电平。
源码注释
name    TIM_ConfigForcedOc2
fun     Forces the TIMx output 2 waveform to active or inactive level.
param   TIMx (The input parameters must be the following values):
          - TIM1
          - TIM3
          - TIM4
param   TIM_ForcedAction
          - TIM_FORCED_ACTION_ACTIVE
          - TIM_FORCED_ACTION_INACTIVE
return  none
void TIM_ConfigForcedOc3(TIM_Module* TIMx, uint32_t TIM_ForcedAction)将 TIMx 输出 3 的波形强制为有效或无效电平。
源码注释
name    TIM_ConfigForcedOc3
fun     Forces the TIMx output 3 waveform to active or inactive level.
param   TIMx (The input parameters must be the following values):
          - TIM1
          - TIM3
          - TIM4
param   TIM_ForcedAction
          - TIM_FORCED_ACTION_ACTIVE
          - TIM_FORCED_ACTION_INACTIVE
return  none
void TIM_ConfigForcedOc4(TIM_Module* TIMx, uint32_t TIM_ForcedAction)将 TIMx 输出 4 的波形强制为有效或无效电平。
源码注释
name    TIM_ConfigForcedOc4
fun     Forces the TIMx output 4 waveform to active or inactive level.
param   TIMx (The input parameters must be the following values):
          - TIM1
          - TIM3
param   TIM_ForcedAction
          - TIM_FORCED_ACTION_ACTIVE
          - TIM_FORCED_ACTION_INACTIVE
return  none
void TIM_ConfigForcedOc5(TIM_Module* TIMx, uint32_t TIM_ForcedAction)将 TIMx 输出 5 的波形强制为有效或无效电平。
源码注释
name    TIM_ConfigForcedOc5
fun     Forces the TIMx output 5 waveform to active or inactive level.
param   TIMx (The input parameters must be the following values):
          - TIM1
param   TIM_ForcedAction
          - TIM_FORCED_ACTION_ACTIVE
          - TIM_FORCED_ACTION_INACTIVE
return  none
void TIM_ConfigForcedOc6(TIM_Module* TIMx, uint32_t TIM_ForcedAction)将 TIMx 输出 6 的波形强制为有效或无效电平。
源码注释
name    TIM_ConfigForcedOc6
fun     Forces the TIMx output 6 waveform to active or inactive level.
param   TIMx (The input parameters must be the following values):
          - TIM1
param   TIM_ForcedAction
          - TIM_FORCED_ACTION_ACTIVE
          - TIM_FORCED_ACTION_INACTIVE
return  none
void TIM_ConfigForcedOc7(TIM_Module* TIMx, uint32_t TIM_ForcedAction)将 TIMx 输出 7 的波形强制为有效或无效电平。
源码注释
name    TIM_ConfigForcedOc7
fun     Forces the TIMx output 7 waveform to active or inactive level.
param   TIMx (The input parameters must be the following values):
          - TIM1
param   TIM_ForcedAction
          - TIM_FORCED_ACTION_ACTIVE
          - TIM_FORCED_ACTION_INACTIVE
return  none
void TIM_ConfigArPreload(TIM_Module* TIMx, FunctionalState Cmd)使能或禁止 TIMx 在 AR 上的预装载寄存器。
源码注释
name    TIM_ConfigArPreload
fun     Enables or disables TIMx peripheral Preload register on AR.
param   TIMx (The input parameters must be the following values):
          - TIM1
          - TIM3
          - TIM4
          - TIM6
param   Cmd
          - ENABLE
          - DISABLE
return  none
void TIM_SelectComEvt(TIM_Module* TIMx, FunctionalState Cmd)选择 TIM 外设的换相事件。
源码注释
name    TIM_SelectComEvt
fun     Selects the TIM peripheral Commutation event.
param   TIMx (The input parameters must be the following values):
          - TIM1
param   Cmd
          - ENABLE
          - DISABLE
return  none
void TIM_SelectCapCmpDmaSrc(TIM_Module* TIMx, FunctionalState Cmd)选择 TIMx 外设的捕获比较 DMA 源。
源码注释
name    TIM_SelectCapCmpDmaSrc
fun     Selects the TIMx peripheral Capture Compare DMA source.
param   TIMx (The input parameters must be the following values):
          - TIM1
          - TIM3
          - TIM4
param   Cmd
          - ENABLE
          - DISABLE
return  none
void TIM_EnableCapCmpPreloadControl(TIM_Module* TIMx, FunctionalState Cmd)置位或复位 TIM 外设的捕获比较预装载控制位。
源码注释
name    TIM_EnableCapCmpPreloadControl
fun     Sets or Resets the TIM peripheral Capture Compare Preload Control bit.
param   TIMx (The input parameters must be the following values):
          - TIM1
param   Cmd
          - ENABLE
          - DISABLE
return  none
void TIM_ConfigOc1Preload(TIM_Module* TIMx, uint32_t TIM_OCPreload)使能或禁止 TIMx 在 CCDAT1 上的预装载寄存器。
源码注释
name    TIM_ConfigOc1Preload
fun     Enables or disables the TIMx peripheral Preload register on CCDAT1.
param   TIMx (The input parameters must be the following values):
          - TIM1
          - TIM3
          - TIM4
param   TIM_OCPreload
          - TIM_OC_PRE_LOAD_ENABLE
          - TIM_OC_PRE_LOAD_DISABLE
return  none
void TIM_ConfigOc2Preload(TIM_Module* TIMx, uint32_t TIM_OCPreload)使能或禁止 TIMx 在 CCDAT2 上的预装载寄存器。
源码注释
name    TIM_ConfigOc2Preload
fun     Enables or disables the TIMx peripheral Preload register on CCDAT2.
param   TIMx (The input parameters must be the following values):
          - TIM1
          - TIM3
          - TIM4
param   TIM_OCPreload
          - TIM_OC_PRE_LOAD_ENABLE
          - TIM_OC_PRE_LOAD_DISABLE
return  none
void TIM_ConfigOc3Preload(TIM_Module* TIMx, uint32_t TIM_OCPreload)使能或禁止 TIMx 在 CCDAT3 上的预装载寄存器。
源码注释
name    TIM_ConfigOc3Preload
fun     Enables or disables the TIMx peripheral Preload register on CCDAT3.
param   TIMx (The input parameters must be the following values):
          - TIM1
          - TIM3
          - TIM4
param   TIM_OCPreload
          - TIM_OC_PRE_LOAD_ENABLE
          - TIM_OC_PRE_LOAD_DISABLE
return  none
void TIM_ConfigOc4Preload(TIM_Module* TIMx, uint32_t TIM_OCPreload)使能或禁止 TIMx 在 CCDAT4 上的预装载寄存器。
源码注释
name    TIM_ConfigOc4Preload
fun     Enables or disables the TIMx peripheral Preload register on CCDAT4.
param   TIMx (The input parameters must be the following values):
          - TIM1
          - TIM3
param   TIM_OCPreload
          - TIM_OC_PRE_LOAD_ENABLE
          - TIM_OC_PRE_LOAD_DISABLE
return  none
void TIM_ConfigOc5Preload(TIM_Module* TIMx, uint32_t TIM_OCPreload)使能或禁止 TIMx 在 CCDAT5 上的预装载寄存器。
源码注释
name    TIM_ConfigOc5Preload
fun     Enables or disables the TIMx peripheral Preload register on CCDAT5.
param   TIMx (The input parameters must be the following values):
          - TIM1
param   TIM_OCPreload
          - TIM_OC_PRE_LOAD_ENABLE
          - TIM_OC_PRE_LOAD_DISABLE
return  none
void TIM_ConfigOc6Preload(TIM_Module* TIMx, uint32_t TIM_OCPreload)使能或禁止 TIMx 在 CCDAT6 上的预装载寄存器。
源码注释
name    TIM_ConfigOc6Preload
fun     Enables or disables the TIMx peripheral Preload register on CCDAT6.
param   TIMx (The input parameters must be the following values):
          - TIM1
param   TIM_OCPreload
          - TIM_OC_PRE_LOAD_ENABLE
          - TIM_OC_PRE_LOAD_DISABLE
return  none
void TIM_ConfigOc7Preload(TIM_Module* TIMx, uint32_t TIM_OCPreload)使能或禁止 TIMx 在 CCDAT6 上的预装载寄存器。
源码注释
name    TIM_ConfigOc7Preload
fun     Enables or disables the TIMx peripheral Preload register on CCDAT6.
param   TIMx (The input parameters must be the following values):
          - TIM1
param   TIM_OCPreload
          - TIM_OC_PRE_LOAD_ENABLE
          - TIM_OC_PRE_LOAD_DISABLE
return  none
void TIM_ConfigOc1Fast(TIM_Module* TIMx, uint32_t TIM_OCFast)配置 TIMx 输出比较 1 的快速功能。
源码注释
name    TIM_ConfigOc1Fast
fun     Configures the TIMx Output Compare 1 Fast feature.
param   TIMx (The input parameters must be the following values):
          - TIM1
          - TIM3
          - TIM4
param   TIM_OCPreload
          - TIM_OC_FAST_ENABLE
          - TIM_OC_FAST_DISABLE
return  none
void TIM_ConfigOc2Fast(TIM_Module* TIMx, uint32_t TIM_OCFast)配置 TIMx 输出比较 2 的快速功能。
源码注释
name    TIM_ConfigOc2Fast
fun     Configures the TIMx Output Compare 2 Fast feature.
param   TIMx (The input parameters must be the following values):
          - TIM1
          - TIM3
          - TIM4
param   TIM_OCPreload
          - TIM_OC_FAST_ENABLE
          - TIM_OC_FAST_DISABLE
return  none
void TIM_ConfigOc3Fast(TIM_Module* TIMx, uint32_t TIM_OCFast)配置 TIMx 输出比较 3 的快速功能。
源码注释
name    TIM_ConfigOc3Fast
fun     Configures the TIMx Output Compare 3 Fast feature.
param   TIMx (The input parameters must be the following values):
          - TIM1
          - TIM3
          - TIM4
param   TIM_OCPreload
          - TIM_OC_FAST_ENABLE
          - TIM_OC_FAST_DISABLE
return  none
void TIM_ConfigOc4Fast(TIM_Module* TIMx, uint32_t TIM_OCFast)配置 TIMx 输出比较 4 的快速功能。
源码注释
name    TIM_ConfigOc4Fast
fun     Configures the TIMx Output Compare 4 Fast feature.
param   TIMx (The input parameters must be the following values):
          - TIM1
          - TIM3
param   TIM_OCPreload
          - TIM_OC_FAST_ENABLE
          - TIM_OC_FAST_DISABLE
return  none
void TIM_ConfigOc5Fast(TIM_Module* TIMx, uint32_t TIM_OCFast)配置 TIMx 输出比较 5 的快速功能。
源码注释
name    TIM_ConfigOc5Fast
fun     Configures the TIMx Output Compare 5 Fast feature.
param   TIMx (The input parameters must be the following values):
          - TIM1
param   TIM_OCPreload
          - TIM_OC_FAST_ENABLE
          - TIM_OC_FAST_DISABLE
return  none
void TIM_ConfigOc6Fast(TIM_Module* TIMx, uint32_t TIM_OCFast)配置 TIMx 输出比较 6 的快速功能。
源码注释
name    TIM_ConfigOc6Fast
fun     Configures the TIMx Output Compare 6 Fast feature.
param   TIMx (The input parameters must be the following values):
          - TIM1
param   TIM_OCPreload
          - TIM_OC_FAST_ENABLE
          - TIM_OC_FAST_DISABLE
return  none
void TIM_ConfigOc7Fast(TIM_Module* TIMx, uint32_t TIM_OCFast)配置 TIMx 输出比较 7 的快速功能。
源码注释
name    TIM_ConfigOc7Fast
fun     Configures the TIMx Output Compare 7 Fast feature.
param   TIMx (The input parameters must be the following values):
          - TIM1
param   TIM_OCPreload
          - TIM_OC_FAST_ENABLE
          - TIM_OC_FAST_DISABLE
return  none
void TIM_ClrOc1Ref(TIM_Module* TIMx, uint32_t TIM_OCClear)在外部事件上清除或保护 OCREF1 信号。
源码注释
name    TIM_ClrOc1Ref
fun     Clears or safeguards the OCREF1 signal on an external event
param   TIMx (The input parameters must be the following values):
          - TIM1
          - TIM3
          - TIM4
param   TIM_OCPreload
          - TIM_OC_CLR_ENABLE
          - TIM_OC_CLR_DISABLE
return  none
void TIM_ClrOc2Ref(TIM_Module* TIMx, uint32_t TIM_OCClear)在外部事件上清除或保护 OCREF2 信号。
源码注释
name    TIM_ClrOc2Ref
fun     Clears or safeguards the OCREF2 signal on an external event
param   TIMx (The input parameters must be the following values):
          - TIM1
          - TIM3
          - TIM4
param   TIM_OCPreload
          - TIM_OC_CLR_ENABLE
          - TIM_OC_CLR_DISABLE
return  none
void TIM_ClrOc3Ref(TIM_Module* TIMx, uint32_t TIM_OCClear)在外部事件上清除或保护 OCREF3 信号。
源码注释
name    TIM_ClrOc3Ref
fun     Clears or safeguards the OCREF3 signal on an external event
param   TIMx (The input parameters must be the following values):
          - TIM1
          - TIM3
          - TIM4
param   TIM_OCPreload
          - TIM_OC_CLR_ENABLE
          - TIM_OC_CLR_DISABLE
return  none
void TIM_ClrOc4Ref(TIM_Module* TIMx, uint32_t TIM_OCClear)在外部事件上清除或保护 OCREF4 信号。
源码注释
name    TIM_ClrOc4Ref
fun     Clears or safeguards the OCREF4 signal on an external event
param   TIMx (The input parameters must be the following values):
          - TIM1
          - TIM3
param   TIM_OCPreload
          - TIM_OC_CLR_ENABLE
          - TIM_OC_CLR_DISABLE
return  none
void TIM_ClrOc5Ref(TIM_Module* TIMx, uint32_t TIM_OCClear)在外部事件上清除或保护 OCREF5 信号。
源码注释
name    TIM_ClrOc5Ref
fun     Clears or safeguards the OCREF5 signal on an external event
param   TIMx (The input parameters must be the following values):
          - TIM1
param   TIM_OCPreload
          - TIM_OC_CLR_ENABLE
          - TIM_OC_CLR_DISABLE
return  none
void TIM_ClrOc6Ref(TIM_Module* TIMx, uint32_t TIM_OCClear)在外部事件上清除或保护 OCREF6 信号。
源码注释
name    TIM_ClrOc6Ref
fun     Clears or safeguards the OCREF6 signal on an external event
param   TIMx (The input parameters must be the following values):
          - TIM1
param   TIM_OCPreload
          - TIM_OC_CLR_ENABLE
          - TIM_OC_CLR_DISABLE
return  none
void TIM_ClrOc7Ref(TIM_Module* TIMx, uint32_t TIM_OCClear)在外部事件上清除或保护 OCREF7 信号。
源码注释
name    TIM_ClrOc7Ref
fun     Clears or safeguards the OCREF7 signal on an external event
param   TIMx (The input parameters must be the following values):
          - TIM1
param   TIM_OCPreload
          - TIM_OC_CLR_ENABLE
          - TIM_OC_CLR_DISABLE
return  none
void TIM_ClrOcRefInputSource(TIM_Module* TIMx, uint32_t OCRefClearInputSource)设置 OCREF 清除输入源。
源码注释
name    TIM_ClrOcRefInputSource
fun     Set the OCREF clear input source
param   TIMx (The input parameters must be the following values):
          - TIM1
          - TIM3
          - TIM4
param   OCRefClearInputSource
          - TIM_ETRSEL
          - TIM_COMPSEL
return  none
void TIM_ConfigOc1Polarity(TIM_Module* TIMx, uint32_t OcPolarity)配置 TIMx 通道 1 的极性。
源码注释
name    TIM_ConfigOc1Polarity
fun     Configures the TIMx channel 1 polarity.
param   TIMx (The input parameters must be the following values):
          - TIM1
          - TIM3
          - TIM4
param   TIM_OCPreload
          - TIM_OC_POLARITY_HIGH
          - TIM_OC_POLARITY_LOW
return  none
void TIM_ConfigOc1NPolarity(TIM_Module* TIMx, uint32_t OcNPolarity)配置 TIMx 通道 1N 的极性。
源码注释
name    TIM_ConfigOc1NPolarity
fun     Configures the TIMx channel 1N polarity.
param   TIMx (The input parameters must be the following values):
          - TIM1
param   TIM_OCPreload
          - TIM_OCN_POLARITY_HIGH
          - TIM_OCN_POLARITY_LOW
return  none
void TIM_ConfigOc2Polarity(TIM_Module* TIMx, uint32_t OcPolarity)配置 TIMx 通道 2 的极性。
源码注释
name    TIM_ConfigOc2Polarity
fun     Configures the TIMx channel 2 polarity.
param   TIMx (The input parameters must be the following values):
          - TIM1
          - TIM3
          - TIM4
param   TIM_OCPreload
          - TIM_OC_POLARITY_HIGH
          - TIM_OC_POLARITY_LOW
return  none
void TIM_ConfigOc2NPolarity(TIM_Module* TIMx, uint32_t OcNPolarity)配置 TIMx 通道 2N 的极性。
源码注释
name    TIM_ConfigOc2NPolarity
fun     Configures the TIMx channel 2N polarity.
param   TIMx (The input parameters must be the following values):
          - TIM1
param   TIM_OCPreload
          - TIM_OCN_POLARITY_HIGH
          - TIM_OCN_POLARITY_LOW
return  none
void TIM_ConfigOc3Polarity(TIM_Module* TIMx, uint32_t OcPolarity)配置 TIMx 通道 3 的极性。
源码注释
name    TIM_ConfigOc3Polarity
fun     Configures the TIMx channel 3 polarity.
param   TIMx (The input parameters must be the following values):
          - TIM1
          - TIM3
          - TIM4
param   TIM_OCPreload
          - TIM_OC_POLARITY_HIGH
          - TIM_OC_POLARITY_LOW
return  none
void TIM_ConfigOc3NPolarity(TIM_Module* TIMx, uint32_t OcNPolarity)配置 TIMx 通道 3N 的极性。
源码注释
name    TIM_ConfigOc3NPolarity
fun     Configures the TIMx channel 3N polarity.
param   TIMx (The input parameters must be the following values):
          - TIM1
param   TIM_OCPreload
          - TIM_OCN_POLARITY_HIGH
          - TIM_OCN_POLARITY_LOW
return  none
void TIM_ConfigOc4Polarity(TIM_Module* TIMx, uint32_t OcPolarity)配置 TIMx 通道 4 的极性。
源码注释
name    TIM_ConfigOc4Polarity
fun     Configures the TIMx channel 4 polarity.
param   TIMx (The input parameters must be the following values):
          - TIM1
          - TIM3
param   TIM_OCPreload
          - TIM_OC_POLARITY_HIGH
          - TIM_OC_POLARITY_LOW
return  none
void TIM_ConfigOc4NPolarity(TIM_Module* TIMx, uint32_t OcNPolarity)配置 TIMx 通道 4N 的极性。
源码注释
name    TIM_ConfigOc4NPolarity
fun     Configures the TIMx channel 4N polarity.
param   TIMx (The input parameters must be the following values):
          - TIM1
param   TIM_OCPreload
          - TIM_OCN_POLARITY_HIGH
          - TIM_OCN_POLARITY_LOW
return  none
void TIM_ConfigOc5Polarity(TIM_Module* TIMx, uint32_t OcPolarity)配置 TIMx 通道 5 的极性。
源码注释
name    TIM_ConfigOc5Polarity
fun     Configures the TIMx channel 5 polarity.
param   TIMx (The input parameters must be the following values):
          - TIM1
param   TIM_OCPreload
          - TIM_OC_POLARITY_HIGH
          - TIM_OC_POLARITY_LOW
return  none
void TIM_ConfigOc6Polarity(TIM_Module* TIMx, uint32_t OcPolarity)配置 TIMx 通道 6 的极性。
源码注释
name    TIM_ConfigOc6Polarity
fun     Configures the TIMx channel 6 polarity.
param   TIMx (The input parameters must be the following values):
          - TIM1
param   TIM_OCPreload
          - TIM_OC_POLARITY_HIGH
          - TIM_OC_POLARITY_LOW
return  none
void TIM_ConfigOc7Polarity(TIM_Module* TIMx, uint32_t OcPolarity)配置 TIMx 通道 7 的极性。
源码注释
name    TIM_ConfigOc7Polarity
fun     Configures the TIMx channel 7 polarity.
param   TIMx (The input parameters must be the following values):
          - TIM1
param   TIM_OCPreload
          - TIM_OC_POLARITY_HIGH
          - TIM_OC_POLARITY_LOW
return  none
void TIM_EnableCapCmpCh(TIM_Module* TIMx, uint32_t Channel, uint32_t TIM_CCx)使能或禁止 TIM 捕获比较通道 x。
源码注释
name    TIM_EnableCapCmpCh
fun     Enables or disables the TIM Capture Compare Channel x.
param   TIMx (The input parameters must be the following values):
          - TIM1
          - TIM3
          - TIM4
param   Channel
          - TIM_CH_1
          - TIM_CH_2
          - TIM_CH_3
          - TIM_CH_4
          - TIM_CH_5
          - TIM_CH_6
          - TIM_CH_7
param   TIM_CCx
          - TIM_CAP_CMP_ENABLE
          - TIM_CAP_CMP_DISABLE
return  none
void TIM_EnableCapCmpChN(TIM_Module* TIMx, uint32_t Channel, uint32_t TIM_CCxN)使能或禁止 TIM 捕获比较通道 xN。
源码注释
name    TIM_EnableCapCmpChN
fun     Enables or disables the TIM Capture Compare Channel xN.
param   TIMx (The input parameters must be the following values):
          - TIM1
param   Channel
          - TIM_CH_1
          - TIM_CH_2
          - TIM_CH_3
          - TIM_CH_4
param   TIM_CCx
          - TIM_CAP_CMP_N_ENABLE
          - TIM_CAP_CMP_N_DISABLE
return  none
void TIM_SelectOcMode(TIM_Module* TIMx, uint32_t Channel, uint32_t OcMode)选择 TIM 输出比较模式。
源码注释
name    TIM_SelectOcMode
fun     Selects the TIM Output Compare Mode.
param   TIMx (The input parameters must be the following values):
          - TIM1
          - TIM3
          - TIM4
param   Channel
          - TIM_CH_1
          - TIM_CH_2
          - TIM_CH_3
          - TIM_CH_4
          - TIM_CH_5
          - TIM_CH_6
          - TIM_CH_7
param   OcMode
          - TIM_OCMODE_TIMING
          - TIM_OCMODE_ACTIVE
          - TIM_OCMODE_INACTIVE
          - TIM_OCMODE_TOGGLE
          - TIM_OCMODE_PWM1
          - TIM_OCMODE_PWM2
          - TIM_FORCED_ACTION_ACTIVE
          - TIM_FORCED_ACTION_INACTIVE
return  none
void TIM_EnableUpdateEvt(TIM_Module* TIMx, FunctionalState Cmd)使能或禁止 TIMx 更新事件。
源码注释
name    TIM_EnableUpdateEvt
fun     Enables or Disables the TIMx Update event.
param   TIMx (The input parameters must be the following values):
          - TIM1
          - TIM3
          - TIM4
          - TIM6
param   Cmd
          - ENABLE
          - DISABLE
return  none
void TIM_ConfigUpdateEvt(TIM_Module* TIMx, FunctionalState Cmd)使能或禁止 TIMx 更新事件。
源码注释
name    TIM_ConfigUpdateEvt
fun     Enables or Disables the TIMx Update event.
param   TIMx (The input parameters must be the following values):
          - TIM1
          - TIM3
          - TIM4
          - TIM6
param   Cmd
          - ENABLE
          - DISABLE
return  none
void TIM_ConfigUpdateRequestIntSrc(TIM_Module* TIMx, uint32_t TIM_UpdateSource)配置 TIMx 更新请求中断源。
源码注释
name    TIM_ConfigUpdateRequestIntSrc
fun     Configures the TIMx Update Request Interrupt source.
param   TIMx (The input parameters must be the following values):
          - TIM1
          - TIM3
          - TIM4
          - TIM6
param   TIM_UpdateSource
          - TIM_UPDATE_SRC_GLOBAL
          - TIM_UPDATE_SRC_REGULAR
return  none
void TIM_SelectHallSensor(TIM_Module* TIMx, FunctionalState Cmd)使能或禁止 TIMx 的霍尔传感器接口。
源码注释
name    TIM_SelectHallSensor
fun     Enables or disables the TIMx's Hall sensor interface.
param   TIMx (The input parameters must be the following values):
          - TIM1
          - TIM3
          - TIM4
param   Cmd
          - ENABLE
          - DISABLE
return  none
void TIM_SelectOnePulseMode(TIM_Module* TIMx, uint32_t TIM_OPMode)选择 TIMx 的单脉冲模式。
源码注释
name    TIM_SelectOnePulseMode
fun     Selects the TIMx's One Pulse Mode.
param   TIMx (The input parameters must be the following values):
          - TIM1
          - TIM3
          - TIM4
          - TIM6
param   TIM_OPMode
          - TIM_OPMODE_SINGLE
          - TIM_OPMODE_REPET
return  none
void TIM_SelectOutputTrig(TIM_Module* TIMx, uint32_t TIM_TRGOSource)选择 TIMx 触发输出模式。
源码注释
name    TIM_SelectOutputTrig
fun     Selects the TIMx Trigger Output Mode.
param   TIMx (The input parameters must be the following values):
          - TIM1
          - TIM3
          - TIM4
param   TIM_TRGOSource
          - TIM_TRGO_SRC_RESET
          - TIM_TRGO_SRC_ENABLE
          - TIM_TRGO_SRC_UPDATE
          - TIM_TRGO_SRC_OC1
          - TIM_TRGO_SRC_OC1REF
          - TIM_TRGO_SRC_OC2REF
          - TIM_TRGO_SRC_OC3REF
          - TIM_TRGO_SRC_OC4REF
          - TIM_TRGO_SRC_OC5REF
          - TIM_TRGO_SRC_OC6REF
          - TIM_TRGO_SRC_OC7REF
return  none
void TIM_SelectSlaveMode(TIM_Module* TIMx, uint32_t TIM_SlaveMode)选择 TIMx 从模式。
源码注释
name    TIM_SelectSlaveMode
fun     Selects the TIMx Slave Mode.
param   TIMx (The input parameters must be the following values):
          - TIM1
          - TIM3
          - TIM4
param   TIM_SlaveMode
          - TIM_SLAVE_MODE_DISABLE
          - TIM_SLAVE_MODE_RESET
          - TIM_SLAVE_MODE_GATED
          - TIM_SLAVE_MODE_TRIG
          - TIM_SLAVE_MODE_EXT1
          - TIM_SLAVE_MODE_GATED_RESET
          - TIM_SLAVE_MODE_TRIG_RESET
return  none
void TIM_SelectMasterSlaveMode(TIM_Module* TIMx, uint32_t TIM_MasterSlaveMode)置位或复位 TIMx 主从模式。
源码注释
name    TIM_SelectMasterSlaveMode
fun     Sets or Resets the TIMx Master/Slave Mode.
param   TIMx (The input parameters must be the following values):
          - TIM1
          - TIM3
          - TIM4
param   TIM_SlaveMode
          - TIM_MASTER_SLAVE_MODE_ENABLE
          - TIM_MASTER_SLAVE_MODE_DISABLE
return  none
void TIM_SetCnt(TIM_Module* TIMx, uint32_t Counter)设置 TIMx 计数器寄存器值。
源码注释
name    TIM_SetCnt
fun     Sets the TIMx Counter Register value
param   TIMx (The input parameters must be the following values):
          - TIM1
          - TIM3
          - TIM4
          - TIM6
param   Counter
          - Counter can be a number between 0x00000000 and 0xFFFFFFFF
return  none
void TIM_SetAutoReload(TIM_Module* TIMx, uint32_t Autoreload)设置 TIMx 自动重装载寄存器值。
源码注释
name    TIM_SetAutoReload
fun     Sets the TIMx Autoreload Register value
param   TIMx (The input parameters must be the following values):
          - TIM1
          - TIM3
          - TIM4
          - TIM6
param   Autoreload
          - Autoreload can be a number between 0x00000000 and 0xFFFFFFFF
return  none
void TIM_SetCmp1(TIM_Module* TIMx, uint32_t Compare1)设置 TIMx 捕获比较 1 寄存器值。
源码注释
name    TIM_SetCmp1
fun     Sets the TIMx Capture Compare1 Register value
param   TIMx (The input parameters must be the following values):
          - TIM1
          - TIM3
          - TIM4
param   Compare1
          - Compare1 can be a number between 0x00000000 and 0xFFFFFFFF
return  none
void TIM_SetCmp2(TIM_Module* TIMx, uint32_t Compare2)设置 TIMx 捕获比较 2 寄存器值。
源码注释
name    TIM_SetCmp2
fun     Sets the TIMx Capture Compare2 Register value
param   TIMx (The input parameters must be the following values):
          - TIM1
          - TIM3
          - TIM4
param   Compare2
          - Compare2 can be a number between 0x00000000 and 0xFFFFFFFF
return  none
void TIM_SetCmp3(TIM_Module* TIMx, uint32_t Compare3)设置 TIMx 捕获比较 3 寄存器值。
源码注释
name    TIM_SetCmp3
fun     Sets the TIMx Capture Compare3 Register value
param   TIMx (The input parameters must be the following values):
          - TIM1
          - TIM3
          - TIM4
param   Compare3
          - Compare3 can be a number between 0x00000000 and 0xFFFFFFFF
return  none
void TIM_SetCmp4(TIM_Module* TIMx, uint16_t Compare4)设置 TIMx 捕获比较 4 寄存器值。
源码注释
name    TIM_SetCmp4
fun     Sets the TIMx Capture Compare4 Register value
param   TIMx (The input parameters must be the following values):
          - TIM1
          - TIM3
param   Compare4
          - Compare4 can be a number between 0x0000 and 0xFFFF
return  none
void TIM_SetCmp5(TIM_Module* TIMx, uint16_t Compare5)设置 TIMx 捕获比较 5 寄存器值。
源码注释
name    TIM_SetCmp5
fun     Sets the TIMx Capture Compare5 Register value
param   TIMx (The input parameters must be the following values):
          - TIM1
param   Compare5
          - Compare5 can be a number between 0x0000 and 0xFFFF
return  none
void TIM_SetCmp6(TIM_Module* TIMx, uint16_t Compare6)设置 TIMx 捕获比较 6 寄存器值。
源码注释
name    TIM_SetCmp6
fun     Sets the TIMx Capture Compare6 Register value
param   TIMx (The input parameters must be the following values):
          - TIM1
param   Compare6
          - Compare6 can be a number between 0x0000 and 0xFFFF
return  none
void TIM_SetCmp7(TIM_Module* TIMx, uint16_t Compare7)设置 TIMx 捕获比较 7 寄存器值。
源码注释
name    TIM_SetCmp7
fun     Sets the TIMx Capture Compare7 Register value
param   TIMx (The input parameters must be the following values):
          - TIM1
param   Compare7
          - Compare7 can be a number between 0x0000 and 0xFFFF
return  none
void TIM_SetCmp1D(TIM_Module* TIMx, uint16_t compare1D)设置 TIM1_CCDAT1 寄存器中的 CCDDAT1[16:31]。
源码注释
name    TIM_SetCmp1D
fun     Sets the CCDDAT1[16:31] in TIM1_CCDAT1 register
param   TIMx (The input parameters must be the following values):
          - TIM1
param   compare1D
          - compare1D can be a number between 0x0000 and 0xFFFF
return  none
void TIM_SetCmp2D(TIM_Module* TIMx, uint16_t compare2D)设置 TIM1_CCDAT2 寄存器中的 CCDDAT2[16:31]。
源码注释
name    TIM_SetCmp2D
fun     Sets the CCDDAT2[16:31] in TIM1_CCDAT2 register
param   TIMx (The input parameters must be the following values):
          - TIM1
param   compare2D
          - compare2D can be a number between 0x0000 and 0xFFFF
return  none
void TIM_SetCmp3D(TIM_Module* TIMx, uint16_t compare3D)设置 TIM1_CCDAT3 寄存器中的 CCDDAT3[16:31]。
源码注释
name    TIM_SetCmp3D
fun     Sets the CCDDAT3[16:31] in TIM1_CCDAT3 register
param   TIMx (The input parameters must be the following values):
          - TIM1
param   compare3D
          - compare3D can be a number between 0x0000 and 0xFFFF
return  none
void TIM_SetCmp4D(TIM_Module* TIMx, uint16_t compare4D)设置 TIM1_CCDAT4 寄存器中的 CCDDAT4[16:31]。
源码注释
name    TIM_SetCmp4D
fun     Sets the CCDDAT4[16:31] in TIM1_CCDAT4 register
param   TIMx (The input parameters must be the following values):
          - TIM1
param   compare4D
          - compare4D can be a number between 0x0000 and 0xFFFF
return  none
void ConfigTI1(TIM_Module* TIMx, uint32_t ICPolarity, uint32_t ICSelection, uint32_t ICFilter)将 TI1 配置为输入。
源码注释
name    ConfigTI1
fun     Configure the TI1 as Input.
param   TIMx (The input parameters must be the following values):
          - TIM1
          - TIM3
          - TIM4
param   ICPolarity
          - TIM_IC_POLARITY_RISING
          - TIM_IC_POLARITY_FALLING
param   ICSelection
          - TIM_IC_SELECTION_DIRECTTI
          - TIM_IC_SELECTION_INDIRECTTI
          - TIM_IC_SELECTION_TRC
param   ICFilter
          - ICFilter can be a number between 0x0 and 0xF
return  none
void ConfigTI2(TIM_Module* TIMx, uint32_t ICPolarity, uint32_t ICSelection, uint32_t ICFilter)将 TI2 配置为输入。
源码注释
name    ConfigTI2
fun     Configure the TI2 as Input.
param   TIMx (The input parameters must be the following values):
          - TIM1
          - TIM3
          - TIM4
param   ICPolarity
          - TIM_IC_POLARITY_RISING
          - TIM_IC_POLARITY_FALLING
param   ICSelection
          - TIM_IC_SELECTION_DIRECTTI
          - TIM_IC_SELECTION_INDIRECTTI
          - TIM_IC_SELECTION_TRC
param   ICFilter
          - ICFilter can be a number between 0x0 and 0xF
return  none
void ConfigTI3(TIM_Module* TIMx, uint32_t ICPolarity, uint32_t ICSelection, uint32_t ICFilter)将 TI3 配置为输入。
源码注释
name    ConfigTI3
fun     Configure the TI3 as Input.
param   TIMx (The input parameters must be the following values):
          - TIM1
          - TIM3
          - TIM4
param   ICPolarity
          - TIM_IC_POLARITY_RISING
          - TIM_IC_POLARITY_FALLING
param   ICSelection
          - TIM_IC_SELECTION_DIRECTTI
          - TIM_IC_SELECTION_INDIRECTTI
          - TIM_IC_SELECTION_TRC
param   ICFilter
          - ICFilter can be a number between 0x0 and 0xF
return  none
void ConfigTI4(TIM_Module* TIMx, uint32_t ICPolarity, uint32_t ICSelection, uint32_t ICFilter)将 TI4 配置为输入。
源码注释
name    ConfigTI4
fun     Configure the TI4 as Input.
param   TIMx (The input parameters must be the following values):
          - TIM1
          - TIM3
param   ICPolarity
          - TIM_IC_POLARITY_RISING
          - TIM_IC_POLARITY_FALLING
param   ICSelection
          - TIM_IC_SELECTION_DIRECTTI
          - TIM_IC_SELECTION_INDIRECTTI
          - TIM_IC_SELECTION_TRC
param   ICFilter
          - ICFilter can be a number between 0x0 and 0xF
return  none
void TIM_SetInCap1Prescaler(TIM_Module* TIMx, uint32_t ICPrescaler)设置 TIMx 输入捕获 1 的预分频器。
源码注释
name    TIM_SetInCap1Prescaler
fun     Sets the TIMx Input Capture 1 prescaler.
param   TIMx (The input parameters must be the following values):
          - TIM1
          - TIM3
          - TIM4
param   ICPrescaler
          - TIM_IC_PSC_DIV1
          - TIM_IC_PSC_DIV2
          - TIM_IC_PSC_DIV4
          - TIM_IC_PSC_DIV8
return  none
void TIM_SetInCap2Prescaler(TIM_Module* TIMx, uint32_t ICPrescaler)设置 TIMx 输入捕获 2 的预分频器。
源码注释
name    TIM_SetInCap2Prescaler
fun     Sets the TIMx Input Capture 2 prescaler.
param   TIMx (The input parameters must be the following values):
          - TIM1
          - TIM3
          - TIM4
param   ICPrescaler
          - TIM_IC_PSC_DIV1
          - TIM_IC_PSC_DIV2
          - TIM_IC_PSC_DIV4
          - TIM_IC_PSC_DIV8
return  none
void TIM_SetInCap3Prescaler(TIM_Module* TIMx, uint32_t ICPrescaler)设置 TIMx 输入捕获 3 的预分频器。
源码注释
name    TIM_SetInCap3Prescaler
fun     Sets the TIMx Input Capture 3 prescaler.
param   TIMx (The input parameters must be the following values):
          - TIM1
          - TIM3
          - TIM4
param   ICPrescaler
          - TIM_IC_PSC_DIV1
          - TIM_IC_PSC_DIV2
          - TIM_IC_PSC_DIV4
          - TIM_IC_PSC_DIV8
return  none
void TIM_SetInCap4Prescaler(TIM_Module* TIMx, uint32_t ICPrescaler)设置 TIMx 输入捕获 4 的预分频器。
源码注释
name    TIM_SetInCap4Prescaler
fun     Sets the TIMx Input Capture 4 prescaler.
param   TIMx (The input parameters must be the following values):
          - TIM1
          - TIM3
param   ICPrescaler
          - TIM_IC_PSC_DIV1
          - TIM_IC_PSC_DIV2
          - TIM_IC_PSC_DIV4
          - TIM_IC_PSC_DIV8
return  none
void TIM_SelectInputTrig(TIM_Module* TIMx, uint32_t TIM_InputTriggerSource)选择输入触发源。
源码注释
name    TIM_SelectInputTrig
fun     Selects the Input Trigger source
param   TIMx (The input parameters must be the following values):
          - TIM1
          - TIM3
          - TIM4
param   TIM_InputTriggerSource:
          - TIM_TRIG_SEL_IN_TR0
          - TIM_TRIG_SEL_IN_TR1
          - TIM_TRIG_SEL_IN_TR2
          - TIM_TRIG_SEL_IN_TR3
          - TIM_TRIG_SEL_TI1F_ED
          - TIM_TRIG_SEL_TI1FP1
          - TIM_TRIG_SEL_TI2FP2
          - TIM_TRIG_SEL_ETRF
return  none
void TIM_ConfigExtTrig(TIM_Module* TIMx,uint32_t TIM_ExtTRGPrescaler,uint32_t TIM_ExtTRGPolarity,uint32_t ExtTRGFilter)配置 TIMx 外部触发(ETR)。
源码注释
name    TIM_ConfigExtTrig
fun     Configures the TIMx External Trigger (ETR).
param   TIMx (The input parameters must be the following values):
          - TIM1
          - TIM3
          - TIM4
param   TIM_ExtTRGPrescaler:
          - TIM_EXT_TRG_PSC_OFF
          - TIM_EXT_TRG_PSC_DIV2
          - TIM_EXT_TRG_PSC_DIV4
          - TIM_EXT_TRG_PSC_DIV8
param   TIM_ExtTRGPolarity
          - TIM_EXT_TRIG_POLARITY_INVERTED
          - TIM_EXT_TRIG_POLARITY_NONINVERTED
param   ExtTRGFilter
          - ExtTRGFilter can be a number between 0x0 and 0xF
return  none
void TIM_SetClkDiv(TIM_Module* TIMx, uint32_t TIM_CKD)设置 TIMx 时钟分频值。
源码注释
name    TIM_SetClkDiv
fun     Sets the TIMx Clock Division value.
param   TIMx (The input parameters must be the following values):
          - TIM1
param   TIM_CKD:
          - TIM_CLK_DIV1
          - TIM_CLK_DIV2
          - TIM_CLK_DIV4
return  none
uint32_t TIM_GetCap1(TIM_Module* TIMx)获取 TIMx 输入捕获 1 的值。
源码注释
name    TIM_GetCap1
fun     Gets the TIMx Input Capture 1 value.
param   TIMx (The input parameters must be the following values):
          - TIM1
          - TIM3
          - TIM4
return  Capture Compare 1 Register value.
uint32_t TIM_GetCap2(TIM_Module* TIMx)获取 TIMx 输入捕获 2 的值。
源码注释
name    TIM_GetCap2
fun     Gets the TIMx Input Capture 2 value.
param   TIMx (The input parameters must be the following values):
          - TIM1
          - TIM3
          - TIM4
return  Capture Compare 2 Register value.
uint32_t TIM_GetCap3(TIM_Module* TIMx)获取 TIMx 输入捕获 3 的值。
源码注释
name    TIM_GetCap3
fun     Gets the TIMx Input Capture 3 value.
param   TIMx (The input parameters must be the following values):
          - TIM1
          - TIM3
          - TIM4
return  Capture Compare 3 Register value.
uint16_t TIM_GetCap4(TIM_Module* TIMx)获取 TIMx 输入捕获 4 的值。
源码注释
name    TIM_GetCap4
fun     Gets the TIMx Input Capture 4 value.
param   TIMx (The input parameters must be the following values):
          - TIM1
          - TIM3
return  Capture Compare 4 Register value.
uint16_t TIM_GetCap5(TIM_Module* TIMx)获取 TIMx 输入捕获 5 的值。
源码注释
name    TIM_GetCap5
fun     Gets the TIMx Input Capture 5 value.
param   TIMx (The input parameters must be the following values):
          - TIM1
return  Capture Compare 5 Register value.
uint16_t TIM_GetCap6(TIM_Module* TIMx)获取 TIMx 输入捕获 6 的值。
源码注释
name    TIM_GetCap6
fun     Gets the TIMx Input Capture 6 value.
param   TIMx (The input parameters must be the following values):
          - TIM1
return  Capture Compare 6 Register value.
uint16_t TIM_GetCap7(TIM_Module* TIMx)获取 TIMx 输入捕获 7 的值。
源码注释
name    TIM_GetCap7
fun     Gets the TIMx Input Capture 7 value.
param   TIMx (The input parameters must be the following values):
          - TIM1
return  Capture Compare 7 Register value.
uint16_t TIM_GetCap1D(TIM_Module* TIMx)获取 TIMx 输入捕获 1D 的值。
源码注释
name    TIM_GetCap1D
fun     Gets the TIMx Input Capture 1D value.
param   TIMx (The input parameters must be the following values):
          - TIM1
return  Capture Compare 1D Register value.
uint16_t TIM_GetCap2D(TIM_Module* TIMx)获取 TIMx 输入捕获 2D 的值。
源码注释
name    TIM_GetCap2D
fun     Gets the TIMx Input Capture 2D value.
param   TIMx (The input parameters must be the following values):
          - TIM1
return  Capture Compare 2D Register value.
uint16_t TIM_GetCap3D(TIM_Module* TIMx)获取 TIMx 输入捕获 3D 的值。
源码注释
name    TIM_GetCap3D
fun     Gets the TIMx Input Capture 3D value.
param   TIMx (The input parameters must be the following values):
          - TIM1
return  Capture Compare 3D Register value.
uint16_t TIM_GetCap4D(TIM_Module* TIMx)获取 TIMx 输入捕获 4D 的值。
源码注释
name    TIM_GetCap4D
fun     Gets the TIMx Input Capture 4D value.
param   TIMx (The input parameters must be the following values):
          - TIM1
return  Capture Compare 4D Register value.
uint32_t TIM_GetCnt(TIM_Module* TIMx)获取 TIMx 计数器值。
源码注释
name    TIM_GetCnt
fun     Gets the TIMx Counter value.
param   TIMx (The input parameters must be the following values):
          - TIM1
          - TIM3
          - TIM4
          - TIM6
return  Counter Register value.
uint16_t TIM_GetPrescaler(TIM_Module* TIMx)获取 TIMx 预分频器值。
源码注释
name    TIM_GetPrescaler
fun     Gets the TIMx Prescaler value.
param   TIMx (The input parameters must be the following values):
          - TIM1
          - TIM3
          - TIM4
          - TIM6
return  Prescaler Register value.
uint32_t TIM_GetAutoReload(TIM_Module* TIMx)获取 TIMx AR 值。
源码注释
name    TIM_GetAutoReload
fun     Gets the TIMx AR value.
param   TIMx (The input parameters must be the following values):
          - TIM1
          - TIM3
          - TIM4
          - TIM6
return  AR Register value.
FlagStatus TIM_GetCCENStatus(TIM_Module* TIMx, uint32_t TIM_CCEN)检查指定的 TIM 标志是否置位。
源码注释
name    TIM_GetCCENStatus
fun     Checks whether the specified TIM flag is set or not.
param   TIMx (The input parameters must be the following values):
          - TIM1
          - TIM3
          - TIM4
param   TIM_CCEN :
          - TIM_CC1EN
          - TIM_CC1NEN
          - TIM_CC2EN
          - TIM_CC2NEN
          - TIM_CC3EN
          - TIM_CC3NEN
          - TIM_CC4EN
          - TIM_CC4NEN
          - TIM_CC5EN
          - TIM_CC6EN
          - TIM_CC7EN
return  The new state of TIM_FLAG (SET or RESET).
FlagStatus TIM_GetFlagStatus(TIM_Module* TIMx, uint32_t TIM_FLAG)检查指定的 TIM 标志是否置位。
源码注释
name    TIM_GetFlagStatus
fun     Checks whether the specified TIM flag is set or not.
param   TIMx (The input parameters must be the following values):
          - TIM1
          - TIM3
          - TIM4
          - TIM6
param   TIM_FLAG :
          - TIM_FLAG_CC1
          - TIM_FLAG_CC2
          - TIM_FLAG_CC3
          - TIM_FLAG_CC4
          - TIM_FLAG_CC5
          - TIM_FLAG_CC6
          - TIM_FLAG_CC7
          - TIM_FLAG_CC1OF
          - TIM_FLAG_CC2OF
          - TIM_FLAG_CC3OF
          - TIM_FLAG_CC4OF
          - TIM_FLAG_UPDATE
          - TIM_FLAG_COM
          - TIM_FLAG_TRIG
          - TIM_FLAG_BREAK
          - TIM_FLAG_LBKP
          - TIM_FLAG_PBKP
          - TIM_FLAG_COMP
          - TIM_FLAG_IOM
          - TIM_FLAG_C3LDCNT
return  The new state of TIM_FLAG (SET or RESET).
void TIM_ClearFlag(TIM_Module* TIMx, uint32_t TIM_FLAG)清除 TIMx 的挂起标志。
源码注释
name    TIM_ClearFlag
fun     Clears the TIMx's pending flags.
param   TIMx (The input parameters must be the following values):
          - TIM1
          - TIM3
          - TIM4
          - TIM6
param   TIM_FLAG :
          - TIM_FLAG_CC1
          - TIM_FLAG_CC2
          - TIM_FLAG_CC3
          - TIM_FLAG_CC4
          - TIM_FLAG_CC5
          - TIM_FLAG_CC6
          - TIM_FLAG_CC7
          - TIM_FLAG_CC1OF
          - TIM_FLAG_CC2OF
          - TIM_FLAG_CC3OF
          - TIM_FLAG_CC4OF
          - TIM_FLAG_UPDATE
          - TIM_FLAG_COM
          - TIM_FLAG_TRIG
          - TIM_FLAG_BREAK
          - TIM_FLAG_LBKP
          - TIM_FLAG_PBKP
          - TIM_FLAG_COMP
          - TIM_FLAG_IOM
          - TIM_FLAG_C3LDCNT
return  none.
INTStatus TIM_GetIntStatus(TIM_Module* TIMx, uint32_t TIM_IT)检查 TIM 中断是否发生。
源码注释
name    TIM_GetIntStatus
fun     Checks whether the TIM interrupt has occurred or not.
param   TIMx (The input parameters must be the following values):
          - TIM1
          - TIM3
          - TIM4
          - TIM6
param   TIM_IT :
          - TIM_INT_UPDATE
          - TIM_INT_CC1
          - TIM_INT_CC2
          - TIM_INT_CC3
          - TIM_INT_CC4
          - TIM_INT_CC5
          - TIM_INT_CC6
          - TIM_INT_CC7
          - TIM_INT_C3LDCNT
          - TIM_INT_COM
          - TIM_INT_TRIG
          - TIM_INT_BREAK
return  The new state of the TIM_IT(SET or RESET).
void TIM_ClrIntPendingBit(TIM_Module* TIMx, uint32_t TIM_IT)清除 TIMx 的中断挂起位。
源码注释
name    TIM_ClrIntPendingBit
fun     Clears the TIMx's interrupt pending bits.
param   TIMx (The input parameters must be the following values):
          - TIM1
          - TIM3
          - TIM4
          - TIM6
param   TIM_IT :
          - TIM_INT_UPDATE
          - TIM_INT_CC1
          - TIM_INT_CC2
          - TIM_INT_CC3
          - TIM_INT_CC4
          - TIM_INT_CC5
          - TIM_INT_CC6
          - TIM_INT_CC7
          - TIM_INT_C3LDCNT
          - TIM_INT_COM
          - TIM_INT_TRIG
          - TIM_INT_BREAK
return  none.
void TIM_AsymmetricEnable(TIM_Module* TIMx, FunctionalState Cmd)在中心对齐模式下使能或禁止非对称模式。
源码注释
name    TIM_Asymmetric_Enable.
fun     Enable or disable asymmetric mode in center-aligned.
param   TIMx:
          - TIM1
param   Cmd
          - ENABLE
          - DISABLE
return  none

使用提示: 本函数在 n32g033_tim.h 第 713 行声明;其正上方注释的 name 行为 TIM_Asymmetric_Enable.,与函数名 TIM_AsymmetricEnable 不一致,功能说明以 fun 行为准。

void TIM_IC1FiltConfig(TIM_Module* TIMx, TIM_FiltInitType* TIM_FiltInitStruct)配置通道 1 的滤波器。
源码注释
name    TIM_IC1FiltConfig
fun     Config the filter of channel1.
param   TIMx:
          - TIM4
param   TIM_FiltInitStruct:
          - refer to the definition of TIM_FiltInitType
return  none
void TIM_IC2FiltConfig(TIM_Module* TIMx, TIM_FiltInitType* TIM_FiltInitStruct)配置通道 2 的滤波器。
源码注释
name    TIM_IC2FiltConfig
fun     Config the filter of channel2.
param   TIMx:
          - TIM4
param   TIM_FiltInitStruct:
          - refer to the definition of TIM_FiltInitType
return  none
void TIM_IC3FiltConfig(TIM_Module* TIMx, TIM_FiltInitType* TIM_FiltInitStruct)配置通道 3 的滤波器。
源码注释
name    TIM_IC3FiltConfig
fun     Config the filter of channel3.
param   TIMx:
          - TIM4
param   TIM_FiltInitStruct:
          - refer to the definition of TIM_FiltInitType
return  none
void TIM_IC1FiltEnable(TIM_Module* TIMx,FunctionalState Cmd)使能或禁止通道 1 的滤波器。
源码注释
name    TIM_IC1FiltEnable
fun     Enable or disable the filter of channel1.
param   TIMx:
          - TIM4
param   Cmd :
          - ENABLE
          - DISABLE
return  none
void TIM_IC2FiltEnable(TIM_Module* TIMx,FunctionalState Cmd)使能或禁止通道 2 的滤波器。
源码注释
name    TIM_IC2FiltEnable
fun     Enable or disable the filter of channel2.
param   TIMx:
          - TIM4
param   Cmd :
          - ENABLE
          - DISABLE
return  none
void TIM_IC3FiltEnable(TIM_Module* TIMx,FunctionalState Cmd)使能或禁止通道 3 的滤波器。
源码注释
name    TIM_IC3FiltEnable
fun     Enable or disable the filter of channel3.
param   TIMx:
          - TIM4
param   Cmd :
          - ENABLE
          - DISABLE
return  none
FlagStatus TIM_GetFiltStatus(TIM_Module* TIMx, uint32_t TIM_FiltFlag)检查指定的滤波器状态。
源码注释
name    TIM_GetFiltStatus
fun     Checks the specified filter status.
param   TIMx (The input parameters must be the following values):
          - TIM4
param   TIM_FiltFlag :
          - TIM_C1FILTO
          - TIM_C2FILTO
          - TIM_C3FILTO
return  The new state of TIM_FiltFlag (SET or RESET).
void TIM_TrgiLoadLvrToCNTEnable(FunctionalState Cmd)TRGI 信号触发将 ENCLVR 值装载到 CNT。
源码注释
name    TIM_TrgiLoadLvrToCNTEnable
fun     The TRGI signal triggers the loading of the ENCLVR value into the CNT.
param   Cmd :
          - ENABLE
          - DISABLE
return  none
note  only for TIM3
uint32_t TIM_GetLVR(TIM_Module* TIMx)获取 TIMx 的 LVR 值。
源码注释
name    TIM_GetLVR
fun     Get the TIMx LVR value.
param   TIMx (The input parameters must be the following values):
          - TIM3
          - TIM4
return  ENCLVR Register value.
void TIM_CH3LoadLvrToCNTEnable(FunctionalState Cmd)CH3 触发将 ENCLVR 值装载到 CNT。
源码注释
name    TIM_CH3LoadLvrToCNTEnable
fun     The CH3 triggers the loading of the ENCLVR value into the CNT.
param   Cmd :
          - ENABLE
          - DISABLE
return  none
note  only for TIM4
void TIM_CH3LoadLvrToCNTPolarity(uint32_t Polarity)配置 CH3 极性以触发将 ENCLVR 值装载到 CNT。
源码注释
name    TIM_CH3LoadLvrToCNTPolarity
fun     Config CH3 Polarity to trigger ENCLVR value loading into the CNT.
param   Polarity :
          - TIM_CH3_POLARITY_HIGH
          - TIM_CH3_POLARITY_LOW
          - TIM_CH3_POLARITY_RISING
          - TIM_CH3_POLARITY_FALLING
return  none
note  only for TIM4
uint32_t TIM_GetENCDAT(TIM_Module* TIMx)获取 TIMx 的 ENCDAT 值。
源码注释
name    TIM_GetENCDAT
fun     Gets the TIMx ENCDAT value.
param   TIMx (The input parameters must be the following values):
          - TIM4
return  ENCDAT Register value.
uint32_t TIM_GetENCDATSign(TIM_Module* TIMx)获取 TIMx ENCDAT 值的符号。
源码注释
name    TIM_GetENCDATSign
fun     Get the sign of TIMx ENCDAT value.
param   TIMx (The input parameters must be the following values):
          - TIM4
return  Sign of TIMx ENCDAT value.

5.18.3 Demo 示例说明

本节说明 TIM 的 19 个示例:6Steps 用 SysTick 触发 COM 事件输出六步换相波形,ComplementarySignals 输出四对带死区和刹车的互补波形,DMA 用 DMA 循环改写比较值,DMABurst 用 DMA 突发一次改写周期与占空比,ExtTrigger_Synchro 用外部触发级联同步两个定时器,InputCapture 用输入捕获测频,OCActive 与 OCInactive 演示输出比较的置有效与置无效,OCToggle 在比较匹配时翻转输出,OnePulse 由外部沿触发单脉冲,PWM_Input 测量外部 PWM 的频率与占空比,PWM_Output 输出四路占空比不同的 PWM,TimeBase 用比较事件产生定时中断,TimeBasic_TIM1、TimeBasic_TIM3、TimeBasic_TIM4、TimeBasic_TIM6 用更新中断翻转 IO,TimeBasic6_wakeup 用 TIM6 的更新中断把芯片从 STOP 模式唤醒,TIMx_Synchro 让从定时器在主定时器的一个周期内计数。

5.18.3.1 6Steps 六步换相

工程目录: projects/n32g033_EVAL/examples/TIM/6Steps/

使能时钟并配置 6 路互补引脚→配置时基与三通道比较值→打开换相中断与主输出→SysTick 定时产生换相事件

项目 源码解读
功能 TIM1 用 3 路互补输出以冻结比较模式产生六步换相波形,每个 100 ms 的 COM 事件推进一个换相步。
源码组成 src/main.c 含 RCC、GPIO、NVIC、SysTick 与主函数;
src/n32g033_it.c 含 SysTick_Handler 与 TIMx_IRQHandler;
inc/main.h、inc/n32g033_it.h 为头文件;
readme.txt 给出配置与测试步骤;
工程文件在 MDK-ARM/ 与 EWARM/。
关键配置 引脚:PA4、PA3、PA5 为 TIM1 的 CH1、CH2、CH3,PA7、PB4、PB5 为 CH1N、CH2N、CH3N;
时钟:TIM1_CLK=64 MHz,PSC=0,AR=4095;
模式:通道比较冻结输出,自动输出使能;
死区:DeadTime=1,不使能刹车;
中断:TIM1 COM 事件中断,抢占优先级 1。
程序与数据路径 main → RCC_Configuration 打开 TIM1 与 6 个 GPIO 时钟 → GPIO_Configuration 把 6 个引脚配成复用推挽 → 主函数配置时基、三通道比较值与 BDTR → TIM_Enable 与 TIM_EnableCtrlPwmOutputs 打开输出 → SysTick_Handler 每 100 ms 产生一次 COM 事件 → TIMx_IRQHandler 按 step 变量切换通道状态。
主要 API TIM_InitTimBaseStruct、TIM_InitTimeBase、TIM_InitOcStruct、TIM_InitOc1、TIM_InitBkdtStruct、TIM_ConfigBkdt、TIM_ConfigInt、TIM_GenerateEvent、TIM_Enable、TIM_EnableCtrlPwmOutputs
验证方法 编译后进入调试模式,用示波器或逻辑分析仪观察 TIM1 的 6 路输出;
波形每 100 ms 按 AB、AC、BC、BA、CA、CB 的顺序推进一个换相步。
使用提示 开发环境为 KEIL MDK-ARM V5.34.0.0 或 IAR EWARM 8.50.1,硬件基于评估板 N32G033K8Q7-1_STB V1.0;
系统时钟取 HSI,SYS_CLK=64 MHz;
示例未使能刹车输入。
核心代码解读与移植

示例先把 TIM1 配成冻结比较模式并写好三个通道的比较值,再用 SysTick 定时产生 COM 事件,由中断切换通道状态。

数据路径: RCC_Configuration 打开 TIM1 与 GPIO 时钟 → GPIO_Configuration 配置 6 路复用引脚 → main 配置时基与三通道比较值并写 BDTR → TIM_EnableCtrlPwmOutputs 打开主输出 → SysTick_Handler 产生 COM 事件 → TIMx_IRQHandler 按 step 切换通道

1. 时基确定换相节拍。 计数器从 0 计到 4095 后归零,换相事件的节拍由这一周期决定。

src/main.csrc/main.c · main
    /* Time Base configuration */
    TIM_InitTimBaseStruct(&TIM_TimeBaseStructure);    
    TIM_TimeBaseStructure.Prescaler     = 0;
    TIM_TimeBaseStructure.CounterMode   = TIM_CNT_MODE_UP;
    TIM_TimeBaseStructure.Period        = 4095;
    TIM_TimeBaseStructure.ClkDiv        = TIM_CLK_DIV1;
    TIM_TimeBaseStructure.RepetCnt      = 0;
    TIM_InitTimeBase(TIMx, &TIM_TimeBaseStructure);   

移植时保持 Prescaler 与 Period 的乘积不变即可保持换相频率,改动 Period 会同时改变比较值的有效范围。

2. 三个通道用冻结比较模式,比较值只作为参考。 冻结模式下比较匹配不改写输出,通道状态完全由软件控制。

src/main.csrc/main.c · main
     /* Channel 1, 2 and 3 Configuration in PWM mode */
    TIM_InitOcStruct(&TIM_OCInitStructure);     
    TIM_OCInitStructure.OCMode       = TIM_OCMODE_TIMING;
    TIM_OCInitStructure.OutputState  = TIM_OUTPUT_STATE_ENABLE;
    TIM_OCInitStructure.OutputNState = TIM_OUTPUT_NSTATE_ENABLE;
    TIM_OCInitStructure.Pulse        = 2047;
    TIM_OCInitStructure.OCPolarity   = TIM_OC_POLARITY_HIGH;
    TIM_OCInitStructure.OCNPolarity  = TIM_OCN_POLARITY_HIGH;
    TIM_OCInitStructure.OCIdleState  = TIM_OC_IDLE_STATE_SET;
    TIM_OCInitStructure.OCNIdleState = TIM_OCN_IDLE_STATE_RESET;
    TIM_InitOc1(TIMx, &TIM_OCInitStructure);   
    
    TIM_OCInitStructure.Pulse = 1023;
    TIM_InitOc2(TIMx, &TIM_OCInitStructure);

    TIM_OCInitStructure.Pulse = 511;
    TIM_InitOc3(TIMx, &TIM_OCInitStructure);

    /* Automatic Output enable, Break, dead time and lock configuration*/
    TIM_InitBkdtStruct(&TIM_BDTRInitStructure);
    TIM_BDTRInitStructure.OSSRState       = TIM_OSSR_STATE_ENABLE;
    TIM_BDTRInitStructure.OSSIState       = TIM_OSSI_STATE_ENABLE;
    TIM_BDTRInitStructure.LOCKLevel       = TIM_LOCK_LEVEL_OFF;
    TIM_BDTRInitStructure.DeadTime        = 1;
    TIM_BDTRInitStructure.Break           = TIM_BREAK_IN_DISABLE; 
    TIM_BDTRInitStructure.AutomaticOutput = TIM_AUTO_OUTPUT_ENABLE;

    TIM_ConfigBkdt(TIMx, &TIM_BDTRInitStructure);

通道数由换相步数决定,改动通道映射时同步修改 GPIO_Configuration 中的引脚。

3. 使能计数器与 COM 中断并打开主输出。 只有主输出使能位有效,互补引脚才会真正驱动。

src/main.csrc/main.c · main
        /*TIM1 Capture Compare Preload Controller Enable*/
    TIM_EnableCapCmpPreloadControl(TIMx, ENABLE); 

    /* interrupt Enable */
    TIM_ConfigInt(TIMx, TIM_INT_COM, ENABLE);   
    
    /* TIM1 counter enable */
    TIM_Enable(TIMx, ENABLE);    
    
    /* Main Output Enable */
    TIM_EnableCtrlPwmOutputs(TIMx, ENABLE);    

4. 软件产生 COM 事件并由中断推进换相。 SysTick 每 100 ms 触发一次 COM 事件,中断里按 step 依次改写各通道状态。

src/n32g033_it.csrc/n32g033_it.c · SysTick_Handler
void SysTick_Handler(void)
{   
    /* Generate TIM1 COM event by software */
    TIM_GenerateEvent(TIMx, TIM_EVT_SRC_COM);         
}
src/n32g033_it.csrc/n32g033_it.c · TIMx_IRQHandler
void TIMx_IRQHandler(void)
{
    /* Clear TIMx COM pending bit */
    TIM_ClrIntPendingBit(TIMx, TIM_INT_COM);
    
    if (step == 1)
    {
        /* Next step: Step 2 Configuration ---------------------------- */
        /*  Channel3 configuration */
        TIM_EnableCapCmpCh(TIMx, TIM_CH_3, TIM_CAP_CMP_DISABLE);
        TIM_EnableCapCmpChN(TIMx, TIM_CH_3, TIM_CAP_CMP_N_DISABLE);

        /*  Channel1 configuration */
        TIM_SelectOcMode(TIMx, TIM_CH_1, TIM_OCMODE_PWM1);
        TIM_EnableCapCmpCh(TIMx, TIM_CH_1, TIM_CAP_CMP_ENABLE);
        TIM_EnableCapCmpChN(TIMx, TIM_CH_1, TIM_CAP_CMP_N_DISABLE);

        /*  Channel2 configuration */
        TIM_SelectOcMode(TIMx, TIM_CH_2, TIM_OCMODE_PWM1);
        TIM_EnableCapCmpCh(TIMx, TIM_CH_2, TIM_CAP_CMP_DISABLE);
        TIM_EnableCapCmpChN(TIMx, TIM_CH_2, TIM_CAP_CMP_N_ENABLE);
        step++;
    }

把 step 的状态分支换成按换相表查表,可移植到任意步数的电机控制;产生 COM 事件的定时源也可换成其他时基。

对应源码: src/main.c、src/n32g033_it.c、firmware/n32g033_std_periph_driver/inc/n32g033_tim.h

5.18.3.2 ComplementarySignals 互补输出与死区

工程目录: projects/n32g033_EVAL/examples/TIM/ComplementarySignals/

使能时钟并配置四对互补引脚与刹车引脚→计算周期与四通道比较值→配置死区与刹车输入→打开计数器与主输出

项目 源码解读
功能 TIM1 输出 4 对带死区的互补 PWM,刹车输入 PA2 有效时全部输出进入空闲状态。
源码组成 src/main.c 含 RCC、GPIO 与主函数;
src/n32g033_it.c 仅保留框架;
inc/main.h 声明引脚与中断宏;
readme.txt 给出配置与测试步骤;
工程文件在 MDK-ARM/ 与 EWARM/。
关键配置 引脚:PA4、PA3、PA5、PB3 为 CH1-CH4,PA7、PB4、PB5、PB6 为 CH1N-CH4N,PA2 为刹车输入;
时钟:PSC=0,目标频率 16 kHz;
模式:PWM2,输出与互补输出均使能;
死区:DeadTime=11;
刹车:高电平有效,自动输出使能。
程序与数据路径 main → RCC_Configuration 打开 TIM1 与 9 个 GPIO 时钟 → GPIO_Configuration 配置 8 路互补引脚与刹车引脚 → 按 16 kHz 计算周期与四通道比较值 → TIM_InitOc1 到 TIM_InitOc4 写四通道 → TIM_ConfigBkdt 写死区与刹车 → TIM_BreakInputSourceEnable 使能刹车输入 → 打开计数器与主输出。
主要 API TIM_InitTimBaseStruct、TIM_InitTimeBase、TIM_InitOcStruct、TIM_InitOc1、TIM_InitOc4、TIM_InitBkdtStruct、TIM_ConfigBkdt、TIM_BreakInputSourceEnable、TIM_Enable、TIM_EnableCtrlPwmOutputs
验证方法 用示波器观察 TIM1 的四对互补波形;
PA2 拉低时可见四对互补 PWM,PA2 拉高时 PWM 消失。
使用提示 开发环境为 KEIL MDK-ARM V5.34.0.0 或 IAR EWARM 8.50.1,硬件基于评估板 N32G033K8Q7-1_STB V1.0;
四通道占空比分别为 50%、25%、12.5%、12.5%。
核心代码解读与移植

示例按 16 kHz 的目标频率算出周期与各通道比较值,再补齐死区与刹车,最后由刹车输入控制输出的通断。

数据路径: main 计算 TimerPeriod 与四通道比较值 → TIM_InitTimeBase 写时基 → TIM_InitOc1 到 TIM_InitOc4 写四通道 → TIM_ConfigBkdt 写死区与刹车 → TIM_BreakInputSourceEnable 使能刹车 → TIM_EnableCtrlPwmOutputs 打开输出

1. 先算周期与四通道比较值。 占空比按百分比折算到比较值,通道 4 与通道 3 取相同的 12.5%。

src/main.csrc/main.c · main
    /* Compute the value to be set in AR register to generate signal frequency at x hz */
    TimerPeriod = (SystemCoreClock / 16000) - 1;
    /* Compute CCDAT1 value to generate a duty cycle at 50% for channel 1 */
    Channel1Pulse = (uint16_t)(((uint32_t)5 * (TimerPeriod - 1)) / 10);
    /* Compute CCDAT2 value to generate a duty cycle at 25%  for channel 2 */
    Channel2Pulse = (uint16_t)(((uint32_t)25 * (TimerPeriod - 1)) / 100);
    /* Compute CCDAT3 value to generate a duty cycle at 12.5%  for channel 3 */
    Channel3Pulse = (uint16_t)(((uint32_t)125 * (TimerPeriod - 1)) / 1000);   
    /* Compute CCDAT4 value to generate a duty cycle at 12.5%  for channel 3 */
    Channel4Pulse = (uint16_t)(((uint32_t)125 * (TimerPeriod - 1)) / 1000); 

改目标频率时只需替换 SystemCoreClock / 16000 中的除数,比较值会按比例重算。

2. 时基与四通道一次配对,极性决定空闲电平。 四通道共用同一份结构体,只在 Pulse 上区分。

src/main.csrc/main.c · main
    /* Time Base configuration */
    TIM_InitTimBaseStruct(&TIM_TimeBaseStructure);    
    TIM_TimeBaseStructure.Prescaler     = 0;
    TIM_TimeBaseStructure.CounterMode   = TIM_CNT_MODE_UP;
    TIM_TimeBaseStructure.Period        = TimerPeriod;
    TIM_TimeBaseStructure.ClkDiv        = TIM_CLK_DIV1;
    TIM_TimeBaseStructure.RepetCnt      = 0;
    TIM_InitTimeBase(TIMx, &TIM_TimeBaseStructure);    
    
    /* Channel 1, 2 and 3 Configuration in PWM mode */
    TIM_InitOcStruct(&TIM_OCInitStructure);    
    TIM_OCInitStructure.OCMode       = TIM_OCMODE_PWM2;
    TIM_OCInitStructure.OutputState  = TIM_OUTPUT_STATE_ENABLE;
    TIM_OCInitStructure.OutputNState = TIM_OUTPUT_NSTATE_ENABLE;
    TIM_OCInitStructure.Pulse        = Channel1Pulse;
    TIM_OCInitStructure.OCPolarity   = TIM_OC_POLARITY_LOW;
    TIM_OCInitStructure.OCNPolarity  = TIM_OCN_POLARITY_LOW;
    TIM_OCInitStructure.OCIdleState  = TIM_OC_IDLE_STATE_SET;
    TIM_OCInitStructure.OCNIdleState = TIM_OCN_IDLE_STATE_RESET;

    TIM_InitOc1(TIMx, &TIM_OCInitStructure);    
    
    TIM_OCInitStructure.Pulse = Channel2Pulse;
    TIM_InitOc2(TIMx, &TIM_OCInitStructure);

    TIM_OCInitStructure.Pulse = Channel3Pulse;
    TIM_InitOc3(TIMx, &TIM_OCInitStructure);

    TIM_OCInitStructure.Pulse = Channel4Pulse;
    TIM_InitOc4(TIMx, &TIM_OCInitStructure);

通道数多于所需时可以只保留前几路,未用的通道不初始化即可。

3. 死区、刹车与主输出一起配置。 死区计数与刹车极性写在 BDTR,刹车源再由 TIM_BreakInputSourceEnable 打开。

src/main.csrc/main.c · main
    /* Automatic Output enable, Break, dead time and lock configuration*/
    TIM_InitBkdtStruct(&TIM_BDTRInitStructure);    
    TIM_BDTRInitStructure.OSSRState       = TIM_OSSR_STATE_ENABLE;
    TIM_BDTRInitStructure.OSSIState       = TIM_OSSI_STATE_ENABLE;
    TIM_BDTRInitStructure.LOCKLevel       = TIM_LOCK_LEVEL_OFF;
    TIM_BDTRInitStructure.DeadTime        = 11;
    TIM_BDTRInitStructure.Break           = TIM_BREAK_IN_ENABLE;
    TIM_BDTRInitStructure.BreakPolarity   = TIM_BREAK_POLARITY_HIGH;
    TIM_BDTRInitStructure.AutomaticOutput = TIM_AUTO_OUTPUT_ENABLE; 
    TIM_ConfigBkdt(TIMx, &TIM_BDTRInitStructure);

    TIM_BreakInputSourceEnable(TIMx,TIM_BREAK_IOM1,TIM_BREAK_IOM_COMP_POLARITY_NONINVERT,ENABLE);
    
    /* TIMx counter enable */
    TIM_Enable(TIMx, ENABLE);

    /* Main Output Enable */
    TIM_EnableCtrlPwmOutputs(TIMx, ENABLE);

把刹车极性改为低有效即可适配低电平触发的保护电路,死区按功率管的开关时间调整。

对应源码: src/main.c、firmware/n32g033_std_periph_driver/inc/n32g033_tim.h

5.18.3.3 DMA DMA 更新占空比

工程目录: projects/n32g033_EVAL/examples/TIM/DMA/

使能时钟并配置互补引脚与 DMA→计算周期与三个占空比→配置通道与更新 DMA 请求→每次更新事件由 DMA 改写比较值

项目 源码解读
功能 TIM1 的 CH3 与 CH3N 互补输出,每 6 个更新事件由 DMA 循环改写比较值。
源码组成 src/main.c 含 RCC、GPIO、DMA_Configuration 与主函数;
src/n32g033_it.c 仅保留框架;
inc/main.h 声明引脚与中断宏;
readme.txt 给出配置与测试步骤;
工程文件在 MDK-ARM/ 与 EWARM/。
关键配置 引脚:PA5 为 CH3,PB3 为 CH3N;
时钟:PSC=0,目标频率 8 kHz;
模式:PWM1,重复计数 RepetCnt=5;
DMA:DMA_CH1 循环模式,每次搬 3 个字到 CCDAT3;
触发:TIM1 更新事件,请求重映射为 DMA_REMAP_TIM1_UP。
程序与数据路径 main → RCC_Configuration 打开 TIM1、GPIO 与 DMA 时钟 → DMA_Configuration 配置 DMA_CH1 → 按 50%、37.5%、25% 写 SRC_Buffer → 配置时基与 CH3 并开启更新 DMA 请求 → TIM_EnableDma 与 TIM_Enable 打开计数与输出 → 每次更新事件 DMA 从 SRC_Buffer 搬一个比较值到 CCDAT3。
主要 API TIM_InitTimBaseStruct、TIM_InitTimeBase、TIM_InitOcStruct、TIM_InitOc3、TIM_EnableDma、TIM_Enable、TIM_EnableCtrlPwmOutputs、DMA_StructInit、DMA_Init、DMA_RequestRemap、DMA_EnableChannel
验证方法 用示波器观察 CH3 与 CH3N 波形;
每 6 个周期占空比按循环顺序切换到下一个值。
使用提示 开发环境为 KEIL MDK-ARM V5.34.0.0 或 IAR EWARM 8.50.1,硬件基于评估板 N32G033K8Q7-1_STB V1.0;
DMA 缓冲区大小 3 与重复计数 5 一起决定改写的周期数。
核心代码解读与移植

示例用循环模式的 DMA 在每次更新事件把一个比较值搬进 CCDAT3,从而在不干预 CPU 的情况下改变占空比。

数据路径: main 写 SRC_Buffer 三个占空比 → TIM_InitTimeBase 写时基 → TIM_InitOc3 写通道 3 → TIM_EnableDma 打开更新请求 → 更新事件触发 DMA → DMA_Configuration 把 SRC_Buffer 搬到 CCDAT3

1. 先按占空比算出三个比较值。 三个值依次装入缓冲区,DMA 每轮搬一个。

src/main.csrc/main.c · main
    /* Compute the value to be set in AR register to generate signal frequency at x hz */
    TimerPeriod = (SystemCoreClock / 8000) - 1;
    /* Compute CCDAT1 value to generate a duty cycle at 50% */
    SRC_Buffer[0] = (uint16_t)(((uint32_t)5 * (TimerPeriod - 1)) / 10);
    /* Compute CCDAT1 value to generate a duty cycle at 37.5% */
    SRC_Buffer[1] = (uint16_t)(((uint32_t)375 * (TimerPeriod - 1)) / 1000);
    /* Compute CCDAT1 value to generate a duty cycle at 25% */
    SRC_Buffer[2] = (uint16_t)(((uint32_t)25 * (TimerPeriod - 1)) / 100);

重复计数减小时改写更频繁,缓冲区长度决定一轮内占空比的档数。

2. 时基与通道 3 配置后打开更新 DMA 请求。 RepetCnt=5 使 6 个更新事件触发一次 DMA。

src/main.csrc/main.c · main
    /* Time Base configuration */
    TIM_InitTimBaseStruct(&TIM_TimeBaseStructure);    
    TIM_TimeBaseStructure.Prescaler     = 0;
    TIM_TimeBaseStructure.CounterMode   = TIM_CNT_MODE_UP;
    TIM_TimeBaseStructure.Period        = TimerPeriod;
    TIM_TimeBaseStructure.ClkDiv        = TIM_CLK_DIV1;
    TIM_TimeBaseStructure.RepetCnt      = 5;
    TIM_InitTimeBase(TIMx, &TIM_TimeBaseStructure);   

     /* Channel 3 Configuration in PWM mode */
    TIM_InitOcStruct(&TIM_OCInitStructure);     
    TIM_OCInitStructure.OCMode       = TIM_OCMODE_PWM1;
    TIM_OCInitStructure.OutputState  = TIM_OUTPUT_STATE_ENABLE;
    TIM_OCInitStructure.OutputNState = TIM_OUTPUT_NSTATE_ENABLE;
    TIM_OCInitStructure.Pulse        = SRC_Buffer[0];
    TIM_OCInitStructure.OCPolarity   = TIM_OC_POLARITY_HIGH;
    TIM_OCInitStructure.OCNPolarity  = TIM_OCN_POLARITY_HIGH;
    TIM_OCInitStructure.OCIdleState  = TIM_OC_IDLE_STATE_SET;
    TIM_OCInitStructure.OCNIdleState = TIM_OCN_IDLE_STATE_RESET;
    TIM_InitOc3(TIMx, &TIM_OCInitStructure);   
    
    /* TIMx Update DMA Request enable */
    TIM_EnableDma(TIMx, TIM_DMA_UPDATE, ENABLE);

    /* TIMx counter enable */
    TIM_Enable(TIMx, ENABLE);

    /* Main Output Enable */
    TIM_EnableCtrlPwmOutputs(TIMx, ENABLE);  

把 TIM_DMA_UPDATE 换成比较通道的 DMA 请求,可让每次比较匹配就改写一次。

3. DMA 通道指向 CCDAT3 并请求重映射。 目的地址取 &TIMx->CCDAT3,循环模式下缓冲区用完自动回到起点。

src/main.csrc/main.c · DMA_Configuration
void DMA_Configuration(void)
{
    DMA_InitType DMA_InitStructure;

    /* DMA Channel1 Config */
    DMA_DeInit(DMA_CH1);
    DMA_StructInit(&DMA_InitStructure);
    DMA_InitStructure.PeriphAddr     = (uint32_t)&TIMx->CCDAT3;
    DMA_InitStructure.MemAddr        = (uint32_t)SRC_Buffer;
    DMA_InitStructure.Direction      = DMA_DIR_PERIPH_DST;
    DMA_InitStructure.BufSize        = 3;
    DMA_InitStructure.PeriphInc      = DMA_PERIPH_INC_DISABLE;
    DMA_InitStructure.DMA_MemoryInc  = DMA_MEM_INC_ENABLE;
    DMA_InitStructure.PeriphDataSize = DMA_PERIPH_DATA_SIZE_WORD;
    DMA_InitStructure.MemDataSize    = DMA_MemoryDataSize_Word;
    DMA_InitStructure.CircularMode   = DMA_MODE_CIRCULAR;
    DMA_InitStructure.Priority       = DMA_PRIORITY_HIGH;
    DMA_InitStructure.Mem2Mem        = DMA_M2M_DISABLE;

    DMA_Init(DMA_CH1, &DMA_InitStructure);
    DMA_RequestRemap(DMA_REMAP_TIM1_UP,DMA,DMA_CH1,ENABLE);
    /* DMA Channel1 enable */
    DMA_EnableChannel(DMA_CH1, ENABLE);
}

换用其他通道时同步修改 DMA 的目的寄存器与请求重映射源,并核对传输数据宽度。

对应源码: src/main.c、firmware/n32g033_std_periph_driver/inc/n32g033_tim.h

5.18.3.4 DMABurst DMA 突发传输

工程目录: projects/n32g033_EVAL/examples/TIM/DMABurst/

使能时钟并配置通道引脚与 DMA→配置时基与通道 1 输出→设置 DMA 突发基址与长度→一个更新事件搬运 8 个寄存器值

项目 源码解读
功能 TIM1 的 CH1 输出,在一次更新事件里由 DMA 突发同时改写周期与占空比。
源码组成 src/main.c 含 RCC、GPIO、DMA_Configuration 与主函数;
src/n32g033_it.c 仅保留框架;
inc/main.h 声明引脚与中断宏;
readme.txt 给出配置与测试步骤;
工程文件在 MDK-ARM/ 与 EWARM/。
关键配置 引脚:PA4 为 CH1;
时钟:PSC=0,初始 AR=0xFFFF;
模式:PWM1,初始占空比 0x8FFF;
DMA:DMA_CH1 非循环模式,一次搬 8 个字;
触发:TIM1 更新事件,突发长度 8 次传输,基址 CAPCMPDAT1。
程序与数据路径 DMA_Configuration 把 DMA 目的地址指向 TIM1 的 DADDR → TIM_ConfigDma 设突发基址与长度 → TIM_EnableDma 开更新请求 → 更新事件把 8 个字从 SRC_Buffer 搬到 TIM1 寄存器 → 传输结束后清标志 → 调试时置 DmaAgain=1 可再次触发。
主要 API TIM_InitTimBaseStruct、TIM_InitTimeBase、TIM_InitOcStruct、TIM_InitOc1、TIM_ConfigDma、TIM_EnableDma、TIM_Enable、TIM_EnableCtrlPwmOutputs、DMA_Init、DMA_GetFlagStatus、DMA_ClearFlag
验证方法 用示波器观察 CH1;
第一个周期后波形按 DMA 搬入的周期与占空比变化。
使用提示 开发环境为 KEIL MDK-ARM V5.34.0.0 或 IAR EWARM 8.50.1,硬件基于评估板 N32G033K8Q7-1_STB V1.0;
调试下把 DmaAgain 置 1 会重新搬运一次。
核心代码解读与移植

示例用突发模式让一次 DMA 传输把 8 个字连续写入 TIM1 的寄存器窗口,从而同时刷新周期、六个比较值、预分频与重复计数。

数据路径: main 配置时基与通道 1 → TIM_ConfigDma 设突发基址与长度 → TIM_EnableDma 打开更新请求 → 更新事件触发 DMA 突发 → DMA_Configuration 把 SRC_Buffer 的 8 个字搬到 DADDR → 传输结束清标志

1. 时基与通道 1 输出先建立。 初始 AR 与比较值决定第一个周期的波形。

src/main.csrc/main.c · main
    /* Time Base configuration */
    TIM_InitTimBaseStruct(&TIM_TimeBaseStructure);    
    TIM_TimeBaseStructure.Prescaler     = 0;
    TIM_TimeBaseStructure.CounterMode   = TIM_CNT_MODE_UP;
    TIM_TimeBaseStructure.Period        = 0xFFFF;
    TIM_TimeBaseStructure.ClkDiv        = TIM_CLK_DIV1;
    TIM_InitTimeBase(TIMx, &TIM_TimeBaseStructure);   

     /* Channel 3 Configuration in PWM mode */
    TIM_InitOcStruct(&TIM_OCInitStructure);     
    TIM_OCInitStructure.OCMode       = TIM_OCMODE_PWM1;
    TIM_OCInitStructure.OutputState  = TIM_OUTPUT_STATE_ENABLE;
    TIM_OCInitStructure.Pulse        = 0x8FFF;
    TIM_OCInitStructure.OCPolarity   = TIM_OC_POLARITY_HIGH;
    TIM_InitOc1(TIMx, &TIM_OCInitStructure);   

SRC_Buffer 的首字对应 CCDAT1,末字对应 AR,改动缓冲区内容即可改变写入的寄存器顺序。

2. 设置突发基址、长度与更新 DMA 请求并等待传输结束。 突发长度 8 与缓冲区长度一致,传输完成标志用于判断一次搬运结束。

src/main.csrc/main.c · main
    /* TIMx DADDR Base register and DMA Burst Length Config */
    TIM_ConfigDma(TIMx, TIM_DMABASE_CAPCMPDAT1, TIM_DMABURST_LENGTH_8TRANSFERS);

    /* TIMx DMA Update enable */
    TIM_EnableDma(TIMx, TIM_DMA_UPDATE, ENABLE);

    /* TIMx enable */
    TIM_Enable(TIMx, ENABLE);

    /* TIMx PWM Outputs Enable */
    TIM_EnableCtrlPwmOutputs(TIMx, ENABLE); 

    /* DMA Channel1 enable */
    DMA_EnableChannel(DMA_CH1, ENABLE);
    
    /* Wait until DMA Channel1 end of Transfer */
    while (!DMA_GetFlagStatus(DMA_FLAG_TC1, DMA))
    {
    }

    DMA_ClearFlag(DMA_FLAG_GL1 | DMA_FLAG_TC1 | DMA_FLAG_HT1 | DMA_FLAG_TE1, DMA);

把非循环模式改为循环模式可让多组参数轮流写入,需要时再配合中断刷新缓冲区。

3. DMA 目的地址指向 DADDR 并请求重映射。 每次搬运从 SRC_Buffer 起逐字写入 TIM1 的寄存器窗口。

src/main.csrc/main.c · DMA_Configuration
void DMA_Configuration(void)
{
    DMA_InitType DMA_InitStructure;

    /* DMA1 Channel5 Config */
    DMA_DeInit(DMA_CH1);
    DMA_StructInit(&DMA_InitStructure);
    DMA_InitStructure.PeriphAddr     = (uint32_t)&TIMx->DADDR; 
    DMA_InitStructure.MemAddr        = (uint32_t)SRC_Buffer;
    DMA_InitStructure.Direction      = DMA_DIR_PERIPH_DST;
    DMA_InitStructure.BufSize        = 8;
    DMA_InitStructure.PeriphInc      = DMA_PERIPH_INC_DISABLE;
    DMA_InitStructure.DMA_MemoryInc  = DMA_MEM_INC_ENABLE;
    DMA_InitStructure.PeriphDataSize = DMA_PERIPH_DATA_SIZE_WORD;
    DMA_InitStructure.MemDataSize    = DMA_MemoryDataSize_Word;
    DMA_InitStructure.CircularMode   = DMA_MODE_NORMAL;
    DMA_InitStructure.Priority       = DMA_PRIORITY_HIGH;
    DMA_InitStructure.Mem2Mem        = DMA_M2M_DISABLE;

    DMA_Init(DMA_CH1, &DMA_InitStructure);
    DMA_RequestRemap(DMA_REMAP_TIM1_UP,DMA,DMA_CH1,ENABLE);
}

换用其他定时器时同步修改请求重映射源与目的地址,并核对突发基址是否仍在可用窗口内。

对应源码: src/main.c、firmware/n32g033_std_periph_driver/inc/n32g033_tim.h

5.18.3.5 ExtTrigger_Synchro 外部触发级联同步

工程目录: projects/n32g033_EVAL/examples/TIM/ExtTrigger_Synchro/

使能时钟并配置主从两定时器的引脚→配置主定时器为翻转并作触发输出→由外部输入作门控触发→从定时器随主定时器门控计数

项目 源码解读
功能 TIM1 的 CH2 作为外部门控输入,同时门控 TIM1 的 CH1 与从定时器 TIM3。
源码组成 src/main.c 含 RCC、GPIO 与主函数;
src/n32g033_it.c 仅保留框架;
inc/main.h 声明主从定时器与引脚宏;
readme.txt 给出配置与测试步骤;
工程文件在 MDK-ARM/ 与 EWARM/。
关键配置 引脚:PA4 为 TIM1 CH1,PA3 为 TIM1 CH2,PA6 为 TIM3 CH1;
时钟:PSC=2,Period=73;
从模式:TIM1 与 TIM3 均为门控模式;
触发:TIM1 选 TI2FP2 作输入触发,主从模式使能;
触发输出:TIM1 使能事件作触发源。
程序与数据路径 main → RCC_Configuration 打开 TIM1、TIM3 与 GPIO 时钟 → 配置两定时器时基 → TIM_InitOc1 把 TIM1 CH1 配成翻转 → TIM_ICInit 在 CH2 上做输入捕获并提供 TI2FP2 → TIM_SelectSlaveMode 门控 → TIM_SelectMasterSlaveMode 与 TIM_SelectOutputTrig → TIM3 以 IN_TR0 门控 → 打开两定时器与主输出。
主要 API TIM_InitTimBaseStruct、TIM_InitTimeBase、TIM_InitOcStruct、TIM_InitOc1、TIM_InitIcStruct、TIM_ICInit、TIM_SelectInputTrig、TIM_SelectSlaveMode、TIM_SelectMasterSlaveMode、TIM_SelectOutputTrig、TIM_EnableCtrlPwmOutputs、TIM_Enable
验证方法 用示波器观察 TIM1 CH1 与 TIM3 CH1;
TIM1 CH2 为高时计数器计数,为低时停止。
使用提示 开发环境为 KEIL MDK-ARM V5.34.0.0 或 IAR EWARM 8.50.1,硬件基于评估板 N32G033K8Q7-1_STB V1.0;
TIM1 作主定时器,TIM3 作从定时器;
两个定时器的时基参数相同。
核心代码解读与移植

示例让 TIM1 的 CH2 作外部门控输入,TIM1 与 TIM3 在门控有效时同时计数,从而由一路外部信号同步两个定时器。

数据路径: main 配置两定时器时基 → TIM_InitOc1 把 TIM1 CH1 配成翻转 → TIM_ICInit 在 CH2 上取 TI2FP2 → TIM_SelectSlaveMode 门控 TIM1 → TIM_SelectOutputTrig 用使能事件作触发源 → TIM3 以 IN_TR0 门控 → TIM_Enable 启动两定时器

1. 两个定时器共用同一份时基参数。 先写 TIM1,再改写同一结构体写 TIM3。

src/main.csrc/main.c · main
    /* Time base configuration */
    TIM_InitTimBaseStruct(&TIM_TimeBaseStructure);
    TIM_TimeBaseStructure.Period          = 73;
    TIM_TimeBaseStructure.Prescaler       = 2;
    TIM_TimeBaseStructure.ClkDiv          = TIM_CLK_DIV1;
    TIM_TimeBaseStructure.CounterMode   = TIM_CNT_MODE_UP;

    TIM_InitTimeBase(TIMx, &TIM_TimeBaseStructure);

    TIM_TimeBaseStructure.Period = 73;
    TIM_InitTimeBase(TIMy, &TIM_TimeBaseStructure);

从定时器可以与主定时器取不同的 Period,从而在同一门控下得到不同的输出频率。

2. 主定时器取外部触发并作触发输出。 CH2 由输入捕获提供 TI2FP2,主从模式使能后使能事件作为触发输出。

src/main.csrc/main.c · main
    /* Master Configuration in Toggle Mode */
    TIM_InitOcStruct(&TIM_OCInitStructure);
    TIM_OCInitStructure.OCMode      = TIM_OCMODE_TOGGLE;
    TIM_OCInitStructure.OutputState = TIM_OUTPUT_STATE_ENABLE;
    TIM_OCInitStructure.Pulse       = 64;
    TIM_OCInitStructure.OCPolarity  = TIM_OC_POLARITY_HIGH;

    TIM_InitOc1(TIMx, &TIM_OCInitStructure);
    
    /* TIMx Input Capture Configuration */
    TIM_InitIcStruct(&TIM_ICInitStructure);
    TIM_ICInitStructure.Channel     = TIM_CH_2;
    TIM_ICInitStructure.ICPolarity  = TIM_IC_POLARITY_RISING;
    TIM_ICInitStructure.ICSelection = TIM_IC_SELECTION_DIRECTTI;
    TIM_ICInitStructure.ICPrescaler = TIM_IC_PSC_DIV1;
    TIM_ICInitStructure.ICFilter    = 0;

    TIM_ICInit(TIMx, &TIM_ICInitStructure);    

    /* TIMx Input trigger configuration: External Trigger connected to TI2 */
    TIM_SelectInputTrig(TIMx, TIM_TRIG_SEL_TI2FP2);
    TIM_SelectSlaveMode(TIMx, TIM_SLAVE_MODE_GATED);
    
    /* Select the Master Slave Mode */
    TIM_SelectMasterSlaveMode(TIMx, TIM_MASTER_SLAVE_MODE_ENABLE);    
    
    /* Master Mode selection: TIMx */
    TIM_SelectOutputTrig(TIMx, TIM_TRGO_SRC_ENABLE);  

把外部触发从 TI2FP2 换成 ETR,可直接用外部引脚作门控输入。

3. 从定时器以内部触发门控并在最后统一使能。 TIM3 的触发源选 IN_TR0,与主定时器保持相同的门控模式。

src/main.csrc/main.c · main
    /* Slaves Configuration: Toggle Mode */
    TIM_OCInitStructure.OCMode      = TIM_OCMODE_TOGGLE;
    TIM_OCInitStructure.OutputState = TIM_OUTPUT_STATE_ENABLE;

    TIM_InitOc1(TIMy, &TIM_OCInitStructure);
    
    /* Slave Mode selection: TIMy */
    TIM_SelectInputTrig(TIMy, TIM_TRIG_SEL_IN_TR0);
    TIM_SelectSlaveMode(TIMy, TIM_SLAVE_MODE_GATED);    

    /* TIM1 TIM3 Main Output Enable */
    TIM_EnableCtrlPwmOutputs(TIMx, ENABLE);
    TIM_EnableCtrlPwmOutputs(TIMy, ENABLE);

    /* TIM enable counter */
    TIM_Enable(TIMx, ENABLE);
    TIM_Enable(TIMy, ENABLE);

需要级联第三个定时器时,把从定时器再设为另一路的主定时器,触发源沿用同一内部触发线即可。

对应源码: src/main.c、firmware/n32g033_std_periph_driver/inc/n32g033_tim.h

5.18.3.6 InputCapture 输入捕获测频

工程目录: projects/n32g033_EVAL/examples/TIM/InputCapture/

使能时钟并配置捕获输入与辅助输出引脚→配置上升沿输入捕获→开捕获中断并启动计数→中断里两次捕获值求差得频率

项目 源码解读
功能 TIM4 的 CH2 捕获上升沿并计算输入信号频率,同时可由软件在 PA3 上产生两次上升沿。
源码组成 src/main.c 含 RCC、GPIO、NVIC、GenTwoRisingEdge 与主函数;
src/n32g033_it.c 含 TIM4_IRQHandler;
inc/main.h 声明引脚与频率变量;
readme.txt 给出配置与测试步骤;
工程文件在 MDK-ARM/ 与 EWARM/。
关键配置 引脚:PA1 为 TIM4 CH2 输入,PA3 为普通推挽输出;
时钟:PSC=0;
捕获:CH2 上升沿直接映射,无滤波、不分频;
中断:捕获比较 2 中断,抢占优先级 1。
程序与数据路径 main → RCC_Configuration 打开 TIM4 与 GPIO 时钟 → GPIO_Configuration 配置 CH2 与 PA3 → TIM_ICInit 配置 CH2 上升沿捕获 → 清标志并使能捕获中断 → 启动计数 → 主循环调用 GenTwoRisingEdge → TIM4_IRQHandler 两次读捕获值并算频率。
主要 API TIM_InitIcStruct、TIM_ICInit、TIM_ClrIntPendingBit、TIM_ConfigInt、TIM_Enable、TIM_GetCap2、TIM_GetIntStatus
验证方法 PA3 连接 PA1,把 TIM4Freq 加入 watch 窗口;
调试下把 gOnePulsEn 置 1,PA3 产生两次上升沿后读频率。
使用提示 开发环境为 KEIL MDK-ARM V5.34.0.0 或 IAR EWARM 8.50.1,硬件基于评估板 N32G033K8Q7-1_STB V1.0;
系统时钟取 HSI,SYS_CLK=64 MHz;
PA3 需与 PA1 短接。
核心代码解读与移植

示例在 CH2 上捕获上升沿,用相邻两次捕获值的差换算频率;为便于验证,软件还能在 PA3 上产生一对方波沿。

数据路径: main → TIM_ICInit 配置 CH2 上升沿捕获 → TIM_ConfigInt 使能捕获中断 → TIM_Enable 启动计数 → 主循环 GenTwoRisingEdge 在 PA3 产生沿 → TIM4_IRQHandler 读 TIM_GetCap2 两次 → 差值换算为 TIM4Freq

1. 配置 CH2 上升沿捕获并打开捕获中断。 直接映射、无滤波,保证捕获值就是计数值。

src/main.csrc/main.c · main
    TIM_InitIcStruct(&TIM_ICInitStructure);
    TIM_ICInitStructure.Channel     = TIM_CH_2;
    TIM_ICInitStructure.ICPolarity  = TIM_IC_POLARITY_RISING;
    TIM_ICInitStructure.ICSelection = TIM_IC_SELECTION_DIRECTTI;
    TIM_ICInitStructure.ICPrescaler = TIM_IC_PSC_DIV1;
    TIM_ICInitStructure.ICFilter    = 0x0;

    TIM_ICInit(TIMx, &TIM_ICInitStructure);

    TIM_ClrIntPendingBit(TIMx,TIM_INT_UPDATE);
    TIM_ClrIntPendingBit(TIMx,TIM_INT_CC2);
    /* Enable the CC2 Interrupt Request */
    TIM_ConfigInt(TIMx, TIM_INT_CC2, ENABLE);    
    
    /* TIM enable counter */
    TIM_Enable(TIMx, ENABLE);

改捕获极性即可测下降沿,加滤波可以在有噪声的输入上抑制抖动。

2. 引脚配置与软件产生方波沿的辅助函数。 PA3 作普通输出,GenTwoRisingEdge 在使能时翻转两次电平。

src/main.csrc/main.c · GPIO_Configuration
void GPIO_Configuration(void)
{
    GPIO_InitType GPIO_InitStructure;

    GPIO_InitStruct(&GPIO_InitStructure);
    
    /* GPIOx Configuration: Pin of TIMx */
    GPIO_InitStructure.Pin        = TIMx_CH2_GPIO_PIN;
    GPIO_InitStructure.GPIO_Mode  = GPIO_MODE_AF_PP;
    GPIO_InitStructure.GPIO_Alternate = TIMx_CH2_GPIO_AF;
    GPIO_InitPeripheral(TIMx_CH2_GPIO_PORT, &GPIO_InitStructure);

    GPIO_InitStructure.Pin        = GPIO_PIN_3;
    GPIO_InitStructure.GPIO_Mode = GPIO_MODE_OUTPUT_PP;
    GPIO_InitPeripheral(GPIOA, &GPIO_InitStructure);
    
}
src/main.csrc/main.c · GenTwoRisingEdge
void GenTwoRisingEdge(void)
{
    if (gOnePulsEn)
    {
        gOnePulsEn = 0;
        GPIO_SetBits(GPIOA, GPIO_PIN_3);
        {
           volatile uint32_t i = 0;
            while (i++ < 10)
                ;
        }
        GPIO_ResetBits(GPIOA, GPIO_PIN_3);
        {
           volatile uint32_t i = 0;
            while (i++ < 10)
                ;
        }

        GPIO_SetBits(GPIOA, GPIO_PIN_3);
        {
           volatile uint32_t i = 0;
            while (i++ < 10)
                ;
        }
        GPIO_ResetBits(GPIOA, GPIO_PIN_3);
        
    }
}

把 PA3 换成任意空闲引脚即可用于自测,被测信号也可直接由外部信号源提供。

3. 中断里两次捕获求差得频率。 相邻两次捕获值之差即一个信号周期内的计数次数。

src/n32g033_it.csrc/n32g033_it.c · TIM4_IRQHandler
void TIM4_IRQHandler(void)
{
    if (TIM_GetIntStatus(TIMx, TIM_INT_CC2) == SET)
    {
        TIMxEnterIrqCnt++;
        /* Clear TIMx Capture compare interrupt pending bit */
        TIM_ClrIntPendingBit(TIMx, TIM_INT_CC2);
        if (CaptureNumber == 0)
        {
            /* Get the Input Capture value */
            IC3ReadValue1 = TIM_GetCap2(TIMx);
            CaptureNumber = 1;
        }
        else if (CaptureNumber == 1)
        {
            /* Get the Input Capture value */
            IC3ReadValue2 = TIM_GetCap2(TIMx);

            /* Capture computation */
            if (IC3ReadValue2 > IC3ReadValue1)
            {
                Capture = (IC3ReadValue2 - IC3ReadValue1);
            }
            else
            {
                Capture = ((0xFFFF - IC3ReadValue1) + IC3ReadValue2);
            }
            /* Frequency computation */
            TIMxFreq      = (uint32_t)(SystemCoreClock) / Capture;
            CaptureNumber = 0;
        }
    }
}

被测频率低于计数频率的 1/2 时精度最高,频率接近或高于计数频率时需要先降低输入分频或改用捕获预分频。

对应源码: src/main.c、src/n32g033_it.c、firmware/n32g033_std_periph_driver/inc/n32g033_tim.h

5.18.3.7 OCActive 输出比较置有效

工程目录: projects/n32g033_EVAL/examples/TIM/OCActive/

使能时钟并配置四路输出引脚→计算预分频并配置时基→四通道配成比较置有效→打开主输出与计数器

项目 源码解读
功能 TIM3 的四个通道在计数器达到各自比较值后输出有效电平。
源码组成 src/main.c 含 RCC、GPIO 与主函数;
src/n32g033_it.c 仅保留框架;
inc/main.h 声明四通道引脚宏;
readme.txt 给出配置与测试步骤;
工程文件在 MDK-ARM/ 与 EWARM/。
关键配置 引脚:PA0、PA1、PB0、PB1 为 CH1-CH4;
时钟:PSC 使计数频率约 2 MHz,AR=65535;
模式:输出比较置有效,预装载关闭;
比较值:CC1 到 CC4 分别为 1000、500、250、125。
程序与数据路径 main → RCC_Configuration 打开 TIM3 与 GPIO 时钟 → 算预分频 → 配置时基 → 逐通道配置为置有效并关闭预装载 → TIM_ConfigArPreload → TIM_EnableCtrlPwmOutputs 与 TIM_Enable 打开输出与计数。
主要 API TIM_InitTimBaseStruct、TIM_InitTimeBase、TIM_InitOcStruct、TIM_InitOc1、TIM_InitOc4、TIM_ConfigOc1Preload、TIM_ConfigOc4Preload、TIM_ConfigArPreload、TIM_EnableCtrlPwmOutputs、TIM_Enable
验证方法 用示波器观察四个通道;
计数到各自比较值时对应通道跳变为有效电平。
使用提示 开发环境为 KEIL MDK-ARM V5.34.0.0 或 IAR EWARM 8.50.1,硬件基于评估板 N32G033K8Q7-1_STB V1.0;
四个比较值决定四个通道的翻转时刻。
核心代码解读与移植

示例把四个通道都配成比较置有效,计数器计到各自比较值时对应输出翻到有效电平,用于生成不同延迟的边沿。

数据路径: main 算预分频 → TIM_InitTimeBase 写时基 → TIM_InitOc1 到 TIM_InitOc4 写四通道比较值 → TIM_ConfigOc1Preload 关闭预装载 → TIM_EnableCtrlPwmOutputs 打开输出 → TIM_Enable 启动计数

1. 预分频把计数频率降到约 2 MHz。 时基的 AR 取满量程,比较值直接决定延迟。

src/main.csrc/main.c · main
    /* Compute the prescaler value */
    PrescalerValue = (uint16_t)((SystemCoreClock)/ 2000000) - 1;
    /* Time base configuration */
    TIM_InitTimBaseStruct(&TIM_TimeBaseStructure);
    TIM_TimeBaseStructure.Period        = 65535;
    TIM_TimeBaseStructure.Prescaler     = PrescalerValue;
    TIM_TimeBaseStructure.ClkDiv        = TIM_CLK_DIV1;
    TIM_TimeBaseStructure.CounterMode   = TIM_CNT_MODE_UP;

    TIM_InitTimeBase(TIMx, &TIM_TimeBaseStructure);

预分频改变计数频率会按比例改变各通道的延迟时间。

2. 通道 1 配成比较置有效并关闭预装载。 关闭预装载后比较值立即生效。

src/main.csrc/main.c · main
    /* Output Compare Active Mode configuration: Channel1 */
    TIM_InitOcStruct(&TIM_OCInitStructure);
    TIM_OCInitStructure.OCMode      = TIM_OCMODE_ACTIVE;
    TIM_OCInitStructure.OutputState = TIM_OUTPUT_STATE_ENABLE;
    TIM_OCInitStructure.Pulse       = CCR1_Val;
    TIM_OCInitStructure.OCPolarity  = TIM_OC_POLARITY_HIGH;

    TIM_InitOc1(TIMx, &TIM_OCInitStructure);

    TIM_ConfigOc1Preload(TIMx, TIM_OC_PRE_LOAD_DISABLE);    

3. 其余三个通道沿用同一模式,各自写比较值。 四个通道只在比较值上不同。

src/main.csrc/main.c · main
    /* Output Compare Active Mode configuration: Channel2 */
    TIM_OCInitStructure.OutputState = TIM_OUTPUT_STATE_ENABLE;
    TIM_OCInitStructure.Pulse       = CCR2_Val;

    TIM_InitOc2(TIMx, &TIM_OCInitStructure);

    TIM_ConfigOc2Preload(TIMx, TIM_OC_PRE_LOAD_DISABLE);

    /* Output Compare Active Mode configuration: Channel3 */
    TIM_OCInitStructure.OutputState = TIM_OUTPUT_STATE_ENABLE;
    TIM_OCInitStructure.Pulse       = CCR3_Val;

    TIM_InitOc3(TIMx, &TIM_OCInitStructure);

    TIM_ConfigOc3Preload(TIMx, TIM_OC_PRE_LOAD_DISABLE);

    /* Output Compare Active Mode configuration: Channel4 */
    TIM_OCInitStructure.OutputState = TIM_OUTPUT_STATE_ENABLE;
    TIM_OCInitStructure.Pulse       = CCR4_Val;

    TIM_InitOc4(TIMx, &TIM_OCInitStructure);

    TIM_ConfigOc4Preload(TIMx, TIM_OC_PRE_LOAD_DISABLE);

    TIM_ConfigArPreload(TIMx, ENABLE);

    TIM_EnableCtrlPwmOutputs(TIMx,ENABLE);

    /* TIM2 enable counter */
    TIM_Enable(TIMx, ENABLE); 

把模式改为 PWM 即可直接得到占空比输出,比较值同比例调整。

对应源码: src/main.c、firmware/n32g033_std_periph_driver/inc/n32g033_tim.h

5.18.3.8 OCInactive 输出比较置无效

工程目录: projects/n32g033_EVAL/examples/TIM/OCInactive/

使能时钟并配置四个普通输出引脚→配置时基与四通道比较值→打开四通道比较中断→中断里拉低对应 IO

项目 源码解读
功能 TIM3 的四个通道比较中断到来时,软件把 PA1 到 PA4 四个 IO 拉低。
源码组成 src/main.c 含 RCC、GPIO、NVIC 与主函数;
src/n32g033_it.c 含 TIMx_IRQHandler;
inc/main.h 声明中断宏;
readme.txt 给出配置与测试步骤;
工程文件在 MDK-ARM/ 与 EWARM/。
关键配置 引脚:PA1、PA2、PA3、PA4 为普通推挽输出;
时钟:PSC 使计数频率约 2 MHz,AR=1999;
模式:输出比较置无效,预装载关闭;
中断:四通道比较中断全开,抢占优先级 1。
程序与数据路径 main → RCC_Configuration 打开 TIM3 与 GPIO 时钟 → GPIO_Configuration 把 PA1 到 PA4 配成输出 → 配置时基与四通道 → TIM_ConfigInt 使能四通道比较中断 → 先把四个 IO 置高 → TIM_Enable 启动计数 → 中断里按通道拉低对应 IO。
主要 API TIM_InitTimBaseStruct、TIM_InitTimeBase、TIM_InitOcStruct、TIM_InitOc1、TIM_InitOc4、TIM_ConfigInt、TIM_Enable、TIM_GetIntStatus、TIM_ClrIntPendingBit、GPIO_ResetBits
验证方法 用示波器或逻辑分析仪观察 PA1 到 PA4;
各通道进入比较中断后对应 IO 被拉低。
使用提示 开发环境为 KEIL MDK-ARM V5.34.0.0 或 IAR EWARM 8.50.1,硬件基于评估板 N32G033K8Q7-1_STB V1.0;
四个引脚作普通 IO,不使用定时器的复用输出。
核心代码解读与移植

示例不用定时器的引脚输出,而是在四个通道的比较中断里由软件写 IO,用来演示比较事件如何生成可编程的定时沿。

数据路径: main 算预分频 → TIM_InitTimeBase 写时基 → TIM_InitOc1 到 TIM_InitOc4 写四通道比较值 → TIM_ConfigInt 使能比较中断 → TIM_Enable 启动计数 → TIMx_IRQHandler 按通道 GPIO_ResetBits

1. 预分频与时基先把计数频率定下来。 AR 取 1999,比较值决定各通道中断的时刻。

src/main.csrc/main.c · main
    /* Compute the prescaler value */
    PrescalerValue = (uint16_t)((SystemCoreClock)/ 2000000) - 1;
    /* Time base configuration */
    TIM_InitTimBaseStruct(&TIM_TimeBaseStructure);
    TIM_TimeBaseStructure.Period        = 1999;
    TIM_TimeBaseStructure.Prescaler     = PrescalerValue;
    TIM_TimeBaseStructure.ClkDiv        = TIM_CLK_DIV1;
    TIM_TimeBaseStructure.CounterMode   = TIM_CNT_MODE_UP;

    TIM_InitTimeBase(TIMx, &TIM_TimeBaseStructure);

2. 四个通道配成比较置无效并打开比较中断。 比较事件本身不驱动引脚,只产生中断。

src/main.csrc/main.c · main
    /* Output Compare Active Mode configuration: Channel1 */
    TIM_InitOcStruct(&TIM_OCInitStructure);
    TIM_OCInitStructure.OCMode      = TIM_OCMODE_INACTIVE;
    TIM_OCInitStructure.OutputState = TIM_OUTPUT_STATE_ENABLE;
    TIM_OCInitStructure.Pulse       = CCR1_Val;
    TIM_OCInitStructure.OCPolarity  = TIM_OC_POLARITY_HIGH;

    TIM_InitOc1(TIMx, &TIM_OCInitStructure);

    TIM_ConfigOc1Preload(TIMx, TIM_OC_PRE_LOAD_DISABLE);    
    
    /* Output Compare Active Mode configuration: Channel2 */
    TIM_OCInitStructure.OutputState = TIM_OUTPUT_STATE_ENABLE;
    TIM_OCInitStructure.Pulse       = CCR2_Val;

    TIM_InitOc2(TIMx, &TIM_OCInitStructure);

    TIM_ConfigOc2Preload(TIMx, TIM_OC_PRE_LOAD_DISABLE);

    /* Output Compare Active Mode configuration: Channel3 */
    TIM_OCInitStructure.OutputState = TIM_OUTPUT_STATE_ENABLE;
    TIM_OCInitStructure.Pulse       = CCR3_Val;

    TIM_InitOc3(TIMx, &TIM_OCInitStructure);

    TIM_ConfigOc3Preload(TIMx, TIM_OC_PRE_LOAD_DISABLE);

    /* Output Compare Active Mode configuration: Channel4 */
    TIM_OCInitStructure.OutputState = TIM_OUTPUT_STATE_ENABLE;
    TIM_OCInitStructure.Pulse       = CCR4_Val;

    TIM_InitOc4(TIMx, &TIM_OCInitStructure);

    TIM_ConfigOc4Preload(TIMx, TIM_OC_PRE_LOAD_DISABLE);

    TIM_ConfigArPreload(TIMx, ENABLE);

    /* TIM IT enable */
    TIM_ConfigInt(TIMx, TIM_INT_CC1 | TIM_INT_CC2 | TIM_INT_CC3 | TIM_INT_CC4, ENABLE);

3. 先把 IO 置高再启动计数。 复位后的初始电平由软件给定,比较中断再把它拉低。

src/main.csrc/main.c · main
    /* Set output pins */
    GPIO_SetBits(GPIOA, GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3 | GPIO_PIN_4);

    /* TIM2 enable counter */
    TIM_Enable(TIMx, ENABLE); 

4. 中断里按通道写 IO。 每个通道的比较中断各拉低一个引脚。

src/n32g033_it.csrc/n32g033_it.c · TIMx_IRQHandler
void TIMx_IRQHandler(void)
{
    if (TIM_GetIntStatus(TIMx, TIM_INT_CC1) != RESET)
    {
        /* Clear GTIM2 Capture Compare1 interrupt pending bit*/
        TIM_ClrIntPendingBit(TIMx, TIM_INT_CC1);

        GPIO_ResetBits(GPIOA, GPIO_PIN_1);
    }
    else if (TIM_GetIntStatus(TIMx, TIM_INT_CC2) != RESET)
    {
        /* Clear GTIM2 Capture Compare2 interrupt pending bit*/
        TIM_ClrIntPendingBit(TIMx, TIM_INT_CC2);

        GPIO_ResetBits(GPIOA, GPIO_PIN_2);
    }
    else if (TIM_GetIntStatus(TIMx, TIM_INT_CC3) != RESET)
    {
        /* Clear GTIM2 Capture Compare3 interrupt pending bit*/
        TIM_ClrIntPendingBit(TIMx, TIM_INT_CC3);

        GPIO_ResetBits(GPIOA, GPIO_PIN_3);
    }
    else
    {
        /* Clear GTIM2 Capture Compare4 interrupt pending bit*/
        TIM_ClrIntPendingBit(TIMx, TIM_INT_CC4);

        GPIO_ResetBits(GPIOA, GPIO_PIN_4);
    }
}

把拉低改为翻转即可得到对称的输出,中断节拍仍由比较值决定。

对应源码: src/main.c、src/n32g033_it.c、firmware/n32g033_std_periph_driver/inc/n32g033_tim.h

5.18.3.9 OCToggle 输出比较翻转

工程目录: projects/n32g033_EVAL/examples/TIM/OCToggle/

使能时钟并配置四路输出引脚→配置时基与四通道为翻转→打开比较中断并启动计数→中断里累加比较值得到 50% 占空比

项目 源码解读
功能 TIM3 四个通道在比较匹配时翻转输出,并在中断里把比较值自加,得到 50% 占空比。
源码组成 src/main.c 含 RCC、GPIO、NVIC 与主函数;
src/n32g033_it.c 含 TIMx_IRQHandler;
inc/main.h 声明比较值与中断宏;
readme.txt 给出配置与测试步骤;
工程文件在 MDK-ARM/ 与 EWARM/。
关键配置 引脚:PA0、PA1、PB0、PB1 为 CH1-CH4;
时钟:PSC 使计数频率约 8 MHz,AR=65535;
模式:输出比较翻转,预装载关闭;
比较值:CC1 到 CC4 分别为 32768、16384、8192、4096;
中断:四通道比较中断。
程序与数据路径 main → RCC_Configuration 打开 TIM3 与 GPIO 时钟 → 算预分频 → 配置时基与四通道为翻转 → 清四个中断标志 → TIM_ConfigInt 使能比较中断 → TIM_EnableCtrlPwmOutputs 与 TIM_Enable → 中断里翻转后累加比较值。
主要 API TIM_InitTimBaseStruct、TIM_InitTimeBase、TIM_InitOcStruct、TIM_InitOc1、TIM_InitOc4、TIM_ClrIntPendingBit、TIM_ConfigInt、TIM_EnableCtrlPwmOutputs、TIM_Enable、TIM_SetCmp1
验证方法 用示波器观察四个通道;
每次比较匹配翻转一次,占空比为 50%。
使用提示 开发环境为 KEIL MDK-ARM V5.34.0.0 或 IAR EWARM 8.50.1,硬件基于评估板 N32G033K8Q7-1_STB V1.0;
四次通道的翻转频率各不相同。
核心代码解读与移植

示例让输出在比较匹配时自动翻转,中断里再把比较值累加相同增量,于是相邻两次翻转的间隔相等,占空比为 50%。

数据路径: main 算预分频 → TIM_InitTimeBase 写时基 → TIM_InitOc1 到 TIM_InitOc4 写四通道 → TIM_ConfigInt 使能比较中断 → TIM_Enable 启动计数 → TIMx_IRQHandler 翻转输出后 TIM_SetCmp1 累加比较值

1. 预分频把计数频率定为约 8 MHz。 AR 取满量程,比较值决定翻转的节拍。

src/main.csrc/main.c · main
     /* Compute the prescaler value */
    PrescalerValue = (uint16_t)((SystemCoreClock)/ 8000000) - 1;

    /* Time base configuration */
    TIM_InitTimBaseStruct(&TIM_TimeBaseStructure);
    TIM_TimeBaseStructure.Period        = 65535;
    TIM_TimeBaseStructure.Prescaler     = PrescalerValue;
    TIM_TimeBaseStructure.ClkDiv        = TIM_CLK_DIV1;
    TIM_TimeBaseStructure.CounterMode   = TIM_CNT_MODE_UP;

    TIM_InitTimeBase(TIMx, &TIM_TimeBaseStructure);

2. 通道 1 配成翻转并关闭预装载。 关闭预装载后写入的比较值立即生效。

src/main.csrc/main.c · main
    /* Output Compare Toggle Mode configuration: Channel1 */
    TIM_InitOcStruct(&TIM_OCInitStructure);
    TIM_OCInitStructure.OCMode      = TIM_OCMODE_TOGGLE;   
    TIM_OCInitStructure.OutputState = TIM_OUTPUT_STATE_ENABLE;
    TIM_OCInitStructure.Pulse       = CCR1_Val;
    TIM_OCInitStructure.OCPolarity  = TIM_OC_POLARITY_LOW;
    TIM_InitOc1(TIMx, &TIM_OCInitStructure);

    TIM_ConfigOc1Preload(TIMx, TIM_OC_PRE_LOAD_DISABLE);

3. 清中断标志后打开比较中断与输出。 先清标志可避免使能中断时误触发一次。

src/main.csrc/main.c · main
    TIM_ClrIntPendingBit(TIMx, TIM_INT_UPDATE);
    TIM_ClrIntPendingBit(TIMx, TIM_INT_CC1);
    TIM_ClrIntPendingBit(TIMx, TIM_INT_CC2);
    TIM_ClrIntPendingBit(TIMx, TIM_INT_CC3);
    TIM_ClrIntPendingBit(TIMx, TIM_INT_CC4);
    
    /* TIM IT enable */
    TIM_ConfigInt(TIMx, TIM_INT_CC1 | TIM_INT_CC2 | TIM_INT_CC3 | TIM_INT_CC4, ENABLE); 
    
    TIM_EnableCtrlPwmOutputs(TIMx, ENABLE);
    
    /* TIM enable counter */
    TIM_Enable(TIMx, ENABLE);

4. 中断里翻转并把比较值累加相同增量。 每次匹配后比较值前移固定步长,两次翻转的间隔相等。

src/n32g033_it.csrc/n32g033_it.c · TIMx_IRQHandler
void TIMx_IRQHandler(void)
{
    /* TIMx_CH1 toggling */
    if (TIM_GetIntStatus(TIMx, TIM_INT_CC1) != RESET)
    {
        TIM_ClrIntPendingBit(TIMx, TIM_INT_CC1);
        capture = TIM_GetCap1(TIMx);
        TIM_SetCmp1(TIMx, capture + CCR1_Val);
    }

    /* TIMx_CH2 toggling */
    if (TIM_GetIntStatus(TIMx, TIM_INT_CC2) != RESET)
    {
        TIM_ClrIntPendingBit(TIMx, TIM_INT_CC2);
        capture = TIM_GetCap2(TIMx);
        TIM_SetCmp2(TIMx, capture + CCR2_Val);
    }

    /* TIMx_CH3 toggling */
    if (TIM_GetIntStatus(TIMx, TIM_INT_CC3) != RESET)
    {
        TIM_ClrIntPendingBit(TIMx, TIM_INT_CC3);
        capture = TIM_GetCap3(TIMx);
        TIM_SetCmp3(TIMx, capture + CCR3_Val);
    }

    /* TIM3_CH4 toggling */
    if (TIM_GetIntStatus(TIMx, TIM_INT_CC4) != RESET)
    {
        TIM_ClrIntPendingBit(TIMx, TIM_INT_CC4);
        capture = TIM_GetCap4(TIMx);
        TIM_SetCmp4(TIMx, capture + CCR4_Val);
    }
}

增量决定输出频率,改用别的增量即可得到不同的翻转周期。

对应源码: src/main.c、src/n32g033_it.c、firmware/n32g033_std_periph_driver/inc/n32g033_tim.h

5.18.3.10 OnePulse 单脉冲输出

工程目录: projects/n32g033_EVAL/examples/TIM/OnePulse/

使能时钟并配置输出与触发输入引脚→配置通道 1 为 PWM2 输出→配置通道 2 上升沿捕获为触发→外部上升沿触发一个单脉冲

项目 源码解读
功能 TIM4 的 CH2 上升沿触发 CH1 输出一个单脉冲。
源码组成 src/main.c 含 RCC、GPIO、SendOneTrig 与主函数;
src/n32g033_it.c 仅保留框架;
inc/main.h 声明引脚与使能变量;
readme.txt 给出配置与测试步骤;
工程文件在 MDK-ARM/ 与 EWARM/。
关键配置 引脚:PA0 为 CH1 输出,PA1 为 CH2 输入,PA3 为普通推挽输出;
时钟:PSC 使计数频率约 4 MHz,AR=65535;
模式:CH1 为 PWM2,单脉冲模式;
触发:选 TI2FP2,从模式为触发模式。
程序与数据路径 main → RCC_Configuration 打开 TIM4 与 GPIO 时钟 → 配置时基与 CH1 为 PWM2 → TIM_ICInit 在 CH2 上配置上升沿捕获 → TIM_SelectOnePulseMode 选单次 → 选 TI2FP2 与触发从模式 → 主循环调用 SendOneTrig → PA3 产生上升沿触发单脉冲。
主要 API TIM_InitTimBaseStruct、TIM_InitTimeBase、TIM_InitOcStruct、TIM_InitOc1、TIM_InitIcStruct、TIM_ICInit、TIM_SelectOnePulseMode、TIM_SelectInputTrig、TIM_SelectSlaveMode
验证方法 PA3 连接 PA1,用示波器观察 TIM4 CH1;
调试下把 gSendTrigEn 置 1,每发一个上升沿 CH1 输出一个单脉冲。
使用提示 开发环境为 KEIL MDK-ARM V5.34.0.0 或 IAR EWARM 8.50.1,硬件基于评估板 N32G033K8Q7-1_STB V1.0;
脉冲宽度由 Period 与 Pulse 之差决定。
核心代码解读与移植

示例把 CH1 配成 PWM2 并选通单脉冲模式,CH2 的上升沿作为触发源,每来一个触发沿输出一个宽度固定的脉冲。

数据路径: main 配置时基与 CH1 → TIM_InitOc1 写 PWM2 与比较值 → TIM_ICInit 在 CH2 上捕获上升沿 → TIM_SelectOnePulseMode 选单次 → TIM_SelectInputTrig 选 TI2FP2 → TIM_SelectSlaveMode 选触发模式 → 主循环 SendOneTrig 在 PA3 产生触发沿

1. 时基与 CH1 的 PWM2 输出先建立。 Pulse 与 AR 之差决定单脉冲的宽度。

src/main.csrc/main.c · main
     /* Compute the prescaler value */
    PrescalerValue = (uint16_t)((SystemCoreClock) / 4000000) - 1;
    /* Time base configuration */
    TIM_InitTimBaseStruct(&TIM_TimeBaseStructure);
    TIM_TimeBaseStructure.Period        = 65535;
    TIM_TimeBaseStructure.Prescaler     = PrescalerValue;
    TIM_TimeBaseStructure.ClkDiv        = TIM_CLK_DIV1;
    TIM_TimeBaseStructure.CounterMode   = TIM_CNT_MODE_UP;

    TIM_InitTimeBase(TIMx, &TIM_TimeBaseStructure);   

    /* TIMx PWM2 Mode configuration: Channel1 */
    TIM_InitOcStruct(&TIM_OCInitStructure);
    TIM_OCInitStructure.OCMode      = TIM_OCMODE_PWM2;
    TIM_OCInitStructure.OutputState = TIM_OUTPUT_STATE_ENABLE;
    TIM_OCInitStructure.Pulse       = 16383;  
    TIM_OCInitStructure.OCPolarity  = TIM_OC_POLARITY_HIGH;

    TIM_InitOc1(TIMx, &TIM_OCInitStructure);

改 AR 可改变脉冲宽度,改 Pulse 可改变脉冲在周期内的位置。

2. CH2 捕获上升沿并提供触发源。 单脉冲模式与触发从模式配合,输入沿一到达就输出一个脉冲。

src/main.csrc/main.c · main
    /* TIMx configuration in Input Capture Mode */
    TIM_InitIcStruct(&TIM_ICInitStructure);

    TIM_ICInitStructure.Channel     = TIM_CH_2;
    TIM_ICInitStructure.ICPolarity  = TIM_IC_POLARITY_RISING;
    TIM_ICInitStructure.ICSelection = TIM_IC_SELECTION_DIRECTTI;
    TIM_ICInitStructure.ICPrescaler = TIM_IC_PSC_DIV1;
    TIM_ICInitStructure.ICFilter    = 0;

    TIM_ICInit(TIMx, &TIM_ICInitStructure);
    
    /* One Pulse Mode selection */
    TIM_SelectOnePulseMode(TIMx, TIM_OPMODE_SINGLE); 

    /* Input Trigger selection */
    TIM_SelectInputTrig(TIMx, TIM_TRIG_SEL_TI2FP2);

    /* Slave Mode selection: Trigger Mode */
    TIM_SelectSlaveMode(TIMx, TIM_SLAVE_MODE_TRIG); 

把触发源从 TI2FP2 换成其他触发线,即可由别的信号启动单脉冲。

3. 软件产生触发沿的辅助函数。 SendOneTrig 在使能时在 PA3 上翻转一次电平。

src/main.csrc/main.c · SendOneTrig
void SendOneTrig(void)
{
    if (gSendTrigEn)
    {
        gSendTrigEn = 0;
        GPIO_SetBits(GPIOA, GPIO_PIN_3);
        {
            uint32_t i=0;
            while (i++ < 10)
                ;
        }
        GPIO_ResetBits(GPIOA, GPIO_PIN_3);
    }
}

自测时可让该函数由按键或定时器驱动,也可直接由外部信号源提供触发沿。

对应源码: src/main.c、firmware/n32g033_std_periph_driver/inc/n32g033_tim.h

5.18.3.11 PWM_Input PWM 输入测量

工程目录: projects/n32g033_EVAL/examples/TIM/PWM_Input/

使能时钟并配置捕获输入与辅助输出引脚→初始化 PWM 输入双通道捕获→配置复位从模式并启动计数→中断里读两通道捕获值算频率与占空比

项目 源码解读
功能 TIM3 的 CH2 捕获外部 PWM,用 CH1 的捕获值算占空比、CH2 的捕获值算频率。
源码组成 src/main.c 含 RCC、GPIO、NVIC 与主函数;
src/n32g033_it.c 含 TIMx_IRQHandler;
inc/main.h 声明引脚与结果变量;
readme.txt 给出配置与测试步骤;
工程文件在 MDK-ARM/ 与 EWARM/。
关键配置 引脚:PA1 为 TIM3 CH2 输入,PA3 为普通推挽输出;
捕获:CH1 下降沿、CH2 上升沿,均由 TIM_ConfigPwmIc 配对;
从模式:复位模式,主从模式使能;
中断:捕获比较 2 中断。
程序与数据路径 main → RCC_Configuration 打开 TIM3 与 GPIO 时钟 → GPIO_Configuration 配置 CH2 与 PA3 → TIM_ConfigPwmIc 初始化 PWM 输入双通道 → 选 TI2FP2 与复位从模式 → 使能主从模式与计数器 → 开捕获中断 → 主循环由 PA3 输出方波 → 中断里按两通道捕获值算占空比与频率。
主要 API TIM_InitIcStruct、TIM_ConfigPwmIc、TIM_SelectInputTrig、TIM_SelectSlaveMode、TIM_SelectMasterSlaveMode、TIM_Enable、TIM_ConfigInt、TIM_GetCap1、TIM_GetCap2
验证方法 PA3 连接 PA1,把 Frequency、DutyCycle 加入 watch 窗口;
运行后可读出捕获到的频率与占空比。
使用提示 开发环境为 KEIL MDK-ARM V5.34.0.0 或 IAR EWARM 8.50.1,硬件基于评估板 N32G033K8Q7-1_STB V1.0;
PA3 需与 PA1 短接。
核心代码解读与移植

PWM 输入模式把同一个输入脚同时接到两个捕获通道,一个测周期一个测高电平时间,从而一次得到频率与占空比。

数据路径: main → TIM_ConfigPwmIc 同时配置 CH1 与 CH2 → TIM_SelectInputTrig 选 TI2FP2 → TIM_SelectSlaveMode 选复位模式 → TIM_SelectMasterSlaveMode 使能 → TIM_ConfigInt 使能捕获中断 → TIMx_IRQHandler 读 TIM_GetCap1 与 TIM_GetCap2 求占空比与频率

1. 用 PWM 输入初始化把两通道一次配好。 CH2 接被测信号,CH1 在同一次调用里配成反极性。

src/main.csrc/main.c · main
    TIM_InitIcStruct(&TIM_ICInitStructure);
    TIM_ICInitStructure.Channel     = TIM_CH_2;
    TIM_ICInitStructure.ICPolarity  = TIM_IC_POLARITY_RISING;  
    TIM_ICInitStructure.ICSelection = TIM_IC_SELECTION_DIRECTTI;  
    TIM_ICInitStructure.ICPrescaler = TIM_IC_PSC_DIV1;  
    TIM_ICInitStructure.ICFilter    = 0x0;

    /*PWM Dual-channel opposite polarity input capture initialization*/
    TIM_ConfigPwmIc(TIMx, &TIM_ICInitStructure);  

TIM_ConfigPwmIc 内部会选好两通道的映射与极性,换输入脚时改 TIM_ICInitStructure.Channel 即可。

2. 复位从模式与主从模式保证每个周期从头计数。 输入沿到来时计数器复位,便于周期测量。

src/main.csrc/main.c · main
    /* Select the TIM3 Input Trigger: TI2FP2 */
    TIM_SelectInputTrig(TIMx, TIM_TRIG_SEL_TI2FP2);  

    /* Select the slave Mode: Reset Mode */
    TIM_SelectSlaveMode(TIMx, TIM_SLAVE_MODE_RESET); 

    /* Enable the Master/Slave Mode */
    TIM_SelectMasterSlaveMode(TIMx, TIM_MASTER_SLAVE_MODE_ENABLE); 

    /* TIM enable counter */
    TIM_Enable(TIMx, ENABLE); 

    /* Enable the CC2 Interrupt Request */
    TIM_ConfigInt(TIMx, TIM_INT_CC2, ENABLE); 

被测频率高于计数频率的 1/2 时测量会失真,需要先降低输入频率或提高计数频率。

3. 中断里按两通道捕获值求频率与占空比。 CH2 的捕获值是一个周期内的计数,CH1 的是高电平内的计数。

src/n32g033_it.csrc/n32g033_it.c · TIMx_IRQHandler
void TIMx_IRQHandler(void)
{
     /* Clear TIMx Capture compare interrupt pending bit */
    TIM_ClrIntPendingBit(TIMx, TIM_INT_CC2);

    /* Get the Input Capture value */
    IC2Value = TIM_GetCap2(TIMx);

    if (IC2Value != 0)
    {
        /* Duty cycle computation */
        DutyCycle = (TIM_GetCap1(TIMx) * 100) / IC2Value;

        /* Frequency computation */
        Frequency = SystemCoreClock / IC2Value;
    }
    else
    {
        DutyCycle = 0;
        Frequency = 0;
    }
}

被测信号与定时器时钟同源时测量精度最高,独立时钟源要注意两者的频率偏差。

对应源码: src/main.c、src/n32g033_it.c、firmware/n32g033_std_periph_driver/inc/n32g033_tim.h

5.18.3.12 PWM_Output PWM 输出

工程目录: projects/n32g033_EVAL/examples/TIM/PWM_Output/

使能时钟并配置四路输出引脚→计算预分频并配置时基→四通道配成 PWM 输出并写比较值→打开预装载、主输出与计数器

项目 源码解读
功能 TIM3 的四个通道输出频率相同、占空比不同的四路 PWM。
源码组成 src/main.c 含 RCC、GPIO 与主函数;
src/n32g033_it.c 仅保留框架;
inc/main.h 声明四通道引脚宏;
readme.txt 给出配置与测试步骤;
工程文件在 MDK-ARM/ 与 EWARM/。
关键配置 引脚:PA0、PA1、PB0、PB1 为 CH1-CH4;
时钟:PSC 使计数频率约 2 MHz,AR=1200;
模式:PWM1,四通道预装载均使能;
比较值:CC1 到 CC4 分别为 600、300、150、75。
程序与数据路径 main → RCC_Configuration 打开 TIM3 与 GPIO 时钟 → 算预分频 → 配置时基 → 逐通道配置为 PWM1 并写比较值 → 打开四通道预装载与 AR 预装载 → TIM_EnableCtrlPwmOutputs 与 TIM_Enable 打开输出与计数。
主要 API TIM_InitTimBaseStruct、TIM_InitTimeBase、TIM_InitOcStruct、TIM_InitOc1、TIM_InitOc4、TIM_ConfigOc1Preload、TIM_ConfigOc4Preload、TIM_ConfigArPreload、TIM_EnableCtrlPwmOutputs、TIM_Enable
验证方法 用示波器观察四个通道;
四路周期相等、占空比不同。
使用提示 开发环境为 KEIL MDK-ARM V5.34.0.0 或 IAR EWARM 8.50.1,硬件基于评估板 N32G033K8Q7-1_STB V1.0;
四个比较值决定四路占空比。
核心代码解读与移植

示例用同一个周期和四个不同的比较值生成四路 PWM,四路的频率相同、占空比不同。

数据路径: main 算预分频 → TIM_InitTimeBase 写时基 → TIM_InitOc1 到 TIM_InitOc4 写四通道 → TIM_ConfigOc1Preload 打开预装载 → TIM_ConfigArPreload 打开 AR 预装载 → TIM_EnableCtrlPwmOutputs 打开输出 → TIM_Enable 启动计数

1. 预分频与时基把周期固定下来。 AR=1200 决定四路共用的周期。

src/main.csrc/main.c · main
    /* Compute the prescaler value */
    PrescalerValue = (uint32_t)((SystemCoreClock)/ 2000000) - 1;  
    /* Time base configuration */
    TIM_InitTimBaseStruct(&TIM_TimeBaseStructure);
    TIM_TimeBaseStructure.Period        = 1200;
    TIM_TimeBaseStructure.Prescaler     = PrescalerValue;
    TIM_TimeBaseStructure.ClkDiv        = TIM_CLK_DIV1;
    TIM_TimeBaseStructure.CounterMode   = TIM_CNT_MODE_UP;

    TIM_InitTimeBase(TIMx, &TIM_TimeBaseStructure);

2. 通道 1 配成 PWM1 并写比较值 600。 比较值与 AR 之比即占空比。

src/main.csrc/main.c · main
    /* PWM1 Mode configuration: Channel1 */
    TIM_InitOcStruct(&TIM_OCInitStructure);
    TIM_OCInitStructure.OCMode      = TIM_OCMODE_PWM1;
    TIM_OCInitStructure.OutputState = TIM_OUTPUT_STATE_ENABLE;
    TIM_OCInitStructure.Pulse       = CCR1_Val;
    TIM_OCInitStructure.OCPolarity  = TIM_OC_POLARITY_HIGH;

    TIM_InitOc1(TIMx, &TIM_OCInitStructure);

    TIM_ConfigOc1Preload(TIMx, TIM_OC_PRE_LOAD_ENABLE);

3. 其余三个通道写不同比较值并打开预装载与输出。 四个比较值决定四路占空比。

src/main.csrc/main.c · main
    TIM_ConfigOc1Preload(TIMx, TIM_OC_PRE_LOAD_ENABLE);

    /* PWM1 Mode configuration: Channel2 */
    TIM_OCInitStructure.OutputState = TIM_OUTPUT_STATE_ENABLE;
    TIM_OCInitStructure.Pulse       = CCR2_Val;

    TIM_InitOc2(TIMx, &TIM_OCInitStructure);

    TIM_ConfigOc2Preload(TIMx, TIM_OC_PRE_LOAD_ENABLE);

    /* PWM1 Mode configuration: Channel3 */
    TIM_OCInitStructure.OutputState = TIM_OUTPUT_STATE_ENABLE;
    TIM_OCInitStructure.Pulse       = CCR3_Val;

    TIM_InitOc3(TIMx, &TIM_OCInitStructure);

    TIM_ConfigOc3Preload(TIMx, TIM_OC_PRE_LOAD_ENABLE);

    /* PWM1 Mode configuration: Channel4 */
    TIM_OCInitStructure.OutputState = TIM_OUTPUT_STATE_ENABLE;
    TIM_OCInitStructure.Pulse       = CCR4_Val;

    TIM_InitOc4(TIMx, &TIM_OCInitStructure);

    TIM_ConfigOc4Preload(TIMx, TIM_OC_PRE_LOAD_ENABLE);

    TIM_ConfigArPreload(TIMx, ENABLE);

    TIM_EnableCtrlPwmOutputs(TIMx,ENABLE);

    /* TIMx enable counter */
    TIM_Enable(TIMx, ENABLE);

需要动态调占空比时,运行中改写比较值即可由预装载在下一个周期生效。

对应源码: src/main.c、firmware/n32g033_std_periph_driver/inc/n32g033_tim.h

5.18.3.13 TimeBase 输出比较定时中断

工程目录: projects/n32g033_EVAL/examples/TIM/TimeBase/

使能时钟并配置四个普通输出引脚→配置时基并写预分频→四通道配成比较定时模式→中断里翻转对应 IO 并累加比较值

项目 源码解读
功能 TIM3 用四个通道的比较事件产生定时中断,在中断里翻转 PA3 到 PA6 的电平。
源码组成 src/main.c 含 RCC、GPIO、NVIC 与主函数;
src/n32g033_it.c 含 TIM3_IRQHandler;
inc/main.h 声明比较值与中断宏;
readme.txt 给出配置与测试步骤;
工程文件在 MDK-ARM/ 与 EWARM/。
关键配置 引脚:PA3、PA4、PA5、PA6 为普通推挽输出;
时钟:PSC 使计数频率约 2 MHz,AR=65535;
模式:比较定时模式,预装载关闭;
中断:四通道比较中断全开。
程序与数据路径 main → RCC_Configuration 打开 TIM3 与 GPIO 时钟 → GPIO_Configuration 把 PA3 到 PA6 配成输出 → 配置时基与四通道比较值 → TIM_ConfigPrescaler 写预分频 → TIM_ConfigInt 使能比较中断 → TIM_Enable 启动计数 → 中断里翻转对应 IO 并累加比较值。
主要 API TIM_InitTimBaseStruct、TIM_InitTimeBase、TIM_ConfigPrescaler、TIM_InitOcStruct、TIM_InitOc1、TIM_InitOc4、TIM_ConfigInt、TIM_Enable、TIM_SetCmp1、TIM_GetCap1
验证方法 用示波器观察 PA3 到 PA6;
各通道到比较值后翻转对应 IO 并累加比较值。
使用提示 开发环境为 KEIL MDK-ARM V5.34.0.0 或 IAR EWARM 8.50.1,硬件基于评估板 N32G033K8Q7-1_STB V1.0;
四个比较值决定四路中断的节拍。
核心代码解读与移植

示例用四个通道的比较事件产生定时中断,中断里在四个 IO 上产生不同节拍的方波。

数据路径: main → TIM_InitTimeBase 写时基 → TIM_ConfigPrescaler 写预分频 → TIM_InitOc1 到 TIM_InitOc4 写四通道 → TIM_ConfigInt 使能比较中断 → TIM_Enable 启动计数 → TIM3_IRQHandler 翻转 IO 并 TIM_SetCmp1 累加比较值

1. 时基与预分频先建立计数频率。 比较值决定各通道中断的时刻。

src/main.csrc/main.c · main
    /* Compute the prescaler value */
    PrescalerValue = (uint16_t)((SystemCoreClock)/ 2000000) - 1;
    
    /* Time base configuration */
    TIM_InitTimBaseStruct(&TIM_TimeBaseStructure);
    TIM_TimeBaseStructure.Period        = 65535;
    TIM_TimeBaseStructure.Prescaler     = 0;
    TIM_TimeBaseStructure.ClkDiv        = TIM_CLK_DIV1;
    TIM_TimeBaseStructure.CounterMode   = TIM_CNT_MODE_UP;

    TIM_InitTimeBase(TIM3, &TIM_TimeBaseStructure);

    /* Prescaler configuration */
    TIM_ConfigPrescaler(TIM3, PrescalerValue, TIM_PSC_RELOAD_MODE_IMMEDIATE);    

2. 四个通道配成比较定时模式并写比较值。 比较事件只产生中断,输出引脚由软件控制。

src/main.csrc/main.c · main
    /* Output Compare Timing Mode configuration: Channel1 */
    TIM_InitOcStruct(&TIM_OCInitStructure);
    TIM_OCInitStructure.OCMode      = TIM_OCMODE_TIMING; 
    TIM_OCInitStructure.OutputState = TIM_OUTPUT_STATE_ENABLE;
    TIM_OCInitStructure.Pulse       = CCR1_Val;
    TIM_OCInitStructure.OCPolarity  = TIM_OC_POLARITY_HIGH;

    TIM_InitOc1(TIM3, &TIM_OCInitStructure);

    TIM_ConfigOc1Preload(TIM3, TIM_OC_PRE_LOAD_DISABLE);    
    
    /* Output Compare Timing Mode configuration: Channel2 */
    TIM_OCInitStructure.OutputState = TIM_OUTPUT_STATE_ENABLE;
    TIM_OCInitStructure.Pulse       = CCR2_Val;

    TIM_InitOc2(TIM3, &TIM_OCInitStructure);

    TIM_ConfigOc2Preload(TIM3, TIM_OC_PRE_LOAD_DISABLE);

    /* Output Compare Timing Mode configuration: Channel3 */
    TIM_OCInitStructure.OutputState = TIM_OUTPUT_STATE_ENABLE;
    TIM_OCInitStructure.Pulse       = CCR3_Val;

    TIM_InitOc3(TIM3, &TIM_OCInitStructure);

    TIM_ConfigOc3Preload(TIM3, TIM_OC_PRE_LOAD_DISABLE);

    /* Output Compare Timing Mode configuration: Channel4 */
    TIM_OCInitStructure.OutputState = TIM_OUTPUT_STATE_ENABLE;
    TIM_OCInitStructure.Pulse       = CCR4_Val;

    TIM_InitOc4(TIM3, &TIM_OCInitStructure);

    TIM_ConfigOc4Preload(TIM3, TIM_OC_PRE_LOAD_DISABLE);    

3. 使能四通道比较中断并启动计数。 中断节拍由各通道比较值决定。

src/main.csrc/main.c · main
    /* TIM IT enable */
    TIM_ConfigInt(TIM3, TIM_INT_CC1 | TIM_INT_CC2 | TIM_INT_CC3 | TIM_INT_CC4, ENABLE);

    /* TIM3 enable counter */
    TIM_Enable(TIM3, ENABLE);   

4. 中断里按通道翻转 IO 并累加比较值。 累加相同增量后各通道保持固定节拍。

src/n32g033_it.csrc/n32g033_it.c · TIM3_IRQHandler
void TIM3_IRQHandler(void)
{
    if (TIM_GetIntStatus(TIM3, TIM_INT_CC1) != RESET)
    {
        TIM_ClrIntPendingBit(TIM3, TIM_INT_CC1);

        /* Pin PC.03 toggling */
        GPIO_WriteBit(GPIOA, GPIO_PIN_3, (Bit_OperateType)(1 - GPIO_ReadOutputDataBit(GPIOA, GPIO_PIN_3)));
        capture = TIM_GetCap1(TIM3);
        TIM_SetCmp1(TIM3, capture + CCR1_Val);
    }
    else if (TIM_GetIntStatus(TIM3, TIM_INT_CC2) != RESET)
    {
        TIM_ClrIntPendingBit(TIM3, TIM_INT_CC2);

        /* Pin PC.04 toggling */
        GPIO_WriteBit(GPIOA, GPIO_PIN_4, (Bit_OperateType)(1 - GPIO_ReadOutputDataBit(GPIOA, GPIO_PIN_4)));
        capture = TIM_GetCap2(TIM3);
        TIM_SetCmp2(TIM3, capture + CCR2_Val);
    }
    else if (TIM_GetIntStatus(TIM3, TIM_INT_CC3) != RESET)
    {
        TIM_ClrIntPendingBit(TIM3, TIM_INT_CC3);

        /* Pin PC.05 toggling */
        GPIO_WriteBit(GPIOA, GPIO_PIN_5, (Bit_OperateType)(1 - GPIO_ReadOutputDataBit(GPIOA, GPIO_PIN_5)));
        capture = TIM_GetCap3(TIM3);
        TIM_SetCmp3(TIM3, capture + CCR3_Val);
    }
    else
    {
        TIM_ClrIntPendingBit(TIM3, TIM_INT_CC4);

        /* Pin PC.06 toggling */
        GPIO_WriteBit(GPIOA, GPIO_PIN_6, (Bit_OperateType)(1 - GPIO_ReadOutputDataBit(GPIOA, GPIO_PIN_6)));
        capture = TIM_GetCap4(TIM3);
        TIM_SetCmp4(TIM3, capture + CCR4_Val);
    }
}

增量决定各路方波的周期,改用别的增量即可得到不同的翻转频率。

对应源码: src/main.c、src/n32g033_it.c、firmware/n32g033_std_periph_driver/inc/n32g033_tim.h

5.18.3.14 TimeBasic_TIM1 更新中断翻转 IO

工程目录: projects/n32g033_EVAL/examples/TIM/TimeBasic_TIM1/

使能时钟并配置输出引脚→配置时基并写预分频→打开更新中断与中断向量→更新中断里翻转 IO

项目 源码解读
功能 TIM1 用更新中断按固定周期翻转 PA4 的电平。
源码组成 src/main.c 含 RCC、GPIO、NVIC、TIM_Configuration 与主函数;
src/n32g033_it.c 含 TIM1_BRK_UP_TRG_COM_IRQHandler;
inc/main.h 声明引脚与中断宏;
readme.txt 给出配置与测试步骤;
工程文件在 MDK-ARM/ 与 EWARM/。
关键配置 引脚:PA4 为普通推挽输出;
时钟:PSC=0,AR=65535;
中断:TIM1 更新中断,抢占优先级 1;
向量:TIM1_BRK_UP_TRG_COM。
程序与数据路径 main → RCC_Configuration 打开 TIM1 与 GPIO 时钟 → GPIO_Configuration 把 PA4 配成输出 → NVIC_Configuration 使能 TIM1 中断 → TIM_Configuration 配置时基、开更新中断并启动计数 → TIM1_BRK_UP_TRG_COM_IRQHandler 翻转 PA4。
主要 API TIM_InitTimBaseStruct、TIM_InitTimeBase、TIM_ConfigPrescaler、TIM_ConfigInt、TIM_Enable、TIM_GetIntStatus、TIM_ClrIntPendingBit、NVIC_Init
验证方法 用示波器观察 PA4;
每次更新中断到来 PA4 翻转一次。
使用提示 开发环境为 KEIL MDK-ARM V5.34.0.0 或 IAR EWARM 8.50.1,硬件基于评估板 N32G033K8Q7-1_STB V1.0;
TIM1 属于高级定时器,更新中断与刹车中断共用向量。
核心代码解读与移植

示例用 TIM1 的更新事件产生定时中断,每次中断翻转一次 IO,得到周期为两次更新中断间隔的方波。

数据路径: main → RCC_Configuration 打开时钟 → GPIO_Configuration 配置 PA4 → NVIC_Configuration 使能中断 → TIM_Configuration 写时基、开更新中断并启动计数 → TIM1_BRK_UP_TRG_COM_IRQHandler 清标志后翻转 PA4

1. 配置时基、打开更新中断并启动计数。 预分频与时基决定更新中断的周期。

src/main.csrc/main.c · TIM_Configuration
void TIM_Configuration(void)
{
    /* Compute the prescaler value */
    PrescalerValue = 0;

    /* Time base configuration */
    TIM_InitTimBaseStruct(&TIM_TimeBaseStructure);
    TIM_TimeBaseStructure.Period        = 65535;
    TIM_TimeBaseStructure.Prescaler     = 0;
    TIM_TimeBaseStructure.ClkDiv        = TIM_CLK_DIV1;
    TIM_TimeBaseStructure.CounterMode   = TIM_CNT_MODE_UP;

    TIM_InitTimeBase(TIM1, &TIM_TimeBaseStructure);

    /* Prescaler configuration */
    TIM_ConfigPrescaler(TIM1, PrescalerValue, TIM_PSC_RELOAD_MODE_IMMEDIATE);

    /* ATIM1 enable update irq */
    TIM_ConfigInt(TIM1, TIM_INT_UPDATE, ENABLE);

    /* ATIM1 enable counter */
    TIM_Enable(TIM1, ENABLE);
}

改 AR 与预分频可改变中断周期,需要用更长的定时时应把预分频加大而不是把 AR 取满。

2. 先配置 NVIC 再启动定时器。 中断向量与优先级在使能中断前设定。

src/main.csrc/main.c · NVIC_Configuration
void NVIC_Configuration(void)
{
    NVIC_InitType NVIC_InitStructure;

    /* Enable the TIMx Interrupt */
    NVIC_InitStructure.NVIC_IRQChannel                   = TIM1_BRK_UP_TRG_COM_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPriority              = 1;
    NVIC_InitStructure.NVIC_IRQChannelCmd                = ENABLE;
    NVIC_Init(&NVIC_InitStructure);
}

3. 中断里清标志后翻转 IO。 翻转周期等于两次更新中断的间隔。

src/n32g033_it.csrc/n32g033_it.c · TIM1_BRK_UP_TRG_COM_IRQHandler
void TIM1_BRK_UP_TRG_COM_IRQHandler(void)
{
    if (TIM_GetIntStatus(TIM1, TIM_INT_UPDATE) != RESET)
    {
        TIM_ClrIntPendingBit(TIM1, TIM_INT_UPDATE);

        /* IO toggle */
        GPIO_WriteBit(GPIOA, GPIO_PIN_4, (Bit_OperateType)(1 - GPIO_ReadOutputDataBit(GPIOA, GPIO_PIN_4)));
    }
}

把翻转改成分频计数,可在同一个中断里得到多路不同频率的输出。

对应源码: src/main.c、src/n32g033_it.c、firmware/n32g033_std_periph_driver/inc/n32g033_tim.h

5.18.3.15 TimeBasic_TIM3 更新中断翻转 IO

工程目录: projects/n32g033_EVAL/examples/TIM/TimeBasic_TIM3/

使能时钟并配置输出引脚→配置时基并写预分频→打开更新中断与中断向量→更新中断里翻转 IO

项目 源码解读
功能 TIM3 用更新中断按固定周期翻转 PA4 的电平。
源码组成 src/main.c 含 RCC、GPIO、NVIC、TIM_Configuration 与主函数;
src/n32g033_it.c 含 TIM3_IRQHandler;
inc/main.h 声明引脚与中断宏;
readme.txt 给出配置与测试步骤;
工程文件在 MDK-ARM/ 与 EWARM/。
关键配置 引脚:PA4 为普通推挽输出;
时钟:PSC=0,AR=65535;
中断:TIM3 更新中断,抢占优先级 1;
向量:TIM3。
程序与数据路径 main → RCC_Configuration 打开 TIM3 与 GPIO 时钟 → GPIO_Configuration 把 PA4 配成输出 → NVIC_Configuration 使能 TIM3 中断 → TIM_Configuration 配置时基、开更新中断并启动计数 → TIM3_IRQHandler 翻转 PA4。
主要 API TIM_InitTimBaseStruct、TIM_InitTimeBase、TIM_ConfigPrescaler、TIM_ConfigInt、TIM_Enable、TIM_GetIntStatus、TIM_ClrIntPendingBit、NVIC_Init
验证方法 用示波器观察 PA4;
每次更新中断到来 PA4 翻转一次。
使用提示 开发环境为 KEIL MDK-ARM V5.34.0.0 或 IAR EWARM 8.50.1,硬件基于评估板 N32G033K8Q7-1_STB V1.0;
通用定时器 TIM3 的更新中断使用独立的向量。
核心代码解读与移植

示例用 TIM3 的更新事件产生定时中断,每次中断翻转一次 IO,其余配置与 TIM1 版一致。

数据路径: main → RCC_Configuration 打开时钟 → GPIO_Configuration 配置 PA4 → NVIC_Configuration 使能中断 → TIM_Configuration 写时基、开更新中断并启动计数 → TIM3_IRQHandler 清标志后翻转 PA4

1. 配置时基、打开更新中断并启动计数。 预分频与时基决定更新中断的周期。

src/main.csrc/main.c · TIM_Configuration
void TIM_Configuration(void)
{
    /* Compute the prescaler value */
    PrescalerValue = 0;

    /* Time base configuration */
    TIM_InitTimBaseStruct(&TIM_TimeBaseStructure);
    TIM_TimeBaseStructure.Period        = 65535;
    TIM_TimeBaseStructure.Prescaler     = 0;
    TIM_TimeBaseStructure.ClkDiv        = TIM_CLK_DIV1;
    TIM_TimeBaseStructure.CounterMode   = TIM_CNT_MODE_UP;

    TIM_InitTimeBase(TIM3, &TIM_TimeBaseStructure);

    /* Prescaler configuration */
    TIM_ConfigPrescaler(TIM3, PrescalerValue, TIM_PSC_RELOAD_MODE_IMMEDIATE);

    /* TIM3 enable update irq */
    TIM_ConfigInt(TIM3, TIM_INT_UPDATE, ENABLE);

    /* TIM3 enable counter */
    TIM_Enable(TIM3, ENABLE);
}

改 AR 与预分频可改变中断周期,较长的定时应通过加大预分频实现。

2. 先配置 NVIC 再启动定时器。 中断向量与优先级在使能中断前设定。

src/main.csrc/main.c · NVIC_Configuration
void NVIC_Configuration(void)
{
    NVIC_InitType NVIC_InitStructure;

    /* Enable the TIMx Interrupt */
    NVIC_InitStructure.NVIC_IRQChannel                   = TIM3_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPriority             = 1;
    NVIC_InitStructure.NVIC_IRQChannelCmd                = ENABLE;
    NVIC_Init(&NVIC_InitStructure);
}

3. 中断里清标志后翻转 IO。 翻转周期等于两次更新中断的间隔。

src/n32g033_it.csrc/n32g033_it.c · TIM3_IRQHandler
void TIM3_IRQHandler(void)
{
    if (TIM_GetIntStatus(TIM3, TIM_INT_UPDATE) != RESET)
    {
        TIM_ClrIntPendingBit(TIM3, TIM_INT_UPDATE);

        /* IO toggle */
        GPIO_WriteBit(GPIOA, GPIO_PIN_4, (Bit_OperateType)(1 - GPIO_ReadOutputDataBit(GPIOA, GPIO_PIN_4)));
    }
}

把翻转改成分频计数,可在同一个中断里得到多路不同频率的输出。

对应源码: src/main.c、src/n32g033_it.c、firmware/n32g033_std_periph_driver/inc/n32g033_tim.h

5.18.3.16 TimeBasic_TIM4 更新中断翻转 IO

工程目录: projects/n32g033_EVAL/examples/TIM/TimeBasic_TIM4/

使能时钟并配置输出引脚→配置时基并写预分频→打开更新中断与中断向量→更新中断里翻转 IO

项目 源码解读
功能 TIM4 用更新中断按固定周期翻转 PA4 的电平。
源码组成 src/main.c 含 RCC、GPIO、NVIC、TIM_Configuration 与主函数;
src/n32g033_it.c 含 TIM4_IRQHandler;
inc/main.h 声明引脚与中断宏;
readme.txt 给出配置与测试步骤;
工程文件在 MDK-ARM/ 与 EWARM/。
关键配置 引脚:PA4 为普通推挽输出;
时钟:PSC=0,AR=65535;
中断:TIM4 更新中断,抢占优先级 1;
向量:TIM4。
程序与数据路径 main → RCC_Configuration 打开 TIM4 与 GPIO 时钟 → GPIO_Configuration 把 PA4 配成输出 → NVIC_Configuration 使能 TIM4 中断 → TIM_Configuration 配置时基、开更新中断并启动计数 → TIM4_IRQHandler 翻转 PA4。
主要 API TIM_InitTimBaseStruct、TIM_InitTimeBase、TIM_ConfigPrescaler、TIM_ConfigInt、TIM_Enable、TIM_GetIntStatus、TIM_ClrIntPendingBit、NVIC_Init
验证方法 用示波器观察 PA4;
每次更新中断到来 PA4 翻转一次。
使用提示 开发环境为 KEIL MDK-ARM V5.34.0.0 或 IAR EWARM 8.50.1,硬件基于评估板 N32G033K8Q7-1_STB V1.0;
通用定时器 TIM4 的更新中断使用独立的向量。
核心代码解读与移植

示例用 TIM4 的更新事件产生定时中断,每次中断翻转一次 IO,其余配置与 TIM1、TIM3 版一致。

数据路径: main → RCC_Configuration 打开时钟 → GPIO_Configuration 配置 PA4 → NVIC_Configuration 使能中断 → TIM_Configuration 写时基、开更新中断并启动计数 → TIM4_IRQHandler 清标志后翻转 PA4

1. 配置时基、打开更新中断并启动计数。 预分频与时基决定更新中断的周期。

src/main.csrc/main.c · TIM_Configuration
void TIM_Configuration(void)
{
    /* Compute the prescaler value */
    PrescalerValue = 0;

    /* Time base configuration */
    TIM_InitTimBaseStruct(&TIM_TimeBaseStructure);
    TIM_TimeBaseStructure.Period        = 65535;
    TIM_TimeBaseStructure.Prescaler     = 0;
    TIM_TimeBaseStructure.ClkDiv        = TIM_CLK_DIV1;
    TIM_TimeBaseStructure.CounterMode   = TIM_CNT_MODE_UP;

    TIM_InitTimeBase(TIM4, &TIM_TimeBaseStructure);

    /* Prescaler configuration */
    TIM_ConfigPrescaler(TIM4, PrescalerValue, TIM_PSC_RELOAD_MODE_IMMEDIATE);

    /* TIM4 enable update irq */
    TIM_ConfigInt(TIM4, TIM_INT_UPDATE, ENABLE);

    /* TIM4 enable counter */
    TIM_Enable(TIM4, ENABLE);
}

改 AR 与预分频可改变中断周期,较长的定时应通过加大预分频实现。

2. 先配置 NVIC 再启动定时器。 中断向量与优先级在使能中断前设定。

src/main.csrc/main.c · NVIC_Configuration
void NVIC_Configuration(void)
{
    NVIC_InitType NVIC_InitStructure;

    /* Enable the TIMx Interrupt */
    NVIC_InitStructure.NVIC_IRQChannel                   = TIM4_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPriority             = 1;
    NVIC_InitStructure.NVIC_IRQChannelCmd                = ENABLE;
    NVIC_Init(&NVIC_InitStructure);
}

3. 中断里清标志后翻转 IO。 翻转周期等于两次更新中断的间隔。

src/n32g033_it.csrc/n32g033_it.c · TIM4_IRQHandler
void TIM4_IRQHandler(void)
{
    if (TIM_GetIntStatus(TIM4, TIM_INT_UPDATE) != RESET)
    {
        TIM_ClrIntPendingBit(TIM4, TIM_INT_UPDATE);

        /* IO toggle */
        GPIO_WriteBit(GPIOA, GPIO_PIN_4, (Bit_OperateType)(1 - GPIO_ReadOutputDataBit(GPIOA, GPIO_PIN_4)));
    }
}

把翻转改成分频计数,可在同一个中断里得到多路不同频率的输出。

对应源码: src/main.c、src/n32g033_it.c、firmware/n32g033_std_periph_driver/inc/n32g033_tim.h

5.18.3.17 TimeBasic_TIM6 更新中断翻转 IO

工程目录: projects/n32g033_EVAL/examples/TIM/TimeBasic_TIM6/

使能时钟并配置输出引脚→配置时基并写预分频→配置 EXTI 线 9 与更新中断→更新中断里清标志并翻转 IO

项目 源码解读
功能 TIM6 用更新中断按固定周期翻转 PA4 的电平。
源码组成 src/main.c 含 RCC、GPIO、NVIC、TIM_Configuration 与主函数;
src/n32g033_it.c 含 TIM6_IRQHandler;
inc/main.h 声明引脚与中断宏;
readme.txt 给出配置与测试步骤;
工程文件在 MDK-ARM/ 与 EWARM/。
关键配置 引脚:PA4 为普通推挽输出;
时钟:PSC=0,AR=65535;
中断:TIM6 更新中断并使能 EXTI 线 9,抢占优先级 1;
向量:TIM6。
程序与数据路径 main → RCC_Configuration 打开 TIM6 与 GPIO 时钟 → GPIO_Configuration 把 PA4 配成输出 → NVIC_Configuration 配置 EXTI 线 9 与 TIM6 中断 → TIM_Configuration 配置时基、开更新中断并启动计数 → TIM6_IRQHandler 清中断与 EXTI 标志后翻转 PA4。
主要 API TIM_InitTimBaseStruct、TIM_InitTimeBase、TIM_ConfigPrescaler、TIM_ConfigInt、TIM_Enable、TIM_GetIntStatus、TIM_ClrIntPendingBit、EXTI_InitPeripheral、EXTI_ClrITPendBit
验证方法 用示波器观察 PA4;
每次更新中断到来 PA4 翻转一次。
使用提示 开发环境为 KEIL MDK-ARM V5.34.0.0 或 IAR EWARM 8.50.1,硬件基于评估板 N32G033K8Q7-1_STB V1.0;
TIM6 属于基本定时器,更新中断需联接到 EXTI 线 9。
核心代码解读与移植

示例用 TIM6 的更新事件产生定时中断,中断里同时清 TIM6 与 EXTI 线 9 的标志,翻转一次 IO。

数据路径: main → RCC_Configuration 打开时钟 → GPIO_Configuration 配置 PA4 → NVIC_Configuration 配置 EXTI 线 9 与中断 → TIM_Configuration 写时基、开更新中断并启动计数 → TIM6_IRQHandler 清 TIM6 与 EXTI 标志后翻转 PA4

1. 配置时基、打开更新中断并启动计数。 TIM6 无输出引脚,更新事件只作定时用。

src/main.csrc/main.c · TIM_Configuration
void TIM_Configuration(void)
{
    /* Compute the prescaler value */
    PrescalerValue = 0;

    /* Time base configuration */
    TIM_InitTimBaseStruct(&TIM_TimeBaseStructure);
    TIM_TimeBaseStructure.Period        = 65535;
    TIM_TimeBaseStructure.Prescaler     = 0;
    TIM_TimeBaseStructure.ClkDiv        = TIM_CLK_DIV1;
    TIM_TimeBaseStructure.CounterMode   = TIM_CNT_MODE_UP;

    TIM_InitTimeBase(TIM6, &TIM_TimeBaseStructure);

    /* Prescaler configuration */
    TIM_ConfigPrescaler(TIM6, PrescalerValue, TIM_PSC_RELOAD_MODE_IMMEDIATE);

    /* TIM6 enable update irq */
    TIM_ConfigInt(TIM6, TIM_INT_UPDATE, ENABLE);

    /* TIM6 enable counter */
    TIM_Enable(TIM6, ENABLE);
}

2. 先配置 EXTI 线 9 与 NVIC 再启动定时器。 更新中断经 EXTI 线 9 进入内嵌向量控制器。

src/main.csrc/main.c · NVIC_Configuration
void NVIC_Configuration(void)
{
    NVIC_InitType NVIC_InitStructure;
    EXTI_InitType EXTI_Struct;

    EXTI_Struct.EXTI_Line    = EXTI_LINE9;
    EXTI_Struct.EXTI_Mode    = EXTI_Mode_Interrupt;
    EXTI_Struct.EXTI_Trigger = EXTI_Trigger_Rising;
    EXTI_Struct.EXTI_LineCmd = ENABLE;
    EXTI_InitPeripheral(&EXTI_Struct);
    
    /* Enable the TIMx Interrupt */
    NVIC_InitStructure.NVIC_IRQChannel                   = TIM6_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPriority             = 1;
    NVIC_InitStructure.NVIC_IRQChannelCmd                = ENABLE;
    NVIC_Init(&NVIC_InitStructure);


}

3. 中断里清两个标志后翻转 IO。 TIM6 的更新标志与 EXTI 线 9 的挂起位都要清。

src/n32g033_it.csrc/n32g033_it.c · TIM6_IRQHandler
void TIM6_IRQHandler(void)
{
    if (TIM_GetIntStatus(TIM6, TIM_INT_UPDATE) != RESET)
    {
        TIM_ClrIntPendingBit(TIM6, TIM_INT_UPDATE);
        EXTI_ClrITPendBit(EXTI_LINE9);
        /* IO toggle */
        GPIO_WriteBit(GPIOA, GPIO_PIN_4, (Bit_OperateType)(1 - GPIO_ReadOutputDataBit(GPIOA, GPIO_PIN_4)));
    }
}

漏清 EXTI 标志会导致中断被反复触发,移植时把两级标志一起处理。

对应源码: src/main.c、src/n32g033_it.c、firmware/n32g033_std_periph_driver/inc/n32g033_tim.h

5.18.3.18 TimeBasic6_wakeup TIM6 唤醒 STOP

工程目录: projects/n32g033_EVAL/examples/TIM/TimeBasic6_wakeup/

使能时钟并配置 LED 引脚→配置 EXTI 线 9 与更新中断→把 TIM6 时钟切到 LSI 并启动计数→进入 STOP,被更新中断唤醒后翻转 LED

项目 源码解读
功能 TIM6 以 LSI 为时钟源,用更新中断把芯片从 STOP 模式周期唤醒,翻转 PA6 上的 LED。
源码组成 src/main.c 含 RCC、GPIO、NVIC、TIM_Configuration、SetSysClock_LSI 与主函数;
src/n32g033_it.c 含 TIM6_IRQHandler;
inc/main.h 与 delay.h;
readme.txt 给出配置与测试步骤;
工程文件在 MDK-ARM/ 与 EWARM/。
关键配置 引脚:PA6 为普通推挽输出,驱动 LED(D1);
时钟:时钟源 LSI,SYS_CLK=32 kHz;
时基:PSC=0,AR=3200;
中断:TIM6 更新中断并联接 EXTI 线 9。
程序与数据路径 main → RCC_Configuration 打开 TIM6、GPIO 与 PWR 时钟 → GPIO_Configuration 把 PA6 配成输出 → NVIC_Configuration 配置 EXTI 线 9 与 TIM6 中断 → 延时后 TIM_Configuration 配置时基并开更新中断 → RCC_ConfigTim6Clk 选 LSI 作 TIM6 时钟 → 循环进入 STOP → 更新中断唤醒后在循环里翻转 PA6。
主要 API TIM_InitTimBaseStruct、TIM_InitTimeBase、TIM_ClearFlag、TIM_ConfigInt、TIM_Enable、RCC_ConfigTim6Clk、PWR_EnterSTOPMode、EXTI_InitPeripheral、SysTick_Delay_Ms
验证方法 下载复位后 LED(D1) 按周期闪烁;
把 TIM6 更新中断联接到 EXTI 线 9 才能在 STOP 下唤醒。
使用提示 开发环境为 KEIL MDK-ARM V5.34.0.0 或 IAR EWARM 8.50.1,硬件基于评估板 N32G033K8Q7-1_STB V1.0;
时钟源为 LSI,SYS_CLK=32 kHz;
使用 delay.h 的 SysTick 毫秒延时。
核心代码解读与移植

示例把 TIM6 的时钟切到 LSI,配置更新中断后让芯片进入 STOP,更新事件经 EXTI 线 9 唤醒芯片并翻转 LED。

数据路径: main 延时后调 TIM_Configuration → RCC_ConfigTim6Clk 选 LSI → TIM_Enable 启动计数 → 循环 PWR_EnterSTOPMode 进入 STOP → 更新事件经 EXTI 线 9 唤醒 → TIM6_IRQHandler 清标志

1. 主流程配置后进入 STOP,等待更新中断唤醒。 STOP 模式由 WFI 进入,唤醒后继续在主循环翻转 LED。

src/main.csrc/main.c · main
int main(void)
{
    /* System Clocks Configuration */
    RCC_Configuration();

    /* GPIO Configuration */
    GPIO_Configuration();

    /* NVIC Configuration */
    NVIC_Configuration();

    SysTick_Delay_Ms(500);
    /* Reconfig TIM6 */

    TIM_Configuration();
    RCC_ConfigTim6Clk(RCC_TIM6_CLKSRC_LSI);
    /* TIM6 enable counter */
    TIM_Enable(TIM6, ENABLE);
    
    while (1)
    {
        /* Enter STOP mode */
        PWR_EnterSTOPMode(PWR_STOPENTRY_WFI);
        GPIO_WriteBit(GPIOA, GPIO_PIN_6, (Bit_OperateType)(1 - GPIO_ReadOutputDataBit(GPIOA, GPIO_PIN_6)));
    }
}

在 STOP 之前要先把外设与中断配好,唤醒后除系统时钟外的大多数配置保持不变。

2. 配置 EXTI 线 9 与 TIM6 中断向量。 TIM6 的更新事件联接到 EXTI 线 9,才具有把芯片从 STOP 唤醒的能力。

src/main.csrc/main.c · NVIC_Configuration
void NVIC_Configuration(void)
{
    NVIC_InitType NVIC_InitStructure;
    EXTI_InitType EXTI_Struct;

    EXTI_ClrStatusFlag(EXTI_LINE9);
    EXTI_Struct.EXTI_Line    = EXTI_LINE9;
    EXTI_Struct.EXTI_Mode    = EXTI_Mode_Interrupt;
    EXTI_Struct.EXTI_Trigger = EXTI_Trigger_Rising;
    EXTI_Struct.EXTI_LineCmd = ENABLE;
    EXTI_InitPeripheral(&EXTI_Struct);
    
    /* Enable the TIMx Interrupt */
    NVIC_InitStructure.NVIC_IRQChannel                   = TIM6_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPriority             = 1;
    NVIC_InitStructure.NVIC_IRQChannelCmd                = ENABLE;
    NVIC_Init(&NVIC_InitStructure);
}

3. 配置时基并清更新标志后开更新中断。 先清标志可避免使能中断时立即触发一次。

src/main.csrc/main.c · TIM_Configuration
void TIM_Configuration(void)
{
    /* Time base configuration */
    TIM_InitTimBaseStruct(&TIM_TimeBaseStructure);
    TIM_TimeBaseStructure.Period        = 3200;
    TIM_TimeBaseStructure.Prescaler     = 0;
    TIM_TimeBaseStructure.ClkDiv        = TIM_CLK_DIV1;
    TIM_TimeBaseStructure.CounterMode   = TIM_CNT_MODE_UP;

    TIM_InitTimeBase(TIM6, &TIM_TimeBaseStructure);
    
    /* TIM6 enable update irq */
    TIM_ClearFlag(TIM6,TIM_FLAG_UPDATE);
    TIM_ConfigInt(TIM6, TIM_INT_UPDATE, ENABLE);
}

4. 用 LSI 作 TIM6 时钟源。 RCC_ConfigTim6Clk 在 LSI 就绪后把 TIM6 的时钟切到 LSI。

src/main.csrc/main.c · SetSysClock_LSI
ErrorStatus SetSysClock_LSI(void)
{
    uint32_t timeout_value = 0xFFFFFFFF; 
    
    /* Wait till LSI is ready */
    if (RCC_GetFlagStatus(RCC_CLKINT_FLAG_LSIRDF) == SET)
    {
        /* HCLK = SYSCLK */
        RCC_ConfigHclk(RCC_SYSCLK_DIV1);

        /* PCLK = HCLK */
        RCC_ConfigPclk(RCC_HCLK_DIV1);
    
        RCC_ConfigSysclk(RCC_SYSCLK_SRC_LSI);
        while (RCC_GetSysclkSrc() != RCC_CFG_SCLKSTS_LSI)
        {
            if ((timeout_value--) == 0)
            {
                return ERROR;
            }
        }
        
        FLASH_SetLatency(FLASH_LATENCY_0);
    }
    else
    {
        /* If LSI fails to start-up, the application will have wrong clock
           configuration. User can add here some code to deal with this error */
        return ERROR;
    }
    return SUCCESS;

}

LSI 频率随温度与电压有偏差,定时精度不高的场合才用它;对精度有要求时应改用 LSE 或 HSI。

对应源码: src/main.c、src/n32g033_it.c、firmware/n32g033_std_periph_driver/inc/n32g033_tim.h

5.18.3.19 TIMx_Synchro 主从同步

工程目录: projects/n32g033_EVAL/examples/TIM/TIMx_Synchro/

使能时钟并配置主从两定时器的引脚→配置从定时器为门控模式→配置主定时器并选更新事件作触发→从定时器随主定时器周期在门控下计数

项目 源码解读
功能 TIM1 作为主定时器,TIM3 在其更新事件门控下计数,一个 TIM3 周期内包含 15 个 TIM1 周期。
源码组成 src/main.c 含 RCC、GPIO 与主函数;
src/n32g033_it.c 仅保留框架;
inc/main.h 声明主从定时器与引脚宏;
readme.txt 给出配置与测试步骤;
工程文件在 MDK-ARM/ 与 EWARM/。
关键配置 引脚:PA4 为 TIM1 CH1,PA6 为 TIM3 CH1;
时钟:PSC=0;
主定时器:PWM2,Period=255,重复计数 4,更新事件作触发输出;
从定时器:PWM1,Period=2,门控模式,触发选 IN_TR0。
程序与数据路径 main → RCC_Configuration 打开 TIM1、TIM3 与 GPIO 时钟 → 先把 TIM3 配成时基 Period=2 与 PWM1 并选门控从模式 → 再把 TIM1 配成 Period=255、重复计数 4 的 PWM2 并写 BDTR → TIM_SelectMasterSlaveMode 与 TIM_SelectOutputTrig 选更新事件 → 打开两定时器与主输出。
主要 API TIM_InitTimBaseStruct、TIM_InitTimeBase、TIM_InitOcStruct、TIM_InitOc1、TIM_SelectSlaveMode、TIM_SelectInputTrig、TIM_InitBkdtStruct、TIM_ConfigBkdt、TIM_SelectMasterSlaveMode、TIM_SelectOutputTrig、TIM_Enable、TIM_EnableCtrlPwmOutputs
验证方法 用示波器观察 TIM1 CH1 与 TIM3 CH1;
TIM3 的周期约为 TIM1 的 15 倍。
使用提示 开发环境为 KEIL MDK-ARM V5.34.0.0 或 IAR EWARM 8.50.1,硬件基于评估板 N32G033K8Q7-1_STB V1.0;
TIM1 作主定时器,TIM3 作从定时器。
核心代码解读与移植

示例让 TIM1 的更新事件作触发输出门控 TIM3,据此得到从定时器在主定时器多个周期后翻转的同步波形。

数据路径: main 先配 TIM3 时基与 PWM1 → TIM_SelectSlaveMode 与 TIM_SelectInputTrig 把 TIM3 设为门控从模式 → 再配 TIM1 时基、PWM2 与 BDTR → TIM_SelectOutputTrig 用更新事件作触发 → TIM_SelectMasterSlaveMode 使能 → TIM_Enable 启动两定时器

1. 先配置从定时器时基与 PWM1 输出。 从定时器周期短,门控有效时可在主定时器一个周期内多次计数。

src/main.csrc/main.c · main
    /*TIMy Slave Configuration: PWM1 Mode */
    TIM_InitTimBaseStruct(&TIM_TimeBaseStructure);
    TIM_TimeBaseStructure.Period        = 2;
    TIM_TimeBaseStructure.Prescaler     = 0;
    TIM_TimeBaseStructure.ClkDiv        = TIM_CLK_DIV1;
    TIM_TimeBaseStructure.CounterMode   = TIM_CNT_MODE_UP;

    TIM_InitTimeBase(TIMy, &TIM_TimeBaseStructure);

    TIM_InitOcStruct(&TIM_OCInitStructure);
    TIM_OCInitStructure.OCMode      = TIM_OCMODE_PWM1;
    TIM_OCInitStructure.OutputState = TIM_OUTPUT_STATE_ENABLE;
    TIM_OCInitStructure.Pulse       = 1;

    TIM_InitOc1(TIMy, &TIM_OCInitStructure);  
    
    /* Slave Mode selection: TIMy */
    TIM_SelectSlaveMode(TIMy, TIM_SLAVE_MODE_GATED);
    TIM_SelectInputTrig(TIMy, TIM_TRIG_SEL_IN_TR0);

改从定时器的 Period 可以改变一个主周期内的计数次数。

2. 主定时器用 PWM2 并选更新事件作触发。 主定时器的重复计数与周期一起决定触发输出的频率。

src/main.csrc/main.c · main
    /* Time Base configuration */
    TIM_TimeBaseStructure.Prescaler     = 0;
    TIM_TimeBaseStructure.CounterMode   = TIM_CNT_MODE_UP;
    TIM_TimeBaseStructure.Period        = 255;
    TIM_TimeBaseStructure.ClkDiv        = TIM_CLK_DIV1;
    TIM_TimeBaseStructure.RepetCnt      = 4;

    TIM_InitTimeBase(TIMx, &TIM_TimeBaseStructure);

    /* Channel 1 Configuration in PWM mode */
    TIM_OCInitStructure.OCMode       = TIM_OCMODE_PWM2;
    TIM_OCInitStructure.OutputState  = TIM_OUTPUT_STATE_ENABLE;
    TIM_OCInitStructure.OutputNState = TIM_OUTPUT_NSTATE_DISABLE;
    TIM_OCInitStructure.Pulse        = 127;
    TIM_OCInitStructure.OCPolarity   = TIM_OC_POLARITY_LOW;
    TIM_OCInitStructure.OCNPolarity  = TIM_OCN_POLARITY_LOW;
    TIM_OCInitStructure.OCIdleState  = TIM_OC_IDLE_STATE_SET;
    TIM_OCInitStructure.OCNIdleState = TIM_OCN_IDLE_STATE_RESET;

    TIM_InitOc1(TIMx, &TIM_OCInitStructure);

3. 写 BDTR 后使能主从模式与输出。 主输出使能位有效后主定时器的引脚才会驱动。

src/main.csrc/main.c · main
    /* Automatic Output enable, Break, dead time and lock configuration*/
    TIM_InitBkdtStruct(&TIM_BDTRInitStructure);
    TIM_BDTRInitStructure.OSSRState       = TIM_OSSR_STATE_ENABLE;
    TIM_BDTRInitStructure.OSSIState       = TIM_OSSI_STATE_ENABLE;
    TIM_BDTRInitStructure.LOCKLevel       = TIM_LOCK_LEVEL_1;
    TIM_BDTRInitStructure.DeadTime        = 0;
    TIM_BDTRInitStructure.Break           = TIM_BREAK_IN_DISABLE;
    TIM_BDTRInitStructure.BreakPolarity   = TIM_BREAK_POLARITY_HIGH;
    TIM_BDTRInitStructure.AutomaticOutput = TIM_AUTO_OUTPUT_DISABLE;

    TIM_ConfigBkdt(TIMx, &TIM_BDTRInitStructure);

    /* Select the Master Slave Mode */
    TIM_SelectMasterSlaveMode(TIMx, TIM_MASTER_SLAVE_MODE_ENABLE);
    
    /* Master Mode selection */
    TIM_SelectOutputTrig(TIMx, TIM_TRGO_SRC_UPDATE);
    
    /* TIMx counter enable */
    TIM_Enable(TIMx, ENABLE);

    /* TIM enable counter */
    TIM_Enable(TIMy, ENABLE);

    /* Main Output Enable */
    TIM_EnableCtrlPwmOutputs(TIMx, ENABLE);

把触发输出从更新事件换成使能事件或比较脉冲,可得到不同的同步节拍。

对应源码: src/main.c、firmware/n32g033_std_periph_driver/inc/n32g033_tim.h

5.18.4 注意与排障

场景 检查与建议 来源
中心对齐与边沿对齐之间切换 用户手册 TIM1 章写明当计数器仍启用时(TIMx_CTRL1.CNTEN=1)不允许从边缘对齐模式切换到中央对齐模式;
计数方向位在中央对齐模式或编码器模式下为只读。
用户手册
禁用更新事件(UPDIS) 用户手册 TIM1 章写明 TIMx_CTRL1.UPDIS=1 时不生成更新事件,影子寄存器(AR、PSC 与 CCDATx)保持原值;
需要重装载时保持 UPDIS=0,让新值在更新事件时传入影子寄存器。
用户手册
门控与复位从模式的启动 用户手册 TIM1 章写明在门控加复位模式下若 TIMx_CTRL1.CNTEN=0,则计数器不启动,与触发输入电平无关;
软件置 CNTEN 后还需等待至少两个 TIMx_CLK 才能同步生效。
用户手册
外部时钟模式 1 的捕获预分频器 用户手册 TIM1 章写明触发操作中不使用捕获预分频器,无需配置,输入选择位只用于选择输入捕获源。 用户手册
外部触发(ETR)频率上限 用户手册 TIM1 章写明外部触发信号 ETRP 的频率必须最多为 TIMx_CLK 频率的四分之一;
输入更快的外部时钟时用外部触发预分频降低 ETRP 频率。
用户手册
编码器模式与外部时钟模式 2 用户手册 TIM3 章写明编码器模式和外部时钟模式 2 不兼容,不能同时选择。 用户手册
刹车输入与主输出 用户手册 TIM3 章写明一旦刹车输入有效,主输出使能位由硬件异步清零,输出立即进入空闲状态;
刹车有效期间该位不能自动置位或由软件置位,刹车中断标志也不能清零。
用户手册
中央对齐非对称模式 用户手册 TIM1 章写明该功能仅适用于 TIM1,且需 TIMx_CTRL1.CAMSEL 非零时有效;
向上计数时与 CCDATx 比较,向下计数时与 CCDDx 比较。
用户手册
从模式控制位的改动时机 用户手册 TIM1 章写明从模式控制器被禁用时,CNTEN 与 DIR 只能由软件改变;
触发选择位只能在未用到时改变,避免在改动时产生错误的边沿检测。
用户手册
预装载值到影子寄存器的时机 用户手册 TIM1 章写明预装载寄存器的值按 ARPEN 设置立即或在每次更新事件时传输到影子寄存器;
软件置 CNTEN 后,计数器在下一个时钟周期开始计数。
用户手册
TIM6 以 LSI 为时钟源 用户手册 TIM6 章写明时钟源配置为 LSI 时 TIMx_CNT 不支持写入;
此时可用更新中断(联接到 EXTI 9)唤醒 STOP 模式。
用户手册

勘误手册 V1.0.0(2025.9.25)针对 A 版芯片,未列出 TIM 相关条目。

国民技术开发套件文档中心

按芯片系列在线查阅国民技术 MCU 开发套件的芯片资料、SDK、驱动 API 与 Demo 示例说明。

© 2026 国民技术股份有限公司 版权所有粤ICP备11069485号本站使用不含 Cookie 的匿名访问统计