当前位置:文档之家› 对应定时器配置

对应定时器配置

对应定时器配置
对应定时器配置

#include "drv_rcc.h"

#include "drv_timer.h"

/**

* @brief 复位定时器外设寄存器为默认值.

* @param pTimer: 要操作的定时器外设,可以是TIM1 ~ TIM14.

* @retval 无

*/

void drv_timer_deinit( TimerType *pTimer )

{

if( pTimer == TIM1 )

{

drv_rcc_apb2_periph_reset_enable( RCC_APB2RSTR_TIM1RST );

drv_rcc_apb2_periph_reset_disable( RCC_APB2RSTR_TIM1RST );

}

else if( pTimer == TIM2 )

{

drv_rcc_apb1_periph_reset_enable( RCC_APB1RSTR_TIM2RST );

drv_rcc_apb1_periph_reset_disable( RCC_APB1RSTR_TIM2RST );

}

else if( pTimer == TIM3 )

{

drv_rcc_apb1_periph_reset_enable( RCC_APB1RSTR_TIM3RST );

drv_rcc_apb1_periph_reset_disable( RCC_APB1RSTR_TIM3RST );

}

else if( pTimer == TIM4 )

{

drv_rcc_apb1_periph_reset_enable( RCC_APB1RSTR_TIM4RST );

drv_rcc_apb1_periph_reset_disable( RCC_APB1RSTR_TIM4RST );

}

else if( pTimer == TIM6 )

{

drv_rcc_apb1_periph_reset_enable( RCC_APB1RSTR_TIM6RST );

drv_rcc_apb1_periph_reset_disable( RCC_APB1RSTR_TIM6RST );

}

else if( pTimer == TIM7 )

{

drv_rcc_apb1_periph_reset_enable( RCC_APB1RSTR_TIM7RST );

drv_rcc_apb1_periph_reset_disable( RCC_APB1RSTR_TIM7RST );

}

else if( pTimer == TIM8 )

{

drv_rcc_apb2_periph_reset_enable( RCC_APB2RSTR_TIM8RST );

drv_rcc_apb2_periph_reset_disable( RCC_APB2RSTR_TIM8RST );

}

else if( pTimer == TIM15 )

{

drv_rcc_apb2_periph_reset_enable( RCC_APB2RSTR_TIM15RST );

drv_rcc_apb2_periph_reset_disable( RCC_APB2RSTR_TIM15RST );

}

else if( pTimer == TIM16 )

{

drv_rcc_apb2_periph_reset_enable( RCC_APB2RSTR_TIM16RST );

drv_rcc_apb2_periph_reset_disable( RCC_APB2RSTR_TIM16RST );

}

else

{

if( pTimer == TIM17 )

{

drv_rcc_apb2_periph_reset_enable( RCC_APB2RSTR_TIM17RST );

drv_rcc_apb2_periph_reset_disable( RCC_APB2RSTR_TIM17RST );

}

}

}

/**

* @brief 定时器基本功能初始化

* @param pTimer: 定时器TIM1~TIM14

* @param TimeClk: 定时器计数时钟频率,最低5000Hz,等于0时为不分频

* @param TimePeriod: 定时器周期

* @param TimeCntMode: 定时器计数模式,见类型enumTimeCntModeType

* @retval 无

*

*/

void drv_timer_base_init( TimerType *pTimer, UINT32 TimeClk, UINT32 TimePeriod, enumTimerCntModeType TimeCntMode )

{

UINT32 l_timer_clk_freq;

if( TimeClk == 0 )

{

pTimer->PSC = 0; //定时器不分频

}

else

{

if (( pTimer == TIM1 ) || ( pTimer == TIM8 ) || ( pTimer == TIM15 ) || ( pTimer ==

TIM16 ) || ( pTimer == TIM17 ))

{

l_timer_clk_freq = g_ClockFrequency.Apb2TimerClkFreq;

}

else

{

l_timer_clk_freq = g_ClockFrequency.Apb1TimerClkFreq;

}

pTimer->PSC = l_timer_clk_freq / TimeClk - 1; //分频系数

}

// 定时器基本参数配置

pTimer->CR1.bit.CKD = (UINT16)TIM_CKD_DIV1; //滤波分频

pTimer->CR1.bit.DIR = (UINT16)TimeCntMode; //计数模式

pTimer->ARR = TimePeriod - 1; //重载值

pTimer->SR.all = 0x0000; //清状态寄存器所有标志位

pTimer->CR1.bit.CEN = 0; //不允许计数

}

/**

* @brief 设置定时器计数模式.

* @param pTimer: 定时器,可以是TIM1~5,TIM8.

* @param CounterMode: 计数模式,见类型enumTimerCntModeType

* @retval 无

*/

void drv_timer_set_counter_mode( TimerType *pTimer, enumTimerCntModeType CounterMode )

{

pTimer->CR1.bit.DIR = (UINT16)CounterMode;

}

/**

* @brief 设置定时器计数值

* @param pTimer: 定时器TIM1~TIM14

* @param Counter: 要设置的定时器值

* @retval 无

*/

void drv_timer_set_counter( TimerType *pTimer, UINT32 Counter )

{

pTimer->CNT = Counter;

}

/**

* @brief 获取定时器计数值

* @param pTimer: 定时器TIM1~TIM14

* @retval 计数器值

*/

UINT32 drv_timer_get_counter( TimerType *pTimer )

{

UINT32 l_Value = 0;

l_Value = ((UINT32)pTimer->CNT) & 0x7FFFFFFF ;

return ( l_Value );

}

/**

* @brief 设置定时器自动装载值

* @param pTimer: 定时器TIM1~TIM14

* @param Period: 自动装载值

* @retval 无

*/

void drv_timer_set_arr( TimerType *pTimer, UINT32 Arr )

{

pTimer->ARR = Arr;

}

/**

* @brief 获取自动装载值

* @param pTimer: 定时器TIM1~TIM14

* @param Period: 自动装载值

* @retval 无

*/

UINT32 drv_timer_get_arr( TimerType *pTimer )

{

return ((UINT32)( pTimer->ARR));

}

/**

* @brief 设置定时器预分频系数

* @param pTimer: 定时器TIM1~TIM14

* @param Presc: 分频系数理论最大为65535,TimeClock = SysClock / Psc + 1 * @retval 无

*/

void drv_timer_set_psc( TimerType *pTimer, UINT16 Psc )

