初级会员

- 积分
- 91
- 金钱
- 91
- 注册时间
- 2014-11-1
- 在线时间
- 0 小时
|

楼主 |
发表于 2014-11-9 23:48:21
|
显示全部楼层
回复【2楼】正点原子:
---------------------------------
可以了,初始化TIM6时,清零CR1_URS位,然后把EGR_UG位置1(SR_UIF位会同时置1),然后清零SR_UIF位。启动TIM6后不会立即产生一个中断了。
#include "main.h"
#include "timer67.h"
void TIM6_Init(unsigned short arr,unsigned short psc)
{
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
NVIC_InitStructure.NVIC_IRQChannel = TIM6_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 4;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6,ENABLE);
TIM6_ARR = arr;
TIM6_PSC = psc;
TIM6_EGR |= EGR_UG;
TIM6_CNT = 0;
TIM6_SR = 0;
TIM6_DIER |= DIER_UIE;
}
int main()
{
TIM6_Init(0x3710,0x13e0);
Usart_Init(115200);
printf("初始化完成\r\n");
TIM6_Start();
while(1);
}
void TIM6_IRQHandler(void)
{
TIM6_SR = 0;
printf("TIM6_IRQ\r\n");
}
我找到坛友的方法是:
在定时器初始化的最后阶段采用如下的操作顺序:
1.产生一次软件更新时间;
2. 打开定时器;
3. 清除更新中断;
4. 使能定时器更新中断。
TIM_GenerateEvent(TIM6,TIM_EventSource_Update); // 产生软件更新事件,立即更新数据
2
TIM_Cmd(TIM6, ENABLE); // 使能TIM6. 先开定时器,再开中断
3
TIM_ClearFlag(TIM6,TIM_FLAG_Update); //清除标志位。定时器一打开便产生更新事件,若不清除,将会进入中断
4
TIM_ITConfig(TIM6, TIM_IT_Update, ENABLE); //打开TIM6更新中断
第二步可以不需要 |
|