如题,我的CAN1和CAN2用的相同方式配置,CAN1接收、发送没问题,CAN2只能发送,进不了接收中断,CAN2接收使用的是FIFO0,请教是什么问题?
void CAN_HardwareInit(u8 canChan,float bps,u8 mode,u8 rxIntType)
{
GPIO_InitTypeDef GPIO_InitStructure;
CAN_InitTypeDef CAN_InitStructure;
CAN_FilterInitTypeDef CAN_FilterInitStructure;
u8 i = 0;
switch (canChan)
{
case CAN1_CHANNEL:
#if CAN1_USE_GPIOA_EN
//使能相关时钟
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);//使能PORTA时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE);//使能CAN1时钟
//初始化GPIO
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11| GPIO_Pin_12;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//复用功能
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
如果ProteusSTM32仿真无法进入定时器中断,可能是因为定时器中断的配置问题造成的。请检查定时器中断的中断优先级是否已正确设置,并且中断函数是否已正确添加到中断向量表中,最后再检查中断是否已正确使能,这样就可以保证定时器中断的正常运行了。
/*我不知道你之前的程序,没法判断你错在哪。试试我调试成功的吧,你对照着看看有什么错误。正常情况PB5678循环亮,中断EXTI0_IRQHandler()发生后PB56循环亮,EXTI1_IRQHandler()发生后PB78循环亮,EXTI0的优先级高于EXTI1*/
#include "stm32f10x.h"
extern void Delay(vu32 nCount);
extern void delay(uint);
void RCC_Config(void);
void GPIO_Config(void);
void EXTI_Config(void);
void NVIC_Config(void);
int main(void)
{
//SystemInit();
RCC_Config();
GPIO_Config();
EXTI_Config();
NVIC_Config();
while (1)
{
GPIO_SetBits(GPIOB, GPIO_Pin_5);//GPIOB.5=1
Delay(0xfffff);
GPIO_SetBits(GPIOB, GPIO_Pin_6);//GPIOB.6=1
Delay(0xfffff);
GPIO_SetBits(GPIOB, GPIO_Pin_7);//GPIOB.7=1
Delay(0xfffff);
GPIO_SetBits(GPIOB, GPIO_Pin_8);//GPIOB.8=1
Delay(0xfffff);
GPIO_ResetBits(GPIOB, GPIO_Pin_5);//GPIOB.5=0
Delay(0xfffff);
GPIO_ResetBits(GPIOB, GPIO_Pin_6);//GPIOB.6=0
Delay(0xfffff);
GPIO_ResetBits(GPIOB, GPIO_Pin_7);//GPIOB.7=0
Delay(0xfffff);
GPIO_ResetBits(GPIOB, GPIO_Pin_8);//GPIOB.8=0
Delay(0xfffff);
}
}
void RCC_Config(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO, ENABLE);
/*开时钟*/
}
void GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin =GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8;/*LED为B 5678*/
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOB, GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin =GPIO_Pin_0|GPIO_Pin_1;//KEY为A 01
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, GPIO_InitStructure);
}
void EXTI_Config(void)
{
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0); //将A0接EXTI0
EXTI_InitTypeDef EXTI_InitStructure;
EXTI_InitStructure.EXTI_Line = EXTI_Line0;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;//下降沿
EXTI_InitStructure.EXTI_LineCmd = ENABLE;//中断使能
EXTI_Init(EXTI_InitStructure);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource1);//将A1接EXTI1
EXTI_InitStructure.EXTI_Line = EXTI_Line1;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;//下降沿
EXTI_InitStructure.EXTI_LineCmd = ENABLE;//中断使能
EXTI_Init(EXTI_InitStructure);
}
void NVIC_Config(void)//中断嵌套优先级设置
{
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);//1组
/* Enable the EXTI0_IRQn Interrupt */
NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;//0
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(NVIC_InitStructure);
/* Enable the EXTI1 Interrupt */
NVIC_InitStructure.NVIC_IRQChannel = EXTI1_IRQn;//1
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(NVIC_InitStructure);
}
extern void Delay(vu32 nCount) //简单的长时间延时函数
{
int i; //声明内部递减变量
for(; nCount!= 0; nCount--) //递减变量计数
{
for (i=0; i0xffff; i++);
}
}
/*以下为中断函数,加到stm32f10x_it.c文件中*/
#include "stm32f10x_it.h"
void EXTI0_IRQHandler(void)
{
int i;
if(EXTI_GetITStatus(EXTI_Line0) != RESET)
{
/* Clear the Key Button EXTI line pending bit */
EXTI_ClearITPendingBit(EXTI_Line0);//清中断标志位
for(i=0;i2;i++)
{
GPIO_SetBits(GPIOB, GPIO_Pin_5);//GPIOB.5=1
Delay(0xfffff);
GPIO_SetBits(GPIOB, GPIO_Pin_6);//GPIOB.6=1
Delay(0xfffff);
GPIO_ResetBits(GPIOB, GPIO_Pin_5);//GPIOB.5=0
Delay(0xfffff);
GPIO_ResetBits(GPIOB, GPIO_Pin_6);//GPIOB.6=0
Delay(0xfffff);
}
}
}
void EXTI1_IRQHandler(void)
{
int i;
if(EXTI_GetITStatus(EXTI_Line1) != RESET)
{
/* Clear the Key Button EXTI line pending bit */
EXTI_ClearITPendingBit(EXTI_Line1);//清中断标志位
for(i=0;i2;i++)
{
GPIO_SetBits(GPIOB, GPIO_Pin_7);//GPIOB.7=1
Delay(0xfffff);
GPIO_SetBits(GPIOB, GPIO_Pin_8);//GPIOC.8=1
Delay(0xfffff);
GPIO_ResetBits(GPIOB, GPIO_Pin_7);//GPIOB.7=0
Delay(0xfffff);
GPIO_ResetBits(GPIOB, GPIO_Pin_8);//GPIOB.8=0
Delay(0xfffff);
}
}
}
001 #include "exti.h"
002 #include "delay.h"
003 #include "led.h"
004 #include "key.h"
005 #include "beep.h"
006
007 //外部中断0服务程序
008 void EXTI0_IRQHandler(void)
009 {
010 delay_ms(10); //消抖
011 if(WK_UP==1)
012 {
013 BEEP=!BEEP;
014 }
015 EXTI_ClearITPendingBit(EXTI_Line0);
016 }
017 //外部中断2服务程序
018 void EXTI2_IRQHandler(void)
019 {
020 delay_ms(10); //消抖
021 if(KEY2==0)
022 {
023 LED0=!LED0;
024 LED1=!LED1;
025 }
026 EXTI_ClearITPendingBit(EXTI_Line2);
027 }
028 //外部中断3服务程序
029 void EXTI3_IRQHandler(void)
030 {
031 delay_ms(10); //消抖
032 if(KEY1==0)
033 {
034 LED1=!LED1;
035 }
036 EXTI_ClearITPendingBit(EXTI_Line3); //清除LINE3上的中断标志位
037 }
038 //外部中断4服务程序
039 void EXTI4_IRQHandler(void)
040 {
041 delay_ms(10); //消抖
042 if(KEY0==0)
043 {
044 LED0=!LED0;
045 }
046 EXTI_ClearITPendingBit(EXTI_Line4);//清除LINE4上的中断标志位
047 }
048
049 //外部中断初始化程序
050 //初始化PE2~4,PA0为中断输入.
051 void EXTIX_Init(void)
052 {
053 NVIC_InitTypeDef NVIC_InitStructure;
054 EXTI_InitTypeDef EXTI_InitStructure;
055
056 KEY_Init();
057
058 RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);//使能SYSCFG时钟
059
060
061 SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOE, EXTI_PinSource2);//PE2 连接到中断线2
062 SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOE, EXTI_PinSource3);//PE3 连接到中断线3
063 SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOE, EXTI_PinSource4);//PE4 连接到中断线4
064 SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA, EXTI_PinSource0);//PA0 连接到中断线0
065
066 /* 配置EXTI_Line0 */
067 EXTI_InitStructure.EXTI_Line = EXTI_Line0;//LINE0
068 EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;//中断事件
069 EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; //上升沿触发
070 EXTI_InitStructure.EXTI_LineCmd = ENABLE;//使能LINE0
071 EXTI_Init(EXTI_InitStructure);//配置
072
073 /* 配置EXTI_Line2,3,4 */
074 EXTI_InitStructure.EXTI_Line = EXTI_Line2 | EXTI_Line3 | EXTI_Line4;
075 EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;//中断事件
076 EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //下降沿触发
077 EXTI_InitStructure.EXTI_LineCmd = ENABLE;//中断线使能
078 EXTI_Init(EXTI_InitStructure);//配置
079
080
081 NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;//外部中断0
082 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x00;//抢占优先级0
083 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02;//子优先级2
084 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//使能外部中断通道
085 NVIC_Init(NVIC_InitStructure);//配置
086
087 NVIC_InitStructure.NVIC_IRQChannel = EXTI2_IRQn;//外部中断2
088 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x03;//抢占优先级3
089 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02;//子优先级2
090 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//使能外部中断通道
091 NVIC_Init(NVIC_InitStructure);//配置
092
093
094 NVIC_InitStructure.NVIC_IRQChannel = EXTI3_IRQn;//外部中断3
095 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02;//抢占优先级2
096 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02;//子优先级2
097 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//使能外部中断通道
098 NVIC_Init(NVIC_InitStructure);//配置
099
100
101 NVIC_InitStructure.NVIC_IRQChannel = EXTI4_IRQn;//外部中断4
102 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x01;//抢占优先级1
103 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02;//子优先级2
104 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//使能外部中断通道
105 NVIC_Init(NVIC_InitStructure);//配置
106
107 }
01 void KEY_Init(void) //IO初始化
02 {
03 GPIO_InitTypeDef GPIO_InitStructure;
04 //初始化KEY0--GPIOA.13,KEY1--GPIOA.15 上拉输入
05 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOE,ENABLE);//使能PORTA,PORTE时钟
06
07 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4;//PE2~4
08 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //设置成上拉输入
09 GPIO_Init(GPIOE, GPIO_InitStructure);//初始化GPIOE2,3,4
10
11 //初始化 WK_UP--GPIOA.0 下拉输入
12 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
13 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //PA0设置成输入,默认下拉
14 GPIO_Init(GPIOA, GPIO_InitStructure);//初始化GPIOA.0
15
16 }
实现TIM2中断需要以下几个步骤:
1.配置系统时钟函数RCC_Configuration()中使能TIM2时钟:
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
2.TIM2配置函数TIMER_Configeration()中使能中断:
void TIMER_Configeration(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
//TIM_OCInitTypeDef TIM_OCInitStructure;
TIM_TimeBaseStructure.TIM_Period = 10000;
TIM_TimeBaseStructure.TIM_Prescaler = 71;
TIM_TimeBaseStructure.TIM_ClockDivision =TIM_CKD_DIV1;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM2, TIM_TimeBaseStructure);
TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);
}
3.中断向量配置函数NVIC_Configuration()中使能TIM2中断:
NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(NVIC_InitStructure);
4.编写中断子程序:你已经完成
5.main函数中调用各个函数:
int main()
{
RCC_Configuration();
TIMER_Configeration();
NVIC_Configuration();
。。。。。。。
}
本文标签:stm32f4不进中断