{

pTimer->PSC = Psc; // 写入预分频系数}

/**

* @brief 使能定时器自动重装模式

* @param pTimer: 定时器TIM1~TIM14

* @retval 无

*/

void drv_timer_auto_reload_enable( TimerType *pTimer )

{

pTimer->CR1.bit.ARPE = 1;

}

/**

* @brief 禁止定时器自动重装模式

* @param pTimer: 定时器TIM1~TIM14

* @retval 无

*/

void drv_timer_auto_reload_disable( TimerType *pTimer )

{

pTimer->CR1.bit.ARPE = 0;

}

/**

* @brief 使能定时器更新

* @param pTimer: 定时器TIM1~TIM14

* @retval 无

*/

void drv_timer_update_enable( TimerType *pTimer )

{

pTimer->CR1.bit.UDIS = 0;

}

/**

* @brief 禁止定时器更新

* @param pTimer: 定时器TIM1~TIM14

* @retval 无

*/

void drv_timer_update_disable( TimerType *pTimer )

{

pTimer->CR1.bit.UDIS = 1;

}

/**

* @brief 设置定时器时钟分频值(定时器时钟与滤波器采样时钟比值).

* @param pTimer: 可以是TIM1~5和TIM8~14.

* @param Ckd: 分频值,0表示不分频,1表示二分频,2表示四分频,3无效.

* @retval 无

*/

void div_timer_set_div( TimerType *pTimer, UINT16 Ckd )

{

pTimer->CR1.bit.CKD = Ckd;

}

/**

* @brief 使能定时器.

* @param pTimer: 定时器TIM1~TIM14

* @retval 无

*/

void drv_timer_enable( TimerType *pTimer )

{

pTimer->CR1.bit.CEN = 1;

}

/**

* @brief 失能定时器.

* @param pTimer: 定时器TIM1~TIM14

* @retval 无

*/

void drv_timer_disable( TimerType *pTimer )

{

pTimer->CR1.bit.CEN = 0;

}

/**

* @brief 定时器输出通道1初始化

* @param pTimer: 定时器做PWM输出使用高级定时器:TIM1 TIM8 TIM20

* @param TimerOCMode: 输出通道输出模式,见类型enumTimerOCModeType

* @param TimerOCPolarity: 输出通道有效极性,见类型enumTimerOCPolarityType

* @param TimerOCIdleStatus: 输出通道空闲时状态,类型enumTimerOCIdleStatusType

* @retval 无

*/

void drv_timer_oc1_init( TimerType *pTimer, enumTimerOCModeType TimerOCMode, enumTimerOCPolarityType TimerOCPolarity, enumTimerOCIdleStatusType TimerOCIdleStatus ) {

if( ( pTimer == TIM1 ) || ( pTimer == TIM8 ) || ( pTimer == TIM20 ))

{

pTimer->BDTR.bit.MOE = 1; //主输出使能,高级定时器必须配置

}

pTimer->CCMR1.bit_o.OC1PE = 1; //预装载使能

pTimer->CCMR1.bit_https://www.doczj.com/doc/6710771419.html,1S = 0; //配置为输出

pTimer->CCMR1.bit_o.OC1M = TimerOCMode; //输出模式

pTimer->CR2.bit.OIS1 = TimerOCIdleStatus; //输出空闲状态

pTimer->https://www.doczj.com/doc/6710771419.html,1P = TimerOCPolarity; //有效极性

pTimer->CCR1 = 0; //输出比较值

}

/**

* @brief 定时器输出通道1互补通道初始化

* @param pTimer: 定时器做PWM输出使用高级定时器:TIM1 TIM8 TIM20

* @param TimerOCMode: 输出通道输出模式,见类型enumTimerOCModeType

* @param TimerOCNPolarity: 互补输出通道有效极性,见类型enumTimerOCPolarityType * @param TimerOCNIdleStatus: 互补通道输出时状态,类型enumTimerOCIdleStatusType * @retval 无

*/

void drv_timer_oc1n_init( TimerType *pTimer, enumTimerOCModeType TimerOCNMode, enumTimerOCPolarityType TimerOCNPolarity, enumTimerOCIdleStatusType TimerOCNIdleStatus )

{

if( ( pTimer == TIM1 ) || ( pTimer == TIM8 ) || ( pTimer == TIM20 ))

{

pTimer->BDTR.bit.MOE = 1; //主输出使能,高级定时器必须配置}

pTimer->CCMR1.bit_o.OC1PE = 1; //预装载使能

pTimer->CCMR1.bit_https://www.doczj.com/doc/6710771419.html,1S = 0; //配置为输出

pTimer->CCMR1.bit_o.OC1M = TimerOCNMode; //输出模式

pTimer->CR2.bit.OIS1N = TimerOCNIdleStatus; //输出空闲状态

pTimer->https://www.doczj.com/doc/6710771419.html,1NP = TimerOCNPolarity; //有效极性

pTimer->CCR1 = 0; //输出比较值

}

/**

* @brief 定时器输出通道2初始化

* @param pTimer: 定时器做PWM输出使用高级定时器:TIM1 TIM8 TIM20

* @param TimerOCMode: 输出通道输出模式,见类型enumTimerOCModeType

* @param TimerOCPolarity: 输出通道有效极性,见类型enumTimerOCPolarityType

* @param TimerOCIdleStatus: 输出通道空闲时状态,类型enumTimerOCIdleStatusType

* @retval 无

*/

void drv_timer_oc2_init( TimerType *pTimer, enumTimerOCModeType TimerOCMode,

enumTimerOCPolarityType TimerOCPolarity, enumTimerOCIdleStatusType TimerOCIdleStatus ) {

if( ( pTimer == TIM1 ) || ( pTimer == TIM8 ) || ( pTimer == TIM20 ))

{

pTimer->BDTR.bit.MOE = 1; //主输出使能,高级定时器必须配置}

pTimer->CCMR1.bit_o.OC2PE = 1; //预装载使能

pTimer->CCMR1.bit_https://www.doczj.com/doc/6710771419.html,2S = 0; //配置为输出

pTimer->CCMR1.bit_o.OC2M = TimerOCMode; //输出模式

pTimer->CR2.bit.OIS2 = TimerOCIdleStatus; //输出空闲状态

pTimer->https://www.doczj.com/doc/6710771419.html,2P = TimerOCPolarity; //有效极性

pTimer->CCR2 = 0; //输出比较值

}

/**

* @brief 定时器输出通道2互补通道初始化

* @param pTimer: 定时器做PWM输出使用高级定时器:TIM1 TIM8 TIM20

* @param TimerOCMode: 输出通道输出模式,见类型enumTimerOCModeType

* @param TimerOCNPolarity: 互补输出通道有效极性,见类型enumTimerOCPolarityType * @param TimerOCNIdleStatus: 互补通道输出时状态,类型enumTimerOCIdleStatusType * @retval 无

*/

void drv_timer_oc2n_init( TimerType *pTimer, enumTimerOCModeType TimerOCNMode, enumTimerOCPolarityType TimerOCNPolarity, enumTimerOCIdleStatusType TimerOCNIdleStatus )

{

if( ( pTimer == TIM1 ) || ( pTimer == TIM8 ) || ( pTimer == TIM20 ))

{

pTimer->BDTR.bit.MOE = 1; //主输出使能,高级定时器必须配置}

pTimer->CCMR1.bit_o.OC2PE = 1; //预装载使能

pTimer->CCMR1.bit_https://www.doczj.com/doc/6710771419.html,2S = 0; //配置为输出

pTimer->CCMR1.bit_o.OC2M = TimerOCNMode; //输出模式

pTimer->CR2.bit.OIS2N = TimerOCNIdleStatus; //输出空闲状态

pTimer->https://www.doczj.com/doc/6710771419.html,2NP = TimerOCNPolarity; //有效极性

pTimer->CCR2 = 0; //输出比较值

}

/**

* @brief 定时器输出通道3初始化

* @param pTimer: 定时器做PWM输出使用高级定时器:TIM1 TIM8 TIM20

* @param TimerOCMode: 输出通道输出模式,见类型enumTimerOCModeType

* @param TimerOCPolarity: 输出通道有效极性,见类型enumTimerOCPolarityType

* @param TimerOCIdleStatus: 输出通道空闲时状态,类型enumTimerOCIdleStatusType

* @retval 无

*/

void drv_timer_oc3_init( TimerType *pTimer, enumTimerOCModeType TimerOCMode, enumTimerOCPolarityType TimerOCPolarity, enumTimerOCIdleStatusType TimerOCIdleStatus ) {

if( ( pTimer == TIM1 ) || ( pTimer == TIM8 ) || ( pTimer == TIM20 ))

{

pTimer->BDTR.bit.MOE = 1; //主输出使能,高级定时器必须配置}

pTimer->CCMR2.bit_o.OC3PE = 1; //预装载使能

pTimer->CCMR2.bit_https://www.doczj.com/doc/6710771419.html,3S = 0; //配置为输出

pTimer->CCMR2.bit_o.OC3M = TimerOCMode; //输出模式

pTimer->CR2.bit.OIS3 = TimerOCIdleStatus; //输出空闲状态

pTimer->https://www.doczj.com/doc/6710771419.html,3P = TimerOCPolarity; //有效极性

pTimer->CCR3 = 0; //输出比较值

}

/**

* @brief 定时器输出通道3互补通道初始化

* @param pTimer: 定时器做PWM输出使用高级定时器:TIM1 TIM8 TIM20

* @param TimerOCMode: 输出通道输出模式,见类型enumTimerOCModeType

* @param TimerOCNPolarity: 互补输出通道有效极性,见类型enumTimerOCPolarityType * @param TimerOCNIdleStatus: 互补通道输出时状态,类型enumTimerOCIdleStatusType * @retval 无

*/

void drv_timer_oc3n_init( TimerType *pTimer, enumTimerOCModeType TimerOCNMode, enumTimerOCPolarityType TimerOCNPolarity, enumTimerOCIdleStatusType TimerOCNIdleStatus )

{

if( ( pTimer == TIM1 ) || ( pTimer == TIM8 ) || ( pTimer == TIM20 ))

{

pTimer->BDTR.bit.MOE = 1; //主输出使能,高级定时器必须配置}

pTimer->CCMR2.bit_o.OC3PE = 1; //预装载使能

pTimer->CCMR2.bit_https://www.doczj.com/doc/6710771419.html,3S = 0; //配置为输出

pTimer->CCMR2.bit_o.OC3M = TimerOCNMode; //输出模式

pTimer->CR2.bit.OIS3N = TimerOCNIdleStatus; //输出空闲状态

pTimer->https://www.doczj.com/doc/6710771419.html,3NP = TimerOCNPolarity; //有效极性

pTimer->CCR3 = 0; //输出比较值

}

/**

* @brief 定时器输出通道3初始化

* @param pTimer: 定时器做PWM输出使用高级定时器:TIM1 TIM8 TIM20

* @param TimerOCMode: 输出通道输出模式,见类型enumTimerOCModeType

* @param TimerOCPolarity: 输出通道有效极性,见类型enumTimerOCPolarityType

* @param TimerOCIdleStatus: 输出通道空闲时状态,类型enumTimerOCIdleStatusType

* @retval 无

*/

void drv_timer_oc4_init( TimerType *pTimer, enumTimerOCModeType TimerOCMode, enumTimerOCPolarityType TimerOCPolarity, enumTimerOCIdleStatusType TimerOCIdleStatus ) {

if( ( pTimer == TIM1 ) || ( pTimer == TIM8 ) || ( pTimer == TIM20 ))

{

pTimer->BDTR.bit.MOE = 1; //主输出使能,高级定时器必须配置}

pTimer->CCMR2.bit_o.OC4PE = 1; //预装载使能

pTimer->CCMR2.bit_https://www.doczj.com/doc/6710771419.html,4S = 0; //配置为输出

pTimer->CCMR2.bit_o.OC4M = TimerOCMode; //输出模式

pTimer->CR2.bit.OIS4 = TimerOCIdleStatus; //输出空闲状态

pTimer->https://www.doczj.com/doc/6710771419.html,4P = TimerOCPolarity; //有效极性

pTimer->CCR4 = 0; //输出比较值

}

/**

* @brief 定时器输出通道4互补通道初始化

* @param pTimer: 定时器做PWM输出使用高级定时器:TIM1 TIM8 TIM20

* @param TimerOCMode: 输出通道输出模式,见类型enumTimerOCModeType

* @param TimerOCNPolarity: 互补输出通道有效极性,见类型enumTimerOCPolarityType * @retval 无

*/

void drv_timer_oc4n_init( TimerType *pTimer, enumTimerOCModeType TimerOCNMode, enumTimerOCPolarityType TimerOCNPolarity )

{

if( ( pTimer == TIM1 ) || ( pTimer == TIM8 ) || ( pTimer == TIM20 ))

{

pTimer->BDTR.bit.MOE = 1; //主输出使能,高级定时器必须配置}

pTimer->CCMR2.bit_o.OC4PE = 1; //预装载使能

pTimer->CCMR2.bit_https://www.doczj.com/doc/6710771419.html,4S = 0; //配置为输出

pTimer->CCMR2.bit_o.OC4M = TimerOCNMode; //输出模式

pTimer->https://www.doczj.com/doc/6710771419.html,4NP = TimerOCNPolarity; //有效极性

pTimer->CCR4 = 0; //输出比较值}

/**

* @brief 设置定时器通道1捕获比较值

* @param pTimer: 定时器TIM1~TIM14

* @param Compara1: 捕获比较值

* @retval 无

*/

void drv_timer_set_compara1( TimerType *pTimer, UINT32 Compara1 ) {

pTimer->CCR1 = Compara1;

}

/**

* @brief 设置定时器通道2捕获比较值

* @param pTimer: 定时器TIM1~TIM14

* @param Compara2: 捕获比较值

* @retval 无

*/

void drv_timer_set_compara2( TimerType *pTimer, UINT32 Compara2 ) {

pTimer->CCR2 = Compara2;

}

/**

* @brief 设置定时器通道3捕获比较值

* @param pTimer: 定时器TIM1~TIM14

* @param Compara3: 捕获比较值

* @retval 无

*/

void drv_timer_set_compara3( TimerType *pTimer, UINT32 Compara3 ) {

pTimer->CCR3 = Compara3;

}

/**

* @brief 设置定时器通道4捕获比较值.

* @param pTimer: 定时器TIM1~TIM14

* @param Compara4: 捕获比较值

* @retval 无

*/

void drv_timer_set_compara4( TimerType *pTimer, UINT32 Compara4 ) {

pTimer->CCR4 = Compara4;

}

/**

* @brief 获取定时器通道1捕获比较值.

* @param pTimer: 定时器TIM1~TIM9 TIM14

* @retval 无

*/

UINT32 drv_timer_get_compara1( TimerType *pTimer ) {

return ( pTimer->CCR1 );

}

/**

* @brief 获取定时器通道2捕获比较值.

* @param pTimer: 定时器TIM1~TIM9 TIM14

* @retval 无

*/

UINT32 drv_timer_get_compara2( TimerType *pTimer ) {

return ( pTimer->CCR2 );

}

/**

* @brief 获取定时器通道3捕获比较值.

* @param pTimer: 定时器TIM1~TIM9 TIM14

* @retval 无

*/

UINT32 drv_timer_get_compara3( TimerType *pTimer ) {

return ( pTimer->CCR3 );

}

/**

* @brief 获取定时器通道4捕获比较值.

* @param pTimer: 定时器TIM1~TIM9 TIM14

* @retval 无

*/

UINT32 drv_timer_get_compara4( TimerType *pTimer ) {

return ( pTimer->CCR4 );

}

/**

* @brief 强制定时器输出1波形为有效电平(高电平). * @param pTimer: 定时器TIM1~TIM5 TIM8

* @retval 无

*/

void drv_timer_forced_oc1_active( TimerType* pTimer ) {

pTimer->CCMR1.bit_o.OC1M = 5;

}

/**

* @brief 强制定时器输出1波形为无效电平(低电平). * @param pTimer: 定时器TIM1~TIM5 TIM8

* @retval 无

*/

void drv_timer_forced_oc1_inactive( TimerType* pTimer ) {

pTimer->CCMR1.bit_o.OC1M = 4;

}

/**

* @brief 强制定时器输出2波形为有效电平(高电平). * @param pTimer: 定时器TIM1~TIM5 TIM8

* @retval 无

*/

void drv_timer_forced_oc2_active( TimerType* pTimer ) {

pTimer->CCMR1.bit_o.OC2M = 5;

}

/**

* @brief 强制定时器输出2波形为无效电平(低电平). * @param pTimer: 定时器TIM1~TIM5 TIM8

* @retval 无

*/

void drv_timer_forced_oc2_inactive( TimerType* pTimer ) {

pTimer->CCMR1.bit_o.OC2M = 4;

}

/**

* @brief 强制定时器输出3波形为有效电平(高电平). * @param pTimer: 定时器TIM1~TIM5 TIM8

* @retval 无

*/

void drv_timer_forced_oc3_active( TimerType* pTimer ) {

pTimer->CCMR2.bit_o.OC3M = 5;

}

/**

* @brief 强制定时器输出3波形为无效电平(低电平). * @param pTimer: 定时器TIM1~TIM5 TIM8

* @retval 无

*/

void drv_timer_forced_oc3_inactive( TimerType* pTimer ) {

pTimer->CCMR2.bit_o.OC3M = 4;

}

/**

* @brief 强制定时器输出4波形为有效电平(高电平). * @param pTimer: 定时器TIM1~TIM5 TIM8

* @retval 无

*/

void drv_timer_forced_oc4_active( TimerType* pTimer ) {

pTimer->CCMR2.bit_o.OC4M = 5;

}

/**

* @brief 强制定时器输出4波形为无效电平(低电平). * @param pTimer: 定时器TIM1~TIM5 TIM8

* @retval 无

*/

void drv_timer_forced_oc4_inactive( TimerType* pTimer ) {

pTimer->CCMR2.bit_o.OC4M = 4;

}

/**

* @brief 使能定时器CCR1预装载.

* @param pTimer: 定时器TIM1~TIM5和TIM8~TIM14. * @retval 无

*/

void drv_timer_ccr1_preload_enable( TimerType* pTimer ) {

pTimer->CCMR1.bit_o.OC1PE = 1;

}

/**

* @brief 禁止定时器CCR1预装载.

* @param pTimer: 定时器TIM1~TIM5和TIM8~TIM14. * @retval 无

*/

void drv_timer_ccr1_preload_disable( TimerType* pTimer ) {

pTimer->CCMR1.bit_o.OC1PE = 0;

}

/**

* @brief 使能定时器CCR2预装载.

* @param pTimer: 定时器TIM1~TIM5和TIM8~TIM14. * @retval 无

*/

void drv_timer_ccr2_preload_enable( TimerType* pTimer ) {

pTimer->CCMR1.bit_o.OC2PE = 1;

}

/**

* @brief 禁止定时器CCR2预装载.

* @param pTimer: 定时器TIM1~TIM5和TIM8~TIM14. * @retval 无

*/

void drv_timer_ccr2_preload_disable( TimerType* pTimer ) {

pTimer->CCMR1.bit_o.OC2PE = 0;

}

/**

* @brief 使能定时器CCR3预装载.

* @param pTimer: 定时器TIM1~TIM5和TIM8~TIM14. * @retval 无

*/

void drv_timer_ccr3_preload_enable( TimerType* pTimer ) {

pTimer->CCMR2.bit_o.OC3PE = 1;

}

/**

* @brief 禁止定时器CCR3预装载.

* @param pTimer: 定时器TIM1~TIM5和TIM8~TIM14.

* @retval 无

*/

void drv_timer_ccr3_preload_disable( TimerType* pTimer ) {

pTimer->CCMR2.bit_o.OC3PE = 0;

}

/**

* @brief 使能定时器CCR4预装载.

* @param pTimer: 定时器TIM1~TIM5和TIM8~TIM14. * @retval 无

*/

void drv_timer_ccr4_preload_enable( TimerType* pTimer ) {

pTimer->CCMR2.bit_o.OC4PE = 1;

}

/**

* @brief 禁止定时器CCR4预装载.

* @param pTimer: 定时器TIM1~TIM5和TIM8~TIM14. * @retval 无

*/

void drv_timer_ccr4_preload_disable( TimerType* pTimer ) {

pTimer->CCMR2.bit_o.OC4PE = 0;

}

/**

* @brief 配置定时器输出通道1输出极性为高电平有效. * @param pTimer: 定时器TIM1~TIM5和TIM8~TIM14. * @retval 无

*/

void drv_timer_set_oc1_polarity_high( TimerType* pTimer ) {

pTimer->https://www.doczj.com/doc/6710771419.html,1P = 1;

}

/**

* @brief 配置定时器输出通道1输出极性为低电平有效. * @param pTimer: 定时器TIM1~TIM5和TIM8~TIM14. * @retval 无

*/

void drv_timer_set_oc1_polarity_low( TimerType* pTimer ) {

pTimer->https://www.doczj.com/doc/6710771419.html,1P = 0;

}

/**

* @brief 配置定时器输出通道1N输出极性为高电平有效. * @param pTimer: 定时器TIM1~TIM5和TIM8~TIM14.

* @retval 无

*/

void drv_timer_set_oc1n_polarity_high( TimerType* pTimer ) {

pTimer->https://www.doczj.com/doc/6710771419.html,1NP = 1;

}

/**

* @brief 配置定时器输出通道1N输出极性为低电平有效. * @param pTimer: 定时器TIM1~TIM5和TIM8~TIM14.

* @retval 无

*/

void drv_timer_set_oc1n_polarity_low( TimerType* pTimer ) {

pTimer->https://www.doczj.com/doc/6710771419.html,1NP = 0;

}

/**

* @brief 配置定时器输出通道2输出极性为高电平有效. * @param pTimer: 定时器TIM1~TIM5和TIM8~TIM14.

* @retval 无

*/

void drv_timer_set_oc2_polarity_high( TimerType* pTimer ) {

pTimer->https://www.doczj.com/doc/6710771419.html,2P = 1;

}

/**

* @brief 配置定时器输出通道2输出极性为低电平有效. * @param pTimer: 定时器TIM1~TIM5和TIM8~TIM14.

* @retval 无

*/

void drv_timer_set_oc2_polarity_low( TimerType* pTimer ) {

pTimer->https://www.doczj.com/doc/6710771419.html,2P = 0;

}

/**

* @brief 配置定时器输出通道2N输出极性为高电平有效. * @param pTimer: 定时器TIM1~TIM5和TIM8~TIM14.

* @retval 无

*/

void drv_timer_set_oc2n_polarity_high( TimerType* pTimer ) {

pTimer->https://www.doczj.com/doc/6710771419.html,2NP = 1;

}

/**

* @brief 配置定时器输出通道2N输出极性为低电平有效. * @param pTimer: 定时器TIM1~TIM5和TIM8~TIM14.

* @retval 无

*/

void drv_timer_set_oc2n_polarity_low( TimerType* pTimer ) {

pTimer->https://www.doczj.com/doc/6710771419.html,2NP = 0;

}

/**

* @brief 配置定时器输出通道3输出极性为高电平有效. * @param pTimer: 定时器TIM1~TIM5和TIM8~TIM14.

* @retval 无

*/

void drv_timer_set_oc3_polarity_high( TimerType* pTimer ) {

pTimer->https://www.doczj.com/doc/6710771419.html,3P = 1;

}

/**

* @brief 配置定时器输出通道3输出极性为低电平有效. * @param pTimer: 定时器TIM1~TIM5和TIM8~TIM14.

* @retval 无

*/

void drv_timer_set_oc3_polarity_low( TimerType* pTimer ) {

pTimer->https://www.doczj.com/doc/6710771419.html,3P = 0;

}

/**

* @brief 配置定时器输出通道3N输出极性为高电平有效. * @param pTimer: 定时器TIM1~TIM5和TIM8~TIM14.

* @retval 无

*/

void drv_timer_set_oc3n_polarity_high( TimerType* pTimer ) {

pTimer->https://www.doczj.com/doc/6710771419.html,3NP = 1;

}

/**

* @brief 配置定时器输出通道3N输出极性为低电平有效. * @param pTimer: 定时器TIM1~TIM5和TIM8~TIM14.

* @retval 无

*/

void drv_timer_set_oc3n_polarity_low( TimerType* pTimer ) {

pTimer->https://www.doczj.com/doc/6710771419.html,3NP = 0;

}

/**

* @brief 配置定时器输出通道4输出极性为高电平有效. * @param pTimer: 定时器TIM1~TIM5和TIM8~TIM14.

* @retval 无

*/

void drv_timer_set_oc4_polarity_high( TimerType* pTimer ) {

pTimer->https://www.doczj.com/doc/6710771419.html,4P = 1;

}

/**

* @brief 配置定时器输出通道4输出极性为低电平有效. * @param pTimer: 定时器TIM1~TIM5和TIM8~TIM14.

* @retval 无

*/

void drv_timer_set_oc4_polarity_low( TimerType* pTimer ) {

pTimer->https://www.doczj.com/doc/6710771419.html,4P = 0;

}

/**

* @brief 使能定时器捕获比较通道1

* @param pTimer: 定时器TIM1~TIM5 TIM8~TIM14

* @retval 无

*/

void drv_timer_ccx1_enable( TimerType* pTimer )

{

pTimer->https://www.doczj.com/doc/6710771419.html,1E = 1;

}

/**

* @brief 定时定时器捕获比较通道1

* @param pTimer: 定时器TIM1~TIM5 TIM8~TIM14 * @retval 无

*/

void drv_timer_ccx1_disable( TimerType* pTimer ) {

pTimer->https://www.doczj.com/doc/6710771419.html,1E = 0;

}

/**

* @brief 使能定时器捕获比较通道2

* @param pTimer: 定时器TIM1~TIM5 TIM8~TIM14 * @retval 无

*/

void drv_timer_ccx2_enable( TimerType* pTimer ) {

pTimer->https://www.doczj.com/doc/6710771419.html,2E = 1;

}

/**

* @brief 定时定时器捕获比较通道2

* @param pTimer: 定时器TIM1~TIM5 TIM8~TIM14 * @retval 无

*/

void drv_timer_ccx2_disable( TimerType* pTimer ) {

pTimer->https://www.doczj.com/doc/6710771419.html,2E = 0;

}

/**

* @brief 使能定时器捕获比较通道3

* @param pTimer: 定时器TIM1~TIM5 TIM8~TIM14 * @retval 无

*/

void drv_timer_ccx3_enable( TimerType* pTimer ) {

pTimer->https://www.doczj.com/doc/6710771419.html,3E = 1;

}

/**

* @brief 定时定时器捕获比较通道3

定时器中断程序设计实验

实验一定时器/中断程序设计实验 一、实验目的 1、掌握定时器/中断的工作原理。 2、学习单片机定时器/中断的应用设计和调试 二、实验仪器和设备 1、普中科技单片机开发板; 2、Keil uVision4 程序开发平台; 3、PZ-ISP 普中自动下载软件。 三、实验原理 805l 单片机内部有两个 16 位可编程定时/计数器,记为 T0 和 Tl。8052 单片机内除了 T0 和 T1 之外,还有第三个 16 位的定时器/计数器,记为 T2。它们的工作方式可以由指令编程来设定,或作定时器用,或作外部脉冲计数器用。定时器 T0 由特殊功能寄存器 TL0 和 TH0 组成,定时器 Tl 由特殊功能寄存器 TLl 和 TH1 组成。定时器的工作方式由特殊功能寄存器 TMOD 编程决定,定时器的运行控制由特殊功能寄存器 TCON 编程控制。T0、T1 在作为定时器时,规定的定时时间到达,即产生一个定时器中断,CPU 转向中断处理程序,从而完成某种定时控制功能。T0、T1 用作计数器使用时也可以申请中断。作定时器使用时,时钟由单片机内部系统时钟提供;作计数器使用时,外部计数脉冲由 P3 口的 P3.4(或 P3.5)即 T0(或 T1)引脚输入。 方式控制寄存器 TMOD 的控制字格式如下: 低 4 位为 T0 的控制字,高 4 位为 T1 的控制字。GATE 为门控位,对定时器/计数器的启动起辅助控制作用。GATE=l 时,定时器/计数器的计数受外部引脚输入电平的控制。由由运行控制位 TRX (X=0,1)=1 和外中断引脚(0INT 或 1INT)上的高电平共同来启动定时器/计数器运行;GATE=0时。定时器/计数器的运行不受外部输入引脚的控制,仅由 TRX(X=0,1)=1 来启动定时器/计数器运行。 C/-T 为方式选择位。C/-T=0 为定时器方式,采用单片机内部振荡脉冲的 12 分频信号作为时钟计时脉冲,若采用 12MHz 的振荡器,则定时器的计数频率为 1MHZ,从定时器的计数值便可求得定时的时间。 C/-T=1 为计数器方式。采用外部引脚(T0 为 P3.4,Tl 为 P3.5)的输入脉冲作为计数脉冲,当 T0(或 T1)输入信号发生从高到低的负跳变时,计数器加 1。最高计数频率为单片机时钟频率的 1/24。 M1、M0 二位的状态确定了定时器的工作方式,详见表。

推荐-stm32中定时器产生不同PWM的基本思路 精品

在stm32中利用定时器TIM调制PWM的几种方法: 说说我的学习经历:从开始接触到现在有好几个月了,但是学习还是比较的费劲,而且速度也比较的缓慢,当然相比之前还是有很大的进步,记得刚刚学习的时候,建工程都是大四学长手把手教的。废话不多说先来讲讲定时器的配置: STM32F10系列最少3个、做多有8个定时器,都是16位定时器,且相互之间是独立的,计数范围为0x0000-0xffff,最大计数值为65535.可以用于测量输入信号的脉冲长度或者产生输出波形(输出比较和PWM)分为通用定时器,高级定时器,以及看门狗定时器 下面主要讲通用定时器的配置问题: 以定时器TIM1为例:先进行函数的配置 void timer1_config() { TIM_TimeBaseInitTypDef TIM_TimeBaseStructure; //开定时器1外设时钟 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM1,ENABLE); //计时50000次时间为50000/10M=500ms TIM_TimeBaseStructure.TIM_Period=50000 ; TIM_TimeBaseStructure.TIM_Prescaler = 720-1;//720分频 TIM_TimeBaseStructure.TIM_ClockDivision =0;//时钟分割为0; //计数模式向上计数 TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; TIM_TimeBaseInit(TIM1,&TIM_TimeBaseStructure)//初始化TIM1 TIM_ITConfig(TIM1,TIM_IT_Update,ENABLE);//开启定时器中断 TIM_Cmd(TIM1,ENABLE); //使能定时器 } 关于时间的计算问题: 外设系统时钟的频率为72M,进行720分频以后,频率f=72M/720=100khz. 如果要定时0.1s 则计数值为10000,计算公式为:时间(t)=计数值(n)/频率(f).注意计数值n介于0到65535之间 有定时器则一定会有中断发生,所以要配置中断优先级,对于中断优先 级函数配置如下: V oid nvic_config() { NVIC_InitTypDef NVIC_InitStructure; //抢占优先级为1位,从优先级为3位 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1) ; NVIC_InitStructure.NVIC_IRQChannel=TIM1_IRQn; //定义定时器1为请求通道 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0; //抢占式优先级为0 NVIC_InitStructure.NVIC_IRQChannelSubPriority=2; //从优先级为2 NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE; //使能中断优先级 NVIC_Init(&NVIC_InitStructure); //初始化中断 } 对于优先级中的抢占式和从优先级做如下解释: 抢占式优先级:是可以抢占的中断,比如正在执行的优先级为10的中断,突然来了一个优

CC2530定时器设置以及应用

定时器的应用 一、教学目标 1、熟悉定时器相关寄存器的功能 2、能对程序进行改写以实现不同时间的定时操作 二、教学重点 定时器T1寄存器设置 通过变量累计定时溢出调整定时时间的方法 三、教学难点 定时器以及定时中断寄存器的设置 四、教学方法 案例法、对比法 五、教学过程 [引入]定时器也是CC2530的重要资源之一,CC2530的定时器比51单片机的定时器功能更多,本次课通过阅读、修改程序以及相关寄存器的学习,使大家能基本应用定时器完成不同定时时间的程序设计。 定时器程序设计方法也分为查询法和中断法。 任务一、查询法程序设计 1)结合以下寄存器的功能介绍阅读程序,分析程序的功能,并分析定时时间 2)修改程序实现4个LED指示灯的流水灯控制,延时时间为1秒。 将P1口状态用数组存放,采用循环结构引用数组。 任务二、中断法程序设计 与定时器中断相关的寄存器 ◆定时器初始化

定时中断初始化 void init(void) { P1SEL &= ~0x03; // 设置LED1、LED2为普通IO口 P1DIR |= 0x003 ; // 设置LED1、LED2为输出 LED1 = 0; LED2 = 1; //灭LED T1CTL = 0x05; // T1 通道0,8 分频; 自动重载模式(0x0000->0xffff); IEN1 |=0X02; //定时器1中断使能 EA=1; //开总中断 CLKCONCMD &= 0x80; //时钟速度设置为32MHz } 2)中断服务子程序设计 请同学们将任务一的程序调整为中断服务子程序 #pragma vector = T1_VECTOR //中断服务子程序 __interrupt void T1_ISR(void) { … … } 注意:中断标志需要软件清除,T1的中断标志位为T1IF 六、小结 本次课通过两个案例,分别采用查询法和中断法对定时器1进行程序设计,为后面的串口操作打下了基础。 七、作业 请同学们结合按键控制LED和定时器操作完成程序设计,按下按键,LED灯以1秒的时间间隔依次点亮

c++定时器

定时器 今天我们来讨论下c++中的定时器(SetTimer)一些基础的知识和用法: 你可以通过呼叫SetTimer函数为您的Windows程序分配一个定时器。SetTimer有一个时间间隔范围为1毫秒到4,294,967,295毫秒(将近50天)的整数 型态参数,这个值指示Windows每隔多久时间给您的程序发送WM_TIMER消息。例如,如果间隔为1000毫秒,那么Windows将每秒给程序发送一 个WM_TIMER消息。 当您的程序用完定时器时,它呼叫KillTimer函数来停止定时器消息。在处理WM_TIMER 消息时,您可以通过呼叫KillTimer函数来编写一个「限用 一次」的定时器。KillTimer呼叫清除消息队列中尚未被处理的WM_TIMER消息,从而使程序在呼叫KillTimer之后就不会再接收到WM_TIMER消 息。 系统和定时器 Windows定时器是PC硬件和ROM BIOS架构下之定时器一种相对简单的扩充。回到Windows 以前的MS-DOS程序写作环境下,应用程序能够通过拦 截者称为timer tick的BIOS中断来实作时钟或定时器。一些为MS-DOS编写的程序自己拦截这个硬件中断以实作时钟和定时器。这些中断每54.915毫 秒产生一次,或者大约每秒18.2次。这是原始的IBM PC的微处理器时脉值4.772720 MHz 被218所除而得出的结果。 Windows应用程序不拦截BIOS中断,相反地,Windows本身处理硬件中断,这样应用程序就不必进行处理。对于目前拥有定时器的每个程 序,Windows储存一个每次硬件timer tick减少的计数。当这个计数减到0时,Windows在应用程序消息队列中放置一个WM_TIMER消息,并将计数 重置为其最初值。 因为Windows应用程序从正常的消息队列中取得WM_TIMER消息,所以您的程序在进行其它处理时不必担心WM_TIMER消息会意外中断了程序。 在这方面,定时器类似于键盘和鼠标。驱动程序处理异步硬件中断事件,Windows把这些事件翻译为规律、结构化和顺序化的消息。 在Windows 98中,定时器与其下的PC定时器一样具有55毫秒的分辨率。在Microsoft Windows NT中,定时器的分辨率为10毫秒。 Windows应用程序不能以高于这些分辨率的频率(在Windows 98下,每秒18.2次,在Windows NT下,每秒大约100次)接收WM_TIMER消息。 在SetTimer呼叫中指定的时间间隔总是截尾后tick数的整数倍。例如,1000毫秒的间隔除以54.925毫秒,得到18.207个tick,截尾后是18个tick,它实 际上是989毫秒。对每个小于55毫秒的间隔,每个tick都会产生一个WM_TIMER消息。

STM32高级定时器日记之PWM

STM32高级定时器PWM实用程序 文章来源:本站原创作者:佚名 该文章讲述了STM32高级定时器PWM实用程序. 高级定时器与通用定时器比较类似,下面是一个TIM1 的PWM 程序,TIM1是STM32唯一的高级定时器。共有4个通道有死区有互补。 先是配置IO脚: GPIO_InitTypeDef GPIO_InitStructure; /* PA8设置为功能脚(PWM) */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); /*PB13 设置为PWM的反极性输出*/ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init(GPIOB, &GPIO_InitStructure); /*开时钟PWM的与GPIO的*/ RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); /*配置TIM1*/ TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure; void Tim1_Configuration(void) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure; TIM_DeInit(TIM1); //重设为缺省值 /*TIM1时钟配置*/ TIM_TimeBaseStructure.TIM_Prescaler = 4000; //预分频(时钟分 频)72M/4000=18K TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计数TIM_TimeBaseStructure.TIM_Period = 144; //装载值18k/144=125hz 就是说向上加的144便满了 TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置了时钟分割不

单片机定时器实验程序

ORG 0000H LJMP START ORG 001BH ;定时器/计数器1中断程序入口地址 LJMP INT ORG 0100H START: MOV TMOD,#10H ;计数器置为方式1 MOV TL1,#0B0H ;装入时间常数 MOV TH1,#03CH SETB ET1 ;允许定时器T1中断 SETB EA ;允许总中断 SETB TR1 ;开始计数 MOV R0,#05H ;05是进入中断的次数LOOP: MOV R1,#00H MOV R2,#26H ;灯的状态循环次数LOOP1: MOV A,R1 ACALL TABLE MOV P1,A INC R1 LOOP2: CJNE R0,#00H,LOOP2 MOV R0,#05H DJNZ R2,LOOP1 LJMP LOOP TABLE: INC A ;从表中取显示码入累加器 MOVC A,@A+PC RET DB 0FFH,0FEH,0FCH,0F8H,0F0H,0E0H,0C0H,80H,0H DB 01H,03H,07H,0FH,1FH,3FH,7FH,0FFH,00H,0FFH,0FEH DB 0FDH,0FBH,0F7H,0EFH,0DFH,0BFH,07FH,0BFH,0DFH DB 0EFH,0F7H,0FBH,0FDH,0FEH,0FFH,00H,0FFH,00H INT: CLR TR1 ;停止计数 DEC R0 ;计数值减一 MOV TL1,#0B0H ;重置时间常数初值 MOV TH1,#03CH SETB TR1 ;开始计数 RETI ;中断返回 END

将T1改为T0,并且溢出间隔为0.05s ORG 0000H LJMP START ORG 001BH ;定时器/计数器1中断程序入口地址 LJMP INT ORG 0100H START: MOV TMOD,#01H ;计数器置为方式1 MOV TL1,#78H ;装入时间常数 MOV TH1,#0CH SETB ET0 ;允许定时器T1中断 SETB EA ;允许总中断 SETB TR0 ;开始计数 MOV R0,#05H ;05是进入中断的次数 LOOP: MOV R1,#00H MOV R2,#25H ;灯的状态循环次数 LOOP1: MOV A,R1 ACALL TABLE MOV P1,A INC R1 LOOP2: CJNE R0,#00H,LOOP2 MOV R0,#05H DJNZ R2,LOOP1 LJMP LOOP TABLE: INC A ;从表中取显示码入累加器 MOVC A,@A+PC RET DB 0FFH,07FH,3FH,1FH,0FH,07H,03H,01H,00H DB 80H,81H,0C1H,0C3H,0E3H,0E7H,0F7H,0FFH DB 00H,0FFH,00H,0FFH,0EFH,0E7H,0C7H,0C3H,83H,81H,01H,00H DB 01H,03H,07H,0FH,1FH,3FH,7FH,0FFH INT: CLR TR1 ;停止计数 DEC R0 ;计数值减一 MOV TL1,#78H ;重置时间常数初值 MOV TH1,#0CH SETB TR1 ;开始计数 RETI ;中断返回 END

单片机定时器习题

单片机定时器/计数器、中断和串行口习题 一、填空题 1、若要启动定时器T0开始计数,则应将TR0的值设置为 1 。 2、定时器T1工作在方式0时,其定时时间为(8192-定时器初值)*2us 。方式1时定时时间又为(65536-定时器初值)*2us 。 3、串行通信有异步通信和同步通信两种基本通讯方式。 4、波特率是指每秒钟传递信息的位数。 5、如果要将现有的波特率加倍,可使用指令MOV PCON,#80H 。 6、当串行口工作在方式1时,一帧信息共有10位,即起始位、8个数据位、停止位。 7、串行口工作在方式2时的波特率为fosc/32或fosc/64 。 8、外部中断1的程序入口地址是0013H 。 二、选择题 1、若要采用定时器0,方式1,如何设置TMOD__B__ A.00H B.01H C.10H D. 11H 2、单片机采用方式0时是13位计数器,它的最大定时时间是多少?_B__ A.81.92ms B.8.192ms C.65.536ms D.6.5536ms 3、以下哪项不是中断的特点? C A.分时操作 B.实时处理 C.在线编程 D.故障处理 4、外部中断响应时间至少需要__A个机器周期。 A.3 B.2 C.4 D.8 5、通过串口发送和接受数据时,在程序中使用__A___指令。 A.MOV BMOVX C.MOVC D.SW AP 6、以下哪个是中断优先级寄存器?__B A.IE B.IP C.TCON D.SCON 7、串行口中断的程序入口地址是 C 。 A 0003H B 001BH C 0023H D 000BH 三、判断题 1、8051的两个定时器T0和T1都是16位的计数器。(对) 2、单片机的计数器最高检测频率为振荡频率的1/12。(错) 3、定时/计数器的方式2具有自动装入初值的功能。(对) 4、引起中断的原因或发出中断申请的来源称为中断源。(对) 5、中断可使CPU和外设同时工作。(对) 6、定时器的特殊功能寄存器TMOD是用作中断溢出标志,并控制定时计数器的启动和停止。(错) 7、定时器控制寄存器TCON可以位寻址。(对) 8、MCS-51系列单片机的5个中断源都是可屏蔽中断。(对) 四、综合题

stm32高级定时器使用教程

STM32 高级定时器-PWM简单使用 2010-04-14 14:49:29| 分类:STM32 | 标签:|举报|字号大中小订阅高级定时器与通用定时器比较类似,下面是一个TIM1 的PWM 程序,TIM1是STM32唯一的高级定时器。共有4个通道有死区有互补。 先是配置IO脚: GPIO_InitTypeDef GPIO_InitStructure; /* PA8设置为功能脚(PWM) */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); /*PB13 设置为PWM的反极性输出*/ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure); /*开时钟PWM的与GPIO的*/ RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); /*配置TIM1*/ TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure;

STM32的PWM精讲

STM32的PWM精讲 通过对TM1定时器进行控制,使之各通道输出插入死区的互补PWM输出,各通道输出频率均为17.57KHz。其中,通道1输出的占空比为50%,通道2输出的占空比为25%,通道3输出的占空比为12.5%。各通道互补输出为反相输出。 TM1定时器的通道1到4的输出分别对应PA.08、PA.09、PA.10和PA.11 引脚,而通道1到3的互补输出分别对应PB.13、PB.14和PB.15引脚,中止输入引脚为PB.12。将这些引脚分别接入示波器,在示波器上观查相应通道占空比的方波[12]。 配置好各通道后,编译运行工程;点击MDK的Debug菜单,点击Start/Stop Debug Session;通过示波器察看 PA.08、PA.09、PA.10、PB.13、PB.14、PB.15 的输出波形,其中PA.08和PB.13为第一通道和互补通道,PB.09和PB.14为第二通道和其互补通道,PB.10和PB.15为第三通道和其互补通道;第一通道显示占空比为50%,第二通道占空比为25%,第三通道占空比为12.5%。 第2章STM32处理器概述 STM32F103xx增强型系列产品中内置了多达3个同步的标准定时器。每个定时器都有一个16位的自动加载递加/递减计数器、一个16位的预分频器和4个独立的通道,每个通道都可用于输入捕获、输出比较、PWM和单脉冲模式输出,在最大的封装配置中可提供最多12个输入捕获、输出比较或PWM通道。它们还能通过定时器链接功能与高级控制定时器共同工作,提供同步或事件链接功能。 在调试模式下,计数器可以被冻结。任一个标准定时器都能用于产生PWM 输出。每个定时器都有独立的DMA请求机制。 2.4.2 高级控制定时器[22] 高级控制定时器(TM1)由一个16位的自动装载计数器组成,它由一个可编程预分频器驱动。它适合多种用途,包含测量输入信号的脉冲宽度(输入捕获),或者产生输出波形(输出比较,PWM,嵌入死区时间的互补PWM等)。 使用定时器预分频器和RCC时钟控制预分频器,可以实现脉冲宽度和波形周期从几个微秒至几个毫秒的调节。高级控制(TIM1)和通用(TMx)定时器是完全

定时器产品使用说明书

定时器产品使用说明书 定时设置: 1、先检查时钟是否与当前时间一致,如需重新校准,在按住“时钟”键的同时,分别按住“星期”、“小时”、“分钟”键,将时钟调到当前准确时间。 2、按一下“设定”键,显示屏左下方出现“1开”字样(表示第一次开启的时间)。然后按“星期”调整本次设定的星期组合模式,再按“小时”、“分钟”键,输入所需开启的时间。 3、再按一下“设定”键,显示屏左下方出现“1关”字样(表示第一次关闭时间),再按“星期”、“小时”、“分钟”键,输入所需关闭的日期和时间。 4、继续按动“设定”键,显示屏左下方将依次显示“2开、2关、3开、3关……16开、16关”,参考步骤2、3设置以后各次开关时间。设置完成后,按一下“时钟”键返回。 5、如果每天不需设置16组开关,则必须按“清除”键,将多余各组消除,使其显示屏上显示“—:—”图样(不是00:00)。 6、按“模式”键,可以变换工作模式。总共有四种工作模式:A、液晶显示开(代表进入常开模式);B、液晶显示关(代表进入常关模式);C、由开进入自动(表示目前状态为开,等到下一组时间到后开始自动运行);D、由关进入自动(表示目前状态为关,等到下一组定时时间到后开始自动运行)。 当出现以下情况时: 1、定时器没有根据设定的程序开启或关闭,请检查设置程序是否正确或重新调整。 2、定时器长时间不用,显示模糊时,请将定时器接通电源充足,10分钟后无显示,按“复位”键,2-3秒。 3、如以上步骤均不能排除问题,请与公司或经销商联系维修。 注意事项: 1、对于那些因定时开关出错而可能发生的生命相关事故或者对社会产生重大影响的设备(如医疗设备等),请不要使用定时开关。 2、对于那些因定时开关出错而发生重大财产损失的设备(大型加热器或冷库),在使用本定时开关时,请务必是特性和性能的数值有足够的余量,并采取二重电路等安全对策。 3、请勿自行修理、分解或改造。 4、接通电源后请勿接触端子部分。本开关工作在无潮湿、腐蚀及高金属含量气体环境中。请勿沾染油或水。

STM32学习笔记通用定时器PWM输出

STM32学习笔记(5):通用定时器PWM输出 2011年3月30日TIMER输出PWM 1.TIMER输出PWM基本概念 脉冲宽度调制(PWM),是英文“Pulse Width Modulation”的缩写,简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。简单一点,就是对脉冲宽度的控制。一般用来控制步进电机的速度等等。 STM32的定时器除了TIM6和TIM7之外,其他的定时器都可以用来产生PWM输出,其中高级定时器TIM1和TIM8可以同时产生7路的PWM输出,而通用定时器也能同时产生4路的PWM输出。 1.1PWM输出模式 STM32的PWM输出有两种模式,模式1和模式2,由TIMx_CCMRx寄存器中的OCxM位确定的(“110”为模式1,“111”为模式2)。模式1和模式2的区别如下: 110:PWM模式1-在向上计数时,一旦TIMx_CNTTIMx_CCR1时通道1为无效电平(OC1REF=0),否则为有效电平(OC1REF=1)。 111:PWM模式2-在向上计数时,一旦TIMx_CNTTIMx_CCR1时通道1为有效电平,否则为无效电平。 由此看来,模式1和模式2正好互补,互为相反,所以在运用起来差别也并不太大。 而从计数模式上来看,PWM也和TIMx在作定时器时一样,也有向上计数模式、向下计数模式和中心对齐模式,关于3种模式的具体资料,可以查看《STM32参考手册》的“14.3.9 PWM模式”一节,在此就不详细赘述了。 1.2PWM输出管脚 PWM的输出管脚是确定好的,具体的引脚功能可以查看《STM32参考手册》的“8.3.7 定时器复用功能重映射”一节。在此需要强调的是,不同的TIMx有分配不同的引脚,但是考虑到管脚复用功能,STM32提出了一个重映像的概念,就是说通过设置某一些相关的寄存器,来使得在其他非原始指定的管脚上也能输出PWM。但是这些重映像的管脚也是由参考手册给出的。比如

STM32如何设置定时器

STM32如何设置定时器 STM32 如何设置定时器 下面以stm32 的TIM2 作为实例一步步配置成为定时器: 第一种 对定时器的基本配置 TIM_TimeBaseStructure.TIM_Period = 1000; //设置自动装载寄存器 TIM_TimeBaseStructure.TIM_Prescaler = 35999; //分频计数 TIM_TimeBaseStructure.TIM_ClockDivision = 0; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //选择向上计数 TIM_TimeBaseInit(TIM2, TIM_TimeBaseStructure); TIM_Cmd(TIM2, ENABLE); //是能定时器 始能定时器的中断: TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE); 在开启时钟里一定要打开TIM2 的时钟,函数表达式如下: RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); 4:中断向量函数的编写: void NVIC_Configuration(void) { NVIC_InitTypeDef NVIC_InitStructure; #ifdef VECT_TAB_RAM //如果程序在ram 中调试那么定义中断向量表在Ram 中否则在Flash 中 /* Set the Vector Table base location at 0x20000000 */

PLC程序中定时器和计数器的配合应用

PLC程序中定时器和计数器的配合应用 实际应用中,定时器和计数器,常常有“强强联合”形式的搭配性应用。 一、定时器 1、定时器是位/字复合元件,可以有三个属性: 1)有线圈/触点元件,当满足线圈的驱动(时间)条件时,触点动作; 2)具有时间控制条件,当线圈被驱动时,触点并不是实时做出动作反应,而是当线圈被驱动时间达到预置时间后,触点才做出动作; 3)具有数值/数据处理功能,同时又是“字元件”。 2、可以用两种方法对定时时间进行设置: 1)直接用数字指定。FX编程器用10进制数据指定,如K50,对于100ms 定时器来讲,延时5秒动作。为5秒定时器。对LS编程器,可用10制数或16进制数设定,如50(或h32),对于100ms定时器来讲,延时5秒动作; 2)以数据寄存器D设定定时时间,即定时器的动作时间为D内的寄存数值。 3、由定时器构成的时间控制程序电路: LS编程器中的定时器有多种类型,但FX编程器中的定时器只有“得电延时输出”定时器一种,可以通过编写相应程序电路来实现“另一类型”的定时功能。图1程序电路中,利用M0和T1配合,实现了单稳态输出——断开延时定时器功能,X1接通后,Y0输出;X1断开后,Y0延时10秒才断开;T2、T3、Y2电路则构成了双延时定时器,X4接通时,Y2延时2秒输出;X4断开时,Y2延时3秒断开;Y3延时输出的定时时间,是由T4定时器决定的,T4的定时时间是同D1数据寄存器间接指定的。当X2接通时,T4定时值被设定为10秒;当X3接通时,T4定时值则被设定为20秒。XO提供定时值的清零/复位操作。 单个定时器的定时值由最大设定值所限定(0.1∽3276.7s),换言之,其延时动作时间不能超过1小时。如欲延长定时时间,可以如常规继电控制线路一样,将多只定时器“级联”,总定时值系多只定时器的定时值相加,以扩展定时时间。更好的办法,是常将定时器与计数器配合应用,其定时时间,即变为定时器的定时器与计数器的计数值相乘,更大大拓展了定时范围,甚至可以以月或年为单位

