STM32单片机定时器调试之方波输出
以下为源代码,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定时器还真是复杂,尤其是高级定时器。设计者真是了不起,还要感谢这位仁兄,要不是他我恐怕还得多弄几天
STM32单片机定时器方波输 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)