5.20 TIM 使用说明

本章说明 N32G41x 标准外设库中 TIM 驱动的文件组成与 154 个公开函数,覆盖高级控制定时器 ATIM1/ATIM2、通用定时器 GTIM1、GTIM2、通用控制定时器 GTIM3/GTIM4 与基本定时器 BTIM1/BTIM2 的时基、输出比较、输入捕获、互补输出与刹车/死区、编码器、从/主模式与同步、DMA 以及中断与标志管理;projects/n32g41x_EVAL/examples/TIM/ 下的 18 个示例演示 PWM 输出与输入、输入捕获、单脉冲、各类同步与 DMA 等用法。各定时器的寄存器定义与模式限制请配合用户手册的“高级控制定时器 (ATIM1/ATIM2)”“通用定时器 (GTIM1)”“通用定时器 (GTIM2)”“通用控制定时器 (GTIM3/GTIM4)”“基本定时器 (BTIM1/BTIM2)”章节阅读,芯片已知问题以勘误手册为准。

5.20.1 相关文件

相对路径 作用
firmware/n32g41x_std_periph_driver/inc/n32g41x_tim.h 定义时基、输出比较、输入捕获、BKDT 与滤波五个初始化结构体及各模式、通道宏,并按十个功能区段声明 154 个公开函数
firmware/n32g41x_std_periph_driver/src/n32g41x_tim.c 实现上述 154 个函数:读写 CTRL1、CTRL2、STS、CCMODx、CCEN、CCDATx 等寄存器,完成时基与预分频配置、输出比较与 PWM、输入捕获与滤波、刹车与死区、编码器接口、触发与同步、DMA 请求以及中断与标志管理
projects/n32g41x_EVAL/examples/TIM/ 包含 18 个示例:6Steps、ATIM1_Synchro、Cascade_Synchro、ComplementarySignals、DMA、DMABurst、ExtTrigger_Synchro、InputCapture、OCActive、OCInactive、OCToggle、OnePulse、Parallel_Synchro、PWM_Input、PWM_Output、TimeBasic6_BTIM_wakeup、TimeBasic_cc、TimeBasic_update
projects/n32g41x_EVAL/examples/TIM/PWM_Output/ 演示主功能的示例工程,含 src/main.c、src/n32g41x_it.c、inc/main.h、inc/n32g41x_it.h、readme.txt 以及 MDK-ARM/、EWARM/ 两套构建工程
firmware/CMSIS/device/n32g41x.h 定义 TIM_Module 寄存器结构、ATIM1/ATIM2/GTIM1~GTIM4/BTIM1/BTIM2 基址指针与各定时器的寄存器映射

5.20.2 API 参考

搜索 API共 154 个函数

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

复位与初始化

TIM_DeInit、TIM_InitTimeBase、TIM_InitTimBaseStruct、TIM_InitOcStruct、TIM_InitIcStruct、TIM_InitBkdtStruct、TIM_Enable

时基配置

TIM_ConfigPrescaler、TIM_ConfigCntMode、TIM_ConfigArPreload、TIM_SetCnt、TIM_SetAutoReload、TIM_GetCnt、TIM_GetPrescaler、TIM_GetAutoReload、TIM_SetClkDiv、TIM_ConfigUpdateEvt、TIM_ConfigUpdateRequestIntSrc、TIM_SelectOnePulseMode、TIM_GenerateEvent

输出比较

TIM_InitOc1、TIM_InitOc2、TIM_InitOc3、TIM_InitOc4、TIM_InitOc5、TIM_InitOc6、TIM_SelectOcMode、TIM_ConfigForcedOc1、TIM_ConfigForcedOc2、TIM_ConfigForcedOc3、TIM_ConfigForcedOc4、TIM_ConfigForcedOc5、TIM_ConfigForcedOc6、TIM_ConfigOc1Preload、TIM_ConfigOc2Preload、TIM_ConfigOc3Preload、TIM_ConfigOc4Preload、TIM_ConfigOc5Preload、TIM_ConfigOc6Preload、TIM_ConfigOc7Preload、TIM_ConfigOc8Preload、TIM_ConfigOc9Preload、TIM_ConfigOc1Fast、TIM_ConfigOc2Fast、TIM_ConfigOc3Fast、TIM_ConfigOc4Fast、TIM_ConfigOc5Fast、TIM_ConfigOc6Fast、TIM_ClrOc1Ref、TIM_ClrOc2Ref、TIM_ClrOc3Ref、TIM_ClrOc4Ref、TIM_ClrOc5Ref、TIM_ClrOc6Ref、TIM_ClrOcRefInputSource、TIM_ConfigOc1Polarity、TIM_ConfigOc1NPolarity、TIM_ConfigOc2Polarity、TIM_ConfigOc2NPolarity、TIM_ConfigOc3Polarity、TIM_ConfigOc3NPolarity、TIM_ConfigOc4Polarity、TIM_ConfigOc4NPolarity、TIM_ConfigOc5Polarity、TIM_ConfigOc6Polarity、TIM_EnableCapCmpCh、TIM_EnableCapCmpChN、TIM_SetCmp1、TIM_SetCmp2、TIM_SetCmp3、TIM_SetCmp4、TIM_SetCmp5、TIM_SetCmp6、TIM_SetCmp7、TIM_SetCmp8、TIM_SetCmp9、TIM_SetCmp1D、TIM_SetCmp2D、TIM_SetCmp3D、TIM_SetCmp4D、TIM_AsymmetricEnable、TIM_SelectCenterAlignTrig、TIM_OCxRefTriggerADC

输入捕获

TIM_ICInit、TIM_ConfigPwmIc、ConfigTI1、ConfigTI2、ConfigTI3、ConfigTI4、TIM_SetInCap1Prescaler、TIM_SetInCap2Prescaler、TIM_SetInCap3Prescaler、TIM_SetInCap4Prescaler、TIM_GetCap1、TIM_GetCap2、TIM_GetCap3、TIM_GetCap4、TIM_GetCap5、TIM_GetCap6、TIM_GetCap7、TIM_GetCap8、TIM_GetCap9、TIM_GetCap1D、TIM_GetCap2D、TIM_GetCap3D、TIM_GetCap4D

输入捕获滤波

TIM_IC1FiltConfig、TIM_IC2FiltConfig、TIM_IC3FiltConfig、TIM_IC4FiltConfig、TIM_IC1FiltEnable、TIM_IC2FiltEnable、TIM_IC3FiltEnable、TIM_IC4FiltEnable、TIM_GetFiltStatus

互补输出与刹车/死区

TIM_EnableCtrlPwmOutputs、TIM_ConfigBkdt、TIM_BreakFiltConfig、TIM_BreakFiltEnable、TIM_BreakInputSourceEnable、TIM_BidirectionDisarm、TIM_BidirectionRearm、TIM_SelectComEvt、TIM_SelectCapCmpDmaSrc、TIM_EnableCapCmpPreloadControl、TIM_GetCCENStatus

编码器接口

TIM_ConfigEncoderInterface、TIM_ConfigEncoderInterface2、TIM_TrgiLoadLvrToCNTEnable、TIM_GetLVR、TIM_CH3LoadLvrToCNTEnable、TIM_CH3LoadLvrToCNTPolarity、TIM_GetENCDAT、TIM_GetENCDATSign

从/主模式与同步

TIM_ConfigInternalClk、TIM_SelectInputTrig、TIM_ConfigInternalTrigToExt、TIM_ConfigExtTrigAsClk、TIM_ConfigExtClkMode1、TIM_ConfigExtClkMode2、TIM_ConfigExtTrig、TIM_SelectETRInputSource、TIM_SelectOutputTrig、TIM_SelectOutputTrig2、TIM_SelectSlaveMode、TIM_SelectMasterSlaveMode、TIM_SelectHallSensor

DMA

TIM_ConfigDma、TIM_EnableDma

中断与标志管理

TIM_ConfigInt、TIM_GetFlagStatus、TIM_ClearFlag、TIM_GetIntStatus、TIM_ClrIntPendingBit

void TIM_DeInit(const TIM_Module *TIMx)将 TIMx 的寄存器复位为默认值。
源码注释
name    TIM_DeInit
fun     Deinitializes the TIMx registers.
param   TIMx (The input parameters must be the following values):
          - ATIM1
          - ATIM2
          - GTIM1
          - GTIM2
          - GTIM3
          - GTIM4
          - BTIM1
          - BTIM2
return  none
void TIM_InitTimeBase(TIM_Module *TIMx, const 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):
          - ATIM1
          - ATIM2
          - GTIM1
          - GTIM2
          - GTIM3
          - GTIM4
          - BTIM1
          - BTIM2
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
            * TIM_CLK_DIV1
            * TIM_CLK_DIV2
            * TIM_CLK_DIV4
          - RepetCnt
            * 0x00 ~ 0xFF
          - CapCh1Sel
            * TIM_CAPCH1SEL_0
            * TIM_CAPCH1SEL_1
            * TIM_CAPCH1SEL_2
            * TIM_CAPCH1SEL_3
            * TIM_CAPCH1SEL_4
            * TIM_CAPCH1SEL_5
            * TIM_CAPCH1SEL_6
          - CapCh2Sel
            * TIM_CAPCH2SEL_0
            * TIM_CAPCH2SEL_1
            * TIM_CAPCH2SEL_2
          - CapCh3Sel
            * TIM_CAPCH3SEL_0
            * TIM_CAPCH3SEL_1
            * TIM_CAPCH3SEL_2
          - CapCh4Sel
            * TIM_CAPCH4SEL_0
            * TIM_CAPCH4SEL_1
            * TIM_CAPCH4SEL_2
          - EtrOrClr
            * TIM_ETRSEL
            * TIM_CLRSEL
          - CapEtrClrSel
            * TIM_CAPETRSEL_0
            * TIM_CAPETRSEL_1
            * TIM_CAPETRSEL_2
            * TIM_CAPETRSEL_3
            * TIM_CAPETRSEL_4
            * TIM_CAPETRSEL_5
            * TIM_OCCLRSEL_0
            * TIM_OCCLRSEL_1
            * TIM_OCCLRSEL_2
return  none
note  GTIM1 is a 32-bit timer, while the others are 16-bit timers.
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
            * TIM_CLK_DIV1
            * TIM_CLK_DIV2
            * TIM_CLK_DIV4
          - RepetCnt
            * 0x00 ~ 0xFF
          - CapCh1Sel
            * TIM_CAPCH1SEL_0
            * TIM_CAPCH1SEL_1
            * TIM_CAPCH1SEL_2
            * TIM_CAPCH1SEL_3
            * TIM_CAPCH1SEL_4
            * TIM_CAPCH1SEL_5
            * TIM_CAPCH1SEL_6
          - CapCh2Sel
            * TIM_CAPCH2SEL_0
            * TIM_CAPCH2SEL_1
            * TIM_CAPCH2SEL_2
          - CapCh3Sel
            * TIM_CAPCH3SEL_0
            * TIM_CAPCH3SEL_1
            * TIM_CAPCH3SEL_2
          - CapCh4Sel
            * TIM_CAPCH4SEL_0
            * TIM_CAPCH4SEL_1
            * TIM_CAPCH4SEL_2
          - EtrOrClr
            * TIM_ETRSEL
            * TIM_CLRSEL
          - CapEtrClrSel
            * TIM_CAPETRSEL_0
            * TIM_CAPETRSEL_1
            * TIM_CAPETRSEL_2
            * TIM_CAPETRSEL_3
            * TIM_CAPETRSEL_4
            * TIM_CAPETRSEL_5
            * TIM_OCCLRSEL_0
            * TIM_OCCLRSEL_1
            * TIM_OCCLRSEL_2
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
            * TIM_OCMODE_OPMOD_RETRIG1
            * TIM_OCMODE_OPMOD_RETRIG2
            * TIM_OCMODE_COMBI_PWM1
            * TIM_OCMODE_COMBI_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
          - Bidirection
            * TIM_BREAK_BID_ENABLE
            * TIM_BREAK_BID_DISABLE
          - 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):
          - ATIM1
          - ATIM2
          - GTIM1
          - GTIM2
          - GTIM3
          - GTIM4
          - BTIM1
          - BTIM2
param   Cmd :
          - ENABLE
          - DISABLE
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):
          - ATIM1
          - ATIM2
          - GTIM1
          - GTIM2
          - GTIM3
          - GTIM4
          - BTIM1
          - BTIM2
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):
          - ATIM1
          - ATIM2
          - GTIM1
          - GTIM2
          - GTIM3
          - GTIM4
          - BTIM1
          - BTIM2
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_ConfigArPreload(TIM_Module *TIMx, FunctionalState Cmd)使能或关闭 TIMx 自动重载寄存器的预装载。
源码注释
name    TIM_ConfigArPreload
fun     Enables or disables TIMx peripheral Preload register on AR.
param   TIMx (The input parameters must be the following values):
          - ATIM1
          - ATIM2
          - GTIM1
          - GTIM2
          - GTIM3
          - GTIM4
          - BTIM1
          - BTIM2
param   Cmd
          - ENABLE
          - 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):
          - ATIM1
          - ATIM2
          - GTIM1
          - GTIM2
          - GTIM3
          - GTIM4
          - BTIM1
          - BTIM2
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):
          - ATIM1
          - ATIM2
          - GTIM1
          - GTIM2
          - GTIM3
          - GTIM4
          - BTIM1
          - BTIM2
param   Autoreload
          - Autoreload can be a number between 0x00000000 and 0xFFFFFFFF
return  none
uint32_t TIM_GetCnt(const TIM_Module *TIMx)获取 TIMx 计数器的值。
源码注释
name    TIM_GetCnt
fun     Gets the TIMx Counter value.
param   TIMx (The input parameters must be the following values):
          - ATIM1
          - ATIM2
          - GTIM1
          - GTIM2
          - GTIM3
          - GTIM4
          - BTIM1
          - BTIM2
return  Counter Register value.
uint16_t TIM_GetPrescaler(const TIM_Module *TIMx)获取 TIMx 预分频器的值。
源码注释
name    TIM_GetPrescaler
fun     Gets the TIMx Prescaler value.
param   TIMx (The input parameters must be the following values):
          - ATIM1
          - ATIM2
          - GTIM1
          - GTIM2
          - GTIM3
          - GTIM4
          - BTIM1
          - BTIM2
return  Prescaler Register value.
uint32_t TIM_GetAutoReload(const TIM_Module *TIMx)获取 TIMx 自动重载寄存器的值。
源码注释
name    TIM_GetAutoReload
fun     Gets the TIMx AR value.
param   TIMx (The input parameters must be the following values):
          - ATIM1
          - ATIM2
          - GTIM1
          - GTIM2
          - GTIM3
          - GTIM4
          - BTIM1
          - BTIM2
return  AR Register value.
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):
          - ATIM1
          - ATIM2
          - GTIM1
          - GTIM2
          - GTIM3
          - GTIM4
param   TIM_CKD:
          - TIM_CLK_DIV1
          - TIM_CLK_DIV2
          - TIM_CLK_DIV4
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):
          - ATIM1
          - ATIM2
          - GTIM1
          - GTIM2
          - GTIM3
          - GTIM4
          - BTIM1
          - BTIM2
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):
          - ATIM1
          - ATIM2
          - GTIM1
          - GTIM2
          - GTIM3
          - GTIM4
          - BTIM1
          - BTIM2
param   TIM_UpdateSource
          - TIM_UPDATE_SRC_GLOBAL
          - TIM_UPDATE_SRC_REGULAR
return  none

使用提示: 实现按 TIM_UpdateSource 置位或清位 TIMx->CTRL1 的 UPRS 位;传入 TIM_UPDATE_SRC_GLOBAL 时清位。

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):
          - ATIM1
          - ATIM2
          - GTIM1
          - GTIM2
          - GTIM3
          - GTIM4
param   TIM_OPMode
          - TIM_OPMODE_SINGLE
          - TIM_OPMODE_REPET
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):
          - ATIM1
          - ATIM2
          - GTIM1
          - GTIM2
          - GTIM3
          - GTIM4
          - BTIM1
          - BTIM2
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_InitOc1(TIM_Module *TIMx, const OCInitType *TIM_OCInitStruct)初始化 TIMx 通道 1。
源码注释
name    TIM_InitOc1
fun     Initializes the TIMx Channel 1.
param   TIMx (The input parameters must be the following values):
          - ATIM1
          - ATIM2
          - GTIM1
          - GTIM2
          - GTIM3
          - GTIM4
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
            * TIM_OCMODE_OPMOD_RETRIG1
            * TIM_OCMODE_OPMOD_RETRIG2
            * TIM_OCMODE_COMBI_PWM1
            * TIM_OCMODE_COMBI_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, const OCInitType *TIM_OCInitStruct)初始化 TIMx 通道 2。
源码注释
name    TIM_InitOc2
fun     Initializes the TIMx Channel 2.
param   TIMx (The input parameters must be the following values):
          - ATIM1
          - ATIM2
          - GTIM1
          - GTIM2
          - GTIM3
          - GTIM4
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
            * TIM_OCMODE_OPMOD_RETRIG1
            * TIM_OCMODE_OPMOD_RETRIG2
            * TIM_OCMODE_COMBI_PWM1
            * TIM_OCMODE_COMBI_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, const OCInitType *TIM_OCInitStruct)初始化 TIMx 通道 3。
源码注释
name    TIM_InitOc3
fun     Initializes the TIMx Channel 3.
param   TIMx (The input parameters must be the following values):
          - ATIM1
          - ATIM2
          - GTIM1
          - GTIM2
          - GTIM3
          - GTIM4
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
            * TIM_OCMODE_OPMOD_RETRIG1
            * TIM_OCMODE_OPMOD_RETRIG2
            * TIM_OCMODE_COMBI_PWM1
            * TIM_OCMODE_COMBI_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, const OCInitType *TIM_OCInitStruct)初始化 TIMx 通道 4。
源码注释
name    TIM_InitOc4
fun     Initializes the TIMx Channel 4.
param   TIMx (The input parameters must be the following values):
          - ATIM1
          - ATIM2
          - GTIM1
          - GTIM2
          - GTIM3
          - GTIM4
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
            * TIM_OCMODE_OPMOD_RETRIG1
            * TIM_OCMODE_OPMOD_RETRIG2
            * TIM_OCMODE_COMBI_PWM1
            * TIM_OCMODE_COMBI_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, const OCInitType *TIM_OCInitStruct)初始化 TIMx 通道 5。
源码注释
name    TIM_InitOc5
fun     Initializes the TIMx Channel 5.
param   TIMx (The input parameters must be the following values):
          - ATIM1
          - ATIM2
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
          - OCIdleState none
return  none
void TIM_InitOc6(TIM_Module *TIMx, const OCInitType *TIM_OCInitStruct)初始化 TIMx 通道 6。
源码注释
name    TIM_InitOc6
fun     Initializes the TIMx Channel 6.
param   TIMx (The input parameters must be the following values):
          - ATIM1
          - ATIM2
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_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):
          - ATIM1
          - ATIM2
          - GTIM1
          - GTIM2
          - GTIM3
          - GTIM4
param   Channel
          - TIM_CH_1
          - TIM_CH_2
          - TIM_CH_3
          - TIM_CH_4
          - TIM_CH_5
          - TIM_CH_6
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
          - TIM_OCMODE_OPMOD_RETRIG1
          - TIM_OCMODE_OPMOD_RETRIG2
          - TIM_OCMODE_COMBI_PWM1
          - TIM_OCMODE_COMBI_PWM2
return  none
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):
          - ATIM1
          - ATIM2
          - GTIM1
          - GTIM2
          - GTIM3
          - GTIM4
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):
          - ATIM1
          - ATIM2
          - GTIM1
          - GTIM2
          - GTIM3
          - GTIM4
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):
          - ATIM1
          - ATIM2
          - GTIM1
          - GTIM2
          - GTIM3
          - GTIM4
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):
          - ATIM1
          - ATIM2
          - GTIM1
          - GTIM2
          - GTIM3
          - GTIM4
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):
          - ATIM1
          - ATIM2
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):
          - ATIM1
          - ATIM2
param   TIM_ForcedAction
          - TIM_FORCED_ACTION_ACTIVE
          - TIM_FORCED_ACTION_INACTIVE
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):
          - ATIM1
          - ATIM2
          - GTIM1
          - GTIM2
          - GTIM3
          - GTIM4
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):
          - ATIM1
          - ATIM2
          - GTIM1
          - GTIM2
          - GTIM3
          - GTIM4
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):
          - ATIM1
          - ATIM2
          - GTIM1
          - GTIM2
          - GTIM3
          - GTIM4
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):
          - ATIM1
          - ATIM2
          - GTIM1
          - GTIM2
          - GTIM3
          - GTIM4
          - GTIM5
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):
          - ATIM1
          - ATIM2
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):
          - ATIM1
          - ATIM2
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 捕获比较数据寄存器 CCDAT7 的预装载。
源码注释
name    TIM_ConfigOc7Preload
fun     Enables or disables the TIMx peripheral Preload register on CCDAT7.
param   TIMx (The input parameters must be the following values):
          - ATIM1
          - ATIM2