STM32 高级定时器-PWM简单使用

STM32 高级定时器-PWM简 单使用 高级定时器与通用定时器比较类似,下面是一个TIM1 的PWM 程序,TIM1是STM32唯一的高级定时器。共有4个通道有死区有互补。 先是配置IO脚: GPIO_InitTypeDef GPIO_InitStructure; /* PA8设置为功能脚(PWM) */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); /*PB13 设置为PWM的反极性输出*/ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure); /*开时钟PWM的与GPIO的*/ RCC_APB2PeriphClockCmd(RCC_A PB2Periph_TIM1,ENABLE); RCC_APB2PeriphClockCmd(RCC_A PB2Periph_GPIOA, ENABLE); RCC_APB2PeriphClockCmd(RCC_A PB2Periph_GPIOB, ENABLE); /*配置TIM1*/ TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure; void Tim1_Configuration(void) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure; TIM_DeInit(TIM1); //重设为缺省值 /*TIM1时钟配置*/ TIM_TimeBaseStructure.TIM_Prescaler = 4000; //预分频(时钟分频)72M/4000=18K TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计数 TIM_TimeBaseStructure.TIM_Period = 144; //装载值18k/144=125hz 就是说向上加的144便满了 TIM_TimeBaseStructure.TIM_ClockDivision =

