您的位置 首页 发布

STM32单片机定时器调试之方波输出

今天试着让STM32的定时器输出50%占空比信号,按照例程写了一下方波初始化函数,例程用的是STM32自带库函数,由于嫌麻烦,我又自己写了一个

今日试着让STM32定时器输出50%占空比信号,依照例程写了一下方波初始化函数,例程用的是STM32自带库函数,因为嫌费事,我又自己写了一个简略的,选用定时器1进行输出。成果一上来,没反响,修改了许多参数,仍是没反响,然后将开发板例程写进芯片后,有反响 ,细心越多数据手册,没有问题,纠结一上午,正午吃饭。吃完饭后,下午又开端实验,仍是他人程序有反映,自己程序,没反响。再看了看,开发板程序运用的是TIM3,而我运用的是TIM1,所以又把我的程序将TIM1换成TIM3,点击调试运转,有反响 。不会是高档定时器只精干高档的使命吧,像输出方波这么简略的初级使命他不吝的干?抑郁了半响。后来经过在网上查找,这个程序

以下为源代码,CC1进行比较输出,形式为翻转电平.

程序运转后,CC中止可以进去,PA.11的指示灯能闪,但PA.08的指示一向为低电平,讨教一下程序哪里错了???

void TIM1_CC_Init(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;

/* 使能定时器 TIM1_CC 中止 */
NVIC_InitStructure.NVIC_IRQChannel = TIM1_CC_IRQChannel;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);

/* 装备 PA.11 为推挽输出 */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);

GPIOA->BSRR = GPIO_Pin_11; // 将PA.08装备为高电平

/* 装备 PA.08 为复用推挽输出 */
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);

/* 预分频主动重载寄存器 */
TIM1->ARR = 0x2FFF;
/* PSC 预分频器:计数频率 = CK_PSC /(PSC + 1) */
TIM1->PSC = 0xFF;
/* CCR1 捕获比较值寄存器 */
TIM1->CCR1 = 0xFFF;
/* 循环计数器的寄存器(操控更新事情) */
TIM1->RCR = 0x00; // 每次更新
/* 捕获/比较形式寄存器 */
TIM1->CCMR1 = 0x30; // CC1为输出,CCR1当即收效,输出翻转.
/* 捕获/比较使能寄存器 */
TIM1->CCER = 0x03; // 敞开CC1输出,反向输出
/* 中止使能寄存器*/
TIM1->DIER = 0x02; // 使能 CC1 中止
/* 操控寄存器1 */
TIM1->CR1 = 0x01; // 使能计数器(向上计数)
}

/***************************************************************************************
** 函数称号: TIM1_CC_IRQHandler
** 功用描绘: CC 中止
** 参 数: None
** 返 回 值: None
****************************************************************************************/
void TIM1_CC_IRQHandler(void)
{
static uint32 counter = 0;

TIM1->SR &= ~2; // 铲除中止标志(不做判别进步功率)

if(counter)
{
counter = 0;
GPIOA->BSRR = GPIO_Pin_11;
}
else
{
counter = 1;
GPIOA->BRR = GPIO_Pin_11;
}
}

最终找到问题,没有打开主输出…
/* 打断和死区操控器*/
TIM1->BDTR = 0x8000; // 主输出使能(MOE)
加这句就可以了.

得知,高档定时器便是高档定时器,因为加入了刹车和死区,所以想输出波形,有必要要比一般定时器多一句“TIM1->BDTR = 0x8000;” 敞开主输出使能,通道输出和这个有必要一起敞开,若呈现刹车信号,则一次将4路输出悉数封闭。以确保设备可以正常运转。哎!悲催呀,纠结了一上午。stm32定时器还真是杂乱,尤其是高档定时器。设计者真是了不得,还要感谢这位仁兄,要不是他我恐怕还得多弄几天

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

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

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

微信扫一扫关注我们

返回顶部