param   TIM_OCPreload
          - TIM_OC_PRE_LOAD_ENABLE
          - TIM_OC_PRE_LOAD_DISABLE
return  none
void TIM_ConfigOc8Preload(TIM_Module *TIMx, uint32_t TIM_OCPreload)使能或关闭 TIMx 捕获比较数据寄存器 CCDAT8 的预装载。
源码注释
name    TIM_ConfigOc8Preload
fun     Enables or disables the TIMx peripheral Preload register on CCDAT8.
param   TIMx (The input parameters must be the following values):
          - ATIM1
          - ATIM2
param   TIM_OCPreload
          - TIM_OC_PRE_LOAD_ENABLE
          - TIM_OC_PRE_LOAD_DISABLE
return  none
void TIM_ConfigOc9Preload(TIM_Module *TIMx, uint32_t TIM_OCPreload)使能或关闭 TIMx 捕获比较数据寄存器 CCDAT9 的预装载。
源码注释
name    TIM_ConfigOc9Preload
fun     Enables or disables the TIMx peripheral Preload register on CCDAT9.
param   TIMx (The input parameters must be the following values):
          - ATIM1
          - ATIM2
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):
          - ATIM1
          - ATIM2
          - GTIM1
          - GTIM2
          - GTIM3
          - GTIM4
param   TIM_OCFast
          - 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):
          - ATIM1
          - ATIM2
          - GTIM1
          - GTIM2
          - GTIM3
          - GTIM4
param   TIM_OCFast
          - 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):
          - ATIM1
          - ATIM2
          - GTIM1
          - GTIM2
          - GTIM3
          - GTIM4
param   TIM_OCFast
          - 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):
          - ATIM1
          - ATIM2
          - GTIM1
          - GTIM2
          - GTIM3
          - GTIM4
param   TIM_OCFast
          - 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):
          - ATIM1
          - ATIM2
param   TIM_OCFast
          - 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):
          - ATIM1
          - ATIM2
param   TIM_OCFast
          - 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):
          - ATIM1
          - ATIM2
          - GTIM1
          - GTIM2
          - GTIM3
          - GTIM4
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):
          - ATIM1
          - ATIM2
          - GTIM1
          - GTIM2
          - GTIM3
          - GTIM4
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):
          - ATIM1
          - ATIM2
          - GTIM1
          - GTIM2
          - GTIM3
          - GTIM4
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):
          - ATIM1
          - ATIM2
          - GTIM1
          - GTIM2
          - GTIM3
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):
          - ATIM1
          - ATIM2
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):
          - ATIM1
          - ATIM2
param   TIM_OCPreload
          - TIM_OC_CLR_ENABLE
          - TIM_OC_CLR_DISABLE
return  none
void TIM_ClrOcRefInputSource(TIM_Module *TIMx, uint32_t OCRefClearInputSelect, uint32_t OCRefClearInputSource)设置 OCREF 的清除输入源。
源码注释
name    TIM_ClrOcRefInputSource
fun     Set the OCREF clear input source
param   TIMx (The input parameters must be the following values):
          - ATIM1
          - ATIM2
          - GTIM1
          - GTIM2
          - GTIM3
          - GTIM4
param   OCRefClearInputSelect
          - TIM_ETRSEL
          - TIM_CLRSEL
param   OCRefClearInputSource
          - TIM_CAPETRSEL_0
          - TIM_CAPETRSEL_1
          - TIM_CAPETRSEL_2
          - TIM_CAPETRSEL_3
          - TIM_CAPETRSEL_4
          - TIM_CAPETRSEL_5
          - TIM_OCCLRSEL_0
          - TIM_OCCLRSEL_1
          - TIM_OCCLRSEL_2
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):
          - ATIM1
          - ATIM2
          - GTIM1
          - GTIM2
          - GTIM3
          - GTIM4
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):
          - ATIM1
          - ATIM2
          - GTIM3
          - GTIM4
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):
          - ATIM1
          - ATIM2
          - GTIM1
          - GTIM2
          - GTIM3
          - GTIM4
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):
          - ATIM1
          - ATIM2
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):
          - ATIM1
          - ATIM2
          - GTIM1
          - GTIM2
          - GTIM3
          - GTIM4
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):
          - ATIM1
          - ATIM2
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):
          - ATIM1
          - ATIM2
          - GTIM1
          - GTIM2
          - GTIM3
          - GTIM4
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):
          - ATIM1
          - ATIM2
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):
          - ATIM1
          - ATIM2
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):
          - ATIM1
          - ATIM2
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):
          - ATIM1
          - ATIM2
          - GTIM1
          - GTIM2
          - GTIM3
          - GTIM4
param   Channel
          - TIM_CH_1
          - TIM_CH_2
          - TIM_CH_3
          - TIM_CH_4
          - TIM_CH_5
          - TIM_CH_6
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):
          - ATIM1
          - ATIM2
          - GTIM3
          - GTIM4
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_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):
          - ATIM1
          - ATIM2
          - GTIM1
          - GTIM2
          - GTIM3
          - GTIM4
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):
          - ATIM1
          - ATIM2
          - GTIM1
          - GTIM2
          - GTIM3
          - GTIM4
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):
          - ATIM1
          - ATIM2
          - GTIM1
          - GTIM2
          - GTIM3
          - GTIM4
param   Compare3
          - Compare3 can be a number between 0x00000000 and 0xFFFFFFFF
return  none
void TIM_SetCmp4(TIM_Module *TIMx, uint32_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):
          - ATIM1
          - ATIM2
          - GTIM1
          - GTIM2
          - GTIM3
          - GTIM4
param   Compare4
          - Compare4 can be a number between 0x00000000 and 0xFFFFFFFF
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):
          - ATIM1
          - ATIM2
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):
          - ATIM1
          - ATIM2
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):
          - ATIM1
          - ATIM2
param   Compare7
          - Compare7 can be a number between 0x0000 and 0xFFFF
return  none
void TIM_SetCmp8(TIM_Module *TIMx, uint16_t Compare8)设置 TIMx 捕获比较 8 寄存器的值。
源码注释
name    TIM_SetCmp8
fun     Sets the TIMx Capture Compare8 Register value
param   TIMx (The input parameters must be the following values):
          - ATIM1
          - ATIM2
param   Compare8
          - Compare8 can be a number between 0x0000 and 0xFFFF
return  none
void TIM_SetCmp9(TIM_Module *TIMx, uint16_t Compare9)设置 TIMx 捕获比较 9 寄存器的值。
源码注释
name    TIM_SetCmp9
fun     Sets the TIMx Capture Compare9 Register value
param   TIMx (The input parameters must be the following values):
          - ATIM1
          - ATIM2
param   Compare9
          - Compare9 can be a number between 0x0000 and 0xFFFF
return  none
void TIM_SetCmp1D(TIM_Module *TIMx, uint16_t compare1D)设置 TIMx_CCDAT1 寄存器中的 CCDDAT1[31:16]。
源码注释
name    TIM_SetCmp1D
fun     Sets the CCDDAT1[31:16] in TIMx_CCDAT1 register
param   TIMx (The input parameters must be the following values):
          - ATIM1
          - ATIM2
param   compare1D
          - compare1D can be a number between 0x0000 and 0xFFFF
return  none
void TIM_SetCmp2D(TIM_Module *TIMx, uint16_t compare2D)设置 TIMx_CCDAT2 寄存器中的 CCDDAT2[31:16]。
源码注释
name    TIM_SetCmp2D
fun     Sets the CCDDAT2[31:16] in TIMx_CCDAT2 register
param   TIMx (The input parameters must be the following values):
          - ATIM1
          - ATIM2
param   compare2D
          - compare2D can be a number between 0x0000 and 0xFFFF
return  none
void TIM_SetCmp3D(TIM_Module *TIMx, uint16_t compare3D)设置 TIMx_CCDAT3 寄存器中的 CCDDAT3[31:16]。
源码注释
name    TIM_SetCmp3D
fun     Sets the CCDDAT3[31:16] in TIMx_CCDAT3 register
param   TIMx (The input parameters must be the following values):
          - ATIM1
          - ATIM2
param   compare3D
          - compare3D can be a number between 0x0000 and 0xFFFF
return  none
void TIM_SetCmp4D(TIM_Module *TIMx, uint16_t compare4D)设置 TIMx_CCDAT4 寄存器中的 CCDDAT4[31:16]。
源码注释
name    TIM_SetCmp4D
fun     Sets the CCDDAT4[31:16] in TIMx_CCDAT4 register
param   TIMx (The input parameters must be the following values):
          - ATIM1
          - ATIM2
param   compare4D
          - compare4D can be a number between 0x0000 and 0xFFFF
return  none
void TIM_AsymmetricEnable(TIM_Module *TIMx, FunctionalState Cmd)在中央对齐模式下使能或关闭非对称模式。
源码注释
name    TIM_AsymmetricEnable.
fun     Enable or disable asymmetric mode in center-aligned.
param   TIMx:
          - ATIM1
          - ATIM2
          - GTIM3
          - GTIM4
param   Cmd
          - ENABLE
          - DISABLE
return  none
void TIM_SelectCenterAlignTrig(TIM_Module *TIMx, uint32_t TIM_CenterAlignTriggerSource)设置中央对齐模式下的触发模式。
源码注释
name    TIM_SelectCenterAlignTrig.
fun     Setting the trigger mode in central alignment mode.
param   TIMx:
          - ATIM1
          - ATIM2
param   TIM_CenterAlignTriggerSource
          - TIM_UP_COUNTING
          - TIM_DOWN_COUNTING
          - TIM_UP_DOWN_COUNTING
return  none
void TIM_OCxRefTriggerADC(TIM_Module *TIMx, uint32_t OCxRef, FunctionalState Cmd)使能或关闭 OCxREF 触发 ADC(x = 4、7、8 或 9)。
源码注释
name    TIM_OCxRefTriggerADC.
fun     Enable or disable OCxREF to trigger ADC(x = 4,7,8 or 9).
param   TIMx:
          - ATIM1
          - ATIM2
param   OCxRef
          - TIM_CTRL2_TRIG4
          - TIM_CTRL2_TRIG7
          - TIM_CTRL2_TRIG8
          - TIM_CTRL2_TRIG9
param   Cmd
          - ENABLE
          - DISABLE
return  none
void TIM_ICInit(TIM_Module *TIMx, const TIM_ICInitType *TIM_ICInitStruct)根据 TIM_ICInitStruct 中指定的参数初始化 TIM 外设。
源码注释
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):
          - ATIM1
          - ATIM2
          - GTIM1
          - GTIM2
          - GTIM3
          - GTIM4
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, const TIM_ICInitType *TIM_ICInitStruct)根据 TIM_ICInitStruct 中指定的参数配置 TIM 外设,用于测量外部 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):
          - ATIM1
          - ATIM2
          - GTIM1
          - GTIM2
          - GTIM3
          - GTIM4
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 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):
          - ATIM1
          - ATIM2
          - GTIM1
          - GTIM2
          - GTIM3
          - GTIM4
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):
          - ATIM1
          - ATIM2
          - GTIM1
          - GTIM2
          - GTIM3
          - GTIM4
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):
          - ATIM1
          - ATIM2
          - GTIM1
          - GTIM2
          - GTIM3
          - GTIM4
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):
          - ATIM1
          - ATIM2
          - GTIM1
          - GTIM2
          - GTIM3
          - GTIM4
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):
          - ATIM1
          - ATIM2
          - GTIM1
          - GTIM2
          - GTIM3
          - GTIM4
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):
          - ATIM1
          - ATIM2
          - GTIM1
          - GTIM2
          - GTIM3
          - GTIM4
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):
          - ATIM1
          - ATIM2
          - GTIM1
          - GTIM2
          - GTIM3
          - GTIM4
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):
          - ATIM1
          - ATIM2
          - GTIM1
          - GTIM2
          - GTIM3
          - GTIM4
param   ICPrescaler
          - TIM_IC_PSC_DIV1
          - TIM_IC_PSC_DIV2
          - TIM_IC_PSC_DIV4
          - TIM_IC_PSC_DIV8
return  none
uint32_t TIM_GetCap1(const 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):
          - ATIM1
          - ATIM2
          - GTIM1
          - GTIM2
          - GTIM3
          - GTIM4
return  Capture Compare 1 Register value.
uint32_t TIM_GetCap2(const 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):
          - ATIM1
          - ATIM2
          - GTIM1
          - GTIM2
          - GTIM3
          - GTIM4
return  Capture Compare 2 Register value.
uint32_t TIM_GetCap3(const 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):
          - ATIM1
          - ATIM2
          - GTIM1
          - GTIM2
          - GTIM3
          - GTIM4
return  Capture Compare 3 Register value.
uint32_t TIM_GetCap4(const 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):
          - ATIM1
          - ATIM2
          - GTIM1
          - GTIM2
          - GTIM3
          - GTIM4
return  Capture Compare 4 Register value.
uint16_t TIM_GetCap5(const 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):
          - ATIM1
          - ATIM2
return  Capture Compare 5 Register value.
uint16_t TIM_GetCap6(const 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):
          - ATIM1
          - ATIM2
return  Capture Compare 6 Register value.
uint16_t TIM_GetCap7(const 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):
          - ATIM1
          - ATIM2
return  Capture Compare 7 Register value.
uint16_t TIM_GetCap8(const TIM_Module *TIMx)获取 TIMx 输入捕获 8 的值。
源码注释
name    TIM_GetCap8
fun     Gets the TIMx Input Capture 8 value.
param   TIMx (The input parameters must be the following values):
          - ATIM1
          - ATIM2
return  Capture Compare 8 Register value.
uint16_t TIM_GetCap9(const TIM_Module *TIMx)获取 TIMx 输入捕获 9 的值。
源码注释
name    TIM_GetCap9
fun     Gets the TIMx Input Capture 9 value.
param   TIMx (The input parameters must be the following values):
          - ATIM1
          - ATIM2
return  Capture Compare 9 Register value.
uint16_t TIM_GetCap1D(const 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):
          - ATIM1
          - ATIM2
return  Capture Compare 1D Register value.
uint16_t TIM_GetCap2D(const 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):
          - ATIM1
          - ATIM2
return  Capture Compare 2D Register value.
uint16_t TIM_GetCap3D(const 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):
          - ATIM1
          - ATIM2
return  Capture Compare 3D Register value.
uint16_t TIM_GetCap4D(const 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):
          - ATIM1
          - ATIM2
return  Capture Compare 4D Register value.
void TIM_IC1FiltConfig(TIM_Module *TIMx, const TIM_FiltInitType *TIM_FiltInitStruct)配置通道 1 的滤波器。
源码注释
name    TIM_IC1FiltConfig
fun     Config the filter of channel1.
param   TIMx:
          - GTIM1
          - GTIM2
          - GTIM3
          - GTIM4
param   TIM_FiltInitStruct:
          - refer to the definition of TIM_FiltInitType
return  none
void TIM_IC2FiltConfig(TIM_Module *TIMx, const TIM_FiltInitType *TIM_FiltInitStruct)配置通道 2 的滤波器。
源码注释
name    TIM_IC2FiltConfig
fun     Config the filter of channel2.
param   TIMx:
          - GTIM1
          - GTIM2
          - GTIM3
          - GTIM4
param   TIM_FiltInitStruct:
          - refer to the definition of TIM_FiltInitType
return  none
void TIM_IC3FiltConfig(TIM_Module *TIMx, const TIM_FiltInitType *TIM_FiltInitStruct)配置通道 3 的滤波器。
源码注释
name    TIM_IC3FiltConfig
fun     Config the filter of channel3.
param   TIMx:
          - GTIM1
          - GTIM2
          - GTIM3
          - GTIM4
param   TIM_FiltInitStruct:
          - refer to the definition of TIM_FiltInitType
return  none
void TIM_IC4FiltConfig(TIM_Module *TIMx, const TIM_FiltInitType *TIM_FiltInitStruct)配置通道 4 的滤波器。
源码注释
name    TIM_IC4FiltConfig
fun     Config the filter of channel4.
param   TIMx:
          - GTIM1
          - GTIM2
          - GTIM3
          - GTIM4
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:
          - GTIM1
          - GTIM2
          - GTIM3
          - GTIM4
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:
          - GTIM1
          - GTIM2
          - GTIM3
          - GTIM4
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:
          - GTIM1
          - GTIM2
          - GTIM3
          - GTIM4
param   Cmd :
          - ENABLE
          - DISABLE
return  none
void TIM_IC4FiltEnable(TIM_Module *TIMx, FunctionalState Cmd)使能或关闭通道 4 的滤波器。
源码注释
name    TIM_IC4FiltEnable
fun     Enable or disable the filter of channel4.
param   TIMx:
          - GTIM1
          - GTIM2
          - GTIM3
          - GTIM4
param   Cmd :
          - ENABLE
          - DISABLE
return  none
FlagStatus TIM_GetFiltStatus(const 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):
          - GTIM1
          - GTIM2
          - GTIM3
          - GTIM4
param   TIM_FiltFlag :
          - TIM_C1FILTO
          - TIM_C2FILTO
          - TIM_C3FILTO
          - TIM_C4FILTO
return  The new state of TIM_FiltFlag (SET or RESET).
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):
          - ATIM1
          - ATIM2
          - GTIM3
          - GTIM4
param   Cmd :
          - ENABLE
          - DISABLE
return  none
void TIM_ConfigBkdt(TIM_Module *TIMx, const TIM_BDTRInitType *TIM_BDTRInitStruct)配置刹车功能、死区时间、锁定级别、OSSI、OSSR 状态与 AOE(自动输出使能)。
源码注释
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):
          - ATIM1
          - ATIM2
          - GTIM3
          - GTIM4
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
          - Bidirection
            * TIM_BREAK_BID_ENABLE
            * TIM_BREAK_BID_DISABLE
          - AutomaticOutput
            * TIM_AUTO_OUTPUT_ENABLE
            * TIM_AUTO_OUTPUT_DISABLE
return  none
void TIM_BreakFiltConfig(TIM_Module *TIMx, const TIM_FiltInitType *TIM_FiltInitStruct)配置刹车输入的滤波器。
源码注释
name    TIM_BreakFiltConfig
fun     Config the filter of break input.
param   TIMx:
          - ATIM1
          - ATIM2
          - GTIM3
          - GTIM4
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:
          - ATIM1
          - ATIM2
          - GTIM3
          - GTIM4
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):
          - ATIM1
          - ATIM2
          - GTIM3
          - GTIM4
param   Source
          - TIM_BREAK_LOCKUP
          - TIM_BREAK_PVD
          - TIM_BREAK_IOM1
          - TIM_BREAK_IOM2
          - TIM_BREAK_IOM3
          - TIM_BREAK_IOM4
          - TIM_BREAK_IOM5
          - TIM_BREAK_IOM6
          - TIM_BREAK_IOM7
          - TIM_BREAK_COMP1
          - TIM_BREAK_COMP2
          - TIM_BREAK_COMP3
param   Polarity
          - TIM_BREAK_SOURCE_POLARITY_INVERT
          - TIM_BREAK_SOURCE_POLARITY_NONINVERT
param   Cmd
          - ENABLE
          - DISABLE
return  none
void TIM_BidirectionDisarm(TIM_Module *TIMx)解除刹车双向保护。
源码注释
name    TIM_BidirectionDisarm
fun     Disarm bidirection of break.
param   TIMx (The input parameters must be the following values):
          - ATIM1
          - ATIM2
          - GTIM3
          - GTIM4
return  none
void TIM_BidirectionRearm(TIM_Module *TIMx)重新使能刹车双向保护。
源码注释
name    TIM_BidirectionRearm
fun     Rearm bidirection of break.
param   TIMx (The input parameters must be the following values):
          - ATIM1
          - ATIM2
          - GTIM3
          - GTIM4
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):
          - ATIM1
          - ATIM2
          - GTIM3
          - GTIM4
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):
          - ATIM1
          - ATIM2
          - GTIM1
          - GTIM2
          - GTIM3
          - GTIM4
param   Cmd
          - ENABLE
          - DISABLE
return  none

使用提示: 实现按 Cmd 置位或清位 TIMx->CTRL2 的 CCDSEL 位,用于把捕获/比较事件选作 DMA 请求源。

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):
          - ATIM1
          - ATIM2
          - GTIM3
          - GTIM4
param   Cmd
          - ENABLE
          - DISABLE
return  none

使用提示: 实现按 Cmd 置位或清位 TIMx->CTRL2 的 CCPCTL 位。

FlagStatus TIM_GetCCENStatus(const 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):
          - ATIM1
          - ATIM2
          - GTIM1
          - GTIM2
          - GTIM3
          - GTIM4
param   TIM_CCEN :
          - TIM_CC1EN
          - TIM_CC1NEN
          - TIM_CC2EN
          - TIM_CC2NEN
          - TIM_CC3EN
          - TIM_CC3NEN
          - TIM_CC4EN
          - TIM_CC4NEN
          - TIM_CC5EN
          - TIM_CC6EN