智能编程定时器操作说明书

文案大全 此文档由恒飞电器提供 由杭州寰宇世极功放编写 ※系统概述: M P 3智能音乐播放器:采用世界最先进的微电脑控制技术。将广播自动分区播放、外部音频和麦克风录音存储等先进功能综合为一体。内存大小由你选择: (分别可用U 盘或T F 卡设计),成为广播设备的典范之精品,达到国内领先水平。广泛适用于校园自动广播音乐打铃、外语广播教学听力考试系统。 ※综合功能: M P 3自动广播、智能分区广播、日常教学广播、消防紧急广播、背景音乐播放、外语教学及听力考试广播功能。 ※技术参数: 信噪比:>90d B ; 谐波失真:<0.1%; 频响范围:20H z -18K ; 电压:220V ※前面板介绍(由于机型不同布局略有不同) 01、电源灯及开关 02、插U 盘或连接电脑U S B 囗 03、电源灯 (T F 卡插囗) 04、显示屏; 05、菜单上,下,左,右控制 选择键; 06、确定,停止,返回键; 07、咪,输入,监听音量控制键; 08、分区1,2,3,4,5,6按键 09、分区及电源全开全关按键; 10、手动与自动切换按键; 重要提示:当你插入新U 盘或TF 卡时,必须先把它插在本机上并开关本机电源,让它自动生成AUDIO 文件夹后并把有编号的MP3歌曲装到AUDIO 文件夹内才可以播放。 ※后面板介绍(由于机型不同布局略有不同)

