5.18 TIM 使用说明
本章说明 N32G033 标准外设库中 TIM 驱动的文件组成、146 个公开函数,以及 6Steps、ComplementarySignals、DMA、DMABurst、ExtTrigger_Synchro、InputCapture、OCActive、OCInactive、OCToggle、OnePulse、PWM_Input、PWM_Output、TimeBase、TimeBasic_TIM1、TimeBasic_TIM3、TimeBasic_TIM4、TimeBasic_TIM6、TimeBasic6_wakeup、TIMx_Synchro 19 个示例。时基与计数模式、输入捕获与输出比较、刹车与死区、编码器接口与主从同步请配合用户手册的“TIM1”“TIM3”“TIM4”“TIM6”章节阅读,芯片已知问题以勘误手册为准。
5.18.1 相关文件
| 相对路径 | 作用 |
|---|---|
firmware/n32g033_std_periph_driver/inc/n32g033_tim.h |
定义 TIM_TimeBaseInitType、OCInitType、TIM_ICInitType、TIM_BDTRInitType、TIM_FiltInitType 结构体,以及计数模式、输出比较模式、通道极性、刹车与死区、输入滤波、中断与标志等宏,并按复位与时基、通道初始化、时钟与编码器接口、输出比较、触发与从模式、非对称与滤波等类别声明 146 个公开函数 |
firmware/n32g033_std_periph_driver/src/n32g033_tim.c |
实现上述 146 个函数:TIMx 复位、时基与通道初始化、时钟与编码器接口、输出比较与极性、刹车与死区、触发与从模式、寄存器读写、标志与中断处理、非对称模式与输入滤波、编码器数据读取 |
projects/n32g033_EVAL/examples/TIM/ |
TIM 示例根目录,含 6Steps、ComplementarySignals、DMA、DMABurst、ExtTrigger_Synchro、InputCapture、OCActive、OCInactive、OCToggle、OnePulse、PWM_Input、PWM_Output、TimeBase、TimeBasic_TIM1、TimeBasic_TIM3、TimeBasic_TIM4、TimeBasic_TIM6、TimeBasic6_wakeup、TIMx_Synchro 19 个示例 |
projects/n32g033_EVAL/examples/TIM/PWM_Output/ |
该示例的工程目录组成:MDK-ARM/、EWARM/、inc/、src/、readme.txt |
projects/n32g033_EVAL/bsp/ |
示例共用的板级支持文件:delay.h 的 SysTick 毫秒级延时接口(TimeBasic6_wakeup 使用) |
5.18.2 API 参考
以下 146 个公开函数按 n32g033_tim.h 的声明顺序分为 12 组;每个条目给出功能摘要与 n32g033_tim.c 中该函数正上方的注释原文。
复位、时基与通道初始化
TIM_DeInit、TIM_InitTimeBase、TIM_InitOc1、TIM_InitOc2、TIM_InitOc3、TIM_InitOc4、TIM_InitOc5、TIM_InitOc6、TIM_InitOc7、TIM_ICInit、TIM_ConfigPwmIc、TIM_ConfigBkdt、TIM_BreakFiltConfig、TIM_BreakFiltEnable、TIM_BreakInputSourceEnable
结构体默认值填充
TIM_InitTimBaseStruct、TIM_InitOcStruct、TIM_InitIcStruct、TIM_InitBkdtStruct
使能、中断、事件与 DMA
TIM_Enable、TIM_EnableCtrlPwmOutputs、TIM_ConfigInt、TIM_GenerateEvent、TIM_ConfigDma、TIM_EnableDma
时钟、计数模式与编码器接口
TIM_ConfigInternalClk、TIM_ConfigInternalTrigToExt、TIM_ConfigExtTrigAsClk、TIM_ConfigExtClkMode1、TIM_ConfigExtClkMode2、TIM_ConfigPrescaler、TIM_ConfigCntMode、TIM_ConfigEncoderInterface、TIM_ConfigEncoderInterface2
强制输出比较、预装载与 OCREF 控制
TIM_ConfigForcedOc1、TIM_ConfigForcedOc2、TIM_ConfigForcedOc3、TIM_ConfigForcedOc4、TIM_ConfigForcedOc5、TIM_ConfigForcedOc6、TIM_ConfigForcedOc7、TIM_ConfigArPreload、TIM_SelectComEvt、TIM_SelectCapCmpDmaSrc、TIM_EnableCapCmpPreloadControl、TIM_ConfigOc1Preload、TIM_ConfigOc2Preload、TIM_ConfigOc3Preload、TIM_ConfigOc4Preload、TIM_ConfigOc5Preload、TIM_ConfigOc6Preload、TIM_ConfigOc7Preload
输出比较快速功能与 OCREF 清除
TIM_ConfigOc1Fast、TIM_ConfigOc2Fast、TIM_ConfigOc3Fast、TIM_ConfigOc4Fast、TIM_ConfigOc5Fast、TIM_ConfigOc6Fast、TIM_ConfigOc7Fast、TIM_ClrOc1Ref、TIM_ClrOc2Ref、TIM_ClrOc3Ref、TIM_ClrOc4Ref、TIM_ClrOc5Ref、TIM_ClrOc6Ref、TIM_ClrOc7Ref、TIM_ClrOcRefInputSource
极性、捕获比较使能与输出比较模式
TIM_ConfigOc1Polarity、TIM_ConfigOc1NPolarity、TIM_ConfigOc2Polarity、TIM_ConfigOc2NPolarity、TIM_ConfigOc3Polarity、TIM_ConfigOc3NPolarity、TIM_ConfigOc4Polarity、TIM_ConfigOc4NPolarity、TIM_ConfigOc5Polarity、TIM_ConfigOc6Polarity、TIM_ConfigOc7Polarity、TIM_EnableCapCmpCh、TIM_EnableCapCmpChN、TIM_SelectOcMode
更新事件、从模式与单脉冲
TIM_EnableUpdateEvt、TIM_ConfigUpdateEvt、TIM_ConfigUpdateRequestIntSrc、TIM_SelectHallSensor、TIM_SelectOnePulseMode、TIM_SelectOutputTrig、TIM_SelectSlaveMode、TIM_SelectMasterSlaveMode
寄存器写入与输入触发
TIM_SetCnt、TIM_SetAutoReload、TIM_SetCmp1、TIM_SetCmp2、TIM_SetCmp3、TIM_SetCmp4、TIM_SetCmp5、TIM_SetCmp6、TIM_SetCmp7、TIM_SetCmp1D、TIM_SetCmp2D、TIM_SetCmp3D、TIM_SetCmp4D、ConfigTI1、ConfigTI2、ConfigTI3、ConfigTI4、TIM_SetInCap1Prescaler、TIM_SetInCap2Prescaler、TIM_SetInCap3Prescaler、TIM_SetInCap4Prescaler、TIM_SelectInputTrig、TIM_ConfigExtTrig、TIM_SetClkDiv
捕获、计数器与状态读取
TIM_GetCap1、TIM_GetCap2、TIM_GetCap3、TIM_GetCap4、TIM_GetCap5、TIM_GetCap6、TIM_GetCap7、TIM_GetCap1D、TIM_GetCap2D、TIM_GetCap3D、TIM_GetCap4D、TIM_GetCnt、TIM_GetPrescaler、TIM_GetAutoReload、TIM_GetCCENStatus、TIM_GetFlagStatus、TIM_ClearFlag、TIM_GetIntStatus、TIM_ClrIntPendingBit
非对称模式与输入滤波
TIM_AsymmetricEnable、TIM_IC1FiltConfig、TIM_IC2FiltConfig、TIM_IC3FiltConfig、TIM_IC1FiltEnable、TIM_IC2FiltEnable、TIM_IC3FiltEnable、TIM_GetFiltStatus
ENCLVR 装载与编码器数据
TIM_TrgiLoadLvrToCNTEnable、TIM_GetLVR、TIM_CH3LoadLvrToCNTEnable、TIM_CH3LoadLvrToCNTPolarity、TIM_GetENCDAT、TIM_GetENCDATSign
void TIM_DeInit(TIM_Module* TIMx)复位 TIMx 相关寄存器。
name TIM_DeInit
fun Deinitializes the TIMx registers.
param TIMx (The input parameters must be the following values):
- TIM1
- TIM3
- TIM4
- TIM6
return none
void TIM_InitTimeBase(TIM_Module* TIMx, TIM_TimeBaseInitType* TIM_TimeBaseInitStruct)初始化 TIMx 时基单元。
name TIM_InitTimeBase
fun Initializes the TIMx time base unit.
param TIMx (The input parameters must be the following values):
- TIM1
- TIM3
- TIM4
- TIM6
param TIM_TimeBaseInitStruct: refer to the definition of TIM_TimeBaseInitType
- Prescaler
* 0x0000 ~ 0xFFFF
- CounterMode
* TIM_CNT_MODE_UP
* TIM_CNT_MODE_DOWN
* TIM_CNT_MODE_CENTER_ALIGN1
* TIM_CNT_MODE_CENTER_ALIGN2
* TIM_CNT_MODE_CENTER_ALIGN3
- Period
* 0x00000000 ~ 0xFFFFFFFF
- ClkDiv
* 0x00~ 0x1F
- RepetCnt
* 0x00 ~ 0xFF
- CapCh1Sel
* TIM_CAPCH1SEL_IOM
* TIM_CAPCH1SEL_COMP
- EtrOrClr
* TIM_ETRSEL
* TIM_COMPSEL
return none
void TIM_InitOc1(TIM_Module* TIMx, OCInitType* TIM_OCInitStruct)初始化 TIMx 通道 1。
name TIM_InitOc1
fun Initializes the TIMx Channel 1.
param TIMx (The input parameters must be the following values):
- TIM1
- TIM3
- TIM4
param TIM_OCInitStruct: refer to the definition of OCInitType
- OCMode
* TIM_OCMODE_TIMING
* TIM_OCMODE_ACTIVE
* TIM_OCMODE_INACTIVE
* TIM_OCMODE_TOGGLE
* TIM_FORCED_ACTION_INACTIVE
* TIM_FORCED_ACTION_ACTIVE
* TIM_OCMODE_PWM1
* TIM_OCMODE_PWM2
- OutputState
* TIM_OUTPUT_STATE_DISABLE
* TIM_OUTPUT_STATE_ENABLE
- OutputNState
* TIM_OUTPUT_NSTATE_DISABLE
* TIM_OUTPUT_NSTATE_ENABLE
- Pulse
* 0x00000000 ~ 0xFFFFFFFF
- OCPolarity
* TIM_OC_POLARITY_HIGH
* TIM_OC_POLARITY_LOW
- OCNPolarity
* TIM_OCN_POLARITY_HIGH
* TIM_OCN_POLARITY_LOW
- OCIdleState
* TIM_OC_IDLE_STATE_SET
* TIM_OC_IDLE_STATE_RESET
- OCNIdleState
* TIM_OCN_IDLE_STATE_SET
* TIM_OCN_IDLE_STATE_RESET
return none
void TIM_InitOc2(TIM_Module* TIMx, OCInitType* TIM_OCInitStruct)初始化 TIMx 通道 2。
name TIM_InitOc2
fun Initializes the TIMx Channel 2.
param TIMx (The input parameters must be the following values):
- TIM1
- TIM3
- TIM4
param TIM_OCInitStruct: refer to the definition of OCInitType
- OCMode
* TIM_OCMODE_TIMING
* TIM_OCMODE_ACTIVE
* TIM_OCMODE_INACTIVE
* TIM_OCMODE_TOGGLE
* TIM_FORCED_ACTION_INACTIVE
* TIM_FORCED_ACTION_ACTIVE
* TIM_OCMODE_PWM1
* TIM_OCMODE_PWM2
- OutputState
* TIM_OUTPUT_STATE_DISABLE
* TIM_OUTPUT_STATE_ENABLE
- OutputNState
* TIM_OUTPUT_NSTATE_DISABLE
* TIM_OUTPUT_NSTATE_ENABLE
- Pulse
* 0x00000000 ~ 0xFFFFFFFF
- OCPolarity
* TIM_OC_POLARITY_HIGH
* TIM_OC_POLARITY_LOW
- OCNPolarity
* TIM_OCN_POLARITY_HIGH
* TIM_OCN_POLARITY_LOW
- OCIdleState
* TIM_OC_IDLE_STATE_SET
* TIM_OC_IDLE_STATE_RESET
- OCNIdleState
* TIM_OCN_IDLE_STATE_SET
* TIM_OCN_IDLE_STATE_RESET
return none
void TIM_InitOc3(TIM_Module* TIMx, OCInitType* TIM_OCInitStruct)初始化 TIMx 通道 3。
name TIM_InitOc3
fun Initializes the TIMx Channel 3.
param TIMx (The input parameters must be the following values):
- TIM1
- TIM3
- TIM4
param TIM_OCInitStruct: refer to the definition of OCInitType
- OCMode
* TIM_OCMODE_TIMING
* TIM_OCMODE_ACTIVE
* TIM_OCMODE_INACTIVE
* TIM_OCMODE_TOGGLE
* TIM_FORCED_ACTION_INACTIVE
* TIM_FORCED_ACTION_ACTIVE
* TIM_OCMODE_PWM1
* TIM_OCMODE_PWM2
- OutputState
* TIM_OUTPUT_STATE_DISABLE
* TIM_OUTPUT_STATE_ENABLE
- OutputNState
* TIM_OUTPUT_NSTATE_DISABLE
* TIM_OUTPUT_NSTATE_ENABLE
- Pulse
* 0x00000000 ~ 0xFFFFFFFF
- OCPolarity
* TIM_OC_POLARITY_HIGH
* TIM_OC_POLARITY_LOW
- OCNPolarity
* TIM_OCN_POLARITY_HIGH
* TIM_OCN_POLARITY_LOW
- OCIdleState
* TIM_OC_IDLE_STATE_SET
* TIM_OC_IDLE_STATE_RESET
- OCNIdleState
* TIM_OCN_IDLE_STATE_SET
* TIM_OCN_IDLE_STATE_RESET
return none
void TIM_InitOc4(TIM_Module* TIMx, OCInitType* TIM_OCInitStruct)初始化 TIMx 通道 4。
name TIM_InitOc4
fun Initializes the TIMx Channel 4.
param TIMx (The input parameters must be the following values):
- TIM1
- TIM3
param TIM_OCInitStruct: refer to the definition of OCInitType
- OCMode
* TIM_OCMODE_TIMING
* TIM_OCMODE_ACTIVE
* TIM_OCMODE_INACTIVE
* TIM_OCMODE_TOGGLE
* TIM_FORCED_ACTION_INACTIVE
* TIM_FORCED_ACTION_ACTIVE
* TIM_OCMODE_PWM1
* TIM_OCMODE_PWM2
- OutputState
* TIM_OUTPUT_STATE_DISABLE
* TIM_OUTPUT_STATE_ENABLE
- OutputNState
* TIM_OUTPUT_NSTATE_DISABLE
* TIM_OUTPUT_NSTATE_ENABLE
- Pulse
* 0x00000000 ~ 0xFFFFFFFF
- OCPolarity
* TIM_OC_POLARITY_HIGH
* TIM_OC_POLARITY_LOW
- OCNPolarity
* TIM_OCN_POLARITY_HIGH
* TIM_OCN_POLARITY_LOW
- OCIdleState
* TIM_OC_IDLE_STATE_SET
* TIM_OC_IDLE_STATE_RESET
- OCNIdleState
* TIM_OCN_IDLE_STATE_SET
* TIM_OCN_IDLE_STATE_RESET
return none
void TIM_InitOc5(TIM_Module* TIMx, OCInitType* TIM_OCInitStruct)初始化 TIMx 通道 5。
name TIM_InitOc5
fun Initializes the TIMx Channel 5.
param TIMx (The input parameters must be the following values):
- TIM1
param TIM_OCInitStruct: refer to the definition of OCInitType
- OCMode
* TIM_OCMODE_TIMING
* TIM_OCMODE_ACTIVE
* TIM_OCMODE_INACTIVE
* TIM_OCMODE_TOGGLE
* TIM_FORCED_ACTION_INACTIVE
* TIM_FORCED_ACTION_ACTIVE
* TIM_OCMODE_PWM1
* TIM_OCMODE_PWM2
- OutputState
* TIM_OUTPUT_STATE_DISABLE
* TIM_OUTPUT_STATE_ENABLE
- Pulse
* 0x00000000 ~ 0xFFFFFFFF
- OCPolarity
* TIM_OC_POLARITY_HIGH
* TIM_OC_POLARITY_LOW
return none
void TIM_InitOc6(TIM_Module* TIMx, OCInitType* TIM_OCInitStruct)初始化 TIMx 通道 6。
name TIM_InitOc6
fun Initializes the TIMx Channel 6.
param TIMx (The input parameters must be the following values):
- TIM1
param TIM_OCInitStruct: refer to the definition of OCInitType
- OCMode
* TIM_OCMODE_TIMING
* TIM_OCMODE_ACTIVE
* TIM_OCMODE_INACTIVE
* TIM_OCMODE_TOGGLE
* TIM_FORCED_ACTION_INACTIVE
* TIM_FORCED_ACTION_ACTIVE
* TIM_OCMODE_PWM1
* TIM_OCMODE_PWM2
- OutputState
* TIM_OUTPUT_STATE_DISABLE
* TIM_OUTPUT_STATE_ENABLE
- Pulse
* 0x0000 ~ 0xFFFF
- OCPolarity
* TIM_OC_POLARITY_HIGH
* TIM_OC_POLARITY_LOW
return none
void TIM_InitOc7(TIM_Module* TIMx, OCInitType* TIM_OCInitStruct)初始化 TIMx 通道 7。
name TIM_InitOc7
fun Initializes the TIMx Channel 7.
param TIMx (The input parameters must be the following values):
- TIM1
param TIM_OCInitStruct: refer to the definition of OCInitType
- OCMode
* TIM_OCMODE_TIMING
* TIM_OCMODE_ACTIVE
* TIM_OCMODE_INACTIVE
* TIM_OCMODE_TOGGLE
* TIM_FORCED_ACTION_INACTIVE
* TIM_FORCED_ACTION_ACTIVE
* TIM_OCMODE_PWM1
* TIM_OCMODE_PWM2
- OutputState
* TIM_OUTPUT_STATE_DISABLE
* TIM_OUTPUT_STATE_ENABLE
- Pulse
* 0x0000 ~ 0xFFFF
- OCPolarity
* TIM_OC_POLARITY_HIGH
* TIM_OC_POLARITY_LOW
return none
void TIM_ICInit(TIM_Module* TIMx, TIM_ICInitType* TIM_ICInitStruct)按 TIM_ICInitStruct 中的指定参数初始化定时器。
name TIM_ICInit
fun Initializes the TIM peripheral according to the specified
parameters in the TIM_ICInitStruct.
param TIMx (The input parameters must be the following values):
- TIM1
- TIM3
- TIM4
param TIM_ICInitStruct: refer to the definition of TIM_ICInitType
- Channel
* TIM_CH_1
* TIM_CH_2
* TIM_CH_3
* TIM_CH_4
- ICPolarity
* TIM_IC_POLARITY_RISING
* TIM_IC_POLARITY_FALLING
- ICSelection
* TIM_IC_SELECTION_DIRECTTI
* TIM_IC_SELECTION_INDIRECTTI
* TIM_IC_SELECTION_TRC
- ICPrescaler
* TIM_IC_PSC_DIV1
* TIM_IC_PSC_DIV2
* TIM_IC_PSC_DIV4
* TIM_IC_PSC_DIV8
- ICFilter
* ICFilter can be a number between 0x0 and 0xF
return none
void TIM_ConfigPwmIc(TIM_Module* TIMx, TIM_ICInitType* TIM_ICInitStruct)按 TIM_ICInitStruct 中的指定参数配置定时器以测量外部 PWM 信号。
name TIM_ConfigPwmIc
fun Configures the TIM peripheral according to the specified
parameters in the TIM_ICInitStruct to measure an external PWM signal.
param TIMx (The input parameters must be the following values):
- TIM1
- TIM3
- TIM4
param TIM_ICInitStruct: refer to the definition of TIM_ICInitType
- Channel
* TIM_CH_1
* TIM_CH_2
- ICPolarity
* TIM_IC_POLARITY_RISING
* TIM_IC_POLARITY_FALLING
- ICSelection
* TIM_IC_SELECTION_DIRECTTI
* TIM_IC_SELECTION_INDIRECTTI
- ICPrescaler
* TIM_IC_PSC_DIV1
* TIM_IC_PSC_DIV2
* TIM_IC_PSC_DIV4
* TIM_IC_PSC_DIV8
- ICFilter
* ICFilter can be a number between 0x0 and 0xF
return none
void TIM_ConfigBkdt(TIM_Module* TIMx, TIM_BDTRInitType* TIM_BDTRInitStruct)配置刹车功能、死区时间、锁定级别、OSSI 与 OSSR 状态以及自动输出使能。
name TIM_ConfigBkdt
fun Configures the: Break feature, dead time, Lock level, the OSSI,
the OSSR State and the AOE(automatic output enable).
param TIMx (The input parameters must be the following values):
- TIM1
- TIM3
param TIM_BDTRInitStruct: refer to the definition of TIM_BDTRInitType
- OSSRState
* TIM_OSSR_STATE_ENABLE
* TIM_OSSR_STATE_DISABLE
- OSSIState
* TIM_OSSI_STATE_ENABLE
* TIM_OSSI_STATE_DISABLE
- LOCKLevel
* TIM_LOCK_LEVEL_OFF
* TIM_LOCK_LEVEL_1
* TIM_LOCK_LEVEL_2
* TIM_LOCK_LEVEL_3
- DeadTime
* DeadTime can be a number between 0x00 and 0xFF
- Break
* TIM_BREAK_IN_ENABLE
* TIM_BREAK_IN_DISABLE
- BreakPolarity
* TIM_BREAK_POLARITY_LOW
* TIM_BREAK_POLARITY_HIGH
- AutomaticOutput
* TIM_AUTO_OUTPUT_ENABLE
* TIM_AUTO_OUTPUT_DISABLE
return none
void TIM_BreakFiltConfig(TIM_Module* TIMx, TIM_FiltInitType* TIM_FiltInitStruct)配置刹车输入的滤波器。
name TIM_BreakFiltConfig
fun Config the filter of break input.
param TIMx:
- TIM1
- TIM3
param TIM_FiltInitStruct:
- refer to the definition of TIM_FiltInitType
return none
void TIM_BreakFiltEnable(TIM_Module* TIMx,FunctionalState Cmd)使能或禁止刹车输入的滤波器。
name TIM_BreakFiltEnable
fun Enable or disable the filter of break input.
param TIMx:
- TIM1
- TIM3
param Cmd :
- ENABLE
- DISABLE
return none
void TIM_BreakInputSourceEnable(TIM_Module* TIMx, uint32_t Source, uint32_t Polarity, FunctionalState Cmd)使能或禁止刹车输入源,并设置刹车输入源的极性。
name TIM_BreakInputSourceEnable
fun Enable or disable the break input source , and set the polarity of the break input source.
param TIMx (The input parameters must be the following values):
- TIM1
- TIM3
param Source
- TIM_BREAK_LOCKUP
- TIM_BREAK_PVD
- TIM_BREAK_IOM1
- TIM_BREAK_IOM2
- TIM_BREAK_IOM3
- TIM_BREAK_IOM4
- TIM_BREAK_COMP1
param Polarity
- TIM_BREAK_IOM_COMP_POLARITY_INVERT
- TIM_BREAK_IOM_COMP_POLARITY_NONINVERT
param Cmd
- ENABLE
- DISABLE
return none
note Only a system reset can reset TIM_BREAK_LOCKUP/TIM_BREAK_PVD after they are enabled.
void TIM_InitTimBaseStruct(TIM_TimeBaseInitType* TIM_TimeBaseInitStruct)将 TIM_TimeBaseInitStruct 的每个成员填充为默认值。
name TIM_InitTimBaseStruct
fun Fills each TIM_TimeBaseInitStruct member with its default value.
param TIM_TimeBaseInitStruct: refer to the definition of TIM_TimeBaseInitType
- Prescaler
* 0x0000 ~ 0xFFFF
- CounterMode
* TIM_CNT_MODE_UP
* TIM_CNT_MODE_DOWN
* TIM_CNT_MODE_CENTER_ALIGN1
* TIM_CNT_MODE_CENTER_ALIGN2
* TIM_CNT_MODE_CENTER_ALIGN3
- Period
* 0x00000000 ~ 0xFFFFFFFF
- ClkDiv
* 0x00~ 0x1F
- RepetCnt
* 0x00 ~ 0xFF
- CapCh1Sel
* TIM_CAPCH1SEL_IOM
* TIM_CAPCH1SEL_COMP
- ClrSel
* TIM_ETRSEL
* TIM_COMPSEL
return none
void TIM_InitOcStruct(OCInitType* TIM_OCInitStruct)将 TIM_OCInitStruct 的每个成员填充为默认值。
name TIM_InitOcStruct
fun Fills each TIM_OCInitStruct member with its default value.
param TIM_OCInitStruct: refer to the definition of OCInitType
- OCMode
* TIM_OCMODE_TIMING
* TIM_OCMODE_ACTIVE
* TIM_OCMODE_INACTIVE
* TIM_OCMODE_TOGGLE
* TIM_FORCED_ACTION_INACTIVE
* TIM_FORCED_ACTION_ACTIVE
* TIM_OCMODE_PWM1
* TIM_OCMODE_PWM2
- OutputState
* TIM_OUTPUT_STATE_DISABLE
* TIM_OUTPUT_STATE_ENABLE
- OutputNState
* TIM_OUTPUT_NSTATE_DISABLE
* TIM_OUTPUT_NSTATE_ENABLE
- Pulse
* 0x00000000 ~ 0xFFFFFFFF
- OCPolarity
* TIM_OC_POLARITY_HIGH
* TIM_OC_POLARITY_LOW
- OCNPolarity
* TIM_OCN_POLARITY_HIGH
* TIM_OCN_POLARITY_LOW
- OCIdleState
* TIM_OC_IDLE_STATE_SET
* TIM_OC_IDLE_STATE_RESET
- OCNIdleState
* TIM_OCN_IDLE_STATE_SET
* TIM_OCN_IDLE_STATE_RESET
return none
void TIM_InitIcStruct(TIM_ICInitType* TIM_ICInitStruct)将 TIM_ICInitStruct 的每个成员填充为默认值。
name TIM_InitIcStruct
fun Fills each TIM_ICInitStruct member with its default value.
param TIM_ICInitStruct: refer to the definition of TIM_ICInitType
- Channel
* TIM_CH_1
* TIM_CH_2
* TIM_CH_3
* TIM_CH_4
- ICPolarity
* TIM_IC_POLARITY_RISING
* TIM_IC_POLARITY_FALLING
- ICSelection
* TIM_IC_SELECTION_DIRECTTI
* TIM_IC_SELECTION_INDIRECTTI
* TIM_IC_SELECTION_TRC
- ICPrescaler
* TIM_IC_PSC_DIV1
* TIM_IC_PSC_DIV2
* TIM_IC_PSC_DIV4
* TIM_IC_PSC_DIV8
- ICFilter
* ICFilter can be a number between 0x0 and 0xF
return none
void TIM_InitBkdtStruct(TIM_BDTRInitType* TIM_BDTRInitStruct)将 TIM_BDTRInitStruct 的每个成员填充为默认值。
name TIM_InitBkdtStruct
fun Fills each TIM_BDTRInitStruct member with its default value.
param TIM_BDTRInitStruct: refer to the definition of TIM_BDTRInitType
- OSSRState
* TIM_OSSR_STATE_ENABLE
* TIM_OSSR_STATE_DISABLE
- OSSIState
* TIM_OSSI_STATE_ENABLE
* TIM_OSSI_STATE_DISABLE
- LOCKLevel
* TIM_LOCK_LEVEL_OFF
* TIM_LOCK_LEVEL_1
* TIM_LOCK_LEVEL_2
* TIM_LOCK_LEVEL_3
- DeadTime
* DeadTime can be a number between 0x00 and 0xFF
- Break
* TIM_BREAK_IN_ENABLE
* TIM_BREAK_IN_DISABLE
- BreakPolarity
* TIM_BREAK_POLARITY_LOW
* TIM_BREAK_POLARITY_HIGH
- AutomaticOutput
* TIM_AUTO_OUTPUT_ENABLE
* TIM_AUTO_OUTPUT_DISABLE
return none
void TIM_Enable(TIM_Module* TIMx, FunctionalState Cmd)使能或禁止指定的 TIM 外设。
name TIM_Enable
fun Enables or disables the specified TIM peripheral.
param TIMx (The input parameters must be the following values):
- TIM1
- TIM3
- TIM4
- TIM6
param Cmd :
- ENABLE
- DISABLE
return none
void TIM_EnableCtrlPwmOutputs(TIM_Module* TIMx, FunctionalState Cmd)使能或禁止 TIM 外设的主输出。
name TIM_EnableCtrlPwmOutputs
fun Enables or disables the TIM peripheral Main Outputs.
param TIMx (The input parameters must be the following values):
- TIM1
- TIM3
param Cmd :
- ENABLE
- DISABLE
return none
void TIM_ConfigInt(TIM_Module* TIMx, uint32_t TIM_IT, FunctionalState Cmd)使能或禁止指定的 TIM 中断。
name TIM_ConfigInt
fun Enables or disables the specified TIM interrupts.
param TIMx (The input parameters must be the following values):
- TIM1
- TIM3
- TIM4
- TIM6
param TIM_IT:
- TIM_INT_CC1
- TIM_INT_CC2
- TIM_INT_CC3
- TIM_INT_CC4
- TIM_INT_CC5
- TIM_INT_CC6
- TIM_INT_CC7
- TIM_INT_C3LDCNT
- TIM_INT_UPDATE
- TIM_INT_TRIG
- TIM_INT_BREAK
- TIM_INT_COM
param Cmd :
- ENABLE
- DISABLE
return none
void TIM_GenerateEvent(TIM_Module* TIMx, uint32_t TIM_EventSource)配置由软件产生 TIMx 事件。
name TIM_GenerateEvent
fun Configures the TIMx event to be generate by software.
param TIMx (The input parameters must be the following values):
- TIM1
- TIM3
- TIM4
- TIM6
param TIM_EventSource:
- TIM_EVT_SRC_CC1
- TIM_EVT_SRC_CC2
- TIM_EVT_SRC_CC3
- TIM_EVT_SRC_CC4
- TIM_EVT_SRC_UPDATE
- TIM_EVT_SRC_COM
- TIM_EVT_SRC_TRIG
- TIM_EVT_SRC_BREAK
return none
void TIM_ConfigDma(TIM_Module* TIMx, uint32_t TIM_DMABase, uint32_t TIM_DMABurstLength)配置 TIMx 的 DMA 接口。
name TIM_ConfigDma
fun Configures the TIMx's DMA interface.
param TIMx (The input parameters must be the following values):
- TIM1
- TIM3
- TIM4
param TIM_DMABase:
- TIM_DMABASE_CTRL1
- TIM_DMABASE_CTRL2
- TIM_DMABASE_STS
- TIM_DMABASE_EVTGEN
- TIM_DMABASE_SMCTRL
- TIM_DMABASE_DMAINTEN
- TIM_DMABASE_CAPCMPMOD1
- TIM_DMABASE_CAPCMPMOD2
- TIM_DMABASE_CAPCMPMOD3
- TIM_DMABASE_CAPCMPEN
- TIM_DMABASE_CAPCMPDAT1
- TIM_DMABASE_CAPCMPDAT2
- TIM_DMABASE_CAPCMPDAT3
- TIM_DMABASE_CAPCMPDAT4
- TIM_DMABASE_CAPCMPDAT5
- TIM_DMABASE_CAPCMPDAT6
- TIM_DMABASE_PSC
- TIM_DMABASE_AR
- TIM_DMABASE_CNT
- TIM_DMABASE_REPCNT
- TIM_DMABASE_BKDT
- TIM_DMABASE_CAPCMPDAT7
- TIM_DMABASE_BKFR
- TIM_DMABASE_C1FILT
- TIM_DMABASE_C2FILT
- TIM_DMABASE_C3FILT
- TIM_DMABASE_FILTO
- TIM_DMABASE_AF1
- TIM_DMABASE_ENCDAT
- TIM_DMABASE_ENCMCTRL
- TIM_DMABASE_ENCLVR
param TIM_DMABurstLength:
- This parameter can be one value between:
TIM_DMABURST_LENGTH_1TRANSFER and TIM_DMABURST_LENGTH_37TRANSFERS.
return none
void TIM_EnableDma(TIM_Module* TIMx, uint32_t TIM_DMASource, FunctionalState Cmd)使能或禁止 TIMx 的 DMA 请求。
name TIM_EnableDma
fun Enables or disables the TIMx's DMA Requests.
param TIMx (The input parameters must be the following values):
- TIM1
- TIM3
- TIM4
- TIM6
param TIM_DMASource:
- TIM_DMA_CC1
- TIM_DMA_CC2
- TIM_DMA_CC3
- TIM_DMA_CC4
- TIM_DMA_UPDATE
- TIM_DMA_COM
- TIM_DMA_TRIG
param Cmd:
- DISABLE
- ENABLE
return none
void TIM_ConfigInternalClk(TIM_Module* TIMx)配置 TIMx 的内部时钟。
name TIM_ConfigInternalClk
fun Configures the TIMx internal Clock
param TIMx (The input parameters must be the following values):
- TIM1
- TIM3
- TIM4
return none
void TIM_ConfigInternalTrigToExt(TIM_Module* TIMx, uint32_t TIM_InputTriggerSource)将 TIMx 的内部触发配置为外部时钟。
name TIM_ConfigInternalTrigToExt
fun Configures the TIMx Internal Trigger as External Clock
param TIMx (The input parameters must be the following values):
- TIM1
- TIM3
- TIM4
param TIM_InputTriggerSource:
- TIM_TRIG_SEL_IN_TR0
- TIM_TRIG_SEL_IN_TR1
- TIM_TRIG_SEL_IN_TR2
- TIM_TRIG_SEL_IN_TR3
return none
void TIM_ConfigExtTrigAsClk(TIM_Module* TIMx, uint32_t TIM_TIxExternalCLKSource, uint32_t IcPolarity, uint32_t ICFilter)将 TIMx 的触发器配置为外部时钟。
name TIM_ConfigExtTrigAsClk
fun Configures the TIMx Trigger as External Clock
param TIMx (The input parameters must be the following values):
- TIM1
- TIM3
- TIM4
param TIM_TIxExternalCLKSource:
- TIM_TRIG_SEL_TI1F_ED
- TIM_TRIG_SEL_TI1FP1
- TIM_TRIG_SEL_TI2FP2
param ICPolarity
- TIM_IC_POLARITY_RISING
- TIM_IC_POLARITY_FALLING
param ICFilter
- ICFilter can be a number between 0x0 and 0xF
return none
void TIM_ConfigExtClkMode1(TIM_Module* TIMx,uint32_t TIM_ExtTRGPrescaler,uint32_t TIM_ExtTRGPolarity,uint32_t ExtTRGFilter)配置外部时钟模式 1。
name TIM_ConfigExtClkMode1
fun Configures the External clock Mode1
param TIMx (The input parameters must be the following values):
- TIM1
- TIM3
- TIM4
param TIM_ExtTRGPrescaler:
- TIM_EXT_TRG_PSC_OFF
- TIM_EXT_TRG_PSC_DIV2
- TIM_EXT_TRG_PSC_DIV4
- TIM_EXT_TRG_PSC_DIV8
param TIM_ExtTRGPolarity
- TIM_EXT_TRIG_POLARITY_INVERTED
- TIM_EXT_TRIG_POLARITY_NONINVERTED
param ExtTRGFilter
- ExtTRGFilter can be a number between 0x0 and 0xF
return none
void TIM_ConfigExtClkMode2(TIM_Module* TIMx,uint32_t TIM_ExtTRGPrescaler,uint32_t TIM_ExtTRGPolarity,uint32_t ExtTRGFilter)配置外部时钟模式 2。
name TIM_ConfigExtClkMode2
fun Configures the External clock Mode2
param TIMx (The input parameters must be the following values):
- TIM1
- TIM3
- TIM4
param TIM_ExtTRGPrescaler:
- TIM_EXT_TRG_PSC_OFF
- TIM_EXT_TRG_PSC_DIV2
- TIM_EXT_TRG_PSC_DIV4
- TIM_EXT_TRG_PSC_DIV8
param TIM_ExtTRGPolarity
- TIM_EXT_TRIG_POLARITY_INVERTED
- TIM_EXT_TRIG_POLARITY_NONINVERTED
param ExtTRGFilter
- ExtTRGFilter can be a number between 0x0 and 0xF
return none
void TIM_ConfigPrescaler(TIM_Module* TIMx, uint32_t Prescaler, uint32_t TIM_PSCReloadMode)配置 TIMx 的预分频器。
name TIM_ConfigPrescaler
fun Configures the TIMx Prescaler.
param TIMx (The input parameters must be the following values):
- TIM1
- TIM3
- TIM4
- TIM6
param Prescaler:
- 0x0000 ~ 0xFFFF
param TIM_PSCReloadMode
- TIM_PSC_RELOAD_MODE_UPDATE
- TIM_PSC_RELOAD_MODE_IMMEDIATE
return none
void TIM_ConfigCntMode(TIM_Module* TIMx, uint32_t CntMode)指定要使用的 TIMx 计数模式。
name TIM_ConfigCntMode
fun Specifies the TIMx Counter Mode to be used.
param TIMx (The input parameters must be the following values):
- TIM1
- TIM3
- TIM4
param CntMode
- TIM_CNT_MODE_UP
- TIM_CNT_MODE_DOWN
- TIM_CNT_MODE_CENTER_ALIGN1
- TIM_CNT_MODE_CENTER_ALIGN2
- TIM_CNT_MODE_CENTER_ALIGN3
return none
void TIM_ConfigEncoderInterface(TIM_Module* TIMx,uint32_t TIM_EncoderMode,uint32_t TIM_IC1Polarity,uint32_t TIM_IC2Polarity)配置 TIMx 编码器接口。
name TIM_ConfigEncoderInterface
fun Configures the TIMx Encoder Interface.
param TIMx (The input parameters must be the following values):
- TIM1
- TIM3
param TIM_EncoderMode
- TIM_ENCODE_QUA_MODE_TI1
- TIM_ENCODE_QUA_MODE_TI2
- TIM_ENCODE_QUA_MODE_TI12
param TIM_IC1Polarity
- TIM_IC_POLARITY_FALLING
- TIM_IC_POLARITY_RISING
param TIM_IC2Polarity
- TIM_IC_POLARITY_FALLING
- TIM_IC_POLARITY_RISING
return none
void TIM_ConfigEncoderInterface2(TIM_Module* TIMx,uint32_t TIM_EncoderMode,uint32_t TIM_IC1Polarity,uint32_t TIM_IC2Polarity)配置 TIMx 编码器接口。
name TIM_ConfigEncoderInterface2
fun Configures the TIMx Encoder Interface.
param TIMx (The input parameters must be the following values):
- TIM4
param TIM_EncoderMode
- TIM_ENCODE2_DISABLE
- TIM_ENCODE2_QUA_MODE_TI1
- TIM_ENCODE2_QUA_MODE_TI2
- TIM_ENCODE2_QUA_MODE_TI12
- TIM_ENCODE2_QUA_MODE_SINGLE_TI1
- TIM_ENCODE2_QUA_MODE_SINGLE_TI2
- TIM_ENCODE2_DUL_CLKPLUS_MODE1
- TIM_ENCODE2_DUL_CLKPLUS_MODE2
- TIM_ENCODE2_SINGLE_CLKPLUS_MODE1
- TIM_ENCODE2_SINGLE_CLKPLUS_MODE2
- TIM_ENCODE2_CCW_MODE1
- TIM_ENCODE2_CCW_MODE2
param TIM_IC1Polarity
- TIM_IC_POLARITY_FALLING
- TIM_IC_POLARITY_RISING
param TIM_IC2Polarity
- TIM_IC_POLARITY_FALLING
- TIM_IC_POLARITY_RISING
return none
note When using this function, the slave mode must be disabled.
void TIM_ConfigForcedOc1(TIM_Module* TIMx, uint32_t TIM_ForcedAction)将 TIMx 输出 1 的波形强制为有效或无效电平。
name TIM_ConfigForcedOc1
fun Forces the TIMx output 1 waveform to active or inactive level.
param TIMx (The input parameters must be the following values):
- TIM1
- TIM3
- TIM4
param TIM_ForcedAction
- TIM_FORCED_ACTION_ACTIVE
- TIM_FORCED_ACTION_INACTIVE
return none
void TIM_ConfigForcedOc2(TIM_Module* TIMx, uint32_t TIM_ForcedAction)将 TIMx 输出 2 的波形强制为有效或无效电平。
name TIM_ConfigForcedOc2
fun Forces the TIMx output 2 waveform to active or inactive level.
param TIMx (The input parameters must be the following values):
- TIM1
- TIM3
- TIM4
param TIM_ForcedAction
- TIM_FORCED_ACTION_ACTIVE
- TIM_FORCED_ACTION_INACTIVE
return none
void TIM_ConfigForcedOc3(TIM_Module* TIMx, uint32_t TIM_ForcedAction)将 TIMx 输出 3 的波形强制为有效或无效电平。
name TIM_ConfigForcedOc3
fun Forces the TIMx output 3 waveform to active or inactive level.
param TIMx (The input parameters must be the following values):
- TIM1
- TIM3
- TIM4
param TIM_ForcedAction
- TIM_FORCED_ACTION_ACTIVE
- TIM_FORCED_ACTION_INACTIVE
return none
void TIM_ConfigForcedOc4(TIM_Module* TIMx, uint32_t TIM_ForcedAction)将 TIMx 输出 4 的波形强制为有效或无效电平。
name TIM_ConfigForcedOc4
fun Forces the TIMx output 4 waveform to active or inactive level.
param TIMx (The input parameters must be the following values):
- TIM1
- TIM3
param TIM_ForcedAction
- TIM_FORCED_ACTION_ACTIVE
- TIM_FORCED_ACTION_INACTIVE
return none
void TIM_ConfigForcedOc5(TIM_Module* TIMx, uint32_t TIM_ForcedAction)将 TIMx 输出 5 的波形强制为有效或无效电平。
name TIM_ConfigForcedOc5
fun Forces the TIMx output 5 waveform to active or inactive level.
param TIMx (The input parameters must be the following values):
- TIM1
param TIM_ForcedAction
- TIM_FORCED_ACTION_ACTIVE
- TIM_FORCED_ACTION_INACTIVE
return none
void TIM_ConfigForcedOc6(TIM_Module* TIMx, uint32_t TIM_ForcedAction)将 TIMx 输出 6 的波形强制为有效或无效电平。
name TIM_ConfigForcedOc6
fun Forces the TIMx output 6 waveform to active or inactive level.
param TIMx (The input parameters must be the following values):
- TIM1
param TIM_ForcedAction
- TIM_FORCED_ACTION_ACTIVE
- TIM_FORCED_ACTION_INACTIVE
return none
void TIM_ConfigForcedOc7(TIM_Module* TIMx, uint32_t TIM_ForcedAction)将 TIMx 输出 7 的波形强制为有效或无效电平。
name TIM_ConfigForcedOc7
fun Forces the TIMx output 7 waveform to active or inactive level.
param TIMx (The input parameters must be the following values):
- TIM1
param TIM_ForcedAction
- TIM_FORCED_ACTION_ACTIVE
- TIM_FORCED_ACTION_INACTIVE
return none
void TIM_ConfigArPreload(TIM_Module* TIMx, FunctionalState Cmd)使能或禁止 TIMx 在 AR 上的预装载寄存器。
name TIM_ConfigArPreload
fun Enables or disables TIMx peripheral Preload register on AR.
param TIMx (The input parameters must be the following values):
- TIM1
- TIM3
- TIM4
- TIM6
param Cmd
- ENABLE
- DISABLE
return none
void TIM_SelectComEvt(TIM_Module* TIMx, FunctionalState Cmd)选择 TIM 外设的换相事件。
name TIM_SelectComEvt
fun Selects the TIM peripheral Commutation event.
param TIMx (The input parameters must be the following values):
- TIM1
param Cmd
- ENABLE
- DISABLE
return none
void TIM_SelectCapCmpDmaSrc(TIM_Module* TIMx, FunctionalState Cmd)选择 TIMx 外设的捕获比较 DMA 源。
name TIM_SelectCapCmpDmaSrc
fun Selects the TIMx peripheral Capture Compare DMA source.
param TIMx (The input parameters must be the following values):
- TIM1
- TIM3
- TIM4
param Cmd
- ENABLE
- DISABLE
return none
void TIM_EnableCapCmpPreloadControl(TIM_Module* TIMx, FunctionalState Cmd)置位或复位 TIM 外设的捕获比较预装载控制位。
name TIM_EnableCapCmpPreloadControl
fun Sets or Resets the TIM peripheral Capture Compare Preload Control bit.
param TIMx (The input parameters must be the following values):
- TIM1
param Cmd
- ENABLE
- DISABLE
return none
void TIM_ConfigOc1Preload(TIM_Module* TIMx, uint32_t TIM_OCPreload)使能或禁止 TIMx 在 CCDAT1 上的预装载寄存器。
name TIM_ConfigOc1Preload
fun Enables or disables the TIMx peripheral Preload register on CCDAT1.
param TIMx (The input parameters must be the following values):
- TIM1
- TIM3
- TIM4
param TIM_OCPreload
- TIM_OC_PRE_LOAD_ENABLE
- TIM_OC_PRE_LOAD_DISABLE
return none
void TIM_ConfigOc2Preload(TIM_Module* TIMx, uint32_t TIM_OCPreload)使能或禁止 TIMx 在 CCDAT2 上的预装载寄存器。
name TIM_ConfigOc2Preload
fun Enables or disables the TIMx peripheral Preload register on CCDAT2.
param TIMx (The input parameters must be the following values):
- TIM1
- TIM3
- TIM4
param TIM_OCPreload
- TIM_OC_PRE_LOAD_ENABLE
- TIM_OC_PRE_LOAD_DISABLE
return none
void TIM_ConfigOc3Preload(TIM_Module* TIMx, uint32_t TIM_OCPreload)使能或禁止 TIMx 在 CCDAT3 上的预装载寄存器。
name TIM_ConfigOc3Preload
fun Enables or disables the TIMx peripheral Preload register on CCDAT3.
param TIMx (The input parameters must be the following values):
- TIM1
- TIM3
- TIM4
param TIM_OCPreload
- TIM_OC_PRE_LOAD_ENABLE
- TIM_OC_PRE_LOAD_DISABLE
return none
void TIM_ConfigOc4Preload(TIM_Module* TIMx, uint32_t TIM_OCPreload)使能或禁止 TIMx 在 CCDAT4 上的预装载寄存器。
name TIM_ConfigOc4Preload
fun Enables or disables the TIMx peripheral Preload register on CCDAT4.
param TIMx (The input parameters must be the following values):
- TIM1
- TIM3
param TIM_OCPreload
- TIM_OC_PRE_LOAD_ENABLE
- TIM_OC_PRE_LOAD_DISABLE
return none
void TIM_ConfigOc5Preload(TIM_Module* TIMx, uint32_t TIM_OCPreload)使能或禁止 TIMx 在 CCDAT5 上的预装载寄存器。
name TIM_ConfigOc5Preload
fun Enables or disables the TIMx peripheral Preload register on CCDAT5.
param TIMx (The input parameters must be the following values):
- TIM1
param TIM_OCPreload
- TIM_OC_PRE_LOAD_ENABLE
- TIM_OC_PRE_LOAD_DISABLE
return none
void TIM_ConfigOc6Preload(TIM_Module* TIMx, uint32_t TIM_OCPreload)使能或禁止 TIMx 在 CCDAT6 上的预装载寄存器。
name TIM_ConfigOc6Preload
fun Enables or disables the TIMx peripheral Preload register on CCDAT6.
param TIMx (The input parameters must be the following values):
- TIM1
param TIM_OCPreload
- TIM_OC_PRE_LOAD_ENABLE
- TIM_OC_PRE_LOAD_DISABLE
return none
void TIM_ConfigOc7Preload(TIM_Module* TIMx, uint32_t TIM_OCPreload)使能或禁止 TIMx 在 CCDAT6 上的预装载寄存器。
name TIM_ConfigOc7Preload
fun Enables or disables the TIMx peripheral Preload register on CCDAT6.
param TIMx (The input parameters must be the following values):
- TIM1
param TIM_OCPreload
- TIM_OC_PRE_LOAD_ENABLE
- TIM_OC_PRE_LOAD_DISABLE
return none
void TIM_ConfigOc1Fast(TIM_Module* TIMx, uint32_t TIM_OCFast)配置 TIMx 输出比较 1 的快速功能。
name TIM_ConfigOc1Fast
fun Configures the TIMx Output Compare 1 Fast feature.
param TIMx (The input parameters must be the following values):
- TIM1
- TIM3
- TIM4
param TIM_OCPreload
- TIM_OC_FAST_ENABLE
- TIM_OC_FAST_DISABLE
return none
void TIM_ConfigOc2Fast(TIM_Module* TIMx, uint32_t TIM_OCFast)配置 TIMx 输出比较 2 的快速功能。
name TIM_ConfigOc2Fast
fun Configures the TIMx Output Compare 2 Fast feature.
param TIMx (The input parameters must be the following values):
- TIM1
- TIM3
- TIM4
param TIM_OCPreload
- TIM_OC_FAST_ENABLE
- TIM_OC_FAST_DISABLE
return none
void TIM_ConfigOc3Fast(TIM_Module* TIMx, uint32_t TIM_OCFast)配置 TIMx 输出比较 3 的快速功能。
name TIM_ConfigOc3Fast
fun Configures the TIMx Output Compare 3 Fast feature.
param TIMx (The input parameters must be the following values):
- TIM1
- TIM3
- TIM4
param TIM_OCPreload
- TIM_OC_FAST_ENABLE
- TIM_OC_FAST_DISABLE
return none
void TIM_ConfigOc4Fast(TIM_Module* TIMx, uint32_t TIM_OCFast)配置 TIMx 输出比较 4 的快速功能。
name TIM_ConfigOc4Fast
fun Configures the TIMx Output Compare 4 Fast feature.
param TIMx (The input parameters must be the following values):
- TIM1
- TIM3
param TIM_OCPreload
- TIM_OC_FAST_ENABLE
- TIM_OC_FAST_DISABLE
return none
void TIM_ConfigOc5Fast(TIM_Module* TIMx, uint32_t TIM_OCFast)配置 TIMx 输出比较 5 的快速功能。
name TIM_ConfigOc5Fast
fun Configures the TIMx Output Compare 5 Fast feature.
param TIMx (The input parameters must be the following values):
- TIM1
param TIM_OCPreload
- TIM_OC_FAST_ENABLE
- TIM_OC_FAST_DISABLE
return none
void TIM_ConfigOc6Fast(TIM_Module* TIMx, uint32_t TIM_OCFast)配置 TIMx 输出比较 6 的快速功能。
name TIM_ConfigOc6Fast
fun Configures the TIMx Output Compare 6 Fast feature.
param TIMx (The input parameters must be the following values):
- TIM1
param TIM_OCPreload
- TIM_OC_FAST_ENABLE
- TIM_OC_FAST_DISABLE
return none
void TIM_ConfigOc7Fast(TIM_Module* TIMx, uint32_t TIM_OCFast)配置 TIMx 输出比较 7 的快速功能。
name TIM_ConfigOc7Fast
fun Configures the TIMx Output Compare 7 Fast feature.
param TIMx (The input parameters must be the following values):
- TIM1
param TIM_OCPreload
- TIM_OC_FAST_ENABLE
- TIM_OC_FAST_DISABLE
return none
void TIM_ClrOc1Ref(TIM_Module* TIMx, uint32_t TIM_OCClear)在外部事件上清除或保护 OCREF1 信号。
name TIM_ClrOc1Ref
fun Clears or safeguards the OCREF1 signal on an external event
param TIMx (The input parameters must be the following values):
- TIM1
- TIM3
- TIM4
param TIM_OCPreload
- TIM_OC_CLR_ENABLE
- TIM_OC_CLR_DISABLE
return none
void TIM_ClrOc2Ref(TIM_Module* TIMx, uint32_t TIM_OCClear)在外部事件上清除或保护 OCREF2 信号。
name TIM_ClrOc2Ref
fun Clears or safeguards the OCREF2 signal on an external event
param TIMx (The input parameters must be the following values):
- TIM1
- TIM3
- TIM4
param TIM_OCPreload
- TIM_OC_CLR_ENABLE
- TIM_OC_CLR_DISABLE
return none
void TIM_ClrOc3Ref(TIM_Module* TIMx, uint32_t TIM_OCClear)在外部事件上清除或保护 OCREF3 信号。
name TIM_ClrOc3Ref
fun Clears or safeguards the OCREF3 signal on an external event
param TIMx (The input parameters must be the following values):
- TIM1
- TIM3
- TIM4
param TIM_OCPreload
- TIM_OC_CLR_ENABLE
- TIM_OC_CLR_DISABLE
return none
void TIM_ClrOc4Ref(TIM_Module* TIMx, uint32_t TIM_OCClear)在外部事件上清除或保护 OCREF4 信号。
name TIM_ClrOc4Ref
fun Clears or safeguards the OCREF4 signal on an external event
param TIMx (The input parameters must be the following values):
- TIM1
- TIM3
param TIM_OCPreload
- TIM_OC_CLR_ENABLE
- TIM_OC_CLR_DISABLE
return none
void TIM_ClrOc5Ref(TIM_Module* TIMx, uint32_t TIM_OCClear)在外部事件上清除或保护 OCREF5 信号。
name TIM_ClrOc5Ref
fun Clears or safeguards the OCREF5 signal on an external event
param TIMx (The input parameters must be the following values):
- TIM1
param TIM_OCPreload
- TIM_OC_CLR_ENABLE
- TIM_OC_CLR_DISABLE
return none
void TIM_ClrOc6Ref(TIM_Module* TIMx, uint32_t TIM_OCClear)在外部事件上清除或保护 OCREF6 信号。
name TIM_ClrOc6Ref
fun Clears or safeguards the OCREF6 signal on an external event
param TIMx (The input parameters must be the following values):
- TIM1
param TIM_OCPreload
- TIM_OC_CLR_ENABLE
- TIM_OC_CLR_DISABLE
return none
void TIM_ClrOc7Ref(TIM_Module* TIMx, uint32_t TIM_OCClear)在外部事件上清除或保护 OCREF7 信号。
name TIM_ClrOc7Ref
fun Clears or safeguards the OCREF7 signal on an external event
param TIMx (The input parameters must be the following values):
- TIM1
param TIM_OCPreload
- TIM_OC_CLR_ENABLE
- TIM_OC_CLR_DISABLE
return none
void TIM_ClrOcRefInputSource(TIM_Module* TIMx, uint32_t OCRefClearInputSource)设置 OCREF 清除输入源。
name TIM_ClrOcRefInputSource
fun Set the OCREF clear input source
param TIMx (The input parameters must be the following values):
- TIM1
- TIM3
- TIM4
param OCRefClearInputSource
- TIM_ETRSEL
- TIM_COMPSEL
return none
void TIM_ConfigOc1Polarity(TIM_Module* TIMx, uint32_t OcPolarity)配置 TIMx 通道 1 的极性。
name TIM_ConfigOc1Polarity
fun Configures the TIMx channel 1 polarity.
param TIMx (The input parameters must be the following values):
- TIM1
- TIM3
- TIM4
param TIM_OCPreload
- TIM_OC_POLARITY_HIGH
- TIM_OC_POLARITY_LOW
return none
void TIM_ConfigOc1NPolarity(TIM_Module* TIMx, uint32_t OcNPolarity)配置 TIMx 通道 1N 的极性。
name TIM_ConfigOc1NPolarity
fun Configures the TIMx channel 1N polarity.
param TIMx (The input parameters must be the following values):
- TIM1
param TIM_OCPreload
- TIM_OCN_POLARITY_HIGH
- TIM_OCN_POLARITY_LOW
return none
void TIM_ConfigOc2Polarity(TIM_Module* TIMx, uint32_t OcPolarity)配置 TIMx 通道 2 的极性。
name TIM_ConfigOc2Polarity
fun Configures the TIMx channel 2 polarity.
param TIMx (The input parameters must be the following values):
- TIM1
- TIM3
- TIM4
param TIM_OCPreload
- TIM_OC_POLARITY_HIGH
- TIM_OC_POLARITY_LOW
return none
void TIM_ConfigOc2NPolarity(TIM_Module* TIMx, uint32_t OcNPolarity)配置 TIMx 通道 2N 的极性。
name TIM_ConfigOc2NPolarity
fun Configures the TIMx channel 2N polarity.
param TIMx (The input parameters must be the following values):
- TIM1
param TIM_OCPreload
- TIM_OCN_POLARITY_HIGH
- TIM_OCN_POLARITY_LOW
return none
void TIM_ConfigOc3Polarity(TIM_Module* TIMx, uint32_t OcPolarity)配置 TIMx 通道 3 的极性。
name TIM_ConfigOc3Polarity
fun Configures the TIMx channel 3 polarity.
param TIMx (The input parameters must be the following values):
- TIM1
- TIM3
- TIM4
param TIM_OCPreload
- TIM_OC_POLARITY_HIGH
- TIM_OC_POLARITY_LOW
return none
void TIM_ConfigOc3NPolarity(TIM_Module* TIMx, uint32_t OcNPolarity)配置 TIMx 通道 3N 的极性。
name TIM_ConfigOc3NPolarity
fun Configures the TIMx channel 3N polarity.
param TIMx (The input parameters must be the following values):
- TIM1
param TIM_OCPreload
- TIM_OCN_POLARITY_HIGH
- TIM_OCN_POLARITY_LOW
return none
void TIM_ConfigOc4Polarity(TIM_Module* TIMx, uint32_t OcPolarity)配置 TIMx 通道 4 的极性。
name TIM_ConfigOc4Polarity
fun Configures the TIMx channel 4 polarity.
param TIMx (The input parameters must be the following values):
- TIM1
- TIM3
param TIM_OCPreload
- TIM_OC_POLARITY_HIGH
- TIM_OC_POLARITY_LOW
return none
void TIM_ConfigOc4NPolarity(TIM_Module* TIMx, uint32_t OcNPolarity)配置 TIMx 通道 4N 的极性。
name TIM_ConfigOc4NPolarity
fun Configures the TIMx channel 4N polarity.
param TIMx (The input parameters must be the following values):
- TIM1
param TIM_OCPreload
- TIM_OCN_POLARITY_HIGH
- TIM_OCN_POLARITY_LOW
return none
void TIM_ConfigOc5Polarity(TIM_Module* TIMx, uint32_t OcPolarity)配置 TIMx 通道 5 的极性。
name TIM_ConfigOc5Polarity
fun Configures the TIMx channel 5 polarity.
param TIMx (The input parameters must be the following values):
- TIM1
param TIM_OCPreload
- TIM_OC_POLARITY_HIGH
- TIM_OC_POLARITY_LOW
return none
void TIM_ConfigOc6Polarity(TIM_Module* TIMx, uint32_t OcPolarity)配置 TIMx 通道 6 的极性。
name TIM_ConfigOc6Polarity
fun Configures the TIMx channel 6 polarity.
param TIMx (The input parameters must be the following values):
- TIM1
param TIM_OCPreload
- TIM_OC_POLARITY_HIGH
- TIM_OC_POLARITY_LOW
return none
void TIM_ConfigOc7Polarity(TIM_Module* TIMx, uint32_t OcPolarity)配置 TIMx 通道 7 的极性。
name TIM_ConfigOc7Polarity
fun Configures the TIMx channel 7 polarity.
param TIMx (The input parameters must be the following values):
- TIM1
param TIM_OCPreload
- TIM_OC_POLARITY_HIGH
- TIM_OC_POLARITY_LOW
return none
void TIM_EnableCapCmpCh(TIM_Module* TIMx, uint32_t Channel, uint32_t TIM_CCx)使能或禁止 TIM 捕获比较通道 x。
name TIM_EnableCapCmpCh
fun Enables or disables the TIM Capture Compare Channel x.
param TIMx (The input parameters must be the following values):
- TIM1
- TIM3
- TIM4
param Channel
- TIM_CH_1
- TIM_CH_2
- TIM_CH_3
- TIM_CH_4
- TIM_CH_5
- TIM_CH_6
- TIM_CH_7
param TIM_CCx
- TIM_CAP_CMP_ENABLE
- TIM_CAP_CMP_DISABLE
return none
void TIM_EnableCapCmpChN(TIM_Module* TIMx, uint32_t Channel, uint32_t TIM_CCxN)使能或禁止 TIM 捕获比较通道 xN。
name TIM_EnableCapCmpChN
fun Enables or disables the TIM Capture Compare Channel xN.
param TIMx (The input parameters must be the following values):
- TIM1
param Channel
- TIM_CH_1
- TIM_CH_2
- TIM_CH_3
- TIM_CH_4
param TIM_CCx
- TIM_CAP_CMP_N_ENABLE
- TIM_CAP_CMP_N_DISABLE
return none
void TIM_SelectOcMode(TIM_Module* TIMx, uint32_t Channel, uint32_t OcMode)选择 TIM 输出比较模式。
name TIM_SelectOcMode
fun Selects the TIM Output Compare Mode.
param TIMx (The input parameters must be the following values):
- TIM1
- TIM3
- TIM4
param Channel
- TIM_CH_1
- TIM_CH_2
- TIM_CH_3
- TIM_CH_4
- TIM_CH_5
- TIM_CH_6
- TIM_CH_7
param OcMode
- TIM_OCMODE_TIMING
- TIM_OCMODE_ACTIVE
- TIM_OCMODE_INACTIVE
- TIM_OCMODE_TOGGLE
- TIM_OCMODE_PWM1
- TIM_OCMODE_PWM2
- TIM_FORCED_ACTION_ACTIVE
- TIM_FORCED_ACTION_INACTIVE
return none
void TIM_EnableUpdateEvt(TIM_Module* TIMx, FunctionalState Cmd)使能或禁止 TIMx 更新事件。
name TIM_EnableUpdateEvt
fun Enables or Disables the TIMx Update event.
param TIMx (The input parameters must be the following values):
- TIM1
- TIM3
- TIM4
- TIM6
param Cmd
- ENABLE
- DISABLE
return none
void TIM_ConfigUpdateEvt(TIM_Module* TIMx, FunctionalState Cmd)使能或禁止 TIMx 更新事件。
name TIM_ConfigUpdateEvt
fun Enables or Disables the TIMx Update event.
param TIMx (The input parameters must be the following values):
- TIM1
- TIM3
- TIM4
- TIM6
param Cmd
- ENABLE
- DISABLE
return none
void TIM_ConfigUpdateRequestIntSrc(TIM_Module* TIMx, uint32_t TIM_UpdateSource)配置 TIMx 更新请求中断源。
name TIM_ConfigUpdateRequestIntSrc
fun Configures the TIMx Update Request Interrupt source.
param TIMx (The input parameters must be the following values):
- TIM1
- TIM3
- TIM4
- TIM6
param TIM_UpdateSource
- TIM_UPDATE_SRC_GLOBAL
- TIM_UPDATE_SRC_REGULAR
return none
void TIM_SelectHallSensor(TIM_Module* TIMx, FunctionalState Cmd)使能或禁止 TIMx 的霍尔传感器接口。
name TIM_SelectHallSensor
fun Enables or disables the TIMx's Hall sensor interface.
param TIMx (The input parameters must be the following values):
- TIM1
- TIM3
- TIM4
param Cmd
- ENABLE
- DISABLE
return none
void TIM_SelectOnePulseMode(TIM_Module* TIMx, uint32_t TIM_OPMode)选择 TIMx 的单脉冲模式。
name TIM_SelectOnePulseMode
fun Selects the TIMx's One Pulse Mode.
param TIMx (The input parameters must be the following values):
- TIM1
- TIM3
- TIM4
- TIM6
param TIM_OPMode
- TIM_OPMODE_SINGLE
- TIM_OPMODE_REPET
return none
void TIM_SelectOutputTrig(TIM_Module* TIMx, uint32_t TIM_TRGOSource)选择 TIMx 触发输出模式。
name TIM_SelectOutputTrig
fun Selects the TIMx Trigger Output Mode.
param TIMx (The input parameters must be the following values):
- TIM1
- TIM3
- TIM4
param TIM_TRGOSource
- TIM_TRGO_SRC_RESET
- TIM_TRGO_SRC_ENABLE
- TIM_TRGO_SRC_UPDATE
- TIM_TRGO_SRC_OC1
- TIM_TRGO_SRC_OC1REF
- TIM_TRGO_SRC_OC2REF
- TIM_TRGO_SRC_OC3REF
- TIM_TRGO_SRC_OC4REF
- TIM_TRGO_SRC_OC5REF
- TIM_TRGO_SRC_OC6REF
- TIM_TRGO_SRC_OC7REF
return none
void TIM_SelectSlaveMode(TIM_Module* TIMx, uint32_t TIM_SlaveMode)选择 TIMx 从模式。
name TIM_SelectSlaveMode
fun Selects the TIMx Slave Mode.
param TIMx (The input parameters must be the following values):
- TIM1
- TIM3
- TIM4
param TIM_SlaveMode
- TIM_SLAVE_MODE_DISABLE
- TIM_SLAVE_MODE_RESET
- TIM_SLAVE_MODE_GATED
- TIM_SLAVE_MODE_TRIG
- TIM_SLAVE_MODE_EXT1
- TIM_SLAVE_MODE_GATED_RESET
- TIM_SLAVE_MODE_TRIG_RESET
return none
void TIM_SelectMasterSlaveMode(TIM_Module* TIMx, uint32_t TIM_MasterSlaveMode)置位或复位 TIMx 主从模式。
name TIM_SelectMasterSlaveMode
fun Sets or Resets the TIMx Master/Slave Mode.
param TIMx (The input parameters must be the following values):
- TIM1
- TIM3
- TIM4
param TIM_SlaveMode
- TIM_MASTER_SLAVE_MODE_ENABLE
- TIM_MASTER_SLAVE_MODE_DISABLE
return none
void TIM_SetCnt(TIM_Module* TIMx, uint32_t Counter)设置 TIMx 计数器寄存器值。
name TIM_SetCnt
fun Sets the TIMx Counter Register value
param TIMx (The input parameters must be the following values):
- TIM1
- TIM3
- TIM4
- TIM6
param Counter
- Counter can be a number between 0x00000000 and 0xFFFFFFFF
return none
void TIM_SetAutoReload(TIM_Module* TIMx, uint32_t Autoreload)设置 TIMx 自动重装载寄存器值。
name TIM_SetAutoReload
fun Sets the TIMx Autoreload Register value
param TIMx (The input parameters must be the following values):
- TIM1
- TIM3
- TIM4
- TIM6
param Autoreload
- Autoreload can be a number between 0x00000000 and 0xFFFFFFFF
return none
void TIM_SetCmp1(TIM_Module* TIMx, uint32_t Compare1)设置 TIMx 捕获比较 1 寄存器值。
name TIM_SetCmp1
fun Sets the TIMx Capture Compare1 Register value
param TIMx (The input parameters must be the following values):
- TIM1
- TIM3
- TIM4
param Compare1
- Compare1 can be a number between 0x00000000 and 0xFFFFFFFF
return none
void TIM_SetCmp2(TIM_Module* TIMx, uint32_t Compare2)设置 TIMx 捕获比较 2 寄存器值。
name TIM_SetCmp2
fun Sets the TIMx Capture Compare2 Register value
param TIMx (The input parameters must be the following values):
- TIM1
- TIM3
- TIM4
param Compare2
- Compare2 can be a number between 0x00000000 and 0xFFFFFFFF
return none
void TIM_SetCmp3(TIM_Module* TIMx, uint32_t Compare3)设置 TIMx 捕获比较 3 寄存器值。
name TIM_SetCmp3
fun Sets the TIMx Capture Compare3 Register value
param TIMx (The input parameters must be the following values):
- TIM1
- TIM3
- TIM4
param Compare3
- Compare3 can be a number between 0x00000000 and 0xFFFFFFFF
return none
void TIM_SetCmp4(TIM_Module* TIMx, uint16_t Compare4)设置 TIMx 捕获比较 4 寄存器值。
name TIM_SetCmp4
fun Sets the TIMx Capture Compare4 Register value
param TIMx (The input parameters must be the following values):
- TIM1
- TIM3
param Compare4
- Compare4 can be a number between 0x0000 and 0xFFFF
return none
void TIM_SetCmp5(TIM_Module* TIMx, uint16_t Compare5)设置 TIMx 捕获比较 5 寄存器值。
name TIM_SetCmp5
fun Sets the TIMx Capture Compare5 Register value
param TIMx (The input parameters must be the following values):
- TIM1
param Compare5
- Compare5 can be a number between 0x0000 and 0xFFFF
return none
void TIM_SetCmp6(TIM_Module* TIMx, uint16_t Compare6)设置 TIMx 捕获比较 6 寄存器值。
name TIM_SetCmp6
fun Sets the TIMx Capture Compare6 Register value
param TIMx (The input parameters must be the following values):
- TIM1
param Compare6
- Compare6 can be a number between 0x0000 and 0xFFFF
return none
void TIM_SetCmp7(TIM_Module* TIMx, uint16_t Compare7)设置 TIMx 捕获比较 7 寄存器值。
name TIM_SetCmp7
fun Sets the TIMx Capture Compare7 Register value
param TIMx (The input parameters must be the following values):
- TIM1
param Compare7
- Compare7 can be a number between 0x0000 and 0xFFFF
return none
void TIM_SetCmp1D(TIM_Module* TIMx, uint16_t compare1D)设置 TIM1_CCDAT1 寄存器中的 CCDDAT1[16:31]。
name TIM_SetCmp1D
fun Sets the CCDDAT1[16:31] in TIM1_CCDAT1 register
param TIMx (The input parameters must be the following values):
- TIM1
param compare1D
- compare1D can be a number between 0x0000 and 0xFFFF
return none
void TIM_SetCmp2D(TIM_Module* TIMx, uint16_t compare2D)设置 TIM1_CCDAT2 寄存器中的 CCDDAT2[16:31]。
name TIM_SetCmp2D
fun Sets the CCDDAT2[16:31] in TIM1_CCDAT2 register
param TIMx (The input parameters must be the following values):
- TIM1
param compare2D
- compare2D can be a number between 0x0000 and 0xFFFF
return none
void TIM_SetCmp3D(TIM_Module* TIMx, uint16_t compare3D)设置 TIM1_CCDAT3 寄存器中的 CCDDAT3[16:31]。
name TIM_SetCmp3D
fun Sets the CCDDAT3[16:31] in TIM1_CCDAT3 register
param TIMx (The input parameters must be the following values):
- TIM1
param compare3D
- compare3D can be a number between 0x0000 and 0xFFFF
return none
void TIM_SetCmp4D(TIM_Module* TIMx, uint16_t compare4D)设置 TIM1_CCDAT4 寄存器中的 CCDDAT4[16:31]。
name TIM_SetCmp4D
fun Sets the CCDDAT4[16:31] in TIM1_CCDAT4 register
param TIMx (The input parameters must be the following values):
- TIM1
param compare4D
- compare4D can be a number between 0x0000 and 0xFFFF
return none
void ConfigTI1(TIM_Module* TIMx, uint32_t ICPolarity, uint32_t ICSelection, uint32_t ICFilter)将 TI1 配置为输入。
name ConfigTI1
fun Configure the TI1 as Input.
param TIMx (The input parameters must be the following values):
- TIM1
- TIM3
- TIM4
param ICPolarity
- TIM_IC_POLARITY_RISING
- TIM_IC_POLARITY_FALLING
param ICSelection
- TIM_IC_SELECTION_DIRECTTI
- TIM_IC_SELECTION_INDIRECTTI
- TIM_IC_SELECTION_TRC
param ICFilter
- ICFilter can be a number between 0x0 and 0xF
return none
void ConfigTI2(TIM_Module* TIMx, uint32_t ICPolarity, uint32_t ICSelection, uint32_t ICFilter)将 TI2 配置为输入。
name ConfigTI2
fun Configure the TI2 as Input.
param TIMx (The input parameters must be the following values):
- TIM1
- TIM3
- TIM4
param ICPolarity
- TIM_IC_POLARITY_RISING
- TIM_IC_POLARITY_FALLING
param ICSelection
- TIM_IC_SELECTION_DIRECTTI
- TIM_IC_SELECTION_INDIRECTTI
- TIM_IC_SELECTION_TRC
param ICFilter
- ICFilter can be a number between 0x0 and 0xF
return none
void ConfigTI3(TIM_Module* TIMx, uint32_t ICPolarity, uint32_t ICSelection, uint32_t ICFilter)将 TI3 配置为输入。
name ConfigTI3
fun Configure the TI3 as Input.
param TIMx (The input parameters must be the following values):
- TIM1
- TIM3
- TIM4
param ICPolarity
- TIM_IC_POLARITY_RISING
- TIM_IC_POLARITY_FALLING
param ICSelection
- TIM_IC_SELECTION_DIRECTTI
- TIM_IC_SELECTION_INDIRECTTI
- TIM_IC_SELECTION_TRC
param ICFilter
- ICFilter can be a number between 0x0 and 0xF
return none
void ConfigTI4(TIM_Module* TIMx, uint32_t ICPolarity, uint32_t ICSelection, uint32_t ICFilter)将 TI4 配置为输入。
name ConfigTI4
fun Configure the TI4 as Input.
param TIMx (The input parameters must be the following values):
- TIM1
- TIM3
param ICPolarity
- TIM_IC_POLARITY_RISING
- TIM_IC_POLARITY_FALLING
param ICSelection
- TIM_IC_SELECTION_DIRECTTI
- TIM_IC_SELECTION_INDIRECTTI
- TIM_IC_SELECTION_TRC
param ICFilter
- ICFilter can be a number between 0x0 and 0xF
return none
void TIM_SetInCap1Prescaler(TIM_Module* TIMx, uint32_t ICPrescaler)设置 TIMx 输入捕获 1 的预分频器。
name TIM_SetInCap1Prescaler
fun Sets the TIMx Input Capture 1 prescaler.
param TIMx (The input parameters must be the following values):
- TIM1
- TIM3
- TIM4
param ICPrescaler
- TIM_IC_PSC_DIV1
- TIM_IC_PSC_DIV2
- TIM_IC_PSC_DIV4
- TIM_IC_PSC_DIV8
return none
void TIM_SetInCap2Prescaler(TIM_Module* TIMx, uint32_t ICPrescaler)设置 TIMx 输入捕获 2 的预分频器。
name TIM_SetInCap2Prescaler
fun Sets the TIMx Input Capture 2 prescaler.
param TIMx (The input parameters must be the following values):
- TIM1
- TIM3
- TIM4
param ICPrescaler
- TIM_IC_PSC_DIV1
- TIM_IC_PSC_DIV2
- TIM_IC_PSC_DIV4
- TIM_IC_PSC_DIV8
return none
void TIM_SetInCap3Prescaler(TIM_Module* TIMx, uint32_t ICPrescaler)设置 TIMx 输入捕获 3 的预分频器。
name TIM_SetInCap3Prescaler
fun Sets the TIMx Input Capture 3 prescaler.
param TIMx (The input parameters must be the following values):
- TIM1
- TIM3
- TIM4
param ICPrescaler
- TIM_IC_PSC_DIV1
- TIM_IC_PSC_DIV2
- TIM_IC_PSC_DIV4
- TIM_IC_PSC_DIV8
return none
void TIM_SetInCap4Prescaler(TIM_Module* TIMx, uint32_t ICPrescaler)设置 TIMx 输入捕获 4 的预分频器。
name TIM_SetInCap4Prescaler
fun Sets the TIMx Input Capture 4 prescaler.
param TIMx (The input parameters must be the following values):
- TIM1
- TIM3
param ICPrescaler
- TIM_IC_PSC_DIV1
- TIM_IC_PSC_DIV2
- TIM_IC_PSC_DIV4
- TIM_IC_PSC_DIV8
return none
void TIM_SelectInputTrig(TIM_Module* TIMx, uint32_t TIM_InputTriggerSource)选择输入触发源。
name TIM_SelectInputTrig
fun Selects the Input Trigger source
param TIMx (The input parameters must be the following values):
- TIM1
- TIM3
- TIM4
param TIM_InputTriggerSource:
- TIM_TRIG_SEL_IN_TR0
- TIM_TRIG_SEL_IN_TR1
- TIM_TRIG_SEL_IN_TR2
- TIM_TRIG_SEL_IN_TR3
- TIM_TRIG_SEL_TI1F_ED
- TIM_TRIG_SEL_TI1FP1
- TIM_TRIG_SEL_TI2FP2
- TIM_TRIG_SEL_ETRF
return none
void TIM_ConfigExtTrig(TIM_Module* TIMx,uint32_t TIM_ExtTRGPrescaler,uint32_t TIM_ExtTRGPolarity,uint32_t ExtTRGFilter)配置 TIMx 外部触发(ETR)。
name TIM_ConfigExtTrig
fun Configures the TIMx External Trigger (ETR).
param TIMx (The input parameters must be the following values):
- TIM1
- TIM3
- TIM4
param TIM_ExtTRGPrescaler:
- TIM_EXT_TRG_PSC_OFF
- TIM_EXT_TRG_PSC_DIV2
- TIM_EXT_TRG_PSC_DIV4
- TIM_EXT_TRG_PSC_DIV8
param TIM_ExtTRGPolarity
- TIM_EXT_TRIG_POLARITY_INVERTED
- TIM_EXT_TRIG_POLARITY_NONINVERTED
param ExtTRGFilter
- ExtTRGFilter can be a number between 0x0 and 0xF
return none
void TIM_SetClkDiv(TIM_Module* TIMx, uint32_t TIM_CKD)设置 TIMx 时钟分频值。
name TIM_SetClkDiv
fun Sets the TIMx Clock Division value.
param TIMx (The input parameters must be the following values):
- TIM1
param TIM_CKD:
- TIM_CLK_DIV1
- TIM_CLK_DIV2
- TIM_CLK_DIV4
return none
uint32_t TIM_GetCap1(TIM_Module* TIMx)获取 TIMx 输入捕获 1 的值。
name TIM_GetCap1
fun Gets the TIMx Input Capture 1 value.
param TIMx (The input parameters must be the following values):
- TIM1
- TIM3
- TIM4
return Capture Compare 1 Register value.
uint32_t TIM_GetCap2(TIM_Module* TIMx)获取 TIMx 输入捕获 2 的值。
name TIM_GetCap2
fun Gets the TIMx Input Capture 2 value.
param TIMx (The input parameters must be the following values):
- TIM1
- TIM3
- TIM4
return Capture Compare 2 Register value.
uint32_t TIM_GetCap3(TIM_Module* TIMx)获取 TIMx 输入捕获 3 的值。
name TIM_GetCap3
fun Gets the TIMx Input Capture 3 value.
param TIMx (The input parameters must be the following values):
- TIM1
- TIM3
- TIM4
return Capture Compare 3 Register value.
uint16_t TIM_GetCap4(TIM_Module* TIMx)获取 TIMx 输入捕获 4 的值。
name TIM_GetCap4
fun Gets the TIMx Input Capture 4 value.
param TIMx (The input parameters must be the following values):
- TIM1
- TIM3
return Capture Compare 4 Register value.
uint16_t TIM_GetCap5(TIM_Module* TIMx)获取 TIMx 输入捕获 5 的值。
name TIM_GetCap5
fun Gets the TIMx Input Capture 5 value.
param TIMx (The input parameters must be the following values):
- TIM1
return Capture Compare 5 Register value.
uint16_t TIM_GetCap6(TIM_Module* TIMx)获取 TIMx 输入捕获 6 的值。
name TIM_GetCap6
fun Gets the TIMx Input Capture 6 value.
param TIMx (The input parameters must be the following values):
- TIM1
return Capture Compare 6 Register value.
uint16_t TIM_GetCap7(TIM_Module* TIMx)获取 TIMx 输入捕获 7 的值。
name TIM_GetCap7
fun Gets the TIMx Input Capture 7 value.
param TIMx (The input parameters must be the following values):
- TIM1
return Capture Compare 7 Register value.
uint16_t TIM_GetCap1D(TIM_Module* TIMx)获取 TIMx 输入捕获 1D 的值。
name TIM_GetCap1D
fun Gets the TIMx Input Capture 1D value.
param TIMx (The input parameters must be the following values):
- TIM1
return Capture Compare 1D Register value.
uint16_t TIM_GetCap2D(TIM_Module* TIMx)获取 TIMx 输入捕获 2D 的值。
name TIM_GetCap2D
fun Gets the TIMx Input Capture 2D value.
param TIMx (The input parameters must be the following values):
- TIM1
return Capture Compare 2D Register value.
uint16_t TIM_GetCap3D(TIM_Module* TIMx)获取 TIMx 输入捕获 3D 的值。
name TIM_GetCap3D
fun Gets the TIMx Input Capture 3D value.
param TIMx (The input parameters must be the following values):
- TIM1
return Capture Compare 3D Register value.
uint16_t TIM_GetCap4D(TIM_Module* TIMx)获取 TIMx 输入捕获 4D 的值。
name TIM_GetCap4D
fun Gets the TIMx Input Capture 4D value.
param TIMx (The input parameters must be the following values):
- TIM1
return Capture Compare 4D Register value.
uint32_t TIM_GetCnt(TIM_Module* TIMx)获取 TIMx 计数器值。
name TIM_GetCnt
fun Gets the TIMx Counter value.
param TIMx (The input parameters must be the following values):
- TIM1
- TIM3
- TIM4
- TIM6
return Counter Register value.
uint16_t TIM_GetPrescaler(TIM_Module* TIMx)获取 TIMx 预分频器值。
name TIM_GetPrescaler
fun Gets the TIMx Prescaler value.
param TIMx (The input parameters must be the following values):
- TIM1
- TIM3
- TIM4
- TIM6
return Prescaler Register value.
uint32_t TIM_GetAutoReload(TIM_Module* TIMx)获取 TIMx AR 值。
name TIM_GetAutoReload
fun Gets the TIMx AR value.
param TIMx (The input parameters must be the following values):
- TIM1
- TIM3
- TIM4
- TIM6
return AR Register value.
FlagStatus TIM_GetCCENStatus(TIM_Module* TIMx, uint32_t TIM_CCEN)检查指定的 TIM 标志是否置位。
name TIM_GetCCENStatus
fun Checks whether the specified TIM flag is set or not.
param TIMx (The input parameters must be the following values):
- TIM1
- TIM3
- TIM4
param TIM_CCEN :
- TIM_CC1EN
- TIM_CC1NEN
- TIM_CC2EN
- TIM_CC2NEN
- TIM_CC3EN
- TIM_CC3NEN
- TIM_CC4EN
- TIM_CC4NEN
- TIM_CC5EN
- TIM_CC6EN
- TIM_CC7EN
return The new state of TIM_FLAG (SET or RESET).
FlagStatus TIM_GetFlagStatus(TIM_Module* TIMx, uint32_t TIM_FLAG)检查指定的 TIM 标志是否置位。
name TIM_GetFlagStatus
fun Checks whether the specified TIM flag is set or not.
param TIMx (The input parameters must be the following values):
- TIM1
- TIM3
- TIM4
- TIM6
param TIM_FLAG :
- TIM_FLAG_CC1
- TIM_FLAG_CC2
- TIM_FLAG_CC3
- TIM_FLAG_CC4
- TIM_FLAG_CC5
- TIM_FLAG_CC6
- TIM_FLAG_CC7
- TIM_FLAG_CC1OF
- TIM_FLAG_CC2OF
- TIM_FLAG_CC3OF
- TIM_FLAG_CC4OF
- TIM_FLAG_UPDATE
- TIM_FLAG_COM
- TIM_FLAG_TRIG
- TIM_FLAG_BREAK
- TIM_FLAG_LBKP
- TIM_FLAG_PBKP
- TIM_FLAG_COMP
- TIM_FLAG_IOM
- TIM_FLAG_C3LDCNT
return The new state of TIM_FLAG (SET or RESET).
void TIM_ClearFlag(TIM_Module* TIMx, uint32_t TIM_FLAG)清除 TIMx 的挂起标志。
name TIM_ClearFlag
fun Clears the TIMx's pending flags.
param TIMx (The input parameters must be the following values):
- TIM1
- TIM3
- TIM4
- TIM6
param TIM_FLAG :
- TIM_FLAG_CC1
- TIM_FLAG_CC2
- TIM_FLAG_CC3
- TIM_FLAG_CC4
- TIM_FLAG_CC5
- TIM_FLAG_CC6
- TIM_FLAG_CC7
- TIM_FLAG_CC1OF
- TIM_FLAG_CC2OF
- TIM_FLAG_CC3OF
- TIM_FLAG_CC4OF
- TIM_FLAG_UPDATE
- TIM_FLAG_COM
- TIM_FLAG_TRIG
- TIM_FLAG_BREAK
- TIM_FLAG_LBKP
- TIM_FLAG_PBKP
- TIM_FLAG_COMP
- TIM_FLAG_IOM
- TIM_FLAG_C3LDCNT
return none.
INTStatus TIM_GetIntStatus(TIM_Module* TIMx, uint32_t TIM_IT)检查 TIM 中断是否发生。
name TIM_GetIntStatus
fun Checks whether the TIM interrupt has occurred or not.
param TIMx (The input parameters must be the following values):
- TIM1
- TIM3
- TIM4
- TIM6
param TIM_IT :
- TIM_INT_UPDATE
- TIM_INT_CC1
- TIM_INT_CC2
- TIM_INT_CC3
- TIM_INT_CC4
- TIM_INT_CC5
- TIM_INT_CC6
- TIM_INT_CC7
- TIM_INT_C3LDCNT
- TIM_INT_COM
- TIM_INT_TRIG
- TIM_INT_BREAK
return The new state of the TIM_IT(SET or RESET).
void TIM_ClrIntPendingBit(TIM_Module* TIMx, uint32_t TIM_IT)清除 TIMx 的中断挂起位。
name TIM_ClrIntPendingBit
fun Clears the TIMx's interrupt pending bits.
param TIMx (The input parameters must be the following values):
- TIM1
- TIM3
- TIM4
- TIM6
param TIM_IT :
- TIM_INT_UPDATE
- TIM_INT_CC1
- TIM_INT_CC2
- TIM_INT_CC3
- TIM_INT_CC4
- TIM_INT_CC5
- TIM_INT_CC6
- TIM_INT_CC7
- TIM_INT_C3LDCNT
- TIM_INT_COM
- TIM_INT_TRIG
- TIM_INT_BREAK
return none.
void TIM_AsymmetricEnable(TIM_Module* TIMx, FunctionalState Cmd)在中心对齐模式下使能或禁止非对称模式。
name TIM_Asymmetric_Enable.
fun Enable or disable asymmetric mode in center-aligned.
param TIMx:
- TIM1
param Cmd
- ENABLE
- DISABLE
return none
使用提示: 本函数在 n32g033_tim.h 第 713 行声明;其正上方注释的 name 行为 TIM_Asymmetric_Enable.,与函数名 TIM_AsymmetricEnable 不一致,功能说明以 fun 行为准。
void TIM_IC1FiltConfig(TIM_Module* TIMx, TIM_FiltInitType* TIM_FiltInitStruct)配置通道 1 的滤波器。
name TIM_IC1FiltConfig
fun Config the filter of channel1.
param TIMx:
- TIM4
param TIM_FiltInitStruct:
- refer to the definition of TIM_FiltInitType
return none
void TIM_IC2FiltConfig(TIM_Module* TIMx, TIM_FiltInitType* TIM_FiltInitStruct)配置通道 2 的滤波器。
name TIM_IC2FiltConfig
fun Config the filter of channel2.
param TIMx:
- TIM4
param TIM_FiltInitStruct:
- refer to the definition of TIM_FiltInitType
return none
void TIM_IC3FiltConfig(TIM_Module* TIMx, TIM_FiltInitType* TIM_FiltInitStruct)配置通道 3 的滤波器。
name TIM_IC3FiltConfig
fun Config the filter of channel3.
param TIMx:
- TIM4
param TIM_FiltInitStruct:
- refer to the definition of TIM_FiltInitType
return none
void TIM_IC1FiltEnable(TIM_Module* TIMx,FunctionalState Cmd)使能或禁止通道 1 的滤波器。
name TIM_IC1FiltEnable
fun Enable or disable the filter of channel1.
param TIMx:
- TIM4
param Cmd :
- ENABLE
- DISABLE
return none
void TIM_IC2FiltEnable(TIM_Module* TIMx,FunctionalState Cmd)使能或禁止通道 2 的滤波器。
name TIM_IC2FiltEnable
fun Enable or disable the filter of channel2.
param TIMx:
- TIM4
param Cmd :
- ENABLE
- DISABLE
return none
void TIM_IC3FiltEnable(TIM_Module* TIMx,FunctionalState Cmd)使能或禁止通道 3 的滤波器。
name TIM_IC3FiltEnable
fun Enable or disable the filter of channel3.
param TIMx:
- TIM4
param Cmd :
- ENABLE
- DISABLE
return none
FlagStatus TIM_GetFiltStatus(TIM_Module* TIMx, uint32_t TIM_FiltFlag)检查指定的滤波器状态。
name TIM_GetFiltStatus
fun Checks the specified filter status.
param TIMx (The input parameters must be the following values):
- TIM4
param TIM_FiltFlag :
- TIM_C1FILTO
- TIM_C2FILTO
- TIM_C3FILTO
return The new state of TIM_FiltFlag (SET or RESET).
void TIM_TrgiLoadLvrToCNTEnable(FunctionalState Cmd)TRGI 信号触发将 ENCLVR 值装载到 CNT。
name TIM_TrgiLoadLvrToCNTEnable
fun The TRGI signal triggers the loading of the ENCLVR value into the CNT.
param Cmd :
- ENABLE
- DISABLE
return none
note only for TIM3
uint32_t TIM_GetLVR(TIM_Module* TIMx)获取 TIMx 的 LVR 值。
name TIM_GetLVR
fun Get the TIMx LVR value.
param TIMx (The input parameters must be the following values):
- TIM3
- TIM4
return ENCLVR Register value.
void TIM_CH3LoadLvrToCNTEnable(FunctionalState Cmd)CH3 触发将 ENCLVR 值装载到 CNT。
name TIM_CH3LoadLvrToCNTEnable
fun The CH3 triggers the loading of the ENCLVR value into the CNT.
param Cmd :
- ENABLE
- DISABLE
return none
note only for TIM4
void TIM_CH3LoadLvrToCNTPolarity(uint32_t Polarity)配置 CH3 极性以触发将 ENCLVR 值装载到 CNT。
name TIM_CH3LoadLvrToCNTPolarity
fun Config CH3 Polarity to trigger ENCLVR value loading into the CNT.
param Polarity :
- TIM_CH3_POLARITY_HIGH
- TIM_CH3_POLARITY_LOW
- TIM_CH3_POLARITY_RISING
- TIM_CH3_POLARITY_FALLING
return none
note only for TIM4
uint32_t TIM_GetENCDAT(TIM_Module* TIMx)获取 TIMx 的 ENCDAT 值。
name TIM_GetENCDAT
fun Gets the TIMx ENCDAT value.
param TIMx (The input parameters must be the following values):
- TIM4
return ENCDAT Register value.
uint32_t TIM_GetENCDATSign(TIM_Module* TIMx)获取 TIMx ENCDAT 值的符号。
name TIM_GetENCDATSign
fun Get the sign of TIMx ENCDAT value.
param TIMx (The input parameters must be the following values):
- TIM4
return Sign of TIMx ENCDAT value.
5.18.3 Demo 示例说明
本节说明 TIM 的 19 个示例:6Steps 用 SysTick 触发 COM 事件输出六步换相波形,ComplementarySignals 输出四对带死区和刹车的互补波形,DMA 用 DMA 循环改写比较值,DMABurst 用 DMA 突发一次改写周期与占空比,ExtTrigger_Synchro 用外部触发级联同步两个定时器,InputCapture 用输入捕获测频,OCActive 与 OCInactive 演示输出比较的置有效与置无效,OCToggle 在比较匹配时翻转输出,OnePulse 由外部沿触发单脉冲,PWM_Input 测量外部 PWM 的频率与占空比,PWM_Output 输出四路占空比不同的 PWM,TimeBase 用比较事件产生定时中断,TimeBasic_TIM1、TimeBasic_TIM3、TimeBasic_TIM4、TimeBasic_TIM6 用更新中断翻转 IO,TimeBasic6_wakeup 用 TIM6 的更新中断把芯片从 STOP 模式唤醒,TIMx_Synchro 让从定时器在主定时器的一个周期内计数。
5.18.3.1 6Steps 六步换相
工程目录: projects/n32g033_EVAL/examples/TIM/6Steps/
使能时钟并配置 6 路互补引脚→配置时基与三通道比较值→打开换相中断与主输出→SysTick 定时产生换相事件
| 项目 | 源码解读 |
|---|---|
| 功能 | TIM1 用 3 路互补输出以冻结比较模式产生六步换相波形,每个 100 ms 的 COM 事件推进一个换相步。 |
| 源码组成 | src/main.c 含 RCC、GPIO、NVIC、SysTick 与主函数;src/n32g033_it.c 含 SysTick_Handler 与 TIMx_IRQHandler;inc/main.h、inc/n32g033_it.h 为头文件;readme.txt 给出配置与测试步骤;工程文件在 MDK-ARM/ 与 EWARM/。 |
| 关键配置 | 引脚:PA4、PA3、PA5 为 TIM1 的 CH1、CH2、CH3,PA7、PB4、PB5 为 CH1N、CH2N、CH3N; 时钟:TIM1_CLK=64 MHz,PSC=0,AR=4095; 模式:通道比较冻结输出,自动输出使能; 死区:DeadTime=1,不使能刹车; 中断:TIM1 COM 事件中断,抢占优先级 1。 |
| 程序与数据路径 | main → RCC_Configuration 打开 TIM1 与 6 个 GPIO 时钟 → GPIO_Configuration 把 6 个引脚配成复用推挽 → 主函数配置时基、三通道比较值与 BDTR → TIM_Enable 与 TIM_EnableCtrlPwmOutputs 打开输出 → SysTick_Handler 每 100 ms 产生一次 COM 事件 → TIMx_IRQHandler 按 step 变量切换通道状态。 |
| 主要 API | TIM_InitTimBaseStruct、TIM_InitTimeBase、TIM_InitOcStruct、TIM_InitOc1、TIM_InitBkdtStruct、TIM_ConfigBkdt、TIM_ConfigInt、TIM_GenerateEvent、TIM_Enable、TIM_EnableCtrlPwmOutputs |
| 验证方法 | 编译后进入调试模式,用示波器或逻辑分析仪观察 TIM1 的 6 路输出; 波形每 100 ms 按 AB、AC、BC、BA、CA、CB 的顺序推进一个换相步。 |
| 使用提示 | 开发环境为 KEIL MDK-ARM V5.34.0.0 或 IAR EWARM 8.50.1,硬件基于评估板 N32G033K8Q7-1_STB V1.0; 系统时钟取 HSI,SYS_CLK=64 MHz; 示例未使能刹车输入。 |
核心代码解读与移植
示例先把 TIM1 配成冻结比较模式并写好三个通道的比较值,再用 SysTick 定时产生 COM 事件,由中断切换通道状态。
数据路径: RCC_Configuration 打开 TIM1 与 GPIO 时钟 → GPIO_Configuration 配置 6 路复用引脚 → main 配置时基与三通道比较值并写 BDTR → TIM_EnableCtrlPwmOutputs 打开主输出 → SysTick_Handler 产生 COM 事件 → TIMx_IRQHandler 按 step 切换通道
1. 时基确定换相节拍。 计数器从 0 计到 4095 后归零,换相事件的节拍由这一周期决定。
/* Time Base configuration */
TIM_InitTimBaseStruct(&TIM_TimeBaseStructure);
TIM_TimeBaseStructure.Prescaler = 0;
TIM_TimeBaseStructure.CounterMode = TIM_CNT_MODE_UP;
TIM_TimeBaseStructure.Period = 4095;
TIM_TimeBaseStructure.ClkDiv = TIM_CLK_DIV1;
TIM_TimeBaseStructure.RepetCnt = 0;
TIM_InitTimeBase(TIMx, &TIM_TimeBaseStructure);
移植时保持 Prescaler 与 Period 的乘积不变即可保持换相频率,改动 Period 会同时改变比较值的有效范围。
2. 三个通道用冻结比较模式,比较值只作为参考。 冻结模式下比较匹配不改写输出,通道状态完全由软件控制。
/* Channel 1, 2 and 3 Configuration in PWM mode */
TIM_InitOcStruct(&TIM_OCInitStructure);
TIM_OCInitStructure.OCMode = TIM_OCMODE_TIMING;
TIM_OCInitStructure.OutputState = TIM_OUTPUT_STATE_ENABLE;
TIM_OCInitStructure.OutputNState = TIM_OUTPUT_NSTATE_ENABLE;
TIM_OCInitStructure.Pulse = 2047;
TIM_OCInitStructure.OCPolarity = TIM_OC_POLARITY_HIGH;
TIM_OCInitStructure.OCNPolarity = TIM_OCN_POLARITY_HIGH;
TIM_OCInitStructure.OCIdleState = TIM_OC_IDLE_STATE_SET;
TIM_OCInitStructure.OCNIdleState = TIM_OCN_IDLE_STATE_RESET;
TIM_InitOc1(TIMx, &TIM_OCInitStructure);
TIM_OCInitStructure.Pulse = 1023;
TIM_InitOc2(TIMx, &TIM_OCInitStructure);
TIM_OCInitStructure.Pulse = 511;
TIM_InitOc3(TIMx, &TIM_OCInitStructure);
/* Automatic Output enable, Break, dead time and lock configuration*/
TIM_InitBkdtStruct(&TIM_BDTRInitStructure);
TIM_BDTRInitStructure.OSSRState = TIM_OSSR_STATE_ENABLE;
TIM_BDTRInitStructure.OSSIState = TIM_OSSI_STATE_ENABLE;
TIM_BDTRInitStructure.LOCKLevel = TIM_LOCK_LEVEL_OFF;
TIM_BDTRInitStructure.DeadTime = 1;
TIM_BDTRInitStructure.Break = TIM_BREAK_IN_DISABLE;
TIM_BDTRInitStructure.AutomaticOutput = TIM_AUTO_OUTPUT_ENABLE;
TIM_ConfigBkdt(TIMx, &TIM_BDTRInitStructure);
通道数由换相步数决定,改动通道映射时同步修改 GPIO_Configuration 中的引脚。
3. 使能计数器与 COM 中断并打开主输出。 只有主输出使能位有效,互补引脚才会真正驱动。
/*TIM1 Capture Compare Preload Controller Enable*/
TIM_EnableCapCmpPreloadControl(TIMx, ENABLE);
/* interrupt Enable */
TIM_ConfigInt(TIMx, TIM_INT_COM, ENABLE);
/* TIM1 counter enable */
TIM_Enable(TIMx, ENABLE);
/* Main Output Enable */
TIM_EnableCtrlPwmOutputs(TIMx, ENABLE);
4. 软件产生 COM 事件并由中断推进换相。 SysTick 每 100 ms 触发一次 COM 事件,中断里按 step 依次改写各通道状态。
void SysTick_Handler(void)
{
/* Generate TIM1 COM event by software */
TIM_GenerateEvent(TIMx, TIM_EVT_SRC_COM);
}
void TIMx_IRQHandler(void)
{
/* Clear TIMx COM pending bit */
TIM_ClrIntPendingBit(TIMx, TIM_INT_COM);
if (step == 1)
{
/* Next step: Step 2 Configuration ---------------------------- */
/* Channel3 configuration */
TIM_EnableCapCmpCh(TIMx, TIM_CH_3, TIM_CAP_CMP_DISABLE);
TIM_EnableCapCmpChN(TIMx, TIM_CH_3, TIM_CAP_CMP_N_DISABLE);
/* Channel1 configuration */
TIM_SelectOcMode(TIMx, TIM_CH_1, TIM_OCMODE_PWM1);
TIM_EnableCapCmpCh(TIMx, TIM_CH_1, TIM_CAP_CMP_ENABLE);
TIM_EnableCapCmpChN(TIMx, TIM_CH_1, TIM_CAP_CMP_N_DISABLE);
/* Channel2 configuration */
TIM_SelectOcMode(TIMx, TIM_CH_2, TIM_OCMODE_PWM1);
TIM_EnableCapCmpCh(TIMx, TIM_CH_2, TIM_CAP_CMP_DISABLE);
TIM_EnableCapCmpChN(TIMx, TIM_CH_2, TIM_CAP_CMP_N_ENABLE);
step++;
}
把 step 的状态分支换成按换相表查表,可移植到任意步数的电机控制;产生 COM 事件的定时源也可换成其他时基。
对应源码: src/main.c、src/n32g033_it.c、firmware/n32g033_std_periph_driver/inc/n32g033_tim.h
5.18.3.2 ComplementarySignals 互补输出与死区
工程目录: projects/n32g033_EVAL/examples/TIM/ComplementarySignals/
使能时钟并配置四对互补引脚与刹车引脚→计算周期与四通道比较值→配置死区与刹车输入→打开计数器与主输出
| 项目 | 源码解读 |
|---|---|
| 功能 | TIM1 输出 4 对带死区的互补 PWM,刹车输入 PA2 有效时全部输出进入空闲状态。 |
| 源码组成 | src/main.c 含 RCC、GPIO 与主函数;src/n32g033_it.c 仅保留框架;inc/main.h 声明引脚与中断宏;readme.txt 给出配置与测试步骤;工程文件在 MDK-ARM/ 与 EWARM/。 |
| 关键配置 | 引脚:PA4、PA3、PA5、PB3 为 CH1-CH4,PA7、PB4、PB5、PB6 为 CH1N-CH4N,PA2 为刹车输入; 时钟:PSC=0,目标频率 16 kHz; 模式:PWM2,输出与互补输出均使能; 死区:DeadTime=11; 刹车:高电平有效,自动输出使能。 |
| 程序与数据路径 | main → RCC_Configuration 打开 TIM1 与 9 个 GPIO 时钟 → GPIO_Configuration 配置 8 路互补引脚与刹车引脚 → 按 16 kHz 计算周期与四通道比较值 → TIM_InitOc1 到 TIM_InitOc4 写四通道 → TIM_ConfigBkdt 写死区与刹车 → TIM_BreakInputSourceEnable 使能刹车输入 → 打开计数器与主输出。 |
| 主要 API | TIM_InitTimBaseStruct、TIM_InitTimeBase、TIM_InitOcStruct、TIM_InitOc1、TIM_InitOc4、TIM_InitBkdtStruct、TIM_ConfigBkdt、TIM_BreakInputSourceEnable、TIM_Enable、TIM_EnableCtrlPwmOutputs |
| 验证方法 | 用示波器观察 TIM1 的四对互补波形; PA2 拉低时可见四对互补 PWM,PA2 拉高时 PWM 消失。 |
| 使用提示 | 开发环境为 KEIL MDK-ARM V5.34.0.0 或 IAR EWARM 8.50.1,硬件基于评估板 N32G033K8Q7-1_STB V1.0; 四通道占空比分别为 50%、25%、12.5%、12.5%。 |
核心代码解读与移植
示例按 16 kHz 的目标频率算出周期与各通道比较值,再补齐死区与刹车,最后由刹车输入控制输出的通断。
数据路径: main 计算 TimerPeriod 与四通道比较值 → TIM_InitTimeBase 写时基 → TIM_InitOc1 到 TIM_InitOc4 写四通道 → TIM_ConfigBkdt 写死区与刹车 → TIM_BreakInputSourceEnable 使能刹车 → TIM_EnableCtrlPwmOutputs 打开输出
1. 先算周期与四通道比较值。 占空比按百分比折算到比较值,通道 4 与通道 3 取相同的 12.5%。
/* Compute the value to be set in AR register to generate signal frequency at x hz */
TimerPeriod = (SystemCoreClock / 16000) - 1;
/* Compute CCDAT1 value to generate a duty cycle at 50% for channel 1 */
Channel1Pulse = (uint16_t)(((uint32_t)5 * (TimerPeriod - 1)) / 10);
/* Compute CCDAT2 value to generate a duty cycle at 25% for channel 2 */
Channel2Pulse = (uint16_t)(((uint32_t)25 * (TimerPeriod - 1)) / 100);
/* Compute CCDAT3 value to generate a duty cycle at 12.5% for channel 3 */
Channel3Pulse = (uint16_t)(((uint32_t)125 * (TimerPeriod - 1)) / 1000);
/* Compute CCDAT4 value to generate a duty cycle at 12.5% for channel 3 */
Channel4Pulse = (uint16_t)(((uint32_t)125 * (TimerPeriod - 1)) / 1000);
改目标频率时只需替换 SystemCoreClock / 16000 中的除数,比较值会按比例重算。
2. 时基与四通道一次配对,极性决定空闲电平。 四通道共用同一份结构体,只在 Pulse 上区分。
/* Time Base configuration */
TIM_InitTimBaseStruct(&TIM_TimeBaseStructure);
TIM_TimeBaseStructure.Prescaler = 0;
TIM_TimeBaseStructure.CounterMode = TIM_CNT_MODE_UP;
TIM_TimeBaseStructure.Period = TimerPeriod;
TIM_TimeBaseStructure.ClkDiv = TIM_CLK_DIV1;
TIM_TimeBaseStructure.RepetCnt = 0;
TIM_InitTimeBase(TIMx, &TIM_TimeBaseStructure);
/* Channel 1, 2 and 3 Configuration in PWM mode */
TIM_InitOcStruct(&TIM_OCInitStructure);
TIM_OCInitStructure.OCMode = TIM_OCMODE_PWM2;
TIM_OCInitStructure.OutputState = TIM_OUTPUT_STATE_ENABLE;
TIM_OCInitStructure.OutputNState = TIM_OUTPUT_NSTATE_ENABLE;
TIM_OCInitStructure.Pulse = Channel1Pulse;
TIM_OCInitStructure.OCPolarity = TIM_OC_POLARITY_LOW;
TIM_OCInitStructure.OCNPolarity = TIM_OCN_POLARITY_LOW;
TIM_OCInitStructure.OCIdleState = TIM_OC_IDLE_STATE_SET;
TIM_OCInitStructure.OCNIdleState = TIM_OCN_IDLE_STATE_RESET;
TIM_InitOc1(TIMx, &TIM_OCInitStructure);
TIM_OCInitStructure.Pulse = Channel2Pulse;
TIM_InitOc2(TIMx, &TIM_OCInitStructure);
TIM_OCInitStructure.Pulse = Channel3Pulse;
TIM_InitOc3(TIMx, &TIM_OCInitStructure);
TIM_OCInitStructure.Pulse = Channel4Pulse;
TIM_InitOc4(TIMx, &TIM_OCInitStructure);
通道数多于所需时可以只保留前几路,未用的通道不初始化即可。
3. 死区、刹车与主输出一起配置。 死区计数与刹车极性写在 BDTR,刹车源再由 TIM_BreakInputSourceEnable 打开。
/* Automatic Output enable, Break, dead time and lock configuration*/
TIM_InitBkdtStruct(&TIM_BDTRInitStructure);
TIM_BDTRInitStructure.OSSRState = TIM_OSSR_STATE_ENABLE;
TIM_BDTRInitStructure.OSSIState = TIM_OSSI_STATE_ENABLE;
TIM_BDTRInitStructure.LOCKLevel = TIM_LOCK_LEVEL_OFF;
TIM_BDTRInitStructure.DeadTime = 11;
TIM_BDTRInitStructure.Break = TIM_BREAK_IN_ENABLE;
TIM_BDTRInitStructure.BreakPolarity = TIM_BREAK_POLARITY_HIGH;
TIM_BDTRInitStructure.AutomaticOutput = TIM_AUTO_OUTPUT_ENABLE;
TIM_ConfigBkdt(TIMx, &TIM_BDTRInitStructure);
TIM_BreakInputSourceEnable(TIMx,TIM_BREAK_IOM1,TIM_BREAK_IOM_COMP_POLARITY_NONINVERT,ENABLE);
/* TIMx counter enable */
TIM_Enable(TIMx, ENABLE);
/* Main Output Enable */
TIM_EnableCtrlPwmOutputs(TIMx, ENABLE);
把刹车极性改为低有效即可适配低电平触发的保护电路,死区按功率管的开关时间调整。
对应源码: src/main.c、firmware/n32g033_std_periph_driver/inc/n32g033_tim.h
5.18.3.3 DMA DMA 更新占空比
工程目录: projects/n32g033_EVAL/examples/TIM/DMA/
使能时钟并配置互补引脚与 DMA→计算周期与三个占空比→配置通道与更新 DMA 请求→每次更新事件由 DMA 改写比较值
| 项目 | 源码解读 |
|---|---|
| 功能 | TIM1 的 CH3 与 CH3N 互补输出,每 6 个更新事件由 DMA 循环改写比较值。 |
| 源码组成 | src/main.c 含 RCC、GPIO、DMA_Configuration 与主函数;src/n32g033_it.c 仅保留框架;inc/main.h 声明引脚与中断宏;readme.txt 给出配置与测试步骤;工程文件在 MDK-ARM/ 与 EWARM/。 |
| 关键配置 | 引脚:PA5 为 CH3,PB3 为 CH3N; 时钟:PSC=0,目标频率 8 kHz; 模式:PWM1,重复计数 RepetCnt=5; DMA:DMA_CH1 循环模式,每次搬 3 个字到 CCDAT3; 触发:TIM1 更新事件,请求重映射为 DMA_REMAP_TIM1_UP。 |
| 程序与数据路径 | main → RCC_Configuration 打开 TIM1、GPIO 与 DMA 时钟 → DMA_Configuration 配置 DMA_CH1 → 按 50%、37.5%、25% 写 SRC_Buffer → 配置时基与 CH3 并开启更新 DMA 请求 → TIM_EnableDma 与 TIM_Enable 打开计数与输出 → 每次更新事件 DMA 从 SRC_Buffer 搬一个比较值到 CCDAT3。 |
| 主要 API | TIM_InitTimBaseStruct、TIM_InitTimeBase、TIM_InitOcStruct、TIM_InitOc3、TIM_EnableDma、TIM_Enable、TIM_EnableCtrlPwmOutputs、DMA_StructInit、DMA_Init、DMA_RequestRemap、DMA_EnableChannel |
| 验证方法 | 用示波器观察 CH3 与 CH3N 波形; 每 6 个周期占空比按循环顺序切换到下一个值。 |
| 使用提示 | 开发环境为 KEIL MDK-ARM V5.34.0.0 或 IAR EWARM 8.50.1,硬件基于评估板 N32G033K8Q7-1_STB V1.0; DMA 缓冲区大小 3 与重复计数 5 一起决定改写的周期数。 |
核心代码解读与移植
示例用循环模式的 DMA 在每次更新事件把一个比较值搬进 CCDAT3,从而在不干预 CPU 的情况下改变占空比。
数据路径: main 写 SRC_Buffer 三个占空比 → TIM_InitTimeBase 写时基 → TIM_InitOc3 写通道 3 → TIM_EnableDma 打开更新请求 → 更新事件触发 DMA → DMA_Configuration 把 SRC_Buffer 搬到 CCDAT3
1. 先按占空比算出三个比较值。 三个值依次装入缓冲区,DMA 每轮搬一个。
/* Compute the value to be set in AR register to generate signal frequency at x hz */
TimerPeriod = (SystemCoreClock / 8000) - 1;
/* Compute CCDAT1 value to generate a duty cycle at 50% */
SRC_Buffer[0] = (uint16_t)(((uint32_t)5 * (TimerPeriod - 1)) / 10);
/* Compute CCDAT1 value to generate a duty cycle at 37.5% */
SRC_Buffer[1] = (uint16_t)(((uint32_t)375 * (TimerPeriod - 1)) / 1000);
/* Compute CCDAT1 value to generate a duty cycle at 25% */
SRC_Buffer[2] = (uint16_t)(((uint32_t)25 * (TimerPeriod - 1)) / 100);
重复计数减小时改写更频繁,缓冲区长度决定一轮内占空比的档数。
2. 时基与通道 3 配置后打开更新 DMA 请求。 RepetCnt=5 使 6 个更新事件触发一次 DMA。
/* Time Base configuration */
TIM_InitTimBaseStruct(&TIM_TimeBaseStructure);
TIM_TimeBaseStructure.Prescaler = 0;
TIM_TimeBaseStructure.CounterMode = TIM_CNT_MODE_UP;
TIM_TimeBaseStructure.Period = TimerPeriod;
TIM_TimeBaseStructure.ClkDiv = TIM_CLK_DIV1;
TIM_TimeBaseStructure.RepetCnt = 5;
TIM_InitTimeBase(TIMx, &TIM_TimeBaseStructure);
/* Channel 3 Configuration in PWM mode */
TIM_InitOcStruct(&TIM_OCInitStructure);
TIM_OCInitStructure.OCMode = TIM_OCMODE_PWM1;
TIM_OCInitStructure.OutputState = TIM_OUTPUT_STATE_ENABLE;
TIM_OCInitStructure.OutputNState = TIM_OUTPUT_NSTATE_ENABLE;
TIM_OCInitStructure.Pulse = SRC_Buffer[0];
TIM_OCInitStructure.OCPolarity = TIM_OC_POLARITY_HIGH;
TIM_OCInitStructure.OCNPolarity = TIM_OCN_POLARITY_HIGH;
TIM_OCInitStructure.OCIdleState = TIM_OC_IDLE_STATE_SET;
TIM_OCInitStructure.OCNIdleState = TIM_OCN_IDLE_STATE_RESET;
TIM_InitOc3(TIMx, &TIM_OCInitStructure);
/* TIMx Update DMA Request enable */
TIM_EnableDma(TIMx, TIM_DMA_UPDATE, ENABLE);
/* TIMx counter enable */
TIM_Enable(TIMx, ENABLE);
/* Main Output Enable */
TIM_EnableCtrlPwmOutputs(TIMx, ENABLE);
把 TIM_DMA_UPDATE 换成比较通道的 DMA 请求,可让每次比较匹配就改写一次。
3. DMA 通道指向 CCDAT3 并请求重映射。 目的地址取 &TIMx->CCDAT3,循环模式下缓冲区用完自动回到起点。
void DMA_Configuration(void)
{
DMA_InitType DMA_InitStructure;
/* DMA Channel1 Config */
DMA_DeInit(DMA_CH1);
DMA_StructInit(&DMA_InitStructure);
DMA_InitStructure.PeriphAddr = (uint32_t)&TIMx->CCDAT3;
DMA_InitStructure.MemAddr = (uint32_t)SRC_Buffer;
DMA_InitStructure.Direction = DMA_DIR_PERIPH_DST;
DMA_InitStructure.BufSize = 3;
DMA_InitStructure.PeriphInc = DMA_PERIPH_INC_DISABLE;
DMA_InitStructure.DMA_MemoryInc = DMA_MEM_INC_ENABLE;
DMA_InitStructure.PeriphDataSize = DMA_PERIPH_DATA_SIZE_WORD;
DMA_InitStructure.MemDataSize = DMA_MemoryDataSize_Word;
DMA_InitStructure.CircularMode = DMA_MODE_CIRCULAR;
DMA_InitStructure.Priority = DMA_PRIORITY_HIGH;
DMA_InitStructure.Mem2Mem = DMA_M2M_DISABLE;
DMA_Init(DMA_CH1, &DMA_InitStructure);
DMA_RequestRemap(DMA_REMAP_TIM1_UP,DMA,DMA_CH1,ENABLE);
/* DMA Channel1 enable */
DMA_EnableChannel(DMA_CH1, ENABLE);
}
换用其他通道时同步修改 DMA 的目的寄存器与请求重映射源,并核对传输数据宽度。
对应源码: src/main.c、firmware/n32g033_std_periph_driver/inc/n32g033_tim.h
5.18.3.4 DMABurst DMA 突发传输
工程目录: projects/n32g033_EVAL/examples/TIM/DMABurst/
使能时钟并配置通道引脚与 DMA→配置时基与通道 1 输出→设置 DMA 突发基址与长度→一个更新事件搬运 8 个寄存器值
| 项目 | 源码解读 |
|---|---|
| 功能 | TIM1 的 CH1 输出,在一次更新事件里由 DMA 突发同时改写周期与占空比。 |
| 源码组成 | src/main.c 含 RCC、GPIO、DMA_Configuration 与主函数;src/n32g033_it.c 仅保留框架;inc/main.h 声明引脚与中断宏;readme.txt 给出配置与测试步骤;工程文件在 MDK-ARM/ 与 EWARM/。 |
| 关键配置 | 引脚:PA4 为 CH1; 时钟:PSC=0,初始 AR=0xFFFF; 模式:PWM1,初始占空比 0x8FFF; DMA:DMA_CH1 非循环模式,一次搬 8 个字; 触发:TIM1 更新事件,突发长度 8 次传输,基址 CAPCMPDAT1。 |
| 程序与数据路径 | DMA_Configuration 把 DMA 目的地址指向 TIM1 的 DADDR → TIM_ConfigDma 设突发基址与长度 → TIM_EnableDma 开更新请求 → 更新事件把 8 个字从 SRC_Buffer 搬到 TIM1 寄存器 → 传输结束后清标志 → 调试时置 DmaAgain=1 可再次触发。 |
| 主要 API | TIM_InitTimBaseStruct、TIM_InitTimeBase、TIM_InitOcStruct、TIM_InitOc1、TIM_ConfigDma、TIM_EnableDma、TIM_Enable、TIM_EnableCtrlPwmOutputs、DMA_Init、DMA_GetFlagStatus、DMA_ClearFlag |
| 验证方法 | 用示波器观察 CH1; 第一个周期后波形按 DMA 搬入的周期与占空比变化。 |
| 使用提示 | 开发环境为 KEIL MDK-ARM V5.34.0.0 或 IAR EWARM 8.50.1,硬件基于评估板 N32G033K8Q7-1_STB V1.0; 调试下把 DmaAgain 置 1 会重新搬运一次。 |
核心代码解读与移植
示例用突发模式让一次 DMA 传输把 8 个字连续写入 TIM1 的寄存器窗口,从而同时刷新周期、六个比较值、预分频与重复计数。
数据路径: main 配置时基与通道 1 → TIM_ConfigDma 设突发基址与长度 → TIM_EnableDma 打开更新请求 → 更新事件触发 DMA 突发 → DMA_Configuration 把 SRC_Buffer 的 8 个字搬到 DADDR → 传输结束清标志
1. 时基与通道 1 输出先建立。 初始 AR 与比较值决定第一个周期的波形。
/* Time Base configuration */
TIM_InitTimBaseStruct(&TIM_TimeBaseStructure);
TIM_TimeBaseStructure.Prescaler = 0;
TIM_TimeBaseStructure.CounterMode = TIM_CNT_MODE_UP;
TIM_TimeBaseStructure.Period = 0xFFFF;
TIM_TimeBaseStructure.ClkDiv = TIM_CLK_DIV1;
TIM_InitTimeBase(TIMx, &TIM_TimeBaseStructure);
/* Channel 3 Configuration in PWM mode */
TIM_InitOcStruct(&TIM_OCInitStructure);
TIM_OCInitStructure.OCMode = TIM_OCMODE_PWM1;
TIM_OCInitStructure.OutputState = TIM_OUTPUT_STATE_ENABLE;
TIM_OCInitStructure.Pulse = 0x8FFF;
TIM_OCInitStructure.OCPolarity = TIM_OC_POLARITY_HIGH;
TIM_InitOc1(TIMx, &TIM_OCInitStructure);
SRC_Buffer 的首字对应 CCDAT1,末字对应 AR,改动缓冲区内容即可改变写入的寄存器顺序。
2. 设置突发基址、长度与更新 DMA 请求并等待传输结束。 突发长度 8 与缓冲区长度一致,传输完成标志用于判断一次搬运结束。
/* TIMx DADDR Base register and DMA Burst Length Config */
TIM_ConfigDma(TIMx, TIM_DMABASE_CAPCMPDAT1, TIM_DMABURST_LENGTH_8TRANSFERS);
/* TIMx DMA Update enable */
TIM_EnableDma(TIMx, TIM_DMA_UPDATE, ENABLE);
/* TIMx enable */
TIM_Enable(TIMx, ENABLE);
/* TIMx PWM Outputs Enable */
TIM_EnableCtrlPwmOutputs(TIMx, ENABLE);
/* DMA Channel1 enable */
DMA_EnableChannel(DMA_CH1, ENABLE);
/* Wait until DMA Channel1 end of Transfer */
while (!DMA_GetFlagStatus(DMA_FLAG_TC1, DMA))
{
}
DMA_ClearFlag(DMA_FLAG_GL1 | DMA_FLAG_TC1 | DMA_FLAG_HT1 | DMA_FLAG_TE1, DMA);
把非循环模式改为循环模式可让多组参数轮流写入,需要时再配合中断刷新缓冲区。
3. DMA 目的地址指向 DADDR 并请求重映射。 每次搬运从 SRC_Buffer 起逐字写入 TIM1 的寄存器窗口。
void DMA_Configuration(void)
{
DMA_InitType DMA_InitStructure;
/* DMA1 Channel5 Config */
DMA_DeInit(DMA_CH1);
DMA_StructInit(&DMA_InitStructure);
DMA_InitStructure.PeriphAddr = (uint32_t)&TIMx->DADDR;
DMA_InitStructure.MemAddr = (uint32_t)SRC_Buffer;
DMA_InitStructure.Direction = DMA_DIR_PERIPH_DST;
DMA_InitStructure.BufSize = 8;
DMA_InitStructure.PeriphInc = DMA_PERIPH_INC_DISABLE;
DMA_InitStructure.DMA_MemoryInc = DMA_MEM_INC_ENABLE;
DMA_InitStructure.PeriphDataSize = DMA_PERIPH_DATA_SIZE_WORD;
DMA_InitStructure.MemDataSize = DMA_MemoryDataSize_Word;
DMA_InitStructure.CircularMode = DMA_MODE_NORMAL;
DMA_InitStructure.Priority = DMA_PRIORITY_HIGH;
DMA_InitStructure.Mem2Mem = DMA_M2M_DISABLE;
DMA_Init(DMA_CH1, &DMA_InitStructure);
DMA_RequestRemap(DMA_REMAP_TIM1_UP,DMA,DMA_CH1,ENABLE);
}
换用其他定时器时同步修改请求重映射源与目的地址,并核对突发基址是否仍在可用窗口内。
对应源码: src/main.c、firmware/n32g033_std_periph_driver/inc/n32g033_tim.h
5.18.3.5 ExtTrigger_Synchro 外部触发级联同步
工程目录: projects/n32g033_EVAL/examples/TIM/ExtTrigger_Synchro/
使能时钟并配置主从两定时器的引脚→配置主定时器为翻转并作触发输出→由外部输入作门控触发→从定时器随主定时器门控计数
| 项目 | 源码解读 |
|---|---|
| 功能 | TIM1 的 CH2 作为外部门控输入,同时门控 TIM1 的 CH1 与从定时器 TIM3。 |
| 源码组成 | src/main.c 含 RCC、GPIO 与主函数;src/n32g033_it.c 仅保留框架;inc/main.h 声明主从定时器与引脚宏;readme.txt 给出配置与测试步骤;工程文件在 MDK-ARM/ 与 EWARM/。 |
| 关键配置 | 引脚:PA4 为 TIM1 CH1,PA3 为 TIM1 CH2,PA6 为 TIM3 CH1; 时钟:PSC=2,Period=73; 从模式:TIM1 与 TIM3 均为门控模式; 触发:TIM1 选 TI2FP2 作输入触发,主从模式使能; 触发输出:TIM1 使能事件作触发源。 |
| 程序与数据路径 | main → RCC_Configuration 打开 TIM1、TIM3 与 GPIO 时钟 → 配置两定时器时基 → TIM_InitOc1 把 TIM1 CH1 配成翻转 → TIM_ICInit 在 CH2 上做输入捕获并提供 TI2FP2 → TIM_SelectSlaveMode 门控 → TIM_SelectMasterSlaveMode 与 TIM_SelectOutputTrig → TIM3 以 IN_TR0 门控 → 打开两定时器与主输出。 |
| 主要 API | TIM_InitTimBaseStruct、TIM_InitTimeBase、TIM_InitOcStruct、TIM_InitOc1、TIM_InitIcStruct、TIM_ICInit、TIM_SelectInputTrig、TIM_SelectSlaveMode、TIM_SelectMasterSlaveMode、TIM_SelectOutputTrig、TIM_EnableCtrlPwmOutputs、TIM_Enable |
| 验证方法 | 用示波器观察 TIM1 CH1 与 TIM3 CH1; TIM1 CH2 为高时计数器计数,为低时停止。 |
| 使用提示 | 开发环境为 KEIL MDK-ARM V5.34.0.0 或 IAR EWARM 8.50.1,硬件基于评估板 N32G033K8Q7-1_STB V1.0; TIM1 作主定时器,TIM3 作从定时器; 两个定时器的时基参数相同。 |
核心代码解读与移植
示例让 TIM1 的 CH2 作外部门控输入,TIM1 与 TIM3 在门控有效时同时计数,从而由一路外部信号同步两个定时器。
数据路径: main 配置两定时器时基 → TIM_InitOc1 把 TIM1 CH1 配成翻转 → TIM_ICInit 在 CH2 上取 TI2FP2 → TIM_SelectSlaveMode 门控 TIM1 → TIM_SelectOutputTrig 用使能事件作触发源 → TIM3 以 IN_TR0 门控 → TIM_Enable 启动两定时器
1. 两个定时器共用同一份时基参数。 先写 TIM1,再改写同一结构体写 TIM3。
/* Time base configuration */
TIM_InitTimBaseStruct(&TIM_TimeBaseStructure);
TIM_TimeBaseStructure.Period = 73;
TIM_TimeBaseStructure.Prescaler = 2;
TIM_TimeBaseStructure.ClkDiv = TIM_CLK_DIV1;
TIM_TimeBaseStructure.CounterMode = TIM_CNT_MODE_UP;
TIM_InitTimeBase(TIMx, &TIM_TimeBaseStructure);
TIM_TimeBaseStructure.Period = 73;
TIM_InitTimeBase(TIMy, &TIM_TimeBaseStructure);
从定时器可以与主定时器取不同的 Period,从而在同一门控下得到不同的输出频率。
2. 主定时器取外部触发并作触发输出。 CH2 由输入捕获提供 TI2FP2,主从模式使能后使能事件作为触发输出。
/* Master Configuration in Toggle Mode */
TIM_InitOcStruct(&TIM_OCInitStructure);
TIM_OCInitStructure.OCMode = TIM_OCMODE_TOGGLE;
TIM_OCInitStructure.OutputState = TIM_OUTPUT_STATE_ENABLE;
TIM_OCInitStructure.Pulse = 64;
TIM_OCInitStructure.OCPolarity = TIM_OC_POLARITY_HIGH;
TIM_InitOc1(TIMx, &TIM_OCInitStructure);
/* TIMx Input Capture Configuration */
TIM_InitIcStruct(&TIM_ICInitStructure);
TIM_ICInitStructure.Channel = TIM_CH_2;
TIM_ICInitStructure.ICPolarity = TIM_IC_POLARITY_RISING;
TIM_ICInitStructure.ICSelection = TIM_IC_SELECTION_DIRECTTI;
TIM_ICInitStructure.ICPrescaler = TIM_IC_PSC_DIV1;
TIM_ICInitStructure.ICFilter = 0;
TIM_ICInit(TIMx, &TIM_ICInitStructure);
/* TIMx Input trigger configuration: External Trigger connected to TI2 */
TIM_SelectInputTrig(TIMx, TIM_TRIG_SEL_TI2FP2);
TIM_SelectSlaveMode(TIMx, TIM_SLAVE_MODE_GATED);
/* Select the Master Slave Mode */
TIM_SelectMasterSlaveMode(TIMx, TIM_MASTER_SLAVE_MODE_ENABLE);
/* Master Mode selection: TIMx */
TIM_SelectOutputTrig(TIMx, TIM_TRGO_SRC_ENABLE);
把外部触发从 TI2FP2 换成 ETR,可直接用外部引脚作门控输入。
3. 从定时器以内部触发门控并在最后统一使能。 TIM3 的触发源选 IN_TR0,与主定时器保持相同的门控模式。
/* Slaves Configuration: Toggle Mode */
TIM_OCInitStructure.OCMode = TIM_OCMODE_TOGGLE;
TIM_OCInitStructure.OutputState = TIM_OUTPUT_STATE_ENABLE;
TIM_InitOc1(TIMy, &TIM_OCInitStructure);
/* Slave Mode selection: TIMy */
TIM_SelectInputTrig(TIMy, TIM_TRIG_SEL_IN_TR0);
TIM_SelectSlaveMode(TIMy, TIM_SLAVE_MODE_GATED);
/* TIM1 TIM3 Main Output Enable */
TIM_EnableCtrlPwmOutputs(TIMx, ENABLE);
TIM_EnableCtrlPwmOutputs(TIMy, ENABLE);
/* TIM enable counter */
TIM_Enable(TIMx, ENABLE);
TIM_Enable(TIMy, ENABLE);
需要级联第三个定时器时,把从定时器再设为另一路的主定时器,触发源沿用同一内部触发线即可。
对应源码: src/main.c、firmware/n32g033_std_periph_driver/inc/n32g033_tim.h
5.18.3.6 InputCapture 输入捕获测频
工程目录: projects/n32g033_EVAL/examples/TIM/InputCapture/
使能时钟并配置捕获输入与辅助输出引脚→配置上升沿输入捕获→开捕获中断并启动计数→中断里两次捕获值求差得频率
| 项目 | 源码解读 |
|---|---|
| 功能 | TIM4 的 CH2 捕获上升沿并计算输入信号频率,同时可由软件在 PA3 上产生两次上升沿。 |
| 源码组成 | src/main.c 含 RCC、GPIO、NVIC、GenTwoRisingEdge 与主函数;src/n32g033_it.c 含 TIM4_IRQHandler;inc/main.h 声明引脚与频率变量;readme.txt 给出配置与测试步骤;工程文件在 MDK-ARM/ 与 EWARM/。 |
| 关键配置 | 引脚:PA1 为 TIM4 CH2 输入,PA3 为普通推挽输出; 时钟:PSC=0; 捕获:CH2 上升沿直接映射,无滤波、不分频; 中断:捕获比较 2 中断,抢占优先级 1。 |
| 程序与数据路径 | main → RCC_Configuration 打开 TIM4 与 GPIO 时钟 → GPIO_Configuration 配置 CH2 与 PA3 → TIM_ICInit 配置 CH2 上升沿捕获 → 清标志并使能捕获中断 → 启动计数 → 主循环调用 GenTwoRisingEdge → TIM4_IRQHandler 两次读捕获值并算频率。 |
| 主要 API | TIM_InitIcStruct、TIM_ICInit、TIM_ClrIntPendingBit、TIM_ConfigInt、TIM_Enable、TIM_GetCap2、TIM_GetIntStatus |
| 验证方法 | PA3 连接 PA1,把 TIM4Freq 加入 watch 窗口; 调试下把 gOnePulsEn 置 1,PA3 产生两次上升沿后读频率。 |
| 使用提示 | 开发环境为 KEIL MDK-ARM V5.34.0.0 或 IAR EWARM 8.50.1,硬件基于评估板 N32G033K8Q7-1_STB V1.0; 系统时钟取 HSI,SYS_CLK=64 MHz; PA3 需与 PA1 短接。 |
核心代码解读与移植
示例在 CH2 上捕获上升沿,用相邻两次捕获值的差换算频率;为便于验证,软件还能在 PA3 上产生一对方波沿。
数据路径: main → TIM_ICInit 配置 CH2 上升沿捕获 → TIM_ConfigInt 使能捕获中断 → TIM_Enable 启动计数 → 主循环 GenTwoRisingEdge 在 PA3 产生沿 → TIM4_IRQHandler 读 TIM_GetCap2 两次 → 差值换算为 TIM4Freq
1. 配置 CH2 上升沿捕获并打开捕获中断。 直接映射、无滤波,保证捕获值就是计数值。
TIM_InitIcStruct(&TIM_ICInitStructure);
TIM_ICInitStructure.Channel = TIM_CH_2;
TIM_ICInitStructure.ICPolarity = TIM_IC_POLARITY_RISING;
TIM_ICInitStructure.ICSelection = TIM_IC_SELECTION_DIRECTTI;
TIM_ICInitStructure.ICPrescaler = TIM_IC_PSC_DIV1;
TIM_ICInitStructure.ICFilter = 0x0;
TIM_ICInit(TIMx, &TIM_ICInitStructure);
TIM_ClrIntPendingBit(TIMx,TIM_INT_UPDATE);
TIM_ClrIntPendingBit(TIMx,TIM_INT_CC2);
/* Enable the CC2 Interrupt Request */
TIM_ConfigInt(TIMx, TIM_INT_CC2, ENABLE);
/* TIM enable counter */
TIM_Enable(TIMx, ENABLE);
改捕获极性即可测下降沿,加滤波可以在有噪声的输入上抑制抖动。
2. 引脚配置与软件产生方波沿的辅助函数。 PA3 作普通输出,GenTwoRisingEdge 在使能时翻转两次电平。
void GPIO_Configuration(void)
{
GPIO_InitType GPIO_InitStructure;
GPIO_InitStruct(&GPIO_InitStructure);
/* GPIOx Configuration: Pin of TIMx */
GPIO_InitStructure.Pin = TIMx_CH2_GPIO_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_MODE_AF_PP;
GPIO_InitStructure.GPIO_Alternate = TIMx_CH2_GPIO_AF;
GPIO_InitPeripheral(TIMx_CH2_GPIO_PORT, &GPIO_InitStructure);
GPIO_InitStructure.Pin = GPIO_PIN_3;
GPIO_InitStructure.GPIO_Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitPeripheral(GPIOA, &GPIO_InitStructure);
}
void GenTwoRisingEdge(void)
{
if (gOnePulsEn)
{
gOnePulsEn = 0;
GPIO_SetBits(GPIOA, GPIO_PIN_3);
{
volatile uint32_t i = 0;
while (i++ < 10)
;
}
GPIO_ResetBits(GPIOA, GPIO_PIN_3);
{
volatile uint32_t i = 0;
while (i++ < 10)
;
}
GPIO_SetBits(GPIOA, GPIO_PIN_3);
{
volatile uint32_t i = 0;
while (i++ < 10)
;
}
GPIO_ResetBits(GPIOA, GPIO_PIN_3);
}
}
把 PA3 换成任意空闲引脚即可用于自测,被测信号也可直接由外部信号源提供。
3. 中断里两次捕获求差得频率。 相邻两次捕获值之差即一个信号周期内的计数次数。
void TIM4_IRQHandler(void)
{
if (TIM_GetIntStatus(TIMx, TIM_INT_CC2) == SET)
{
TIMxEnterIrqCnt++;
/* Clear TIMx Capture compare interrupt pending bit */
TIM_ClrIntPendingBit(TIMx, TIM_INT_CC2);
if (CaptureNumber == 0)
{
/* Get the Input Capture value */
IC3ReadValue1 = TIM_GetCap2(TIMx);
CaptureNumber = 1;
}
else if (CaptureNumber == 1)
{
/* Get the Input Capture value */
IC3ReadValue2 = TIM_GetCap2(TIMx);
/* Capture computation */
if (IC3ReadValue2 > IC3ReadValue1)
{
Capture = (IC3ReadValue2 - IC3ReadValue1);
}
else
{
Capture = ((0xFFFF - IC3ReadValue1) + IC3ReadValue2);
}
/* Frequency computation */
TIMxFreq = (uint32_t)(SystemCoreClock) / Capture;
CaptureNumber = 0;
}
}
}
被测频率低于计数频率的 1/2 时精度最高,频率接近或高于计数频率时需要先降低输入分频或改用捕获预分频。
对应源码: src/main.c、src/n32g033_it.c、firmware/n32g033_std_periph_driver/inc/n32g033_tim.h
5.18.3.7 OCActive 输出比较置有效
工程目录: projects/n32g033_EVAL/examples/TIM/OCActive/
使能时钟并配置四路输出引脚→计算预分频并配置时基→四通道配成比较置有效→打开主输出与计数器
| 项目 | 源码解读 |
|---|---|
| 功能 | TIM3 的四个通道在计数器达到各自比较值后输出有效电平。 |
| 源码组成 | src/main.c 含 RCC、GPIO 与主函数;src/n32g033_it.c 仅保留框架;inc/main.h 声明四通道引脚宏;readme.txt 给出配置与测试步骤;工程文件在 MDK-ARM/ 与 EWARM/。 |
| 关键配置 | 引脚:PA0、PA1、PB0、PB1 为 CH1-CH4; 时钟:PSC 使计数频率约 2 MHz,AR=65535; 模式:输出比较置有效,预装载关闭; 比较值:CC1 到 CC4 分别为 1000、500、250、125。 |
| 程序与数据路径 | main → RCC_Configuration 打开 TIM3 与 GPIO 时钟 → 算预分频 → 配置时基 → 逐通道配置为置有效并关闭预装载 → TIM_ConfigArPreload → TIM_EnableCtrlPwmOutputs 与 TIM_Enable 打开输出与计数。 |
| 主要 API | TIM_InitTimBaseStruct、TIM_InitTimeBase、TIM_InitOcStruct、TIM_InitOc1、TIM_InitOc4、TIM_ConfigOc1Preload、TIM_ConfigOc4Preload、TIM_ConfigArPreload、TIM_EnableCtrlPwmOutputs、TIM_Enable |
| 验证方法 | 用示波器观察四个通道; 计数到各自比较值时对应通道跳变为有效电平。 |
| 使用提示 | 开发环境为 KEIL MDK-ARM V5.34.0.0 或 IAR EWARM 8.50.1,硬件基于评估板 N32G033K8Q7-1_STB V1.0; 四个比较值决定四个通道的翻转时刻。 |
核心代码解读与移植
示例把四个通道都配成比较置有效,计数器计到各自比较值时对应输出翻到有效电平,用于生成不同延迟的边沿。
数据路径: main 算预分频 → TIM_InitTimeBase 写时基 → TIM_InitOc1 到 TIM_InitOc4 写四通道比较值 → TIM_ConfigOc1Preload 关闭预装载 → TIM_EnableCtrlPwmOutputs 打开输出 → TIM_Enable 启动计数
1. 预分频把计数频率降到约 2 MHz。 时基的 AR 取满量程,比较值直接决定延迟。
/* Compute the prescaler value */
PrescalerValue = (uint16_t)((SystemCoreClock)/ 2000000) - 1;
/* Time base configuration */
TIM_InitTimBaseStruct(&TIM_TimeBaseStructure);
TIM_TimeBaseStructure.Period = 65535;
TIM_TimeBaseStructure.Prescaler = PrescalerValue;
TIM_TimeBaseStructure.ClkDiv = TIM_CLK_DIV1;
TIM_TimeBaseStructure.CounterMode = TIM_CNT_MODE_UP;
TIM_InitTimeBase(TIMx, &TIM_TimeBaseStructure);
预分频改变计数频率会按比例改变各通道的延迟时间。
2. 通道 1 配成比较置有效并关闭预装载。 关闭预装载后比较值立即生效。
/* 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. 其余三个通道沿用同一模式,各自写比较值。 四个通道只在比较值上不同。
/* Output Compare Active Mode configuration: Channel2 */
TIM_OCInitStructure.OutputState = TIM_OUTPUT_STATE_ENABLE;
TIM_OCInitStructure.Pulse = CCR2_Val;
TIM_InitOc2(TIMx, &TIM_OCInitStructure);
TIM_ConfigOc2Preload(TIMx, TIM_OC_PRE_LOAD_DISABLE);
/* Output Compare Active Mode configuration: Channel3 */
TIM_OCInitStructure.OutputState = TIM_OUTPUT_STATE_ENABLE;
TIM_OCInitStructure.Pulse = CCR3_Val;
TIM_InitOc3(TIMx, &TIM_OCInitStructure);
TIM_ConfigOc3Preload(TIMx, TIM_OC_PRE_LOAD_DISABLE);
/* Output Compare Active Mode configuration: Channel4 */
TIM_OCInitStructure.OutputState = TIM_OUTPUT_STATE_ENABLE;
TIM_OCInitStructure.Pulse = CCR4_Val;
TIM_InitOc4(TIMx, &TIM_OCInitStructure);
TIM_ConfigOc4Preload(TIMx, TIM_OC_PRE_LOAD_DISABLE);
TIM_ConfigArPreload(TIMx, ENABLE);
TIM_EnableCtrlPwmOutputs(TIMx,ENABLE);
/* TIM2 enable counter */
TIM_Enable(TIMx, ENABLE);
把模式改为 PWM 即可直接得到占空比输出,比较值同比例调整。
对应源码: src/main.c、firmware/n32g033_std_periph_driver/inc/n32g033_tim.h
5.18.3.8 OCInactive 输出比较置无效
工程目录: projects/n32g033_EVAL/examples/TIM/OCInactive/
使能时钟并配置四个普通输出引脚→配置时基与四通道比较值→打开四通道比较中断→中断里拉低对应 IO
| 项目 | 源码解读 |
|---|---|
| 功能 | TIM3 的四个通道比较中断到来时,软件把 PA1 到 PA4 四个 IO 拉低。 |
| 源码组成 | src/main.c 含 RCC、GPIO、NVIC 与主函数;src/n32g033_it.c 含 TIMx_IRQHandler;inc/main.h 声明中断宏;readme.txt 给出配置与测试步骤;工程文件在 MDK-ARM/ 与 EWARM/。 |
| 关键配置 | 引脚:PA1、PA2、PA3、PA4 为普通推挽输出; 时钟:PSC 使计数频率约 2 MHz,AR=1999; 模式:输出比较置无效,预装载关闭; 中断:四通道比较中断全开,抢占优先级 1。 |
| 程序与数据路径 | main → RCC_Configuration 打开 TIM3 与 GPIO 时钟 → GPIO_Configuration 把 PA1 到 PA4 配成输出 → 配置时基与四通道 → TIM_ConfigInt 使能四通道比较中断 → 先把四个 IO 置高 → TIM_Enable 启动计数 → 中断里按通道拉低对应 IO。 |
| 主要 API | TIM_InitTimBaseStruct、TIM_InitTimeBase、TIM_InitOcStruct、TIM_InitOc1、TIM_InitOc4、TIM_ConfigInt、TIM_Enable、TIM_GetIntStatus、TIM_ClrIntPendingBit、GPIO_ResetBits |
| 验证方法 | 用示波器或逻辑分析仪观察 PA1 到 PA4; 各通道进入比较中断后对应 IO 被拉低。 |
| 使用提示 | 开发环境为 KEIL MDK-ARM V5.34.0.0 或 IAR EWARM 8.50.1,硬件基于评估板 N32G033K8Q7-1_STB V1.0; 四个引脚作普通 IO,不使用定时器的复用输出。 |
核心代码解读与移植
示例不用定时器的引脚输出,而是在四个通道的比较中断里由软件写 IO,用来演示比较事件如何生成可编程的定时沿。
数据路径: main 算预分频 → TIM_InitTimeBase 写时基 → TIM_InitOc1 到 TIM_InitOc4 写四通道比较值 → TIM_ConfigInt 使能比较中断 → TIM_Enable 启动计数 → TIMx_IRQHandler 按通道 GPIO_ResetBits
1. 预分频与时基先把计数频率定下来。 AR 取 1999,比较值决定各通道中断的时刻。
/* Compute the prescaler value */
PrescalerValue = (uint16_t)((SystemCoreClock)/ 2000000) - 1;
/* Time base configuration */
TIM_InitTimBaseStruct(&TIM_TimeBaseStructure);
TIM_TimeBaseStructure.Period = 1999;
TIM_TimeBaseStructure.Prescaler = PrescalerValue;
TIM_TimeBaseStructure.ClkDiv = TIM_CLK_DIV1;
TIM_TimeBaseStructure.CounterMode = TIM_CNT_MODE_UP;
TIM_InitTimeBase(TIMx, &TIM_TimeBaseStructure);
2. 四个通道配成比较置无效并打开比较中断。 比较事件本身不驱动引脚,只产生中断。
/* Output Compare Active Mode configuration: Channel1 */
TIM_InitOcStruct(&TIM_OCInitStructure);
TIM_OCInitStructure.OCMode = TIM_OCMODE_INACTIVE;
TIM_OCInitStructure.OutputState = TIM_OUTPUT_STATE_ENABLE;
TIM_OCInitStructure.Pulse = CCR1_Val;
TIM_OCInitStructure.OCPolarity = TIM_OC_POLARITY_HIGH;
TIM_InitOc1(TIMx, &TIM_OCInitStructure);
TIM_ConfigOc1Preload(TIMx, TIM_OC_PRE_LOAD_DISABLE);
/* Output Compare Active Mode configuration: Channel2 */
TIM_OCInitStructure.OutputState = TIM_OUTPUT_STATE_ENABLE;
TIM_OCInitStructure.Pulse = CCR2_Val;
TIM_InitOc2(TIMx, &TIM_OCInitStructure);
TIM_ConfigOc2Preload(TIMx, TIM_OC_PRE_LOAD_DISABLE);
/* Output Compare Active Mode configuration: Channel3 */
TIM_OCInitStructure.OutputState = TIM_OUTPUT_STATE_ENABLE;
TIM_OCInitStructure.Pulse = CCR3_Val;
TIM_InitOc3(TIMx, &TIM_OCInitStructure);
TIM_ConfigOc3Preload(TIMx, TIM_OC_PRE_LOAD_DISABLE);
/* Output Compare Active Mode configuration: Channel4 */
TIM_OCInitStructure.OutputState = TIM_OUTPUT_STATE_ENABLE;
TIM_OCInitStructure.Pulse = CCR4_Val;
TIM_InitOc4(TIMx, &TIM_OCInitStructure);
TIM_ConfigOc4Preload(TIMx, TIM_OC_PRE_LOAD_DISABLE);
TIM_ConfigArPreload(TIMx, ENABLE);
/* TIM IT enable */
TIM_ConfigInt(TIMx, TIM_INT_CC1 | TIM_INT_CC2 | TIM_INT_CC3 | TIM_INT_CC4, ENABLE);
3. 先把 IO 置高再启动计数。 复位后的初始电平由软件给定,比较中断再把它拉低。
/* Set output pins */
GPIO_SetBits(GPIOA, GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3 | GPIO_PIN_4);
/* TIM2 enable counter */
TIM_Enable(TIMx, ENABLE);
4. 中断里按通道写 IO。 每个通道的比较中断各拉低一个引脚。
void TIMx_IRQHandler(void)
{
if (TIM_GetIntStatus(TIMx, TIM_INT_CC1) != RESET)
{
/* Clear GTIM2 Capture Compare1 interrupt pending bit*/
TIM_ClrIntPendingBit(TIMx, TIM_INT_CC1);
GPIO_ResetBits(GPIOA, GPIO_PIN_1);
}
else if (TIM_GetIntStatus(TIMx, TIM_INT_CC2) != RESET)
{
/* Clear GTIM2 Capture Compare2 interrupt pending bit*/
TIM_ClrIntPendingBit(TIMx, TIM_INT_CC2);
GPIO_ResetBits(GPIOA, GPIO_PIN_2);
}
else if (TIM_GetIntStatus(TIMx, TIM_INT_CC3) != RESET)
{
/* Clear GTIM2 Capture Compare3 interrupt pending bit*/
TIM_ClrIntPendingBit(TIMx, TIM_INT_CC3);
GPIO_ResetBits(GPIOA, GPIO_PIN_3);
}
else
{
/* Clear GTIM2 Capture Compare4 interrupt pending bit*/
TIM_ClrIntPendingBit(TIMx, TIM_INT_CC4);
GPIO_ResetBits(GPIOA, GPIO_PIN_4);
}
}
把拉低改为翻转即可得到对称的输出,中断节拍仍由比较值决定。
对应源码: src/main.c、src/n32g033_it.c、firmware/n32g033_std_periph_driver/inc/n32g033_tim.h
5.18.3.9 OCToggle 输出比较翻转
工程目录: projects/n32g033_EVAL/examples/TIM/OCToggle/
使能时钟并配置四路输出引脚→配置时基与四通道为翻转→打开比较中断并启动计数→中断里累加比较值得到 50% 占空比
| 项目 | 源码解读 |
|---|---|
| 功能 | TIM3 四个通道在比较匹配时翻转输出,并在中断里把比较值自加,得到 50% 占空比。 |
| 源码组成 | src/main.c 含 RCC、GPIO、NVIC 与主函数;src/n32g033_it.c 含 TIMx_IRQHandler;inc/main.h 声明比较值与中断宏;readme.txt 给出配置与测试步骤;工程文件在 MDK-ARM/ 与 EWARM/。 |
| 关键配置 | 引脚:PA0、PA1、PB0、PB1 为 CH1-CH4; 时钟:PSC 使计数频率约 8 MHz,AR=65535; 模式:输出比较翻转,预装载关闭; 比较值:CC1 到 CC4 分别为 32768、16384、8192、4096; 中断:四通道比较中断。 |
| 程序与数据路径 | main → RCC_Configuration 打开 TIM3 与 GPIO 时钟 → 算预分频 → 配置时基与四通道为翻转 → 清四个中断标志 → TIM_ConfigInt 使能比较中断 → TIM_EnableCtrlPwmOutputs 与 TIM_Enable → 中断里翻转后累加比较值。 |
| 主要 API | TIM_InitTimBaseStruct、TIM_InitTimeBase、TIM_InitOcStruct、TIM_InitOc1、TIM_InitOc4、TIM_ClrIntPendingBit、TIM_ConfigInt、TIM_EnableCtrlPwmOutputs、TIM_Enable、TIM_SetCmp1 |
| 验证方法 | 用示波器观察四个通道; 每次比较匹配翻转一次,占空比为 50%。 |
| 使用提示 | 开发环境为 KEIL MDK-ARM V5.34.0.0 或 IAR EWARM 8.50.1,硬件基于评估板 N32G033K8Q7-1_STB V1.0; 四次通道的翻转频率各不相同。 |
核心代码解读与移植
示例让输出在比较匹配时自动翻转,中断里再把比较值累加相同增量,于是相邻两次翻转的间隔相等,占空比为 50%。
数据路径: main 算预分频 → TIM_InitTimeBase 写时基 → TIM_InitOc1 到 TIM_InitOc4 写四通道 → TIM_ConfigInt 使能比较中断 → TIM_Enable 启动计数 → TIMx_IRQHandler 翻转输出后 TIM_SetCmp1 累加比较值
1. 预分频把计数频率定为约 8 MHz。 AR 取满量程,比较值决定翻转的节拍。
/* Compute the prescaler value */
PrescalerValue = (uint16_t)((SystemCoreClock)/ 8000000) - 1;
/* Time base configuration */
TIM_InitTimBaseStruct(&TIM_TimeBaseStructure);
TIM_TimeBaseStructure.Period = 65535;
TIM_TimeBaseStructure.Prescaler = PrescalerValue;
TIM_TimeBaseStructure.ClkDiv = TIM_CLK_DIV1;
TIM_TimeBaseStructure.CounterMode = TIM_CNT_MODE_UP;
TIM_InitTimeBase(TIMx, &TIM_TimeBaseStructure);
2. 通道 1 配成翻转并关闭预装载。 关闭预装载后写入的比较值立即生效。
/* Output Compare Toggle Mode configuration: Channel1 */
TIM_InitOcStruct(&TIM_OCInitStructure);
TIM_OCInitStructure.OCMode = TIM_OCMODE_TOGGLE;
TIM_OCInitStructure.OutputState = TIM_OUTPUT_STATE_ENABLE;
TIM_OCInitStructure.Pulse = CCR1_Val;
TIM_OCInitStructure.OCPolarity = TIM_OC_POLARITY_LOW;
TIM_InitOc1(TIMx, &TIM_OCInitStructure);
TIM_ConfigOc1Preload(TIMx, TIM_OC_PRE_LOAD_DISABLE);
3. 清中断标志后打开比较中断与输出。 先清标志可避免使能中断时误触发一次。
TIM_ClrIntPendingBit(TIMx, TIM_INT_UPDATE);
TIM_ClrIntPendingBit(TIMx, TIM_INT_CC1);
TIM_ClrIntPendingBit(TIMx, TIM_INT_CC2);
TIM_ClrIntPendingBit(TIMx, TIM_INT_CC3);
TIM_ClrIntPendingBit(TIMx, TIM_INT_CC4);
/* TIM IT enable */
TIM_ConfigInt(TIMx, TIM_INT_CC1 | TIM_INT_CC2 | TIM_INT_CC3 | TIM_INT_CC4, ENABLE);
TIM_EnableCtrlPwmOutputs(TIMx, ENABLE);
/* TIM enable counter */
TIM_Enable(TIMx, ENABLE);
4. 中断里翻转并把比较值累加相同增量。 每次匹配后比较值前移固定步长,两次翻转的间隔相等。
void TIMx_IRQHandler(void)
{
/* TIMx_CH1 toggling */
if (TIM_GetIntStatus(TIMx, TIM_INT_CC1) != RESET)
{
TIM_ClrIntPendingBit(TIMx, TIM_INT_CC1);
capture = TIM_GetCap1(TIMx);
TIM_SetCmp1(TIMx, capture + CCR1_Val);
}
/* TIMx_CH2 toggling */
if (TIM_GetIntStatus(TIMx, TIM_INT_CC2) != RESET)
{
TIM_ClrIntPendingBit(TIMx, TIM_INT_CC2);
capture = TIM_GetCap2(TIMx);
TIM_SetCmp2(TIMx, capture + CCR2_Val);
}
/* TIMx_CH3 toggling */
if (TIM_GetIntStatus(TIMx, TIM_INT_CC3) != RESET)
{
TIM_ClrIntPendingBit(TIMx, TIM_INT_CC3);
capture = TIM_GetCap3(TIMx);
TIM_SetCmp3(TIMx, capture + CCR3_Val);
}
/* TIM3_CH4 toggling */
if (TIM_GetIntStatus(TIMx, TIM_INT_CC4) != RESET)
{
TIM_ClrIntPendingBit(TIMx, TIM_INT_CC4);
capture = TIM_GetCap4(TIMx);
TIM_SetCmp4(TIMx, capture + CCR4_Val);
}
}
增量决定输出频率,改用别的增量即可得到不同的翻转周期。
对应源码: src/main.c、src/n32g033_it.c、firmware/n32g033_std_periph_driver/inc/n32g033_tim.h
5.18.3.10 OnePulse 单脉冲输出
工程目录: projects/n32g033_EVAL/examples/TIM/OnePulse/
使能时钟并配置输出与触发输入引脚→配置通道 1 为 PWM2 输出→配置通道 2 上升沿捕获为触发→外部上升沿触发一个单脉冲
| 项目 | 源码解读 |
|---|---|
| 功能 | TIM4 的 CH2 上升沿触发 CH1 输出一个单脉冲。 |
| 源码组成 | src/main.c 含 RCC、GPIO、SendOneTrig 与主函数;src/n32g033_it.c 仅保留框架;inc/main.h 声明引脚与使能变量;readme.txt 给出配置与测试步骤;工程文件在 MDK-ARM/ 与 EWARM/。 |
| 关键配置 | 引脚:PA0 为 CH1 输出,PA1 为 CH2 输入,PA3 为普通推挽输出; 时钟:PSC 使计数频率约 4 MHz,AR=65535; 模式:CH1 为 PWM2,单脉冲模式; 触发:选 TI2FP2,从模式为触发模式。 |
| 程序与数据路径 | main → RCC_Configuration 打开 TIM4 与 GPIO 时钟 → 配置时基与 CH1 为 PWM2 → TIM_ICInit 在 CH2 上配置上升沿捕获 → TIM_SelectOnePulseMode 选单次 → 选 TI2FP2 与触发从模式 → 主循环调用 SendOneTrig → PA3 产生上升沿触发单脉冲。 |
| 主要 API | TIM_InitTimBaseStruct、TIM_InitTimeBase、TIM_InitOcStruct、TIM_InitOc1、TIM_InitIcStruct、TIM_ICInit、TIM_SelectOnePulseMode、TIM_SelectInputTrig、TIM_SelectSlaveMode |
| 验证方法 | PA3 连接 PA1,用示波器观察 TIM4 CH1; 调试下把 gSendTrigEn 置 1,每发一个上升沿 CH1 输出一个单脉冲。 |
| 使用提示 | 开发环境为 KEIL MDK-ARM V5.34.0.0 或 IAR EWARM 8.50.1,硬件基于评估板 N32G033K8Q7-1_STB V1.0; 脉冲宽度由 Period 与 Pulse 之差决定。 |
核心代码解读与移植
示例把 CH1 配成 PWM2 并选通单脉冲模式,CH2 的上升沿作为触发源,每来一个触发沿输出一个宽度固定的脉冲。
数据路径: main 配置时基与 CH1 → TIM_InitOc1 写 PWM2 与比较值 → TIM_ICInit 在 CH2 上捕获上升沿 → TIM_SelectOnePulseMode 选单次 → TIM_SelectInputTrig 选 TI2FP2 → TIM_SelectSlaveMode 选触发模式 → 主循环 SendOneTrig 在 PA3 产生触发沿
1. 时基与 CH1 的 PWM2 输出先建立。 Pulse 与 AR 之差决定单脉冲的宽度。
/* Compute the prescaler value */
PrescalerValue = (uint16_t)((SystemCoreClock) / 4000000) - 1;
/* Time base configuration */
TIM_InitTimBaseStruct(&TIM_TimeBaseStructure);
TIM_TimeBaseStructure.Period = 65535;
TIM_TimeBaseStructure.Prescaler = PrescalerValue;
TIM_TimeBaseStructure.ClkDiv = TIM_CLK_DIV1;
TIM_TimeBaseStructure.CounterMode = TIM_CNT_MODE_UP;
TIM_InitTimeBase(TIMx, &TIM_TimeBaseStructure);
/* TIMx PWM2 Mode configuration: Channel1 */
TIM_InitOcStruct(&TIM_OCInitStructure);
TIM_OCInitStructure.OCMode = TIM_OCMODE_PWM2;
TIM_OCInitStructure.OutputState = TIM_OUTPUT_STATE_ENABLE;
TIM_OCInitStructure.Pulse = 16383;
TIM_OCInitStructure.OCPolarity = TIM_OC_POLARITY_HIGH;
TIM_InitOc1(TIMx, &TIM_OCInitStructure);
改 AR 可改变脉冲宽度,改 Pulse 可改变脉冲在周期内的位置。
2. CH2 捕获上升沿并提供触发源。 单脉冲模式与触发从模式配合,输入沿一到达就输出一个脉冲。
/* TIMx configuration in Input Capture Mode */
TIM_InitIcStruct(&TIM_ICInitStructure);
TIM_ICInitStructure.Channel = TIM_CH_2;
TIM_ICInitStructure.ICPolarity = TIM_IC_POLARITY_RISING;
TIM_ICInitStructure.ICSelection = TIM_IC_SELECTION_DIRECTTI;
TIM_ICInitStructure.ICPrescaler = TIM_IC_PSC_DIV1;
TIM_ICInitStructure.ICFilter = 0;
TIM_ICInit(TIMx, &TIM_ICInitStructure);
/* One Pulse Mode selection */
TIM_SelectOnePulseMode(TIMx, TIM_OPMODE_SINGLE);
/* Input Trigger selection */
TIM_SelectInputTrig(TIMx, TIM_TRIG_SEL_TI2FP2);
/* Slave Mode selection: Trigger Mode */
TIM_SelectSlaveMode(TIMx, TIM_SLAVE_MODE_TRIG);
把触发源从 TI2FP2 换成其他触发线,即可由别的信号启动单脉冲。
3. 软件产生触发沿的辅助函数。 SendOneTrig 在使能时在 PA3 上翻转一次电平。
void SendOneTrig(void)
{
if (gSendTrigEn)
{
gSendTrigEn = 0;
GPIO_SetBits(GPIOA, GPIO_PIN_3);
{
uint32_t i=0;
while (i++ < 10)
;
}
GPIO_ResetBits(GPIOA, GPIO_PIN_3);
}
}
自测时可让该函数由按键或定时器驱动,也可直接由外部信号源提供触发沿。
对应源码: src/main.c、firmware/n32g033_std_periph_driver/inc/n32g033_tim.h
5.18.3.11 PWM_Input PWM 输入测量
工程目录: projects/n32g033_EVAL/examples/TIM/PWM_Input/
使能时钟并配置捕获输入与辅助输出引脚→初始化 PWM 输入双通道捕获→配置复位从模式并启动计数→中断里读两通道捕获值算频率与占空比
| 项目 | 源码解读 |
|---|---|
| 功能 | TIM3 的 CH2 捕获外部 PWM,用 CH1 的捕获值算占空比、CH2 的捕获值算频率。 |
| 源码组成 | src/main.c 含 RCC、GPIO、NVIC 与主函数;src/n32g033_it.c 含 TIMx_IRQHandler;inc/main.h 声明引脚与结果变量;readme.txt 给出配置与测试步骤;工程文件在 MDK-ARM/ 与 EWARM/。 |
| 关键配置 | 引脚:PA1 为 TIM3 CH2 输入,PA3 为普通推挽输出; 捕获:CH1 下降沿、CH2 上升沿,均由 TIM_ConfigPwmIc 配对;从模式:复位模式,主从模式使能; 中断:捕获比较 2 中断。 |
| 程序与数据路径 | main → RCC_Configuration 打开 TIM3 与 GPIO 时钟 → GPIO_Configuration 配置 CH2 与 PA3 → TIM_ConfigPwmIc 初始化 PWM 输入双通道 → 选 TI2FP2 与复位从模式 → 使能主从模式与计数器 → 开捕获中断 → 主循环由 PA3 输出方波 → 中断里按两通道捕获值算占空比与频率。 |
| 主要 API | TIM_InitIcStruct、TIM_ConfigPwmIc、TIM_SelectInputTrig、TIM_SelectSlaveMode、TIM_SelectMasterSlaveMode、TIM_Enable、TIM_ConfigInt、TIM_GetCap1、TIM_GetCap2 |
| 验证方法 | PA3 连接 PA1,把 Frequency、DutyCycle 加入 watch 窗口; 运行后可读出捕获到的频率与占空比。 |
| 使用提示 | 开发环境为 KEIL MDK-ARM V5.34.0.0 或 IAR EWARM 8.50.1,硬件基于评估板 N32G033K8Q7-1_STB V1.0; PA3 需与 PA1 短接。 |
核心代码解读与移植
PWM 输入模式把同一个输入脚同时接到两个捕获通道,一个测周期一个测高电平时间,从而一次得到频率与占空比。
数据路径: main → TIM_ConfigPwmIc 同时配置 CH1 与 CH2 → TIM_SelectInputTrig 选 TI2FP2 → TIM_SelectSlaveMode 选复位模式 → TIM_SelectMasterSlaveMode 使能 → TIM_ConfigInt 使能捕获中断 → TIMx_IRQHandler 读 TIM_GetCap1 与 TIM_GetCap2 求占空比与频率
1. 用 PWM 输入初始化把两通道一次配好。 CH2 接被测信号,CH1 在同一次调用里配成反极性。
TIM_InitIcStruct(&TIM_ICInitStructure);
TIM_ICInitStructure.Channel = TIM_CH_2;
TIM_ICInitStructure.ICPolarity = TIM_IC_POLARITY_RISING;
TIM_ICInitStructure.ICSelection = TIM_IC_SELECTION_DIRECTTI;
TIM_ICInitStructure.ICPrescaler = TIM_IC_PSC_DIV1;
TIM_ICInitStructure.ICFilter = 0x0;
/*PWM Dual-channel opposite polarity input capture initialization*/
TIM_ConfigPwmIc(TIMx, &TIM_ICInitStructure);
TIM_ConfigPwmIc 内部会选好两通道的映射与极性,换输入脚时改 TIM_ICInitStructure.Channel 即可。
2. 复位从模式与主从模式保证每个周期从头计数。 输入沿到来时计数器复位,便于周期测量。
/* Select the TIM3 Input Trigger: TI2FP2 */
TIM_SelectInputTrig(TIMx, TIM_TRIG_SEL_TI2FP2);
/* Select the slave Mode: Reset Mode */
TIM_SelectSlaveMode(TIMx, TIM_SLAVE_MODE_RESET);
/* Enable the Master/Slave Mode */
TIM_SelectMasterSlaveMode(TIMx, TIM_MASTER_SLAVE_MODE_ENABLE);
/* TIM enable counter */
TIM_Enable(TIMx, ENABLE);
/* Enable the CC2 Interrupt Request */
TIM_ConfigInt(TIMx, TIM_INT_CC2, ENABLE);
被测频率高于计数频率的 1/2 时测量会失真,需要先降低输入频率或提高计数频率。
3. 中断里按两通道捕获值求频率与占空比。 CH2 的捕获值是一个周期内的计数,CH1 的是高电平内的计数。
void TIMx_IRQHandler(void)
{
/* Clear TIMx Capture compare interrupt pending bit */
TIM_ClrIntPendingBit(TIMx, TIM_INT_CC2);
/* Get the Input Capture value */
IC2Value = TIM_GetCap2(TIMx);
if (IC2Value != 0)
{
/* Duty cycle computation */
DutyCycle = (TIM_GetCap1(TIMx) * 100) / IC2Value;
/* Frequency computation */
Frequency = SystemCoreClock / IC2Value;
}
else
{
DutyCycle = 0;
Frequency = 0;
}
}
被测信号与定时器时钟同源时测量精度最高,独立时钟源要注意两者的频率偏差。
对应源码: src/main.c、src/n32g033_it.c、firmware/n32g033_std_periph_driver/inc/n32g033_tim.h
5.18.3.12 PWM_Output PWM 输出
工程目录: projects/n32g033_EVAL/examples/TIM/PWM_Output/
使能时钟并配置四路输出引脚→计算预分频并配置时基→四通道配成 PWM 输出并写比较值→打开预装载、主输出与计数器
| 项目 | 源码解读 |
|---|---|
| 功能 | TIM3 的四个通道输出频率相同、占空比不同的四路 PWM。 |
| 源码组成 | src/main.c 含 RCC、GPIO 与主函数;src/n32g033_it.c 仅保留框架;inc/main.h 声明四通道引脚宏;readme.txt 给出配置与测试步骤;工程文件在 MDK-ARM/ 与 EWARM/。 |
| 关键配置 | 引脚:PA0、PA1、PB0、PB1 为 CH1-CH4; 时钟:PSC 使计数频率约 2 MHz,AR=1200; 模式:PWM1,四通道预装载均使能; 比较值:CC1 到 CC4 分别为 600、300、150、75。 |
| 程序与数据路径 | main → RCC_Configuration 打开 TIM3 与 GPIO 时钟 → 算预分频 → 配置时基 → 逐通道配置为 PWM1 并写比较值 → 打开四通道预装载与 AR 预装载 → TIM_EnableCtrlPwmOutputs 与 TIM_Enable 打开输出与计数。 |
| 主要 API | TIM_InitTimBaseStruct、TIM_InitTimeBase、TIM_InitOcStruct、TIM_InitOc1、TIM_InitOc4、TIM_ConfigOc1Preload、TIM_ConfigOc4Preload、TIM_ConfigArPreload、TIM_EnableCtrlPwmOutputs、TIM_Enable |
| 验证方法 | 用示波器观察四个通道; 四路周期相等、占空比不同。 |
| 使用提示 | 开发环境为 KEIL MDK-ARM V5.34.0.0 或 IAR EWARM 8.50.1,硬件基于评估板 N32G033K8Q7-1_STB V1.0; 四个比较值决定四路占空比。 |
核心代码解读与移植
示例用同一个周期和四个不同的比较值生成四路 PWM,四路的频率相同、占空比不同。
数据路径: main 算预分频 → TIM_InitTimeBase 写时基 → TIM_InitOc1 到 TIM_InitOc4 写四通道 → TIM_ConfigOc1Preload 打开预装载 → TIM_ConfigArPreload 打开 AR 预装载 → TIM_EnableCtrlPwmOutputs 打开输出 → TIM_Enable 启动计数
1. 预分频与时基把周期固定下来。 AR=1200 决定四路共用的周期。
/* Compute the prescaler value */
PrescalerValue = (uint32_t)((SystemCoreClock)/ 2000000) - 1;
/* Time base configuration */
TIM_InitTimBaseStruct(&TIM_TimeBaseStructure);
TIM_TimeBaseStructure.Period = 1200;
TIM_TimeBaseStructure.Prescaler = PrescalerValue;
TIM_TimeBaseStructure.ClkDiv = TIM_CLK_DIV1;
TIM_TimeBaseStructure.CounterMode = TIM_CNT_MODE_UP;
TIM_InitTimeBase(TIMx, &TIM_TimeBaseStructure);
2. 通道 1 配成 PWM1 并写比较值 600。 比较值与 AR 之比即占空比。
/* PWM1 Mode configuration: Channel1 */
TIM_InitOcStruct(&TIM_OCInitStructure);
TIM_OCInitStructure.OCMode = TIM_OCMODE_PWM1;
TIM_OCInitStructure.OutputState = TIM_OUTPUT_STATE_ENABLE;
TIM_OCInitStructure.Pulse = CCR1_Val;
TIM_OCInitStructure.OCPolarity = TIM_OC_POLARITY_HIGH;
TIM_InitOc1(TIMx, &TIM_OCInitStructure);
TIM_ConfigOc1Preload(TIMx, TIM_OC_PRE_LOAD_ENABLE);
3. 其余三个通道写不同比较值并打开预装载与输出。 四个比较值决定四路占空比。
TIM_ConfigOc1Preload(TIMx, TIM_OC_PRE_LOAD_ENABLE);
/* PWM1 Mode configuration: Channel2 */
TIM_OCInitStructure.OutputState = TIM_OUTPUT_STATE_ENABLE;
TIM_OCInitStructure.Pulse = CCR2_Val;
TIM_InitOc2(TIMx, &TIM_OCInitStructure);
TIM_ConfigOc2Preload(TIMx, TIM_OC_PRE_LOAD_ENABLE);
/* PWM1 Mode configuration: Channel3 */
TIM_OCInitStructure.OutputState = TIM_OUTPUT_STATE_ENABLE;
TIM_OCInitStructure.Pulse = CCR3_Val;
TIM_InitOc3(TIMx, &TIM_OCInitStructure);
TIM_ConfigOc3Preload(TIMx, TIM_OC_PRE_LOAD_ENABLE);
/* PWM1 Mode configuration: Channel4 */
TIM_OCInitStructure.OutputState = TIM_OUTPUT_STATE_ENABLE;
TIM_OCInitStructure.Pulse = CCR4_Val;
TIM_InitOc4(TIMx, &TIM_OCInitStructure);
TIM_ConfigOc4Preload(TIMx, TIM_OC_PRE_LOAD_ENABLE);
TIM_ConfigArPreload(TIMx, ENABLE);
TIM_EnableCtrlPwmOutputs(TIMx,ENABLE);
/* TIMx enable counter */
TIM_Enable(TIMx, ENABLE);
需要动态调占空比时,运行中改写比较值即可由预装载在下一个周期生效。
对应源码: src/main.c、firmware/n32g033_std_periph_driver/inc/n32g033_tim.h
5.18.3.13 TimeBase 输出比较定时中断
工程目录: projects/n32g033_EVAL/examples/TIM/TimeBase/
使能时钟并配置四个普通输出引脚→配置时基并写预分频→四通道配成比较定时模式→中断里翻转对应 IO 并累加比较值
| 项目 | 源码解读 |
|---|---|
| 功能 | TIM3 用四个通道的比较事件产生定时中断,在中断里翻转 PA3 到 PA6 的电平。 |
| 源码组成 | src/main.c 含 RCC、GPIO、NVIC 与主函数;src/n32g033_it.c 含 TIM3_IRQHandler;inc/main.h 声明比较值与中断宏;readme.txt 给出配置与测试步骤;工程文件在 MDK-ARM/ 与 EWARM/。 |
| 关键配置 | 引脚:PA3、PA4、PA5、PA6 为普通推挽输出; 时钟:PSC 使计数频率约 2 MHz,AR=65535; 模式:比较定时模式,预装载关闭; 中断:四通道比较中断全开。 |
| 程序与数据路径 | main → RCC_Configuration 打开 TIM3 与 GPIO 时钟 → GPIO_Configuration 把 PA3 到 PA6 配成输出 → 配置时基与四通道比较值 → TIM_ConfigPrescaler 写预分频 → TIM_ConfigInt 使能比较中断 → TIM_Enable 启动计数 → 中断里翻转对应 IO 并累加比较值。 |
| 主要 API | TIM_InitTimBaseStruct、TIM_InitTimeBase、TIM_ConfigPrescaler、TIM_InitOcStruct、TIM_InitOc1、TIM_InitOc4、TIM_ConfigInt、TIM_Enable、TIM_SetCmp1、TIM_GetCap1 |
| 验证方法 | 用示波器观察 PA3 到 PA6; 各通道到比较值后翻转对应 IO 并累加比较值。 |
| 使用提示 | 开发环境为 KEIL MDK-ARM V5.34.0.0 或 IAR EWARM 8.50.1,硬件基于评估板 N32G033K8Q7-1_STB V1.0; 四个比较值决定四路中断的节拍。 |
核心代码解读与移植
示例用四个通道的比较事件产生定时中断,中断里在四个 IO 上产生不同节拍的方波。
数据路径: main → TIM_InitTimeBase 写时基 → TIM_ConfigPrescaler 写预分频 → TIM_InitOc1 到 TIM_InitOc4 写四通道 → TIM_ConfigInt 使能比较中断 → TIM_Enable 启动计数 → TIM3_IRQHandler 翻转 IO 并 TIM_SetCmp1 累加比较值
1. 时基与预分频先建立计数频率。 比较值决定各通道中断的时刻。
/* Compute the prescaler value */
PrescalerValue = (uint16_t)((SystemCoreClock)/ 2000000) - 1;
/* Time base configuration */
TIM_InitTimBaseStruct(&TIM_TimeBaseStructure);
TIM_TimeBaseStructure.Period = 65535;
TIM_TimeBaseStructure.Prescaler = 0;
TIM_TimeBaseStructure.ClkDiv = TIM_CLK_DIV1;
TIM_TimeBaseStructure.CounterMode = TIM_CNT_MODE_UP;
TIM_InitTimeBase(TIM3, &TIM_TimeBaseStructure);
/* Prescaler configuration */
TIM_ConfigPrescaler(TIM3, PrescalerValue, TIM_PSC_RELOAD_MODE_IMMEDIATE);
2. 四个通道配成比较定时模式并写比较值。 比较事件只产生中断,输出引脚由软件控制。
/* Output Compare Timing Mode configuration: Channel1 */
TIM_InitOcStruct(&TIM_OCInitStructure);
TIM_OCInitStructure.OCMode = TIM_OCMODE_TIMING;
TIM_OCInitStructure.OutputState = TIM_OUTPUT_STATE_ENABLE;
TIM_OCInitStructure.Pulse = CCR1_Val;
TIM_OCInitStructure.OCPolarity = TIM_OC_POLARITY_HIGH;
TIM_InitOc1(TIM3, &TIM_OCInitStructure);
TIM_ConfigOc1Preload(TIM3, TIM_OC_PRE_LOAD_DISABLE);
/* Output Compare Timing Mode configuration: Channel2 */
TIM_OCInitStructure.OutputState = TIM_OUTPUT_STATE_ENABLE;
TIM_OCInitStructure.Pulse = CCR2_Val;
TIM_InitOc2(TIM3, &TIM_OCInitStructure);
TIM_ConfigOc2Preload(TIM3, TIM_OC_PRE_LOAD_DISABLE);
/* Output Compare Timing Mode configuration: Channel3 */
TIM_OCInitStructure.OutputState = TIM_OUTPUT_STATE_ENABLE;
TIM_OCInitStructure.Pulse = CCR3_Val;
TIM_InitOc3(TIM3, &TIM_OCInitStructure);
TIM_ConfigOc3Preload(TIM3, TIM_OC_PRE_LOAD_DISABLE);
/* Output Compare Timing Mode configuration: Channel4 */
TIM_OCInitStructure.OutputState = TIM_OUTPUT_STATE_ENABLE;
TIM_OCInitStructure.Pulse = CCR4_Val;
TIM_InitOc4(TIM3, &TIM_OCInitStructure);
TIM_ConfigOc4Preload(TIM3, TIM_OC_PRE_LOAD_DISABLE);
3. 使能四通道比较中断并启动计数。 中断节拍由各通道比较值决定。
/* TIM IT enable */
TIM_ConfigInt(TIM3, TIM_INT_CC1 | TIM_INT_CC2 | TIM_INT_CC3 | TIM_INT_CC4, ENABLE);
/* TIM3 enable counter */
TIM_Enable(TIM3, ENABLE);
4. 中断里按通道翻转 IO 并累加比较值。 累加相同增量后各通道保持固定节拍。
void TIM3_IRQHandler(void)
{
if (TIM_GetIntStatus(TIM3, TIM_INT_CC1) != RESET)
{
TIM_ClrIntPendingBit(TIM3, TIM_INT_CC1);
/* Pin PC.03 toggling */
GPIO_WriteBit(GPIOA, GPIO_PIN_3, (Bit_OperateType)(1 - GPIO_ReadOutputDataBit(GPIOA, GPIO_PIN_3)));
capture = TIM_GetCap1(TIM3);
TIM_SetCmp1(TIM3, capture + CCR1_Val);
}
else if (TIM_GetIntStatus(TIM3, TIM_INT_CC2) != RESET)
{
TIM_ClrIntPendingBit(TIM3, TIM_INT_CC2);
/* Pin PC.04 toggling */
GPIO_WriteBit(GPIOA, GPIO_PIN_4, (Bit_OperateType)(1 - GPIO_ReadOutputDataBit(GPIOA, GPIO_PIN_4)));
capture = TIM_GetCap2(TIM3);
TIM_SetCmp2(TIM3, capture + CCR2_Val);
}
else if (TIM_GetIntStatus(TIM3, TIM_INT_CC3) != RESET)
{
TIM_ClrIntPendingBit(TIM3, TIM_INT_CC3);
/* Pin PC.05 toggling */
GPIO_WriteBit(GPIOA, GPIO_PIN_5, (Bit_OperateType)(1 - GPIO_ReadOutputDataBit(GPIOA, GPIO_PIN_5)));
capture = TIM_GetCap3(TIM3);
TIM_SetCmp3(TIM3, capture + CCR3_Val);
}
else
{
TIM_ClrIntPendingBit(TIM3, TIM_INT_CC4);
/* Pin PC.06 toggling */
GPIO_WriteBit(GPIOA, GPIO_PIN_6, (Bit_OperateType)(1 - GPIO_ReadOutputDataBit(GPIOA, GPIO_PIN_6)));
capture = TIM_GetCap4(TIM3);
TIM_SetCmp4(TIM3, capture + CCR4_Val);
}
}
增量决定各路方波的周期,改用别的增量即可得到不同的翻转频率。
对应源码: src/main.c、src/n32g033_it.c、firmware/n32g033_std_periph_driver/inc/n32g033_tim.h
5.18.3.14 TimeBasic_TIM1 更新中断翻转 IO
工程目录: projects/n32g033_EVAL/examples/TIM/TimeBasic_TIM1/
使能时钟并配置输出引脚→配置时基并写预分频→打开更新中断与中断向量→更新中断里翻转 IO
| 项目 | 源码解读 |
|---|---|
| 功能 | TIM1 用更新中断按固定周期翻转 PA4 的电平。 |
| 源码组成 | src/main.c 含 RCC、GPIO、NVIC、TIM_Configuration 与主函数;src/n32g033_it.c 含 TIM1_BRK_UP_TRG_COM_IRQHandler;inc/main.h 声明引脚与中断宏;readme.txt 给出配置与测试步骤;工程文件在 MDK-ARM/ 与 EWARM/。 |
| 关键配置 | 引脚:PA4 为普通推挽输出; 时钟:PSC=0,AR=65535; 中断:TIM1 更新中断,抢占优先级 1; 向量:TIM1_BRK_UP_TRG_COM。 |
| 程序与数据路径 | main → RCC_Configuration 打开 TIM1 与 GPIO 时钟 → GPIO_Configuration 把 PA4 配成输出 → NVIC_Configuration 使能 TIM1 中断 → TIM_Configuration 配置时基、开更新中断并启动计数 → TIM1_BRK_UP_TRG_COM_IRQHandler 翻转 PA4。 |
| 主要 API | TIM_InitTimBaseStruct、TIM_InitTimeBase、TIM_ConfigPrescaler、TIM_ConfigInt、TIM_Enable、TIM_GetIntStatus、TIM_ClrIntPendingBit、NVIC_Init |
| 验证方法 | 用示波器观察 PA4; 每次更新中断到来 PA4 翻转一次。 |
| 使用提示 | 开发环境为 KEIL MDK-ARM V5.34.0.0 或 IAR EWARM 8.50.1,硬件基于评估板 N32G033K8Q7-1_STB V1.0; TIM1 属于高级定时器,更新中断与刹车中断共用向量。 |
核心代码解读与移植
示例用 TIM1 的更新事件产生定时中断,每次中断翻转一次 IO,得到周期为两次更新中断间隔的方波。
数据路径: main → RCC_Configuration 打开时钟 → GPIO_Configuration 配置 PA4 → NVIC_Configuration 使能中断 → TIM_Configuration 写时基、开更新中断并启动计数 → TIM1_BRK_UP_TRG_COM_IRQHandler 清标志后翻转 PA4
1. 配置时基、打开更新中断并启动计数。 预分频与时基决定更新中断的周期。
void TIM_Configuration(void)
{
/* Compute the prescaler value */
PrescalerValue = 0;
/* Time base configuration */
TIM_InitTimBaseStruct(&TIM_TimeBaseStructure);
TIM_TimeBaseStructure.Period = 65535;
TIM_TimeBaseStructure.Prescaler = 0;
TIM_TimeBaseStructure.ClkDiv = TIM_CLK_DIV1;
TIM_TimeBaseStructure.CounterMode = TIM_CNT_MODE_UP;
TIM_InitTimeBase(TIM1, &TIM_TimeBaseStructure);
/* Prescaler configuration */
TIM_ConfigPrescaler(TIM1, PrescalerValue, TIM_PSC_RELOAD_MODE_IMMEDIATE);
/* ATIM1 enable update irq */
TIM_ConfigInt(TIM1, TIM_INT_UPDATE, ENABLE);
/* ATIM1 enable counter */
TIM_Enable(TIM1, ENABLE);
}
改 AR 与预分频可改变中断周期,需要用更长的定时时应把预分频加大而不是把 AR 取满。
2. 先配置 NVIC 再启动定时器。 中断向量与优先级在使能中断前设定。
void NVIC_Configuration(void)
{
NVIC_InitType NVIC_InitStructure;
/* Enable the TIMx Interrupt */
NVIC_InitStructure.NVIC_IRQChannel = TIM1_BRK_UP_TRG_COM_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
3. 中断里清标志后翻转 IO。 翻转周期等于两次更新中断的间隔。
void TIM1_BRK_UP_TRG_COM_IRQHandler(void)
{
if (TIM_GetIntStatus(TIM1, TIM_INT_UPDATE) != RESET)
{
TIM_ClrIntPendingBit(TIM1, TIM_INT_UPDATE);
/* IO toggle */
GPIO_WriteBit(GPIOA, GPIO_PIN_4, (Bit_OperateType)(1 - GPIO_ReadOutputDataBit(GPIOA, GPIO_PIN_4)));
}
}
把翻转改成分频计数,可在同一个中断里得到多路不同频率的输出。
对应源码: src/main.c、src/n32g033_it.c、firmware/n32g033_std_periph_driver/inc/n32g033_tim.h
5.18.3.15 TimeBasic_TIM3 更新中断翻转 IO
工程目录: projects/n32g033_EVAL/examples/TIM/TimeBasic_TIM3/
使能时钟并配置输出引脚→配置时基并写预分频→打开更新中断与中断向量→更新中断里翻转 IO
| 项目 | 源码解读 |
|---|---|
| 功能 | TIM3 用更新中断按固定周期翻转 PA4 的电平。 |
| 源码组成 | src/main.c 含 RCC、GPIO、NVIC、TIM_Configuration 与主函数;src/n32g033_it.c 含 TIM3_IRQHandler;inc/main.h 声明引脚与中断宏;readme.txt 给出配置与测试步骤;工程文件在 MDK-ARM/ 与 EWARM/。 |
| 关键配置 | 引脚:PA4 为普通推挽输出; 时钟:PSC=0,AR=65535; 中断:TIM3 更新中断,抢占优先级 1; 向量:TIM3。 |
| 程序与数据路径 | main → RCC_Configuration 打开 TIM3 与 GPIO 时钟 → GPIO_Configuration 把 PA4 配成输出 → NVIC_Configuration 使能 TIM3 中断 → TIM_Configuration 配置时基、开更新中断并启动计数 → TIM3_IRQHandler 翻转 PA4。 |
| 主要 API | TIM_InitTimBaseStruct、TIM_InitTimeBase、TIM_ConfigPrescaler、TIM_ConfigInt、TIM_Enable、TIM_GetIntStatus、TIM_ClrIntPendingBit、NVIC_Init |
| 验证方法 | 用示波器观察 PA4; 每次更新中断到来 PA4 翻转一次。 |
| 使用提示 | 开发环境为 KEIL MDK-ARM V5.34.0.0 或 IAR EWARM 8.50.1,硬件基于评估板 N32G033K8Q7-1_STB V1.0; 通用定时器 TIM3 的更新中断使用独立的向量。 |
核心代码解读与移植
示例用 TIM3 的更新事件产生定时中断,每次中断翻转一次 IO,其余配置与 TIM1 版一致。
数据路径: main → RCC_Configuration 打开时钟 → GPIO_Configuration 配置 PA4 → NVIC_Configuration 使能中断 → TIM_Configuration 写时基、开更新中断并启动计数 → TIM3_IRQHandler 清标志后翻转 PA4
1. 配置时基、打开更新中断并启动计数。 预分频与时基决定更新中断的周期。
void TIM_Configuration(void)
{
/* Compute the prescaler value */
PrescalerValue = 0;
/* Time base configuration */
TIM_InitTimBaseStruct(&TIM_TimeBaseStructure);
TIM_TimeBaseStructure.Period = 65535;
TIM_TimeBaseStructure.Prescaler = 0;
TIM_TimeBaseStructure.ClkDiv = TIM_CLK_DIV1;
TIM_TimeBaseStructure.CounterMode = TIM_CNT_MODE_UP;
TIM_InitTimeBase(TIM3, &TIM_TimeBaseStructure);
/* Prescaler configuration */
TIM_ConfigPrescaler(TIM3, PrescalerValue, TIM_PSC_RELOAD_MODE_IMMEDIATE);
/* TIM3 enable update irq */
TIM_ConfigInt(TIM3, TIM_INT_UPDATE, ENABLE);
/* TIM3 enable counter */
TIM_Enable(TIM3, ENABLE);
}
改 AR 与预分频可改变中断周期,较长的定时应通过加大预分频实现。
2. 先配置 NVIC 再启动定时器。 中断向量与优先级在使能中断前设定。
void NVIC_Configuration(void)
{
NVIC_InitType NVIC_InitStructure;
/* Enable the TIMx Interrupt */
NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
3. 中断里清标志后翻转 IO。 翻转周期等于两次更新中断的间隔。
void TIM3_IRQHandler(void)
{
if (TIM_GetIntStatus(TIM3, TIM_INT_UPDATE) != RESET)
{
TIM_ClrIntPendingBit(TIM3, TIM_INT_UPDATE);
/* IO toggle */
GPIO_WriteBit(GPIOA, GPIO_PIN_4, (Bit_OperateType)(1 - GPIO_ReadOutputDataBit(GPIOA, GPIO_PIN_4)));
}
}
把翻转改成分频计数,可在同一个中断里得到多路不同频率的输出。
对应源码: src/main.c、src/n32g033_it.c、firmware/n32g033_std_periph_driver/inc/n32g033_tim.h
5.18.3.16 TimeBasic_TIM4 更新中断翻转 IO
工程目录: projects/n32g033_EVAL/examples/TIM/TimeBasic_TIM4/
使能时钟并配置输出引脚→配置时基并写预分频→打开更新中断与中断向量→更新中断里翻转 IO
| 项目 | 源码解读 |
|---|---|
| 功能 | TIM4 用更新中断按固定周期翻转 PA4 的电平。 |
| 源码组成 | src/main.c 含 RCC、GPIO、NVIC、TIM_Configuration 与主函数;src/n32g033_it.c 含 TIM4_IRQHandler;inc/main.h 声明引脚与中断宏;readme.txt 给出配置与测试步骤;工程文件在 MDK-ARM/ 与 EWARM/。 |
| 关键配置 | 引脚:PA4 为普通推挽输出; 时钟:PSC=0,AR=65535; 中断:TIM4 更新中断,抢占优先级 1; 向量:TIM4。 |
| 程序与数据路径 | main → RCC_Configuration 打开 TIM4 与 GPIO 时钟 → GPIO_Configuration 把 PA4 配成输出 → NVIC_Configuration 使能 TIM4 中断 → TIM_Configuration 配置时基、开更新中断并启动计数 → TIM4_IRQHandler 翻转 PA4。 |
| 主要 API | TIM_InitTimBaseStruct、TIM_InitTimeBase、TIM_ConfigPrescaler、TIM_ConfigInt、TIM_Enable、TIM_GetIntStatus、TIM_ClrIntPendingBit、NVIC_Init |
| 验证方法 | 用示波器观察 PA4; 每次更新中断到来 PA4 翻转一次。 |
| 使用提示 | 开发环境为 KEIL MDK-ARM V5.34.0.0 或 IAR EWARM 8.50.1,硬件基于评估板 N32G033K8Q7-1_STB V1.0; 通用定时器 TIM4 的更新中断使用独立的向量。 |
核心代码解读与移植
示例用 TIM4 的更新事件产生定时中断,每次中断翻转一次 IO,其余配置与 TIM1、TIM3 版一致。
数据路径: main → RCC_Configuration 打开时钟 → GPIO_Configuration 配置 PA4 → NVIC_Configuration 使能中断 → TIM_Configuration 写时基、开更新中断并启动计数 → TIM4_IRQHandler 清标志后翻转 PA4
1. 配置时基、打开更新中断并启动计数。 预分频与时基决定更新中断的周期。
void TIM_Configuration(void)
{
/* Compute the prescaler value */
PrescalerValue = 0;
/* Time base configuration */
TIM_InitTimBaseStruct(&TIM_TimeBaseStructure);
TIM_TimeBaseStructure.Period = 65535;
TIM_TimeBaseStructure.Prescaler = 0;
TIM_TimeBaseStructure.ClkDiv = TIM_CLK_DIV1;
TIM_TimeBaseStructure.CounterMode = TIM_CNT_MODE_UP;
TIM_InitTimeBase(TIM4, &TIM_TimeBaseStructure);
/* Prescaler configuration */
TIM_ConfigPrescaler(TIM4, PrescalerValue, TIM_PSC_RELOAD_MODE_IMMEDIATE);
/* TIM4 enable update irq */
TIM_ConfigInt(TIM4, TIM_INT_UPDATE, ENABLE);
/* TIM4 enable counter */
TIM_Enable(TIM4, ENABLE);
}
改 AR 与预分频可改变中断周期,较长的定时应通过加大预分频实现。
2. 先配置 NVIC 再启动定时器。 中断向量与优先级在使能中断前设定。
void NVIC_Configuration(void)
{
NVIC_InitType NVIC_InitStructure;
/* Enable the TIMx Interrupt */
NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
3. 中断里清标志后翻转 IO。 翻转周期等于两次更新中断的间隔。
void TIM4_IRQHandler(void)
{
if (TIM_GetIntStatus(TIM4, TIM_INT_UPDATE) != RESET)
{
TIM_ClrIntPendingBit(TIM4, TIM_INT_UPDATE);
/* IO toggle */
GPIO_WriteBit(GPIOA, GPIO_PIN_4, (Bit_OperateType)(1 - GPIO_ReadOutputDataBit(GPIOA, GPIO_PIN_4)));
}
}
把翻转改成分频计数,可在同一个中断里得到多路不同频率的输出。
对应源码: src/main.c、src/n32g033_it.c、firmware/n32g033_std_periph_driver/inc/n32g033_tim.h
5.18.3.17 TimeBasic_TIM6 更新中断翻转 IO
工程目录: projects/n32g033_EVAL/examples/TIM/TimeBasic_TIM6/
使能时钟并配置输出引脚→配置时基并写预分频→配置 EXTI 线 9 与更新中断→更新中断里清标志并翻转 IO
| 项目 | 源码解读 |
|---|---|
| 功能 | TIM6 用更新中断按固定周期翻转 PA4 的电平。 |
| 源码组成 | src/main.c 含 RCC、GPIO、NVIC、TIM_Configuration 与主函数;src/n32g033_it.c 含 TIM6_IRQHandler;inc/main.h 声明引脚与中断宏;readme.txt 给出配置与测试步骤;工程文件在 MDK-ARM/ 与 EWARM/。 |
| 关键配置 | 引脚:PA4 为普通推挽输出; 时钟:PSC=0,AR=65535; 中断:TIM6 更新中断并使能 EXTI 线 9,抢占优先级 1; 向量:TIM6。 |
| 程序与数据路径 | main → RCC_Configuration 打开 TIM6 与 GPIO 时钟 → GPIO_Configuration 把 PA4 配成输出 → NVIC_Configuration 配置 EXTI 线 9 与 TIM6 中断 → TIM_Configuration 配置时基、开更新中断并启动计数 → TIM6_IRQHandler 清中断与 EXTI 标志后翻转 PA4。 |
| 主要 API | TIM_InitTimBaseStruct、TIM_InitTimeBase、TIM_ConfigPrescaler、TIM_ConfigInt、TIM_Enable、TIM_GetIntStatus、TIM_ClrIntPendingBit、EXTI_InitPeripheral、EXTI_ClrITPendBit |
| 验证方法 | 用示波器观察 PA4; 每次更新中断到来 PA4 翻转一次。 |
| 使用提示 | 开发环境为 KEIL MDK-ARM V5.34.0.0 或 IAR EWARM 8.50.1,硬件基于评估板 N32G033K8Q7-1_STB V1.0; TIM6 属于基本定时器,更新中断需联接到 EXTI 线 9。 |
核心代码解读与移植
示例用 TIM6 的更新事件产生定时中断,中断里同时清 TIM6 与 EXTI 线 9 的标志,翻转一次 IO。
数据路径: main → RCC_Configuration 打开时钟 → GPIO_Configuration 配置 PA4 → NVIC_Configuration 配置 EXTI 线 9 与中断 → TIM_Configuration 写时基、开更新中断并启动计数 → TIM6_IRQHandler 清 TIM6 与 EXTI 标志后翻转 PA4
1. 配置时基、打开更新中断并启动计数。 TIM6 无输出引脚,更新事件只作定时用。
void TIM_Configuration(void)
{
/* Compute the prescaler value */
PrescalerValue = 0;
/* Time base configuration */
TIM_InitTimBaseStruct(&TIM_TimeBaseStructure);
TIM_TimeBaseStructure.Period = 65535;
TIM_TimeBaseStructure.Prescaler = 0;
TIM_TimeBaseStructure.ClkDiv = TIM_CLK_DIV1;
TIM_TimeBaseStructure.CounterMode = TIM_CNT_MODE_UP;
TIM_InitTimeBase(TIM6, &TIM_TimeBaseStructure);
/* Prescaler configuration */
TIM_ConfigPrescaler(TIM6, PrescalerValue, TIM_PSC_RELOAD_MODE_IMMEDIATE);
/* TIM6 enable update irq */
TIM_ConfigInt(TIM6, TIM_INT_UPDATE, ENABLE);
/* TIM6 enable counter */
TIM_Enable(TIM6, ENABLE);
}
2. 先配置 EXTI 线 9 与 NVIC 再启动定时器。 更新中断经 EXTI 线 9 进入内嵌向量控制器。
void NVIC_Configuration(void)
{
NVIC_InitType NVIC_InitStructure;
EXTI_InitType EXTI_Struct;
EXTI_Struct.EXTI_Line = EXTI_LINE9;
EXTI_Struct.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_Struct.EXTI_Trigger = EXTI_Trigger_Rising;
EXTI_Struct.EXTI_LineCmd = ENABLE;
EXTI_InitPeripheral(&EXTI_Struct);
/* Enable the TIMx Interrupt */
NVIC_InitStructure.NVIC_IRQChannel = TIM6_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
3. 中断里清两个标志后翻转 IO。 TIM6 的更新标志与 EXTI 线 9 的挂起位都要清。
void TIM6_IRQHandler(void)
{
if (TIM_GetIntStatus(TIM6, TIM_INT_UPDATE) != RESET)
{
TIM_ClrIntPendingBit(TIM6, TIM_INT_UPDATE);
EXTI_ClrITPendBit(EXTI_LINE9);
/* IO toggle */
GPIO_WriteBit(GPIOA, GPIO_PIN_4, (Bit_OperateType)(1 - GPIO_ReadOutputDataBit(GPIOA, GPIO_PIN_4)));
}
}
漏清 EXTI 标志会导致中断被反复触发,移植时把两级标志一起处理。
对应源码: src/main.c、src/n32g033_it.c、firmware/n32g033_std_periph_driver/inc/n32g033_tim.h
5.18.3.18 TimeBasic6_wakeup TIM6 唤醒 STOP
工程目录: projects/n32g033_EVAL/examples/TIM/TimeBasic6_wakeup/
使能时钟并配置 LED 引脚→配置 EXTI 线 9 与更新中断→把 TIM6 时钟切到 LSI 并启动计数→进入 STOP,被更新中断唤醒后翻转 LED
| 项目 | 源码解读 |
|---|---|
| 功能 | TIM6 以 LSI 为时钟源,用更新中断把芯片从 STOP 模式周期唤醒,翻转 PA6 上的 LED。 |
| 源码组成 | src/main.c 含 RCC、GPIO、NVIC、TIM_Configuration、SetSysClock_LSI 与主函数;src/n32g033_it.c 含 TIM6_IRQHandler;inc/main.h 与 delay.h;readme.txt 给出配置与测试步骤;工程文件在 MDK-ARM/ 与 EWARM/。 |
| 关键配置 | 引脚:PA6 为普通推挽输出,驱动 LED(D1); 时钟:时钟源 LSI,SYS_CLK=32 kHz; 时基:PSC=0,AR=3200; 中断:TIM6 更新中断并联接 EXTI 线 9。 |
| 程序与数据路径 | main → RCC_Configuration 打开 TIM6、GPIO 与 PWR 时钟 → GPIO_Configuration 把 PA6 配成输出 → NVIC_Configuration 配置 EXTI 线 9 与 TIM6 中断 → 延时后 TIM_Configuration 配置时基并开更新中断 → RCC_ConfigTim6Clk 选 LSI 作 TIM6 时钟 → 循环进入 STOP → 更新中断唤醒后在循环里翻转 PA6。 |
| 主要 API | TIM_InitTimBaseStruct、TIM_InitTimeBase、TIM_ClearFlag、TIM_ConfigInt、TIM_Enable、RCC_ConfigTim6Clk、PWR_EnterSTOPMode、EXTI_InitPeripheral、SysTick_Delay_Ms |
| 验证方法 | 下载复位后 LED(D1) 按周期闪烁; 把 TIM6 更新中断联接到 EXTI 线 9 才能在 STOP 下唤醒。 |
| 使用提示 | 开发环境为 KEIL MDK-ARM V5.34.0.0 或 IAR EWARM 8.50.1,硬件基于评估板 N32G033K8Q7-1_STB V1.0; 时钟源为 LSI,SYS_CLK=32 kHz; 使用 delay.h 的 SysTick 毫秒延时。 |
核心代码解读与移植
示例把 TIM6 的时钟切到 LSI,配置更新中断后让芯片进入 STOP,更新事件经 EXTI 线 9 唤醒芯片并翻转 LED。
数据路径: main 延时后调 TIM_Configuration → RCC_ConfigTim6Clk 选 LSI → TIM_Enable 启动计数 → 循环 PWR_EnterSTOPMode 进入 STOP → 更新事件经 EXTI 线 9 唤醒 → TIM6_IRQHandler 清标志
1. 主流程配置后进入 STOP,等待更新中断唤醒。 STOP 模式由 WFI 进入,唤醒后继续在主循环翻转 LED。
int main(void)
{
/* System Clocks Configuration */
RCC_Configuration();
/* GPIO Configuration */
GPIO_Configuration();
/* NVIC Configuration */
NVIC_Configuration();
SysTick_Delay_Ms(500);
/* Reconfig TIM6 */
TIM_Configuration();
RCC_ConfigTim6Clk(RCC_TIM6_CLKSRC_LSI);
/* TIM6 enable counter */
TIM_Enable(TIM6, ENABLE);
while (1)
{
/* Enter STOP mode */
PWR_EnterSTOPMode(PWR_STOPENTRY_WFI);
GPIO_WriteBit(GPIOA, GPIO_PIN_6, (Bit_OperateType)(1 - GPIO_ReadOutputDataBit(GPIOA, GPIO_PIN_6)));
}
}
在 STOP 之前要先把外设与中断配好,唤醒后除系统时钟外的大多数配置保持不变。
2. 配置 EXTI 线 9 与 TIM6 中断向量。 TIM6 的更新事件联接到 EXTI 线 9,才具有把芯片从 STOP 唤醒的能力。
void NVIC_Configuration(void)
{
NVIC_InitType NVIC_InitStructure;
EXTI_InitType EXTI_Struct;
EXTI_ClrStatusFlag(EXTI_LINE9);
EXTI_Struct.EXTI_Line = EXTI_LINE9;
EXTI_Struct.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_Struct.EXTI_Trigger = EXTI_Trigger_Rising;
EXTI_Struct.EXTI_LineCmd = ENABLE;
EXTI_InitPeripheral(&EXTI_Struct);
/* Enable the TIMx Interrupt */
NVIC_InitStructure.NVIC_IRQChannel = TIM6_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
3. 配置时基并清更新标志后开更新中断。 先清标志可避免使能中断时立即触发一次。
void TIM_Configuration(void)
{
/* Time base configuration */
TIM_InitTimBaseStruct(&TIM_TimeBaseStructure);
TIM_TimeBaseStructure.Period = 3200;
TIM_TimeBaseStructure.Prescaler = 0;
TIM_TimeBaseStructure.ClkDiv = TIM_CLK_DIV1;
TIM_TimeBaseStructure.CounterMode = TIM_CNT_MODE_UP;
TIM_InitTimeBase(TIM6, &TIM_TimeBaseStructure);
/* TIM6 enable update irq */
TIM_ClearFlag(TIM6,TIM_FLAG_UPDATE);
TIM_ConfigInt(TIM6, TIM_INT_UPDATE, ENABLE);
}
4. 用 LSI 作 TIM6 时钟源。 RCC_ConfigTim6Clk 在 LSI 就绪后把 TIM6 的时钟切到 LSI。
ErrorStatus SetSysClock_LSI(void)
{
uint32_t timeout_value = 0xFFFFFFFF;
/* Wait till LSI is ready */
if (RCC_GetFlagStatus(RCC_CLKINT_FLAG_LSIRDF) == SET)
{
/* HCLK = SYSCLK */
RCC_ConfigHclk(RCC_SYSCLK_DIV1);
/* PCLK = HCLK */
RCC_ConfigPclk(RCC_HCLK_DIV1);
RCC_ConfigSysclk(RCC_SYSCLK_SRC_LSI);
while (RCC_GetSysclkSrc() != RCC_CFG_SCLKSTS_LSI)
{
if ((timeout_value--) == 0)
{
return ERROR;
}
}
FLASH_SetLatency(FLASH_LATENCY_0);
}
else
{
/* If LSI fails to start-up, the application will have wrong clock
configuration. User can add here some code to deal with this error */
return ERROR;
}
return SUCCESS;
}
LSI 频率随温度与电压有偏差,定时精度不高的场合才用它;对精度有要求时应改用 LSE 或 HSI。
对应源码: src/main.c、src/n32g033_it.c、firmware/n32g033_std_periph_driver/inc/n32g033_tim.h
5.18.3.19 TIMx_Synchro 主从同步
工程目录: projects/n32g033_EVAL/examples/TIM/TIMx_Synchro/
使能时钟并配置主从两定时器的引脚→配置从定时器为门控模式→配置主定时器并选更新事件作触发→从定时器随主定时器周期在门控下计数
| 项目 | 源码解读 |
|---|---|
| 功能 | TIM1 作为主定时器,TIM3 在其更新事件门控下计数,一个 TIM3 周期内包含 15 个 TIM1 周期。 |
| 源码组成 | src/main.c 含 RCC、GPIO 与主函数;src/n32g033_it.c 仅保留框架;inc/main.h 声明主从定时器与引脚宏;readme.txt 给出配置与测试步骤;工程文件在 MDK-ARM/ 与 EWARM/。 |
| 关键配置 | 引脚:PA4 为 TIM1 CH1,PA6 为 TIM3 CH1; 时钟:PSC=0; 主定时器:PWM2,Period=255,重复计数 4,更新事件作触发输出; 从定时器:PWM1,Period=2,门控模式,触发选 IN_TR0。 |
| 程序与数据路径 | main → RCC_Configuration 打开 TIM1、TIM3 与 GPIO 时钟 → 先把 TIM3 配成时基 Period=2 与 PWM1 并选门控从模式 → 再把 TIM1 配成 Period=255、重复计数 4 的 PWM2 并写 BDTR → TIM_SelectMasterSlaveMode 与 TIM_SelectOutputTrig 选更新事件 → 打开两定时器与主输出。 |
| 主要 API | TIM_InitTimBaseStruct、TIM_InitTimeBase、TIM_InitOcStruct、TIM_InitOc1、TIM_SelectSlaveMode、TIM_SelectInputTrig、TIM_InitBkdtStruct、TIM_ConfigBkdt、TIM_SelectMasterSlaveMode、TIM_SelectOutputTrig、TIM_Enable、TIM_EnableCtrlPwmOutputs |
| 验证方法 | 用示波器观察 TIM1 CH1 与 TIM3 CH1; TIM3 的周期约为 TIM1 的 15 倍。 |
| 使用提示 | 开发环境为 KEIL MDK-ARM V5.34.0.0 或 IAR EWARM 8.50.1,硬件基于评估板 N32G033K8Q7-1_STB V1.0; TIM1 作主定时器,TIM3 作从定时器。 |
核心代码解读与移植
示例让 TIM1 的更新事件作触发输出门控 TIM3,据此得到从定时器在主定时器多个周期后翻转的同步波形。
数据路径: main 先配 TIM3 时基与 PWM1 → TIM_SelectSlaveMode 与 TIM_SelectInputTrig 把 TIM3 设为门控从模式 → 再配 TIM1 时基、PWM2 与 BDTR → TIM_SelectOutputTrig 用更新事件作触发 → TIM_SelectMasterSlaveMode 使能 → TIM_Enable 启动两定时器
1. 先配置从定时器时基与 PWM1 输出。 从定时器周期短,门控有效时可在主定时器一个周期内多次计数。
/*TIMy Slave Configuration: PWM1 Mode */
TIM_InitTimBaseStruct(&TIM_TimeBaseStructure);
TIM_TimeBaseStructure.Period = 2;
TIM_TimeBaseStructure.Prescaler = 0;
TIM_TimeBaseStructure.ClkDiv = TIM_CLK_DIV1;
TIM_TimeBaseStructure.CounterMode = TIM_CNT_MODE_UP;
TIM_InitTimeBase(TIMy, &TIM_TimeBaseStructure);
TIM_InitOcStruct(&TIM_OCInitStructure);
TIM_OCInitStructure.OCMode = TIM_OCMODE_PWM1;
TIM_OCInitStructure.OutputState = TIM_OUTPUT_STATE_ENABLE;
TIM_OCInitStructure.Pulse = 1;
TIM_InitOc1(TIMy, &TIM_OCInitStructure);
/* Slave Mode selection: TIMy */
TIM_SelectSlaveMode(TIMy, TIM_SLAVE_MODE_GATED);
TIM_SelectInputTrig(TIMy, TIM_TRIG_SEL_IN_TR0);
改从定时器的 Period 可以改变一个主周期内的计数次数。
2. 主定时器用 PWM2 并选更新事件作触发。 主定时器的重复计数与周期一起决定触发输出的频率。
/* Time Base configuration */
TIM_TimeBaseStructure.Prescaler = 0;
TIM_TimeBaseStructure.CounterMode = TIM_CNT_MODE_UP;
TIM_TimeBaseStructure.Period = 255;
TIM_TimeBaseStructure.ClkDiv = TIM_CLK_DIV1;
TIM_TimeBaseStructure.RepetCnt = 4;
TIM_InitTimeBase(TIMx, &TIM_TimeBaseStructure);
/* Channel 1 Configuration in PWM mode */
TIM_OCInitStructure.OCMode = TIM_OCMODE_PWM2;
TIM_OCInitStructure.OutputState = TIM_OUTPUT_STATE_ENABLE;
TIM_OCInitStructure.OutputNState = TIM_OUTPUT_NSTATE_DISABLE;
TIM_OCInitStructure.Pulse = 127;
TIM_OCInitStructure.OCPolarity = TIM_OC_POLARITY_LOW;
TIM_OCInitStructure.OCNPolarity = TIM_OCN_POLARITY_LOW;
TIM_OCInitStructure.OCIdleState = TIM_OC_IDLE_STATE_SET;
TIM_OCInitStructure.OCNIdleState = TIM_OCN_IDLE_STATE_RESET;
TIM_InitOc1(TIMx, &TIM_OCInitStructure);
3. 写 BDTR 后使能主从模式与输出。 主输出使能位有效后主定时器的引脚才会驱动。
/* Automatic Output enable, Break, dead time and lock configuration*/
TIM_InitBkdtStruct(&TIM_BDTRInitStructure);
TIM_BDTRInitStructure.OSSRState = TIM_OSSR_STATE_ENABLE;
TIM_BDTRInitStructure.OSSIState = TIM_OSSI_STATE_ENABLE;
TIM_BDTRInitStructure.LOCKLevel = TIM_LOCK_LEVEL_1;
TIM_BDTRInitStructure.DeadTime = 0;
TIM_BDTRInitStructure.Break = TIM_BREAK_IN_DISABLE;
TIM_BDTRInitStructure.BreakPolarity = TIM_BREAK_POLARITY_HIGH;
TIM_BDTRInitStructure.AutomaticOutput = TIM_AUTO_OUTPUT_DISABLE;
TIM_ConfigBkdt(TIMx, &TIM_BDTRInitStructure);
/* Select the Master Slave Mode */
TIM_SelectMasterSlaveMode(TIMx, TIM_MASTER_SLAVE_MODE_ENABLE);
/* Master Mode selection */
TIM_SelectOutputTrig(TIMx, TIM_TRGO_SRC_UPDATE);
/* TIMx counter enable */
TIM_Enable(TIMx, ENABLE);
/* TIM enable counter */
TIM_Enable(TIMy, ENABLE);
/* Main Output Enable */
TIM_EnableCtrlPwmOutputs(TIMx, ENABLE);
把触发输出从更新事件换成使能事件或比较脉冲,可得到不同的同步节拍。
对应源码: src/main.c、firmware/n32g033_std_periph_driver/inc/n32g033_tim.h
5.18.4 注意与排障
| 场景 | 检查与建议 | 来源 |
|---|---|---|
| 中心对齐与边沿对齐之间切换 | 用户手册 TIM1 章写明当计数器仍启用时(TIMx_CTRL1.CNTEN=1)不允许从边缘对齐模式切换到中央对齐模式;计数方向位在中央对齐模式或编码器模式下为只读。 |
用户手册 |
| 禁用更新事件(UPDIS) | 用户手册 TIM1 章写明 TIMx_CTRL1.UPDIS=1 时不生成更新事件,影子寄存器(AR、PSC 与 CCDATx)保持原值;需要重装载时保持 UPDIS=0,让新值在更新事件时传入影子寄存器。 |
用户手册 |
| 门控与复位从模式的启动 | 用户手册 TIM1 章写明在门控加复位模式下若 TIMx_CTRL1.CNTEN=0,则计数器不启动,与触发输入电平无关;软件置 CNTEN 后还需等待至少两个 TIMx_CLK 才能同步生效。 |
用户手册 |
| 外部时钟模式 1 的捕获预分频器 | 用户手册 TIM1 章写明触发操作中不使用捕获预分频器,无需配置,输入选择位只用于选择输入捕获源。 | 用户手册 |
| 外部触发(ETR)频率上限 | 用户手册 TIM1 章写明外部触发信号 ETRP 的频率必须最多为 TIMx_CLK 频率的四分之一; 输入更快的外部时钟时用外部触发预分频降低 ETRP 频率。 |
用户手册 |
| 编码器模式与外部时钟模式 2 | 用户手册 TIM3 章写明编码器模式和外部时钟模式 2 不兼容,不能同时选择。 | 用户手册 |
| 刹车输入与主输出 | 用户手册 TIM3 章写明一旦刹车输入有效,主输出使能位由硬件异步清零,输出立即进入空闲状态; 刹车有效期间该位不能自动置位或由软件置位,刹车中断标志也不能清零。 |
用户手册 |
| 中央对齐非对称模式 | 用户手册 TIM1 章写明该功能仅适用于 TIM1,且需 TIMx_CTRL1.CAMSEL 非零时有效;向上计数时与 CCDATx 比较,向下计数时与 CCDDx 比较。 |
用户手册 |
| 从模式控制位的改动时机 | 用户手册 TIM1 章写明从模式控制器被禁用时,CNTEN 与 DIR 只能由软件改变; 触发选择位只能在未用到时改变,避免在改动时产生错误的边沿检测。 |
用户手册 |
| 预装载值到影子寄存器的时机 | 用户手册 TIM1 章写明预装载寄存器的值按 ARPEN 设置立即或在每次更新事件时传输到影子寄存器; 软件置 CNTEN 后,计数器在下一个时钟周期开始计数。 |
用户手册 |
| TIM6 以 LSI 为时钟源 | 用户手册 TIM6 章写明时钟源配置为 LSI 时 TIMx_CNT 不支持写入;此时可用更新中断(联接到 EXTI 9)唤醒 STOP 模式。 |
用户手册 |
勘误手册 V1.0.0(2025.9.25)针对 A 版芯片,未列出 TIM 相关条目。