stm32f407中定时器中断的问题

我是小吕啊 2014-03-09 10:45:15
#include "stm32f4xx.h"

#define GPIO_Pin_6 0x0040
#define GPIO_Pin_7 0x0080
#define GPIO_Pin_8 0x0100
#define GPIO_Pin_9 0x0200
#define light_num 4

void light_init(void);
void interrupt(void);


void light_init(void)
{

RCC->AHB1ENR |= 0x00000020;

GPIOF->MODER |= 0x00055000;

GPIOF->OTYPER |= 0x000003C0;

GPIOF->OSPEEDR |= 0x00055000;

GPIOF->PUPDR &= 0xFFF00FFF;

GPIOF->BSRRL |= GPIO_Pin_6;
GPIOF->BSRRL |= GPIO_Pin_7;
GPIOF->BSRRL |= GPIO_Pin_8;
GPIOF->BSRRL |= GPIO_Pin_9;
}

void interrupt(void)
{

RCC->APB1ENR |= 0x00000008;

TIM5->PSC = 4199;
TIM5->ARR = 50000;

//TIM5->CR1 |= 1<<2;

TIM5->DIER |= 1;
TIM5->DIER |= 1<<6;

NVIC->IP[50] = 0x00;
NVIC->ISER[1] |= (1<<18);
TIM5->CR1 |= 1;
}

int main()
{
light_init();
interrupt();
while(1){
};
}

void TIM5_IRQHandler(void)
{
if(TIM5->SR&0x0001){
GPIOF->BSRRH |= GPIO_Pin_6;
}
TIM5->SR &= ~(0x0001);
}


我这段程序中的目的是让灯隔5s闪亮一次。但是程序却没有起到延时的作用,从一开始TIM5->SR的第一位就被置为1了,请问我的错误处在哪里?
再次拜过各位大神了
...全文
553 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
我是小吕啊 2014-03-11
  • 打赏
  • 举报
回复
#include "stm32f4xx.h"

#define	GPIO_Pin_6	0x0040
#define GPIO_Pin_7	0x0080
#define GPIO_Pin_8	0x0100
#define GPIO_Pin_9	0x0200
#define	light_num	4
int	flag	= 0;

void light_init(void);
void interrupt(void);
int	n	= 0;
void light_init(void)
{
	// ¿ªÆôF¶Ë¿ÚµÄʱÖÓ
	RCC->AHB1ENR	|= 0x00000020;
	// ģʽΪ£ºÊä³öģʽ
	GPIOF->MODER	|= 0x00055000;
	// Êä³öÀàÐÍ£º1¡¢¿ªÂ©£»2¡¢ÍÆÍì
	GPIOF->OTYPER	|= 0x000003C0;
	// ÉèÖÃËÙ¶È
	GPIOF->OSPEEDR	|= 0x00055000;
	// ²»À­¸ß²»À­µÍ
	GPIOF->PUPDR	&= 0xFFF00FFF;
	
	GPIOF->BSRRL	|= GPIO_Pin_6;
	GPIOF->BSRRL	|= GPIO_Pin_7;
	GPIOF->BSRRL	|= GPIO_Pin_8;
	GPIOF->BSRRL	|= GPIO_Pin_9;
}

void interrupt(void)
{
	// ÅäÖÃʱÖÓ
	RCC->APB1ENR	|= 0x00000008;		// ¿ªÆôTIM5
	
	TIM5->PSC	= 4199;			// Ô¤·ÖƵ4200
	TIM5->ARR	= 5000;			// ¶¨Ê±5Ãë
	TIM5->CR1	= 1<<7;
	
	TIM5->DIER	|= 1;
	TIM5->DIER	|= 1<<6;
		
	NVIC->IP[50] 	= 0x00;			     
	NVIC->ISER[1] 	|= (1<<18);   		// ʹÄÜ50ºÅÖжÏ,¼´TIM5
	TIM5->CR1	|= 1;
}