return  The new state of TIM_FLAG (SET or RESET).

使用提示: 实现读取捕获/比较使能寄存器 TIMx->CCEN 并与 TIM_CCEN 按位与判断,检查的是通道使能位,而不是 STS 中的中断标志。

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):
          - ATIM1
          - ATIM2
          - GTIM3
          - GTIM4
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):
          - GTIM1
          - GTIM2
param   TIM_EncoderMode
          - 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
void TIM_TrgiLoadLvrToCNTEnable(TIM_Module *TIMx, FunctionalState Cmd)TRGI 信号触发将 ENCLVR 值加载到 CNT。
源码注释
name    TIM_TrgiLoadLvrToCNTEnable
fun     The TRGI signal triggers the loading of the ENCLVR value into the CNT.
param   TIMx (The input parameters must be the following values):
          - GTIM2
param   Cmd :
          - ENABLE
          - DISABLE
return  none
uint32_t TIM_GetLVR(const TIM_Module *TIMx)获取 TIMx 的 LVR 值。
源码注释
name    TIM_GetLVR
fun     Get the TIMx LVR value.
param   TIMx (The input parameters must be the following values):
          - GTIM1
          - GTIM2
return  ENCLVR Register value.
void TIM_CH3LoadLvrToCNTEnable(TIM_Module *TIMx, FunctionalState Cmd)CH3 触发将 ENCLVR 值加载到 CNT。
源码注释
name    TIM_CH3LoadLvrToCNTEnable
fun     The CH3 triggers the loading of the ENCLVR value into the CNT.
param   TIMx (The input parameters must be the following values):
          - GTIM1
          - GTIM2
param   Cmd :
          - ENABLE
          - DISABLE
return  none
void TIM_CH3LoadLvrToCNTPolarity(TIM_Module *TIMx, uint32_t Polarity)配置 CH3 的极性以触发将 ENCLVR 值加载到 CNT。
源码注释
name    TIM_CH3LoadLvrToCNTPolarity
fun     Config CH3 Polarity to trigger ENCLVR value loading into the CNT.
param   TIMx (The input parameters must be the following values):
          - GTIM1
          - GTIM2
param   Polarity :
          - TIM_CH3_POLARITY_HIGH
          - TIM_CH3_POLARITY_LOW
          - TIM_CH3_POLARITY_RISING
          - TIM_CH3_POLARITY_FALLING
return  none
uint32_t TIM_GetENCDAT(const TIM_Module *TIMx)获取 TIMx 的 ENCDAT 值。
源码注释
name    TIM_GetENCDAT
fun     Gets the TIMx ENCDAT value.
param   TIMx (The input parameters must be the following values):
          - GTIM1
          - GTIM2
return  ENCDAT Register value.
uint32_t TIM_GetENCDATSign(const 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):
          - GTIM1
          - GTIM2
return  Sign of TIMx ENCDAT value.
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):
          - ATIM1
          - ATIM2
          - GTIM1
          - GTIM2
          - GTIM3
          - GTIM4
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):
          - ATIM1
          - ATIM2
          - ATIM3
          - GTIM1
          - GTIM2
          - GTIM3
          - GTIM4
          - GTIM5
          - GTIM6
          - GTIM7
          - GTIM8
          - GTIM9
          - GTIM10
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_IN_TR4
          - TIM_TRIG_SEL_IN_TR5
          - TIM_TRIG_SEL_TI1F_ED
          - TIM_TRIG_SEL_TI1FP1
          - TIM_TRIG_SEL_TI2FP2
          - TIM_TRIG_SEL_ETRF
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):
          - ATIM1
          - ATIM2
          - GTIM1
          - GTIM2
          - GTIM3
          - GTIM4
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_IN_TR4
          - TIM_TRIG_SEL_IN_TR5
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):
          - ATIM1
          - ATIM2
          - GTIM1
          - GTIM2
          - GTIM3
          - GTIM4
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_ETRInputSource, 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):
          - ATIM1
          - ATIM2
          - GTIM1
          - GTIM2
          - GTIM3
          - GTIM4
param   TIM_ETRInputSource:
          - TIM_CAPETRSEL_0
          - TIM_CAPETRSEL_1
          - TIM_CAPETRSEL_2
          - TIM_CAPETRSEL_3
          - TIM_CAPETRSEL_4
          - TIM_CAPETRSEL_5
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_ETRInputSource, 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):
          - ATIM1
          - ATIM2
          - GTIM1
          - GTIM2
          - GTIM3
          - GTIM4
param   TIM_ETRInputSource:
          - TIM_CAPETRSEL_0
          - TIM_CAPETRSEL_1
          - TIM_CAPETRSEL_2
          - TIM_CAPETRSEL_3
          - TIM_CAPETRSEL_4
          - TIM_CAPETRSEL_5
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_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):
          - ATIM1
          - ATIM2
          - GTIM1
          - GTIM2
          - GTIM3
          - GTIM4
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_SelectETRInputSource(TIM_Module *TIMx, uint32_t TIM_ETRInputSource)配置 tim_etr_in 的来源。
源码注释
name    TIM_SelectETRInputSource
fun     Configures the source of tim_etr_in.
param   TIMx (The input parameters must be the following values):
          - ATIM1
          - ATIM2
          - GTIM1
          - GTIM2
          - GTIM3
          - GTIM4
param   TIM_ETRInputSource:
          - TIM_CAPETRSEL_0
          - TIM_CAPETRSEL_1
          - TIM_CAPETRSEL_2
          - TIM_CAPETRSEL_3
          - TIM_CAPETRSEL_4
          - TIM_CAPETRSEL_5
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):
          - ATIM1
          - ATIM2
          - GTIM1
          - GTIM2
          - GTIM3
          - GTIM4
          - BTIM1
          - BTIM2
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_OC4_7_8_9REF
return  none
void TIM_SelectOutputTrig2(TIM_Module *TIMx, uint32_t TIM_TRGO2Source)选择 TIMx 触发输出模式。
源码注释
name    TIM_SelectOutputTrig2
fun     Selects the TIMx Trigger Output Mode.
param   TIMx (The input parameters must be the following values):
          - ATIM1
param   TIM_TRGO2Source
          - TIM_TRGO2_SRC_RESET
          - TIM_TRGO2_SRC_ENABLE
          - TIM_TRGO2_SRC_UPDATE
          - TIM_TRGO2_SRC_OC1
          - TIM_TRGO2_SRC_OC1REF
          - TIM_TRGO2_SRC_OC2REF
          - TIM_TRGO2_SRC_OC3REF
          - TIM_TRGO2_SRC_OC4REF
          - TIM_TRGO2_SRC_OC5REF
          - TIM_TRGO2_SRC_OC6REF
          - LL_TIM_TRGO2_OC4_RISINGFALLING
          - LL_TIM_TRGO2_OC6_RISINGFALLING
          - LL_TIM_TRGO2_OC4_RISING_OC6_RISING
          - LL_TIM_TRGO2_OC4_RISING_OC6_FALLING
          - LL_TIM_TRGO2_OC5_RISING_OC6_RISING
          - LL_TIM_TRGO2_OC5_RISING_OC6_FALLING
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):
          - ATIM1
          - ATIM2
          - GTIM1
          - GTIM2
          - GTIM3
          - GTIM4
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):
          - ATIM1
          - ATIM2
          - GTIM1
          - GTIM2
          - GTIM3
          - GTIM4
param   TIM_MasterSlaveMode
          - TIM_MASTER_SLAVE_MODE_ENABLE
          - TIM_MASTER_SLAVE_MODE_DISABLE
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):
          - ATIM1
          - ATIM2
          - GTIM1
          - GTIM2
          - GTIM3
          - GTIM4
param   Cmd
          - ENABLE
          - DISABLE
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):
          - ATIM1
          - ATIM2
          - GTIM1
          - GTIM2
          - GTIM3
          - GTIM4
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_CAPCMPDAT8
          - TIM_DMABASE_CAPCMPDAT9
          - TIM_DMABASE_BKFR
          - TIM_DMABASE_C1FILT
          - TIM_DMABASE_C2FILT
          - TIM_DMABASE_C3FILT
          - TIM_DMABASE_C4FILT
          - TIM_DMABASE_FILTO
          - TIM_DMABASE_INSEL
          - 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):
          - ATIM1
          - ATIM2
          - GTIM1
          - GTIM2
          - GTIM3
          - GTIM4
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_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):
          - ATIM1
          - ATIM2
          - GTIM1
          - GTIM2
          - GTIM3
          - GTIM4
          - BTIM1
          - BTIM2
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_CC8
          - TIM_INT_CC9
          - TIM_INT_C3LDCNT
          - TIM_INT_UPDATE
          - TIM_INT_TRIG
          - TIM_INT_BREAK
          - TIM_INT_COM
param   Cmd :
          - ENABLE
          - DISABLE
return  none
note  TIM_INT_C3LDCNT is only for GTIM1 or GTIM2.
FlagStatus TIM_GetFlagStatus(const 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):
          - ATIM1
          - ATIM2
          - GTIM1
          - GTIM2
          - GTIM3
          - GTIM4
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_CC8
          - TIM_FLAG_CC9
          - 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_SYS_BREAK
          - TIM_FLAG_LBKP
          - TIM_FLAG_PBKP
          - TIM_FLAG_COMP
          - TIM_FLAG_IOM
          - TIM_FLAG_CSSF
          - 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):
          - ATIM1
          - ATIM2
          - GTIM1
          - GTIM2
          - GTIM3
          - GTIM4
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_CC8
          - TIM_FLAG_CC9
          - 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_SYS_BREAK
          - TIM_FLAG_LBKP
          - TIM_FLAG_PBKP
          - TIM_FLAG_COMP
          - TIM_FLAG_IOM
          - TIM_FLAG_CSSF
          - TIM_FLAG_C3LDCNT
return  none.

使用提示: 实现向 TIMx->STS 写入 ~TIM_FLAG,清除传入位对应的标志,其余位被写 1。

INTStatus TIM_GetIntStatus(const 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):
          - ATIM1
          - ATIM2
          - GTIM1
          - GTIM2
          - GTIM3
          - GTIM4
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_CC7
          - TIM_INT_CC8
          - TIM_INT_CC9
          - 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):
          - ATIM1
          - ATIM2
          - GTIM1
          - GTIM2
          - GTIM3
          - GTIM4
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_CC8
          - TIM_INT_CC9
          - TIM_INT_C3LDCNT
          - TIM_INT_COM
          - TIM_INT_TRIG
          - TIM_INT_BREAK
return  none.

使用提示: 实现按 TIM_IT 逐分支清除 TIMx->STS 中的对应标志;TIM_INT_UPDATE、TIM_INT_CC1~TIM_INT_CC9、TIM_INT_C3LDCNT、TIM_INT_COM、TIM_INT_TRIG、TIM_INT_BREAK 之外的中断源不执行任何操作。

5.20.3 Demo 示例说明

本节说明 TIM 的 18 个示例,覆盖高级控制定时器 ATIM1 的六步换相、互补输出与死区、刹车、DMA 与 DMA 突发、外部触发与级联同步,以及通用定时器 GTIM 的门控计数、输入捕获与输出比较等用法。

5.20.3.1 6Steps 六步换相输出

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

配置系统时钟与 ATIM1 的六路互补输出引脚→配置时基与三路冻结输出通道→配置刹车、死区并使能 COM 中断与主输出→SysTick 每 100 ms 触发一次 COM 事件→COM 中断按步序改写三对通道的输出使能→在示波器上观察六步换相波形

项目 源码解读
功能 在 ATIM1 的 CH1~CH3 及互补通道 CH1N~CH3N 上输出六步换相波形,每 100 ms 由 SysTick 触发一次 COM 事件切换到下一步,步序为 AB、AC、BC、BA、CA、CB。
源码组成 src/main.c:main、RCC_Configuration、NVIC_Configuration、GPIO_Configuration、SysTick_Configuration、SetSysClockToPLL;
inc/main.h:TIMx、通道引脚与复用宏、中断号宏;
src/n32g41x_it.c:SysTick_Handler 产生 COM 事件、TIMx_IRQHandler 按步序改写通道;
inc/n32g41x_it.h:中断函数声明;
readme.txt:功能、环境与使用说明;
MDK-ARM/、EWARM/:Keil 与 IAR 工程。
关键配置 引脚:CH1~CH3 为 PA8、PA9、PA10,CH1N~CH3N 为 PB13、PB14、PB15,均 GPIO_MODE_AF_PP;
复用:CH1、CH2 随型号(N32G412 用 GPIO_AF2、N32G415 用 GPIO_AF1),CH3、CH1N~CH3N 为 GPIO_AF2、GPIO_AF5;
时基:Prescaler=0、Period=4095、ClkDiv=TIM_CLK_DIV1、RepetCnt=0;
通道:三路 TIM_OCMODE_TIMING,Pulse 2047、1023、511;
刹车:OSSRState、OSSIState 使能,LOCKLevel=TIM_LOCK_LEVEL_OFF;
中断:COM 抢占 1、子 1,SysTick 0;
时钟:HSE+PLL,SYSCLK 与 AHB 72 MHz,ATIM1 144 MHz。
程序与数据路径 main 先调用 SetSysClockToPLL(RCC_PLL_SRC_HSE, 72000000),再依次配置 RCC、NVIC、GPIO、SysTick,接着初始化 ATIM1 时基与三路 TIMING 模式通道,使能捕获比较预装载、COM 中断、计数器与主输出后进入空循环。
SysTick_Handler 每 100 ms 调用 TIM_GenerateEvent(TIMx, TIM_EVT_SRC_COM);
TIMx_IRQHandler 清除 COM 标志后按 step 值改写下三个通道,step 在 1~6 之间循环。
主要 API TIM_InitTimBaseStruct、TIM_InitTimeBase、TIM_InitOcStruct、TIM_InitOc1~TIM_InitOc3、TIM_InitBkdtStruct、TIM_ConfigBkdt、TIM_ConfigInt、TIM_Enable、TIM_EnableCtrlPwmOutputs、TIM_GenerateEvent、TIM_SelectOcMode、TIM_EnableCapCmpCh、TIM_EnableCapCmpChN
验证方法 编译后进入调试模式,用示波器或逻辑分析仪观察 ATIM1 六路输出;
每 100 ms 换相一次,依次为 AB、AC、BC、BA、CA、CB。
使用提示 默认情况下评估板 PA9、PA10 的跳线帽接 NSLINK 虚拟串口,若这两脚不用作串口须拔掉跳线帽。
支持 N32G412x8L7、N32G412xBL7、N32G415x8L7、N32G415xBL7;
开发环境为 KEIL MDK-ARM 5.34 或 IAR EWARM 8.50.1。
核心代码解读与移植

示例把三对互补通道先置于冻结输出,再由 COM 中断按步序改写各通道的输出使能。

数据路径: SysTick_Handler → TIM_GenerateEvent(TIMx, TIM_EVT_SRC_COM) → TIMx_IRQHandler 按 step 分支 → TIM_SelectOcMode、TIM_EnableCapCmpCh、TIM_EnableCapCmpChN 改写 CH1~CH3 的主输出与互补输出 → PA8~PA10、PB13~PB15 输出六步换相波形

1. 配置时基与三路冻结输出通道。 main 把计数器设为向上计数、周期 4095,再以 TIM_OCMODE_TIMING 配置三路通道,三路比较值依次减半。

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);
src/main.csrc/main.c · main
    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_SET;
    TIM_InitOc1(TIMx, &TIM_OCInitStructure);

    TIM_OCInitStructure.Pulse = 1023;
    TIM_InitOc2(TIMx, &TIM_OCInitStructure);

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

移植到其它定时器或通道时,三处 Pulse 与通道号要一并核对,输出使能与互补输出使能位也要对应改写。

2. 配置刹车、死区并打开 COM 中断。 TIM_ConfigBkdt 使能输出空闲状态与自动输出,TIM_EnableCapCmpPreloadControl 打开捕获比较预装载,随后使能 COM 中断、计数器与主输出。

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.AutomaticOutput = TIM_AUTO_OUTPUT_ENABLE;

    TIM_ConfigBkdt(TIMx, &TIM_BDTRInitStructure);

    TIM_EnableCapCmpPreloadControl(TIMx, ENABLE);

    /* interrupt Enable */
    TIM_ConfigInt(TIMx, TIM_INT_COM, ENABLE);

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

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

未调用 TIM_EnableCtrlPwmOutputs 时各通道不会输出波形,换相也就不出现在引脚上。

3. 用 SysTick 按固定节拍产生 COM 事件。 SysTick_Configuration 以 SystemCoreClock / 10 配置 100 ms 中断,处理函数里只产生一次 COM 事件。

src/n32g41x_it.csrc/n32g41x_it.c · SysTick_Handler
void SysTick_Handler(void)
{
    /* Generate TIMx COM event by software */
    TIM_GenerateEvent(TIMx, TIM_EVT_SRC_COM);
}

换相节拍由这处中断周期决定,调整 SysTick_Configuration 中的分频值即可改变每一步的持续时间。

4. COM 中断按步序改写三对通道。 每次进入中断先清 COM 标志,再按 step 值选择一段分支,逐通道切换输出比较模式并开关主输出与互补输出;step 到 6 后回到 1。

src/n32g41x_it.csrc/n32g41x_it.c · TIMx_IRQHandler
    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++;
    }
src/n32g41x_it.csrc/n32g41x_it.c · TIMx_IRQHandler
    else if (step == 6)
    {
        /* Next step: Step 1 Configuration */
        /*  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_2, TIM_CAP_CMP_N_DISABLE);

        /*  Channel3 configuration */
        TIM_SelectOcMode(TIMx, TIM_CH_3, TIM_OCMODE_PWM1);
        TIM_EnableCapCmpCh(TIMx, TIM_CH_3, TIM_CAP_CMP_DISABLE);
        TIM_EnableCapCmpChN(TIMx, TIM_CH_3, TIM_CAP_CMP_N_ENABLE);

        /*  Channel2 configuration */
        TIM_EnableCapCmpCh(TIMx, TIM_CH_2, TIM_CAP_CMP_DISABLE);
        TIM_EnableCapCmpChN(TIMx, TIM_CH_2, TIM_CAP_CMP_N_DISABLE);
        step = 1;
    }

step == 6 分支的注释写的是 Channel1,而第二行 TIM_EnableCapCmpChN 传入的是 TIM_CH_2,此处照代码事实陈述;改写换相表时要按实际通道号同步这些调用。

对应源码: src/main.c、src/n32g41x_it.c、inc/main.h

5.20.3.2 ATIM1_Synchro ATIM1 门控从定时器

工程目录: projects/n32g41x_EVAL/examples/TIM/ATIM1_Synchro/

配置 ATIM1、GTIM3、GTIM4 的时钟与 CH1 输出引脚→把 GTIM3、GTIM4 配为门控从定时器与 PWM1 输出→配置 ATIM1 时基与 CH1 的 PWM2 输出→选择 ATIM1 更新事件为触发输出→使能三个计数器与主输出→观察 ATIM1 门控下 GTIM3、GTIM4 的波形

项目 源码解读
功能 ATIM1 作为主定时器输出 PWM 并以更新事件作为触发输出,GTIM3、GTIM4 以 ATIM1 的更新事件为门控信号在各自周期下计数并输出 PWM。
源码组成 src/main.c:main、RCC_Configuration、GPIO_Configuration;
inc/main.h:TIMx/TIMy/TIMz 与通道引脚、复用宏;
src/n32g41x_it.c、inc/n32g41x_it.h:中断服务函数;
readme.txt:功能、环境与使用说明;
MDK-ARM/、EWARM/:Keil 与 IAR 工程。
关键配置 引脚:ATIM1 CH1 为 PA8、GTIM3 CH1 为 PA6、GTIM4 CH1 为 PB0,均 GPIO_MODE_AF_PP;
复用:ATIM1 随型号(N32G412 用 GPIO_AF2、N32G415 用 GPIO_AF1),GTIM3、GTIM4 为 GPIO_AF12;
时基:GTIM3 Period=2、GTIM4 Period=1、ATIM1 Period=255、RepetCnt=4,均 Prescaler=0;
通道:从机 TIM_OCMODE_PWM1、Pulse=1,ATIM1 TIM_OCMODE_PWM2、Pulse=127;
从模式:GTIM3、GTIM4 为 TIM_SLAVE_MODE_GATED、输入触发 TIM_TRIG_SEL_IN_TR0;
时钟:HSI+PLL,N32G412 80 MHz、N32G415 96 MHz。
程序与数据路径 main 配置 RCC 与 GPIO,用同一结构初始化 GTIM3、GTIM4、ATIM1 时基;
再配置 GTIM3、GTIM4 的 CH1 输出、门控从模式与输入触发,以及 ATIM1 的 CH1 PWM2 输出,并调用 TIM_SelectOutputTrig(ATIM1, TIM_TRGO_SRC_UPDATE);
最后使能 ATIM1、GTIM3、GTIM4 计数器与主输出。
每个 ATIM1 更新事件在 CH1 上打开一个门控窗口,GTIM3、GTIM4 在其中按各自周期计数。
主要 API TIM_InitTimBaseStruct、TIM_InitTimeBase、TIM_InitOcStruct、TIM_InitOc1、TIM_SelectSlaveMode、TIM_SelectInputTrig、TIM_SelectOutputTrig、TIM_Enable、TIM_EnableCtrlPwmOutputs
验证方法 编译后进入调试模式,用示波器或逻辑分析仪观察 ATIM1 CH1、GTIM3 CH1、GTIM4 CH1 的波形;
程序运行后 GTIM3 的周期为 ATIM1 的 15 倍、GTIM4 为 ATIM1 的 10 倍。
使用提示 两个从定时器共用同一个 TIM_TimeBaseStructure,配置 GTIM4 时只改了 Period;
改动时须重新完整赋值。
支持 N32G412x8L7、N32G412xBL7、N32G415x8L7、N32G415xBL7;
开发环境为 KEIL MDK-ARM 5.34 或 IAR EWARM 8.50.1。
核心代码解读与移植