2 注:短路输入端囗: 当这个端囗有短路信号输入时,本机会立刻播放你放在內存里AL A R M 文件夹内的这一首曲目,A L AR M 这文件夹內只能放一首用于紧急报警用的歌曲,其它需要定时播放的歌曲要放在AU DI O 文件夹內,如歌曲的路径放错则定时播放将不执行。短路输出端囗: 这个端囗与功放电源和分区的动作同步,即当有定时点到时,这端囗即短路,当定时歌曲放完或设定了结束时间到了即断开,这端囗作用是用于控制电源时序器接多台功放之用。 ※设备连接图(由于机型不同 布局略有不同) 01、FM 与遥控天线接囗; 03、MIC 输入插孔; 05、六个分区输入输出接线座; 07、输入电源接线座; 02、音频输入输出插孔; 04、短路输入警报与短路输出控制接口; 06、电源输出接线座;

STM32-PWM输出总结讲课讲稿

学习后发现stm32的定时器功能确实很强大,小总结一下方便以后使用的时候做参考。Stm32定时器一共分为三种:tim1和tim8是高级定时器,6和7是基本定时器,2—5是通用定时器。从名字就可以看得出来主要功能上的差异。今天我主要是用定时器做pwm输出,所以总结也主要是针对pwm方面的。 先大致说下通用和高级定时器的区别。通用的可以输出四路pwm信号互不影响。高级定时器可以输出三对互补pwm信号外加ch4通道,也就是一共七路。 所以这样算下来stm32一共可以生成4*5+7*2=30路pwm信号。接下来还有功能上的区别:通用定时器的pwm信号比较简单,就是普通的调节占空比调节频率(别的不常用到的没去深究);高级定时器的还带有互补输出功能,同时互补信号可以插入死区,也可以使能刹车功能,从这些看来高级定时器的pwm天生就是用来控制电机的。 Pwm输出最基本的调节就是频率和占空比。频率当然又和时钟信号扯上了关系。高级定时器是挂接到APB2上,而通用定时器是挂接到APB1上的。APB1和APB2的区别就要在于时钟频率不同。APB2最高频率允许72MH,而APB1最高频率为36MHZ。这样是不是通用定时器只最高36MHZ频率呢,不是的;通用定时器时钟信号完整的路线应该是下面这样的:AHB(72mhz)→APB1分频器(默认2)→APB1时钟信号(36mhz)→倍频器(*2倍)→通用定时器时钟信号(72mhz)。 在APB1和定时器中间的倍频器起到了巨大的作用,假如红色字体的“APB1分频器”假如不为1(默认是2),倍频器会自动将APB1时钟频率扩大2倍后作为定时器信号源,这个它内部自动控制的不用配置。设置这个倍频器的目的很简单就是在APB1是36mhz的情况下通用定时器的频率同样能达到72mhz。我用的库函数直接调用函数SystemInit(); 这个函数之后时钟配置好了:通用定时器和高级定时器的时钟现在都是72mhz(你也可以自己再配置一下RCC让他的频率更低,但是不能再高了)。定时器接下来还有一个分频寄存器:TIMX_PSC 经过他的分频后,才是定时器计数的频率。所以真正的时钟频率应该是72mhz/(TIMX_PSC-1),我们设为tim_frepuency下面还会用到。 stm32的时钟频率弄得确实是很饶人的,所以关键就是先要把思路理清楚。时钟的频率弄好了下面终于可以开说重点PWM了。当然还少不了频率:pwm主要就是控制频率和占空比的:这两个因素分别通过两个寄存器控制:TIMX_ARR和TIMX_CCRX。ARR寄存器就是自动重装寄存器,也就是计数器记到这个数以后清零再开始计,这样pwm的频率就是tim_frequency/(TIMX_ARR-1)。在计数时会不停的和CCRX寄存器中的数据进行比较,如果小于的话是高电平或者低电平,计数值大于CCRX值的话电平极性反相。所以这也就控制了占空比。 下面是定时器1的配置代码: GPIO_InitTypeDef GPIO_InitStructure2; TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure; TIM_BDTRInitTypeDef TIM_BDTRInitStructure; //第一步:配置时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA| RCC_APB2Periph_GPIOB|RCC_APB2Periph_TIM1 ,ENABLE); //第二步,配置goio口 /********TIM1_CH1 引脚配置*********/