void led(u16 n){
	if(n==0){
		GPIOF->BSRRH	|= GPIO_Pin_6;
	}else if(n==1){
		GPIOF->BSRRL	|= GPIO_Pin_6;
	}
}
		
	
int main()
{
	light_init();
	interrupt();
	while(1){
	}
}

void TIM5_IRQHandler(void)
{
	if(TIM5->SR&0x0001){
		led(flag);
		flag	= !flag;
	}
	TIM5->SR 	&= ~(0x0001);
}
经过调试,终于对了,现在0.5s闪亮PF6灯!
我是小吕啊 2014-03-10
  • 打赏
  • 举报
回复
引用 5 楼 zhxianbin 的回复:
把库函数调好后,再改寄存器操作吧
就是因为老师要求直接操作寄存器,我大概知道我错在哪里了,我的中断服务函数中并有让LED的状态位发生转变,只是将其点亮而已。
zhxianbin 2014-03-10
  • 打赏
  • 举报
回复
把库函数调好后,再改寄存器操作吧
zhxianbin 2014-03-10
  • 打赏
  • 举报
回复
为什么不用库函数
我是小吕啊 2014-03-09
  • 打赏
  • 举报
回复
引用 1 楼 guojing3625 的回复:
先关中断,然后初始化,最后开中断。

试试看。
是先初始化时钟,然后再main函数里面开中断吗?
我改成这样了:
#include "stm32f4xx.h"

#define GPIO_Pin_6 0x0040
#define GPIO_Pin_7 0x0080
#define GPIO_Pin_8 0x0100
#define GPIO_Pin_9 0x0200
#define light_num 4

void light_init(void);
void interrupt(void);


void light_init(void)
{
// ¿ªÆôF¶Ë¿ÚµÄʱÖÓ
RCC->AHB1ENR |= 0x00000020;
// ģʽΪ£ºÊä³öģʽ
GPIOF->MODER |= 0x00055000;
// Êä³öÀàÐÍ£º1¡¢¿ªÂ©£»2¡¢ÍÆÍì
GPIOF->OTYPER |= 0x000003C0;
// ÉèÖÃËÙ¶È
GPIOF->OSPEEDR |= 0x00055000;
// ²»À­¸ß²»À­µÍ
GPIOF->PUPDR &= 0xFFF00FFF;

GPIOF->BSRRL |= GPIO_Pin_6;
GPIOF->BSRRL |= GPIO_Pin_7;
GPIOF->BSRRL |= GPIO_Pin_8;
GPIOF->BSRRL |= GPIO_Pin_9;
}

void interrupt(void)
{
// ÅäÖÃʱÖÓ
RCC->APB1ENR |= 0x00000008; // ¿ªÆôTIM2

TIM5->PSC = 4199; // Ô¤·ÖƵ4200
TIM5->ARR = 50000; // ¶¨Ê±5Ãë

//TIM5->CR1 |= 1<<2;

//TIM5->DIER |= 1;
//TIM5->DIER |= 1<<6;

//NVIC->IP[50] = 0x00;
//NVIC->ISER[1] |= (1<<18); // ʹÄÜ50ºÅÖжÏ,¼´TIM5
TIM5->CR1 |= 1;
}

int main()
{
light_init();
interrupt();
NVIC->IP[50] = 0x00;
NVIC->ISER[1] |= (1<<18); // ʹÄÜ50ºÅÖжÏ,¼´TIM5
TIM5->DIER |= 1;
TIM5->DIER |= 1<<6;while(1){
};
}

void TIM5_IRQHandler(void)
{
if(TIM5->SR&0x0001){
GPIOF->BSRRH |= GPIO_Pin_6;
}
TIM5->SR &= ~(0x0001);
}

可是还是没有起到延时的作用
流型 2014-03-09
  • 打赏
  • 举报
回复
先关中断,然后初始化,最后开中断。 试试看。

27,374

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