示例先配好两个门控从定时器,再把 ATIM1 的更新事件作为触发源送给它们。

数据路径: ATIM1 更新事件 → TIM_SelectOutputTrig(ATIM1, TIM_TRGO_SRC_UPDATE) → GTIM3、GTIM4 的 TIM_SELECT_IN_TR0 输入 → 门控窗口内按各自 Period 计数 → CH1 输出 PWM

1. GTIM3 用门控从模式跟随 ATIM1。 共享结构体先把 GTIM3 配成周期 2、PWM1 输出,再把从模式设为门控、输入触发选 ITR0。

src/main.csrc/main.c · main
    /* GTIM3 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(GTIM3, &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(GTIM3, &TIM_OCInitStructure);

    /* Slave Mode selection: GTIM2 */
    TIM_SelectSlaveMode(GTIM3, TIM_SLAVE_MODE_GATED);
    TIM_SelectInputTrig(GTIM3, TIM_TRIG_SEL_IN_TR0);

最后两行注释写的是 GTIM2,而代码操作的定时器是 GTIM3,此处照代码事实陈述。

2. GTIM4 用同样的方式配置。 复制 GTIM3 的流程,仅把 Period 改为 1,并把门控从模式与 ITR0 触发施加到 GTIM4。

src/main.csrc/main.c · main
    /* GTIM4 Slave Configuration: PWM1 Mode */
    TIM_TimeBaseStructure.Period      = 1;
    TIM_TimeBaseStructure.Prescaler   = 0;
    TIM_TimeBaseStructure.ClkDiv      = TIM_CLK_DIV1;
    TIM_TimeBaseStructure.CounterMode = TIM_CNT_MODE_UP;

    TIM_InitTimeBase(GTIM4, &TIM_TimeBaseStructure);

    TIM_OCInitStructure.OCMode      = TIM_OCMODE_PWM1;
    TIM_OCInitStructure.OutputState = TIM_OUTPUT_STATE_ENABLE;
    TIM_OCInitStructure.Pulse       = 1;

    TIM_InitOc1(GTIM4, &TIM_OCInitStructure);

    /* Slave Mode selection: GTIM3 */
    TIM_SelectSlaveMode(GTIM4, TIM_SLAVE_MODE_GATED);
    TIM_SelectInputTrig(GTIM4, TIM_TRIG_SEL_IN_TR0);

这里的注释写的是 GTIM3,实际作用对象是 GTIM4;两个从定时器的周期比就由各自的 Period 决定。

3. ATIM1 做主定时器并送出更新事件。 main 把 ATIM1 配成周期 255、重复计数 4 的 PWM2 主定时器,再把更新事件选为触发输出。

src/main.csrc/main.c · main
    /* ATIM1 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(ATIM1, &TIM_TimeBaseStructure);
src/main.csrc/main.c · main
    /* 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_ENABLE;
    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(ATIM1, &TIM_OCInitStructure);

    /* Master Mode selection */
    TIM_SelectOutputTrig(ATIM1, TIM_TRGO_SRC_UPDATE);

门控窗口的长度由 Period 与 RepetCnt 共同决定,换相周期变化时要同步核对这两个值与 CH1 的 Pulse。

4. 使能三个计数器和主输出。 三个定时器都要单独使能,主输出也要逐个打开,缺一则对应通道不出波。

src/main.csrc/main.c · main
    /* ATIM1 counter enable */
    TIM_Enable(ATIM1, ENABLE);

    /* TIM enable counter */
    TIM_Enable(GTIM3, ENABLE);
    TIM_Enable(GTIM4, ENABLE);
src/main.csrc/main.c · main
    /* Main Output Enable */
    TIM_EnableCtrlPwmOutputs(ATIM1, ENABLE);
    TIM_EnableCtrlPwmOutputs(GTIM3, ENABLE);
    TIM_EnableCtrlPwmOutputs(GTIM4, ENABLE);

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

5.20.3.3 Cascade_Synchro 定时器级联同步

工程目录: projects/n32g41x_EVAL/examples/TIM/Cascade_Synchro/

配置 GTIM1~GTIM3 的时钟与三路 CH1 输出引脚→配置三级时基与 PWM1 输出→把 GTIM2 设为 GTIM1 的门控从定时器并转发更新事件→把 GTIM3 设为 GTIM2 的门控从定时器→使能三个计数器与 GTIM3 主输出→观察三级分频的门控波形

项目 源码解读
功能 三级定时器串联:GTIM1 的更新事件门控 GTIM2,GTIM2 的更新事件门控 GTIM3,三个定时器各在 CH1 上输出 PWM,形成逐级分频的门控波形。
源码组成 src/main.c:main、RCC_Configuration、GPIO_Configuration;
inc/main.h:TIMx(GTIM1)、TIMy(GTIM2)、TIMz(GTIM3)与通道引脚、复用宏;
src/n32g41x_it.c、inc/n32g41x_it.h:中断服务函数;
readme.txt:功能、环境与使用说明;
MDK-ARM/、EWARM/:Keil 与 IAR 工程。
关键配置 引脚:GTIM1 CH1 为 PA0(GPIO_AF2)、GTIM2 CH1 为 PB4(GPIO_AF8)、GTIM3 CH1 为 PA6(GPIO_AF12),均 GPIO_MODE_AF_PP;
时基:GTIM1 Period=255、GTIM2、GTIM3 Period=3,均 Prescaler=0;
通道:GTIM1 TIM_OCMODE_PWM1、Pulse=64,GTIM2、GTIM3 TIM_OCMODE_PWM1、Pulse=1;
从模式:GTIM2、GTIM3 为 TIM_SLAVE_MODE_GATED、输入触发 TIM_TRIG_SEL_IN_TR2;
主从:GTIM1、GTIM2 使能、触发输出 TIM_TRGO_SRC_UPDATE;
时钟:HSI+PLL,N32G412 80 MHz、N32G415 96 MHz。
程序与数据路径 main 先配置 RCC 与 GPIO,用共享结构体依次初始化 GTIM1、GTIM2、GTIM3 的时基,再配置 GTIM1 的 CH1 与主模式触发输出;
随后配置 GTIM2、GTIM3 的 CH1,把 GTIM2 设为门控从定时器并转发自身的更新事件,把 GTIM3 设为门控从定时器;
最后使能 GTIM2、GTIM1、GTIM3 计数器并只打开 GTIM3 的主输出。
主要 API TIM_InitTimBaseStruct、TIM_InitTimeBase、TIM_InitOcStruct、TIM_InitOc1、TIM_SelectMasterSlaveMode、TIM_SelectOutputTrig、TIM_SelectSlaveMode、TIM_SelectInputTrig、TIM_Enable、TIM_EnableCtrlPwmOutputs
验证方法 编译后进入调试模式,用示波器或逻辑分析仪观察 PA0、PB4、PA6 的波形;
GTIM2 的频率为 GTIM1 的 1/4,GTIM3 的频率为 GTIM2 的 1/4。
使用提示 三级共用同一个 TIM_TimeBaseStructure,逐级只改 Period;
只有 GTIM3 调用了 TIM_EnableCtrlPwmOutputs。
支持 N32G412x8L7、N32G412xBL7、N32G415x8L7、N32G415xBL7;
开发环境为 KEIL MDK-ARM 5.34 或 IAR EWARM 8.50.1。
核心代码解读与移植

示例把三个定时器首尾相接,用前一级的更新事件门控后一级的计数。

数据路径: GTIM1 更新事件 → GTIM2 门控计数 → GTIM2 更新事件 → GTIM3 门控计数 → 三级 CH1 输出逐级分频的 PWM

1. 三级时基一次配好。 共享结构体先把 GTIM1 设为周期 255,再把 GTIM2、GTIM3 设为周期 3,得到 1/4 的逐级分频。

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      = 255;
    TIM_TimeBaseStructure.ClkDiv      = TIM_CLK_DIV1;
    TIM_InitTimeBase(TIMx, &TIM_TimeBaseStructure);

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

    TIM_TimeBaseStructure.Period = 3;
    TIM_InitTimeBase(TIMz, &TIM_TimeBaseStructure);

分频比就是相邻两级 Period + 1 的比值;改动某级周期时要回头核对整条链路的比值。

2. GTIM1 做主定时器并把更新事件送上触发输出。 main 配置 GTIM1 的 CH1 输出,打开主从模式并选更新事件为 TRGO。

src/main.csrc/main.c · main
    /* Master Configuration in PWM1 Mode */
    TIM_InitOcStruct(&TIM_OCInitStructure);
    TIM_OCInitStructure.OCMode      = TIM_OCMODE_PWM1;
    TIM_OCInitStructure.OutputState = TIM_OUTPUT_STATE_ENABLE;
    TIM_OCInitStructure.Pulse       = 64;
    TIM_OCInitStructure.OCPolarity  = TIM_OC_POLARITY_HIGH;
    TIM_InitOc1(TIMx, &TIM_OCInitStructure);

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

    /* Master Mode selection */
    TIM_SelectOutputTrig(TIMx, TIM_TRGO_SRC_UPDATE);

代码注释写的是 ITR1,而实际使用的输入触发选择在下一段里是 TIM_TRIG_SEL_IN_TR2。

3. 把 GTIM2 串成中间级。 GTIM2 以 ITR2 作为门控输入,同时打开主从模式并把自己的更新事件送到触发输出给 GTIM3 使用。

src/main.csrc/main.c · main
    /* Slave Mode selection: TIMy */
    TIM_SelectSlaveMode(TIMy, TIM_SLAVE_MODE_GATED);
    TIM_SelectInputTrig(TIMy, TIM_TRIG_SEL_IN_TR2);

    /* Select the Master Slave Mode */
    TIM_SelectMasterSlaveMode(TIMy, TIM_MASTER_SLAVE_MODE_ENABLE);

    /* Master Mode selection: TIMy */
    TIM_SelectOutputTrig(TIMy, TIM_TRGO_SRC_UPDATE);

    /* Slave Mode selection: TIMz */
    TIM_SelectSlaveMode(TIMz, TIM_SLAVE_MODE_GATED);
    TIM_SelectInputTrig(TIMz, TIM_TRIG_SEL_IN_TR2);

GTIM3 的输入触发同为 TIM_TRIG_SEL_IN_TR2;改动级联关系时这条选择要与前一级的 TRGO 定义一致。

4. 使能计数器与主输出。 三个计数器都要使能,只有 GTIM3 打开了主输出。

src/main.csrc/main.c · main
    /* TIM enable counter */
    TIM_Enable(TIMy, ENABLE);
    TIM_Enable(TIMx, ENABLE);
    TIM_Enable(TIMz, ENABLE);
    TIM_EnableCtrlPwmOutputs(TIMz, ENABLE);

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

5.20.3.4 ComplementarySignals 四对互补信号与死区

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

配置 ATIM1 时钟与四对互补输出、刹车输入引脚→按时钟频率计算周期与四路占空比→配置四通道 PWM2 模式与互补输出→配置死区、刹车与自动输出使能→使能计数器与主输出→拉高 PA6 观察刹车的波形变化

项目 源码解读
功能 ATIM1 输出四对互补 PWM,四路占空比分别为 50%、25%、12.5%、12.5%,插入死区并启用高电平有效、带自动输出使能的刹车功能,PA6 拉高时 PWM 消失。
源码组成 src/main.c:main、RCC_Configuration、GPIO_Configuration、SetSysClockToPLL;
inc/main.h:TIMx、四对输出与刹车引脚、复用宏;
src/n32g41x_it.c、inc/n32g41x_it.h:中断服务函数;
readme.txt:功能、环境与使用说明;
MDK-ARM/、EWARM/:Keil 与 IAR 工程。
关键配置 引脚:CH1~CH4 为 PA8、PA9、PA10、PA11,CH1N~CH4N 为 PB13、PB14、PB15、PB2,均 GPIO_MODE_AF_PP;
刹车输入:PA6 为 GPIO_MODE_INPUT、GPIO_AF2;
复用:CH1、CH2 随型号(N32G412 用 GPIO_AF2、N32G415 用 GPIO_AF1),CH3、CH4 与互补通道为 GPIO_AF2、GPIO_AF5;
时基:Prescaler=0、Period=(PllFreq/16000)-1;
通道:四路 TIM_OCMODE_PWM2,Pulse 由占空比公式算出;
刹车:DeadTime=10、BreakPolarity=TIM_BREAK_POLARITY_HIGH、AutomaticOutput 使能;
时钟:HSE+PLL,SYSCLK 与 AHB 72 MHz,ATIM1 144 MHz。
程序与数据路径 main 先调用 SetSysClockToPLL(RCC_PLL_SRC_HSE, 72000000),配置 RCC 与 GPIO,用 RCC_GetClocksFreqValue 读出 PllFreq 后算出 TimerPeriod 与四路 ChannelxPulse;
接着初始化时基与四通道 PWM2 输出,配置刹车、死区与自动输出,调用 TIM_BreakInputSourceEnable 使能 IO1 刹车源,最后使能计数器与主输出。
主要 API SetSysClockToPLL、RCC_ConfigAtim1Clk、RCC_GetClocksFreqValue、TIM_InitTimBaseStruct、TIM_InitTimeBase、TIM_InitOcStruct、TIM_InitOc1~TIM_InitOc4、TIM_InitBkdtStruct、TIM_ConfigBkdt、TIM_BreakInputSourceEnable、TIM_Enable、TIM_EnableCtrlPwmOutputs
验证方法 编译后进入调试模式,用示波器或逻辑分析仪观察 ATIM1 的波形;
PA6 为低时可见四对互补 PWM,PA6 拉高后 PWM 消失。
使用提示 默认情况下评估板 PA9、PA10 的跳线帽接 NSLINK 虚拟串口,若这两脚不用作串口须拔掉跳线帽。
支持 N32G412x8L7、N32G412xBL7、N32G415x8L7、N32G415xBL7;
开发环境为 KEIL MDK-ARM 5.34 或 IAR EWARM 8.50.1。
核心代码解读与移植

示例先按 PLL 频率算出 16 kHz 的周期与四路占空比,再配置四对互补通道、死区与刹车。

数据路径: RCC_GetClocksFreqValue 读出 PllFreq → TimerPeriod 与 ChannelxPulse → TIM_InitTimeBase、TIM_InitOc1~TIM_InitOc4 写入 AR 与 CCDATx → TIM_ConfigBkdt 配置死区与刹车 → PA8~PA11、PB13~PB15、PB2 输出四对互补波形

1. 由 PLL 频率反算周期与四路比较值。 用 PllFreq 除以目标频率得到 AR 值,再按占空比公式算出四个比较值。

src/main.csrc/main.c · main
    RCC_GetClocksFreqValue(&RCC_ClocksStructure);
    /* Compute the value to be set in AR register to generate signal frequency at 16KHz */
    TimerPeriod = (RCC_ClocksStructure.PllFreq / 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 4 */
    Channel4Pulse = (uint16_t)(((uint32_t)125 * (TimerPeriod - 1)) / 1000);

改输出频率就改除数 16000;换占空比就改各 ChannelxPulse 的分子,两个 12.5% 通道分别是通道 3 与通道 4。

2. 配四通道 PWM2 与互补输出。 时基与四通道共用同一结构体,逐通道只改 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, 3 and 4 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);

OutputNState 决定互补脚是否输出,改单端输出时把它置为 TIM_OUTPUT_NSTATE_DISABLE。

3. 配置死区与刹车。 TIM_ConfigBkdt 写入死区与刹车极性,TIM_BreakInputSourceEnable 再把 IO1 作为刹车源使能。

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        = 10;
    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_SOURCE_POLARITY_NONINVERT, ENABLE);

死区长度由 DeadTime 决定;BreakPolarity 为高电平有效,与 readme 里 PA6 拉高后 PWM 消失的现象一致。

4. 使能计数器与主输出。 刹车配置只有在主输出使能后才作用于引脚。

src/main.csrc/main.c · main
    /* TIMx counter enable */
    TIM_Enable(TIMx, ENABLE);

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

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

5.20.3.5 DMA 更新事件触发搬运

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

配置 ATIM1 与 DMA 时钟、CH3 互补输出引脚→按系统时钟算出通道周期与三档占空比→配置 CH3 互补 PWM 输出与重复计数器→配置 DMA1_CH5 循环搬运到 CCDAT3→使能更新 DMA 请求与主输出→观察占空比每 6 个周期循环变化

项目 源码解读
功能 ATIM1 的 CH3 与 CH3N 输出互补 PWM,每 6 个更新事件由 DMA1_CH5 从 SRC_Buffer[3] 循环搬运下一个比较值到 CCDAT3,占空比在 50%、37.5%、25% 之间循环变化。
源码组成 src/main.c:main、RCC_Configuration、GPIO_Configuration、DMA_Configuration;
inc/main.h:TIMx、CH3 与 CH3N 引脚、复用宏;
src/n32g41x_it.c、inc/n32g41x_it.h:中断服务函数;
readme.txt:功能、环境与使用说明;
MDK-ARM/、EWARM/:Keil 与 IAR 工程。
关键配置 引脚:CH3 为 PA10(GPIO_AF2)、CH3N 为 PB15(GPIO_AF5),均 GPIO_MODE_AF_PP;
时基:Prescaler=0、Period=(SystemCoreClock/80000)-1、ClkDiv=TIM_CLK_DIV1、RepetCnt=5;
通道:CH3 TIM_OCMODE_PWM2、Pulse 取 SRC_Buffer[0]、极性 TIM_OC_POLARITY_LOW;
DMA1_CH5:外设地址 &TIMx->CCDAT3、存储地址 SRC_Buffer、BufSize=3、方向 DMA_DIR_PERIPH_DST、DMA_MODE_CIRCULAR、DMA_PRIORITY_HIGH,请求源 DMA_REMAP_ATIM1_UP;
时钟:HSI+PLL,N32G412 80 MHz、N32G415 96 MHz。
程序与数据路径 main 依次配置 RCC、GPIO、DMA 后,用 SystemCoreClock 算出 TimerPeriod 与三个占空比写入 SRC_Buffer;
初始化时基(RepetCnt=5)与 CH3 互补 PWM 输出,使能更新 DMA 请求、主输出与计数器,随后进入空循环。
ATIM1 每 6 个更新事件发出一次 DMA 请求,DMA1_CH5 循环写入 CCDAT3,CH3、CH3N 占空比随之改变。
主要 API TIM_InitTimBaseStruct、TIM_InitTimeBase、TIM_InitOcStruct、TIM_InitOc3、TIM_EnableDma、TIM_Enable、TIM_EnableCtrlPwmOutputs、DMA_DeInit、DMA_StructInit、DMA_Init、DMA_RequestRemap、DMA_EnableChannel
验证方法 编译后进入调试模式,用示波器或逻辑分析仪观察 ATIM1 CH3、CH3N 的波形;
每 6 个周期占空比改变一次,依次为 50%、37.5%、25% 并循环。
使用提示 默认情况下评估板 PA9、PA10 的跳线帽接 NSLINK 虚拟串口,若这两脚不用作串口须拔掉跳线帽。
支持 N32G412x8L7、N32G412xBL7、N32G415x8L7、N32G415xBL7;
开发环境为 KEIL MDK-ARM 5.34 或 IAR EWARM 8.50.1。
核心代码解读与移植

示例让 ATIM1 的更新事件触发 DMA,把三个占空比依次写入 CCDAT3。

数据路径: SystemCoreClock → TimerPeriod 与 SRC_Buffer[3] → ATIM1 更新事件(每 6 次)→ TIM_DMA_UPDATE 请求 → DMA1_CH5 循环写入 CCDAT3 → CH3、CH3N 占空比改变

1. 先算出周期与三档占空比。 用 SystemCoreClock 除以 80 kHz 得到 AR 值,再按 50%、37.5%、25% 三个比例算出三个比较值。

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

改输出频率就改除数 80000;改占空比档位就改 SRC_Buffer 的填充比例,数组长度要与 BufSize 一致。

2. 时基的重复计数器决定搬运行情。 RepetCnt=5 使更新 DMA 请求每 6 个计数周期发出一次。

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);

