首先呢,我得承认做为菜鸟,一直不是很明白M3的“中断组优先级”及“中断优先级”这两个概念。在本项目中,有如下定义:
使用工具为Keil
char a,b,c,d,e[10],*P;
int f,g,h,i,j;...............................................等等,有N多的全局变量及指针。
然后是相关的配置:
/******************************************************************************************/
//PWM配置动作
/******************************************************************************************/
SysCtlPeripheralEnable(SYSCTL_PERIPH_PWM); // 使能PWM模块
SysCtlPWMClockSet(SYSCTL_PWMDIV_1); // PWM时钟配置:不分频
GPIOPinTypePWM(SINA_PORT,SINA_PIN);// PG2配置为PWM0功能
GPIOPinTypePWM(SINB_PORT,SINB_PIN);// PD1配置为PWM1功能
GPIOPinTypePWM(SINC_PORT,SINC_PIN);// PH0配置为PWM1功能
GPIOPinTypePWM(SIND_PORT,SIND_PIN);// PH1配置为PWM1功能
PWMGenConfigure(PWM_BASE, PWM_GEN_0,PWM_GEN_MODE_UP_DOWN | PWM_GEN_MODE_NO_SYNC);// 配置PWM发生器0:加减计数,不同步
PWMGenConfigure(PWM_BASE, PWM_GEN_1,PWM_GEN_MODE_UP_DOWN | PWM_GEN_MODE_NO_SYNC);// 配置PWM发生器1:加减计数,不同步
PWMGenPeriodSet(PWM_BASE, PWM_GEN_0, 1040); // 设置PWM发生器0的周期
PWMGenPeriodSet(PWM_BASE, PWM_GEN_1, 1040); // 设置PWM发生器1的周期
PWMPulseWidthSet(PWM_BASE, PWM_OUT_0, 64); // 设置PWM0输出的脉冲宽度
PWMPulseWidthSet(PWM_BASE, PWM_OUT_1, 64); // 设置PWM1输出的脉冲宽度
PWMPulseWidthSet(PWM_BASE, PWM_OUT_2, 64); // 设置PWM2输出的脉冲宽度
PWMPulseWidthSet(PWM_BASE, PWM_OUT_3, 64); // 设置PWM3输出的脉冲宽度
PWMSyncUpdate(PWM_BASE,PWM_GEN_0_BIT | PWM_GEN_1_BIT);//配置PWM发生器0、1同步
PWMOutputState(PWM_BASE,PWM_OUT_0_BIT|PWM_OUT_1_BIT|PWM_OUT_2_BIT|PWM_OUT_3_BIT,true);// 使能PWM0、1、2、3的输出
IntPrioritySet(INT_PWM0, 0<< 5); 注意这个优先级设置为0,后面会改为1
IntPrioritySet(INT_PWM1, 1<< 5); 注意这个优先级设置为1,后面会改为2
PWMGenEnable(PWM_BASE, PWM_GEN_0); // 使能PWM发生器0,开始产生PWM方波
PWMGenEnable(PWM_BASE, PWM_GEN_1); // 使能PWM发生器1,开始产生PWM方波
PWMGenIntTrigEnable(PWM_BASE,PWM_GEN_0,PWM_INT_CNT_ZERO);//使能PWM发生器0归零触发中断
PWMGenIntTrigEnable(PWM_BASE,PWM_GEN_1,PWM_INT_CNT_ZERO);//使能PWM发生器1归零触发中断
PWMIntEnable(PWM_BASE, PWM_INT_GEN_0 | PWM_INT_GEN_1);//使能PWM发生器0、1中断
// PWMIntEnable(PWM_BASE, PWM_INT_GEN_1);//使能PWM发生器0中断
IntEnable(INT_PWM0);//使能PWM发生器0中断
IntEnable(INT_PWM1);//使能PWM发生器1中断
IntMasterEnable();//使能总中断
/******************************************************************************************/
//UART配置动作
/******************************************************************************************/
SysCtlPeripheralEnable(SYSCTL_PERIPH_UART1); // 使能UART模块
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOD); // 使能RX/TX所在的GPIO端口
GPIOPinTypeUART(GPIO_PORTD_BASE, // 配置RX/TX所在管脚为
GPIO_PIN_2 | GPIO_PIN_3); // UART收发功能
UARTConfigSet(UART1_BASE, // 配置UART端口
9600, // 波特率
UART_CONFIG_WLEN_8 | // 数据位:8
UART_CONFIG_STOP_ONE | // 停止位:1
UART_CONFIG_PAR_NONE); // 校验位:无
UARTFIFOLevelSet(UART1_BASE, // 设置发送和接收FIFO深度
UART_FIFO_TX2_8, // 发送FIFO为2/8深度(4B)
UART_FIFO_RX6_8); // 接收FIFO为6/8深度(12B)取值有1/8、2/8 、4/8 6/8、 7/8
IntPrioritySet(INT_UART1, 2 << 5);注意这个优先级设置为2,后面会改为3
UARTIntEnable(UART1_BASE, UART_INT_RX | UART_INT_RT); // 使能接收和接收超时中断UART_INT_TX|
IntEnable(INT_UART1); // 使能UART总中断
IntMasterEnable(); // 使能处理器中断
UARTEnable(UART1_BASE);
到此,配置了相关中断处理函数(IRQ)后,在main()里面,PWM0,PWM1,UART等程序运行一切都正常。
后来又增加了I2C模块,并配置相关中断及中断处理函数:
/******************************************************************************************/
//I2C配置动作
/******************************************************************************************/
I2CM_DeviceInitSet(>Device, 0, 0, 0, (void *)0, 0);
SysCtlPeripheralEnable(SYSCTL_PERIPH_I2C1); // 使能I2C1模块
SysCtlPeripheralEnable(I2CSCL_PERIPH); // 使能SCL所在的GPIO模块
GPIOPinTypeI2C(I2CSCL_PORT, I2CSCL_PIN); // 配置相关管脚为SCL功能
SysCtlPeripheralEnable(I2CSDA_PERIPH); // 使能SDA所在的GPIO模块
GPIOPinTypeI2C(I2CSDA_PORT, I2CSDA_PIN); // 配置相关管脚为SDA功能
IntPrioritySet(INT_I2C1, 0 << 5);注意这个优先级设置为0,并把上面的PWM0,PWM1,UART的优先级做向后顺延。意图是设I2C为最高优先级
IntEnable(INT_I2C1); // 使能I2C1中断
I2CMasterInit(I2C1_MASTER_BASE, true); // I2C主机模块初始化,100kbps
I2CMasterIntEnable(I2C1_MASTER_BASE); // 使能I2C主模块中断
IntMasterEnable(); // 使能处理器中断
I2CMasterEnable(I2C1_MASTER_BASE); // 使能I2C主机
关于NVIC,仅仅是在M3的默认状态增加了 IntPrioritySet(INT_I2C1, 0 << 5);这一改变优先级的库函数。
本菜鸟试图找原因,却始终不明白原因。怀疑堆栈溢出,或者LR错误,又或者中断设置及嵌套存在问题。
请各位大侠们帮忙诊断一下病因。不胜感激。