定时器程序

#include #define uchar unsigned char #define uint unsigned int sbit LED=P0^0; uchar T_Count=0; void main() { TMOD=0x00; //定时器0 工作方式0 TH0=(8192-5000)/32; //5ms 定时 TL0=(8192-5000)%32; IE=0x82; //允许T0 中断 TR0=1; while(1); } //T0 中断函数 void LED_Flash() interrupt 1 { TH0=(8192-5000)/32; //恢复初值 TL0=(8192-5000)%32; if(++T_Count==100) //0.5s 开关一次LED { LED=~LED; T_Count=0; } } 28 TIMER0 控制流水灯 #include #include

#define uchar unsigned char #define uint unsigned int void main() { uchar T_Count=0; P0=0xfe; P2=0xfe; TMOD=0x01; //定时器0 工作方式1 TH0=(65536-40000)/256; //40ms 定时TL0=(65536-40000)%256; TR0=1; //启动定时器 while(1) { if(TF0==1) { TF0=0; TH0=(65536-40000)/256; //恢复初值TL0=(65536-40000)%256; if(++T_Count==5) { P0=_crol_(P0,1); P2=_crol_(P2,1); T_Count=0; } } } }

stm32f103通用定时器pwm应用例程--蜂鸣器演奏乐曲

stm32f103通用定时器pwm应用例程--蜂鸣器演奏乐曲STM32F103通用定时器PWM应用例程:蜂鸣器演奏乐曲一(说明:本例程是将流明LM3SLib_Timer.pdf文档中的例程9及例程10(PWM应用: 蜂鸣器演奏乐曲),移植到STM32F103上。 二(流明LM3SLib_Timer.pdf例程9及例程10的拷贝: 例程9( Timer PWM应用:蜂鸣器发声 如图1.1所示,为EasyARM1138开发板上的蜂鸣器驱动电路。蜂鸣器类型是交流蜂鸣器,也称无源蜂鸣器,需要输入一列方波才能鸣响,发声频率等于驱动方波的频率。 图1.1 蜂鸣器驱动电路 程序清单1.9是Timer模块16位PWM模式的一个应用,可以驱动交流蜂鸣器发声,运行后蜂鸣器以不同的频率叫两声。其中"buzzer.h"和"buzzer.c"是蜂鸣器的驱动程序,仅有3个驱动函数,用起来很简捷。

程序清单1.9 Timer PWM应用:蜂鸣器发声 文件:main.c #include "systemInit.h" #include "buzzer.h" // 主函数(程序入口) int main(void) { jtagWait(); // 防止JTAG失效,重要~ clockInit(); // 时钟初始化:晶振,6MHz buzzerInit(); // 蜂鸣器初始化 buzzerSound(1500); // 蜂鸣器发出1500Hz声音 SysCtlDelay(400* (TheSysClock / 3000)); // 延时约400ms buzzerSound(2000); // 蜂鸣器发出2000Hz声音 SysCtlDelay(800* (TheSysClock / 3000)); // 延时约800ms buzzerQuiet( ); // 蜂鸣器静音 for (;;) { } } 文件:buzzer.h #ifndef __BUZZER_H__ #define __BUZZER_H__ // 蜂鸣器初始化 extern void buzzerInit(void); // 蜂鸣器发出指定频率的声音 extern void buzzerSound(unsigned short usFreq); // 蜂鸣器停止发声

相关主题
文本预览
相关文档 最新文档