占空比变化间隔由 RepetCnt + 1 决定,改这个值会同时改变变化频率。

3. 配 CH3 互补输出并打开更新 DMA 请求。 四通道共用结构体,这里只配置 CH3,比较值取 SRC_Buffer[0]。

src/main.csrc/main.c · main
    /* Channel 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        = SRC_Buffer[0];
    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_InitOc3(TIMx, &TIM_OCInitStructure);

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

改用其它通道时,要同步改 TIM_InitOc3 的通道号、DMA_Configuration 里的 CCDAT3 外设地址和 DMA_RequestRemap 的请求源。

4. 配 DMA1_CH5 循环搬运到 CCDAT3。 DMA 以外设地址自增关闭、存储器自增开启的方式,把 3 个字的缓冲区循环写入同一寄存器。

src/main.csrc/main.c · DMA_Configuration
    /* DMA Channel5 Config */
    DMA_DeInit(DMA_CH5);
    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_CH5, &DMA_InitStructure);
    DMA_RequestRemap(DMA_REMAP_ATIM1_UP, DMA, DMA_CH5, ENABLE);
    /* DMA Channel5 enable */
    DMA_EnableChannel(DMA_CH5, ENABLE);

5. 使能计数器与主输出。 DMA 请求只在计数器运行时产生,主输出决定 CH3、CH3N 是否出波。

src/main.csrc/main.c · main
    /* Main Output Enable */
    TIM_EnableCtrlPwmOutputs(TIMx, ENABLE);

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

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

5.20.3.6 DMABurst DMA 突发传输

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

配置 ATIM1 与 DMA 时钟、CH1 输出引脚→配置 CH1 PWM 输出与 DADDR 突发长度→配置 DMA1_CH5 非循环搬运 8 个字到 DADDR→使能计数器、主输出与 DMA 通道并等待传输结束→观察按新周期与占空比输出的波形→调试中改写 DmaAgain 触发再次搬运

项目 源码解读
功能 ATIM1 的 CH1 输出 PWM,一个计数周期后由 DMA1_CH5 以突发方式把 8 个字从 SRC_Buffer[8] 写入以 CCDAT1 为基址的连续寄存器,同时改变周期、占空比与重复计数器。
源码组成 src/main.c:main、RCC_Configuration、GPIO_Configuration、DMA_Configuration;
inc/main.h:TIMx、CH1 引脚与复用宏;
src/n32g41x_it.c、inc/n32g41x_it.h:中断服务函数;
readme.txt:功能、环境与使用说明;
MDK-ARM/、EWARM/:Keil 与 IAR 工程。
关键配置 引脚:CH1 为 PA8,GPIO_MODE_AF_PP,复用随型号(N32G412 用 GPIO_AF2、N32G415 用 GPIO_AF1);
时基:Period=0xFFFF;
通道:CH1 TIM_OCMODE_PWM1、OutputState=TIM_OUTPUT_STATE_ENABLE、Pulse=0x8FFF;
突发:TIM_ConfigDma(TIMx, TIM_DMABASE_CAPCMPDAT1, TIM_DMABURST_LENGTH_8TRANSFERS),源数组 SRC_Buffer[8] 首尾 0x8FF/0xFFF;
DMA1_CH5:外设地址 &TIMx->DADDR、BufSize=8、DMA_MODE_NORMAL、DMA_PRIORITY_HIGH;
时钟:HSI+PLL,N32G412 80 MHz、N32G415 96 MHz。
程序与数据路径 main 依次配置 RCC、GPIO、DMA 后,初始化时基与 CH1 PWM 输出,调用 TIM_ConfigDma 设置突发基址与长度并使能更新 DMA 请求,再使能计数器、主输出与 DMA 通道,用 DMA_GetFlagStatus(DMA_FLAG_TC5, DMA) 等待传输结束后清除标志;
主循环里 DmaAgain 置位时重新配置突发与 DMA 并再次等待传输完成。
主要 API TIM_InitTimBaseStruct、TIM_InitTimeBase、TIM_InitOcStruct、TIM_InitOc1、TIM_ConfigDma、TIM_EnableDma、TIM_Enable、TIM_EnableCtrlPwmOutputs、DMA_DeInit、DMA_StructInit、DMA_Init、DMA_RequestRemap、DMA_EnableChannel、DMA_GetFlagStatus、DMA_ClearFlag
验证方法 编译后进入调试模式,用示波器或逻辑分析仪观察 ATIM1 CH1 的波形;
第一个周期后波形变为 DMA 搬运的新周期与新占空比。
在调试状态下把 DmaAgain 置 1,可再次搬运 8 个字到 TIM1 DMA 寄存器。
使用提示 默认情况下评估板 PA9、PA10 的跳线帽接 NSLINK 虚拟串口,若这两脚不用作串口须拔掉跳线帽。
支持 N32G412x8L7、N32G412xBL7、N32G415x8L7、N32G415xBL7;
开发环境为 KEIL MDK-ARM 5.34 或 IAR EWARM 8.50.1。
核心代码解读与移植

示例用 DMA 突发把一整组寄存器参数一次写入,从而在一个周期后同时改变周期与占空比。

数据路径: SRC_Buffer[8] → ATIM1 更新事件 → TIM_DMA_UPDATE 请求 → DMA1_CH5 以 DADDR 为基址突发写入 8 个字 → CCDAT1~CCDAT6、PSC、AR 更新 → CH1 输出新周期与新占空比

1. 配置时基与 CH1 初值。 main 把周期设为 0xFFFF,CH1 以 Pulse=0x8FFF 输出 PWM,等待 DMA 改写。

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

    /* TIM 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_InitOc1(TIMx, &TIM_OCInitStructure);

SRC_Buffer 的第 1 个与第 8 个元素分别写到周期的起止相关寄存器,其余元素保持 0;改参数时按突发写入顺序维护这 8 个字。

2. 打开突发传输与更新 DMA 请求并等待。 TIM_ConfigDma 指定以 CCDAT1 为基址突发 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 Channel5 enable */
    DMA_EnableChannel(DMA_CH5, ENABLE);

    /* Wait until DMA Channel5 end of Transfer */
    while (!DMA_GetFlagStatus(DMA_FLAG_TC5, DMA))
    {
    }

突发基址与长度要和 DMA_Configuration 里的外设地址、BufSize 保持一致,否则写入的寄存器数量会与预期不符。

3. DMA1_CH5 非循环搬运到 DADDR。 DMA 以外设地址不自增、存储器自增的方式,把 8 个字依次写入突发基址寄存器。

src/main.csrc/main.c · DMA_Configuration
    /* DMA Channel5 Config */
    DMA_DeInit(DMA_CH5);
    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_CH5, &DMA_InitStructure);
    DMA_RequestRemap(DMA_REMAP_ATIM1_UP, DMA, DMA_CH5, ENABLE);

这里用的是 DMA_MODE_NORMAL,搬完即停;再次搬运要靠 DmaAgain 重新配置并重启通道。

4. 用 DmaAgain 触发再次搬运。 主循环检测到 DmaAgain 非零时清零标志,重新配置突发与 DMA,使能通道并再次等待传输完成。

src/main.csrc/main.c · main
        if (DmaAgain)
        {
            DmaAgain = 0;

            TIM_ConfigDma(TIMx, TIM_DMABASE_CAPCMPDAT1, TIM_DMABURST_LENGTH_8TRANSFERS);
            TIM_EnableDma(TIMx, TIM_DMA_UPDATE, ENABLE);

            DMA_Configuration();

            /* DMA Channel5 enable */
            DMA_EnableChannel(DMA_CH5, ENABLE);

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

5.20.3.7 ExtTrigger_Synchro 外部触发同步

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

配置 ATIM1、GTIM2、GTIM3 的时钟与输出、输入引脚→配置 ATIM1 CH1 翻转输出与 CH2 输入捕获→把 ATIM1 设为 TI2 门控从模式并把使能事件作为触发输出→把 GTIM2、GTIM3 依次配为门控从定时器→使能三个计数器与主输出→给 PA9 加高低电平观察定时器启停

项目 源码解读
功能 ATIM1 的 CH2 作为外部触发输入,用 TI2 门控 ATIM1 自身,并依次门控 GTIM2 与 GTIM3,三个定时器在 CH1 上输出翻转波形,外部触发为高电平期间计数、低电平期间停止。
源码组成 src/main.c:main、RCC_Configuration、GPIO_Configuration;
inc/main.h:TIMx(ATIM1)、TIMy(GTIM2)、TIMz(GTIM3)与通道引脚、复用宏;
src/n32g41x_it.c、inc/n32g41x_it.h:中断服务函数;
readme.txt:功能、环境与使用说明;
MDK-ARM/、EWARM/:Keil 与 IAR 工程。
关键配置 引脚:ATIM1 CH1 为 PA8、CH2 为 PA9,GTIM2 CH1 为 PB4(GPIO_AF8),GTIM3 CH1 为 PA6(GPIO_AF12);
ATIM1 CH1 为 GPIO_MODE_AF_PP、CH2 为 GPIO_MODE_INPUT;
时基:三级均 Period=73;
通道:三路 TIM_OCMODE_TOGGLE,ATIM1 CH1 Pulse=64;
捕获:CH2 上升沿直接捕获;
触发:ATIM1 用 TIM_TRIG_SEL_TI2FP2 门控,GTIM2、GTIM3 用 TIM_TRIG_SEL_IN_TR0、TIM_TRIG_SEL_IN_TR2,均 TIM_SLAVE_MODE_GATED;
触发输出:ATIM1、GTIM2 为 TIM_TRGO_SRC_ENABLE;
时钟:HSI+PLL,N32G412 80 MHz、N32G415 96 MHz。
程序与数据路径 main 先配置 RCC 与 GPIO,用共享结构体把 ATIM1、GTIM2、GTIM3 的时基都设为周期 73、分频 3;
随后配置 ATIM1 的 CH1 翻转输出、CH2 输入捕获、TI2 门控从模式与使能事件触发输出;
再把 GTIM2 设为 ITR0 门控从定时器并转发使能事件、把 GTIM3 设为 ITR2 门控从定时器;
最后使能 ATIM1、GTIM3 主输出与三个计数器。
主要 API TIM_InitTimBaseStruct、TIM_InitTimeBase、TIM_InitOcStruct、TIM_InitOc1、TIM_InitIcStruct、TIM_ICInit、TIM_SelectInputTrig、TIM_SelectSlaveMode、TIM_SelectMasterSlaveMode、TIM_SelectOutputTrig、TIM_Enable、TIM_EnableCtrlPwmOutputs
验证方法 编译后进入调试模式,用示波器或逻辑分析仪观察 ATIM1 CH1、GTIM2 CH1、GTIM3 CH1 的波形;
ATIM1 CH2 为高电平时定时器计数,为低电平时停止。
使用提示 默认情况下评估板 PA9、PA10 的跳线帽接 NSLINK 虚拟串口,若 PA9 不用作串口输入须拔掉跳线帽。
支持 N32G412x8L7、N32G412xBL7、N32G415x8L7、N32G415xBL7;
开发环境为 KEIL MDK-ARM 5.34 或 IAR EWARM 8.50.1。
核心代码解读与移植

示例把 ATIM1 的 CH2 引脚当作外部触发,用它的电平同时控制三个定时器的计数启停。

数据路径: PA9(TI2)电平 → TIM_SelectInputTrig(TIMx, TIM_TRIG_SEL_TI2FP2) 门控 ATIM1 → ATIM1 使能事件 → GTIM2 门控计数 → GTIM2 使能事件 → GTIM3 门控计数 → 三路 CH1 输出翻转波形

1. 三级时基与翻转输出。 共享结构体把三个定时器都设为周期 73、分频 3,ATIM1 的 CH1 以翻转模式输出。

src/main.csrc/main.c · main
    /* Time base configuration */
    TIM_InitTimBaseStruct(&TIM_TimeBaseStructure);
    TIM_TimeBaseStructure.Period      = 73;
    TIM_TimeBaseStructure.Prescaler   = 3;
    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);

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

    /* 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);

翻转门槛落在比较值上,改 Period 与 Pulse 会同时改变输出频率与占空比,三个定时器共用同一组起点值。

2. 配 CH2 输入捕获并把 TI2 当作门控触发。 CH2 采集上升沿,输入触发选择 TI2FP2,从模式设为门控,并把使能事件送上触发输出。

src/main.csrc/main.c · main
    /* 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);

改触发极性就改 ICPolarity;换外部触发引脚时输入触发选择要一并改到对应的 TI 映射。

3. GTIM2 与 GTIM3 逐级门控。 GTIM2 以 ITR0 门控并转发使能事件,GTIM3 以 ITR2 门控,三级形成外部触发到两级从定时器的链路。

src/main.csrc/main.c · main
    /* Slave Mode selection: TIMy */
    TIM_SelectInputTrig(TIMy, TIM_TRIG_SEL_IN_TR0);
    TIM_SelectSlaveMode(TIMy, TIM_SLAVE_MODE_GATED);

    /* Select the Master Slave Mode */
    TIM_SelectMasterSlaveMode(TIMy, TIM_MASTER_SLAVE_MODE_ENABLE);

    /* Master Mode selection: TIMy */
    TIM_SelectOutputTrig(TIMy, TIM_TRGO_SRC_ENABLE);

    /* Slave Mode selection: TIMz */
    TIM_SelectInputTrig(TIMz, TIM_TRIG_SEL_IN_TR2);
    TIM_SelectSlaveMode(TIMz, TIM_SLAVE_MODE_GATED);

两个从定时器的输入触发要与前一级的 ITR 编号匹配,改动级联关系时这条链路要整体核对。

4. 使能主输出与计数器。 只有 ATIM1 与 GTIM3 开放了主输出,三个计数器都要单独使能。

src/main.csrc/main.c · main
    /* TIMx Main Output Enable */
    TIM_EnableCtrlPwmOutputs(TIMx, ENABLE);
    /* TIMz Main Output Enable */
    TIM_EnableCtrlPwmOutputs(TIMz, ENABLE);
src/main.csrc/main.c · main
    /* TIM enable counter */
    TIM_Enable(TIMx, ENABLE);
    TIM_Enable(TIMy, ENABLE);
    TIM_Enable(TIMz, ENABLE);

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

5.20.3.8 InputCapture 输入捕获测频

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

配置 GTIM1 时钟与 CH2 输入、PA3 输出引脚→配置 CH2 上升沿直接捕获并开 CC2 中断→使能计数器后主循环等待测试脉冲→由 PA3 产生两个上升沿→CC2 中断记录两次捕获值并算出频率→在观察窗口读取测得的频率

项目 源码解读
功能 GTIM1 的 CH2 以上升沿输入捕获方式测量外部信号频率,示例用 PA3 产生测试脉冲并连线到 PA1,在两次捕获值之差的倒数上算出 TIMxFreq。
源码组成 src/main.c:main、RCC_Configuration、GPIO_Configuration、NVIC_Configuration、GenTwoRisingEdge;
inc/main.h:TIMx(GTIM1)、CH2 引脚与复用宏、中断号宏;
src/n32g41x_it.c:TIMx_IRQHandler 完成两次捕获并计算频率;
inc/n32g41x_it.h:中断函数声明;
readme.txt:功能、环境与使用说明;
MDK-ARM/、EWARM/:Keil 与 IAR 工程。
关键配置 GTIM1 CH2 为 PA1(GPIO_AF2),PA3 为 GPIO_MODE_OUTPUT_PP 的测试脉冲输出。
输入捕获 Channel=TIM_CH_2、ICPolarity=TIM_IC_POLARITY_RISING、ICSelection=TIM_IC_SELECTION_DIRECTTI、ICPrescaler=TIM_IC_PSC_DIV1、ICFilter=0x0;
中断由 TIM_ConfigInt(TIMx, TIM_INT_CC2, ENABLE) 打开,TIMx_IRQHandler 优先级抢断 1、子优先级 0。
GenTwoRisingEdge 由变量 gOnePulsEn 触发,用 GPIO_SetBits、GPIO_ResetBits 在 PA3 上产生两个上升沿。
时钟 HSI+PLL:N32G412 为 80 MHz,N32G415 为 96 MHz。
程序与数据路径 main 先配置 RCC、GPIO、NVIC,再初始化 CH2 输入捕获、清零更新与 CC2 标志并打开 CC2 中断,使能计数器后进入主循环反复调用 GenTwoRisingEdge。
调试中把 gOnePulsEn 置 1 后,PA3 产生两个上升沿,TIMx_IRQHandler 在两次 CC2 中断里分别读取 TIM_GetCap2(TIMx) 存到 IC3ReadValue1、IC3ReadValue2,按差值计算 Capture 并得到 TIMxFreq = SystemCoreClock / cap。
主要 API TIM_InitIcStruct、TIM_ICInit、TIM_ClrIntPendingBit、TIM_ConfigInt、TIM_Enable、TIM_GetIntStatus、TIM_GetCap2、GPIO_InitStruct、GPIO_InitPeripheral、GPIO_SetBits、GPIO_ResetBits
验证方法 编译后进入调试模式,连接 PA3 与 PA1,把 TIMxFreq 加入 watch 窗口;
在调试窗口把 gOnePulsEn 置 1,PA3 产生电平翻转,随后读取 TIMxFreq 的频率值。
使用提示 测试时须把 PA3 与 PA1 用跳线连接,否则捕获不到脉冲。
默认情况下评估板 PA9、PA10 的跳线帽接 NSLINK 虚拟串口,若不用作串口须拔掉跳线帽。
支持 N32G412x8L7、N32G412xBL7、N32G415x8L7、N32G415xBL7;
开发环境为 KEIL MDK-ARM 5.34 或 IAR EWARM 8.50.1。
核心代码解读与移植

示例用两次上升沿捕获之间的计数差反推输入频率,测频脉冲由同一芯片的 IO 产生。

数据路径: gOnePulsEn → GenTwoRisingEdge → PA3 产生两个上升沿 → TIM_ICInit 配置的 CH2 捕获 → TIMx_IRQHandler 读取 TIM_GetCap2 → Capture 与 TIMxFreq

1. 配 CH2 上升沿捕获并开 CC2 中断。 设捕获通道、极性、选择与滤波后先清标志再打开 CC2 中断,最后使能计数器。

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);

改捕获极性或预分频会直接改变 TIMxFreq 的计算前提,ICFilter 不为 0 时还会引入固定的滤波延迟。

2. 由 PA3 产生测试脉冲。 GenTwoRisingEdge 在 gOnePulsEn 非零时清零标志,先在 PA3 上拉高再拉低,重复两次形成两个上升沿。

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

两个上升沿之间的软件延时决定了测得的频率量级,改用外部信号源时可去掉这段脉冲产生代码。

3. 中断里记录第一次捕获值。 CC2 中断先清标志,CaptureNumber 为 0 时保存第一个捕获值并置位状态。

src/n32g41x_it.csrc/n32g41x_it.c · TIMx_IRQHandler
    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;
        }

4. 第二次捕获后算出频率。 第二次进中断时读取 IC3ReadValue2,按两个捕获值的大小关系求差值,再以系统时钟除以差值得到频率。

src/n32g41x_it.csrc/n32g41x_it.c · TIMx_IRQHandler
            /* Capture computation */
            if (val2 > val1)
            {
                cap = (val2 - val1);
            }
            else
            {
                cap = ((0xFFFF - val1) + val2);
            }
            Capture = cap;
            /* Frequency computation */
            TIMxFreq      = SystemCoreClock / cap;
            CaptureNumber = 0;

TIMxFreq 取的是系统时钟与计数差的商,换主频或改 Prescaler 后这个结果要重新标定。

对应源码: src/main.c、src/n32g41x_it.c、inc/main.h

5.20.3.9 OCActive 输出比较置有效电平

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

配置 GTIM1 时钟与四路 CH1~CH4 输出引脚→按系统时钟算出 2 kHz 的计数时钟分频→配置四通道输出比较 Active 模式与比较值→关闭各路预装载并打开 AR 预装载→使能计数器→观察四路依次输出有效电平

