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

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

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_IRQChannelPreemptionPrior ity = 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定时器还真是复杂,尤

其是高级定时器。设计者真是了不起,还要感谢这位仁

相关文档
最新文档