5.20 TIM 使用说明
本章说明 N32G41x 标准外设库中 TIM 驱动的文件组成与 154 个公开函数,覆盖高级控制定时器 ATIM1/ATIM2、通用定时器 GTIM1、GTIM2、通用控制定时器 GTIM3/GTIM4 与基本定时器 BTIM1/BTIM2 的时基、输出比较、输入捕获、互补输出与刹车/死区、编码器、从/主模式与同步、DMA 以及中断与标志管理;projects/n32g41x_EVAL/examples/TIM/ 下的 18 个示例演示 PWM 输出与输入、输入捕获、单脉冲、各类同步与 DMA 等用法。各定时器的寄存器定义与模式限制请配合用户手册的“高级控制定时器 (ATIM1/ATIM2)”“通用定时器 (GTIM1)”“通用定时器 (GTIM2)”“通用控制定时器 (GTIM3/GTIM4)”“基本定时器 (BTIM1/BTIM2)”章节阅读,芯片已知问题以勘误手册为准。
5.20.1 相关文件
| 相对路径 | 作用 |
|---|---|
firmware/n32g41x_std_periph_driver/inc/n32g41x_tim.h |
定义时基、输出比较、输入捕获、BKDT 与滤波五个初始化结构体及各模式、通道宏,并按十个功能区段声明 154 个公开函数 |
firmware/n32g41x_std_periph_driver/src/n32g41x_tim.c |
实现上述 154 个函数:读写 CTRL1、CTRL2、STS、CCMODx、CCEN、CCDATx 等寄存器,完成时基与预分频配置、输出比较与 PWM、输入捕获与滤波、刹车与死区、编码器接口、触发与同步、DMA 请求以及中断与标志管理 |
projects/n32g41x_EVAL/examples/TIM/ |
包含 18 个示例:6Steps、ATIM1_Synchro、Cascade_Synchro、ComplementarySignals、DMA、DMABurst、ExtTrigger_Synchro、InputCapture、OCActive、OCInactive、OCToggle、OnePulse、Parallel_Synchro、PWM_Input、PWM_Output、TimeBasic6_BTIM_wakeup、TimeBasic_cc、TimeBasic_update |
projects/n32g41x_EVAL/examples/TIM/PWM_Output/ |
演示主功能的示例工程,含 src/main.c、src/n32g41x_it.c、inc/main.h、inc/n32g41x_it.h、readme.txt 以及 MDK-ARM/、EWARM/ 两套构建工程 |
firmware/CMSIS/device/n32g41x.h |
定义 TIM_Module 寄存器结构、ATIM1/ATIM2/GTIM1~GTIM4/BTIM1/BTIM2 基址指针与各定时器的寄存器映射 |
5.20.2 API 参考
以下 154 个公开函数按 n32g41x_tim.h 的声明顺序分为 10 组;每个条目给出功能摘要与 n32g41x_tim.c 中该函数正上方的注释原文。
复位与初始化
TIM_DeInit、TIM_InitTimeBase、TIM_InitTimBaseStruct、TIM_InitOcStruct、TIM_InitIcStruct、TIM_InitBkdtStruct、TIM_Enable
时基配置
TIM_ConfigPrescaler、TIM_ConfigCntMode、TIM_ConfigArPreload、TIM_SetCnt、TIM_SetAutoReload、TIM_GetCnt、TIM_GetPrescaler、TIM_GetAutoReload、TIM_SetClkDiv、TIM_ConfigUpdateEvt、TIM_ConfigUpdateRequestIntSrc、TIM_SelectOnePulseMode、TIM_GenerateEvent
输出比较
TIM_InitOc1、TIM_InitOc2、TIM_InitOc3、TIM_InitOc4、TIM_InitOc5、TIM_InitOc6、TIM_SelectOcMode、TIM_ConfigForcedOc1、TIM_ConfigForcedOc2、TIM_ConfigForcedOc3、TIM_ConfigForcedOc4、TIM_ConfigForcedOc5、TIM_ConfigForcedOc6、TIM_ConfigOc1Preload、TIM_ConfigOc2Preload、TIM_ConfigOc3Preload、TIM_ConfigOc4Preload、TIM_ConfigOc5Preload、TIM_ConfigOc6Preload、TIM_ConfigOc7Preload、TIM_ConfigOc8Preload、TIM_ConfigOc9Preload、TIM_ConfigOc1Fast、TIM_ConfigOc2Fast、TIM_ConfigOc3Fast、TIM_ConfigOc4Fast、TIM_ConfigOc5Fast、TIM_ConfigOc6Fast、TIM_ClrOc1Ref、TIM_ClrOc2Ref、TIM_ClrOc3Ref、TIM_ClrOc4Ref、TIM_ClrOc5Ref、TIM_ClrOc6Ref、TIM_ClrOcRefInputSource、TIM_ConfigOc1Polarity、TIM_ConfigOc1NPolarity、TIM_ConfigOc2Polarity、TIM_ConfigOc2NPolarity、TIM_ConfigOc3Polarity、TIM_ConfigOc3NPolarity、TIM_ConfigOc4Polarity、TIM_ConfigOc4NPolarity、TIM_ConfigOc5Polarity、TIM_ConfigOc6Polarity、TIM_EnableCapCmpCh、TIM_EnableCapCmpChN、TIM_SetCmp1、TIM_SetCmp2、TIM_SetCmp3、TIM_SetCmp4、TIM_SetCmp5、TIM_SetCmp6、TIM_SetCmp7、TIM_SetCmp8、TIM_SetCmp9、TIM_SetCmp1D、TIM_SetCmp2D、TIM_SetCmp3D、TIM_SetCmp4D、TIM_AsymmetricEnable、TIM_SelectCenterAlignTrig、TIM_OCxRefTriggerADC
输入捕获
TIM_ICInit、TIM_ConfigPwmIc、ConfigTI1、ConfigTI2、ConfigTI3、ConfigTI4、TIM_SetInCap1Prescaler、TIM_SetInCap2Prescaler、TIM_SetInCap3Prescaler、TIM_SetInCap4Prescaler、TIM_GetCap1、TIM_GetCap2、TIM_GetCap3、TIM_GetCap4、TIM_GetCap5、TIM_GetCap6、TIM_GetCap7、TIM_GetCap8、TIM_GetCap9、TIM_GetCap1D、TIM_GetCap2D、TIM_GetCap3D、TIM_GetCap4D
输入捕获滤波
TIM_IC1FiltConfig、TIM_IC2FiltConfig、TIM_IC3FiltConfig、TIM_IC4FiltConfig、TIM_IC1FiltEnable、TIM_IC2FiltEnable、TIM_IC3FiltEnable、TIM_IC4FiltEnable、TIM_GetFiltStatus
互补输出与刹车/死区
TIM_EnableCtrlPwmOutputs、TIM_ConfigBkdt、TIM_BreakFiltConfig、TIM_BreakFiltEnable、TIM_BreakInputSourceEnable、TIM_BidirectionDisarm、TIM_BidirectionRearm、TIM_SelectComEvt、TIM_SelectCapCmpDmaSrc、TIM_EnableCapCmpPreloadControl、TIM_GetCCENStatus
编码器接口
TIM_ConfigEncoderInterface、TIM_ConfigEncoderInterface2、TIM_TrgiLoadLvrToCNTEnable、TIM_GetLVR、TIM_CH3LoadLvrToCNTEnable、TIM_CH3LoadLvrToCNTPolarity、TIM_GetENCDAT、TIM_GetENCDATSign
从/主模式与同步
TIM_ConfigInternalClk、TIM_SelectInputTrig、TIM_ConfigInternalTrigToExt、TIM_ConfigExtTrigAsClk、TIM_ConfigExtClkMode1、TIM_ConfigExtClkMode2、TIM_ConfigExtTrig、TIM_SelectETRInputSource、TIM_SelectOutputTrig、TIM_SelectOutputTrig2、TIM_SelectSlaveMode、TIM_SelectMasterSlaveMode、TIM_SelectHallSensor
DMA
TIM_ConfigDma、TIM_EnableDma
中断与标志管理
TIM_ConfigInt、TIM_GetFlagStatus、TIM_ClearFlag、TIM_GetIntStatus、TIM_ClrIntPendingBit
void TIM_DeInit(const TIM_Module *TIMx)将 TIMx 的寄存器复位为默认值。
name TIM_DeInit
fun Deinitializes the TIMx registers.
param TIMx (The input parameters must be the following values):
- ATIM1
- ATIM2
- GTIM1
- GTIM2
- GTIM3
- GTIM4
- BTIM1
- BTIM2
return none
void TIM_InitTimeBase(TIM_Module *TIMx, const TIM_TimeBaseInitType *TIM_TimeBaseInitStruct)初始化 TIMx 时基单元。
name TIM_InitTimeBase
fun Initializes the TIMx time base unit.
param TIMx (The input parameters must be the following values):
- ATIM1
- ATIM2
- GTIM1
- GTIM2
- GTIM3
- GTIM4
- BTIM1
- BTIM2
param TIM_TimeBaseInitStruct: refer to the definition of TIM_TimeBaseInitType
- Prescaler
* 0x0000 ~ 0xFFFF
- CounterMode
* TIM_CNT_MODE_UP
* TIM_CNT_MODE_DOWN
* TIM_CNT_MODE_CENTER_ALIGN1
* TIM_CNT_MODE_CENTER_ALIGN2
* TIM_CNT_MODE_CENTER_ALIGN3
- Period
* 0x00000000 ~ 0xFFFFFFFF
- ClkDiv
* TIM_CLK_DIV1
* TIM_CLK_DIV2
* TIM_CLK_DIV4
- RepetCnt
* 0x00 ~ 0xFF
- CapCh1Sel
* TIM_CAPCH1SEL_0
* TIM_CAPCH1SEL_1
* TIM_CAPCH1SEL_2
* TIM_CAPCH1SEL_3
* TIM_CAPCH1SEL_4
* TIM_CAPCH1SEL_5
* TIM_CAPCH1SEL_6
- CapCh2Sel
* TIM_CAPCH2SEL_0
* TIM_CAPCH2SEL_1
* TIM_CAPCH2SEL_2
- CapCh3Sel
* TIM_CAPCH3SEL_0
* TIM_CAPCH3SEL_1
* TIM_CAPCH3SEL_2
- CapCh4Sel
* TIM_CAPCH4SEL_0
* TIM_CAPCH4SEL_1
* TIM_CAPCH4SEL_2
- EtrOrClr
* TIM_ETRSEL
* TIM_CLRSEL
- CapEtrClrSel
* TIM_CAPETRSEL_0
* TIM_CAPETRSEL_1
* TIM_CAPETRSEL_2
* TIM_CAPETRSEL_3
* TIM_CAPETRSEL_4
* TIM_CAPETRSEL_5
* TIM_OCCLRSEL_0
* TIM_OCCLRSEL_1
* TIM_OCCLRSEL_2
return none
note GTIM1 is a 32-bit timer, while the others are 16-bit timers.
void TIM_InitTimBaseStruct(TIM_TimeBaseInitType *TIM_TimeBaseInitStruct)将 TIM_TimeBaseInitStruct 的每个成员填充为默认值。
name TIM_InitTimBaseStruct
fun Fills each TIM_TimeBaseInitStruct member with its default value.
param TIM_TimeBaseInitStruct: refer to the definition of TIM_TimeBaseInitType
- Prescaler
* 0x0000 ~ 0xFFFF
- CounterMode
* TIM_CNT_MODE_UP
* TIM_CNT_MODE_DOWN
* TIM_CNT_MODE_CENTER_ALIGN1
* TIM_CNT_MODE_CENTER_ALIGN2
* TIM_CNT_MODE_CENTER_ALIGN3
- Period
* 0x00000000 ~ 0xFFFFFFFF
- ClkDiv
* TIM_CLK_DIV1
* TIM_CLK_DIV2
* TIM_CLK_DIV4
- RepetCnt
* 0x00 ~ 0xFF
- CapCh1Sel
* TIM_CAPCH1SEL_0
* TIM_CAPCH1SEL_1
* TIM_CAPCH1SEL_2
* TIM_CAPCH1SEL_3
* TIM_CAPCH1SEL_4
* TIM_CAPCH1SEL_5
* TIM_CAPCH1SEL_6
- CapCh2Sel
* TIM_CAPCH2SEL_0
* TIM_CAPCH2SEL_1
* TIM_CAPCH2SEL_2
- CapCh3Sel
* TIM_CAPCH3SEL_0
* TIM_CAPCH3SEL_1
* TIM_CAPCH3SEL_2
- CapCh4Sel
* TIM_CAPCH4SEL_0
* TIM_CAPCH4SEL_1
* TIM_CAPCH4SEL_2
- EtrOrClr
* TIM_ETRSEL
* TIM_CLRSEL
- CapEtrClrSel
* TIM_CAPETRSEL_0
* TIM_CAPETRSEL_1
* TIM_CAPETRSEL_2
* TIM_CAPETRSEL_3
* TIM_CAPETRSEL_4
* TIM_CAPETRSEL_5
* TIM_OCCLRSEL_0
* TIM_OCCLRSEL_1
* TIM_OCCLRSEL_2
return none
void TIM_InitOcStruct(OCInitType *TIM_OCInitStruct)将 TIM_OCInitStruct 的每个成员填充为默认值。
name TIM_InitOcStruct
fun Fills each TIM_OCInitStruct member with its default value.
param TIM_OCInitStruct: refer to the definition of OCInitType
- OCMode
* TIM_OCMODE_TIMING
* TIM_OCMODE_ACTIVE
* TIM_OCMODE_INACTIVE
* TIM_OCMODE_TOGGLE
* TIM_FORCED_ACTION_INACTIVE
* TIM_FORCED_ACTION_ACTIVE
* TIM_OCMODE_PWM1
* TIM_OCMODE_PWM2
* TIM_OCMODE_OPMOD_RETRIG1
* TIM_OCMODE_OPMOD_RETRIG2
* TIM_OCMODE_COMBI_PWM1
* TIM_OCMODE_COMBI_PWM2
- OutputState
* TIM_OUTPUT_STATE_DISABLE
* TIM_OUTPUT_STATE_ENABLE
- OutputNState
* TIM_OUTPUT_NSTATE_DISABLE
* TIM_OUTPUT_NSTATE_ENABLE
- Pulse
* 0x00000000 ~ 0xFFFFFFFF
- OCPolarity
* TIM_OC_POLARITY_HIGH
* TIM_OC_POLARITY_LOW
- OCNPolarity
* TIM_OCN_POLARITY_HIGH
* TIM_OCN_POLARITY_LOW
- OCIdleState
* TIM_OC_IDLE_STATE_SET
* TIM_OC_IDLE_STATE_RESET
- OCNIdleState
* TIM_OCN_IDLE_STATE_SET
* TIM_OCN_IDLE_STATE_RESET
return none
void TIM_InitIcStruct(TIM_ICInitType *TIM_ICInitStruct)将 TIM_ICInitStruct 的每个成员填充为默认值。
name TIM_InitIcStruct
fun Fills each TIM_ICInitStruct member with its default value.
param TIM_ICInitStruct: refer to the definition of TIM_ICInitType
- Channel
* TIM_CH_1
* TIM_CH_2
* TIM_CH_3
* TIM_CH_4
- ICPolarity
* TIM_IC_POLARITY_RISING
* TIM_IC_POLARITY_FALLING
- ICSelection
* TIM_IC_SELECTION_DIRECTTI
* TIM_IC_SELECTION_INDIRECTTI
* TIM_IC_SELECTION_TRC
- ICPrescaler
* TIM_IC_PSC_DIV1
* TIM_IC_PSC_DIV2
* TIM_IC_PSC_DIV4
* TIM_IC_PSC_DIV8
- ICFilter
* ICFilter can be a number between 0x0 and 0xF
return none
void TIM_InitBkdtStruct(TIM_BDTRInitType *TIM_BDTRInitStruct)将 TIM_BDTRInitStruct 的每个成员填充为默认值。
name TIM_InitBkdtStruct
fun Fills each TIM_BDTRInitStruct member with its default value.
param TIM_BDTRInitStruct: refer to the definition of TIM_BDTRInitType
- OSSRState
* TIM_OSSR_STATE_ENABLE
* TIM_OSSR_STATE_DISABLE
- OSSIState
* TIM_OSSI_STATE_ENABLE
* TIM_OSSI_STATE_DISABLE
- LOCKLevel
* TIM_LOCK_LEVEL_OFF
* TIM_LOCK_LEVEL_1
* TIM_LOCK_LEVEL_2
* TIM_LOCK_LEVEL_3
- DeadTime
* DeadTime can be a number between 0x00 and 0xFF
- Break
* TIM_BREAK_IN_ENABLE
* TIM_BREAK_IN_DISABLE
- BreakPolarity
* TIM_BREAK_POLARITY_LOW
* TIM_BREAK_POLARITY_HIGH
- Bidirection
* TIM_BREAK_BID_ENABLE
* TIM_BREAK_BID_DISABLE
- AutomaticOutput
* TIM_AUTO_OUTPUT_ENABLE
* TIM_AUTO_OUTPUT_DISABLE
return none
void TIM_Enable(TIM_Module *TIMx, FunctionalState Cmd)使能或关闭指定的 TIM 外设。
name TIM_Enable
fun Enables or disables the specified TIM peripheral.
param TIMx (The input parameters must be the following values):
- ATIM1
- ATIM2
- GTIM1
- GTIM2
- GTIM3
- GTIM4
- BTIM1
- BTIM2
param Cmd :
- ENABLE
- DISABLE
return none
void TIM_ConfigPrescaler(TIM_Module *TIMx, uint32_t Prescaler, uint32_t TIM_PSCReloadMode)配置 TIMx 的预分频器。
name TIM_ConfigPrescaler
fun Configures the TIMx Prescaler.
param TIMx (The input parameters must be the following values):
- ATIM1
- ATIM2
- GTIM1
- GTIM2
- GTIM3
- GTIM4
- BTIM1
- BTIM2
param Prescaler:
- 0x0000 ~ 0xFFFF
param TIM_PSCReloadMode
- TIM_PSC_RELOAD_MODE_UPDATE
- TIM_PSC_RELOAD_MODE_IMMEDIATE
return none
void TIM_ConfigCntMode(TIM_Module *TIMx, uint32_t CntMode)指定 TIMx 使用的计数器模式。
name TIM_ConfigCntMode
fun Specifies the TIMx Counter Mode to be used.
param TIMx (The input parameters must be the following values):
- ATIM1
- ATIM2
- GTIM1
- GTIM2
- GTIM3
- GTIM4
- BTIM1
- BTIM2
param CntMode
- TIM_CNT_MODE_UP
- TIM_CNT_MODE_DOWN
- TIM_CNT_MODE_CENTER_ALIGN1
- TIM_CNT_MODE_CENTER_ALIGN2
- TIM_CNT_MODE_CENTER_ALIGN3
return none
void TIM_ConfigArPreload(TIM_Module *TIMx, FunctionalState Cmd)使能或关闭 TIMx 自动重载寄存器的预装载。
name TIM_ConfigArPreload
fun Enables or disables TIMx peripheral Preload register on AR.
param TIMx (The input parameters must be the following values):
- ATIM1
- ATIM2
- GTIM1
- GTIM2
- GTIM3
- GTIM4
- BTIM1
- BTIM2
param Cmd
- ENABLE
- DISABLE
return none
void TIM_SetCnt(TIM_Module *TIMx, uint32_t Counter)设置 TIMx 计数器寄存器的值。
name TIM_SetCnt
fun Sets the TIMx Counter Register value
param TIMx (The input parameters must be the following values):
- ATIM1
- ATIM2
- GTIM1
- GTIM2
- GTIM3
- GTIM4
- BTIM1
- BTIM2
param Counter
- Counter can be a number between 0x00000000 and 0xFFFFFFFF
return none
void TIM_SetAutoReload(TIM_Module *TIMx, uint32_t Autoreload)设置 TIMx 自动重载寄存器的值。
name TIM_SetAutoReload
fun Sets the TIMx Autoreload Register value
param TIMx (The input parameters must be the following values):
- ATIM1
- ATIM2
- GTIM1
- GTIM2
- GTIM3
- GTIM4
- BTIM1
- BTIM2
param Autoreload
- Autoreload can be a number between 0x00000000 and 0xFFFFFFFF
return none
uint32_t TIM_GetCnt(const TIM_Module *TIMx)获取 TIMx 计数器的值。
name TIM_GetCnt
fun Gets the TIMx Counter value.
param TIMx (The input parameters must be the following values):
- ATIM1
- ATIM2
- GTIM1
- GTIM2
- GTIM3
- GTIM4
- BTIM1
- BTIM2
return Counter Register value.
uint16_t TIM_GetPrescaler(const TIM_Module *TIMx)获取 TIMx 预分频器的值。
name TIM_GetPrescaler
fun Gets the TIMx Prescaler value.
param TIMx (The input parameters must be the following values):
- ATIM1
- ATIM2
- GTIM1
- GTIM2
- GTIM3
- GTIM4
- BTIM1
- BTIM2
return Prescaler Register value.
uint32_t TIM_GetAutoReload(const TIM_Module *TIMx)获取 TIMx 自动重载寄存器的值。
name TIM_GetAutoReload
fun Gets the TIMx AR value.
param TIMx (The input parameters must be the following values):
- ATIM1
- ATIM2
- GTIM1
- GTIM2
- GTIM3
- GTIM4
- BTIM1
- BTIM2
return AR Register value.
void TIM_SetClkDiv(TIM_Module *TIMx, uint32_t TIM_CKD)设置 TIMx 的时钟分频值。
name TIM_SetClkDiv
fun Sets the TIMx Clock Division value.
param TIMx (The input parameters must be the following values):
- ATIM1
- ATIM2
- GTIM1
- GTIM2
- GTIM3
- GTIM4
param TIM_CKD:
- TIM_CLK_DIV1
- TIM_CLK_DIV2
- TIM_CLK_DIV4
return none
void TIM_ConfigUpdateEvt(TIM_Module *TIMx, FunctionalState Cmd)使能或关闭 TIMx 更新事件。
name TIM_ConfigUpdateEvt
fun Enables or Disables the TIMx Update event.
param TIMx (The input parameters must be the following values):
- ATIM1
- ATIM2
- GTIM1
- GTIM2
- GTIM3
- GTIM4
- BTIM1
- BTIM2
param Cmd
- ENABLE
- DISABLE
return none
void TIM_ConfigUpdateRequestIntSrc(TIM_Module *TIMx, uint32_t TIM_UpdateSource)配置 TIMx 更新请求中断源。
name TIM_ConfigUpdateRequestIntSrc
fun Configures the TIMx Update Request Interrupt source.
param TIMx (The input parameters must be the following values):
- ATIM1
- ATIM2
- GTIM1
- GTIM2
- GTIM3
- GTIM4
- BTIM1
- BTIM2
param TIM_UpdateSource
- TIM_UPDATE_SRC_GLOBAL
- TIM_UPDATE_SRC_REGULAR
return none
使用提示: 实现按 TIM_UpdateSource 置位或清位 TIMx->CTRL1 的 UPRS 位;传入 TIM_UPDATE_SRC_GLOBAL 时清位。
void TIM_SelectOnePulseMode(TIM_Module *TIMx, uint32_t TIM_OPMode)选择 TIMx 的单脉冲模式。
name TIM_SelectOnePulseMode
fun Selects the TIMx's One Pulse Mode.
param TIMx (The input parameters must be the following values):
- ATIM1
- ATIM2
- GTIM1
- GTIM2
- GTIM3
- GTIM4
param TIM_OPMode
- TIM_OPMODE_SINGLE
- TIM_OPMODE_REPET
return none
void TIM_GenerateEvent(TIM_Module *TIMx, uint32_t TIM_EventSource)配置由软件产生的 TIMx 事件。
name TIM_GenerateEvent
fun Configures the TIMx event to be generate by software.
param TIMx (The input parameters must be the following values):
- ATIM1
- ATIM2
- GTIM1
- GTIM2
- GTIM3
- GTIM4
- BTIM1
- BTIM2
param TIM_EventSource:
- TIM_EVT_SRC_CC1
- TIM_EVT_SRC_CC2
- TIM_EVT_SRC_CC3
- TIM_EVT_SRC_CC4
- TIM_EVT_SRC_UPDATE
- TIM_EVT_SRC_COM
- TIM_EVT_SRC_TRIG
- TIM_EVT_SRC_BREAK
return none
void TIM_InitOc1(TIM_Module *TIMx, const OCInitType *TIM_OCInitStruct)初始化 TIMx 通道 1。
name TIM_InitOc1
fun Initializes the TIMx Channel 1.
param TIMx (The input parameters must be the following values):
- ATIM1
- ATIM2
- GTIM1
- GTIM2
- GTIM3
- GTIM4
param TIM_OCInitStruct: refer to the definition of OCInitType
- OCMode
* TIM_OCMODE_TIMING
* TIM_OCMODE_ACTIVE
* TIM_OCMODE_INACTIVE
* TIM_OCMODE_TOGGLE
* TIM_FORCED_ACTION_INACTIVE
* TIM_FORCED_ACTION_ACTIVE
* TIM_OCMODE_PWM1
* TIM_OCMODE_PWM2
* TIM_OCMODE_OPMOD_RETRIG1
* TIM_OCMODE_OPMOD_RETRIG2
* TIM_OCMODE_COMBI_PWM1
* TIM_OCMODE_COMBI_PWM2
- OutputState
* TIM_OUTPUT_STATE_DISABLE
* TIM_OUTPUT_STATE_ENABLE
- OutputNState
* TIM_OUTPUT_NSTATE_DISABLE
* TIM_OUTPUT_NSTATE_ENABLE
- Pulse
* 0x00000000 ~ 0xFFFFFFFF
- OCPolarity
* TIM_OC_POLARITY_HIGH
* TIM_OC_POLARITY_LOW
- OCNPolarity
* TIM_OCN_POLARITY_HIGH
* TIM_OCN_POLARITY_LOW
- OCIdleState
* TIM_OC_IDLE_STATE_SET
* TIM_OC_IDLE_STATE_RESET
- OCNIdleState
* TIM_OCN_IDLE_STATE_SET
* TIM_OCN_IDLE_STATE_RESET
return none
void TIM_InitOc2(TIM_Module *TIMx, const OCInitType *TIM_OCInitStruct)初始化 TIMx 通道 2。
name TIM_InitOc2
fun Initializes the TIMx Channel 2.
param TIMx (The input parameters must be the following values):
- ATIM1
- ATIM2
- GTIM1
- GTIM2
- GTIM3
- GTIM4
param TIM_OCInitStruct: refer to the definition of OCInitType
- OCMode
* TIM_OCMODE_TIMING
* TIM_OCMODE_ACTIVE
* TIM_OCMODE_INACTIVE
* TIM_OCMODE_TOGGLE
* TIM_FORCED_ACTION_INACTIVE
* TIM_FORCED_ACTION_ACTIVE
* TIM_OCMODE_PWM1
* TIM_OCMODE_PWM2
* TIM_OCMODE_OPMOD_RETRIG1
* TIM_OCMODE_OPMOD_RETRIG2
* TIM_OCMODE_COMBI_PWM1
* TIM_OCMODE_COMBI_PWM2
- OutputState
* TIM_OUTPUT_STATE_DISABLE
* TIM_OUTPUT_STATE_ENABLE
- OutputNState
* TIM_OUTPUT_NSTATE_DISABLE
* TIM_OUTPUT_NSTATE_ENABLE
- Pulse
* 0x00000000 ~ 0xFFFFFFFF
- OCPolarity
* TIM_OC_POLARITY_HIGH
* TIM_OC_POLARITY_LOW
- OCNPolarity
* TIM_OCN_POLARITY_HIGH
* TIM_OCN_POLARITY_LOW
- OCIdleState
* TIM_OC_IDLE_STATE_SET
* TIM_OC_IDLE_STATE_RESET
- OCNIdleState
* TIM_OCN_IDLE_STATE_SET
* TIM_OCN_IDLE_STATE_RESET
return none
void TIM_InitOc3(TIM_Module *TIMx, const OCInitType *TIM_OCInitStruct)初始化 TIMx 通道 3。
name TIM_InitOc3
fun Initializes the TIMx Channel 3.
param TIMx (The input parameters must be the following values):
- ATIM1
- ATIM2
- GTIM1
- GTIM2
- GTIM3
- GTIM4
param TIM_OCInitStruct: refer to the definition of OCInitType
- OCMode
* TIM_OCMODE_TIMING
* TIM_OCMODE_ACTIVE
* TIM_OCMODE_INACTIVE
* TIM_OCMODE_TOGGLE
* TIM_FORCED_ACTION_INACTIVE
* TIM_FORCED_ACTION_ACTIVE
* TIM_OCMODE_PWM1
* TIM_OCMODE_PWM2
* TIM_OCMODE_OPMOD_RETRIG1
* TIM_OCMODE_OPMOD_RETRIG2
* TIM_OCMODE_COMBI_PWM1
* TIM_OCMODE_COMBI_PWM2
- OutputState
* TIM_OUTPUT_STATE_DISABLE
* TIM_OUTPUT_STATE_ENABLE
- OutputNState
* TIM_OUTPUT_NSTATE_DISABLE
* TIM_OUTPUT_NSTATE_ENABLE
- Pulse
* 0x00000000 ~ 0xFFFFFFFF
- OCPolarity
* TIM_OC_POLARITY_HIGH
* TIM_OC_POLARITY_LOW
- OCNPolarity
* TIM_OCN_POLARITY_HIGH
* TIM_OCN_POLARITY_LOW
- OCIdleState
* TIM_OC_IDLE_STATE_SET
* TIM_OC_IDLE_STATE_RESET
- OCNIdleState
* TIM_OCN_IDLE_STATE_SET
* TIM_OCN_IDLE_STATE_RESET
return none
void TIM_InitOc4(TIM_Module *TIMx, const OCInitType *TIM_OCInitStruct)初始化 TIMx 通道 4。
name TIM_InitOc4
fun Initializes the TIMx Channel 4.
param TIMx (The input parameters must be the following values):
- ATIM1
- ATIM2
- GTIM1
- GTIM2
- GTIM3
- GTIM4
param TIM_OCInitStruct: refer to the definition of OCInitType
- OCMode
* TIM_OCMODE_TIMING
* TIM_OCMODE_ACTIVE
* TIM_OCMODE_INACTIVE
* TIM_OCMODE_TOGGLE
* TIM_FORCED_ACTION_INACTIVE
* TIM_FORCED_ACTION_ACTIVE
* TIM_OCMODE_PWM1
* TIM_OCMODE_PWM2
* TIM_OCMODE_OPMOD_RETRIG1
* TIM_OCMODE_OPMOD_RETRIG2
* TIM_OCMODE_COMBI_PWM1
* TIM_OCMODE_COMBI_PWM2
- OutputState
* TIM_OUTPUT_STATE_DISABLE
* TIM_OUTPUT_STATE_ENABLE
- OutputNState
* TIM_OUTPUT_NSTATE_DISABLE
* TIM_OUTPUT_NSTATE_ENABLE
- Pulse
* 0x00000000 ~ 0xFFFFFFFF
- OCPolarity
* TIM_OC_POLARITY_HIGH
* TIM_OC_POLARITY_LOW
- OCNPolarity
* TIM_OCN_POLARITY_HIGH
* TIM_OCN_POLARITY_LOW
- OCIdleState
* TIM_OC_IDLE_STATE_SET
* TIM_OC_IDLE_STATE_RESET
- OCNIdleState
* TIM_OCN_IDLE_STATE_SET
* TIM_OCN_IDLE_STATE_RESET
return none
void TIM_InitOc5(TIM_Module *TIMx, const OCInitType *TIM_OCInitStruct)初始化 TIMx 通道 5。
name TIM_InitOc5
fun Initializes the TIMx Channel 5.
param TIMx (The input parameters must be the following values):
- ATIM1
- ATIM2
param TIM_OCInitStruct: refer to the definition of OCInitType
- OCMode
* TIM_OCMODE_TIMING
* TIM_OCMODE_ACTIVE
* TIM_OCMODE_INACTIVE
* TIM_OCMODE_TOGGLE
* TIM_FORCED_ACTION_INACTIVE
* TIM_FORCED_ACTION_ACTIVE
* TIM_OCMODE_PWM1
* TIM_OCMODE_PWM2
- OutputState
* TIM_OUTPUT_STATE_DISABLE
* TIM_OUTPUT_STATE_ENABLE
- Pulse
* 0x0000 ~ 0xFFFF
- OCPolarity
* TIM_OC_POLARITY_HIGH
* TIM_OC_POLARITY_LOW
- OCIdleState none
return none
void TIM_InitOc6(TIM_Module *TIMx, const OCInitType *TIM_OCInitStruct)初始化 TIMx 通道 6。
name TIM_InitOc6
fun Initializes the TIMx Channel 6.
param TIMx (The input parameters must be the following values):
- ATIM1
- ATIM2
param TIM_OCInitStruct: refer to the definition of OCInitType
- OCMode
* TIM_OCMODE_TIMING
* TIM_OCMODE_ACTIVE
* TIM_OCMODE_INACTIVE
* TIM_OCMODE_TOGGLE
* TIM_FORCED_ACTION_INACTIVE
* TIM_FORCED_ACTION_ACTIVE
* TIM_OCMODE_PWM1
* TIM_OCMODE_PWM2
- OutputState
* TIM_OUTPUT_STATE_DISABLE
* TIM_OUTPUT_STATE_ENABLE
- Pulse
* 0x0000 ~ 0xFFFF
- OCPolarity
* TIM_OC_POLARITY_HIGH
* TIM_OC_POLARITY_LOW
return none
void TIM_SelectOcMode(TIM_Module *TIMx, uint32_t Channel, uint32_t OcMode)选择 TIM 输出比较模式。
name TIM_SelectOcMode
fun Selects the TIM Output Compare Mode.
param TIMx (The input parameters must be the following values):
- ATIM1
- ATIM2
- GTIM1
- GTIM2
- GTIM3
- GTIM4
param Channel
- TIM_CH_1
- TIM_CH_2
- TIM_CH_3
- TIM_CH_4
- TIM_CH_5
- TIM_CH_6
param OcMode
- TIM_OCMODE_TIMING
- TIM_OCMODE_ACTIVE
- TIM_OCMODE_INACTIVE
- TIM_OCMODE_TOGGLE
- TIM_OCMODE_PWM1
- TIM_OCMODE_PWM2
- TIM_FORCED_ACTION_ACTIVE
- TIM_FORCED_ACTION_INACTIVE
- TIM_OCMODE_OPMOD_RETRIG1
- TIM_OCMODE_OPMOD_RETRIG2
- TIM_OCMODE_COMBI_PWM1
- TIM_OCMODE_COMBI_PWM2
return none
void TIM_ConfigForcedOc1(TIM_Module *TIMx, uint32_t TIM_ForcedAction)将 TIMx 输出 1 的波形强制为有效或无效电平。
name TIM_ConfigForcedOc1
fun Forces the TIMx output 1 waveform to active or inactive level.
param TIMx (The input parameters must be the following values):
- ATIM1
- ATIM2
- GTIM1
- GTIM2
- GTIM3
- GTIM4
param TIM_ForcedAction
- TIM_FORCED_ACTION_ACTIVE
- TIM_FORCED_ACTION_INACTIVE
return none
void TIM_ConfigForcedOc2(TIM_Module *TIMx, uint32_t TIM_ForcedAction)将 TIMx 输出 2 的波形强制为有效或无效电平。
name TIM_ConfigForcedOc2
fun Forces the TIMx output 2 waveform to active or inactive level.
param TIMx (The input parameters must be the following values):
- ATIM1
- ATIM2
- GTIM1
- GTIM2
- GTIM3
- GTIM4
param TIM_ForcedAction
- TIM_FORCED_ACTION_ACTIVE
- TIM_FORCED_ACTION_INACTIVE
return none
void TIM_ConfigForcedOc3(TIM_Module *TIMx, uint32_t TIM_ForcedAction)将 TIMx 输出 3 的波形强制为有效或无效电平。
name TIM_ConfigForcedOc3
fun Forces the TIMx output 3 waveform to active or inactive level.
param TIMx (The input parameters must be the following values):
- ATIM1
- ATIM2
- GTIM1
- GTIM2
- GTIM3
- GTIM4
param TIM_ForcedAction
- TIM_FORCED_ACTION_ACTIVE
- TIM_FORCED_ACTION_INACTIVE
return none
void TIM_ConfigForcedOc4(TIM_Module *TIMx, uint32_t TIM_ForcedAction)将 TIMx 输出 4 的波形强制为有效或无效电平。
name TIM_ConfigForcedOc4
fun Forces the TIMx output 4 waveform to active or inactive level.
param TIMx (The input parameters must be the following values):
- ATIM1
- ATIM2
- GTIM1
- GTIM2
- GTIM3
- GTIM4
param TIM_ForcedAction
- TIM_FORCED_ACTION_ACTIVE
- TIM_FORCED_ACTION_INACTIVE
return none
void TIM_ConfigForcedOc5(TIM_Module *TIMx, uint32_t TIM_ForcedAction)将 TIMx 输出 5 的波形强制为有效或无效电平。
name TIM_ConfigForcedOc5
fun Forces the TIMx output 5 waveform to active or inactive level.
param TIMx (The input parameters must be the following values):
- ATIM1
- ATIM2
param TIM_ForcedAction
- TIM_FORCED_ACTION_ACTIVE
- TIM_FORCED_ACTION_INACTIVE
return none
void TIM_ConfigForcedOc6(TIM_Module *TIMx, uint32_t TIM_ForcedAction)将 TIMx 输出 6 的波形强制为有效或无效电平。
name TIM_ConfigForcedOc6
fun Forces the TIMx output 6 waveform to active or inactive level.
param TIMx (The input parameters must be the following values):
- ATIM1
- ATIM2
param TIM_ForcedAction
- TIM_FORCED_ACTION_ACTIVE
- TIM_FORCED_ACTION_INACTIVE
return none
void TIM_ConfigOc1Preload(TIM_Module *TIMx, uint32_t TIM_OCPreload)使能或关闭 TIMx 捕获比较数据寄存器 CCDAT1 的预装载。
name TIM_ConfigOc1Preload
fun Enables or disables the TIMx peripheral Preload register on CCDAT1.
param TIMx (The input parameters must be the following values):
- ATIM1
- ATIM2
- GTIM1
- GTIM2
- GTIM3
- GTIM4
param TIM_OCPreload
- TIM_OC_PRE_LOAD_ENABLE
- TIM_OC_PRE_LOAD_DISABLE
return none
void TIM_ConfigOc2Preload(TIM_Module *TIMx, uint32_t TIM_OCPreload)使能或关闭 TIMx 捕获比较数据寄存器 CCDAT2 的预装载。
name TIM_ConfigOc2Preload
fun Enables or disables the TIMx peripheral Preload register on CCDAT2.
param TIMx (The input parameters must be the following values):
- ATIM1
- ATIM2
- GTIM1
- GTIM2
- GTIM3
- GTIM4
param TIM_OCPreload
- TIM_OC_PRE_LOAD_ENABLE
- TIM_OC_PRE_LOAD_DISABLE
return none
void TIM_ConfigOc3Preload(TIM_Module *TIMx, uint32_t TIM_OCPreload)使能或关闭 TIMx 捕获比较数据寄存器 CCDAT3 的预装载。
name TIM_ConfigOc3Preload
fun Enables or disables the TIMx peripheral Preload register on CCDAT3.
param TIMx (The input parameters must be the following values):
- ATIM1
- ATIM2
- GTIM1
- GTIM2
- GTIM3
- GTIM4
param TIM_OCPreload
- TIM_OC_PRE_LOAD_ENABLE
- TIM_OC_PRE_LOAD_DISABLE
return none
void TIM_ConfigOc4Preload(TIM_Module *TIMx, uint32_t TIM_OCPreload)使能或关闭 TIMx 捕获比较数据寄存器 CCDAT4 的预装载。
name TIM_ConfigOc4Preload
fun Enables or disables the TIMx peripheral Preload register on CCDAT4.
param TIMx (The input parameters must be the following values):
- ATIM1
- ATIM2
- GTIM1
- GTIM2
- GTIM3
- GTIM4
- GTIM5
param TIM_OCPreload
- TIM_OC_PRE_LOAD_ENABLE
- TIM_OC_PRE_LOAD_DISABLE
return none
void TIM_ConfigOc5Preload(TIM_Module *TIMx, uint32_t TIM_OCPreload)使能或关闭 TIMx 捕获比较数据寄存器 CCDAT5 的预装载。
name TIM_ConfigOc5Preload
fun Enables or disables the TIMx peripheral Preload register on CCDAT5.
param TIMx (The input parameters must be the following values):
- ATIM1
- ATIM2
param TIM_OCPreload
- TIM_OC_PRE_LOAD_ENABLE
- TIM_OC_PRE_LOAD_DISABLE
return none
void TIM_ConfigOc6Preload(TIM_Module *TIMx, uint32_t TIM_OCPreload)使能或关闭 TIMx 捕获比较数据寄存器 CCDAT6 的预装载。
name TIM_ConfigOc6Preload
fun Enables or disables the TIMx peripheral Preload register on CCDAT6.
param TIMx (The input parameters must be the following values):
- ATIM1
- ATIM2
param TIM_OCPreload
- TIM_OC_PRE_LOAD_ENABLE
- TIM_OC_PRE_LOAD_DISABLE
return none
void TIM_ConfigOc7Preload(TIM_Module *TIMx, uint32_t TIM_OCPreload)使能或关闭 TIMx 捕获比较数据寄存器 CCDAT7 的预装载。
name TIM_ConfigOc7Preload
fun Enables or disables the TIMx peripheral Preload register on CCDAT7.
param TIMx (The input parameters must be the following values):
- ATIM1
- ATIM2
param TIM_OCPreload
- TIM_OC_PRE_LOAD_ENABLE
- TIM_OC_PRE_LOAD_DISABLE
return none
void TIM_ConfigOc8Preload(TIM_Module *TIMx, uint32_t TIM_OCPreload)使能或关闭 TIMx 捕获比较数据寄存器 CCDAT8 的预装载。
name TIM_ConfigOc8Preload
fun Enables or disables the TIMx peripheral Preload register on CCDAT8.
param TIMx (The input parameters must be the following values):
- ATIM1
- ATIM2
param TIM_OCPreload
- TIM_OC_PRE_LOAD_ENABLE
- TIM_OC_PRE_LOAD_DISABLE
return none
void TIM_ConfigOc9Preload(TIM_Module *TIMx, uint32_t TIM_OCPreload)使能或关闭 TIMx 捕获比较数据寄存器 CCDAT9 的预装载。
name TIM_ConfigOc9Preload
fun Enables or disables the TIMx peripheral Preload register on CCDAT9.
param TIMx (The input parameters must be the following values):
- ATIM1
- ATIM2
param TIM_OCPreload
- TIM_OC_PRE_LOAD_ENABLE
- TIM_OC_PRE_LOAD_DISABLE
return none
void TIM_ConfigOc1Fast(TIM_Module *TIMx, uint32_t TIM_OCFast)配置 TIMx 输出比较 1 的快速功能。
name TIM_ConfigOc1Fast
fun Configures the TIMx Output Compare 1 Fast feature.
param TIMx (The input parameters must be the following values):
- ATIM1
- ATIM2
- GTIM1
- GTIM2
- GTIM3
- GTIM4
param TIM_OCFast
- TIM_OC_FAST_ENABLE
- TIM_OC_FAST_DISABLE
return none
void TIM_ConfigOc2Fast(TIM_Module *TIMx, uint32_t TIM_OCFast)配置 TIMx 输出比较 2 的快速功能。
name TIM_ConfigOc2Fast
fun Configures the TIMx Output Compare 2 Fast feature.
param TIMx (The input parameters must be the following values):
- ATIM1
- ATIM2
- GTIM1
- GTIM2
- GTIM3
- GTIM4
param TIM_OCFast
- TIM_OC_FAST_ENABLE
- TIM_OC_FAST_DISABLE
return none
void TIM_ConfigOc3Fast(TIM_Module *TIMx, uint32_t TIM_OCFast)配置 TIMx 输出比较 3 的快速功能。
name TIM_ConfigOc3Fast
fun Configures the TIMx Output Compare 3 Fast feature.
param TIMx (The input parameters must be the following values):
- ATIM1
- ATIM2
- GTIM1
- GTIM2
- GTIM3
- GTIM4
param TIM_OCFast
- TIM_OC_FAST_ENABLE
- TIM_OC_FAST_DISABLE
return none
void TIM_ConfigOc4Fast(TIM_Module *TIMx, uint32_t TIM_OCFast)配置 TIMx 输出比较 4 的快速功能。
name TIM_ConfigOc4Fast
fun Configures the TIMx Output Compare 4 Fast feature.
param TIMx (The input parameters must be the following values):
- ATIM1
- ATIM2
- GTIM1
- GTIM2
- GTIM3
- GTIM4
param TIM_OCFast
- TIM_OC_FAST_ENABLE
- TIM_OC_FAST_DISABLE
return none
void TIM_ConfigOc5Fast(TIM_Module *TIMx, uint32_t TIM_OCFast)配置 TIMx 输出比较 5 的快速功能。
name TIM_ConfigOc5Fast
fun Configures the TIMx Output Compare 5 Fast feature.
param TIMx (The input parameters must be the following values):
- ATIM1
- ATIM2
param TIM_OCFast
- TIM_OC_FAST_ENABLE
- TIM_OC_FAST_DISABLE
return none
void TIM_ConfigOc6Fast(TIM_Module *TIMx, uint32_t TIM_OCFast)配置 TIMx 输出比较 6 的快速功能。
name TIM_ConfigOc6Fast
fun Configures the TIMx Output Compare 6 Fast feature.
param TIMx (The input parameters must be the following values):
- ATIM1
- ATIM2
param TIM_OCFast
- TIM_OC_FAST_ENABLE
- TIM_OC_FAST_DISABLE
return none
void TIM_ClrOc1Ref(TIM_Module *TIMx, uint32_t TIM_OCClear)在外部事件上清除或保护 OCREF1 信号。
name TIM_ClrOc1Ref
fun Clears or safeguards the OCREF1 signal on an external event
param TIMx (The input parameters must be the following values):
- ATIM1
- ATIM2
- GTIM1
- GTIM2
- GTIM3
- GTIM4
param TIM_OCPreload
- TIM_OC_CLR_ENABLE
- TIM_OC_CLR_DISABLE
return none
void TIM_ClrOc2Ref(TIM_Module *TIMx, uint32_t TIM_OCClear)在外部事件上清除或保护 OCREF2 信号。
name TIM_ClrOc2Ref
fun Clears or safeguards the OCREF2 signal on an external event
param TIMx (The input parameters must be the following values):
- ATIM1
- ATIM2
- GTIM1
- GTIM2
- GTIM3
- GTIM4
param TIM_OCPreload
- TIM_OC_CLR_ENABLE
- TIM_OC_CLR_DISABLE
return none
void TIM_ClrOc3Ref(TIM_Module *TIMx, uint32_t TIM_OCClear)在外部事件上清除或保护 OCREF3 信号。
name TIM_ClrOc3Ref
fun Clears or safeguards the OCREF3 signal on an external event
param TIMx (The input parameters must be the following values):
- ATIM1
- ATIM2
- GTIM1
- GTIM2
- GTIM3
- GTIM4
param TIM_OCPreload
- TIM_OC_CLR_ENABLE
- TIM_OC_CLR_DISABLE
return none
void TIM_ClrOc4Ref(TIM_Module *TIMx, uint32_t TIM_OCClear)在外部事件上清除或保护 OCREF4 信号。
name TIM_ClrOc4Ref
fun Clears or safeguards the OCREF4 signal on an external event
param TIMx (The input parameters must be the following values):
- ATIM1
- ATIM2
- GTIM1
- GTIM2
- GTIM3
param TIM_OCPreload
- TIM_OC_CLR_ENABLE
- TIM_OC_CLR_DISABLE
return none
void TIM_ClrOc5Ref(TIM_Module *TIMx, uint32_t TIM_OCClear)在外部事件上清除或保护 OCREF5 信号。
name TIM_ClrOc5Ref
fun Clears or safeguards the OCREF5 signal on an external event
param TIMx (The input parameters must be the following values):
- ATIM1
- ATIM2
param TIM_OCPreload
- TIM_OC_CLR_ENABLE
- TIM_OC_CLR_DISABLE
return none
void TIM_ClrOc6Ref(TIM_Module *TIMx, uint32_t TIM_OCClear)在外部事件上清除或保护 OCREF6 信号。
name TIM_ClrOc6Ref
fun Clears or safeguards the OCREF6 signal on an external event
param TIMx (The input parameters must be the following values):
- ATIM1
- ATIM2
param TIM_OCPreload
- TIM_OC_CLR_ENABLE
- TIM_OC_CLR_DISABLE
return none
void TIM_ClrOcRefInputSource(TIM_Module *TIMx, uint32_t OCRefClearInputSelect, uint32_t OCRefClearInputSource)设置 OCREF 的清除输入源。
name TIM_ClrOcRefInputSource
fun Set the OCREF clear input source
param TIMx (The input parameters must be the following values):
- ATIM1
- ATIM2
- GTIM1
- GTIM2
- GTIM3
- GTIM4
param OCRefClearInputSelect
- TIM_ETRSEL
- TIM_CLRSEL
param OCRefClearInputSource
- TIM_CAPETRSEL_0
- TIM_CAPETRSEL_1
- TIM_CAPETRSEL_2
- TIM_CAPETRSEL_3
- TIM_CAPETRSEL_4
- TIM_CAPETRSEL_5
- TIM_OCCLRSEL_0
- TIM_OCCLRSEL_1
- TIM_OCCLRSEL_2
return none
void TIM_ConfigOc1Polarity(TIM_Module *TIMx, uint32_t OcPolarity)配置 TIMx 通道 1 的极性。
name TIM_ConfigOc1Polarity
fun Configures the TIMx channel 1 polarity.
param TIMx (The input parameters must be the following values):
- ATIM1
- ATIM2
- GTIM1
- GTIM2
- GTIM3
- GTIM4
param TIM_OCPreload
- TIM_OC_POLARITY_HIGH
- TIM_OC_POLARITY_LOW
return none
void TIM_ConfigOc1NPolarity(TIM_Module *TIMx, uint32_t OcNPolarity)配置 TIMx 通道 1N 的极性。
name TIM_ConfigOc1NPolarity
fun Configures the TIMx channel 1N polarity.
param TIMx (The input parameters must be the following values):
- ATIM1
- ATIM2
- GTIM3
- GTIM4
param TIM_OCPreload
- TIM_OCN_POLARITY_HIGH
- TIM_OCN_POLARITY_LOW
return none
void TIM_ConfigOc2Polarity(TIM_Module *TIMx, uint32_t OcPolarity)配置 TIMx 通道 2 的极性。
name TIM_ConfigOc2Polarity
fun Configures the TIMx channel 2 polarity.
param TIMx (The input parameters must be the following values):
- ATIM1
- ATIM2
- GTIM1
- GTIM2
- GTIM3
- GTIM4
param TIM_OCPreload
- TIM_OC_POLARITY_HIGH
- TIM_OC_POLARITY_LOW
return none
void TIM_ConfigOc2NPolarity(TIM_Module *TIMx, uint32_t OcNPolarity)配置 TIMx 通道 2N 的极性。
name TIM_ConfigOc2NPolarity
fun Configures the TIMx channel 2N polarity.
param TIMx (The input parameters must be the following values):
- ATIM1
- ATIM2
param TIM_OCPreload
- TIM_OCN_POLARITY_HIGH
- TIM_OCN_POLARITY_LOW
return none
void TIM_ConfigOc3Polarity(TIM_Module *TIMx, uint32_t OcPolarity)配置 TIMx 通道 3 的极性。
name TIM_ConfigOc3Polarity
fun Configures the TIMx channel 3 polarity.
param TIMx (The input parameters must be the following values):
- ATIM1
- ATIM2
- GTIM1
- GTIM2
- GTIM3
- GTIM4
param TIM_OCPreload
- TIM_OC_POLARITY_HIGH
- TIM_OC_POLARITY_LOW
return none
void TIM_ConfigOc3NPolarity(TIM_Module *TIMx, uint32_t OcNPolarity)配置 TIMx 通道 3N 的极性。
name TIM_ConfigOc3NPolarity
fun Configures the TIMx channel 3N polarity.
param TIMx (The input parameters must be the following values):
- ATIM1
- ATIM2
param TIM_OCPreload
- TIM_OCN_POLARITY_HIGH
- TIM_OCN_POLARITY_LOW
return none
void TIM_ConfigOc4Polarity(TIM_Module *TIMx, uint32_t OcPolarity)配置 TIMx 通道 4 的极性。
name TIM_ConfigOc4Polarity
fun Configures the TIMx channel 4 polarity.
param TIMx (The input parameters must be the following values):
- ATIM1
- ATIM2
- GTIM1
- GTIM2
- GTIM3
- GTIM4
param TIM_OCPreload
- TIM_OC_POLARITY_HIGH
- TIM_OC_POLARITY_LOW
return none
void TIM_ConfigOc4NPolarity(TIM_Module *TIMx, uint32_t OcNPolarity)配置 TIMx 通道 4N 的极性。
name TIM_ConfigOc4NPolarity
fun Configures the TIMx channel 4N polarity.
param TIMx (The input parameters must be the following values):
- ATIM1
- ATIM2
param TIM_OCPreload
- TIM_OCN_POLARITY_HIGH
- TIM_OCN_POLARITY_LOW
return none
void TIM_ConfigOc5Polarity(TIM_Module *TIMx, uint32_t OcPolarity)配置 TIMx 通道 5 的极性。
name TIM_ConfigOc5Polarity
fun Configures the TIMx channel 5 polarity.
param TIMx (The input parameters must be the following values):
- ATIM1
- ATIM2
param TIM_OCPreload
- TIM_OC_POLARITY_HIGH
- TIM_OC_POLARITY_LOW
return none
void TIM_ConfigOc6Polarity(TIM_Module *TIMx, uint32_t OcPolarity)配置 TIMx 通道 6 的极性。
name TIM_ConfigOc6Polarity
fun Configures the TIMx channel 6 polarity.
param TIMx (The input parameters must be the following values):
- ATIM1
- ATIM2
param TIM_OCPreload
- TIM_OC_POLARITY_HIGH
- TIM_OC_POLARITY_LOW
return none
void TIM_EnableCapCmpCh(TIM_Module *TIMx, uint32_t Channel, uint32_t TIM_CCx)使能或关闭 TIM 捕获比较通道 x。
name TIM_EnableCapCmpCh
fun Enables or disables the TIM Capture Compare Channel x.
param TIMx (The input parameters must be the following values):
- ATIM1
- ATIM2
- GTIM1
- GTIM2
- GTIM3
- GTIM4
param Channel
- TIM_CH_1
- TIM_CH_2
- TIM_CH_3
- TIM_CH_4
- TIM_CH_5
- TIM_CH_6
param TIM_CCx
- TIM_CAP_CMP_ENABLE
- TIM_CAP_CMP_DISABLE
return none
void TIM_EnableCapCmpChN(TIM_Module *TIMx, uint32_t Channel, uint32_t TIM_CCxN)使能或关闭 TIM 捕获比较通道 xN。
name TIM_EnableCapCmpChN
fun Enables or disables the TIM Capture Compare Channel xN.
param TIMx (The input parameters must be the following values):
- ATIM1
- ATIM2
- GTIM3
- GTIM4
param Channel
- TIM_CH_1
- TIM_CH_2
- TIM_CH_3
- TIM_CH_4
param TIM_CCx
- TIM_CAP_CMP_N_ENABLE
- TIM_CAP_CMP_N_DISABLE
return none
void TIM_SetCmp1(TIM_Module *TIMx, uint32_t Compare1)设置 TIMx 捕获比较 1 寄存器的值。
name TIM_SetCmp1
fun Sets the TIMx Capture Compare1 Register value
param TIMx (The input parameters must be the following values):
- ATIM1
- ATIM2
- GTIM1
- GTIM2
- GTIM3
- GTIM4
param Compare1
- Compare1 can be a number between 0x00000000 and 0xFFFFFFFF
return none
void TIM_SetCmp2(TIM_Module *TIMx, uint32_t Compare2)设置 TIMx 捕获比较 2 寄存器的值。
name TIM_SetCmp2
fun Sets the TIMx Capture Compare2 Register value
param TIMx (The input parameters must be the following values):
- ATIM1
- ATIM2
- GTIM1
- GTIM2
- GTIM3
- GTIM4
param Compare2
- Compare2 can be a number between 0x00000000 and 0xFFFFFFFF
return none
void TIM_SetCmp3(TIM_Module *TIMx, uint32_t Compare3)设置 TIMx 捕获比较 3 寄存器的值。
name TIM_SetCmp3
fun Sets the TIMx Capture Compare3 Register value
param TIMx (The input parameters must be the following values):
- ATIM1
- ATIM2
- GTIM1
- GTIM2
- GTIM3
- GTIM4
param Compare3
- Compare3 can be a number between 0x00000000 and 0xFFFFFFFF
return none
void TIM_SetCmp4(TIM_Module *TIMx, uint32_t Compare4)设置 TIMx 捕获比较 4 寄存器的值。
name TIM_SetCmp4
fun Sets the TIMx Capture Compare4 Register value
param TIMx (The input parameters must be the following values):
- ATIM1
- ATIM2
- GTIM1
- GTIM2
- GTIM3
- GTIM4
param Compare4
- Compare4 can be a number between 0x00000000 and 0xFFFFFFFF
return none
void TIM_SetCmp5(TIM_Module *TIMx, uint16_t Compare5)设置 TIMx 捕获比较 5 寄存器的值。
name TIM_SetCmp5
fun Sets the TIMx Capture Compare5 Register value
param TIMx (The input parameters must be the following values):
- ATIM1
- ATIM2
param Compare5
- Compare5 can be a number between 0x0000 and 0xFFFF
return none
void TIM_SetCmp6(TIM_Module *TIMx, uint16_t Compare6)设置 TIMx 捕获比较 6 寄存器的值。
name TIM_SetCmp6
fun Sets the TIMx Capture Compare6 Register value
param TIMx (The input parameters must be the following values):
- ATIM1
- ATIM2
param Compare6
- Compare6 can be a number between 0x0000 and 0xFFFF
return none
void TIM_SetCmp7(TIM_Module *TIMx, uint16_t Compare7)设置 TIMx 捕获比较 7 寄存器的值。
name TIM_SetCmp7
fun Sets the TIMx Capture Compare7 Register value
param TIMx (The input parameters must be the following values):
- ATIM1
- ATIM2
param Compare7
- Compare7 can be a number between 0x0000 and 0xFFFF
return none
void TIM_SetCmp8(TIM_Module *TIMx, uint16_t Compare8)设置 TIMx 捕获比较 8 寄存器的值。
name TIM_SetCmp8
fun Sets the TIMx Capture Compare8 Register value
param TIMx (The input parameters must be the following values):
- ATIM1
- ATIM2
param Compare8
- Compare8 can be a number between 0x0000 and 0xFFFF
return none
void TIM_SetCmp9(TIM_Module *TIMx, uint16_t Compare9)设置 TIMx 捕获比较 9 寄存器的值。
name TIM_SetCmp9
fun Sets the TIMx Capture Compare9 Register value
param TIMx (The input parameters must be the following values):
- ATIM1
- ATIM2
param Compare9
- Compare9 can be a number between 0x0000 and 0xFFFF
return none
void TIM_SetCmp1D(TIM_Module *TIMx, uint16_t compare1D)设置 TIMx_CCDAT1 寄存器中的 CCDDAT1[31:16]。
name TIM_SetCmp1D
fun Sets the CCDDAT1[31:16] in TIMx_CCDAT1 register
param TIMx (The input parameters must be the following values):
- ATIM1
- ATIM2
param compare1D
- compare1D can be a number between 0x0000 and 0xFFFF
return none
void TIM_SetCmp2D(TIM_Module *TIMx, uint16_t compare2D)设置 TIMx_CCDAT2 寄存器中的 CCDDAT2[31:16]。
name TIM_SetCmp2D
fun Sets the CCDDAT2[31:16] in TIMx_CCDAT2 register
param TIMx (The input parameters must be the following values):
- ATIM1
- ATIM2
param compare2D
- compare2D can be a number between 0x0000 and 0xFFFF
return none
void TIM_SetCmp3D(TIM_Module *TIMx, uint16_t compare3D)设置 TIMx_CCDAT3 寄存器中的 CCDDAT3[31:16]。
name TIM_SetCmp3D
fun Sets the CCDDAT3[31:16] in TIMx_CCDAT3 register
param TIMx (The input parameters must be the following values):
- ATIM1
- ATIM2
param compare3D
- compare3D can be a number between 0x0000 and 0xFFFF
return none
void TIM_SetCmp4D(TIM_Module *TIMx, uint16_t compare4D)设置 TIMx_CCDAT4 寄存器中的 CCDDAT4[31:16]。
name TIM_SetCmp4D
fun Sets the CCDDAT4[31:16] in TIMx_CCDAT4 register
param TIMx (The input parameters must be the following values):
- ATIM1
- ATIM2
param compare4D
- compare4D can be a number between 0x0000 and 0xFFFF
return none
void TIM_AsymmetricEnable(TIM_Module *TIMx, FunctionalState Cmd)在中央对齐模式下使能或关闭非对称模式。
name TIM_AsymmetricEnable.
fun Enable or disable asymmetric mode in center-aligned.
param TIMx:
- ATIM1
- ATIM2
- GTIM3
- GTIM4
param Cmd
- ENABLE
- DISABLE
return none
void TIM_SelectCenterAlignTrig(TIM_Module *TIMx, uint32_t TIM_CenterAlignTriggerSource)设置中央对齐模式下的触发模式。
name TIM_SelectCenterAlignTrig.
fun Setting the trigger mode in central alignment mode.
param TIMx:
- ATIM1
- ATIM2
param TIM_CenterAlignTriggerSource
- TIM_UP_COUNTING
- TIM_DOWN_COUNTING
- TIM_UP_DOWN_COUNTING
return none
void TIM_OCxRefTriggerADC(TIM_Module *TIMx, uint32_t OCxRef, FunctionalState Cmd)使能或关闭 OCxREF 触发 ADC(x = 4、7、8 或 9)。
name TIM_OCxRefTriggerADC.
fun Enable or disable OCxREF to trigger ADC(x = 4,7,8 or 9).
param TIMx:
- ATIM1
- ATIM2
param OCxRef
- TIM_CTRL2_TRIG4
- TIM_CTRL2_TRIG7
- TIM_CTRL2_TRIG8
- TIM_CTRL2_TRIG9
param Cmd
- ENABLE
- DISABLE
return none
void TIM_ICInit(TIM_Module *TIMx, const TIM_ICInitType *TIM_ICInitStruct)根据 TIM_ICInitStruct 中指定的参数初始化 TIM 外设。
name TIM_ICInit
fun Initializes the TIM peripheral according to the specified
parameters in the TIM_ICInitStruct.
param TIMx (The input parameters must be the following values):
- ATIM1
- ATIM2
- GTIM1
- GTIM2
- GTIM3
- GTIM4
param TIM_ICInitStruct: refer to the definition of TIM_ICInitType
- Channel
* TIM_CH_1
* TIM_CH_2
* TIM_CH_3
* TIM_CH_4
- ICPolarity
* TIM_IC_POLARITY_RISING
* TIM_IC_POLARITY_FALLING
- ICSelection
* TIM_IC_SELECTION_DIRECTTI
* TIM_IC_SELECTION_INDIRECTTI
* TIM_IC_SELECTION_TRC
- ICPrescaler
* TIM_IC_PSC_DIV1
* TIM_IC_PSC_DIV2
* TIM_IC_PSC_DIV4
* TIM_IC_PSC_DIV8
- ICFilter
* ICFilter can be a number between 0x0 and 0xF
return none
void TIM_ConfigPwmIc(TIM_Module *TIMx, const TIM_ICInitType *TIM_ICInitStruct)根据 TIM_ICInitStruct 中指定的参数配置 TIM 外设,用于测量外部 PWM 信号。
name TIM_ConfigPwmIc
fun Configures the TIM peripheral according to the specified
parameters in the TIM_ICInitStruct to measure an external PWM signal.
param TIMx (The input parameters must be the following values):
- ATIM1
- ATIM2
- GTIM1
- GTIM2
- GTIM3
- GTIM4
param TIM_ICInitStruct: refer to the definition of TIM_ICInitType
- Channel
* TIM_CH_1
* TIM_CH_2
- ICPolarity
* TIM_IC_POLARITY_RISING
* TIM_IC_POLARITY_FALLING
- ICSelection
* TIM_IC_SELECTION_DIRECTTI
* TIM_IC_SELECTION_INDIRECTTI
- ICPrescaler
* TIM_IC_PSC_DIV1
* TIM_IC_PSC_DIV2
* TIM_IC_PSC_DIV4
* TIM_IC_PSC_DIV8
- ICFilter
* ICFilter can be a number between 0x0 and 0xF
return none
void ConfigTI1(TIM_Module *TIMx, uint32_t ICPolarity, uint32_t ICSelection, uint32_t ICFilter)将 TI1 配置为输入。
name ConfigTI1
fun Configure the TI1 as Input.
param TIMx (The input parameters must be the following values):
- ATIM1
- ATIM2
- GTIM1
- GTIM2
- GTIM3
- GTIM4
param ICPolarity
- TIM_IC_POLARITY_RISING
- TIM_IC_POLARITY_FALLING
param ICSelection
- TIM_IC_SELECTION_DIRECTTI
- TIM_IC_SELECTION_INDIRECTTI
- TIM_IC_SELECTION_TRC
param ICFilter
- ICFilter can be a number between 0x0 and 0xF
return none
void ConfigTI2(TIM_Module *TIMx, uint32_t ICPolarity, uint32_t ICSelection, uint32_t ICFilter)将 TI2 配置为输入。
name ConfigTI2
fun Configure the TI2 as Input.
param TIMx (The input parameters must be the following values):
- ATIM1
- ATIM2
- GTIM1
- GTIM2
- GTIM3
- GTIM4
param ICPolarity
- TIM_IC_POLARITY_RISING
- TIM_IC_POLARITY_FALLING
param ICSelection
- TIM_IC_SELECTION_DIRECTTI
- TIM_IC_SELECTION_INDIRECTTI
- TIM_IC_SELECTION_TRC
param ICFilter
- ICFilter can be a number between 0x0 and 0xF
return none
void ConfigTI3(TIM_Module *TIMx, uint32_t ICPolarity, uint32_t ICSelection, uint32_t ICFilter)将 TI3 配置为输入。
name ConfigTI3
fun Configure the TI3 as Input.
param TIMx (The input parameters must be the following values):
- ATIM1
- ATIM2
- GTIM1
- GTIM2
- GTIM3
- GTIM4
param ICPolarity
- TIM_IC_POLARITY_RISING
- TIM_IC_POLARITY_FALLING
param ICSelection
- TIM_IC_SELECTION_DIRECTTI
- TIM_IC_SELECTION_INDIRECTTI
- TIM_IC_SELECTION_TRC
param ICFilter
- ICFilter can be a number between 0x0 and 0xF
return none
void ConfigTI4(TIM_Module *TIMx, uint32_t ICPolarity, uint32_t ICSelection, uint32_t ICFilter)将 TI4 配置为输入。
name ConfigTI4
fun Configure the TI4 as Input.
param TIMx (The input parameters must be the following values):
- ATIM1
- ATIM2
- GTIM1
- GTIM2
- GTIM3
- GTIM4
param ICPolarity
- TIM_IC_POLARITY_RISING
- TIM_IC_POLARITY_FALLING
param ICSelection
- TIM_IC_SELECTION_DIRECTTI
- TIM_IC_SELECTION_INDIRECTTI
- TIM_IC_SELECTION_TRC
param ICFilter
- ICFilter can be a number between 0x0 and 0xF
return none
void TIM_SetInCap1Prescaler(TIM_Module *TIMx, uint32_t ICPrescaler)设置 TIMx 输入捕获 1 的预分频器。
name TIM_SetInCap1Prescaler
fun Sets the TIMx Input Capture 1 prescaler.
param TIMx (The input parameters must be the following values):
- ATIM1
- ATIM2
- GTIM1
- GTIM2
- GTIM3
- GTIM4
param ICPrescaler
- TIM_IC_PSC_DIV1
- TIM_IC_PSC_DIV2
- TIM_IC_PSC_DIV4
- TIM_IC_PSC_DIV8
return none
void TIM_SetInCap2Prescaler(TIM_Module *TIMx, uint32_t ICPrescaler)设置 TIMx 输入捕获 2 的预分频器。
name TIM_SetInCap2Prescaler
fun Sets the TIMx Input Capture 2 prescaler.
param TIMx (The input parameters must be the following values):
- ATIM1
- ATIM2
- GTIM1
- GTIM2
- GTIM3
- GTIM4
param ICPrescaler
- TIM_IC_PSC_DIV1
- TIM_IC_PSC_DIV2
- TIM_IC_PSC_DIV4
- TIM_IC_PSC_DIV8
return none
void TIM_SetInCap3Prescaler(TIM_Module *TIMx, uint32_t ICPrescaler)设置 TIMx 输入捕获 3 的预分频器。
name TIM_SetInCap3Prescaler
fun Sets the TIMx Input Capture 3 prescaler.
param TIMx (The input parameters must be the following values):
- ATIM1
- ATIM2
- GTIM1
- GTIM2
- GTIM3
- GTIM4
param ICPrescaler
- TIM_IC_PSC_DIV1
- TIM_IC_PSC_DIV2
- TIM_IC_PSC_DIV4
- TIM_IC_PSC_DIV8
return none
void TIM_SetInCap4Prescaler(TIM_Module *TIMx, uint32_t ICPrescaler)设置 TIMx 输入捕获 4 的预分频器。
name TIM_SetInCap4Prescaler
fun Sets the TIMx Input Capture 4 prescaler.
param TIMx (The input parameters must be the following values):
- ATIM1
- ATIM2
- GTIM1
- GTIM2
- GTIM3
- GTIM4
param ICPrescaler
- TIM_IC_PSC_DIV1
- TIM_IC_PSC_DIV2
- TIM_IC_PSC_DIV4
- TIM_IC_PSC_DIV8
return none
uint32_t TIM_GetCap1(const TIM_Module *TIMx)获取 TIMx 输入捕获 1 的值。
name TIM_GetCap1
fun Gets the TIMx Input Capture 1 value.
param TIMx (The input parameters must be the following values):
- ATIM1
- ATIM2
- GTIM1
- GTIM2
- GTIM3
- GTIM4
return Capture Compare 1 Register value.
uint32_t TIM_GetCap2(const TIM_Module *TIMx)获取 TIMx 输入捕获 2 的值。
name TIM_GetCap2
fun Gets the TIMx Input Capture 2 value.
param TIMx (The input parameters must be the following values):
- ATIM1
- ATIM2
- GTIM1
- GTIM2
- GTIM3
- GTIM4
return Capture Compare 2 Register value.
uint32_t TIM_GetCap3(const TIM_Module *TIMx)获取 TIMx 输入捕获 3 的值。
name TIM_GetCap3
fun Gets the TIMx Input Capture 3 value.
param TIMx (The input parameters must be the following values):
- ATIM1
- ATIM2
- GTIM1
- GTIM2
- GTIM3
- GTIM4
return Capture Compare 3 Register value.
uint32_t TIM_GetCap4(const TIM_Module *TIMx)获取 TIMx 输入捕获 4 的值。
name TIM_GetCap4
fun Gets the TIMx Input Capture 4 value.
param TIMx (The input parameters must be the following values):
- ATIM1
- ATIM2
- GTIM1
- GTIM2
- GTIM3
- GTIM4
return Capture Compare 4 Register value.
uint16_t TIM_GetCap5(const TIM_Module *TIMx)获取 TIMx 输入捕获 5 的值。
name TIM_GetCap5
fun Gets the TIMx Input Capture 5 value.
param TIMx (The input parameters must be the following values):
- ATIM1
- ATIM2
return Capture Compare 5 Register value.
uint16_t TIM_GetCap6(const TIM_Module *TIMx)获取 TIMx 输入捕获 6 的值。
name TIM_GetCap6
fun Gets the TIMx Input Capture 6 value.
param TIMx (The input parameters must be the following values):
- ATIM1
- ATIM2
return Capture Compare 6 Register value.
uint16_t TIM_GetCap7(const TIM_Module *TIMx)获取 TIMx 输入捕获 7 的值。
name TIM_GetCap7
fun Gets the TIMx Input Capture 7 value.
param TIMx (The input parameters must be the following values):
- ATIM1
- ATIM2
return Capture Compare 7 Register value.
uint16_t TIM_GetCap8(const TIM_Module *TIMx)获取 TIMx 输入捕获 8 的值。
name TIM_GetCap8
fun Gets the TIMx Input Capture 8 value.
param TIMx (The input parameters must be the following values):
- ATIM1
- ATIM2
return Capture Compare 8 Register value.
uint16_t TIM_GetCap9(const TIM_Module *TIMx)获取 TIMx 输入捕获 9 的值。
name TIM_GetCap9
fun Gets the TIMx Input Capture 9 value.
param TIMx (The input parameters must be the following values):
- ATIM1
- ATIM2
return Capture Compare 9 Register value.
uint16_t TIM_GetCap1D(const TIM_Module *TIMx)获取 TIMx 输入捕获 1D 的值。
name TIM_GetCap1D
fun Gets the TIMx Input Capture 1D value.
param TIMx (The input parameters must be the following values):
- ATIM1
- ATIM2
return Capture Compare 1D Register value.
uint16_t TIM_GetCap2D(const TIM_Module *TIMx)获取 TIMx 输入捕获 2D 的值。
name TIM_GetCap2D
fun Gets the TIMx Input Capture 2D value.
param TIMx (The input parameters must be the following values):
- ATIM1
- ATIM2
return Capture Compare 2D Register value.
uint16_t TIM_GetCap3D(const TIM_Module *TIMx)获取 TIMx 输入捕获 3D 的值。
name TIM_GetCap3D
fun Gets the TIMx Input Capture 3D value.
param TIMx (The input parameters must be the following values):
- ATIM1
- ATIM2
return Capture Compare 3D Register value.
uint16_t TIM_GetCap4D(const TIM_Module *TIMx)获取 TIMx 输入捕获 4D 的值。
name TIM_GetCap4D
fun Gets the TIMx Input Capture 4D value.
param TIMx (The input parameters must be the following values):
- ATIM1
- ATIM2
return Capture Compare 4D Register value.
void TIM_IC1FiltConfig(TIM_Module *TIMx, const TIM_FiltInitType *TIM_FiltInitStruct)配置通道 1 的滤波器。
name TIM_IC1FiltConfig
fun Config the filter of channel1.
param TIMx:
- GTIM1
- GTIM2
- GTIM3
- GTIM4
param TIM_FiltInitStruct:
- refer to the definition of TIM_FiltInitType
return none
void TIM_IC2FiltConfig(TIM_Module *TIMx, const TIM_FiltInitType *TIM_FiltInitStruct)配置通道 2 的滤波器。
name TIM_IC2FiltConfig
fun Config the filter of channel2.
param TIMx:
- GTIM1
- GTIM2
- GTIM3
- GTIM4
param TIM_FiltInitStruct:
- refer to the definition of TIM_FiltInitType
return none
void TIM_IC3FiltConfig(TIM_Module *TIMx, const TIM_FiltInitType *TIM_FiltInitStruct)配置通道 3 的滤波器。
name TIM_IC3FiltConfig
fun Config the filter of channel3.
param TIMx:
- GTIM1
- GTIM2
- GTIM3
- GTIM4
param TIM_FiltInitStruct:
- refer to the definition of TIM_FiltInitType
return none
void TIM_IC4FiltConfig(TIM_Module *TIMx, const TIM_FiltInitType *TIM_FiltInitStruct)配置通道 4 的滤波器。
name TIM_IC4FiltConfig
fun Config the filter of channel4.
param TIMx:
- GTIM1
- GTIM2
- GTIM3
- GTIM4
param TIM_FiltInitStruct:
- refer to the definition of TIM_FiltInitType
return none
void TIM_IC1FiltEnable(TIM_Module *TIMx, FunctionalState Cmd)使能或关闭通道 1 的滤波器。
name TIM_IC1FiltEnable
fun Enable or disable the filter of channel1.
param TIMx:
- GTIM1
- GTIM2
- GTIM3
- GTIM4
param Cmd :
- ENABLE
- DISABLE
return none
void TIM_IC2FiltEnable(TIM_Module *TIMx, FunctionalState Cmd)使能或关闭通道 2 的滤波器。
name TIM_IC2FiltEnable
fun Enable or disable the filter of channel2.
param TIMx:
- GTIM1
- GTIM2
- GTIM3
- GTIM4
param Cmd :
- ENABLE
- DISABLE
return none
void TIM_IC3FiltEnable(TIM_Module *TIMx, FunctionalState Cmd)使能或关闭通道 3 的滤波器。
name TIM_IC3FiltEnable
fun Enable or disable the filter of channel3.
param TIMx:
- GTIM1
- GTIM2
- GTIM3
- GTIM4
param Cmd :
- ENABLE
- DISABLE
return none
void TIM_IC4FiltEnable(TIM_Module *TIMx, FunctionalState Cmd)使能或关闭通道 4 的滤波器。
name TIM_IC4FiltEnable
fun Enable or disable the filter of channel4.
param TIMx:
- GTIM1
- GTIM2
- GTIM3
- GTIM4
param Cmd :
- ENABLE
- DISABLE
return none
FlagStatus TIM_GetFiltStatus(const TIM_Module *TIMx, uint32_t TIM_FiltFlag)检查指定滤波器的状态。
name TIM_GetFiltStatus
fun Checks the specified filter status.
param TIMx (The input parameters must be the following values):
- GTIM1
- GTIM2
- GTIM3
- GTIM4
param TIM_FiltFlag :
- TIM_C1FILTO
- TIM_C2FILTO
- TIM_C3FILTO
- TIM_C4FILTO
return The new state of TIM_FiltFlag (SET or RESET).
void TIM_EnableCtrlPwmOutputs(TIM_Module *TIMx, FunctionalState Cmd)使能或关闭 TIM 外设主输出。
name TIM_EnableCtrlPwmOutputs
fun Enables or disables the TIM peripheral Main Outputs.
param TIMx (The input parameters must be the following values):
- ATIM1
- ATIM2
- GTIM3
- GTIM4
param Cmd :
- ENABLE
- DISABLE
return none
void TIM_ConfigBkdt(TIM_Module *TIMx, const TIM_BDTRInitType *TIM_BDTRInitStruct)配置刹车功能、死区时间、锁定级别、OSSI、OSSR 状态与 AOE(自动输出使能)。
name TIM_ConfigBkdt
fun Configures the: Break feature, dead time, Lock level, the OSSI,
the OSSR State and the AOE(automatic output enable).
param TIMx (The input parameters must be the following values):
- ATIM1
- ATIM2
- GTIM3
- GTIM4
param TIM_BDTRInitStruct: refer to the definition of TIM_BDTRInitType
- OSSRState
* TIM_OSSR_STATE_ENABLE
* TIM_OSSR_STATE_DISABLE
- OSSIState
* TIM_OSSI_STATE_ENABLE
* TIM_OSSI_STATE_DISABLE
- LOCKLevel
* TIM_LOCK_LEVEL_OFF
* TIM_LOCK_LEVEL_1
* TIM_LOCK_LEVEL_2
* TIM_LOCK_LEVEL_3
- DeadTime
* DeadTime can be a number between 0x00 and 0xFF
- Break
* TIM_BREAK_IN_ENABLE
* TIM_BREAK_IN_DISABLE
- BreakPolarity
* TIM_BREAK_POLARITY_LOW
* TIM_BREAK_POLARITY_HIGH
- Bidirection
* TIM_BREAK_BID_ENABLE
* TIM_BREAK_BID_DISABLE
- AutomaticOutput
* TIM_AUTO_OUTPUT_ENABLE
* TIM_AUTO_OUTPUT_DISABLE
return none
void TIM_BreakFiltConfig(TIM_Module *TIMx, const TIM_FiltInitType *TIM_FiltInitStruct)配置刹车输入的滤波器。
name TIM_BreakFiltConfig
fun Config the filter of break input.
param TIMx:
- ATIM1
- ATIM2
- GTIM3
- GTIM4
param TIM_FiltInitStruct:
- refer to the definition of TIM_FiltInitType
return none
void TIM_BreakFiltEnable(TIM_Module *TIMx, FunctionalState Cmd)使能或关闭刹车输入的滤波器。
name TIM_BreakFiltEnable
fun Enable or disable the filter of break input.
param TIMx:
- ATIM1
- ATIM2
- GTIM3
- GTIM4
param Cmd :
- ENABLE
- DISABLE
return none
void TIM_BreakInputSourceEnable(TIM_Module *TIMx, uint32_t Source, uint32_t Polarity, FunctionalState Cmd)使能或关闭刹车输入源,并设置刹车输入源的极性。
name TIM_BreakInputSourceEnable
fun Enable or disable the break input source , and set the polarity of the break input source.
param TIMx (The input parameters must be the following values):
- ATIM1
- ATIM2
- GTIM3
- GTIM4
param Source
- TIM_BREAK_LOCKUP
- TIM_BREAK_PVD
- TIM_BREAK_IOM1
- TIM_BREAK_IOM2
- TIM_BREAK_IOM3
- TIM_BREAK_IOM4
- TIM_BREAK_IOM5
- TIM_BREAK_IOM6
- TIM_BREAK_IOM7
- TIM_BREAK_COMP1
- TIM_BREAK_COMP2
- TIM_BREAK_COMP3
param Polarity
- TIM_BREAK_SOURCE_POLARITY_INVERT
- TIM_BREAK_SOURCE_POLARITY_NONINVERT
param Cmd
- ENABLE
- DISABLE
return none
void TIM_BidirectionDisarm(TIM_Module *TIMx)解除刹车双向保护。
name TIM_BidirectionDisarm
fun Disarm bidirection of break.
param TIMx (The input parameters must be the following values):
- ATIM1
- ATIM2
- GTIM3
- GTIM4
return none
void TIM_BidirectionRearm(TIM_Module *TIMx)重新使能刹车双向保护。
name TIM_BidirectionRearm
fun Rearm bidirection of break.
param TIMx (The input parameters must be the following values):
- ATIM1
- ATIM2
- GTIM3
- GTIM4
return none
void TIM_SelectComEvt(TIM_Module *TIMx, FunctionalState Cmd)选择 TIM 外设换相事件。
name TIM_SelectComEvt
fun Selects the TIM peripheral Commutation event.
param TIMx (The input parameters must be the following values):
- ATIM1
- ATIM2
- GTIM3
- GTIM4
param Cmd
- ENABLE
- DISABLE
return none
void TIM_SelectCapCmpDmaSrc(TIM_Module *TIMx, FunctionalState Cmd)选择 TIMx 外设捕获比较 DMA 源。
name TIM_SelectCapCmpDmaSrc
fun Selects the TIMx peripheral Capture Compare DMA source.
param TIMx (The input parameters must be the following values):
- ATIM1
- ATIM2
- GTIM1
- GTIM2
- GTIM3
- GTIM4
param Cmd
- ENABLE
- DISABLE
return none
使用提示: 实现按 Cmd 置位或清位 TIMx->CTRL2 的 CCDSEL 位,用于把捕获/比较事件选作 DMA 请求源。
void TIM_EnableCapCmpPreloadControl(TIM_Module *TIMx, FunctionalState Cmd)置位或复位 TIM 外设捕获比较预装载控制位。
name TIM_EnableCapCmpPreloadControl
fun Sets or Resets the TIM peripheral Capture Compare Preload Control bit.
param TIMx (The input parameters must be the following values):
- ATIM1
- ATIM2
- GTIM3
- GTIM4
param Cmd
- ENABLE
- DISABLE
return none
使用提示: 实现按 Cmd 置位或清位 TIMx->CTRL2 的 CCPCTL 位。
FlagStatus TIM_GetCCENStatus(const TIM_Module *TIMx, uint32_t TIM_CCEN)检查指定的 TIM 标志是否置位。
name TIM_GetCCENStatus
fun Checks whether the specified TIM flag is set or not.
param TIMx (The input parameters must be the following values):
- ATIM1
- ATIM2
- GTIM1
- GTIM2
- GTIM3
- GTIM4
param TIM_CCEN :
- TIM_CC1EN
- TIM_CC1NEN
- TIM_CC2EN
- TIM_CC2NEN
- TIM_CC3EN
- TIM_CC3NEN
- TIM_CC4EN
- TIM_CC4NEN
- TIM_CC5EN
- TIM_CC6EN
return The new state of TIM_FLAG (SET or RESET).
使用提示: 实现读取捕获/比较使能寄存器 TIMx->CCEN 并与 TIM_CCEN 按位与判断,检查的是通道使能位,而不是 STS 中的中断标志。
void TIM_ConfigEncoderInterface(TIM_Module *TIMx, uint32_t TIM_EncoderMode, uint32_t TIM_IC1Polarity, uint32_t TIM_IC2Polarity)配置 TIMx 编码器接口。
name TIM_ConfigEncoderInterface
fun Configures the TIMx Encoder Interface.
param TIMx (The input parameters must be the following values):
- ATIM1
- ATIM2
- GTIM3
- GTIM4
param TIM_EncoderMode
- TIM_ENCODE_QUA_MODE_TI1
- TIM_ENCODE_QUA_MODE_TI2
- TIM_ENCODE_QUA_MODE_TI12
param TIM_IC1Polarity
- TIM_IC_POLARITY_FALLING
- TIM_IC_POLARITY_RISING
param TIM_IC2Polarity
- TIM_IC_POLARITY_FALLING
- TIM_IC_POLARITY_RISING
return none
void TIM_ConfigEncoderInterface2(TIM_Module *TIMx, uint32_t TIM_EncoderMode, uint32_t TIM_IC1Polarity, uint32_t TIM_IC2Polarity)配置 TIMx 编码器接口。
name TIM_ConfigEncoderInterface2
fun Configures the TIMx Encoder Interface.
param TIMx (The input parameters must be the following values):
- GTIM1
- GTIM2
param TIM_EncoderMode
- TIM_ENCODE2_QUA_MODE_TI1
- TIM_ENCODE2_QUA_MODE_TI2
- TIM_ENCODE2_QUA_MODE_TI12
- TIM_ENCODE2_QUA_MODE_SINGLE_TI1
- TIM_ENCODE2_QUA_MODE_SINGLE_TI2
- TIM_ENCODE2_DUL_CLKPLUS_MODE1
- TIM_ENCODE2_DUL_CLKPLUS_MODE2
- TIM_ENCODE2_SINGLE_CLKPLUS_MODE1
- TIM_ENCODE2_SINGLE_CLKPLUS_MODE2
- TIM_ENCODE2_CCW_MODE1
- TIM_ENCODE2_CCW_MODE2
param TIM_IC1Polarity
- TIM_IC_POLARITY_FALLING
- TIM_IC_POLARITY_RISING
param TIM_IC2Polarity
- TIM_IC_POLARITY_FALLING
- TIM_IC_POLARITY_RISING
return none
void TIM_TrgiLoadLvrToCNTEnable(TIM_Module *TIMx, FunctionalState Cmd)TRGI 信号触发将 ENCLVR 值加载到 CNT。
name TIM_TrgiLoadLvrToCNTEnable
fun The TRGI signal triggers the loading of the ENCLVR value into the CNT.
param TIMx (The input parameters must be the following values):
- GTIM2
param Cmd :
- ENABLE
- DISABLE
return none
uint32_t TIM_GetLVR(const TIM_Module *TIMx)获取 TIMx 的 LVR 值。
name TIM_GetLVR
fun Get the TIMx LVR value.
param TIMx (The input parameters must be the following values):
- GTIM1
- GTIM2
return ENCLVR Register value.
void TIM_CH3LoadLvrToCNTEnable(TIM_Module *TIMx, FunctionalState Cmd)CH3 触发将 ENCLVR 值加载到 CNT。
name TIM_CH3LoadLvrToCNTEnable
fun The CH3 triggers the loading of the ENCLVR value into the CNT.
param TIMx (The input parameters must be the following values):
- GTIM1
- GTIM2
param Cmd :
- ENABLE
- DISABLE
return none
void TIM_CH3LoadLvrToCNTPolarity(TIM_Module *TIMx, uint32_t Polarity)配置 CH3 的极性以触发将 ENCLVR 值加载到 CNT。
name TIM_CH3LoadLvrToCNTPolarity
fun Config CH3 Polarity to trigger ENCLVR value loading into the CNT.
param TIMx (The input parameters must be the following values):
- GTIM1
- GTIM2
param Polarity :
- TIM_CH3_POLARITY_HIGH
- TIM_CH3_POLARITY_LOW
- TIM_CH3_POLARITY_RISING
- TIM_CH3_POLARITY_FALLING
return none
uint32_t TIM_GetENCDAT(const TIM_Module *TIMx)获取 TIMx 的 ENCDAT 值。
name TIM_GetENCDAT
fun Gets the TIMx ENCDAT value.
param TIMx (The input parameters must be the following values):
- GTIM1
- GTIM2
return ENCDAT Register value.
uint32_t TIM_GetENCDATSign(const TIM_Module *TIMx)获取 TIMx ENCDAT 值的符号。
name TIM_GetENCDATSign
fun Get the sign of TIMx ENCDAT value.
param TIMx (The input parameters must be the following values):
- GTIM1
- GTIM2
return Sign of TIMx ENCDAT value.
void TIM_ConfigInternalClk(TIM_Module *TIMx)配置 TIMx 内部时钟。
name TIM_ConfigInternalClk
fun Configures the TIMx internal Clock
param TIMx (The input parameters must be the following values):
- ATIM1
- ATIM2
- GTIM1
- GTIM2
- GTIM3
- GTIM4
return none
void TIM_SelectInputTrig(TIM_Module *TIMx, uint32_t TIM_InputTriggerSource)选择输入触发源。
name TIM_SelectInputTrig
fun Selects the Input Trigger source
param TIMx (The input parameters must be the following values):
- ATIM1
- ATIM2
- ATIM3
- GTIM1
- GTIM2
- GTIM3
- GTIM4
- GTIM5
- GTIM6
- GTIM7
- GTIM8
- GTIM9
- GTIM10
param TIM_InputTriggerSource:
- TIM_TRIG_SEL_IN_TR0
- TIM_TRIG_SEL_IN_TR1
- TIM_TRIG_SEL_IN_TR2
- TIM_TRIG_SEL_IN_TR3
- TIM_TRIG_SEL_IN_TR4
- TIM_TRIG_SEL_IN_TR5
- TIM_TRIG_SEL_TI1F_ED
- TIM_TRIG_SEL_TI1FP1
- TIM_TRIG_SEL_TI2FP2
- TIM_TRIG_SEL_ETRF
return none
void TIM_ConfigInternalTrigToExt(TIM_Module *TIMx, uint32_t TIM_InputTriggerSource)将 TIMx 内部触发配置为外部时钟。
name TIM_ConfigInternalTrigToExt
fun Configures the TIMx Internal Trigger as External Clock
param TIMx (The input parameters must be the following values):
- ATIM1
- ATIM2
- GTIM1
- GTIM2
- GTIM3
- GTIM4
param TIM_InputTriggerSource:
- TIM_TRIG_SEL_IN_TR0
- TIM_TRIG_SEL_IN_TR1
- TIM_TRIG_SEL_IN_TR2
- TIM_TRIG_SEL_IN_TR3
- TIM_TRIG_SEL_IN_TR4
- TIM_TRIG_SEL_IN_TR5
return none
void TIM_ConfigExtTrigAsClk(TIM_Module *TIMx, uint32_t TIM_TIxExternalCLKSource, uint32_t IcPolarity, uint32_t ICFilter)将 TIMx 触发器配置为外部时钟。
name TIM_ConfigExtTrigAsClk
fun Configures the TIMx Trigger as External Clock
param TIMx (The input parameters must be the following values):
- ATIM1
- ATIM2
- GTIM1
- GTIM2
- GTIM3
- GTIM4
param TIM_TIxExternalCLKSource:
- TIM_TRIG_SEL_TI1F_ED
- TIM_TRIG_SEL_TI1FP1
- TIM_TRIG_SEL_TI2FP2
param ICPolarity
- TIM_IC_POLARITY_RISING
- TIM_IC_POLARITY_FALLING
param ICFilter
- ICFilter can be a number between 0x0 and 0xF
return none
void TIM_ConfigExtClkMode1(TIM_Module *TIMx, uint32_t TIM_ETRInputSource, uint32_t TIM_ExtTRGPrescaler, uint32_t TIM_ExtTRGPolarity, uint32_t ExtTRGFilter)配置外部时钟模式 1。
name TIM_ConfigExtClkMode1
fun Configures the External clock Mode1
param TIMx (The input parameters must be the following values):
- ATIM1
- ATIM2
- GTIM1
- GTIM2
- GTIM3
- GTIM4
param TIM_ETRInputSource:
- TIM_CAPETRSEL_0
- TIM_CAPETRSEL_1
- TIM_CAPETRSEL_2
- TIM_CAPETRSEL_3
- TIM_CAPETRSEL_4
- TIM_CAPETRSEL_5
param TIM_ExtTRGPrescaler:
- TIM_EXT_TRG_PSC_OFF
- TIM_EXT_TRG_PSC_DIV2
- TIM_EXT_TRG_PSC_DIV4
- TIM_EXT_TRG_PSC_DIV8
param TIM_ExtTRGPolarity
- TIM_EXT_TRIG_POLARITY_INVERTED
- TIM_EXT_TRIG_POLARITY_NONINVERTED
param ExtTRGFilter
- ExtTRGFilter can be a number between 0x0 and 0xF
return none
void TIM_ConfigExtClkMode2(TIM_Module *TIMx, uint32_t TIM_ETRInputSource, uint32_t TIM_ExtTRGPrescaler, uint32_t TIM_ExtTRGPolarity, uint32_t ExtTRGFilter)配置外部时钟模式 2。
name TIM_ConfigExtClkMode2
fun Configures the External clock Mode2
param TIMx (The input parameters must be the following values):
- ATIM1
- ATIM2
- GTIM1
- GTIM2
- GTIM3
- GTIM4
param TIM_ETRInputSource:
- TIM_CAPETRSEL_0
- TIM_CAPETRSEL_1
- TIM_CAPETRSEL_2
- TIM_CAPETRSEL_3
- TIM_CAPETRSEL_4
- TIM_CAPETRSEL_5
param TIM_ExtTRGPrescaler:
- TIM_EXT_TRG_PSC_OFF
- TIM_EXT_TRG_PSC_DIV2
- TIM_EXT_TRG_PSC_DIV4
- TIM_EXT_TRG_PSC_DIV8
param TIM_ExtTRGPolarity
- TIM_EXT_TRIG_POLARITY_INVERTED
- TIM_EXT_TRIG_POLARITY_NONINVERTED
param ExtTRGFilter
- ExtTRGFilter can be a number between 0x0 and 0xF
return none
void TIM_ConfigExtTrig(TIM_Module *TIMx, uint32_t TIM_ExtTRGPrescaler, uint32_t TIM_ExtTRGPolarity, uint32_t ExtTRGFilter)配置 TIMx 外部触发(ETR)。
name TIM_ConfigExtTrig
fun Configures the TIMx External Trigger (ETR).
param TIMx (The input parameters must be the following values):
- ATIM1
- ATIM2
- GTIM1
- GTIM2
- GTIM3
- GTIM4
param TIM_ExtTRGPrescaler:
- TIM_EXT_TRG_PSC_OFF
- TIM_EXT_TRG_PSC_DIV2
- TIM_EXT_TRG_PSC_DIV4
- TIM_EXT_TRG_PSC_DIV8
param TIM_ExtTRGPolarity
- TIM_EXT_TRIG_POLARITY_INVERTED
- TIM_EXT_TRIG_POLARITY_NONINVERTED
param ExtTRGFilter
- ExtTRGFilter can be a number between 0x0 and 0xF
return none
void TIM_SelectETRInputSource(TIM_Module *TIMx, uint32_t TIM_ETRInputSource)配置 tim_etr_in 的来源。
name TIM_SelectETRInputSource
fun Configures the source of tim_etr_in.
param TIMx (The input parameters must be the following values):
- ATIM1
- ATIM2
- GTIM1
- GTIM2
- GTIM3
- GTIM4
param TIM_ETRInputSource:
- TIM_CAPETRSEL_0
- TIM_CAPETRSEL_1
- TIM_CAPETRSEL_2
- TIM_CAPETRSEL_3
- TIM_CAPETRSEL_4
- TIM_CAPETRSEL_5
return none
void TIM_SelectOutputTrig(TIM_Module *TIMx, uint32_t TIM_TRGOSource)选择 TIMx 触发输出模式。
name TIM_SelectOutputTrig
fun Selects the TIMx Trigger Output Mode.
param TIMx (The input parameters must be the following values):
- ATIM1
- ATIM2
- GTIM1
- GTIM2
- GTIM3
- GTIM4
- BTIM1
- BTIM2
param TIM_TRGOSource
- TIM_TRGO_SRC_RESET
- TIM_TRGO_SRC_ENABLE
- TIM_TRGO_SRC_UPDATE
- TIM_TRGO_SRC_OC1
- TIM_TRGO_SRC_OC1REF
- TIM_TRGO_SRC_OC2REF
- TIM_TRGO_SRC_OC3REF
- TIM_TRGO_SRC_OC4REF
- TIM_TRGO_SRC_OC4_7_8_9REF
return none
void TIM_SelectOutputTrig2(TIM_Module *TIMx, uint32_t TIM_TRGO2Source)选择 TIMx 触发输出模式。
name TIM_SelectOutputTrig2
fun Selects the TIMx Trigger Output Mode.
param TIMx (The input parameters must be the following values):
- ATIM1
param TIM_TRGO2Source
- TIM_TRGO2_SRC_RESET
- TIM_TRGO2_SRC_ENABLE
- TIM_TRGO2_SRC_UPDATE
- TIM_TRGO2_SRC_OC1
- TIM_TRGO2_SRC_OC1REF
- TIM_TRGO2_SRC_OC2REF
- TIM_TRGO2_SRC_OC3REF
- TIM_TRGO2_SRC_OC4REF
- TIM_TRGO2_SRC_OC5REF
- TIM_TRGO2_SRC_OC6REF
- LL_TIM_TRGO2_OC4_RISINGFALLING
- LL_TIM_TRGO2_OC6_RISINGFALLING
- LL_TIM_TRGO2_OC4_RISING_OC6_RISING
- LL_TIM_TRGO2_OC4_RISING_OC6_FALLING
- LL_TIM_TRGO2_OC5_RISING_OC6_RISING
- LL_TIM_TRGO2_OC5_RISING_OC6_FALLING
return none
void TIM_SelectSlaveMode(TIM_Module *TIMx, uint32_t TIM_SlaveMode)选择 TIMx 从模式。
name TIM_SelectSlaveMode
fun Selects the TIMx Slave Mode.
param TIMx (The input parameters must be the following values):
- ATIM1
- ATIM2
- GTIM1
- GTIM2
- GTIM3
- GTIM4
param TIM_SlaveMode
- TIM_SLAVE_MODE_DISABLE
- TIM_SLAVE_MODE_RESET
- TIM_SLAVE_MODE_GATED
- TIM_SLAVE_MODE_TRIG
- TIM_SLAVE_MODE_EXT1
- TIM_SLAVE_MODE_GATED_RESET
- TIM_SLAVE_MODE_TRIG_RESET
return none
void TIM_SelectMasterSlaveMode(TIM_Module *TIMx, uint32_t TIM_MasterSlaveMode)置位或复位 TIMx 主/从模式。
name TIM_SelectMasterSlaveMode
fun Sets or Resets the TIMx Master/Slave Mode.
param TIMx (The input parameters must be the following values):
- ATIM1
- ATIM2
- GTIM1
- GTIM2
- GTIM3
- GTIM4
param TIM_MasterSlaveMode
- TIM_MASTER_SLAVE_MODE_ENABLE
- TIM_MASTER_SLAVE_MODE_DISABLE
return none
void TIM_SelectHallSensor(TIM_Module *TIMx, FunctionalState Cmd)使能或关闭 TIMx 的霍尔传感器接口。
name TIM_SelectHallSensor
fun Enables or disables the TIMx's Hall sensor interface.
param TIMx (The input parameters must be the following values):
- ATIM1
- ATIM2
- GTIM1
- GTIM2
- GTIM3
- GTIM4
param Cmd
- ENABLE
- DISABLE
return none
void TIM_ConfigDma(TIM_Module *TIMx, uint32_t TIM_DMABase, uint32_t TIM_DMABurstLength)配置 TIMx 的 DMA 接口。
name TIM_ConfigDma
fun Configures the TIMx's DMA interface.
param TIMx (The input parameters must be the following values):
- ATIM1
- ATIM2
- GTIM1
- GTIM2
- GTIM3
- GTIM4
param TIM_DMABase:
- TIM_DMABASE_CTRL1
- TIM_DMABASE_CTRL2
- TIM_DMABASE_STS
- TIM_DMABASE_EVTGEN
- TIM_DMABASE_SMCTRL
- TIM_DMABASE_DMAINTEN
- TIM_DMABASE_CAPCMPMOD1
- TIM_DMABASE_CAPCMPMOD2
- TIM_DMABASE_CAPCMPMOD3
- TIM_DMABASE_CAPCMPEN
- TIM_DMABASE_CAPCMPDAT1
- TIM_DMABASE_CAPCMPDAT2
- TIM_DMABASE_CAPCMPDAT3
- TIM_DMABASE_CAPCMPDAT4
- TIM_DMABASE_CAPCMPDAT5
- TIM_DMABASE_CAPCMPDAT6
- TIM_DMABASE_PSC
- TIM_DMABASE_AR
- TIM_DMABASE_CNT
- TIM_DMABASE_REPCNT
- TIM_DMABASE_BKDT
- TIM_DMABASE_CAPCMPDAT7
- TIM_DMABASE_CAPCMPDAT8
- TIM_DMABASE_CAPCMPDAT9
- TIM_DMABASE_BKFR
- TIM_DMABASE_C1FILT
- TIM_DMABASE_C2FILT
- TIM_DMABASE_C3FILT
- TIM_DMABASE_C4FILT
- TIM_DMABASE_FILTO
- TIM_DMABASE_INSEL
- TIM_DMABASE_AF1
- TIM_DMABASE_ENCDAT
- TIM_DMABASE_ENCMCTRL
- TIM_DMABASE_ENCLVR
param TIM_DMABurstLength:
- This parameter can be one value between:
TIM_DMABURST_LENGTH_1TRANSFER and TIM_DMABURST_LENGTH_37TRANSFERS.
return none
void TIM_EnableDma(TIM_Module *TIMx, uint32_t TIM_DMASource, FunctionalState Cmd)使能或关闭 TIMx 的 DMA 请求。
name TIM_EnableDma
fun Enables or disables the TIMx's DMA Requests.
param TIMx (The input parameters must be the following values):
- ATIM1
- ATIM2
- GTIM1
- GTIM2
- GTIM3
- GTIM4
param TIM_DMASource:
- TIM_DMA_CC1
- TIM_DMA_CC2
- TIM_DMA_CC3
- TIM_DMA_CC4
- TIM_DMA_UPDATE
- TIM_DMA_COM
- TIM_DMA_TRIG
param Cmd:
- DISABLE
- ENABLE
return none
void TIM_ConfigInt(TIM_Module *TIMx, uint32_t TIM_IT, FunctionalState Cmd)使能或关闭指定的 TIM 中断。
name TIM_ConfigInt
fun Enables or disables the specified TIM interrupts.
param TIMx (The input parameters must be the following values):
- ATIM1
- ATIM2
- GTIM1
- GTIM2
- GTIM3
- GTIM4
- BTIM1
- BTIM2
param TIM_IT:
- TIM_INT_CC1
- TIM_INT_CC2
- TIM_INT_CC3
- TIM_INT_CC4
- TIM_INT_CC5
- TIM_INT_CC6
- TIM_INT_CC7
- TIM_INT_CC8
- TIM_INT_CC9
- TIM_INT_C3LDCNT
- TIM_INT_UPDATE
- TIM_INT_TRIG
- TIM_INT_BREAK
- TIM_INT_COM
param Cmd :
- ENABLE
- DISABLE
return none
note TIM_INT_C3LDCNT is only for GTIM1 or GTIM2.
FlagStatus TIM_GetFlagStatus(const TIM_Module *TIMx, uint32_t TIM_FLAG)检查指定的 TIM 标志是否置位。
name TIM_GetFlagStatus
fun Checks whether the specified TIM flag is set or not.
param TIMx (The input parameters must be the following values):
- ATIM1
- ATIM2
- GTIM1
- GTIM2
- GTIM3
- GTIM4
param TIM_FLAG :
- TIM_FLAG_CC1
- TIM_FLAG_CC2
- TIM_FLAG_CC3
- TIM_FLAG_CC4
- TIM_FLAG_CC5
- TIM_FLAG_CC6
- TIM_FLAG_CC7
- TIM_FLAG_CC8
- TIM_FLAG_CC9
- TIM_FLAG_CC1OF
- TIM_FLAG_CC2OF
- TIM_FLAG_CC3OF
- TIM_FLAG_CC4OF
- TIM_FLAG_UPDATE
- TIM_FLAG_COM
- TIM_FLAG_TRIG
- TIM_FLAG_BREAK
- TIM_FLAG_SYS_BREAK
- TIM_FLAG_LBKP
- TIM_FLAG_PBKP
- TIM_FLAG_COMP
- TIM_FLAG_IOM
- TIM_FLAG_CSSF
- TIM_FLAG_C3LDCNT
return The new state of TIM_FLAG (SET or RESET).
void TIM_ClearFlag(TIM_Module *TIMx, uint32_t TIM_FLAG)清除 TIMx 的挂起标志。
name TIM_ClearFlag
fun Clears the TIMx's pending flags.
param TIMx (The input parameters must be the following values):
- ATIM1
- ATIM2
- GTIM1
- GTIM2
- GTIM3
- GTIM4
param TIM_FLAG :
- TIM_FLAG_CC1
- TIM_FLAG_CC2
- TIM_FLAG_CC3
- TIM_FLAG_CC4
- TIM_FLAG_CC5
- TIM_FLAG_CC6
- TIM_FLAG_CC7
- TIM_FLAG_CC8
- TIM_FLAG_CC9
- TIM_FLAG_CC1OF
- TIM_FLAG_CC2OF
- TIM_FLAG_CC3OF
- TIM_FLAG_CC4OF
- TIM_FLAG_UPDATE
- TIM_FLAG_COM
- TIM_FLAG_TRIG
- TIM_FLAG_BREAK
- TIM_FLAG_SYS_BREAK
- TIM_FLAG_LBKP
- TIM_FLAG_PBKP
- TIM_FLAG_COMP
- TIM_FLAG_IOM
- TIM_FLAG_CSSF
- TIM_FLAG_C3LDCNT
return none.
使用提示: 实现向 TIMx->STS 写入 ~TIM_FLAG,清除传入位对应的标志,其余位被写 1。
INTStatus TIM_GetIntStatus(const TIM_Module *TIMx, uint32_t TIM_IT)检查 TIM 中断是否发生。
name TIM_GetIntStatus
fun Checks whether the TIM interrupt has occurred or not.
param TIMx (The input parameters must be the following values):
- ATIM1
- ATIM2
- GTIM1
- GTIM2
- GTIM3
- GTIM4
param TIM_IT :
- TIM_INT_UPDATE
- TIM_INT_CC1
- TIM_INT_CC2
- TIM_INT_CC3
- TIM_INT_CC4
- TIM_INT_CC5
- TIM_INT_CC6
- TIM_INT_CC7
- TIM_INT_CC7
- TIM_INT_CC8
- TIM_INT_CC9
- TIM_INT_C3LDCNT
- TIM_INT_COM
- TIM_INT_TRIG
- TIM_INT_BREAK
return The new state of the TIM_IT(SET or RESET).
void TIM_ClrIntPendingBit(TIM_Module *TIMx, uint32_t TIM_IT)清除 TIMx 的中断挂起位。
name TIM_ClrIntPendingBit
fun Clears the TIMx's interrupt pending bits.
param TIMx (The input parameters must be the following values):
- ATIM1
- ATIM2
- GTIM1
- GTIM2
- GTIM3
- GTIM4
param TIM_IT :
- TIM_INT_UPDATE
- TIM_INT_CC1
- TIM_INT_CC2
- TIM_INT_CC3
- TIM_INT_CC4
- TIM_INT_CC5
- TIM_INT_CC6
- TIM_INT_CC7
- TIM_INT_CC8
- TIM_INT_CC9
- TIM_INT_C3LDCNT
- TIM_INT_COM
- TIM_INT_TRIG
- TIM_INT_BREAK
return none.
使用提示: 实现按 TIM_IT 逐分支清除 TIMx->STS 中的对应标志;TIM_INT_UPDATE、TIM_INT_CC1~TIM_INT_CC9、TIM_INT_C3LDCNT、TIM_INT_COM、TIM_INT_TRIG、TIM_INT_BREAK 之外的中断源不执行任何操作。
5.20.3 Demo 示例说明
本节说明 TIM 的 18 个示例,覆盖高级控制定时器 ATIM1 的六步换相、互补输出与死区、刹车、DMA 与 DMA 突发、外部触发与级联同步,以及通用定时器 GTIM 的门控计数、输入捕获与输出比较等用法。
5.20.3.1 6Steps 六步换相输出
工程目录: projects/n32g41x_EVAL/examples/TIM/6Steps/
配置系统时钟与 ATIM1 的六路互补输出引脚→配置时基与三路冻结输出通道→配置刹车、死区并使能 COM 中断与主输出→SysTick 每 100 ms 触发一次 COM 事件→COM 中断按步序改写三对通道的输出使能→在示波器上观察六步换相波形
| 项目 | 源码解读 |
|---|---|
| 功能 | 在 ATIM1 的 CH1~CH3 及互补通道 CH1N~CH3N 上输出六步换相波形,每 100 ms 由 SysTick 触发一次 COM 事件切换到下一步,步序为 AB、AC、BC、BA、CA、CB。 |
| 源码组成 | src/main.c:main、RCC_Configuration、NVIC_Configuration、GPIO_Configuration、SysTick_Configuration、SetSysClockToPLL;inc/main.h:TIMx、通道引脚与复用宏、中断号宏;src/n32g41x_it.c:SysTick_Handler 产生 COM 事件、TIMx_IRQHandler 按步序改写通道;inc/n32g41x_it.h:中断函数声明;readme.txt:功能、环境与使用说明;MDK-ARM/、EWARM/:Keil 与 IAR 工程。 |
| 关键配置 | 引脚:CH1~CH3 为 PA8、PA9、PA10,CH1N~CH3N 为 PB13、PB14、PB15,均 GPIO_MODE_AF_PP;复用:CH1、CH2 随型号(N32G412 用 GPIO_AF2、N32G415 用 GPIO_AF1),CH3、CH1N~CH3N 为 GPIO_AF2、GPIO_AF5;时基: Prescaler=0、Period=4095、ClkDiv=TIM_CLK_DIV1、RepetCnt=0;通道:三路 TIM_OCMODE_TIMING,Pulse 2047、1023、511;刹车: OSSRState、OSSIState 使能,LOCKLevel=TIM_LOCK_LEVEL_OFF;中断:COM 抢占 1、子 1,SysTick 0; 时钟:HSE+PLL,SYSCLK 与 AHB 72 MHz,ATIM1 144 MHz。 |
| 程序与数据路径 | main 先调用 SetSysClockToPLL(RCC_PLL_SRC_HSE, 72000000),再依次配置 RCC、NVIC、GPIO、SysTick,接着初始化 ATIM1 时基与三路 TIMING 模式通道,使能捕获比较预装载、COM 中断、计数器与主输出后进入空循环。SysTick_Handler 每 100 ms 调用 TIM_GenerateEvent(TIMx, TIM_EVT_SRC_COM);TIMx_IRQHandler 清除 COM 标志后按 step 值改写下三个通道,step 在 1~6 之间循环。 |
| 主要 API | TIM_InitTimBaseStruct、TIM_InitTimeBase、TIM_InitOcStruct、TIM_InitOc1~TIM_InitOc3、TIM_InitBkdtStruct、TIM_ConfigBkdt、TIM_ConfigInt、TIM_Enable、TIM_EnableCtrlPwmOutputs、TIM_GenerateEvent、TIM_SelectOcMode、TIM_EnableCapCmpCh、TIM_EnableCapCmpChN |
| 验证方法 | 编译后进入调试模式,用示波器或逻辑分析仪观察 ATIM1 六路输出; 每 100 ms 换相一次,依次为 AB、AC、BC、BA、CA、CB。 |
| 使用提示 | 默认情况下评估板 PA9、PA10 的跳线帽接 NSLINK 虚拟串口,若这两脚不用作串口须拔掉跳线帽。 支持 N32G412x8L7、N32G412xBL7、N32G415x8L7、N32G415xBL7; 开发环境为 KEIL MDK-ARM 5.34 或 IAR EWARM 8.50.1。 |
核心代码解读与移植
示例把三对互补通道先置于冻结输出,再由 COM 中断按步序改写各通道的输出使能。
数据路径: SysTick_Handler → TIM_GenerateEvent(TIMx, TIM_EVT_SRC_COM) → TIMx_IRQHandler 按 step 分支 → TIM_SelectOcMode、TIM_EnableCapCmpCh、TIM_EnableCapCmpChN 改写 CH1~CH3 的主输出与互补输出 → PA8~PA10、PB13~PB15 输出六步换相波形
1. 配置时基与三路冻结输出通道。 main 把计数器设为向上计数、周期 4095,再以 TIM_OCMODE_TIMING 配置三路通道,三路比较值依次减半。
/* 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);
TIM_OCInitStructure.OCMode = TIM_OCMODE_TIMING;
TIM_OCInitStructure.OutputState = TIM_OUTPUT_STATE_ENABLE;
TIM_OCInitStructure.OutputNState = TIM_OUTPUT_NSTATE_ENABLE;
TIM_OCInitStructure.Pulse = 2047;
TIM_OCInitStructure.OCPolarity = TIM_OC_POLARITY_HIGH;
TIM_OCInitStructure.OCNPolarity = TIM_OCN_POLARITY_HIGH;
TIM_OCInitStructure.OCIdleState = TIM_OC_IDLE_STATE_SET;
TIM_OCInitStructure.OCNIdleState = TIM_OCN_IDLE_STATE_SET;
TIM_InitOc1(TIMx, &TIM_OCInitStructure);
TIM_OCInitStructure.Pulse = 1023;
TIM_InitOc2(TIMx, &TIM_OCInitStructure);
TIM_OCInitStructure.Pulse = 511;
TIM_InitOc3(TIMx, &TIM_OCInitStructure);
移植到其它定时器或通道时,三处 Pulse 与通道号要一并核对,输出使能与互补输出使能位也要对应改写。
2. 配置刹车、死区并打开 COM 中断。 TIM_ConfigBkdt 使能输出空闲状态与自动输出,TIM_EnableCapCmpPreloadControl 打开捕获比较预装载,随后使能 COM 中断、计数器与主输出。
/* Automatic Output enable, Break, dead time and lock configuration */
TIM_InitBkdtStruct(&TIM_BDTRInitStructure);
TIM_BDTRInitStructure.OSSRState = TIM_OSSR_STATE_ENABLE;
TIM_BDTRInitStructure.OSSIState = TIM_OSSI_STATE_ENABLE;
TIM_BDTRInitStructure.LOCKLevel = TIM_LOCK_LEVEL_OFF;
TIM_BDTRInitStructure.AutomaticOutput = TIM_AUTO_OUTPUT_ENABLE;
TIM_ConfigBkdt(TIMx, &TIM_BDTRInitStructure);
TIM_EnableCapCmpPreloadControl(TIMx, ENABLE);
/* interrupt Enable */
TIM_ConfigInt(TIMx, TIM_INT_COM, ENABLE);
/* TIMx counter enable */
TIM_Enable(TIMx, ENABLE);
/* Main Output Enable */
TIM_EnableCtrlPwmOutputs(TIMx, ENABLE);
未调用 TIM_EnableCtrlPwmOutputs 时各通道不会输出波形,换相也就不出现在引脚上。
3. 用 SysTick 按固定节拍产生 COM 事件。 SysTick_Configuration 以 SystemCoreClock / 10 配置 100 ms 中断,处理函数里只产生一次 COM 事件。
void SysTick_Handler(void)
{
/* Generate TIMx COM event by software */
TIM_GenerateEvent(TIMx, TIM_EVT_SRC_COM);
}
换相节拍由这处中断周期决定,调整 SysTick_Configuration 中的分频值即可改变每一步的持续时间。
4. COM 中断按步序改写三对通道。 每次进入中断先清 COM 标志,再按 step 值选择一段分支,逐通道切换输出比较模式并开关主输出与互补输出;step 到 6 后回到 1。
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++;
}
else if (step == 6)
{
/* Next step: Step 1 Configuration */
/* Channel1 configuration */
TIM_SelectOcMode(TIMx, TIM_CH_1, TIM_OCMODE_PWM1);
TIM_EnableCapCmpCh(TIMx, TIM_CH_1, TIM_CAP_CMP_ENABLE);
TIM_EnableCapCmpChN(TIMx, TIM_CH_2, TIM_CAP_CMP_N_DISABLE);
/* Channel3 configuration */
TIM_SelectOcMode(TIMx, TIM_CH_3, TIM_OCMODE_PWM1);
TIM_EnableCapCmpCh(TIMx, TIM_CH_3, TIM_CAP_CMP_DISABLE);
TIM_EnableCapCmpChN(TIMx, TIM_CH_3, TIM_CAP_CMP_N_ENABLE);
/* Channel2 configuration */
TIM_EnableCapCmpCh(TIMx, TIM_CH_2, TIM_CAP_CMP_DISABLE);
TIM_EnableCapCmpChN(TIMx, TIM_CH_2, TIM_CAP_CMP_N_DISABLE);
step = 1;
}
step == 6 分支的注释写的是 Channel1,而第二行 TIM_EnableCapCmpChN 传入的是 TIM_CH_2,此处照代码事实陈述;改写换相表时要按实际通道号同步这些调用。
对应源码: src/main.c、src/n32g41x_it.c、inc/main.h
5.20.3.2 ATIM1_Synchro ATIM1 门控从定时器
工程目录: projects/n32g41x_EVAL/examples/TIM/ATIM1_Synchro/
配置 ATIM1、GTIM3、GTIM4 的时钟与 CH1 输出引脚→把 GTIM3、GTIM4 配为门控从定时器与 PWM1 输出→配置 ATIM1 时基与 CH1 的 PWM2 输出→选择 ATIM1 更新事件为触发输出→使能三个计数器与主输出→观察 ATIM1 门控下 GTIM3、GTIM4 的波形
| 项目 | 源码解读 |
|---|---|
| 功能 | ATIM1 作为主定时器输出 PWM 并以更新事件作为触发输出,GTIM3、GTIM4 以 ATIM1 的更新事件为门控信号在各自周期下计数并输出 PWM。 |
| 源码组成 | src/main.c:main、RCC_Configuration、GPIO_Configuration;inc/main.h:TIMx/TIMy/TIMz 与通道引脚、复用宏;src/n32g41x_it.c、inc/n32g41x_it.h:中断服务函数;readme.txt:功能、环境与使用说明;MDK-ARM/、EWARM/:Keil 与 IAR 工程。 |
| 关键配置 | 引脚:ATIM1 CH1 为 PA8、GTIM3 CH1 为 PA6、GTIM4 CH1 为 PB0,均 GPIO_MODE_AF_PP;复用:ATIM1 随型号(N32G412 用 GPIO_AF2、N32G415 用 GPIO_AF1),GTIM3、GTIM4 为 GPIO_AF12;时基:GTIM3 Period=2、GTIM4 Period=1、ATIM1 Period=255、RepetCnt=4,均 Prescaler=0;通道:从机 TIM_OCMODE_PWM1、Pulse=1,ATIM1 TIM_OCMODE_PWM2、Pulse=127;从模式:GTIM3、GTIM4 为 TIM_SLAVE_MODE_GATED、输入触发 TIM_TRIG_SEL_IN_TR0;时钟:HSI+PLL,N32G412 80 MHz、N32G415 96 MHz。 |
| 程序与数据路径 | main 配置 RCC 与 GPIO,用同一结构初始化 GTIM3、GTIM4、ATIM1 时基;再配置 GTIM3、GTIM4 的 CH1 输出、门控从模式与输入触发,以及 ATIM1 的 CH1 PWM2 输出,并调用 TIM_SelectOutputTrig(ATIM1, TIM_TRGO_SRC_UPDATE);最后使能 ATIM1、GTIM3、GTIM4 计数器与主输出。 每个 ATIM1 更新事件在 CH1 上打开一个门控窗口,GTIM3、GTIM4 在其中按各自周期计数。 |
| 主要 API | TIM_InitTimBaseStruct、TIM_InitTimeBase、TIM_InitOcStruct、TIM_InitOc1、TIM_SelectSlaveMode、TIM_SelectInputTrig、TIM_SelectOutputTrig、TIM_Enable、TIM_EnableCtrlPwmOutputs |
| 验证方法 | 编译后进入调试模式,用示波器或逻辑分析仪观察 ATIM1 CH1、GTIM3 CH1、GTIM4 CH1 的波形; 程序运行后 GTIM3 的周期为 ATIM1 的 15 倍、GTIM4 为 ATIM1 的 10 倍。 |
| 使用提示 | 两个从定时器共用同一个 TIM_TimeBaseStructure,配置 GTIM4 时只改了 Period;改动时须重新完整赋值。 支持 N32G412x8L7、N32G412xBL7、N32G415x8L7、N32G415xBL7; 开发环境为 KEIL MDK-ARM 5.34 或 IAR EWARM 8.50.1。 |
核心代码解读与移植
示例先配好两个门控从定时器,再把 ATIM1 的更新事件作为触发源送给它们。
数据路径: ATIM1 更新事件 → TIM_SelectOutputTrig(ATIM1, TIM_TRGO_SRC_UPDATE) → GTIM3、GTIM4 的 TIM_SELECT_IN_TR0 输入 → 门控窗口内按各自 Period 计数 → CH1 输出 PWM
1. GTIM3 用门控从模式跟随 ATIM1。 共享结构体先把 GTIM3 配成周期 2、PWM1 输出,再把从模式设为门控、输入触发选 ITR0。
/* GTIM3 Slave Configuration: PWM1 Mode */
TIM_InitTimBaseStruct(&TIM_TimeBaseStructure);
TIM_TimeBaseStructure.Period = 2;
TIM_TimeBaseStructure.Prescaler = 0;
TIM_TimeBaseStructure.ClkDiv = TIM_CLK_DIV1;
TIM_TimeBaseStructure.CounterMode = TIM_CNT_MODE_UP;
TIM_InitTimeBase(GTIM3, &TIM_TimeBaseStructure);
TIM_InitOcStruct(&TIM_OCInitStructure);
TIM_OCInitStructure.OCMode = TIM_OCMODE_PWM1;
TIM_OCInitStructure.OutputState = TIM_OUTPUT_STATE_ENABLE;
TIM_OCInitStructure.Pulse = 1;
TIM_InitOc1(GTIM3, &TIM_OCInitStructure);
/* Slave Mode selection: GTIM2 */
TIM_SelectSlaveMode(GTIM3, TIM_SLAVE_MODE_GATED);
TIM_SelectInputTrig(GTIM3, TIM_TRIG_SEL_IN_TR0);
最后两行注释写的是 GTIM2,而代码操作的定时器是 GTIM3,此处照代码事实陈述。
2. GTIM4 用同样的方式配置。 复制 GTIM3 的流程,仅把 Period 改为 1,并把门控从模式与 ITR0 触发施加到 GTIM4。
/* GTIM4 Slave Configuration: PWM1 Mode */
TIM_TimeBaseStructure.Period = 1;
TIM_TimeBaseStructure.Prescaler = 0;
TIM_TimeBaseStructure.ClkDiv = TIM_CLK_DIV1;
TIM_TimeBaseStructure.CounterMode = TIM_CNT_MODE_UP;
TIM_InitTimeBase(GTIM4, &TIM_TimeBaseStructure);
TIM_OCInitStructure.OCMode = TIM_OCMODE_PWM1;
TIM_OCInitStructure.OutputState = TIM_OUTPUT_STATE_ENABLE;
TIM_OCInitStructure.Pulse = 1;
TIM_InitOc1(GTIM4, &TIM_OCInitStructure);
/* Slave Mode selection: GTIM3 */
TIM_SelectSlaveMode(GTIM4, TIM_SLAVE_MODE_GATED);
TIM_SelectInputTrig(GTIM4, TIM_TRIG_SEL_IN_TR0);
这里的注释写的是 GTIM3,实际作用对象是 GTIM4;两个从定时器的周期比就由各自的 Period 决定。
3. ATIM1 做主定时器并送出更新事件。 main 把 ATIM1 配成周期 255、重复计数 4 的 PWM2 主定时器,再把更新事件选为触发输出。
/* ATIM1 Time Base configuration */
TIM_TimeBaseStructure.Prescaler = 0;
TIM_TimeBaseStructure.CounterMode = TIM_CNT_MODE_UP;
TIM_TimeBaseStructure.Period = 255;
TIM_TimeBaseStructure.ClkDiv = TIM_CLK_DIV1;
TIM_TimeBaseStructure.RepetCnt = 4;
TIM_InitTimeBase(ATIM1, &TIM_TimeBaseStructure);
/* Channel 1 Configuration in PWM mode */
TIM_OCInitStructure.OCMode = TIM_OCMODE_PWM2;
TIM_OCInitStructure.OutputState = TIM_OUTPUT_STATE_ENABLE;
TIM_OCInitStructure.OutputNState = TIM_OUTPUT_NSTATE_ENABLE;
TIM_OCInitStructure.Pulse = 127;
TIM_OCInitStructure.OCPolarity = TIM_OC_POLARITY_LOW;
TIM_OCInitStructure.OCNPolarity = TIM_OCN_POLARITY_LOW;
TIM_OCInitStructure.OCIdleState = TIM_OC_IDLE_STATE_SET;
TIM_OCInitStructure.OCNIdleState = TIM_OCN_IDLE_STATE_RESET;
TIM_InitOc1(ATIM1, &TIM_OCInitStructure);
/* Master Mode selection */
TIM_SelectOutputTrig(ATIM1, TIM_TRGO_SRC_UPDATE);
门控窗口的长度由 Period 与 RepetCnt 共同决定,换相周期变化时要同步核对这两个值与 CH1 的 Pulse。
4. 使能三个计数器和主输出。 三个定时器都要单独使能,主输出也要逐个打开,缺一则对应通道不出波。
/* ATIM1 counter enable */
TIM_Enable(ATIM1, ENABLE);
/* TIM enable counter */
TIM_Enable(GTIM3, ENABLE);
TIM_Enable(GTIM4, ENABLE);
/* Main Output Enable */
TIM_EnableCtrlPwmOutputs(ATIM1, ENABLE);
TIM_EnableCtrlPwmOutputs(GTIM3, ENABLE);
TIM_EnableCtrlPwmOutputs(GTIM4, ENABLE);
对应源码: src/main.c、inc/main.h
5.20.3.3 Cascade_Synchro 定时器级联同步
工程目录: projects/n32g41x_EVAL/examples/TIM/Cascade_Synchro/
配置 GTIM1~GTIM3 的时钟与三路 CH1 输出引脚→配置三级时基与 PWM1 输出→把 GTIM2 设为 GTIM1 的门控从定时器并转发更新事件→把 GTIM3 设为 GTIM2 的门控从定时器→使能三个计数器与 GTIM3 主输出→观察三级分频的门控波形
| 项目 | 源码解读 |
|---|---|
| 功能 | 三级定时器串联:GTIM1 的更新事件门控 GTIM2,GTIM2 的更新事件门控 GTIM3,三个定时器各在 CH1 上输出 PWM,形成逐级分频的门控波形。 |
| 源码组成 | src/main.c:main、RCC_Configuration、GPIO_Configuration;inc/main.h:TIMx(GTIM1)、TIMy(GTIM2)、TIMz(GTIM3)与通道引脚、复用宏;src/n32g41x_it.c、inc/n32g41x_it.h:中断服务函数;readme.txt:功能、环境与使用说明;MDK-ARM/、EWARM/:Keil 与 IAR 工程。 |
| 关键配置 | 引脚:GTIM1 CH1 为 PA0(GPIO_AF2)、GTIM2 CH1 为 PB4(GPIO_AF8)、GTIM3 CH1 为 PA6(GPIO_AF12),均 GPIO_MODE_AF_PP;时基:GTIM1 Period=255、GTIM2、GTIM3 Period=3,均 Prescaler=0;通道:GTIM1 TIM_OCMODE_PWM1、Pulse=64,GTIM2、GTIM3 TIM_OCMODE_PWM1、Pulse=1;从模式:GTIM2、GTIM3 为 TIM_SLAVE_MODE_GATED、输入触发 TIM_TRIG_SEL_IN_TR2;主从:GTIM1、GTIM2 使能、触发输出 TIM_TRGO_SRC_UPDATE;时钟:HSI+PLL,N32G412 80 MHz、N32G415 96 MHz。 |
| 程序与数据路径 | main 先配置 RCC 与 GPIO,用共享结构体依次初始化 GTIM1、GTIM2、GTIM3 的时基,再配置 GTIM1 的 CH1 与主模式触发输出;随后配置 GTIM2、GTIM3 的 CH1,把 GTIM2 设为门控从定时器并转发自身的更新事件,把 GTIM3 设为门控从定时器; 最后使能 GTIM2、GTIM1、GTIM3 计数器并只打开 GTIM3 的主输出。 |
| 主要 API | TIM_InitTimBaseStruct、TIM_InitTimeBase、TIM_InitOcStruct、TIM_InitOc1、TIM_SelectMasterSlaveMode、TIM_SelectOutputTrig、TIM_SelectSlaveMode、TIM_SelectInputTrig、TIM_Enable、TIM_EnableCtrlPwmOutputs |
| 验证方法 | 编译后进入调试模式,用示波器或逻辑分析仪观察 PA0、PB4、PA6 的波形; GTIM2 的频率为 GTIM1 的 1/4,GTIM3 的频率为 GTIM2 的 1/4。 |
| 使用提示 | 三级共用同一个 TIM_TimeBaseStructure,逐级只改 Period;只有 GTIM3 调用了 TIM_EnableCtrlPwmOutputs。支持 N32G412x8L7、N32G412xBL7、N32G415x8L7、N32G415xBL7; 开发环境为 KEIL MDK-ARM 5.34 或 IAR EWARM 8.50.1。 |
核心代码解读与移植
示例把三个定时器首尾相接,用前一级的更新事件门控后一级的计数。
数据路径: GTIM1 更新事件 → GTIM2 门控计数 → GTIM2 更新事件 → GTIM3 门控计数 → 三级 CH1 输出逐级分频的 PWM
1. 三级时基一次配好。 共享结构体先把 GTIM1 设为周期 255,再把 GTIM2、GTIM3 设为周期 3,得到 1/4 的逐级分频。
/* Time Base configuration */
TIM_InitTimBaseStruct(&TIM_TimeBaseStructure);
TIM_TimeBaseStructure.Prescaler = 0;
TIM_TimeBaseStructure.CounterMode = TIM_CNT_MODE_UP;
TIM_TimeBaseStructure.Period = 255;
TIM_TimeBaseStructure.ClkDiv = TIM_CLK_DIV1;
TIM_InitTimeBase(TIMx, &TIM_TimeBaseStructure);
TIM_TimeBaseStructure.Period = 3;
TIM_InitTimeBase(TIMy, &TIM_TimeBaseStructure);
TIM_TimeBaseStructure.Period = 3;
TIM_InitTimeBase(TIMz, &TIM_TimeBaseStructure);
分频比就是相邻两级 Period + 1 的比值;改动某级周期时要回头核对整条链路的比值。
2. GTIM1 做主定时器并把更新事件送上触发输出。 main 配置 GTIM1 的 CH1 输出,打开主从模式并选更新事件为 TRGO。
/* Master Configuration in PWM1 Mode */
TIM_InitOcStruct(&TIM_OCInitStructure);
TIM_OCInitStructure.OCMode = TIM_OCMODE_PWM1;
TIM_OCInitStructure.OutputState = TIM_OUTPUT_STATE_ENABLE;
TIM_OCInitStructure.Pulse = 64;
TIM_OCInitStructure.OCPolarity = TIM_OC_POLARITY_HIGH;
TIM_InitOc1(TIMx, &TIM_OCInitStructure);
/* Select the Master Slave Mode */
TIM_SelectMasterSlaveMode(TIMx, TIM_MASTER_SLAVE_MODE_ENABLE);
/* Master Mode selection */
TIM_SelectOutputTrig(TIMx, TIM_TRGO_SRC_UPDATE);
代码注释写的是 ITR1,而实际使用的输入触发选择在下一段里是 TIM_TRIG_SEL_IN_TR2。
3. 把 GTIM2 串成中间级。 GTIM2 以 ITR2 作为门控输入,同时打开主从模式并把自己的更新事件送到触发输出给 GTIM3 使用。
/* Slave Mode selection: TIMy */
TIM_SelectSlaveMode(TIMy, TIM_SLAVE_MODE_GATED);
TIM_SelectInputTrig(TIMy, TIM_TRIG_SEL_IN_TR2);
/* Select the Master Slave Mode */
TIM_SelectMasterSlaveMode(TIMy, TIM_MASTER_SLAVE_MODE_ENABLE);
/* Master Mode selection: TIMy */
TIM_SelectOutputTrig(TIMy, TIM_TRGO_SRC_UPDATE);
/* Slave Mode selection: TIMz */
TIM_SelectSlaveMode(TIMz, TIM_SLAVE_MODE_GATED);
TIM_SelectInputTrig(TIMz, TIM_TRIG_SEL_IN_TR2);
GTIM3 的输入触发同为 TIM_TRIG_SEL_IN_TR2;改动级联关系时这条选择要与前一级的 TRGO 定义一致。
4. 使能计数器与主输出。 三个计数器都要使能,只有 GTIM3 打开了主输出。
/* TIM enable counter */
TIM_Enable(TIMy, ENABLE);
TIM_Enable(TIMx, ENABLE);
TIM_Enable(TIMz, ENABLE);
TIM_EnableCtrlPwmOutputs(TIMz, ENABLE);
对应源码: src/main.c、inc/main.h
5.20.3.4 ComplementarySignals 四对互补信号与死区
工程目录: projects/n32g41x_EVAL/examples/TIM/ComplementarySignals/
配置 ATIM1 时钟与四对互补输出、刹车输入引脚→按时钟频率计算周期与四路占空比→配置四通道 PWM2 模式与互补输出→配置死区、刹车与自动输出使能→使能计数器与主输出→拉高 PA6 观察刹车的波形变化
| 项目 | 源码解读 |
|---|---|
| 功能 | ATIM1 输出四对互补 PWM,四路占空比分别为 50%、25%、12.5%、12.5%,插入死区并启用高电平有效、带自动输出使能的刹车功能,PA6 拉高时 PWM 消失。 |
| 源码组成 | src/main.c:main、RCC_Configuration、GPIO_Configuration、SetSysClockToPLL;inc/main.h:TIMx、四对输出与刹车引脚、复用宏;src/n32g41x_it.c、inc/n32g41x_it.h:中断服务函数;readme.txt:功能、环境与使用说明;MDK-ARM/、EWARM/:Keil 与 IAR 工程。 |
| 关键配置 | 引脚:CH1~CH4 为 PA8、PA9、PA10、PA11,CH1N~CH4N 为 PB13、PB14、PB15、PB2,均 GPIO_MODE_AF_PP;刹车输入:PA6 为 GPIO_MODE_INPUT、GPIO_AF2;复用:CH1、CH2 随型号(N32G412 用 GPIO_AF2、N32G415 用 GPIO_AF1),CH3、CH4 与互补通道为 GPIO_AF2、GPIO_AF5;时基: Prescaler=0、Period=(PllFreq/16000)-1;通道:四路 TIM_OCMODE_PWM2,Pulse 由占空比公式算出;刹车: DeadTime=10、BreakPolarity=TIM_BREAK_POLARITY_HIGH、AutomaticOutput 使能;时钟:HSE+PLL,SYSCLK 与 AHB 72 MHz,ATIM1 144 MHz。 |
| 程序与数据路径 | main 先调用 SetSysClockToPLL(RCC_PLL_SRC_HSE, 72000000),配置 RCC 与 GPIO,用 RCC_GetClocksFreqValue 读出 PllFreq 后算出 TimerPeriod 与四路 ChannelxPulse;接着初始化时基与四通道 PWM2 输出,配置刹车、死区与自动输出,调用 TIM_BreakInputSourceEnable 使能 IO1 刹车源,最后使能计数器与主输出。 |
| 主要 API | SetSysClockToPLL、RCC_ConfigAtim1Clk、RCC_GetClocksFreqValue、TIM_InitTimBaseStruct、TIM_InitTimeBase、TIM_InitOcStruct、TIM_InitOc1~TIM_InitOc4、TIM_InitBkdtStruct、TIM_ConfigBkdt、TIM_BreakInputSourceEnable、TIM_Enable、TIM_EnableCtrlPwmOutputs |
| 验证方法 | 编译后进入调试模式,用示波器或逻辑分析仪观察 ATIM1 的波形; PA6 为低时可见四对互补 PWM,PA6 拉高后 PWM 消失。 |
| 使用提示 | 默认情况下评估板 PA9、PA10 的跳线帽接 NSLINK 虚拟串口,若这两脚不用作串口须拔掉跳线帽。 支持 N32G412x8L7、N32G412xBL7、N32G415x8L7、N32G415xBL7; 开发环境为 KEIL MDK-ARM 5.34 或 IAR EWARM 8.50.1。 |
核心代码解读与移植
示例先按 PLL 频率算出 16 kHz 的周期与四路占空比,再配置四对互补通道、死区与刹车。
数据路径: RCC_GetClocksFreqValue 读出 PllFreq → TimerPeriod 与 ChannelxPulse → TIM_InitTimeBase、TIM_InitOc1~TIM_InitOc4 写入 AR 与 CCDATx → TIM_ConfigBkdt 配置死区与刹车 → PA8~PA11、PB13~PB15、PB2 输出四对互补波形
1. 由 PLL 频率反算周期与四路比较值。 用 PllFreq 除以目标频率得到 AR 值,再按占空比公式算出四个比较值。
RCC_GetClocksFreqValue(&RCC_ClocksStructure);
/* Compute the value to be set in AR register to generate signal frequency at 16KHz */
TimerPeriod = (RCC_ClocksStructure.PllFreq / 16000) - 1;
/* Compute CCDAT1 value to generate a duty cycle at 50% for channel 1 */
Channel1Pulse = (uint16_t)(((uint32_t)5 * (TimerPeriod - 1)) / 10);
/* Compute CCDAT2 value to generate a duty cycle at 25% for channel 2 */
Channel2Pulse = (uint16_t)(((uint32_t)25 * (TimerPeriod - 1)) / 100);
/* Compute CCDAT3 value to generate a duty cycle at 12.5% for channel 3 */
Channel3Pulse = (uint16_t)(((uint32_t)125 * (TimerPeriod - 1)) / 1000);
/* Compute CCDAT4 value to generate a duty cycle at 12.5% for channel 4 */
Channel4Pulse = (uint16_t)(((uint32_t)125 * (TimerPeriod - 1)) / 1000);
改输出频率就改除数 16000;换占空比就改各 ChannelxPulse 的分子,两个 12.5% 通道分别是通道 3 与通道 4。
2. 配四通道 PWM2 与互补输出。 时基与四通道共用同一结构体,逐通道只改 Pulse。
/* Time Base configuration */
TIM_InitTimBaseStruct(&TIM_TimeBaseStructure);
TIM_TimeBaseStructure.Prescaler = 0;
TIM_TimeBaseStructure.CounterMode = TIM_CNT_MODE_UP;
TIM_TimeBaseStructure.Period = TimerPeriod;
TIM_TimeBaseStructure.ClkDiv = TIM_CLK_DIV1;
TIM_TimeBaseStructure.RepetCnt = 0;
TIM_InitTimeBase(TIMx, &TIM_TimeBaseStructure);
/* Channel 1, 2, 3 and 4 Configuration in PWM mode */
TIM_InitOcStruct(&TIM_OCInitStructure);
TIM_OCInitStructure.OCMode = TIM_OCMODE_PWM2;
TIM_OCInitStructure.OutputState = TIM_OUTPUT_STATE_ENABLE;
TIM_OCInitStructure.OutputNState = TIM_OUTPUT_NSTATE_ENABLE;
TIM_OCInitStructure.Pulse = Channel1Pulse;
TIM_OCInitStructure.OCPolarity = TIM_OC_POLARITY_LOW;
TIM_OCInitStructure.OCNPolarity = TIM_OCN_POLARITY_LOW;
TIM_OCInitStructure.OCIdleState = TIM_OC_IDLE_STATE_SET;
TIM_OCInitStructure.OCNIdleState = TIM_OCN_IDLE_STATE_RESET;
TIM_InitOc1(TIMx, &TIM_OCInitStructure);
TIM_OCInitStructure.Pulse = Channel2Pulse;
TIM_InitOc2(TIMx, &TIM_OCInitStructure);
TIM_OCInitStructure.Pulse = Channel3Pulse;
TIM_InitOc3(TIMx, &TIM_OCInitStructure);
TIM_OCInitStructure.Pulse = Channel4Pulse;
TIM_InitOc4(TIMx, &TIM_OCInitStructure);
OutputNState 决定互补脚是否输出,改单端输出时把它置为 TIM_OUTPUT_NSTATE_DISABLE。
3. 配置死区与刹车。 TIM_ConfigBkdt 写入死区与刹车极性,TIM_BreakInputSourceEnable 再把 IO1 作为刹车源使能。
/* Automatic Output enable, Break, dead time and lock configuration */
TIM_InitBkdtStruct(&TIM_BDTRInitStructure);
TIM_BDTRInitStructure.OSSRState = TIM_OSSR_STATE_ENABLE;
TIM_BDTRInitStructure.OSSIState = TIM_OSSI_STATE_ENABLE;
TIM_BDTRInitStructure.LOCKLevel = TIM_LOCK_LEVEL_OFF;
TIM_BDTRInitStructure.DeadTime = 10;
TIM_BDTRInitStructure.Break = TIM_BREAK_IN_ENABLE;
TIM_BDTRInitStructure.BreakPolarity = TIM_BREAK_POLARITY_HIGH;
TIM_BDTRInitStructure.AutomaticOutput = TIM_AUTO_OUTPUT_ENABLE;
TIM_ConfigBkdt(TIMx, &TIM_BDTRInitStructure);
TIM_BreakInputSourceEnable(TIMx, TIM_BREAK_IOM1, TIM_BREAK_SOURCE_POLARITY_NONINVERT, ENABLE);
死区长度由 DeadTime 决定;BreakPolarity 为高电平有效,与 readme 里 PA6 拉高后 PWM 消失的现象一致。
4. 使能计数器与主输出。 刹车配置只有在主输出使能后才作用于引脚。
/* TIMx counter enable */
TIM_Enable(TIMx, ENABLE);
/* Main Output Enable */
TIM_EnableCtrlPwmOutputs(TIMx, ENABLE);
对应源码: src/main.c、inc/main.h
5.20.3.5 DMA 更新事件触发搬运
工程目录: projects/n32g41x_EVAL/examples/TIM/DMA/
配置 ATIM1 与 DMA 时钟、CH3 互补输出引脚→按系统时钟算出通道周期与三档占空比→配置 CH3 互补 PWM 输出与重复计数器→配置 DMA1_CH5 循环搬运到 CCDAT3→使能更新 DMA 请求与主输出→观察占空比每 6 个周期循环变化
| 项目 | 源码解读 |
|---|---|
| 功能 | ATIM1 的 CH3 与 CH3N 输出互补 PWM,每 6 个更新事件由 DMA1_CH5 从 SRC_Buffer[3] 循环搬运下一个比较值到 CCDAT3,占空比在 50%、37.5%、25% 之间循环变化。 |
| 源码组成 | src/main.c:main、RCC_Configuration、GPIO_Configuration、DMA_Configuration;inc/main.h:TIMx、CH3 与 CH3N 引脚、复用宏;src/n32g41x_it.c、inc/n32g41x_it.h:中断服务函数;readme.txt:功能、环境与使用说明;MDK-ARM/、EWARM/:Keil 与 IAR 工程。 |
| 关键配置 | 引脚:CH3 为 PA10(GPIO_AF2)、CH3N 为 PB15(GPIO_AF5),均 GPIO_MODE_AF_PP;时基: Prescaler=0、Period=(SystemCoreClock/80000)-1、ClkDiv=TIM_CLK_DIV1、RepetCnt=5;通道:CH3 TIM_OCMODE_PWM2、Pulse 取 SRC_Buffer[0]、极性 TIM_OC_POLARITY_LOW;DMA1_CH5:外设地址 &TIMx->CCDAT3、存储地址 SRC_Buffer、BufSize=3、方向 DMA_DIR_PERIPH_DST、DMA_MODE_CIRCULAR、DMA_PRIORITY_HIGH,请求源 DMA_REMAP_ATIM1_UP;时钟:HSI+PLL,N32G412 80 MHz、N32G415 96 MHz。 |
| 程序与数据路径 | main 依次配置 RCC、GPIO、DMA 后,用 SystemCoreClock 算出 TimerPeriod 与三个占空比写入 SRC_Buffer;初始化时基( RepetCnt=5)与 CH3 互补 PWM 输出,使能更新 DMA 请求、主输出与计数器,随后进入空循环。ATIM1 每 6 个更新事件发出一次 DMA 请求,DMA1_CH5 循环写入 CCDAT3,CH3、CH3N 占空比随之改变。 |
| 主要 API | TIM_InitTimBaseStruct、TIM_InitTimeBase、TIM_InitOcStruct、TIM_InitOc3、TIM_EnableDma、TIM_Enable、TIM_EnableCtrlPwmOutputs、DMA_DeInit、DMA_StructInit、DMA_Init、DMA_RequestRemap、DMA_EnableChannel |
| 验证方法 | 编译后进入调试模式,用示波器或逻辑分析仪观察 ATIM1 CH3、CH3N 的波形; 每 6 个周期占空比改变一次,依次为 50%、37.5%、25% 并循环。 |
| 使用提示 | 默认情况下评估板 PA9、PA10 的跳线帽接 NSLINK 虚拟串口,若这两脚不用作串口须拔掉跳线帽。 支持 N32G412x8L7、N32G412xBL7、N32G415x8L7、N32G415xBL7; 开发环境为 KEIL MDK-ARM 5.34 或 IAR EWARM 8.50.1。 |
核心代码解读与移植
示例让 ATIM1 的更新事件触发 DMA,把三个占空比依次写入 CCDAT3。
数据路径: SystemCoreClock → TimerPeriod 与 SRC_Buffer[3] → ATIM1 更新事件(每 6 次)→ TIM_DMA_UPDATE 请求 → DMA1_CH5 循环写入 CCDAT3 → CH3、CH3N 占空比改变
1. 先算出周期与三档占空比。 用 SystemCoreClock 除以 80 kHz 得到 AR 值,再按 50%、37.5%、25% 三个比例算出三个比较值。
/* Compute the value to be set in AR register to generate signal frequency at 80KHz */
TimerPeriod = (SystemCoreClock / 80000) - 1;
/* Compute CCDAT3 value to generate a duty cycle at 50% */
SRC_Buffer[0] = (uint16_t)(((uint32_t)5 * (TimerPeriod - 1)) / 10);
/* Compute CCDAT3 value to generate a duty cycle at 37.5% */
SRC_Buffer[1] = (uint16_t)(((uint32_t)375 * (TimerPeriod - 1)) / 1000);
/* Compute CCDAT3 value to generate a duty cycle at 25% */
SRC_Buffer[2] = (uint16_t)(((uint32_t)25 * (TimerPeriod - 1)) / 100);
改输出频率就改除数 80000;改占空比档位就改 SRC_Buffer 的填充比例,数组长度要与 BufSize 一致。
2. 时基的重复计数器决定搬运行情。 RepetCnt=5 使更新 DMA 请求每 6 个计数周期发出一次。
/* Time Base configuration */
TIM_InitTimBaseStruct(&TIM_TimeBaseStructure);
TIM_TimeBaseStructure.Prescaler = 0;
TIM_TimeBaseStructure.CounterMode = TIM_CNT_MODE_UP;
TIM_TimeBaseStructure.Period = TimerPeriod;
TIM_TimeBaseStructure.ClkDiv = TIM_CLK_DIV1;
TIM_TimeBaseStructure.RepetCnt = 5;
TIM_InitTimeBase(TIMx, &TIM_TimeBaseStructure);
占空比变化间隔由 RepetCnt + 1 决定,改这个值会同时改变变化频率。
3. 配 CH3 互补输出并打开更新 DMA 请求。 四通道共用结构体,这里只配置 CH3,比较值取 SRC_Buffer[0]。
/* Channel 3 Configuration in PWM mode */
TIM_InitOcStruct(&TIM_OCInitStructure);
TIM_OCInitStructure.OCMode = TIM_OCMODE_PWM2;
TIM_OCInitStructure.OutputState = TIM_OUTPUT_STATE_ENABLE;
TIM_OCInitStructure.OutputNState = TIM_OUTPUT_NSTATE_ENABLE;
TIM_OCInitStructure.Pulse = SRC_Buffer[0];
TIM_OCInitStructure.OCPolarity = TIM_OC_POLARITY_LOW;
TIM_OCInitStructure.OCNPolarity = TIM_OCN_POLARITY_LOW;
TIM_OCInitStructure.OCIdleState = TIM_OC_IDLE_STATE_SET;
TIM_OCInitStructure.OCNIdleState = TIM_OCN_IDLE_STATE_RESET;
TIM_InitOc3(TIMx, &TIM_OCInitStructure);
/* TIMx Update DMA Request enable */
TIM_EnableDma(TIMx, TIM_DMA_UPDATE, ENABLE);
改用其它通道时,要同步改 TIM_InitOc3 的通道号、DMA_Configuration 里的 CCDAT3 外设地址和 DMA_RequestRemap 的请求源。
4. 配 DMA1_CH5 循环搬运到 CCDAT3。 DMA 以外设地址自增关闭、存储器自增开启的方式,把 3 个字的缓冲区循环写入同一寄存器。
/* DMA Channel5 Config */
DMA_DeInit(DMA_CH5);
DMA_StructInit(&DMA_InitStructure);
DMA_InitStructure.PeriphAddr = (uint32_t)&TIMx->CCDAT3;
DMA_InitStructure.MemAddr = (uint32_t)SRC_Buffer;
DMA_InitStructure.Direction = DMA_DIR_PERIPH_DST;
DMA_InitStructure.BufSize = 3;
DMA_InitStructure.PeriphInc = DMA_PERIPH_INC_DISABLE;
DMA_InitStructure.DMA_MemoryInc = DMA_MEM_INC_ENABLE;
DMA_InitStructure.PeriphDataSize = DMA_PERIPH_DATA_SIZE_WORD;
DMA_InitStructure.MemDataSize = DMA_MemoryDataSize_Word;
DMA_InitStructure.CircularMode = DMA_MODE_CIRCULAR;
DMA_InitStructure.Priority = DMA_PRIORITY_HIGH;
DMA_InitStructure.Mem2Mem = DMA_M2M_DISABLE;
DMA_Init(DMA_CH5, &DMA_InitStructure);
DMA_RequestRemap(DMA_REMAP_ATIM1_UP, DMA, DMA_CH5, ENABLE);
/* DMA Channel5 enable */
DMA_EnableChannel(DMA_CH5, ENABLE);
5. 使能计数器与主输出。 DMA 请求只在计数器运行时产生,主输出决定 CH3、CH3N 是否出波。
/* Main Output Enable */
TIM_EnableCtrlPwmOutputs(TIMx, ENABLE);
/* TIMx counter enable */
TIM_Enable(TIMx, ENABLE);
对应源码: src/main.c、inc/main.h
5.20.3.6 DMABurst DMA 突发传输
工程目录: projects/n32g41x_EVAL/examples/TIM/DMABurst/
配置 ATIM1 与 DMA 时钟、CH1 输出引脚→配置 CH1 PWM 输出与 DADDR 突发长度→配置 DMA1_CH5 非循环搬运 8 个字到 DADDR→使能计数器、主输出与 DMA 通道并等待传输结束→观察按新周期与占空比输出的波形→调试中改写 DmaAgain 触发再次搬运
| 项目 | 源码解读 |
|---|---|
| 功能 | ATIM1 的 CH1 输出 PWM,一个计数周期后由 DMA1_CH5 以突发方式把 8 个字从 SRC_Buffer[8] 写入以 CCDAT1 为基址的连续寄存器,同时改变周期、占空比与重复计数器。 |
| 源码组成 | src/main.c:main、RCC_Configuration、GPIO_Configuration、DMA_Configuration;inc/main.h:TIMx、CH1 引脚与复用宏;src/n32g41x_it.c、inc/n32g41x_it.h:中断服务函数;readme.txt:功能、环境与使用说明;MDK-ARM/、EWARM/:Keil 与 IAR 工程。 |
| 关键配置 | 引脚:CH1 为 PA8,GPIO_MODE_AF_PP,复用随型号(N32G412 用 GPIO_AF2、N32G415 用 GPIO_AF1);时基: Period=0xFFFF;通道:CH1 TIM_OCMODE_PWM1、OutputState=TIM_OUTPUT_STATE_ENABLE、Pulse=0x8FFF;突发: TIM_ConfigDma(TIMx, TIM_DMABASE_CAPCMPDAT1, TIM_DMABURST_LENGTH_8TRANSFERS),源数组 SRC_Buffer[8] 首尾 0x8FF/0xFFF;DMA1_CH5:外设地址 &TIMx->DADDR、BufSize=8、DMA_MODE_NORMAL、DMA_PRIORITY_HIGH;时钟:HSI+PLL,N32G412 80 MHz、N32G415 96 MHz。 |
| 程序与数据路径 | main 依次配置 RCC、GPIO、DMA 后,初始化时基与 CH1 PWM 输出,调用 TIM_ConfigDma 设置突发基址与长度并使能更新 DMA 请求,再使能计数器、主输出与 DMA 通道,用 DMA_GetFlagStatus(DMA_FLAG_TC5, DMA) 等待传输结束后清除标志;主循环里 DmaAgain 置位时重新配置突发与 DMA 并再次等待传输完成。 |
| 主要 API | TIM_InitTimBaseStruct、TIM_InitTimeBase、TIM_InitOcStruct、TIM_InitOc1、TIM_ConfigDma、TIM_EnableDma、TIM_Enable、TIM_EnableCtrlPwmOutputs、DMA_DeInit、DMA_StructInit、DMA_Init、DMA_RequestRemap、DMA_EnableChannel、DMA_GetFlagStatus、DMA_ClearFlag |
| 验证方法 | 编译后进入调试模式,用示波器或逻辑分析仪观察 ATIM1 CH1 的波形; 第一个周期后波形变为 DMA 搬运的新周期与新占空比。 在调试状态下把 DmaAgain 置 1,可再次搬运 8 个字到 TIM1 DMA 寄存器。 |
| 使用提示 | 默认情况下评估板 PA9、PA10 的跳线帽接 NSLINK 虚拟串口,若这两脚不用作串口须拔掉跳线帽。 支持 N32G412x8L7、N32G412xBL7、N32G415x8L7、N32G415xBL7; 开发环境为 KEIL MDK-ARM 5.34 或 IAR EWARM 8.50.1。 |
核心代码解读与移植
示例用 DMA 突发把一整组寄存器参数一次写入,从而在一个周期后同时改变周期与占空比。
数据路径: SRC_Buffer[8] → ATIM1 更新事件 → TIM_DMA_UPDATE 请求 → DMA1_CH5 以 DADDR 为基址突发写入 8 个字 → CCDAT1~CCDAT6、PSC、AR 更新 → CH1 输出新周期与新占空比
1. 配置时基与 CH1 初值。 main 把周期设为 0xFFFF,CH1 以 Pulse=0x8FFF 输出 PWM,等待 DMA 改写。
TIM_InitTimBaseStruct(&TIM_TimeBaseStructure);
TIM_TimeBaseStructure.Period = 0xFFFF;
TIM_TimeBaseStructure.Prescaler = 0;
TIM_TimeBaseStructure.ClkDiv = TIM_CLK_DIV1;
TIM_TimeBaseStructure.CounterMode = TIM_CNT_MODE_UP;
TIM_InitTimeBase(TIMx, &TIM_TimeBaseStructure);
/* TIM Configuration in PWM Mode */
TIM_InitOcStruct(&TIM_OCInitStructure);
TIM_OCInitStructure.OCMode = TIM_OCMODE_PWM1;
TIM_OCInitStructure.OutputState = TIM_OUTPUT_STATE_ENABLE;
TIM_OCInitStructure.Pulse = 0x8FFF;
TIM_InitOc1(TIMx, &TIM_OCInitStructure);
SRC_Buffer 的第 1 个与第 8 个元素分别写到周期的起止相关寄存器,其余元素保持 0;改参数时按突发写入顺序维护这 8 个字。
2. 打开突发传输与更新 DMA 请求并等待。 TIM_ConfigDma 指定以 CCDAT1 为基址突发 8 次,随后使能各外设并等待本次传输完成。
/* TIMx DADDR Base register and DMA Burst Length Config */
TIM_ConfigDma(TIMx, TIM_DMABASE_CAPCMPDAT1, TIM_DMABURST_LENGTH_8TRANSFERS);
/* TIMx DMA Update enable */
TIM_EnableDma(TIMx, TIM_DMA_UPDATE, ENABLE);
/* TIMx enable */
TIM_Enable(TIMx, ENABLE);
/* TIMx PWM Outputs Enable */
TIM_EnableCtrlPwmOutputs(TIMx, ENABLE);
/* DMA Channel5 enable */
DMA_EnableChannel(DMA_CH5, ENABLE);
/* Wait until DMA Channel5 end of Transfer */
while (!DMA_GetFlagStatus(DMA_FLAG_TC5, DMA))
{
}
突发基址与长度要和 DMA_Configuration 里的外设地址、BufSize 保持一致,否则写入的寄存器数量会与预期不符。
3. DMA1_CH5 非循环搬运到 DADDR。 DMA 以外设地址不自增、存储器自增的方式,把 8 个字依次写入突发基址寄存器。
/* DMA Channel5 Config */
DMA_DeInit(DMA_CH5);
DMA_StructInit(&DMA_InitStructure);
DMA_InitStructure.PeriphAddr = (uint32_t)&TIMx->DADDR;
DMA_InitStructure.MemAddr = (uint32_t)SRC_Buffer;
DMA_InitStructure.Direction = DMA_DIR_PERIPH_DST;
DMA_InitStructure.BufSize = 8;
DMA_InitStructure.PeriphInc = DMA_PERIPH_INC_DISABLE;
DMA_InitStructure.DMA_MemoryInc = DMA_MEM_INC_ENABLE;
DMA_InitStructure.PeriphDataSize = DMA_PERIPH_DATA_SIZE_WORD;
DMA_InitStructure.MemDataSize = DMA_MemoryDataSize_Word;
DMA_InitStructure.CircularMode = DMA_MODE_NORMAL;
DMA_InitStructure.Priority = DMA_PRIORITY_HIGH;
DMA_InitStructure.Mem2Mem = DMA_M2M_DISABLE;
DMA_Init(DMA_CH5, &DMA_InitStructure);
DMA_RequestRemap(DMA_REMAP_ATIM1_UP, DMA, DMA_CH5, ENABLE);
这里用的是 DMA_MODE_NORMAL,搬完即停;再次搬运要靠 DmaAgain 重新配置并重启通道。
4. 用 DmaAgain 触发再次搬运。 主循环检测到 DmaAgain 非零时清零标志,重新配置突发与 DMA,使能通道并再次等待传输完成。
if (DmaAgain)
{
DmaAgain = 0;
TIM_ConfigDma(TIMx, TIM_DMABASE_CAPCMPDAT1, TIM_DMABURST_LENGTH_8TRANSFERS);
TIM_EnableDma(TIMx, TIM_DMA_UPDATE, ENABLE);
DMA_Configuration();
/* DMA Channel5 enable */
DMA_EnableChannel(DMA_CH5, ENABLE);
对应源码: src/main.c、inc/main.h
5.20.3.7 ExtTrigger_Synchro 外部触发同步
工程目录: projects/n32g41x_EVAL/examples/TIM/ExtTrigger_Synchro/
配置 ATIM1、GTIM2、GTIM3 的时钟与输出、输入引脚→配置 ATIM1 CH1 翻转输出与 CH2 输入捕获→把 ATIM1 设为 TI2 门控从模式并把使能事件作为触发输出→把 GTIM2、GTIM3 依次配为门控从定时器→使能三个计数器与主输出→给 PA9 加高低电平观察定时器启停
| 项目 | 源码解读 |
|---|---|
| 功能 | ATIM1 的 CH2 作为外部触发输入,用 TI2 门控 ATIM1 自身,并依次门控 GTIM2 与 GTIM3,三个定时器在 CH1 上输出翻转波形,外部触发为高电平期间计数、低电平期间停止。 |
| 源码组成 | src/main.c:main、RCC_Configuration、GPIO_Configuration;inc/main.h:TIMx(ATIM1)、TIMy(GTIM2)、TIMz(GTIM3)与通道引脚、复用宏;src/n32g41x_it.c、inc/n32g41x_it.h:中断服务函数;readme.txt:功能、环境与使用说明;MDK-ARM/、EWARM/:Keil 与 IAR 工程。 |
| 关键配置 | 引脚:ATIM1 CH1 为 PA8、CH2 为 PA9,GTIM2 CH1 为 PB4(GPIO_AF8),GTIM3 CH1 为 PA6(GPIO_AF12);ATIM1 CH1 为 GPIO_MODE_AF_PP、CH2 为 GPIO_MODE_INPUT;时基:三级均 Period=73;通道:三路 TIM_OCMODE_TOGGLE,ATIM1 CH1 Pulse=64;捕获:CH2 上升沿直接捕获; 触发:ATIM1 用 TIM_TRIG_SEL_TI2FP2 门控,GTIM2、GTIM3 用 TIM_TRIG_SEL_IN_TR0、TIM_TRIG_SEL_IN_TR2,均 TIM_SLAVE_MODE_GATED;触发输出:ATIM1、GTIM2 为 TIM_TRGO_SRC_ENABLE;时钟:HSI+PLL,N32G412 80 MHz、N32G415 96 MHz。 |
| 程序与数据路径 | main 先配置 RCC 与 GPIO,用共享结构体把 ATIM1、GTIM2、GTIM3 的时基都设为周期 73、分频 3;随后配置 ATIM1 的 CH1 翻转输出、CH2 输入捕获、TI2 门控从模式与使能事件触发输出; 再把 GTIM2 设为 ITR0 门控从定时器并转发使能事件、把 GTIM3 设为 ITR2 门控从定时器; 最后使能 ATIM1、GTIM3 主输出与三个计数器。 |
| 主要 API | TIM_InitTimBaseStruct、TIM_InitTimeBase、TIM_InitOcStruct、TIM_InitOc1、TIM_InitIcStruct、TIM_ICInit、TIM_SelectInputTrig、TIM_SelectSlaveMode、TIM_SelectMasterSlaveMode、TIM_SelectOutputTrig、TIM_Enable、TIM_EnableCtrlPwmOutputs |
| 验证方法 | 编译后进入调试模式,用示波器或逻辑分析仪观察 ATIM1 CH1、GTIM2 CH1、GTIM3 CH1 的波形; ATIM1 CH2 为高电平时定时器计数,为低电平时停止。 |
| 使用提示 | 默认情况下评估板 PA9、PA10 的跳线帽接 NSLINK 虚拟串口,若 PA9 不用作串口输入须拔掉跳线帽。 支持 N32G412x8L7、N32G412xBL7、N32G415x8L7、N32G415xBL7; 开发环境为 KEIL MDK-ARM 5.34 或 IAR EWARM 8.50.1。 |
核心代码解读与移植
示例把 ATIM1 的 CH2 引脚当作外部触发,用它的电平同时控制三个定时器的计数启停。
数据路径: PA9(TI2)电平 → TIM_SelectInputTrig(TIMx, TIM_TRIG_SEL_TI2FP2) 门控 ATIM1 → ATIM1 使能事件 → GTIM2 门控计数 → GTIM2 使能事件 → GTIM3 门控计数 → 三路 CH1 输出翻转波形
1. 三级时基与翻转输出。 共享结构体把三个定时器都设为周期 73、分频 3,ATIM1 的 CH1 以翻转模式输出。
/* Time base configuration */
TIM_InitTimBaseStruct(&TIM_TimeBaseStructure);
TIM_TimeBaseStructure.Period = 73;
TIM_TimeBaseStructure.Prescaler = 3;
TIM_TimeBaseStructure.ClkDiv = TIM_CLK_DIV1;
TIM_TimeBaseStructure.CounterMode = TIM_CNT_MODE_UP;
TIM_InitTimeBase(TIMx, &TIM_TimeBaseStructure);
TIM_TimeBaseStructure.Period = 73;
TIM_InitTimeBase(TIMy, &TIM_TimeBaseStructure);
TIM_TimeBaseStructure.Period = 73;
TIM_InitTimeBase(TIMz, &TIM_TimeBaseStructure);
/* Master Configuration in Toggle Mode */
TIM_InitOcStruct(&TIM_OCInitStructure);
TIM_OCInitStructure.OCMode = TIM_OCMODE_TOGGLE;
TIM_OCInitStructure.OutputState = TIM_OUTPUT_STATE_ENABLE;
TIM_OCInitStructure.Pulse = 64;
TIM_OCInitStructure.OCPolarity = TIM_OC_POLARITY_HIGH;
TIM_InitOc1(TIMx, &TIM_OCInitStructure);
翻转门槛落在比较值上,改 Period 与 Pulse 会同时改变输出频率与占空比,三个定时器共用同一组起点值。
2. 配 CH2 输入捕获并把 TI2 当作门控触发。 CH2 采集上升沿,输入触发选择 TI2FP2,从模式设为门控,并把使能事件送上触发输出。
/* TIMx Input Capture Configuration */
TIM_InitIcStruct(&TIM_ICInitStructure);
TIM_ICInitStructure.Channel = TIM_CH_2;
TIM_ICInitStructure.ICPolarity = TIM_IC_POLARITY_RISING;
TIM_ICInitStructure.ICSelection = TIM_IC_SELECTION_DIRECTTI;
TIM_ICInitStructure.ICPrescaler = TIM_IC_PSC_DIV1;
TIM_ICInitStructure.ICFilter = 0;
TIM_ICInit(TIMx, &TIM_ICInitStructure);
/* TIMx Input trigger configuration: External Trigger connected to TI2 */
TIM_SelectInputTrig(TIMx, TIM_TRIG_SEL_TI2FP2);
TIM_SelectSlaveMode(TIMx, TIM_SLAVE_MODE_GATED);
/* Select the Master Slave Mode */
TIM_SelectMasterSlaveMode(TIMx, TIM_MASTER_SLAVE_MODE_ENABLE);
/* Master Mode selection: TIMx */
TIM_SelectOutputTrig(TIMx, TIM_TRGO_SRC_ENABLE);
改触发极性就改 ICPolarity;换外部触发引脚时输入触发选择要一并改到对应的 TI 映射。
3. GTIM2 与 GTIM3 逐级门控。 GTIM2 以 ITR0 门控并转发使能事件,GTIM3 以 ITR2 门控,三级形成外部触发到两级从定时器的链路。
/* Slave Mode selection: TIMy */
TIM_SelectInputTrig(TIMy, TIM_TRIG_SEL_IN_TR0);
TIM_SelectSlaveMode(TIMy, TIM_SLAVE_MODE_GATED);
/* Select the Master Slave Mode */
TIM_SelectMasterSlaveMode(TIMy, TIM_MASTER_SLAVE_MODE_ENABLE);
/* Master Mode selection: TIMy */
TIM_SelectOutputTrig(TIMy, TIM_TRGO_SRC_ENABLE);
/* Slave Mode selection: TIMz */
TIM_SelectInputTrig(TIMz, TIM_TRIG_SEL_IN_TR2);
TIM_SelectSlaveMode(TIMz, TIM_SLAVE_MODE_GATED);
两个从定时器的输入触发要与前一级的 ITR 编号匹配,改动级联关系时这条链路要整体核对。
4. 使能主输出与计数器。 只有 ATIM1 与 GTIM3 开放了主输出,三个计数器都要单独使能。
/* TIMx Main Output Enable */
TIM_EnableCtrlPwmOutputs(TIMx, ENABLE);
/* TIMz Main Output Enable */
TIM_EnableCtrlPwmOutputs(TIMz, ENABLE);
/* TIM enable counter */
TIM_Enable(TIMx, ENABLE);
TIM_Enable(TIMy, ENABLE);
TIM_Enable(TIMz, ENABLE);
对应源码: src/main.c、inc/main.h
5.20.3.8 InputCapture 输入捕获测频
工程目录: projects/n32g41x_EVAL/examples/TIM/InputCapture/
配置 GTIM1 时钟与 CH2 输入、PA3 输出引脚→配置 CH2 上升沿直接捕获并开 CC2 中断→使能计数器后主循环等待测试脉冲→由 PA3 产生两个上升沿→CC2 中断记录两次捕获值并算出频率→在观察窗口读取测得的频率
| 项目 | 源码解读 |
|---|---|
| 功能 | GTIM1 的 CH2 以上升沿输入捕获方式测量外部信号频率,示例用 PA3 产生测试脉冲并连线到 PA1,在两次捕获值之差的倒数上算出 TIMxFreq。 |
| 源码组成 | src/main.c:main、RCC_Configuration、GPIO_Configuration、NVIC_Configuration、GenTwoRisingEdge;inc/main.h:TIMx(GTIM1)、CH2 引脚与复用宏、中断号宏;src/n32g41x_it.c:TIMx_IRQHandler 完成两次捕获并计算频率;inc/n32g41x_it.h:中断函数声明;readme.txt:功能、环境与使用说明;MDK-ARM/、EWARM/:Keil 与 IAR 工程。 |
| 关键配置 | GTIM1 CH2 为 PA1(GPIO_AF2),PA3 为 GPIO_MODE_OUTPUT_PP 的测试脉冲输出。输入捕获 Channel=TIM_CH_2、ICPolarity=TIM_IC_POLARITY_RISING、ICSelection=TIM_IC_SELECTION_DIRECTTI、ICPrescaler=TIM_IC_PSC_DIV1、ICFilter=0x0;中断由 TIM_ConfigInt(TIMx, TIM_INT_CC2, ENABLE) 打开,TIMx_IRQHandler 优先级抢断 1、子优先级 0。GenTwoRisingEdge 由变量 gOnePulsEn 触发,用 GPIO_SetBits、GPIO_ResetBits 在 PA3 上产生两个上升沿。时钟 HSI+PLL:N32G412 为 80 MHz,N32G415 为 96 MHz。 |
| 程序与数据路径 | main 先配置 RCC、GPIO、NVIC,再初始化 CH2 输入捕获、清零更新与 CC2 标志并打开 CC2 中断,使能计数器后进入主循环反复调用 GenTwoRisingEdge。调试中把 gOnePulsEn 置 1 后,PA3 产生两个上升沿,TIMx_IRQHandler 在两次 CC2 中断里分别读取 TIM_GetCap2(TIMx) 存到 IC3ReadValue1、IC3ReadValue2,按差值计算 Capture 并得到 TIMxFreq = SystemCoreClock / cap。 |
| 主要 API | TIM_InitIcStruct、TIM_ICInit、TIM_ClrIntPendingBit、TIM_ConfigInt、TIM_Enable、TIM_GetIntStatus、TIM_GetCap2、GPIO_InitStruct、GPIO_InitPeripheral、GPIO_SetBits、GPIO_ResetBits |
| 验证方法 | 编译后进入调试模式,连接 PA3 与 PA1,把 TIMxFreq 加入 watch 窗口;在调试窗口把 gOnePulsEn 置 1,PA3 产生电平翻转,随后读取 TIMxFreq 的频率值。 |
| 使用提示 | 测试时须把 PA3 与 PA1 用跳线连接,否则捕获不到脉冲。 默认情况下评估板 PA9、PA10 的跳线帽接 NSLINK 虚拟串口,若不用作串口须拔掉跳线帽。 支持 N32G412x8L7、N32G412xBL7、N32G415x8L7、N32G415xBL7; 开发环境为 KEIL MDK-ARM 5.34 或 IAR EWARM 8.50.1。 |
核心代码解读与移植
示例用两次上升沿捕获之间的计数差反推输入频率,测频脉冲由同一芯片的 IO 产生。
数据路径: gOnePulsEn → GenTwoRisingEdge → PA3 产生两个上升沿 → TIM_ICInit 配置的 CH2 捕获 → TIMx_IRQHandler 读取 TIM_GetCap2 → Capture 与 TIMxFreq
1. 配 CH2 上升沿捕获并开 CC2 中断。 设捕获通道、极性、选择与滤波后先清标志再打开 CC2 中断,最后使能计数器。
TIM_InitIcStruct(&TIM_ICInitStructure);
TIM_ICInitStructure.Channel = TIM_CH_2;
TIM_ICInitStructure.ICPolarity = TIM_IC_POLARITY_RISING;
TIM_ICInitStructure.ICSelection = TIM_IC_SELECTION_DIRECTTI;
TIM_ICInitStructure.ICPrescaler = TIM_IC_PSC_DIV1;
TIM_ICInitStructure.ICFilter = 0x0;
TIM_ICInit(TIMx, &TIM_ICInitStructure);
TIM_ClrIntPendingBit(TIMx, TIM_INT_UPDATE);
TIM_ClrIntPendingBit(TIMx, TIM_INT_CC2);
/* Enable the CC2 Interrupt Request */
TIM_ConfigInt(TIMx, TIM_INT_CC2, ENABLE);
/* TIM enable counter */
TIM_Enable(TIMx, ENABLE);
改捕获极性或预分频会直接改变 TIMxFreq 的计算前提,ICFilter 不为 0 时还会引入固定的滤波延迟。
2. 由 PA3 产生测试脉冲。 GenTwoRisingEdge 在 gOnePulsEn 非零时清零标志,先在 PA3 上拉高再拉低,重复两次形成两个上升沿。
if (gOnePulsEn)
{
gOnePulsEn = 0;
GPIO_SetBits(GPIOA, GPIO_PIN_3);
{
volatile uint32_t i = 0;
while (i++ < 10)
;
}
GPIO_ResetBits(GPIOA, GPIO_PIN_3);
两个上升沿之间的软件延时决定了测得的频率量级,改用外部信号源时可去掉这段脉冲产生代码。
3. 中断里记录第一次捕获值。 CC2 中断先清标志,CaptureNumber 为 0 时保存第一个捕获值并置位状态。
if (TIM_GetIntStatus(TIMx, TIM_INT_CC2) == SET)
{
TIMxEnterIrqCnt++;
/* Clear TIMx Capture compare interrupt pending bit */
TIM_ClrIntPendingBit(TIMx, TIM_INT_CC2);
if (CaptureNumber == 0)
{
/* Get the Input Capture value */
IC3ReadValue1 = TIM_GetCap2(TIMx);
CaptureNumber = 1;
}
4. 第二次捕获后算出频率。 第二次进中断时读取 IC3ReadValue2,按两个捕获值的大小关系求差值,再以系统时钟除以差值得到频率。
/* Capture computation */
if (val2 > val1)
{
cap = (val2 - val1);
}
else
{
cap = ((0xFFFF - val1) + val2);
}
Capture = cap;
/* Frequency computation */
TIMxFreq = SystemCoreClock / cap;
CaptureNumber = 0;
TIMxFreq 取的是系统时钟与计数差的商,换主频或改 Prescaler 后这个结果要重新标定。
对应源码: src/main.c、src/n32g41x_it.c、inc/main.h
5.20.3.9 OCActive 输出比较置有效电平
工程目录: projects/n32g41x_EVAL/examples/TIM/OCActive/
配置 GTIM1 时钟与四路 CH1~CH4 输出引脚→按系统时钟算出 2 kHz 的计数时钟分频→配置四通道输出比较 Active 模式与比较值→关闭各路预装载并打开 AR 预装载→使能计数器→观察四路依次输出有效电平
| 项目 | 源码解读 |
|---|---|
| 功能 | GTIM1 的 CH1~CH4 配置为输出比较 Active 模式,计数到达各自 CCDATx 后对应通道输出有效电平,四路比较值依次为 1000、500、250、125,输出依次跳变。 |
| 源码组成 | src/main.c:main、RCC_Configuration、GPIO_Configuration;inc/main.h:TIMx(GTIM1)、CH1~CH4 引脚与复用宏;src/n32g41x_it.c、inc/n32g41x_it.h:中断服务函数;readme.txt:功能、环境与使用说明;MDK-ARM/、EWARM/:Keil 与 IAR 工程。 |
| 关键配置 | 引脚:CH1~CH4 为 PA0、PA1、PA2、PA3,均 GPIO_MODE_AF_PP、GPIO_AF2;时基: Period=65535、Prescaler=(SystemCoreClock/2000)-1、ClkDiv=TIM_CLK_DIV1、CounterMode=TIM_CNT_MODE_UP;通道:四路 OCMode=TIM_OCMODE_ACTIVE、OutputState=TIM_OUTPUT_STATE_ENABLE、极性 TIM_OC_POLARITY_HIGH,Pulse 依次为 1000、500、250、125;预装载:四通道关闭( TIM_OC_PRE_LOAD_DISABLE)、AR 预装载使能;时钟:HSI+PLL,N32G412 80 MHz、N32G415 96 MHz。 |
| 程序与数据路径 | main 配置 RCC 与 GPIO 后算出 PrescalerValue,初始化时基并配置 CH1 的输出比较 Active 模式与预装载,随后对 CH2、CH3、CH4 重复同样的配置并分别写入各自 CCRx_Val,再打开 AR 预装载,最后使能计数器进入空循环。计数从 0 递增到 125、250、500、1000 时,CH4、CH3、CH2、CH1 依次输出有效电平。 |
| 主要 API | TIM_InitTimBaseStruct、TIM_InitTimeBase、TIM_InitOcStruct、TIM_InitOc1、TIM_InitOc2、TIM_InitOc3、TIM_InitOc4、TIM_ConfigOc1Preload、TIM_ConfigOc2Preload、TIM_ConfigOc3Preload、TIM_ConfigOc4Preload、TIM_ConfigArPreload、TIM_Enable |
| 验证方法 | 编译后进入调试模式,用示波器或逻辑分析仪观察 GTIM1 CH1~CH4 的波形; 计数到达 CC1、CC2、CC3、CC4 后对应通道输出变为有效电平。 |
| 使用提示 | 默认情况下评估板 PA9、PA10 的跳线帽接 NSLINK 虚拟串口,若不用作串口须拔掉跳线帽。 支持 N32G412x8L7、N32G412xBL7、N32G415x8L7、N32G415xBL7; 开发环境为 KEIL MDK-ARM 5.34 或 IAR EWARM 8.50.1。 |
核心代码解读与移植
示例把计数时钟降到 2 kHz,用四路输出比较在计数到达不同阈值时依次输出有效电平。
数据路径: SystemCoreClock → PrescalerValue 与 TIM_InitTimeBase → TIM_InitOc1~TIM_InitOc4 写入 CCR1_Val~CCR4_Val → 计数到达各阈值 → CH1~CH4 输出有效电平
1. 算出 2 kHz 计数时钟并配时基。 用系统时钟除以 2000 得到分频值,计数器从 0 计到 65535。
/* Compute the prescaler value */
PrescalerValue = (uint16_t)(SystemCoreClock / 2000) - 1;
/* Time base configuration */
TIM_InitTimBaseStruct(&TIM_TimeBaseStructure);
TIM_TimeBaseStructure.Period = 65535;
TIM_TimeBaseStructure.Prescaler = PrescalerValue;
TIM_TimeBaseStructure.ClkDiv = TIM_CLK_DIV1;
TIM_TimeBaseStructure.CounterMode = TIM_CNT_MODE_UP;
TIM_InitTimeBase(TIMx, &TIM_TimeBaseStructure);
改 2000 这个除数就改变计数节拍,四路阈值对应的实际时间随之等比例变化。
2. 配 CH1 的输出比较 Active 模式并关闭预装载。 CH1 的比较值为 CCR1_Val,输出极性为高,预载关闭使比较值立即生效。
/* Output Compare Active Mode configuration: Channel1 */
TIM_InitOcStruct(&TIM_OCInitStructure);
TIM_OCInitStructure.OCMode = TIM_OCMODE_ACTIVE;
TIM_OCInitStructure.OutputState = TIM_OUTPUT_STATE_ENABLE;
TIM_OCInitStructure.Pulse = CCR1_Val;
TIM_OCInitStructure.OCPolarity = TIM_OC_POLARITY_HIGH;
TIM_InitOc1(TIMx, &TIM_OCInitStructure);
TIM_ConfigOc1Preload(TIMx, TIM_OC_PRE_LOAD_DISABLE);
3. 其余三路沿用同一结构体。 CH2、CH3、CH4 只改 Pulse 并各自关闭预装载,最后打开 AR 预装载。
/* Output Compare Active Mode configuration: Channel2 */
TIM_OCInitStructure.OutputState = TIM_OUTPUT_STATE_ENABLE;
TIM_OCInitStructure.Pulse = CCR2_Val;
TIM_InitOc2(TIMx, &TIM_OCInitStructure);
TIM_ConfigOc2Preload(TIMx, TIM_OC_PRE_LOAD_DISABLE);
/* Output Compare Active Mode configuration: Channel3 */
TIM_OCInitStructure.OutputState = TIM_OUTPUT_STATE_ENABLE;
TIM_OCInitStructure.Pulse = CCR3_Val;
TIM_InitOc3(TIMx, &TIM_OCInitStructure);
TIM_ConfigOc3Preload(TIMx, TIM_OC_PRE_LOAD_DISABLE);
/* Output Compare Active Mode configuration: Channel4 */
TIM_OCInitStructure.OutputState = TIM_OUTPUT_STATE_ENABLE;
TIM_OCInitStructure.Pulse = CCR4_Val;
TIM_InitOc4(TIMx, &TIM_OCInitStructure);
TIM_ConfigOc4Preload(TIMx, TIM_OC_PRE_LOAD_DISABLE);
TIM_ConfigArPreload(TIMx, ENABLE);
四个 CCRx_Val 决定四路的先后顺序,改其中任一个都会改变对应通道的跳变时刻。
4. 使能计数器。 输出比较在计数器运行时才产生,使能后进入空循环。
/* TIMx enable counter */
TIM_Enable(TIMx, ENABLE);
while (1)
{
}
对应源码: src/main.c、inc/main.h
5.20.3.10 OCInactive 输出比较无效
工程目录: projects/n32g41x_EVAL/examples/TIM/OCInactive/
使能 GPIO 与 GTIM2 时钟→配置 PA1~PA4 为推挽输出并拉高→把 GTIM2 计数时钟分频到 2 kHz、CH1~CH4 设为输出比较无效模式→打开 CC1~CC4 中断并启动计数器→比较匹配时中断里把对应引脚拉低
| 项目 | 源码解读 |
|---|---|
| 功能 | 用 GTIM2 的 CH1~CH4 做输出比较,四个通道各自的比较值到达后进入比较中断,中断里把对应的 PA1~PA4 拉低; 配置阶段先把四个引脚置高。 |
| 源码组成 | src/main.c:main 与 RCC_Configuration、GPIO_Configuration、NVIC_Configuration;inc/main.h:包含 GPIO、TIM、RCC 头文件并声明上述函数;src/n32g41x_it.c、inc/n32g41x_it.h:中断服务函数 GTIM2_IRQHandler;readme.txt:功能、环境与使用说明;MDK-ARM/、EWARM/:Keil 与 IAR 工程。 |
| 关键配置 | 计数时钟取 SystemCoreClock / 2000 的分频,即计数器时钟 2 kHz;Period 为 65535、ClkDiv 为 TIM_CLK_DIV1、计数模式 TIM_CNT_MODE_UP。四通道 OCMode 均为 TIM_OCMODE_INACTIVE、输出使能、OCPolarity 为 TIM_OC_POLARITY_HIGH,Pulse 依次为 CH1 1000、CH2 500、CH3 250、CH4 125;各通道预装载关闭, TIM_ConfigArPreload 使能。 |
| 程序与数据路径 | main 依次完成时钟、NVIC、GPIO 配置,用 TIM_InitTimBaseStruct 与 TIM_InitTimeBase 建立时基,再用 TIM_InitOc1~TIM_InitOc4 把四通道设为无效比较模式并打开 CC1~CC4 中断,GPIO_SetBits 把 PA1~PA4 置高后 TIM_Enable 启动计数;每次比较匹配进入 GTIM2_IRQHandler,按通道清零标志并用 GPIO_ResetBits 拉低对应引脚。 |
| 主要 API | TIM_InitTimBaseStruct、TIM_InitTimeBase、TIM_InitOcStruct、TIM_InitOc1~TIM_InitOc4、TIM_ConfigOc1Preload、TIM_ConfigArPreload、TIM_ConfigInt、TIM_Enable、TIM_GetIntStatus、TIM_ClrIntPendingBit、GPIO_InitPeripheral、GPIO_SetBits、GPIO_ResetBits |
| 验证方法 | 编译后进入调试模式,用示波器或逻辑分析仪观察 PA1~PA4:四个引脚初始为高,随各自比较值到达被拉低; 无效模式本身不改变输出电平,拉低动作由中断完成。 |
| 使用提示 | 开发板 PA9、PA10 默认经跳线帽接到 NSLINK 虚拟串口,不用作串口时须拔掉跳线帽。 支持 N32G412x8L7、N32G412xBL7、N32G415x8L7、N32G415xBL7; 开发环境为 KEIL MDK-ARM 5.34 或 IAR EWARM 8.50.1。 |
核心代码解读与移植
示例把 GTIM2 的四个通道都设成输出比较无效模式,比较值到达后不改变硬件输出,而是在中断里由软件把对应引脚拉低。
数据路径: RCC_Configuration 打开 GPIO 与 GTIM2 时钟 → GPIO_Configuration 把 PA1~PA4 配成推挽输出 → TIM_InitTimeBase 写入 2 kHz 计数时钟 → TIM_InitOc1~TIM_InitOc4 设四通道无效比较 → GTIM2_IRQHandler 在比较中断里 GPIO_ResetBits 拉低 PA1~PA4
1. 时钟与引脚准备。 先打开 GPIO 与 GTIM2 的时钟,再把 PA1~PA4 初始化成推挽输出,为后面的软件拉低做好准备。
/* Enable GPIO clock */
RCC_EnableAHBPeriphClk(RCC_AHB_PERIPH_GPIO, ENABLE);
/* Enable GTIM2 clock */
RCC_EnableAPB1PeriphClk(RCC_APB1_PERIPH_GTIM2, ENABLE);
/* PA1, PA2, PA3, PA4 as GPIO output */
GPIO_InitStructure.Pin = GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3 | GPIO_PIN_4;
GPIO_InitStructure.GPIO_Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitPeripheral(GPIOA, &GPIO_InitStructure);
移植到别的引脚时,同步修改这里的引脚组合与端口,并让中断里对应的 GPIO_ResetBits 指到同一组引脚。
2. 计算分频并建立时基。 计数时钟按 SystemCoreClock / 2000 分频得到 2 kHz,自动重装值取 65535,四个通道的比较值都以该时钟为分辨率。
/* Compute the prescaler value */
PrescalerValue = (uint16_t)(SystemCoreClock / 2000) - 1;
/* Time base configuration */
TIM_InitTimBaseStruct(&TIM_TimeBaseStructure);
TIM_TimeBaseStructure.Period = 65535;
TIM_TimeBaseStructure.Prescaler = PrescalerValue;
TIM_TimeBaseStructure.ClkDiv = TIM_CLK_DIV1;
TIM_TimeBaseStructure.CounterMode = TIM_CNT_MODE_UP;
TIM_InitTimeBase(GTIM2, &TIM_TimeBaseStructure);
改计数分辨率时改这里的除数,改最大延迟时改 Period,两者共同决定四个通道延迟的上限。
3. 把通道设成无效比较模式。 四路共用同一结构体,只改 Pulse;以 CH1 为例,OCMode 取 TIM_OCMODE_INACTIVE,预装载关闭,比较值到达后硬件不改变输出。
/* Output Compare Inactive Mode configuration: Channel1 */
TIM_InitOcStruct(&TIM_OCInitStructure);
TIM_OCInitStructure.OCMode = TIM_OCMODE_INACTIVE;
TIM_OCInitStructure.OutputState = TIM_OUTPUT_STATE_ENABLE;
TIM_OCInitStructure.Pulse = CCR1_Val;
TIM_OCInitStructure.OCPolarity = TIM_OC_POLARITY_HIGH;
TIM_InitOc1(GTIM2, &TIM_OCInitStructure);
TIM_ConfigOc1Preload(GTIM2, TIM_OC_PRE_LOAD_DISABLE);
改某一路的延迟时改对应 CCRx_Val;无效模式下输出引脚的电平不由硬件改变,真正拉低由中断完成。
4. 先置高再启动,在中断里拉低。 启动前把 PA1~PA4 置高并打开四个比较中断,计数开始后每次匹配进入 GTIM2_IRQHandler,清标志后拉低对应引脚。
/* TIM IT enable */
TIM_ConfigInt(GTIM2, TIM_INT_CC1 | TIM_INT_CC2 | TIM_INT_CC3 | TIM_INT_CC4, ENABLE);
/* Set output pins */
GPIO_SetBits(GPIOA, GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3 | GPIO_PIN_4);
/* GTIM2 enable counter */
TIM_Enable(GTIM2, ENABLE);
if (TIM_GetIntStatus(GTIM2, TIM_INT_CC1) != RESET)
{
/* Clear GTIM2 Capture Compare1 interrupt pending bit */
TIM_ClrIntPendingBit(GTIM2, TIM_INT_CC1);
GPIO_ResetBits(GPIOA, GPIO_PIN_1);
}
移植时同步核对中断向量 GTIM2_IRQn 与中断函数 GTIM2_IRQHandler 的名字,换用其它定时器要一起改。
对应源码: src/main.c、src/n32g41x_it.c
5.20.3.11 OCToggle 输出比较翻转
工程目录: projects/n32g41x_EVAL/examples/TIM/OCToggle/
使能 GPIO 与 GTIM1 时钟→配置 PA0~PA3 为 CH1~CH4 复用输出→建立 8 MHz 计数时基并把四通道设为输出比较翻转模式→清除比较与更新标志、打开 CC1~CC4 中断并启动计数器→比较匹配后引脚翻转,中断里累加下一次比较值
| 项目 | 源码解读 |
|---|---|
| 功能 | GTIM1 的 CH1~CH4 工作在输出比较翻转模式,比较值到达时对应引脚电平翻转,同时中断里把比较值累加一个固定量,形成占空比 50% 的方波。 |
| 源码组成 | src/main.c:main 与 RCC_Configuration、GPIO_Configuration、NVIC_Configuration;inc/main.h:TIMx、各通道引脚与复用宏、中断映射和函数声明;src/n32g41x_it.c、inc/n32g41x_it.h:中断服务函数 TIMx_IRQHandler 与比较值累加;readme.txt:功能、环境与使用说明;MDK-ARM/、EWARM/:Keil 与 IAR 工程。 |
| 关键配置 | TIMx 为 GTIM1、时钟 RCC_APB1_PERIPH_GTIM1;CH1 PA0、CH2 PA1、CH3 PA2、CH4 PA3,均 GPIO_MODE_AF_PP、GPIO_AF2。计数时钟取 SystemCoreClock / 8000000 的分频即 8 MHz,Period 为 0xFFFFFFFF;四通道 OCMode 为 TIM_OCMODE_TOGGLE、输出使能、OCPolarity 为 TIM_OC_POLARITY_LOW,Pulse 依次为 32768、16384、8192、4096,预装载均关闭。 |
| 程序与数据路径 | main 完成时钟、GPIO、NVIC 配置后用 TIM_InitTimeBase 建立 8 MHz 时基,TIM_InitOc1~TIM_InitOc4 把四通道设为翻转模式;随后 TIM_ClrIntPendingBit 清各比较与更新标志,TIM_ConfigInt 打开 CC1~CC4 中断,TIM_Enable 启动;每次比较匹配进入 TIMx_IRQHandler,用 TIM_GetCapx 读回当前比较值再以 TIM_SetCmpx 写入其与 CCRx_Val 之和。 |
| 主要 API | TIM_InitTimBaseStruct、TIM_InitTimeBase、TIM_InitOcStruct、TIM_InitOc1~TIM_InitOc4、TIM_ConfigOc1Preload、TIM_ConfigOc4Preload、TIM_ClrIntPendingBit、TIM_ConfigInt、TIM_Enable、TIM_GetIntStatus、TIM_GetCap1、TIM_SetCmp1、GPIO_InitPeripheral |
| 验证方法 | 编译后进入调试模式,用示波器或逻辑分析仪观察 PA0~PA3:每路输出周期由 CCRx_Val 与 8 MHz 计数时钟决定,占空比固定为 50%。 |
| 使用提示 | 开发板 PA9、PA10 默认接 NSLINK 虚拟串口,不用串口时须拔掉跳线帽。 支持 N32G412x8L7、N32G412xBL7、N32G415x8L7、N32G415xBL7; 开发环境为 KEIL MDK-ARM 5.34 或 IAR EWARM 8.50.1。 |
核心代码解读与移植
示例用 TIMx 宏指向 GTIM1,四路通道工作在输出比较翻转模式,中断负责把下一次比较值往前推一个固定量。
数据路径: RCC_Configuration 打开 GPIO 与 GTIM1 时钟 → GPIO_Configuration 把 PA0~PA3 配成 CH1~CH4 复用输出 → TIM_InitTimeBase 建立 8 MHz 时基 → TIM_InitOc1~TIM_InitOc4 设为翻转模式 → TIMx_IRQHandler 累加比较值并触发下一次翻转
1. 用宏把定时器与四路引脚参数集中起来。 inc/main.h 把 TIMx 定义为 GTIM1,并为四个通道各自的引脚、端口与复用号给出宏,后续配置全部经这组宏完成。
#define TIMx GTIM1
#define TIMx_CLK RCC_APB1_PERIPH_GTIM1
/* GTIM1 CH1: PA0 */
#define TIMx_CH1_PIN GPIO_PIN_0
#define TIMx_CH1_GPIO GPIOA
#define TIMx_CH1_AF GPIO_AF2
移植到别的定时器时要同时改 TIMx、TIMx_CLK、四个通道的引脚与复用宏,以及 TIMx_IRQn、TIMx_IRQHandler 的映射。
2. 建立 8 MHz 计数时基。 计数时钟按 SystemCoreClock / 8000000 分频,自动重装值取满量程,让比较值不受周期限制。
/* Compute the prescaler value */
PrescalerValue = (uint16_t)(SystemCoreClock / 8000000) - 1;
/* Time base configuration */
TIM_InitTimBaseStruct(&TIM_TimeBaseStructure);
TIM_TimeBaseStructure.Period = 0xFFFFFFFF;
TIM_TimeBaseStructure.Prescaler = PrescalerValue;
TIM_TimeBaseStructure.ClkDiv = TIM_CLK_DIV1;
TIM_TimeBaseStructure.CounterMode = TIM_CNT_MODE_UP;
TIM_InitTimeBase(TIMx, &TIM_TimeBaseStructure);
比较值以 8 MHz 为分辨率,改翻转频率时改这里的除数或各通道的 CCRx_Val。
3. 把通道设成翻转模式。 四路共用结构体,OCMode 取 TIM_OCMODE_TOGGLE;以 CH1 为例写入初值与极性后使能,并关闭预装载。
/* Output Compare Toggle Mode configuration: Channel1 */
TIM_InitOcStruct(&TIM_OCInitStructure);
TIM_OCInitStructure.OCMode = TIM_OCMODE_TOGGLE;
TIM_OCInitStructure.OutputState = TIM_OUTPUT_STATE_ENABLE;
TIM_OCInitStructure.Pulse = CCR1_Val;
TIM_OCInitStructure.OCPolarity = TIM_OC_POLARITY_LOW;
TIM_InitOc1(TIMx, &TIM_OCInitStructure);
TIM_ConfigOc1Preload(TIMx, TIM_OC_PRE_LOAD_DISABLE);
预装载关闭后,中断里写比较值立即生效;若改开预装载,下一比较值要到更新事件才装载。
4. 清标志、开中断并启动。 使能中断前先把更新与四个比较标志清掉,再打开 CC1~CC4 中断并启动计数。
TIM_ClrIntPendingBit(TIMx, TIM_INT_UPDATE);
TIM_ClrIntPendingBit(TIMx, TIM_INT_CC1);
TIM_ClrIntPendingBit(TIMx, TIM_INT_CC2);
TIM_ClrIntPendingBit(TIMx, TIM_INT_CC3);
TIM_ClrIntPendingBit(TIMx, TIM_INT_CC4);
/* TIM IT enable */
TIM_ConfigInt(TIMx, TIM_INT_CC1 | TIM_INT_CC2 | TIM_INT_CC3 | TIM_INT_CC4, ENABLE);
/* TIM enable counter */
TIM_Enable(TIMx, ENABLE);
5. 中断里累加下一次比较值。 每次比较匹配清标志后,读回当前比较值再加 CCRx_Val 写回,形成等间隔翻转。
/* TIMx_CH1 toggling */
if (TIM_GetIntStatus(TIMx, TIM_INT_CC1) != RESET)
{
TIM_ClrIntPendingBit(TIMx, TIM_INT_CC1);
capture = TIM_GetCap1(TIMx);
TIM_SetCmp1(TIMx, capture + CCR1_Val);
}
改输出频率时改对应 CCRx_Val;capture 是文件作用域变量,四路分支共用。
对应源码: src/main.c、inc/main.h、src/n32g41x_it.c
5.20.3.12 OnePulse 单脉冲输出
工程目录: projects/n32g41x_EVAL/examples/TIM/OnePulse/
使能 GPIO 与 GTIM1 时钟→配置 PA0 为 CH1 输出、PA1 为 CH2 输入、PA3 为普通输出→建立时基并把 CH1 设为 PWM2 输出、CH2 设为上升沿捕获→选择单脉冲模式与 TI2FP2 触发,从模式设为触发模式→主循环在软件触发时从 PA3 送出一个上升沿
| 项目 | 源码解读 |
|---|---|
| 功能 | GTIM1 的 CH2 配成上升沿输入捕获并作为触发源,单脉冲模式检测到该上升沿后经可控延迟在 CH1 上输出一个宽度由 Period - Pulse 决定的单脉冲;主循环在 gSendTrigEn 置位时从 PA3 送出一个触发沿。 |
| 源码组成 | src/main.c:main、RCC_Configuration、GPIO_Configuration、SendOneTrig;inc/main.h:TIMx、CH1 与 CH2 的引脚复用宏、SendOneTrig 声明;src/n32g41x_it.c、inc/n32g41x_it.h:中断服务函数;readme.txt:功能、环境与使用说明;MDK-ARM/、EWARM/:Keil 与 IAR 工程。 |
| 关键配置 | TIMx 为 GTIM1;CH1 为 PA0、CH2 为 PA1,均 GPIO_MODE_AF_PP、GPIO_AF2,PA3 为 GPIO_MODE_OUTPUT_PP。计数时钟取 SystemCoreClock / 8000000 分频即 8 MHz,Period 为 65535;CH1 为 TIM_OCMODE_PWM2、Pulse 为 16383、极性 TIM_OC_POLARITY_HIGH;CH2 捕获极性 TIM_IC_POLARITY_RISING、选择 TIM_IC_SELECTION_DIRECTTI、预分频 TIM_IC_PSC_DIV1、滤波 0。 |
| 程序与数据路径 | main 完成时钟与 GPIO 配置后建立时基,把 CH1 设为 PWM2 输出,再用 TIM_ICInit 配置 CH2 上升沿直接捕获,接着 TIM_SelectOnePulseMode 选单次模式、TIM_SelectInputTrig 选 TI2FP2、TIM_SelectSlaveMode 选触发模式;主循环反复调用 SendOneTrig,在 gSendTrigEn 为真时把它清零,并拉高再拉低 PA3 形成一个触发脉冲。 |
| 主要 API | TIM_InitTimBaseStruct、TIM_InitTimeBase、TIM_InitOcStruct、TIM_InitOc1、TIM_InitIcStruct、TIM_ICInit、TIM_SelectOnePulseMode、TIM_SelectInputTrig、TIM_SelectSlaveMode、GPIO_InitStruct、GPIO_InitPeripheral、GPIO_SetBits、GPIO_ResetBits |
| 验证方法 | 把 PA3 与 PA1 相连,用示波器或逻辑分析仪观察 CH1(PA0):在调试窗口把 gSendTrigEn 置 1 后,程序从 PA3 送出一个上升沿,CH1 输出一个单脉冲;改变 Pulse 可看到脉冲宽度变化。 |
| 使用提示 | 需要把 PA3 与 PA1 用导线相连才能自触发; 开发板 PA9、PA10 默认接 NSLINK 虚拟串口,不用串口时须拔掉跳线帽。 支持 N32G412x8L7、N32G412xBL7、N32G415x8L7、N32G415xBL7; 开发环境为 KEIL MDK-ARM 5.34 或 IAR EWARM 8.50.1。 |
核心代码解读与移植
示例用 PA3 软件产生触发沿,经 PA1(CH2)进入单脉冲模式,在 PA0(CH1)上输出一个宽度可控的脉冲。
数据路径: SendOneTrig 翻转 PA3 → PA1 上的上升沿被 CH2 捕获 → TIM_SelectInputTrig 选的 TI2FP2 触发计数器 → CH1 按 PWM2 模式输出单脉冲 → 示波器在 PA0 观察脉宽
1. 由外向内配好三只引脚。 CH1、CH2 配成复用推挽并写入各自的复用号,PA3 单独配成普通推挽输出,作为软件触发源。
/* GTIM1 CH1: PA0 */
GPIO_InitStructure.Pin = TIMx_CH1_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_MODE_AF_PP;
GPIO_InitStructure.GPIO_Alternate = TIMx_CH1_AF;
GPIO_InitPeripheral(TIMx_CH1_GPIO, &GPIO_InitStructure);
/* GTIM1 CH2: PA1 */
GPIO_InitStructure.Pin = TIMx_CH2_PIN;
GPIO_InitStructure.GPIO_Alternate = TIMx_CH2_AF;
GPIO_InitPeripheral(TIMx_CH2_GPIO, &GPIO_InitStructure);
/* PA3: GPIO output for trigger */
GPIO_InitStructure.Pin = GPIO_PIN_3;
GPIO_InitStructure.GPIO_Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitPeripheral(GPIOA, &GPIO_InitStructure);
移植时引脚与复用号来自 inc/main.h 的 TIMx_CH1_*、TIMx_CH2_* 与 PA3 三个宏,换板要一起核对。
2. 建立 8 MHz 时基。 计数时钟按 SystemCoreClock / 8000000 分频,自动重装值取 65535,脉宽由 Period 与 Pulse 之差决定。
/* Compute the prescaler value */
PrescalerValue = (uint16_t)(SystemCoreClock / 8000000) - 1;
/* Time base configuration */
TIM_InitTimBaseStruct(&TIM_TimeBaseStructure);
TIM_TimeBaseStructure.Period = 65535;
TIM_TimeBaseStructure.Prescaler = PrescalerValue;
TIM_TimeBaseStructure.ClkDiv = TIM_CLK_DIV1;
TIM_TimeBaseStructure.CounterMode = TIM_CNT_MODE_UP;
TIM_InitTimeBase(TIMx, &TIM_TimeBaseStructure);
改脉冲延迟与宽度时,分别对应改 Pulse 与 Period,两者都按 8 MHz 计数。
3. CH1 用 PWM2 模式做输出。 输出通道取 TIM_OCMODE_PWM2,Pulse 为 16383,极性为高,单脉冲模式下这段决定脉冲的延迟与宽度。
/* TIMx PWM2 Mode configuration: Channel1 */
TIM_InitOcStruct(&TIM_OCInitStructure);
TIM_OCInitStructure.OCMode = TIM_OCMODE_PWM2;
TIM_OCInitStructure.OutputState = TIM_OUTPUT_STATE_ENABLE;
TIM_OCInitStructure.Pulse = 16383;
TIM_OCInitStructure.OCPolarity = TIM_OC_POLARITY_HIGH;
TIM_InitOc1(TIMx, &TIM_OCInitStructure);
4. CH2 上升沿捕获并选为触发源。 输入结构体把 CH2 配成上升沿直接捕获,随后选出 TI2FP2 作触发输入,并把从模式设为触发模式、开启单次单脉冲。
/* TIMx configuration in Input Capture Mode */
TIM_InitIcStruct(&TIM_ICInitStructure);
TIM_ICInitStructure.Channel = TIM_CH_2;
TIM_ICInitStructure.ICPolarity = TIM_IC_POLARITY_RISING;
TIM_ICInitStructure.ICSelection = TIM_IC_SELECTION_DIRECTTI;
TIM_ICInitStructure.ICPrescaler = TIM_IC_PSC_DIV1;
TIM_ICInitStructure.ICFilter = 0;
TIM_ICInit(TIMx, &TIM_ICInitStructure);
/* One Pulse Mode selection */
TIM_SelectOnePulseMode(TIMx, TIM_OPMODE_SINGLE);
/* Input Trigger selection */
TIM_SelectInputTrig(TIMx, TIM_TRIG_SEL_TI2FP2);
/* Slave Mode selection: Trigger Mode */
TIM_SelectSlaveMode(TIMx, TIM_SLAVE_MODE_TRIG);
换触发来源时要同步改 TIM_SelectInputTrig 的触发选择与对应的捕获通道,二者必须指到同一个 TIxFP;
5. 软件触发沿由 PA3 送出。 SendOneTrig 在使能标志置位时清零标志,拉高 PA3 并短暂保持再拉低,形成一个可被 CH2 捕获的上升沿。
if (gSendTrigEn)
{
gSendTrigEn = 0;
GPIO_SetBits(GPIOA, GPIO_PIN_3);
{
uint32_t i = 0;
while (i++ < 10)
;
}
GPIO_ResetBits(GPIOA, GPIO_PIN_3);
}
触发脉宽由这段延时循环决定,改它时要保证脉冲宽度足以被 CH2 的捕获滤波与边沿检测识别。
对应源码: src/main.c、inc/main.h
5.20.3.13 Parallel_Synchro 主从门控同步
工程目录: projects/n32g41x_EVAL/examples/TIM/Parallel_Synchro/
使能 GPIO 与 GTIM1、GTIM2、GTIM3 时钟→配置 PA0、PB4、PA6 为三个定时器的 CH1 复用输出→建立 GTIM1、GTIM2、GTIM3 的时基并配置主从 PWM1 输出→把 GTIM1 设为主定时器并把更新事件选作触发输出→GTIM2、GTIM3 设为门控从模式并各自选择触发输入
| 项目 | 源码解读 |
|---|---|
| 功能 | GTIM1 作为主定时器,以更新事件作为触发输出,通过门控模式控制 GTIM2 与 GTIM3 的计数起停,使两路从定时器输出与主定时器周期成整数倍关系的 PWM 波形。 |
| 源码组成 | src/main.c:main、RCC_Configuration、GPIO_Configuration;inc/main.h:TIMx、TIMy、TIMz 及其时钟、通道引脚与复用宏;readme.txt:功能、环境与使用说明;MDK-ARM/、EWARM/:Keil 与 IAR 工程。 |
| 关键配置 | 主 TIMx 为 GTIM1、CH1 为 PA0、GPIO_AF2;从 TIMy 为 GTIM2、CH1 为 PB4、GPIO_AF8;从 TIMz 为 GTIM3、CH1 为 PA6、GPIO_AF12。三路 Prescaler 均为 0、ClkDiv 为 TIM_CLK_DIV1、计数向上;Period 依次为主 255、从 9、从 4。主通道 Pulse 为 64,从通道 Pulse 为 3,均为 TIM_OCMODE_PWM1、极性 TIM_OC_POLARITY_HIGH。 |
| 程序与数据路径 | main 配置时钟与 GPIO,再用 TIM_InitTimeBase 建立 GTIM1、GTIM2、GTIM3 时基;TIM_InitOc1 把主通道设为 PWM1,TIM_SelectMasterSlaveMode 使能主从模式,TIM_SelectOutputTrig 选更新事件为触发输出;对 TIMy、TIMz 用 TIM_InitOc1 设 PWM1,并用 TIM_SelectSlaveMode、TIM_SelectInputTrig 选门控模式与输入触发,随后使能 PWM 输出并启动三个计数器。 |
| 主要 API | TIM_InitTimBaseStruct、TIM_InitTimeBase、TIM_InitOcStruct、TIM_InitOc1、TIM_SelectMasterSlaveMode、TIM_SelectOutputTrig、TIM_SelectSlaveMode、TIM_SelectInputTrig、TIM_EnableCtrlPwmOutputs、TIM_Enable、GPIO_InitStruct、GPIO_InitPeripheral |
| 验证方法 | 用示波器或逻辑分析仪同时观察 GTIM1 CH1(PA0)、GTIM2 CH1(PB4)、GTIM3 CH1(PA6):GTIM2 的周期为主定时器的 10 倍,GTIM3 的周期为主定时器的 5 倍。 |
| 使用提示 | 开发板 PA9、PA10 默认接 NSLINK 虚拟串口,不用串口时须拔掉跳线帽。 支持 N32G412x8L7、N32G412xBL7、N32G415x8L7、N32G415xBL7; 开发环境为 KEIL MDK-ARM 5.34 或 IAR EWARM 8.50.1。 |
核心代码解读与移植
示例让 GTIM1 担任主定时器,GTIM2 与 GTIM3 作为门控从机,由主定时器的更新事件控制两路从机的计数起停。
数据路径: TIM_InitTimeBase 建立三路时基 → TIM_InitOc1 配置主从 PWM 输出 → TIM_SelectOutputTrig 把主更新事件送到触发输出 → TIM_SelectSlaveMode 与 TIM_SelectInputTrig 让两从机按门控模式跟随 → 三路 PWM 在 PA0、PB4、PA6 输出
1. 用宏声明主从三路定时器。 inc/main.h 依次给出主定时器、两个从定时器的定时器名、时钟与 CH1 引脚复用宏,把主从关系固定在宏里。
/* Master: GTIM1(TIM2), CH1=PA0(AF2) */
#define TIMx GTIM1
#define TIMx_CLK RCC_APB1_PERIPH_GTIM1
#define TIMx_CH1_PIN GPIO_PIN_0
#define TIMx_CH1_GPIO GPIOA
#define TIMx_CH1_AF GPIO_AF2
/* Slave1: GTIM2(TIM3), CH1=PB4(AF8), ITR1=GTIM1 */
#define TIMy GTIM2
#define TIMy_CLK RCC_APB1_PERIPH_GTIM2
#define TIMy_CH1_PIN GPIO_PIN_4
#define TIMy_CH1_GPIO GPIOB
#define TIMy_CH1_AF GPIO_AF8
/* Slave2: GTIM3(TIM4), CH1=PA6(AF12), ITR1=GTIM1 */
#define TIMz GTIM3
#define TIMz_CLK RCC_APB1_PERIPH_GTIM3
#define TIMz_CH1_PIN GPIO_PIN_6
#define TIMz_CH1_GPIO GPIOA
#define TIMz_CH1_AF GPIO_AF12
移植到别的定时器组合时,同步修改三路定时器名、时钟与 CH1 引脚复用宏,并核对 GPIO_Configuration 中对应的引脚与端口。
2. 主从三路定时器的时基。 三路共用同一结构体,只改 Period;主定时器 Period 为 255,两个从机分别为 9 和 4。
/* Time base configuration */
TIM_InitTimBaseStruct(&TIM_TimeBaseStructure);
TIM_TimeBaseStructure.Period = 255;
TIM_TimeBaseStructure.Prescaler = 0;
TIM_TimeBaseStructure.ClkDiv = TIM_CLK_DIV1;
TIM_TimeBaseStructure.CounterMode = TIM_CNT_MODE_UP;
TIM_InitTimeBase(TIMx, &TIM_TimeBaseStructure);
TIM_TimeBaseStructure.Period = 9;
TIM_InitTimeBase(TIMy, &TIM_TimeBaseStructure);
TIM_TimeBaseStructure.Period = 4;
TIM_InitTimeBase(TIMz, &TIM_TimeBaseStructure);
改周期比例时改三路 Period,主从比例由主定时器周期的整数倍关系决定。
3. 主定时器输出与触发源。 主通道工作在 PWM1 模式,Pulse 为 64;TIM_SelectMasterSlaveMode 使能主从模式后,TIM_SelectOutputTrig 把更新事件选为触发输出。
/* Master Configuration in PWM1 Mode */
TIM_InitOcStruct(&TIM_OCInitStructure);
TIM_OCInitStructure.OCMode = TIM_OCMODE_PWM1;
TIM_OCInitStructure.OutputState = TIM_OUTPUT_STATE_ENABLE;
TIM_OCInitStructure.Pulse = 64;
TIM_OCInitStructure.OCPolarity = TIM_OC_POLARITY_HIGH;
TIM_InitOc1(TIMx, &TIM_OCInitStructure);
/* Select the Master Slave Mode */
TIM_SelectMasterSlaveMode(TIMx, TIM_MASTER_SLAVE_MODE_ENABLE);
/* Master Mode selection */
TIM_SelectOutputTrig(TIMx, TIM_TRGO_SRC_UPDATE);
触发输出选的是更新事件,换用比较事件等其它源时要同步核对从机的触发输入选择。
4. 两路从机用门控模式跟随。 从机通道同为 PWM1、Pulse 为 3;TIM_SelectSlaveMode 取门控模式,TIM_SelectInputTrig 分别为 TIM_TRIG_SEL_IN_TR2 与 TIM_TRIG_SEL_IN_TR1,使从机计数由主触发信号控制。
/* Slaves Configuration: PWM1 Mode */
TIM_OCInitStructure.OCMode = TIM_OCMODE_PWM1;
TIM_OCInitStructure.OutputState = TIM_OUTPUT_STATE_ENABLE;
TIM_OCInitStructure.Pulse = 3;
TIM_InitOc1(TIMy, &TIM_OCInitStructure);
TIM_InitOc1(TIMz, &TIM_OCInitStructure);
/* Slave Mode selection: TIMy, ITR2 = TIMx */
TIM_SelectSlaveMode(TIMy, TIM_SLAVE_MODE_GATED);
TIM_SelectInputTrig(TIMy, TIM_TRIG_SEL_IN_TR2);
/* Slave Mode selection: TIMz, ITR1 = TIMx */
TIM_SelectSlaveMode(TIMz, TIM_SLAVE_MODE_GATED);
TIM_SelectInputTrig(TIMz, TIM_TRIG_SEL_IN_TR1);
TIM_EnableCtrlPwmOutputs(TIMz, ENABLE);
/* TIM enable counter */
TIM_Enable(TIMy, ENABLE);
TIM_Enable(TIMz, ENABLE);
TIM_Enable(TIMx, ENABLE);
源码注释把两个从机的触发输入都写成来自 ITR1(GTIM1),而代码里 GTIM2 用的是 TIM_TRIG_SEL_IN_TR2、GTIM3 用的是 TIM_TRIG_SEL_IN_TR1;TIM_EnableCtrlPwmOutputs 只对 TIMz 调用。移植到其它芯片时要按目标的 ITRx 映射与 PWM 输出使能范围逐项核对,不能只照注释。
对应源码: src/main.c、inc/main.h
5.20.3.14 PWM_Input PWM 输入捕获
工程目录: projects/n32g41x_EVAL/examples/TIM/PWM_Input/
使能 GPIO 与 GTIM1 时钟→配置 PA1 为 CH2 复用输入、PA3 为普通输出→把 CH2 设为 PWM 输入模式、选 TI2FP2 触发并设为复位从模式→打开 CC2 中断并启动计数器→主循环在 PA3 上产生方波,由 PA1 的捕获计算占空比与频率
| 项目 | 源码解读 |
|---|---|
| 功能 | GTIM1 的 CH2 配置为 PWM 输入模式,同一输入信号经两路捕获分别得到周期与高电平时间; 主循环在 PA3 上输出方波并连到 PA1,中断里用捕获值算出占空比与频率两个变量。 |
| 源码组成 | src/main.c:main、RCC_Configuration、GPIO_Configuration、NVIC_Configuration;inc/main.h:TIMx、CH2 引脚与复用宏、中断映射和函数声明;src/n32g41x_it.c、inc/n32g41x_it.h:中断服务函数 TIMx_IRQHandler 与 Frequency、DutyCycle 的计算;readme.txt:功能、环境与使用说明;MDK-ARM/、EWARM/:Keil 与 IAR 工程。 |
| 关键配置 | TIMx 为 GTIM1。CH2 为 PA1、 GPIO_MODE_AF_PP、GPIO_AF2,PA3 为 GPIO_MODE_OUTPUT_PP。捕获结构体取 Channel = TIM_CH_2、ICPolarity = TIM_IC_POLARITY_RISING、ICSelection = TIM_IC_SELECTION_DIRECTTI、ICPrescaler = TIM_IC_PSC_DIV1、ICFilter = 0x0;从模式为 TIM_SLAVE_MODE_RESET,触发输入为 TIM_TRIG_SEL_TI2FP2,并使能主从模式。 |
| 程序与数据路径 | main 完成时钟、GPIO、NVIC 配置后,TIM_ConfigPwmIc 把 CH2 设为 PWM 输入,TIM_SelectInputTrig 选 TI2FP2、TIM_SelectSlaveMode 选复位模式并 TIM_SelectMasterSlaveMode 使能主从,随后 TIM_Enable 启动、TIM_ConfigInt 打开 CC2 中断;主循环在 PA3 上产生方波; 每次 CC2 触发进入 TIMx_IRQHandler,用 TIM_GetCap2 得周期、TIM_GetCap1 得高电平时间,算出 DutyCycle 与 Frequency。 |
| 主要 API | TIM_InitIcStruct、TIM_ConfigPwmIc、TIM_SelectInputTrig、TIM_SelectSlaveMode、TIM_SelectMasterSlaveMode、TIM_Enable、TIM_ConfigInt、TIM_ClrIntPendingBit、TIM_GetCap1、TIM_GetCap2、GPIO_InitStruct、GPIO_InitPeripheral、GPIO_SetBits、GPIO_ResetBits |
| 验证方法 | 把 PA3 与 PA1 相连,把 Frequency、DutyCycle 加入 watch 窗口;运行后两个变量随 PA3 送出的方波更新,其值即为捕获测得的频率与占空比。 |
| 使用提示 | 需要把 PA3 与 PA1 用导线相连; 开发板 PA9、PA10 默认接 NSLINK 虚拟串口,不用串口时须拔掉跳线帽。 支持 N32G412x8L7、N32G412xBL7、N32G415x8L7、N32G415xBL7; 开发环境为 KEIL MDK-ARM 5.34 或 IAR EWARM 8.50.1。 |
核心代码解读与移植
示例把 PA3 的方波接回 CH2,用 PWM 输入模式同时测出周期与占空比,结果落在两个全局变量里。
数据路径: 主循环在 PA3 上产生方波 → CH2 的 TI2FP2 上升沿触发捕获并复位计数器 → TIMx_IRQHandler 读 TIM_GetCap2 得周期、TIM_GetCap1 得高电平时间 → 算出 DutyCycle 与 Frequency
1. CH2 接成复用输入,PA3 作信号源。 CH2 配成复用推挽并写入复用号,PA3 单独配成普通推挽输出,用来产生待测方波。
/* TIMx CH2 */
GPIO_InitStructure.Pin = TIMx_CH2_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_MODE_AF_PP;
GPIO_InitStructure.GPIO_Alternate = TIMx_CH2_AF;
GPIO_InitPeripheral(TIMx_CH2_GPIO, &GPIO_InitStructure);
/* PA3: GPIO output for generating PWM signal */
GPIO_InitStructure.Pin = GPIO_PIN_3;
GPIO_InitStructure.GPIO_Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitPeripheral(GPIOA, &GPIO_InitStructure);
移植时引脚与复用号来自 inc/main.h 的 CH2 宏与 PA3 的引脚定义,换板要一起核对。
2. 一次配好 PWM 输入与复位从模式。 TIM_ConfigPwmIc 把输入同时映射到 IC1 与 IC2,随后选出 TI2FP2 作触发输入、设为复位从模式并打开主从模式,最后启动计数与 CC2 中断。
TIM_InitIcStruct(&TIM_ICInitStructure);
TIM_ICInitStructure.Channel = TIM_CH_2;
TIM_ICInitStructure.ICPolarity = TIM_IC_POLARITY_RISING;
TIM_ICInitStructure.ICSelection = TIM_IC_SELECTION_DIRECTTI;
TIM_ICInitStructure.ICPrescaler = TIM_IC_PSC_DIV1;
TIM_ICInitStructure.ICFilter = 0x0;
TIM_ConfigPwmIc(TIMx, &TIM_ICInitStructure);
/* Select the TIMx Input Trigger: TI2FP2 */
TIM_SelectInputTrig(TIMx, TIM_TRIG_SEL_TI2FP2);
/* Select the slave Mode: Reset Mode */
TIM_SelectSlaveMode(TIMx, TIM_SLAVE_MODE_RESET);
/* Enable the Master/Slave Mode */
TIM_SelectMasterSlaveMode(TIMx, TIM_MASTER_SLAVE_MODE_ENABLE);
/* TIM enable counter */
TIM_Enable(TIMx, ENABLE);
/* Enable the CC2 Interrupt Request */
TIM_ConfigInt(TIMx, TIM_INT_CC2, ENABLE);
PWM 输入模式只支持 CH1、CH2 两个通道,换通道时要同步改 Channel、触发选择与复位从模式的组合。
3. 主循环产生待测方波。 主循环把 PA3 反复拉高、延时、拉低、再延时,形成占空比约 50% 的方波送进 CH2。
while (1)
{
GPIO_SetBits(GPIOA, GPIO_PIN_3);
{
volatile uint32_t i = 0;
while (i++ < 10)
;
}
GPIO_ResetBits(GPIOA, GPIO_PIN_3);
{
volatile uint32_t i = 0;
while (i++ < 10)
;
}
}
改变两段延时即可改变输入方波的占空比与频率,用来观察捕获结果是否跟随。
4. 中断里算占空比与频率。 每次 CC2 触发先清标志,用 TIM_GetCap2 读回周期,再用 TIM_GetCap1 读回高电平时间,相除得到占空比、相除系统时钟得到频率。
/* Clear TIMx Capture compare interrupt pending bit */
TIM_ClrIntPendingBit(TIMx, TIM_INT_CC2);
/* Get the Input Capture value */
IC2Value = TIM_GetCap2(TIMx);
if (IC2Value != 0)
{
/* Duty cycle computation */
DutyCycle = (TIM_GetCap1(TIMx) * 100) / IC2Value;
/* Frequency computation */
Frequency = SystemCoreClock / IC2Value;
}
else
{
DutyCycle = 0;
Frequency = 0;
}
除法前先判断周期非零,避免输入信号停止时除零;移植时要保留这个保护。
对应源码: src/main.c、src/n32g41x_it.c
5.20.3.15 PWM_Output PWM 输出
工程目录: projects/n32g41x_EVAL/examples/TIM/PWM_Output/
使能 GPIO 与 GTIM1 时钟→配置 PA0~PA3 为 CH1~CH4 复用输出→建立 16 MHz 时基并把四通道设为 PWM1 模式→使能各通道与自动重装载预装载后启动计数器
| 项目 | 源码解读 |
|---|---|
| 功能 | GTIM1 的 CH1~CH4 输出四路周期相同、占空比不同的 PWM 波形,占空比由各自的比较值与自动重装值之比决定。 |
| 源码组成 | src/main.c:main、RCC_Configuration、GPIO_Configuration;inc/main.h:TIMx、四个通道的引脚与复用宏;readme.txt:功能、环境与使用说明;MDK-ARM/、EWARM/:Keil 与 IAR 工程。 |
| 关键配置 | TIMx 为 GTIM1。CH1 PA0、CH2 PA1、CH3 PA2、CH4 PA3,均 GPIO_MODE_AF_PP、GPIO_AF2。计数时钟取 SystemCoreClock / 16000000 分频即 16 MHz,Period 为 1200;四通道 OCMode 为 TIM_OCMODE_PWM1、输出使能、极性 TIM_OC_POLARITY_HIGH,Pulse 依次为 600、300、150、75;各通道预装载与自动重装载预装载均使能。 |
| 程序与数据路径 | main 完成时钟与 GPIO 配置后建立 16 MHz 时基,依次 TIM_InitOc1~TIM_InitOc4 把四通道设为 PWM1 并分别使能预装载;随后 TIM_ConfigArPreload 使能自动重装载预装载,TIM_Enable 启动计数,四路持续输出占空比不同的 PWM。 |
| 主要 API | TIM_InitTimBaseStruct、TIM_InitTimeBase、TIM_InitOcStruct、TIM_InitOc1、TIM_InitOc2、TIM_InitOc3、TIM_InitOc4、TIM_ConfigOc1Preload、TIM_ConfigOc4Preload、TIM_ConfigArPreload、TIM_Enable、GPIO_InitStruct、GPIO_InitPeripheral |
| 验证方法 | 用示波器或逻辑分析仪观察 PA0~PA3:四路周期相同,占空比依次约为 50%、25%、12.5%、6.25%。 |
| 使用提示 | 开发板 PA9、PA10 默认接 NSLINK 虚拟串口,不用串口时须拔掉跳线帽。 支持 N32G412x8L7、N32G412xBL7、N32G415x8L7、N32G415xBL7; 开发环境为 KEIL MDK-ARM 5.34 或 IAR EWARM 8.50.1。 |
核心代码解读与移植
示例用同一结构体配置四路 PWM,只改比较值,得到周期相同而占空比递减的四路波形。
数据路径: TIM_InitTimeBase 写入 16 MHz 与 Period 1200 → TIM_InitOc1~TIM_InitOc4 设为 PWM1 并写入各自 Pulse → 各通道与自动重装载预装载使能 → TIM_Enable 启动 → PA0~PA3 输出四路 PWM
1. 四路引脚先配成复用输出。 第一个通道先把模式和复用号写全,后面三路只改引脚与复用号,沿用同样的推挽复用配置。
/* TIMx CH1 */
GPIO_InitStructure.Pin = TIMx_CH1_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_MODE_AF_PP;
GPIO_InitStructure.GPIO_Alternate = TIMx_CH1_AF;
GPIO_InitPeripheral(TIMx_CH1_GPIO, &GPIO_InitStructure);
/* TIMx CH2 */
GPIO_InitStructure.Pin = TIMx_CH2_PIN;
GPIO_InitStructure.GPIO_Alternate = TIMx_CH2_AF;
GPIO_InitPeripheral(TIMx_CH2_GPIO, &GPIO_InitStructure);
/* TIMx CH3 */
GPIO_InitStructure.Pin = TIMx_CH3_PIN;
GPIO_InitStructure.GPIO_Alternate = TIMx_CH3_AF;
GPIO_InitPeripheral(TIMx_CH3_GPIO, &GPIO_InitStructure);
/* TIMx CH4 */
GPIO_InitStructure.Pin = TIMx_CH4_PIN;
GPIO_InitStructure.GPIO_Alternate = TIMx_CH4_AF;
GPIO_InitPeripheral(TIMx_CH4_GPIO, &GPIO_InitStructure);
四路引脚与复用号来自 inc/main.h 的 TIMx_CH1_*~TIMx_CH4_* 宏,换板要一起核对。
2. 时基决定 PWM 周期。 计数时钟按 SystemCoreClock / 16000000 分频到 16 MHz,自动重装值取 1200,PWM 周期即为 1201 个计数。
/* Compute the prescaler value */
PrescalerValue = (uint32_t)(SystemCoreClock / 16000000) - 1;
/* Time base configuration */
TIM_InitTimBaseStruct(&TIM_TimeBaseStructure);
TIM_TimeBaseStructure.Period = 1200;
TIM_TimeBaseStructure.Prescaler = PrescalerValue;
TIM_TimeBaseStructure.ClkDiv = TIM_CLK_DIV1;
TIM_TimeBaseStructure.CounterMode = TIM_CNT_MODE_UP;
TIM_InitTimeBase(TIMx, &TIM_TimeBaseStructure);
改 PWM 频率时改除数或 Period,占空比由各通道比较值与 Period 之比决定。
3. 通道用 PWM1 模式并打开预装载。 四路共用结构体,以 CH1 为例设置 PWM1 模式、输出使能与极性后使能通道,并打开该通道的输出比较预装载。
/* PWM1 Mode configuration: Channel1 */
TIM_InitOcStruct(&TIM_OCInitStructure);
TIM_OCInitStructure.OCMode = TIM_OCMODE_PWM1;
TIM_OCInitStructure.OutputState = TIM_OUTPUT_STATE_ENABLE;
TIM_OCInitStructure.Pulse = CCR1_Val;
TIM_OCInitStructure.OCPolarity = TIM_OC_POLARITY_HIGH;
TIM_InitOc1(TIMx, &TIM_OCInitStructure);
TIM_ConfigOc1Preload(TIMx, TIM_OC_PRE_LOAD_ENABLE);
改某一路占空比时改对应 CCRx_Val;打开预装载后,运行中写入的新比较值在下一个更新事件生效。
4. 自动重装载预装载与启动。 最后使能自动重装载预装载,让 Period 的改动也在更新事件生效,再启动计数。
TIM_ConfigArPreload(TIMx, ENABLE);
/* TIMx enable counter */
TIM_Enable(TIMx, ENABLE);
自动重装载预装载使能后,改 Period 不会立刻截断当前周期,适合运行中调整 PWM 频率。
对应源码: src/main.c、inc/main.h
5.20.3.16 TimeBasic6_BTIM_wakeup 基本定时器唤醒 STOP
工程目录: projects/n32g41x_EVAL/examples/TIM/TimeBasic6_BTIM_wakeup/
使能 GPIO 与 BTIM1 时钟→配置 PA7 为推挽输出→把 EXTI 线 20 配成上升沿并使能 BTIM1 中断→配置 BTIM1 时基、选 LSI 作时钟源并打开更新中断→主循环延时后进入 STOP,被更新中断唤醒再翻转 PA7
| 项目 | 源码解读 |
|---|---|
| 功能 | BTIM1 以 LSI 为时钟源产生周期更新中断,该中断经 EXTI 线 20 把 MCU 从 STOP 模式唤醒; 每次唤醒后主循环翻转 PA7(评估板 LED D2),形成闪烁。 |
| 源码组成 | src/main.c:main、RCC_Configuration、GPIO_Configuration、NVIC_Configuration、TIM_Configuration;inc/main.h:包含 GPIO、TIM、RCC、PWR、EXTI 与延时相关头文件并声明上述函数;src/n32g41x_it.c、inc/n32g41x_it.h:中断服务函数 BTIM1_IRQHandler;readme.txt:功能、环境与使用说明;MDK-ARM/、EWARM/:Keil 与 IAR 工程。 |
| 关键配置 | PA7 为 GPIO_MODE_OUTPUT_PP。NVIC_Configuration 把 EXTI_LINE20 配成 EXTI_Mode_Interrupt、EXTI_Trigger_Rising 并使能,同时使能 BTIM1_IRQn;TIM_Configuration 中 Period 为 3200、Prescaler 为 0、ClkDiv 为 TIM_CLK_DIV1、计数向上,并使能 TIM_INT_UPDATE;main 用 RCC_ConfigBtim1Clk(RCC_BTIM1_CLKSEL_LSI) 把 BTIM1 时钟源选为 LSI。 |
| 程序与数据路径 | main 配置时钟、GPIO 与 NVIC,调用 TIM_Configuration 建立 BTIM1 时基并使能更新中断,再用 RCC_ConfigBtim1Clk 选 LSI 源并启动计数;主循环用 SysTick_Delay_Ms(500) 等待,用 PWR_EnterSTOPMode(WFI 方式)进入 STOP,等系统时钟切回 PLL 后用 GPIO_TogglePin 翻转 PA7;更新中断经 EXTI 线 20 进入 BTIM1_IRQHandler,清除两个挂起标志。 |
| 主要 API | TIM_InitTimBaseStruct、TIM_InitTimeBase、TIM_ConfigInt、TIM_Enable、RCC_ConfigBtim1Clk、EXTI_InitPeripheral、EXTI_GetStatusFlag、EXTI_ClrITPendBit、PWR_EnterSTOPMode、RCC_GetSysclkSrc、GPIO_TogglePin、GPIO_InitPeripheral、SysTick_Delay_Ms |
| 验证方法 | 编译下载后复位运行,评估板 LED(D2,即 PA7)周期闪烁; 闪烁由 STOP 唤醒驱动,进入 STOP 期间系统时钟为 LSI。 |
| 使用提示 | STOP 模式下系统时钟为 LSI,BTIM1 依靠 LSI 时钟源保持运行; EXTI 线 20(BTIM1)只支持上升沿触发。 评估板的 PA9、PA10 默认接 NSLINK 虚拟串口,不用串口时须拔掉跳线帽。 支持 N32G412x8L7、N32G412xBL7、N32G415x8L7、N32G415xBL7; 开发环境为 KEIL MDK-ARM 5.34 或 IAR EWARM 8.50.1。 |
核心代码解读与移植
示例把 BTIM1 的更新中断接到 EXTI 线 20,主循环进入 STOP 后由该中断唤醒,再把 LED 引脚翻转一次。
数据路径: TIM_Configuration 建立 BTIM1 时基并开更新中断 → RCC_ConfigBtim1Clk 选 LSI 源 → PWR_EnterSTOPMode 进入 STOP → 更新中断经 EXTI 线 20 触发 BTIM1_IRQHandler → GPIO_TogglePin 翻转 PA7
1. 选 LSI 时钟源并启动定时器。 BTIM1 先建立时基与更新中断,随后把时钟源切到 LSI;只有时钟源为 LSI 或 LSE 时,更新中断才能把 MCU 从 STOP 唤醒。
/* Reconfig TIM6 */
TIM_Configuration();
RCC_ConfigBtim1Clk(RCC_BTIM1_CLKSEL_LSI);
/* TIM6 enable counter */
TIM_Enable(BTIM1, ENABLE);
换用 LSE 作唤醒源时改这里的时钟选择宏,并确认对应时钟已被使能。
2. 把更新中断接到 EXTI 线 20。 使能中断前先清 EXTI 线 20 的标志,再把它配成上升沿中断;BTIM1 的中断通道与这条 EXTI 线共用同一个向量。
/* Enable the BTIM1 Interrupt (IRQ20, shared with EXTI Line 20) */
EXTI_ClrStatusFlag(EXTI_LINE20);
EXTI_Struct.EXTI_Line = EXTI_LINE20;
EXTI_Struct.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_Struct.EXTI_Trigger = EXTI_Trigger_Rising;
EXTI_Struct.EXTI_LineCmd = ENABLE;
EXTI_InitPeripheral(&EXTI_Struct);
EXTI 线 20 只支持上升沿触发,触发边沿不由软件改选;移植时不要把它配成下降沿或双边沿。
3. BTIM1 时基与更新中断。 时基结构体设 Period 为 3200、Prescaler 为 0,建立后先清更新标志再打开更新中断,避免残留标志导致首次误进中断。
/* Time base configuration */
TIM_InitTimBaseStruct(&TIM_TimeBaseStructure);
TIM_TimeBaseStructure.Period = 3200;
TIM_TimeBaseStructure.Prescaler = 0;
TIM_TimeBaseStructure.ClkDiv = TIM_CLK_DIV1;
TIM_TimeBaseStructure.CounterMode = TIM_CNT_MODE_UP;
TIM_InitTimeBase(BTIM1, &TIM_TimeBaseStructure);
/* Clear update interrupt flag before enabling */
TIM_ClrIntPendingBit(BTIM1, TIM_INT_UPDATE);
/* Enable BTIM1 update interrupt */
TIM_ConfigInt(BTIM1, TIM_INT_UPDATE, ENABLE);
LSI 为时钟源时 TIMx_CNT 不支持写入,Period 与 Prescaler 决定唤醒周期。
4. 进入 STOP 并等待唤醒。 主循环延时后进入 STOP,被更新中断唤醒后先等待系统时钟切回 PLL,再翻转 LED 引脚。
while (1)
{
SysTick_Delay_Ms(500);
/* Enter STOP mode */
PWR_EnterSTOPMode(PWR_STOPENTRY_WFI);
/* Wait PLL ready, check sysclk source */
while(RCC_GetSysclkSrc() != RCC_CFG_SCLKSTS_PLL)
{
if(--timeout == 0)
{
break;
}
}
GPIO_TogglePin(GPIOA, GPIO_PIN_7);
}
唤醒后系统时钟为 LSI,必须先切回 PLL 才能按预想频率继续运行;这段等待循环带超时保护,移植时可保留。
5. 中断里清两个标志。 确认 EXTI 线 20 置位后,先清 BTIM1 的更新标志,再清 EXTI 挂起位,两个标志缺一都会反复进中断。
if(EXTI_GetStatusFlag(EXTI_LINE20) != RESET)
{
TIM_ClrIntPendingBit(BTIM1, TIM_INT_UPDATE);
EXTI_ClrITPendBit(EXTI_LINE20);
}
对应源码: src/main.c、src/n32g41x_it.c
5.20.3.17 TimeBasic_cc 输出比较定时
工程目录: projects/n32g41x_EVAL/examples/TIM/TimeBasic_cc/
使能 GPIO 与 GTIM1 时钟→配置 PB0~PB3 为推挽输出→建立时基并用独立分频到 16 MHz,四通道设为输出比较定时模式→打开 CC1~CC4 中断并启动计数器→比较匹配进入中断后翻转对应引脚并累加比较值
| 项目 | 源码解读 |
|---|---|
| 功能 | GTIM1 的 CH1~CH4 工作在输出比较定时模式,各自比较值到达时产生中断; 中断里翻转对应 PB 引脚并把比较值累加一个固定量,形成周期可控的方波。 |
| 源码组成 | src/main.c:main、RCC_Configuration、GPIO_Configuration、NVIC_Configuration;inc/main.h:包含 GPIO、TIM、RCC 与 misc 头文件并声明上述函数;src/n32g41x_it.c、inc/n32g41x_it.h:中断服务函数 GTIM1_IRQHandler 与 CCRx_Val 累加;readme.txt:功能、环境与使用说明;MDK-ARM/、EWARM/:Keil 与 IAR 工程。 |
| 关键配置 | 定时器为 GTIM1,PB0、PB1、PB2、PB3 均为 GPIO_MODE_OUTPUT_PP。Period 为 0xFFFFFFFF、时基 Prescaler 为 0,另用 TIM_ConfigPrescaler 以 SystemCoreClock / 16000000 的值做 16 MHz 分频、重装模式 TIM_PSC_RELOAD_MODE_IMMEDIATE;四通道 OCMode 为 TIM_OCMODE_TIMING、输出使能、极性 TIM_OC_POLARITY_HIGH,Pulse 依次为 40961、27309、13654、6826,预装载均关闭。 |
| 程序与数据路径 | main 完成时钟、GPIO、NVIC 配置后建立时基并用 TIM_ConfigPrescaler 设定 16 MHz 分频,TIM_InitOc1~TIM_InitOc4 把四通道设为定时比较模式;随后 TIM_ConfigInt 打开 CC1~CC4 中断、TIM_Enable 启动;每次比较匹配进入 GTIM1_IRQHandler,清标志后用 GPIO_WriteBit 翻转对应 PB 引脚,并用 TIM_GetCapx 读回比较值、TIM_SetCmpx 写入其与 CCRx_Val 之和。 |
| 主要 API | TIM_InitTimBaseStruct、TIM_InitTimeBase、TIM_ConfigPrescaler、TIM_InitOcStruct、TIM_InitOc1~TIM_InitOc4、TIM_ConfigInt、TIM_Enable、TIM_GetIntStatus、TIM_GetCap1、TIM_SetCmp1、GPIO_WriteBit、GPIO_ReadOutputDataBit、GPIO_InitStruct、GPIO_InitPeripheral |
| 验证方法 | 用示波器或逻辑分析仪观察 PB0~PB3:每路在达到各自比较值后翻转,比较值随之累加; 翻转周期由 CCRx_Val 与 16 MHz 计数时钟决定。 |
| 使用提示 | 开发板 PA9、PA10 默认接 NSLINK 虚拟串口,不用串口时须拔掉跳线帽。 支持 N32G412x8L7、N32G412xBL7、N32G415x8L7、N32G415xBL7; 开发环境为 KEIL MDK-ARM 5.34 或 IAR EWARM 8.50.1。 |
核心代码解读与移植
示例用独立的分频配置把计数器时钟设为 16 MHz,四路输出比较定时触发中断,由软件翻转引脚并推进比较值。
数据路径: GPIO_Configuration 把 PB0~PB3 配成推挽输出 → TIM_InitTimeBase 与 TIM_ConfigPrescaler 建立 16 MHz 计数 → TIM_InitOc1~TIM_InitOc4 设为定时比较 → GTIM1_IRQHandler 翻转 PB 引脚并累加比较值 → 示波器在 PB0~PB3 观察
1. 四路引脚先配成推挽输出。 四个引脚用同一条语句一次配好,GPIO_MODE_OUTPUT_PP 决定输出类型,供中断里软件翻转。
/* PB0, PB1, PB2, PB3 as output */
GPIO_InitStructure.Pin = GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3;
GPIO_InitStructure.GPIO_Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitPeripheral(GPIOB, &GPIO_InitStructure);
移植到别的引脚时同步修改引脚组合与端口名。
2. 时基与独立分频。 先算出 16 MHz 对应的分频值,时基里 Period 取满量程,再用 TIM_ConfigPrescaler 以立即重装模式把分频值写入。
/* Compute the prescaler value */
PrescalerValue = (uint16_t)(SystemCoreClock / 16000000) - 1;
/* Time base configuration */
TIM_InitTimBaseStruct(&TIM_TimeBaseStructure);
TIM_TimeBaseStructure.Period = 0xFFFFFFFF;
TIM_TimeBaseStructure.Prescaler = 0;
TIM_TimeBaseStructure.ClkDiv = TIM_CLK_DIV1;
TIM_TimeBaseStructure.CounterMode = TIM_CNT_MODE_UP;
TIM_InitTimeBase(GTIM1, &TIM_TimeBaseStructure);
/* Prescaler configuration */
TIM_ConfigPrescaler(GTIM1, PrescalerValue, TIM_PSC_RELOAD_MODE_IMMEDIATE);
分频值决定比较值的时间分辨率,改 16 MHz 的除数即可改变所有通道的翻转速率。
3. 通道用定时比较模式。 四路共用结构体,以 CH1 为例,OCMode 取 TIM_OCMODE_TIMING、写入 CCR1_Val 后使能,并关闭预装载。
/* Output Compare Timing Mode configuration: Channel1 */
TIM_InitOcStruct(&TIM_OCInitStructure);
TIM_OCInitStructure.OCMode = TIM_OCMODE_TIMING;
TIM_OCInitStructure.OutputState = TIM_OUTPUT_STATE_ENABLE;
TIM_OCInitStructure.Pulse = CCR1_Val;
TIM_OCInitStructure.OCPolarity = TIM_OC_POLARITY_HIGH;
TIM_InitOc1(GTIM1, &TIM_OCInitStructure);
TIM_ConfigOc1Preload(GTIM1, TIM_OC_PRE_LOAD_DISABLE);
改某一路的翻转速率时改对应 CCRx_Val;预装载关闭后,中断里写入的比较值立即生效。
4. 开中断、启动并在中断里翻转。 打开 CC1~CC4 中断后启动计数;每次比较匹配进入 GTIM1_IRQHandler,清标志、翻转 PB 引脚并把比较值向前推一个固定量。
/* TIM IT enable */
TIM_ConfigInt(GTIM1, TIM_INT_CC1 | TIM_INT_CC2 | TIM_INT_CC3 | TIM_INT_CC4, ENABLE);
/* GTIM1 enable counter */
TIM_Enable(GTIM1, ENABLE);
if (TIM_GetIntStatus(GTIM1, TIM_INT_CC1) != RESET)
{
TIM_ClrIntPendingBit(GTIM1, TIM_INT_CC1);
/* Pin PB0 toggling */
GPIO_WriteBit(GPIOB, GPIO_PIN_0, (Bit_OperateType)(1 - GPIO_ReadOutputDataBit(GPIOB, GPIO_PIN_0)));
capture = TIM_GetCap1(GTIM1);
TIM_SetCmp1(GTIM1, capture + CCR1_Val);
}
另外三路是同样写法的分支,只是通道号与引脚号递增;改哪一路的引脚,就在对应分支里改 GPIO_PIN_x。
对应源码: src/main.c、src/n32g41x_it.c
5.20.3.18 TimeBasic_update 更新中断定时
工程目录: projects/n32g41x_EVAL/examples/TIM/TimeBasic_update/
使能 GPIO 与 ATIM1 时钟→配置 PB0 为推挽输出→建立 ATIM1 时基、写入分频并打开更新中断→启动计数器,每次更新中断翻转 PB0
| 项目 | 源码解读 |
|---|---|
| 功能 | ATIM1 打开更新中断,计数器每次溢出产生更新事件,中断里翻转 PB0 引脚,形成固定周期的方波。 |
| 源码组成 | src/main.c:main、RCC_Configuration、GPIO_Configuration、NVIC_Configuration、TIM_Configuration;inc/main.h:包含 GPIO、TIM、RCC 与 misc 头文件并声明上述函数;src/n32g41x_it.c、inc/n32g41x_it.h:中断服务函数 ATIM1_UP_IRQHandler;readme.txt:功能、环境与使用说明;MDK-ARM/、EWARM/:Keil 与 IAR 工程。 |
| 关键配置 | ATIM1 时钟来自 RCC_APB2_PERIPH_ATIM1;PB0 为 GPIO_MODE_OUTPUT_PP;中断通道为 ATIM1_UP_IRQn,抢占优先级 1、子优先级 0;Period 为 65535、Prescaler 为 0、ClkDiv 为 TIM_CLK_DIV1、计数向上,TIM_ConfigPrescaler 以值 0 与 TIM_PSC_RELOAD_MODE_IMMEDIATE 写入,并使能 TIM_INT_UPDATE。 |
| 程序与数据路径 | main 完成时钟、GPIO、NVIC 配置后调用 TIM_Configuration 建立时基、写入分频、打开更新中断并启动计数;每次更新事件进入 ATIM1_UP_IRQHandler,清除更新标志后用 GPIO_WriteBit 翻转 PB0。 |
| 主要 API | TIM_InitTimBaseStruct、TIM_InitTimeBase、TIM_ConfigPrescaler、TIM_ConfigInt、TIM_Enable、TIM_GetIntStatus、TIM_ClrIntPendingBit、GPIO_WriteBit、GPIO_ReadOutputDataBit、GPIO_InitStruct、GPIO_InitPeripheral |
| 验证方法 | 用示波器或逻辑分析仪观察 PB0:运行后 PB0 在每个更新周期翻转一次,方波周期为更新周期的两倍,由 Period 与 ATIM1 计数时钟决定。 |
| 使用提示 | 开发板 PA9、PA10 默认接 NSLINK 虚拟串口,不用串口时须拔掉跳线帽。 支持 N32G412x8L7、N32G412xBL7、N32G415x8L7、N32G415xBL7; 开发环境为 KEIL MDK-ARM 5.34 或 IAR EWARM 8.50.1。 |
核心代码解读与移植
示例用 ATIM1 的更新中断驱动 PB0 翻转,除时基与中断使能外没有其它外设参与。
数据路径: RCC_Configuration 打开 ATIM1 时钟 → TIM_Configuration 建立时基、写分频并开更新中断 → TIM_Enable 启动计数 → 更新事件进入 ATIM1_UP_IRQHandler → GPIO_WriteBit 翻转 PB0
1. PB0 配置成推挽输出。 只用一只引脚输出方波,配置成普通推挽输出即可,由中断里的软件翻转产生波形。
/* PB0 as output */
GPIO_InitStructure.Pin = GPIO_PIN_0;
GPIO_InitStructure.GPIO_Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitPeripheral(GPIOB, &GPIO_InitStructure);
2. ATIM1 挂在 APB2 上。 高级定时器 ATIM1 的时钟走 APB2 总线,与普通定时器挂在 APB1 上的取法不同,换用别的定时器时要按总线改宏。
/* Enable GPIO clock */
RCC_EnableAHBPeriphClk(RCC_AHB_PERIPH_GPIO, ENABLE);
/* Enable ATIM1 clock */
RCC_EnableAPB2PeriphClk(RCC_APB2_PERIPH_ATIM1, ENABLE);
3. 时基、分频与更新中断。 时基设 Period 为 65535、Prescaler 为 0,建立后用 TIM_ConfigPrescaler 以立即重装模式写入分频值,再打开更新中断并启动计数。
/* Time base configuration */
TIM_InitTimBaseStruct(&TIM_TimeBaseStructure);
TIM_TimeBaseStructure.Period = 65535;
TIM_TimeBaseStructure.Prescaler = 0;
TIM_TimeBaseStructure.ClkDiv = TIM_CLK_DIV1;
TIM_TimeBaseStructure.CounterMode = TIM_CNT_MODE_UP;
TIM_InitTimeBase(ATIM1, &TIM_TimeBaseStructure);
/* Prescaler configuration */
TIM_ConfigPrescaler(ATIM1, PrescalerValue, TIM_PSC_RELOAD_MODE_IMMEDIATE);
/* ATIM1 enable update irq */
TIM_ConfigInt(ATIM1, TIM_INT_UPDATE, ENABLE);
/* ATIM1 enable counter */
TIM_Enable(ATIM1, ENABLE);
改方波频率时改 Period 与分频值;更新中断在计数器溢出时触发。
4. 中断向量要对上定时器。 高级定时器的更新中断通道是 ATIM1_UP_IRQn,抢占优先级与子优先级在此一起写入。
/* Enable the ATIM1 Interrupt */
NVIC_InitStructure.NVIC_IRQChannel = ATIM1_UP_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
5. 中断里翻转 PB0。 确认更新标志置位后先清标志,再用读回输出电平取反的方式翻转 PB0。
if (TIM_GetIntStatus(ATIM1, TIM_INT_UPDATE) != RESET)
{
TIM_ClrIntPendingBit(ATIM1, TIM_INT_UPDATE);
/* PB0 toggle */
GPIO_WriteBit(GPIOB, GPIO_PIN_0, (Bit_OperateType)(1 - GPIO_ReadOutputDataBit(GPIOB, GPIO_PIN_0)));
}
对应源码: src/main.c、src/n32g41x_it.c
5.20.4 注意与排障
| 场景 | 检查与建议 | 来源 |
|---|---|---|
| 更新事件与预装载 | PWM 或输出比较要使预加载寄存器生效,必须置位相应的 TIMx_CCMODx.OCxPEN,自动重装预加载由 TIMx_CTRL1.ARPEN 控制;预加载值只在更新事件时转移到影子寄存器,因此须在计数器开始计数前用软件产生一次更新来复位所有寄存器。 |
用户手册 |
| 运行中更新比较值 | 未使能预装载寄存器时,可随时写 TIMx_CCDATx 更新输出波形;若使能了预装载,则写入值要等到下一次更新事件才转入影子寄存器。 |
用户手册 |
| 中央对齐模式 | 计数器运行时不允许从边缘对齐切换到中央对齐,也不要在中央对齐模式下写计数器; 不要同时更改 TIMx_CTRL1.DIR 与 CAMSEL 位。 |
用户手册 |
| PWM 输入模式的通道限制 | PWM 输入模式只支持 TIMx_CH1、TIMx_CH2 两个信号,因为只有 TI1FP1 与 TI2FP2 接到从模式控制器。 |
用户手册 |
| BTIM1 唤醒 STOP 的条件 | BTIM1 时钟源配置为 LSI 或 LSE 时,才能通过更新中断(重定向到 EXTI 20)唤醒 STOP 模式。 | 用户手册 |
| LSI 作时钟源时写计数器 | 时钟源配置为 LSI 时,TIMx_CNT 不支持写入。 |
用户手册 |
| 编码器与外部时钟的互斥 | 编码器模式和外部时钟模式 2 不兼容,不能同时选择。 | 用户手册 |
N32G412、N32G415 系列勘误手册 V1.0.0(2026.6.30)的勘误列表只列出一行 A 版芯片条目,且该行的勘误链接列为空,未列出任何 TIM 相关条目。