项目 源码解读
功能 GTIM1 的 CH1~CH4 配置为输出比较 Active 模式,计数到达各自 CCDATx 后对应通道输出有效电平,四路比较值依次为 1000、500、250、125,输出依次跳变。
源码组成 src/main.c:main、RCC_Configuration、GPIO_Configuration;
inc/main.h:TIMx(GTIM1)、CH1~CH4 引脚与复用宏;
src/n32g41x_it.c、inc/n32g41x_it.h:中断服务函数;
readme.txt:功能、环境与使用说明;
MDK-ARM/、EWARM/:Keil 与 IAR 工程。
关键配置 引脚:CH1~CH4 为 PA0、PA1、PA2、PA3,均 GPIO_MODE_AF_PP、GPIO_AF2;
时基:Period=65535、Prescaler=(SystemCoreClock/2000)-1、ClkDiv=TIM_CLK_DIV1、CounterMode=TIM_CNT_MODE_UP;
通道:四路 OCMode=TIM_OCMODE_ACTIVE、OutputState=TIM_OUTPUT_STATE_ENABLE、极性 TIM_OC_POLARITY_HIGH,Pulse 依次为 1000、500、250、125;
预装载:四通道关闭(TIM_OC_PRE_LOAD_DISABLE)、AR 预装载使能;
时钟:HSI+PLL,N32G412 80 MHz、N32G415 96 MHz。
程序与数据路径 main 配置 RCC 与 GPIO 后算出 PrescalerValue,初始化时基并配置 CH1 的输出比较 Active 模式与预装载,随后对 CH2、CH3、CH4 重复同样的配置并分别写入各自 CCRx_Val,再打开 AR 预装载,最后使能计数器进入空循环。
计数从 0 递增到 125、250、500、1000 时,CH4、CH3、CH2、CH1 依次输出有效电平。
主要 API TIM_InitTimBaseStruct、TIM_InitTimeBase、TIM_InitOcStruct、TIM_InitOc1、TIM_InitOc2、TIM_InitOc3、TIM_InitOc4、TIM_ConfigOc1Preload、TIM_ConfigOc2Preload、TIM_ConfigOc3Preload、TIM_ConfigOc4Preload、TIM_ConfigArPreload、TIM_Enable
验证方法 编译后进入调试模式,用示波器或逻辑分析仪观察 GTIM1 CH1~CH4 的波形;
计数到达 CC1、CC2、CC3、CC4 后对应通道输出变为有效电平。
使用提示 默认情况下评估板 PA9、PA10 的跳线帽接 NSLINK 虚拟串口,若不用作串口须拔掉跳线帽。
支持 N32G412x8L7、N32G412xBL7、N32G415x8L7、N32G415xBL7;
开发环境为 KEIL MDK-ARM 5.34 或 IAR EWARM 8.50.1。
核心代码解读与移植

示例把计数时钟降到 2 kHz,用四路输出比较在计数到达不同阈值时依次输出有效电平。

数据路径: SystemCoreClock → PrescalerValue 与 TIM_InitTimeBase → TIM_InitOc1~TIM_InitOc4 写入 CCR1_Val~CCR4_Val → 计数到达各阈值 → CH1~CH4 输出有效电平

1. 算出 2 kHz 计数时钟并配时基。 用系统时钟除以 2000 得到分频值,计数器从 0 计到 65535。

src/main.csrc/main.c · main
    /* Compute the prescaler value */
    PrescalerValue = (uint16_t)(SystemCoreClock / 2000) - 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);

改 2000 这个除数就改变计数节拍,四路阈值对应的实际时间随之等比例变化。

2. 配 CH1 的输出比较 Active 模式并关闭预装载。 CH1 的比较值为 CCR1_Val,输出极性为高,预载关闭使比较值立即生效。

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. 其余三路沿用同一结构体。 CH2、CH3、CH4 只改 Pulse 并各自关闭预装载,最后打开 AR 预装载。

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);

四个 CCRx_Val 决定四路的先后顺序,改其中任一个都会改变对应通道的跳变时刻。

4. 使能计数器。 输出比较在计数器运行时才产生,使能后进入空循环。

src/main.csrc/main.c · main
    /* TIMx enable counter */
    TIM_Enable(TIMx, ENABLE);

    while (1)
    {
    }

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

5.20.3.10 OCInactive 输出比较无效

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

使能 GPIO 与 GTIM2 时钟→配置 PA1~PA4 为推挽输出并拉高→把 GTIM2 计数时钟分频到 2 kHz、CH1~CH4 设为输出比较无效模式→打开 CC1~CC4 中断并启动计数器→比较匹配时中断里把对应引脚拉低

项目 源码解读
功能 用 GTIM2 的 CH1~CH4 做输出比较,四个通道各自的比较值到达后进入比较中断,中断里把对应的 PA1~PA4 拉低;
配置阶段先把四个引脚置高。
源码组成 src/main.c:main 与 RCC_Configuration、GPIO_Configuration、NVIC_Configuration;
inc/main.h:包含 GPIO、TIM、RCC 头文件并声明上述函数;
src/n32g41x_it.c、inc/n32g41x_it.h:中断服务函数 GTIM2_IRQHandler;
readme.txt:功能、环境与使用说明;
MDK-ARM/、EWARM/:Keil 与 IAR 工程。
关键配置 计数时钟取 SystemCoreClock / 2000 的分频,即计数器时钟 2 kHz;
Period 为 65535、ClkDiv 为 TIM_CLK_DIV1、计数模式 TIM_CNT_MODE_UP。
四通道 OCMode 均为 TIM_OCMODE_INACTIVE、输出使能、OCPolarity 为 TIM_OC_POLARITY_HIGH,Pulse 依次为 CH1 1000、CH2 500、CH3 250、CH4 125;
各通道预装载关闭,TIM_ConfigArPreload 使能。
程序与数据路径 main 依次完成时钟、NVIC、GPIO 配置,用 TIM_InitTimBaseStruct 与 TIM_InitTimeBase 建立时基,再用 TIM_InitOc1~TIM_InitOc4 把四通道设为无效比较模式并打开 CC1~CC4 中断,GPIO_SetBits 把 PA1~PA4 置高后 TIM_Enable 启动计数;
每次比较匹配进入 GTIM2_IRQHandler,按通道清零标志并用 GPIO_ResetBits 拉低对应引脚。
主要 API TIM_InitTimBaseStruct、TIM_InitTimeBase、TIM_InitOcStruct、TIM_InitOc1~TIM_InitOc4、TIM_ConfigOc1Preload、TIM_ConfigArPreload、TIM_ConfigInt、TIM_Enable、TIM_GetIntStatus、TIM_ClrIntPendingBit、GPIO_InitPeripheral、GPIO_SetBits、GPIO_ResetBits
验证方法 编译后进入调试模式,用示波器或逻辑分析仪观察 PA1~PA4:四个引脚初始为高,随各自比较值到达被拉低;
无效模式本身不改变输出电平,拉低动作由中断完成。
使用提示 开发板 PA9、PA10 默认经跳线帽接到 NSLINK 虚拟串口,不用作串口时须拔掉跳线帽。
支持 N32G412x8L7、N32G412xBL7、N32G415x8L7、N32G415xBL7;
开发环境为 KEIL MDK-ARM 5.34 或 IAR EWARM 8.50.1。
核心代码解读与移植

示例把 GTIM2 的四个通道都设成输出比较无效模式,比较值到达后不改变硬件输出,而是在中断里由软件把对应引脚拉低。

数据路径: RCC_Configuration 打开 GPIO 与 GTIM2 时钟 → GPIO_Configuration 把 PA1~PA4 配成推挽输出 → TIM_InitTimeBase 写入 2 kHz 计数时钟 → TIM_InitOc1~TIM_InitOc4 设四通道无效比较 → GTIM2_IRQHandler 在比较中断里 GPIO_ResetBits 拉低 PA1~PA4

1. 时钟与引脚准备。 先打开 GPIO 与 GTIM2 的时钟,再把 PA1~PA4 初始化成推挽输出,为后面的软件拉低做好准备。

src/main.csrc/main.c · RCC_Configuration
    /* Enable GPIO clock */
    RCC_EnableAHBPeriphClk(RCC_AHB_PERIPH_GPIO, ENABLE);

    /* Enable GTIM2 clock */
    RCC_EnableAPB1PeriphClk(RCC_APB1_PERIPH_GTIM2, ENABLE);
src/main.csrc/main.c · GPIO_Configuration
    /* PA1, PA2, PA3, PA4 as GPIO output */
    GPIO_InitStructure.Pin       = GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3 | GPIO_PIN_4;
    GPIO_InitStructure.GPIO_Mode = GPIO_MODE_OUTPUT_PP;
    GPIO_InitPeripheral(GPIOA, &GPIO_InitStructure);

移植到别的引脚时,同步修改这里的引脚组合与端口,并让中断里对应的 GPIO_ResetBits 指到同一组引脚。

2. 计算分频并建立时基。 计数时钟按 SystemCoreClock / 2000 分频得到 2 kHz,自动重装值取 65535,四个通道的比较值都以该时钟为分辨率。

src/main.csrc/main.c · main
    /* Compute the prescaler value */
    PrescalerValue = (uint16_t)(SystemCoreClock / 2000) - 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(GTIM2, &TIM_TimeBaseStructure);

改计数分辨率时改这里的除数,改最大延迟时改 Period,两者共同决定四个通道延迟的上限。

3. 把通道设成无效比较模式。 四路共用同一结构体,只改 Pulse;以 CH1 为例,OCMode 取 TIM_OCMODE_INACTIVE,预装载关闭,比较值到达后硬件不改变输出。

src/main.csrc/main.c · main
    /* Output Compare Inactive 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(GTIM2, &TIM_OCInitStructure);

    TIM_ConfigOc1Preload(GTIM2, TIM_OC_PRE_LOAD_DISABLE);

改某一路的延迟时改对应 CCRx_Val;无效模式下输出引脚的电平不由硬件改变,真正拉低由中断完成。

4. 先置高再启动,在中断里拉低。 启动前把 PA1~PA4 置高并打开四个比较中断,计数开始后每次匹配进入 GTIM2_IRQHandler,清标志后拉低对应引脚。

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

    /* Set output pins */
    GPIO_SetBits(GPIOA, GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3 | GPIO_PIN_4);

    /* GTIM2 enable counter */
    TIM_Enable(GTIM2, ENABLE);
src/n32g41x_it.csrc/n32g41x_it.c · GTIM2_IRQHandler
    if (TIM_GetIntStatus(GTIM2, TIM_INT_CC1) != RESET)
    {
        /* Clear GTIM2 Capture Compare1 interrupt pending bit */
        TIM_ClrIntPendingBit(GTIM2, TIM_INT_CC1);

        GPIO_ResetBits(GPIOA, GPIO_PIN_1);
    }

移植时同步核对中断向量 GTIM2_IRQn 与中断函数 GTIM2_IRQHandler 的名字,换用其它定时器要一起改。

对应源码: src/main.c、src/n32g41x_it.c

5.20.3.11 OCToggle 输出比较翻转

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

使能 GPIO 与 GTIM1 时钟→配置 PA0~PA3 为 CH1~CH4 复用输出→建立 8 MHz 计数时基并把四通道设为输出比较翻转模式→清除比较与更新标志、打开 CC1~CC4 中断并启动计数器→比较匹配后引脚翻转,中断里累加下一次比较值

项目 源码解读
功能 GTIM1 的 CH1~CH4 工作在输出比较翻转模式,比较值到达时对应引脚电平翻转,同时中断里把比较值累加一个固定量,形成占空比 50% 的方波。
源码组成 src/main.c:main 与 RCC_Configuration、GPIO_Configuration、NVIC_Configuration;
inc/main.h:TIMx、各通道引脚与复用宏、中断映射和函数声明;
src/n32g41x_it.c、inc/n32g41x_it.h:中断服务函数 TIMx_IRQHandler 与比较值累加;
readme.txt:功能、环境与使用说明;
MDK-ARM/、EWARM/:Keil 与 IAR 工程。
关键配置 TIMx 为 GTIM1、时钟 RCC_APB1_PERIPH_GTIM1;
CH1 PA0、CH2 PA1、CH3 PA2、CH4 PA3,均 GPIO_MODE_AF_PP、GPIO_AF2。
计数时钟取 SystemCoreClock / 8000000 的分频即 8 MHz,Period 为 0xFFFFFFFF;
四通道 OCMode 为 TIM_OCMODE_TOGGLE、输出使能、OCPolarity 为 TIM_OC_POLARITY_LOW,Pulse 依次为 32768、16384、8192、4096,预装载均关闭。
程序与数据路径 main 完成时钟、GPIO、NVIC 配置后用 TIM_InitTimeBase 建立 8 MHz 时基,TIM_InitOc1~TIM_InitOc4 把四通道设为翻转模式;
随后 TIM_ClrIntPendingBit 清各比较与更新标志,TIM_ConfigInt 打开 CC1~CC4 中断,TIM_Enable 启动;
每次比较匹配进入 TIMx_IRQHandler,用 TIM_GetCapx 读回当前比较值再以 TIM_SetCmpx 写入其与 CCRx_Val 之和。
主要 API TIM_InitTimBaseStruct、TIM_InitTimeBase、TIM_InitOcStruct、TIM_InitOc1~TIM_InitOc4、TIM_ConfigOc1Preload、TIM_ConfigOc4Preload、TIM_ClrIntPendingBit、TIM_ConfigInt、TIM_Enable、TIM_GetIntStatus、TIM_GetCap1、TIM_SetCmp1、GPIO_InitPeripheral
验证方法 编译后进入调试模式,用示波器或逻辑分析仪观察 PA0~PA3:每路输出周期由 CCRx_Val 与 8 MHz 计数时钟决定,占空比固定为 50%。
使用提示 开发板 PA9、PA10 默认接 NSLINK 虚拟串口,不用串口时须拔掉跳线帽。
支持 N32G412x8L7、N32G412xBL7、N32G415x8L7、N32G415xBL7;
开发环境为 KEIL MDK-ARM 5.34 或 IAR EWARM 8.50.1。
核心代码解读与移植

示例用 TIMx 宏指向 GTIM1,四路通道工作在输出比较翻转模式,中断负责把下一次比较值往前推一个固定量。

数据路径: RCC_Configuration 打开 GPIO 与 GTIM1 时钟 → GPIO_Configuration 把 PA0~PA3 配成 CH1~CH4 复用输出 → TIM_InitTimeBase 建立 8 MHz 时基 → TIM_InitOc1~TIM_InitOc4 设为翻转模式 → TIMx_IRQHandler 累加比较值并触发下一次翻转

1. 用宏把定时器与四路引脚参数集中起来。 inc/main.h 把 TIMx 定义为 GTIM1,并为四个通道各自的引脚、端口与复用号给出宏,后续配置全部经这组宏完成。

inc/main.hinc/main.h
#define TIMx                   GTIM1
#define TIMx_CLK               RCC_APB1_PERIPH_GTIM1

/* GTIM1 CH1: PA0 */
#define TIMx_CH1_PIN           GPIO_PIN_0
#define TIMx_CH1_GPIO          GPIOA
#define TIMx_CH1_AF            GPIO_AF2

移植到别的定时器时要同时改 TIMx、TIMx_CLK、四个通道的引脚与复用宏,以及 TIMx_IRQn、TIMx_IRQHandler 的映射。

2. 建立 8 MHz 计数时基。 计数时钟按 SystemCoreClock / 8000000 分频,自动重装值取满量程,让比较值不受周期限制。

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      = 0xFFFFFFFF;
    TIM_TimeBaseStructure.Prescaler   = PrescalerValue;
    TIM_TimeBaseStructure.ClkDiv      = TIM_CLK_DIV1;
    TIM_TimeBaseStructure.CounterMode = TIM_CNT_MODE_UP;

    TIM_InitTimeBase(TIMx, &TIM_TimeBaseStructure);

比较值以 8 MHz 为分辨率,改翻转频率时改这里的除数或各通道的 CCRx_Val。

3. 把通道设成翻转模式。 四路共用结构体,OCMode 取 TIM_OCMODE_TOGGLE;以 CH1 为例写入初值与极性后使能,并关闭预装载。

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);

预装载关闭后,中断里写比较值立即生效;若改开预装载,下一比较值要到更新事件才装载。

4. 清标志、开中断并启动。 使能中断前先把更新与四个比较标志清掉,再打开 CC1~CC4 中断并启动计数。

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 enable counter */
    TIM_Enable(TIMx, ENABLE);

5. 中断里累加下一次比较值。 每次比较匹配清标志后,读回当前比较值再加 CCRx_Val 写回,形成等间隔翻转。

src/n32g41x_it.csrc/n32g41x_it.c · TIMx_IRQHandler
    /* 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);
    }

改输出频率时改对应 CCRx_Val;capture 是文件作用域变量,四路分支共用。

对应源码: src/main.c、inc/main.h、src/n32g41x_it.c

5.20.3.12 OnePulse 单脉冲输出

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

使能 GPIO 与 GTIM1 时钟→配置 PA0 为 CH1 输出、PA1 为 CH2 输入、PA3 为普通输出→建立时基并把 CH1 设为 PWM2 输出、CH2 设为上升沿捕获→选择单脉冲模式与 TI2FP2 触发,从模式设为触发模式→主循环在软件触发时从 PA3 送出一个上升沿

项目 源码解读
功能 GTIM1 的 CH2 配成上升沿输入捕获并作为触发源,单脉冲模式检测到该上升沿后经可控延迟在 CH1 上输出一个宽度由 Period - Pulse 决定的单脉冲;
主循环在 gSendTrigEn 置位时从 PA3 送出一个触发沿。
源码组成 src/main.c:main、RCC_Configuration、GPIO_Configuration、SendOneTrig;
inc/main.h:TIMx、CH1 与 CH2 的引脚复用宏、SendOneTrig 声明;
src/n32g41x_it.c、inc/n32g41x_it.h:中断服务函数;
readme.txt:功能、环境与使用说明;
MDK-ARM/、EWARM/:Keil 与 IAR 工程。
关键配置 TIMx 为 GTIM1;
CH1 为 PA0、CH2 为 PA1,均 GPIO_MODE_AF_PP、GPIO_AF2,PA3 为 GPIO_MODE_OUTPUT_PP。
计数时钟取 SystemCoreClock / 8000000 分频即 8 MHz,Period 为 65535;
CH1 为 TIM_OCMODE_PWM2、Pulse 为 16383、极性 TIM_OC_POLARITY_HIGH;
CH2 捕获极性 TIM_IC_POLARITY_RISING、选择 TIM_IC_SELECTION_DIRECTTI、预分频 TIM_IC_PSC_DIV1、滤波 0。
程序与数据路径 main 完成时钟与 GPIO 配置后建立时基,把 CH1 设为 PWM2 输出,再用 TIM_ICInit 配置 CH2 上升沿直接捕获,接着 TIM_SelectOnePulseMode 选单次模式、TIM_SelectInputTrig 选 TI2FP2、TIM_SelectSlaveMode 选触发模式;
主循环反复调用 SendOneTrig,在 gSendTrigEn 为真时把它清零,并拉高再拉低 PA3 形成一个触发脉冲。
主要 API TIM_InitTimBaseStruct、TIM_InitTimeBase、TIM_InitOcStruct、TIM_InitOc1、TIM_InitIcStruct、TIM_ICInit、TIM_SelectOnePulseMode、TIM_SelectInputTrig、TIM_SelectSlaveMode、GPIO_InitStruct、GPIO_InitPeripheral、GPIO_SetBits、GPIO_ResetBits
验证方法 把 PA3 与 PA1 相连,用示波器或逻辑分析仪观察 CH1(PA0):在调试窗口把 gSendTrigEn 置 1 后,程序从 PA3 送出一个上升沿,CH1 输出一个单脉冲;
改变 Pulse 可看到脉冲宽度变化。
使用提示 需要把 PA3 与 PA1 用导线相连才能自触发;
开发板 PA9、PA10 默认接 NSLINK 虚拟串口,不用串口时须拔掉跳线帽。
支持 N32G412x8L7、N32G412xBL7、N32G415x8L7、N32G415xBL7;
开发环境为 KEIL MDK-ARM 5.34 或 IAR EWARM 8.50.1。
核心代码解读与移植

示例用 PA3 软件产生触发沿,经 PA1(CH2)进入单脉冲模式,在 PA0(CH1)上输出一个宽度可控的脉冲。

数据路径: SendOneTrig 翻转 PA3 → PA1 上的上升沿被 CH2 捕获 → TIM_SelectInputTrig 选的 TI2FP2 触发计数器 → CH1 按 PWM2 模式输出单脉冲 → 示波器在 PA0 观察脉宽

1. 由外向内配好三只引脚。 CH1、CH2 配成复用推挽并写入各自的复用号,PA3 单独配成普通推挽输出,作为软件触发源。

src/main.csrc/main.c · GPIO_Configuration
    /* GTIM1 CH1: PA0 */
    GPIO_InitStructure.Pin            = TIMx_CH1_PIN;
    GPIO_InitStructure.GPIO_Mode      = GPIO_MODE_AF_PP;
    GPIO_InitStructure.GPIO_Alternate = TIMx_CH1_AF;
    GPIO_InitPeripheral(TIMx_CH1_GPIO, &GPIO_InitStructure);

    /* GTIM1 CH2: PA1 */
    GPIO_InitStructure.Pin            = TIMx_CH2_PIN;
    GPIO_InitStructure.GPIO_Alternate = TIMx_CH2_AF;
    GPIO_InitPeripheral(TIMx_CH2_GPIO, &GPIO_InitStructure);

    /* PA3: GPIO output for trigger */
    GPIO_InitStructure.Pin       = GPIO_PIN_3;
    GPIO_InitStructure.GPIO_Mode = GPIO_MODE_OUTPUT_PP;
    GPIO_InitPeripheral(GPIOA, &GPIO_InitStructure);

移植时引脚与复用号来自 inc/main.h 的 TIMx_CH1_*、TIMx_CH2_* 与 PA3 三个宏,换板要一起核对。

