您的位置 首页 模拟

STM32 定时器的4通道计数器使用

通用定时器确实比较强悍,功能极多我也比较晕此为在不牵扯PWM与DMA下像C51那样计数点灯。当然你要配置一些IO口作为点灯用这里就不详细说了…

通用定时器的确比较强悍,功用极多我也比较晕

此为在不牵扯PWM与DMA下像C51那样计数点灯。

当然你要装备一些IO口作为点灯用这儿就不详细说了。

就如

#defineLED2_ONGPIO_ResetBits(GPIOD,GPIO_Pin_7)
#define LED2_OFFGPIO_SetBits(GPIOD,GPIO_Pin_7)

这样的。

然后启用通用定时器2设置它的中止等3.0的库;

//Timer2中止*//

void NVIC_Configuration(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;//TIM2大局中止3.0的
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority= 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority =0;
NVIC_InitStructure.NVIC_IRQChannelCmd =ENABLE;
NVIC_Init(&NVIC_InitStructure);

}

//TIM2 clock enable

TIM_TimeBaseInitTypeDefTIM_TimeBaseStructure;

TIM_OCInitTypeDefTIM_OCInitStructure;

TIM_TimeBaseStructure.TIM_Period =8000;//计数值
TIM_TimeBaseStructure.TIM_Prescaler =7200-1;//预分频,此值+1为分频的除数
TIM_TimeBaseStructure.TIM_ClockDivision =0x0; //设置时钟切割
TIM_TimeBaseStructure.TIM_CounterMode =TIM_CounterMode_Up; //向上计数

**********************************************************************************************
TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStructure);

TIM_ClockDivision,设置时钟切割

它便是RCC操控寄存器1(TIMx_CR1)的位9:8(CKD),详细意义如下:

CKD[1:0]:时钟分频因子
界说在定时器时钟(CK_INT)频率与数字滤波器(ETR,TIx)运用的采样频率之间的分频份额。
0x00:tDTS = 1 xtCK_INT
0x01:tDTS = 2 xtCK_INT
0x10:tDTS = 4 xtCK_INT

TIM_TimeBaseStructure中应该还有一个更新陈述uint8_t TIM_RepetitionCounter;不论他也行。

72M/7200=10K分频后的成果便是,定时器速度为10K.计数器为向上计数,8000溢出,所以溢出时刻便是
8000/10K=0.8秒.而捕获的比较值则为:
u16 CCR1_Val = 4000;
u16 CCR2_Val = 2000;
u16 CCR3_Val = 1000;
u16 CCR4_Val = 500;
也便是说,在定时器开端计数后,榜首通道的中止发生在4000/10k=0.4秒,第二通道是0.2,第三
通道是0.1,第四是0.05*/

************************************************************************************************

//比较设置*/

TIM_OCInitStructure.TIM_OCMode =TIM_OCMode_Inactive;//输出比较非自动形式

TIM_OCInitStructure.TIM_OCPolarity =TIM_OCPolarity_High;//极性为正

//比较通道1*/
TIM_OCInitStructure.TIM_Pulse =CCR1_Val;//便是4000装入捕获比较寄存器的脉冲值

TIM_OC1Init(TIM2,&TIM_OCInitStructure);//写入装备
TIM_OC1PreloadConfig(TIM2,TIM_OCPreload_Disable);//制止OC1重装载,其实能够省掉这句,由于默是

//4路都不重装的.

********************************************************************************************

typedef struct
{
uint16_t TIM_OCMode;//挑选定时器形式比较多有的功用也比较类似
uint16_t TIM_OutputState;//使能通道 为了和2.0兼容吧我不论他
uint16_tTIM_OutputNState;//失能??
uint16_tTIM_Pulse;//待装入捕获比较寄存器的脉冲值
uint16_t TIM_OCPolarity;//输出极性
uint16_t TIM_OCNPolarity;//???
uint16_tTIM_OCIdleState;//???
uint16_t TIM_OCNIdleState;//???不明白得不论用默许就好
} TIM_OCInitTypeDef;

********************************************************************************************

//比较通道2 /
TIM_OCInitStructure.TIM_Pulse =CCR2_Val;

TIM_OC2Init(TIM2,&TIM_OCInitStructure);
TIM_OC2PreloadConfig(TIM2,TIM_OCPreload_Disable);

//比较通道3 /
TIM_OCInitStructure.TIM_Pulse =CCR3_Val;

TIM_OC3Init(TIM2,&TIM_OCInitStructure);
TIM_OC3PreloadConfig(TIM2,TIM_OCPreload_Disable);

//比较通道4 /
TIM_OCInitStructure.TIM_Pulse =CCR4_Val;

TIM_OC4Init(TIM2,&TIM_OCInitStructure);
TIM_OC4PreloadConfig(TIM2,TIM_OCPreload_Disable);

//使能预装载/
TIM_ARRPreloadConfig(TIM2,ENABLE);//这个进程中没有软件修正寄存器所以没他也行
//预先铲除一切中止位避免一启用就有中止从九九那抄的/
TIM_ClearITPendingBit(TIM2, TIM_IT_CC1 |TIM_IT_CC2 | TIM_IT_CC3 | TIM_IT_CC4|TIM_IT_Update);

//4个通道和溢出都装备中止/
TIM_ITConfig(TIM2, TIM_IT_CC1 | TIM_IT_CC2 |TIM_IT_CC3 | TIM_IT_CC4|TIM_IT_Update, ENABLE);
//答应TIM2开端计数/
TIM_Cmd(TIM2, ENABLE);

服务中止函数比较简单直接抄来

void TIM2_IRQHandler(void)
{
if (TIM_GetITStatus(TIM2, TIM_IT_CC1) !=RESET)
{
//有必要清空标志位/*/
TIM_ClearITPendingBit(TIM2,TIM_IT_CC1);

//点亮LED5 必定要是中文的 否则中心的 内容就不见了 本想我们移植到自己的著作中便利 看来SINA不行这样用

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/zhishi/moni/275561.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部