资讯详情

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

今天试着让M32的定时器输出50%占空比信号,按照例程写了一下方波初始化函数,例程用的是STM32自带库函数,由于嫌麻烦,我又自己写了一个简单的,采用定时器1进行输出。结果一上来,没反应,修改了很多参数,还是没反应,然后将例程写进芯片后,有反应 ,仔细越多数据手册,没有问题,纠结一上午,中午吃饭。吃完饭后,下午又开始试验,还是别人程序有反映,自己程序,没反应。再看了看,开发板程序使用的是M3,而我使用的是TIM1,于是又把我的程序将TIM1换成TIM3,点击调试运行,有反应 。不会是高级定时器只能干高级的任务吧,像输出方波这么简单的低级任务他不惜的干?郁闷了半天。后来通过在网上查找,这个程序 以下为源代码,CC1进行比较输出,模式为翻转电平.

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

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

/* 使能定时器 TIM1_CC 中断 */ NVIC_InitStructure.NVIC_QChannel = 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定时器还真是复杂,尤其是高级定时器。设计者真是了不起,还要感谢这位仁兄,要不是他我恐怕还得多弄几天

-电子元器件采购网(www.ruidan.com)是本土元器件目录分销商,采用“小批量、现货、样品”销售模式,致力于满足客户多型号、高质量、快速交付的采购需求。 自建高效智能仓储,拥有自营库存超过50,000种,提供一站式正品现货采购、个性化解决方案、选型替代等多元化服务。
锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台