2. 建立 8 MHz 时基。 计数时钟按 SystemCoreClock / 8000000 分频,自动重装值取 65535,脉宽由 Period 与 Pulse 之差决定。

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);

改脉冲延迟与宽度时,分别对应改 Pulse 与 Period,两者都按 8 MHz 计数。

3. CH1 用 PWM2 模式做输出。 输出通道取 TIM_OCMODE_PWM2,Pulse 为 16383,极性为高,单脉冲模式下这段决定脉冲的延迟与宽度。

src/main.csrc/main.c · main
    /* 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);

4. CH2 上升沿捕获并选为触发源。 输入结构体把 CH2 配成上升沿直接捕获,随后选出 TI2FP2 作触发输入,并把从模式设为触发模式、开启单次单脉冲。

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);

换触发来源时要同步改 TIM_SelectInputTrig 的触发选择与对应的捕获通道,二者必须指到同一个 TIxFP;

5. 软件触发沿由 PA3 送出。 SendOneTrig 在使能标志置位时清零标志,拉高 PA3 并短暂保持再拉低,形成一个可被 CH2 捕获的上升沿。

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

触发脉宽由这段延时循环决定,改它时要保证脉冲宽度足以被 CH2 的捕获滤波与边沿检测识别。

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

5.20.3.13 Parallel_Synchro 主从门控同步

工程目录: projects/n32g41x_EVAL/examples/TIM/Parallel_Synchro/

使能 GPIO 与 GTIM1、GTIM2、GTIM3 时钟→配置 PA0、PB4、PA6 为三个定时器的 CH1 复用输出→建立 GTIM1、GTIM2、GTIM3 的时基并配置主从 PWM1 输出→把 GTIM1 设为主定时器并把更新事件选作触发输出→GTIM2、GTIM3 设为门控从模式并各自选择触发输入

项目 源码解读
功能 GTIM1 作为主定时器,以更新事件作为触发输出,通过门控模式控制 GTIM2 与 GTIM3 的计数起停,使两路从定时器输出与主定时器周期成整数倍关系的 PWM 波形。
源码组成 src/main.c:main、RCC_Configuration、GPIO_Configuration;
inc/main.h:TIMx、TIMy、TIMz 及其时钟、通道引脚与复用宏;
readme.txt:功能、环境与使用说明;
MDK-ARM/、EWARM/:Keil 与 IAR 工程。
关键配置 主 TIMx 为 GTIM1、CH1 为 PA0、GPIO_AF2;
从 TIMy 为 GTIM2、CH1 为 PB4、GPIO_AF8;
从 TIMz 为 GTIM3、CH1 为 PA6、GPIO_AF12。
三路 Prescaler 均为 0、ClkDiv 为 TIM_CLK_DIV1、计数向上;
Period 依次为主 255、从 9、从 4。
主通道 Pulse 为 64,从通道 Pulse 为 3,均为 TIM_OCMODE_PWM1、极性 TIM_OC_POLARITY_HIGH。
程序与数据路径 main 配置时钟与 GPIO,再用 TIM_InitTimeBase 建立 GTIM1、GTIM2、GTIM3 时基;
TIM_InitOc1 把主通道设为 PWM1,TIM_SelectMasterSlaveMode 使能主从模式,TIM_SelectOutputTrig 选更新事件为触发输出;
对 TIMy、TIMz 用 TIM_InitOc1 设 PWM1,并用 TIM_SelectSlaveMode、TIM_SelectInputTrig 选门控模式与输入触发,随后使能 PWM 输出并启动三个计数器。
主要 API TIM_InitTimBaseStruct、TIM_InitTimeBase、TIM_InitOcStruct、TIM_InitOc1、TIM_SelectMasterSlaveMode、TIM_SelectOutputTrig、TIM_SelectSlaveMode、TIM_SelectInputTrig、TIM_EnableCtrlPwmOutputs、TIM_Enable、GPIO_InitStruct、GPIO_InitPeripheral
验证方法 用示波器或逻辑分析仪同时观察 GTIM1 CH1(PA0)、GTIM2 CH1(PB4)、GTIM3 CH1(PA6):GTIM2 的周期为主定时器的 10 倍,GTIM3 的周期为主定时器的 5 倍。
使用提示 开发板 PA9、PA10 默认接 NSLINK 虚拟串口,不用串口时须拔掉跳线帽。
支持 N32G412x8L7、N32G412xBL7、N32G415x8L7、N32G415xBL7;
开发环境为 KEIL MDK-ARM 5.34 或 IAR EWARM 8.50.1。
核心代码解读与移植

示例让 GTIM1 担任主定时器,GTIM2 与 GTIM3 作为门控从机,由主定时器的更新事件控制两路从机的计数起停。

数据路径: TIM_InitTimeBase 建立三路时基 → TIM_InitOc1 配置主从 PWM 输出 → TIM_SelectOutputTrig 把主更新事件送到触发输出 → TIM_SelectSlaveMode 与 TIM_SelectInputTrig 让两从机按门控模式跟随 → 三路 PWM 在 PA0、PB4、PA6 输出

1. 用宏声明主从三路定时器。 inc/main.h 依次给出主定时器、两个从定时器的定时器名、时钟与 CH1 引脚复用宏,把主从关系固定在宏里。

inc/main.hinc/main.h
/* Master: GTIM1(TIM2), CH1=PA0(AF2) */
#define TIMx                   GTIM1
#define TIMx_CLK               RCC_APB1_PERIPH_GTIM1

#define TIMx_CH1_PIN           GPIO_PIN_0
#define TIMx_CH1_GPIO          GPIOA
#define TIMx_CH1_AF            GPIO_AF2

/* Slave1: GTIM2(TIM3), CH1=PB4(AF8), ITR1=GTIM1 */
#define TIMy                   GTIM2
#define TIMy_CLK               RCC_APB1_PERIPH_GTIM2

#define TIMy_CH1_PIN           GPIO_PIN_4
#define TIMy_CH1_GPIO          GPIOB
#define TIMy_CH1_AF            GPIO_AF8

/* Slave2: GTIM3(TIM4), CH1=PA6(AF12), ITR1=GTIM1 */
#define TIMz                   GTIM3
#define TIMz_CLK               RCC_APB1_PERIPH_GTIM3

#define TIMz_CH1_PIN           GPIO_PIN_6
#define TIMz_CH1_GPIO          GPIOA
#define TIMz_CH1_AF            GPIO_AF12

移植到别的定时器组合时,同步修改三路定时器名、时钟与 CH1 引脚复用宏,并核对 GPIO_Configuration 中对应的引脚与端口。

2. 主从三路定时器的时基。 三路共用同一结构体,只改 Period;主定时器 Period 为 255,两个从机分别为 9 和 4。

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

    TIM_InitTimeBase(TIMx, &TIM_TimeBaseStructure);

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

    TIM_TimeBaseStructure.Period = 4;
    TIM_InitTimeBase(TIMz, &TIM_TimeBaseStructure);

改周期比例时改三路 Period,主从比例由主定时器周期的整数倍关系决定。

3. 主定时器输出与触发源。 主通道工作在 PWM1 模式,Pulse 为 64;TIM_SelectMasterSlaveMode 使能主从模式后,TIM_SelectOutputTrig 把更新事件选为触发输出。

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

    TIM_InitOc1(TIMx, &TIM_OCInitStructure);

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

    /* Master Mode selection */
    TIM_SelectOutputTrig(TIMx, TIM_TRGO_SRC_UPDATE);

触发输出选的是更新事件,换用比较事件等其它源时要同步核对从机的触发输入选择。

4. 两路从机用门控模式跟随。 从机通道同为 PWM1、Pulse 为 3;TIM_SelectSlaveMode 取门控模式,TIM_SelectInputTrig 分别为 TIM_TRIG_SEL_IN_TR2 与 TIM_TRIG_SEL_IN_TR1,使从机计数由主触发信号控制。

src/main.csrc/main.c · main
    /* Slaves Configuration: PWM1 Mode */
    TIM_OCInitStructure.OCMode      = TIM_OCMODE_PWM1;
    TIM_OCInitStructure.OutputState = TIM_OUTPUT_STATE_ENABLE;
    TIM_OCInitStructure.Pulse       = 3;

    TIM_InitOc1(TIMy, &TIM_OCInitStructure);

    TIM_InitOc1(TIMz, &TIM_OCInitStructure);

    /* Slave Mode selection: TIMy, ITR2 = TIMx */
    TIM_SelectSlaveMode(TIMy, TIM_SLAVE_MODE_GATED);
    TIM_SelectInputTrig(TIMy, TIM_TRIG_SEL_IN_TR2);

    /* Slave Mode selection: TIMz, ITR1 = TIMx */
    TIM_SelectSlaveMode(TIMz, TIM_SLAVE_MODE_GATED);
    TIM_SelectInputTrig(TIMz, TIM_TRIG_SEL_IN_TR1);

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

源码注释把两个从机的触发输入都写成来自 ITR1(GTIM1),而代码里 GTIM2 用的是 TIM_TRIG_SEL_IN_TR2、GTIM3 用的是 TIM_TRIG_SEL_IN_TR1;TIM_EnableCtrlPwmOutputs 只对 TIMz 调用。移植到其它芯片时要按目标的 ITRx 映射与 PWM 输出使能范围逐项核对,不能只照注释。

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

5.20.3.14 PWM_Input PWM 输入捕获

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

使能 GPIO 与 GTIM1 时钟→配置 PA1 为 CH2 复用输入、PA3 为普通输出→把 CH2 设为 PWM 输入模式、选 TI2FP2 触发并设为复位从模式→打开 CC2 中断并启动计数器→主循环在 PA3 上产生方波,由 PA1 的捕获计算占空比与频率

项目 源码解读
功能 GTIM1 的 CH2 配置为 PWM 输入模式,同一输入信号经两路捕获分别得到周期与高电平时间;
主循环在 PA3 上输出方波并连到 PA1,中断里用捕获值算出占空比与频率两个变量。
源码组成 src/main.c:main、RCC_Configuration、GPIO_Configuration、NVIC_Configuration;
inc/main.h:TIMx、CH2 引脚与复用宏、中断映射和函数声明;
src/n32g41x_it.c、inc/n32g41x_it.h:中断服务函数 TIMx_IRQHandler 与 Frequency、DutyCycle 的计算;
readme.txt:功能、环境与使用说明;
MDK-ARM/、EWARM/:Keil 与 IAR 工程。
关键配置 TIMx 为 GTIM1。
CH2 为 PA1、GPIO_MODE_AF_PP、GPIO_AF2,PA3 为 GPIO_MODE_OUTPUT_PP。
捕获结构体取 Channel = TIM_CH_2、ICPolarity = TIM_IC_POLARITY_RISING、ICSelection = TIM_IC_SELECTION_DIRECTTI、ICPrescaler = TIM_IC_PSC_DIV1、ICFilter = 0x0;
从模式为 TIM_SLAVE_MODE_RESET,触发输入为 TIM_TRIG_SEL_TI2FP2,并使能主从模式。
程序与数据路径 main 完成时钟、GPIO、NVIC 配置后,TIM_ConfigPwmIc 把 CH2 设为 PWM 输入,TIM_SelectInputTrig 选 TI2FP2、TIM_SelectSlaveMode 选复位模式并 TIM_SelectMasterSlaveMode 使能主从,随后 TIM_Enable 启动、TIM_ConfigInt 打开 CC2 中断;
主循环在 PA3 上产生方波;
每次 CC2 触发进入 TIMx_IRQHandler,用 TIM_GetCap2 得周期、TIM_GetCap1 得高电平时间,算出 DutyCycle 与 Frequency。
主要 API TIM_InitIcStruct、TIM_ConfigPwmIc、TIM_SelectInputTrig、TIM_SelectSlaveMode、TIM_SelectMasterSlaveMode、TIM_Enable、TIM_ConfigInt、TIM_ClrIntPendingBit、TIM_GetCap1、TIM_GetCap2、GPIO_InitStruct、GPIO_InitPeripheral、GPIO_SetBits、GPIO_ResetBits
验证方法 把 PA3 与 PA1 相连,把 Frequency、DutyCycle 加入 watch 窗口;
运行后两个变量随 PA3 送出的方波更新,其值即为捕获测得的频率与占空比。
使用提示 需要把 PA3 与 PA1 用导线相连;
开发板 PA9、PA10 默认接 NSLINK 虚拟串口,不用串口时须拔掉跳线帽。
支持 N32G412x8L7、N32G412xBL7、N32G415x8L7、N32G415xBL7;
开发环境为 KEIL MDK-ARM 5.34 或 IAR EWARM 8.50.1。
核心代码解读与移植

示例把 PA3 的方波接回 CH2,用 PWM 输入模式同时测出周期与占空比,结果落在两个全局变量里。

数据路径: 主循环在 PA3 上产生方波 → CH2 的 TI2FP2 上升沿触发捕获并复位计数器 → TIMx_IRQHandler 读 TIM_GetCap2 得周期、TIM_GetCap1 得高电平时间 → 算出 DutyCycle 与 Frequency

1. CH2 接成复用输入,PA3 作信号源。 CH2 配成复用推挽并写入复用号,PA3 单独配成普通推挽输出,用来产生待测方波。

src/main.csrc/main.c · GPIO_Configuration
    /* TIMx CH2 */
    GPIO_InitStructure.Pin            = TIMx_CH2_PIN;
    GPIO_InitStructure.GPIO_Mode      = GPIO_MODE_AF_PP;
    GPIO_InitStructure.GPIO_Alternate = TIMx_CH2_AF;
    GPIO_InitPeripheral(TIMx_CH2_GPIO, &GPIO_InitStructure);

    /* PA3: GPIO output for generating PWM signal */
    GPIO_InitStructure.Pin       = GPIO_PIN_3;
    GPIO_InitStructure.GPIO_Mode = GPIO_MODE_OUTPUT_PP;
    GPIO_InitPeripheral(GPIOA, &GPIO_InitStructure);

移植时引脚与复用号来自 inc/main.h 的 CH2 宏与 PA3 的引脚定义,换板要一起核对。

2. 一次配好 PWM 输入与复位从模式。 TIM_ConfigPwmIc 把输入同时映射到 IC1 与 IC2,随后选出 TI2FP2 作触发输入、设为复位从模式并打开主从模式,最后启动计数与 CC2 中断。

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_ConfigPwmIc(TIMx, &TIM_ICInitStructure);

    /* Select the TIMx 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);

PWM 输入模式只支持 CH1、CH2 两个通道,换通道时要同步改 Channel、触发选择与复位从模式的组合。

3. 主循环产生待测方波。 主循环把 PA3 反复拉高、延时、拉低、再延时,形成占空比约 50% 的方波送进 CH2。

src/main.csrc/main.c · main
    while (1)
    {
        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)
                ;
        }
    }

改变两段延时即可改变输入方波的占空比与频率,用来观察捕获结果是否跟随。

4. 中断里算占空比与频率。 每次 CC2 触发先清标志,用 TIM_GetCap2 读回周期,再用 TIM_GetCap1 读回高电平时间,相除得到占空比、相除系统时钟得到频率。

src/n32g41x_it.csrc/n32g41x_it.c · TIMx_IRQHandler
    /* 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/n32g41x_it.c

5.20.3.15 PWM_Output PWM 输出

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

使能 GPIO 与 GTIM1 时钟→配置 PA0~PA3 为 CH1~CH4 复用输出→建立 16 MHz 时基并把四通道设为 PWM1 模式→使能各通道与自动重装载预装载后启动计数器

项目 源码解读
功能 GTIM1 的 CH1~CH4 输出四路周期相同、占空比不同的 PWM 波形,占空比由各自的比较值与自动重装值之比决定。
源码组成 src/main.c:main、RCC_Configuration、GPIO_Configuration;
inc/main.h:TIMx、四个通道的引脚与复用宏;
readme.txt:功能、环境与使用说明;
MDK-ARM/、EWARM/:Keil 与 IAR 工程。
关键配置 TIMx 为 GTIM1。
CH1 PA0、CH2 PA1、CH3 PA2、CH4 PA3,均 GPIO_MODE_AF_PP、GPIO_AF2。
计数时钟取 SystemCoreClock / 16000000 分频即 16 MHz,Period 为 1200;
四通道 OCMode 为 TIM_OCMODE_PWM1、输出使能、极性 TIM_OC_POLARITY_HIGH,Pulse 依次为 600、300、150、75;
各通道预装载与自动重装载预装载均使能。
程序与数据路径 main 完成时钟与 GPIO 配置后建立 16 MHz 时基,依次 TIM_InitOc1~TIM_InitOc4 把四通道设为 PWM1 并分别使能预装载;
随后 TIM_ConfigArPreload 使能自动重装载预装载,TIM_Enable 启动计数,四路持续输出占空比不同的 PWM。
主要 API TIM_InitTimBaseStruct、TIM_InitTimeBase、TIM_InitOcStruct、TIM_InitOc1、TIM_InitOc2、TIM_InitOc3、TIM_InitOc4、TIM_ConfigOc1Preload、TIM_ConfigOc4Preload、TIM_ConfigArPreload、TIM_Enable、GPIO_InitStruct、GPIO_InitPeripheral
验证方法 用示波器或逻辑分析仪观察 PA0~PA3:四路周期相同,占空比依次约为 50%、25%、12.5%、6.25%。
使用提示 开发板 PA9、PA10 默认接 NSLINK 虚拟串口,不用串口时须拔掉跳线帽。
支持 N32G412x8L7、N32G412xBL7、N32G415x8L7、N32G415xBL7;
开发环境为 KEIL MDK-ARM 5.34 或 IAR EWARM 8.50.1。
核心代码解读与移植

示例用同一结构体配置四路 PWM,只改比较值,得到周期相同而占空比递减的四路波形。

数据路径: TIM_InitTimeBase 写入 16 MHz 与 Period 1200 → TIM_InitOc1~TIM_InitOc4 设为 PWM1 并写入各自 Pulse → 各通道与自动重装载预装载使能 → TIM_Enable 启动 → PA0~PA3 输出四路 PWM

1. 四路引脚先配成复用输出。 第一个通道先把模式和复用号写全,后面三路只改引脚与复用号,沿用同样的推挽复用配置。

src/main.csrc/main.c · GPIO_Configuration
    /* TIMx CH1 */
    GPIO_InitStructure.Pin            = TIMx_CH1_PIN;
    GPIO_InitStructure.GPIO_Mode      = GPIO_MODE_AF_PP;
    GPIO_InitStructure.GPIO_Alternate = TIMx_CH1_AF;
    GPIO_InitPeripheral(TIMx_CH1_GPIO, &GPIO_InitStructure);

    /* TIMx CH2 */
    GPIO_InitStructure.Pin            = TIMx_CH2_PIN;
    GPIO_InitStructure.GPIO_Alternate = TIMx_CH2_AF;
    GPIO_InitPeripheral(TIMx_CH2_GPIO, &GPIO_InitStructure);

    /* TIMx CH3 */
    GPIO_InitStructure.Pin            = TIMx_CH3_PIN;
    GPIO_InitStructure.GPIO_Alternate = TIMx_CH3_AF;
    GPIO_InitPeripheral(TIMx_CH3_GPIO, &GPIO_InitStructure);

    /* TIMx CH4 */
    GPIO_InitStructure.Pin            = TIMx_CH4_PIN;
    GPIO_InitStructure.GPIO_Alternate = TIMx_CH4_AF;
    GPIO_InitPeripheral(TIMx_CH4_GPIO, &GPIO_InitStructure);

四路引脚与复用号来自 inc/main.h 的 TIMx_CH1_*~TIMx_CH4_* 宏,换板要一起核对。

2. 时基决定 PWM 周期。 计数时钟按 SystemCoreClock / 16000000 分频到 16 MHz,自动重装值取 1200,PWM 周期即为 1201 个计数。

src/main.csrc/main.c · main
    /* Compute the prescaler value */
    PrescalerValue = (uint32_t)(SystemCoreClock / 16000000) - 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);

改 PWM 频率时改除数或 Period,占空比由各通道比较值与 Period 之比决定。

3. 通道用 PWM1 模式并打开预装载。 四路共用结构体,以 CH1 为例设置 PWM1 模式、输出使能与极性后使能通道,并打开该通道的输出比较预装载。

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);

改某一路占空比时改对应 CCRx_Val;打开预装载后,运行中写入的新比较值在下一个更新事件生效。

4. 自动重装载预装载与启动。 最后使能自动重装载预装载,让 Period 的改动也在更新事件生效,再启动计数。

src/main.csrc/main.c · main
    TIM_ConfigArPreload(TIMx, ENABLE);

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

自动重装载预装载使能后,改 Period 不会立刻截断当前周期,适合运行中调整 PWM 频率。

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

5.20.3.16 TimeBasic6_BTIM_wakeup 基本定时器唤醒 STOP

工程目录: projects/n32g41x_EVAL/examples/TIM/TimeBasic6_BTIM_wakeup/

使能 GPIO 与 BTIM1 时钟→配置 PA7 为推挽输出→把 EXTI 线 20 配成上升沿并使能 BTIM1 中断→配置 BTIM1 时基、选 LSI 作时钟源并打开更新中断→主循环延时后进入 STOP,被更新中断唤醒再翻转 PA7

项目 源码解读
功能 BTIM1 以 LSI 为时钟源产生周期更新中断,该中断经 EXTI 线 20 把 MCU 从 STOP 模式唤醒;
每次唤醒后主循环翻转 PA7(评估板 LED D2),形成闪烁。
源码组成 src/main.c:main、RCC_Configuration、GPIO_Configuration、NVIC_Configuration、TIM_Configuration;
inc/main.h:包含 GPIO、TIM、RCC、PWR、EXTI 与延时相关头文件并声明上述函数;
src/n32g41x_it.c、inc/n32g41x_it.h:中断服务函数 BTIM1_IRQHandler;
readme.txt:功能、环境与使用说明;
MDK-ARM/、EWARM/:Keil 与 IAR 工程。
关键配置 PA7 为 GPIO_MODE_OUTPUT_PP。
NVIC_Configuration 把 EXTI_LINE20 配成 EXTI_Mode_Interrupt、EXTI_Trigger_Rising 并使能,同时使能 BTIM1_IRQn;
TIM_Configuration 中 Period 为 3200、Prescaler 为 0、ClkDiv 为 TIM_CLK_DIV1、计数向上,并使能 TIM_INT_UPDATE;
main 用 RCC_ConfigBtim1Clk(RCC_BTIM1_CLKSEL_LSI) 把 BTIM1 时钟源选为 LSI。
程序与数据路径 main 配置时钟、GPIO 与 NVIC,调用 TIM_Configuration 建立 BTIM1 时基并使能更新中断,再用 RCC_ConfigBtim1Clk 选 LSI 源并启动计数;
主循环用 SysTick_Delay_Ms(500) 等待,用 PWR_EnterSTOPMode(WFI 方式)进入 STOP,等系统时钟切回 PLL 后用 GPIO_TogglePin 翻转 PA7;
更新中断经 EXTI 线 20 进入 BTIM1_IRQHandler,清除两个挂起标志。
主要 API TIM_InitTimBaseStruct、TIM_InitTimeBase、TIM_ConfigInt、TIM_Enable、RCC_ConfigBtim1Clk、EXTI_InitPeripheral、EXTI_GetStatusFlag、EXTI_ClrITPendBit、PWR_EnterSTOPMode、RCC_GetSysclkSrc、GPIO_TogglePin、GPIO_InitPeripheral、SysTick_Delay_Ms
验证方法 编译下载后复位运行,评估板 LED(D2,即 PA7)周期闪烁;
闪烁由 STOP 唤醒驱动,进入 STOP 期间系统时钟为 LSI。
使用提示 STOP 模式下系统时钟为 LSI,BTIM1 依靠 LSI 时钟源保持运行;
EXTI 线 20(BTIM1)只支持上升沿触发。
评估板的 PA9、PA10 默认接 NSLINK 虚拟串口,不用串口时须拔掉跳线帽。
支持 N32G412x8L7、N32G412xBL7、N32G415x8L7、N32G415xBL7;
开发环境为 KEIL MDK-ARM 5.34 或 IAR EWARM 8.50.1。
核心代码解读与移植

示例把 BTIM1 的更新中断接到 EXTI 线 20,主循环进入 STOP 后由该中断唤醒,再把 LED 引脚翻转一次。

数据路径: TIM_Configuration 建立 BTIM1 时基并开更新中断 → RCC_ConfigBtim1Clk 选 LSI 源 → PWR_EnterSTOPMode 进入 STOP → 更新中断经 EXTI 线 20 触发 BTIM1_IRQHandler → GPIO_TogglePin 翻转 PA7

1. 选 LSI 时钟源并启动定时器。 BTIM1 先建立时基与更新中断,随后把时钟源切到 LSI;只有时钟源为 LSI 或 LSE 时,更新中断才能把 MCU 从 STOP 唤醒。

src/main.csrc/main.c · main
    /* Reconfig TIM6 */
    TIM_Configuration();
    RCC_ConfigBtim1Clk(RCC_BTIM1_CLKSEL_LSI);
    /* TIM6 enable counter */
    TIM_Enable(BTIM1, ENABLE);

换用 LSE 作唤醒源时改这里的时钟选择宏,并确认对应时钟已被使能。

2. 把更新中断接到 EXTI 线 20。 使能中断前先清 EXTI 线 20 的标志,再把它配成上升沿中断;BTIM1 的中断通道与这条 EXTI 线共用同一个向量。

src/main.csrc/main.c · NVIC_Configuration
    /* Enable the BTIM1 Interrupt (IRQ20, shared with EXTI Line 20) */
    EXTI_ClrStatusFlag(EXTI_LINE20);
    EXTI_Struct.EXTI_Line    = EXTI_LINE20;
    EXTI_Struct.EXTI_Mode    = EXTI_Mode_Interrupt;
    EXTI_Struct.EXTI_Trigger = EXTI_Trigger_Rising;
    EXTI_Struct.EXTI_LineCmd = ENABLE;
    EXTI_InitPeripheral(&EXTI_Struct);

EXTI 线 20 只支持上升沿触发,触发边沿不由软件改选;移植时不要把它配成下降沿或双边沿。

3. BTIM1 时基与更新中断。 时基结构体设 Period 为 3200、Prescaler 为 0,建立后先清更新标志再打开更新中断,避免残留标志导致首次误进中断。

src/main.csrc/main.c · TIM_Configuration
    /* 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(BTIM1, &TIM_TimeBaseStructure);

    /* Clear update interrupt flag before enabling */
    TIM_ClrIntPendingBit(BTIM1, TIM_INT_UPDATE);

    /* Enable BTIM1 update interrupt */
    TIM_ConfigInt(BTIM1, TIM_INT_UPDATE, ENABLE);

LSI 为时钟源时 TIMx_CNT 不支持写入,Period 与 Prescaler 决定唤醒周期。

4. 进入 STOP 并等待唤醒。 主循环延时后进入 STOP,被更新中断唤醒后先等待系统时钟切回 PLL,再翻转 LED 引脚。

src/main.csrc/main.c · main
    while (1)
    {
        SysTick_Delay_Ms(500);
        /* Enter STOP mode */
        PWR_EnterSTOPMode(PWR_STOPENTRY_WFI);
        /* Wait PLL ready, check sysclk source */
        while(RCC_GetSysclkSrc() != RCC_CFG_SCLKSTS_PLL)
        {
            if(--timeout == 0)
            {
                break;
            }
        }
        GPIO_TogglePin(GPIOA, GPIO_PIN_7);
    }

唤醒后系统时钟为 LSI,必须先切回 PLL 才能按预想频率继续运行;这段等待循环带超时保护,移植时可保留。

5. 中断里清两个标志。 确认 EXTI 线 20 置位后,先清 BTIM1 的更新标志,再清 EXTI 挂起位,两个标志缺一都会反复进中断。

src/n32g41x_it.csrc/n32g41x_it.c · BTIM1_IRQHandler
    if(EXTI_GetStatusFlag(EXTI_LINE20) != RESET)
    {
        TIM_ClrIntPendingBit(BTIM1, TIM_INT_UPDATE);
        EXTI_ClrITPendBit(EXTI_LINE20);
    }

对应源码: src/main.c、src/n32g41x_it.c

5.20.3.17 TimeBasic_cc 输出比较定时

工程目录: projects/n32g41x_EVAL/examples/TIM/TimeBasic_cc/

使能 GPIO 与 GTIM1 时钟→配置 PB0~PB3 为推挽输出→建立时基并用独立分频到 16 MHz,四通道设为输出比较定时模式→打开 CC1~CC4 中断并启动计数器→比较匹配进入中断后翻转对应引脚并累加比较值

项目 源码解读
功能 GTIM1 的 CH1~CH4 工作在输出比较定时模式,各自比较值到达时产生中断;
中断里翻转对应 PB 引脚并把比较值累加一个固定量,形成周期可控的方波。
源码组成 src/main.c:main、RCC_Configuration、GPIO_Configuration、NVIC_Configuration;
inc/main.h:包含 GPIO、TIM、RCC 与 misc 头文件并声明上述函数;
src/n32g41x_it.c、inc/n32g41x_it.h:中断服务函数 GTIM1_IRQHandler 与 CCRx_Val 累加;
readme.txt:功能、环境与使用说明;
MDK-ARM/、EWARM/:Keil 与 IAR 工程。
关键配置 定时器为 GTIM1,PB0、PB1、PB2、PB3 均为 GPIO_MODE_OUTPUT_PP。
Period 为 0xFFFFFFFF、时基 Prescaler 为 0,另用 TIM_ConfigPrescaler 以 SystemCoreClock / 16000000 的值做 16 MHz 分频、重装模式 TIM_PSC_RELOAD_MODE_IMMEDIATE;
四通道 OCMode 为 TIM_OCMODE_TIMING、输出使能、极性 TIM_OC_POLARITY_HIGH,Pulse 依次为 40961、27309、13654、6826,预装载均关闭。
程序与数据路径 main 完成时钟、GPIO、NVIC 配置后建立时基并用 TIM_ConfigPrescaler 设定 16 MHz 分频,TIM_InitOc1~TIM_InitOc4 把四通道设为定时比较模式;
随后 TIM_ConfigInt 打开 CC1~CC4 中断、TIM_Enable 启动;
每次比较匹配进入 GTIM1_IRQHandler,清标志后用 GPIO_WriteBit 翻转对应 PB 引脚,并用 TIM_GetCapx 读回比较值、TIM_SetCmpx 写入其与 CCRx_Val 之和。
主要 API TIM_InitTimBaseStruct、TIM_InitTimeBase、TIM_ConfigPrescaler、TIM_InitOcStruct、TIM_InitOc1~TIM_InitOc4、TIM_ConfigInt、TIM_Enable、TIM_GetIntStatus、TIM_GetCap1、TIM_SetCmp1、GPIO_WriteBit、GPIO_ReadOutputDataBit、GPIO_InitStruct、GPIO_InitPeripheral
验证方法 用示波器或逻辑分析仪观察 PB0~PB3:每路在达到各自比较值后翻转,比较值随之累加;
翻转周期由 CCRx_Val 与 16 MHz 计数时钟决定。
使用提示 开发板 PA9、PA10 默认接 NSLINK 虚拟串口,不用串口时须拔掉跳线帽。
支持 N32G412x8L7、N32G412xBL7、N32G415x8L7、N32G415xBL7;
开发环境为 KEIL MDK-ARM 5.34 或 IAR EWARM 8.50.1。
核心代码解读与移植

示例用独立的分频配置把计数器时钟设为 16 MHz,四路输出比较定时触发中断,由软件翻转引脚并推进比较值。

数据路径: GPIO_Configuration 把 PB0~PB3 配成推挽输出 → TIM_InitTimeBase 与 TIM_ConfigPrescaler 建立 16 MHz 计数 → TIM_InitOc1~TIM_InitOc4 设为定时比较 → GTIM1_IRQHandler 翻转 PB 引脚并累加比较值 → 示波器在 PB0~PB3 观察

1. 四路引脚先配成推挽输出。 四个引脚用同一条语句一次配好,GPIO_MODE_OUTPUT_PP 决定输出类型,供中断里软件翻转。

src/main.csrc/main.c · GPIO_Configuration
    /* PB0, PB1, PB2, PB3 as output */
    GPIO_InitStructure.Pin       = GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3;
    GPIO_InitStructure.GPIO_Mode = GPIO_MODE_OUTPUT_PP;
    GPIO_InitPeripheral(GPIOB, &GPIO_InitStructure);

移植到别的引脚时同步修改引脚组合与端口名。

2. 时基与独立分频。 先算出 16 MHz 对应的分频值,时基里 Period 取满量程,再用 TIM_ConfigPrescaler 以立即重装模式把分频值写入。

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

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

    TIM_InitTimeBase(GTIM1, &TIM_TimeBaseStructure);

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

分频值决定比较值的时间分辨率,改 16 MHz 的除数即可改变所有通道的翻转速率。

3. 通道用定时比较模式。 四路共用结构体,以 CH1 为例,OCMode 取 TIM_OCMODE_TIMING、写入 CCR1_Val 后使能,并关闭预装载。

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(GTIM1, &TIM_OCInitStructure);

    TIM_ConfigOc1Preload(GTIM1, TIM_OC_PRE_LOAD_DISABLE);

改某一路的翻转速率时改对应 CCRx_Val;预装载关闭后,中断里写入的比较值立即生效。

4. 开中断、启动并在中断里翻转。 打开 CC1~CC4 中断后启动计数;每次比较匹配进入 GTIM1_IRQHandler,清标志、翻转 PB 引脚并把比较值向前推一个固定量。

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

    /* GTIM1 enable counter */
    TIM_Enable(GTIM1, ENABLE);
src/n32g41x_it.csrc/n32g41x_it.c · GTIM1_IRQHandler
    if (TIM_GetIntStatus(GTIM1, TIM_INT_CC1) != RESET)
    {
        TIM_ClrIntPendingBit(GTIM1, TIM_INT_CC1);

        /* Pin PB0 toggling */
        GPIO_WriteBit(GPIOB, GPIO_PIN_0, (Bit_OperateType)(1 - GPIO_ReadOutputDataBit(GPIOB, GPIO_PIN_0)));
        capture = TIM_GetCap1(GTIM1);
        TIM_SetCmp1(GTIM1, capture + CCR1_Val);
    }

另外三路是同样写法的分支,只是通道号与引脚号递增;改哪一路的引脚,就在对应分支里改 GPIO_PIN_x。

对应源码: src/main.c、src/n32g41x_it.c

5.20.3.18 TimeBasic_update 更新中断定时

工程目录: projects/n32g41x_EVAL/examples/TIM/TimeBasic_update/

使能 GPIO 与 ATIM1 时钟→配置 PB0 为推挽输出→建立 ATIM1 时基、写入分频并打开更新中断→启动计数器,每次更新中断翻转 PB0

项目 源码解读
功能 ATIM1 打开更新中断,计数器每次溢出产生更新事件,中断里翻转 PB0 引脚,形成固定周期的方波。
源码组成 src/main.c:main、RCC_Configuration、GPIO_Configuration、NVIC_Configuration、TIM_Configuration;
inc/main.h:包含 GPIO、TIM、RCC 与 misc 头文件并声明上述函数;
src/n32g41x_it.c、inc/n32g41x_it.h:中断服务函数 ATIM1_UP_IRQHandler;
readme.txt:功能、环境与使用说明;
MDK-ARM/、EWARM/:Keil 与 IAR 工程。
关键配置 ATIM1 时钟来自 RCC_APB2_PERIPH_ATIM1;
PB0 为 GPIO_MODE_OUTPUT_PP;
中断通道为 ATIM1_UP_IRQn,抢占优先级 1、子优先级 0;
Period 为 65535、Prescaler 为 0、ClkDiv 为 TIM_CLK_DIV1、计数向上,TIM_ConfigPrescaler 以值 0 与 TIM_PSC_RELOAD_MODE_IMMEDIATE 写入,并使能 TIM_INT_UPDATE。
程序与数据路径 main 完成时钟、GPIO、NVIC 配置后调用 TIM_Configuration 建立时基、写入分频、打开更新中断并启动计数;
每次更新事件进入 ATIM1_UP_IRQHandler,清除更新标志后用 GPIO_WriteBit 翻转 PB0。
主要 API TIM_InitTimBaseStruct、TIM_InitTimeBase、TIM_ConfigPrescaler、TIM_ConfigInt、TIM_Enable、TIM_GetIntStatus、TIM_ClrIntPendingBit、GPIO_WriteBit、GPIO_ReadOutputDataBit、GPIO_InitStruct、GPIO_InitPeripheral
验证方法 用示波器或逻辑分析仪观察 PB0:运行后 PB0 在每个更新周期翻转一次,方波周期为更新周期的两倍,由 Period 与 ATIM1 计数时钟决定。
使用提示 开发板 PA9、PA10 默认接 NSLINK 虚拟串口,不用串口时须拔掉跳线帽。
支持 N32G412x8L7、N32G412xBL7、N32G415x8L7、N32G415xBL7;
开发环境为 KEIL MDK-ARM 5.34 或 IAR EWARM 8.50.1。
核心代码解读与移植

示例用 ATIM1 的更新中断驱动 PB0 翻转,除时基与中断使能外没有其它外设参与。

数据路径: RCC_Configuration 打开 ATIM1 时钟 → TIM_Configuration 建立时基、写分频并开更新中断 → TIM_Enable 启动计数 → 更新事件进入 ATIM1_UP_IRQHandler → GPIO_WriteBit 翻转 PB0

1. PB0 配置成推挽输出。 只用一只引脚输出方波,配置成普通推挽输出即可,由中断里的软件翻转产生波形。

src/main.csrc/main.c · GPIO_Configuration
    /* PB0 as output */
    GPIO_InitStructure.Pin       = GPIO_PIN_0;
    GPIO_InitStructure.GPIO_Mode = GPIO_MODE_OUTPUT_PP;
    GPIO_InitPeripheral(GPIOB, &GPIO_InitStructure);

2. ATIM1 挂在 APB2 上。 高级定时器 ATIM1 的时钟走 APB2 总线,与普通定时器挂在 APB1 上的取法不同,换用别的定时器时要按总线改宏。

src/main.csrc/main.c · RCC_Configuration
    /* Enable GPIO clock */
    RCC_EnableAHBPeriphClk(RCC_AHB_PERIPH_GPIO, ENABLE);

    /* Enable ATIM1 clock */
    RCC_EnableAPB2PeriphClk(RCC_APB2_PERIPH_ATIM1, ENABLE);

3. 时基、分频与更新中断。 时基设 Period 为 65535、Prescaler 为 0,建立后用 TIM_ConfigPrescaler 以立即重装模式写入分频值,再打开更新中断并启动计数。

src/main.csrc/main.c · TIM_Configuration
    /* 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(ATIM1, &TIM_TimeBaseStructure);

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

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

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

改方波频率时改 Period 与分频值;更新中断在计数器溢出时触发。

4. 中断向量要对上定时器。 高级定时器的更新中断通道是 ATIM1_UP_IRQn,抢占优先级与子优先级在此一起写入。

src/main.csrc/main.c · NVIC_Configuration
    /* Enable the ATIM1 Interrupt */
    NVIC_InitStructure.NVIC_IRQChannel                   = ATIM1_UP_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority        = 0;
    NVIC_InitStructure.NVIC_IRQChannelCmd                = ENABLE;
    NVIC_Init(&NVIC_InitStructure);

5. 中断里翻转 PB0。 确认更新标志置位后先清标志,再用读回输出电平取反的方式翻转 PB0。

src/n32g41x_it.csrc/n32g41x_it.c · ATIM1_UP_IRQHandler
    if (TIM_GetIntStatus(ATIM1, TIM_INT_UPDATE) != RESET)
    {
        TIM_ClrIntPendingBit(ATIM1, TIM_INT_UPDATE);

        /* PB0 toggle */
        GPIO_WriteBit(GPIOB, GPIO_PIN_0, (Bit_OperateType)(1 - GPIO_ReadOutputDataBit(GPIOB, GPIO_PIN_0)));
    }

对应源码: src/main.c、src/n32g41x_it.c

5.20.4 注意与排障

场景 检查与建议 来源
更新事件与预装载 PWM 或输出比较要使预加载寄存器生效,必须置位相应的 TIMx_CCMODx.OCxPEN,自动重装预加载由 TIMx_CTRL1.ARPEN 控制;
预加载值只在更新事件时转移到影子寄存器,因此须在计数器开始计数前用软件产生一次更新来复位所有寄存器。
用户手册
运行中更新比较值 未使能预装载寄存器时,可随时写 TIMx_CCDATx 更新输出波形;
若使能了预装载,则写入值要等到下一次更新事件才转入影子寄存器。
用户手册
中央对齐模式 计数器运行时不允许从边缘对齐切换到中央对齐,也不要在中央对齐模式下写计数器;
不要同时更改 TIMx_CTRL1.DIR 与 CAMSEL 位。
用户手册
PWM 输入模式的通道限制 PWM 输入模式只支持 TIMx_CH1、TIMx_CH2 两个信号,因为只有 TI1FP1 与 TI2FP2 接到从模式控制器。 用户手册
BTIM1 唤醒 STOP 的条件 BTIM1 时钟源配置为 LSI 或 LSE 时,才能通过更新中断(重定向到 EXTI 20)唤醒 STOP 模式。 用户手册
LSI 作时钟源时写计数器 时钟源配置为 LSI 时,TIMx_CNT 不支持写入。 用户手册
编码器与外部时钟的互斥 编码器模式和外部时钟模式 2 不兼容,不能同时选择。 用户手册

N32G412、N32G415 系列勘误手册 V1.0.0(2026.6.30)的勘误列表只列出一行 A 版芯片条目,且该行的勘误链接列为空,未列出任何 TIM 相关条目。

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

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

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