如果按照下面程序设置时,SPI可以正常发送数据,持续进入中断。
但是如果去掉对TIM4的中断优先级的设置,SPI中断只能进入一次。之后再不能竟如中断(TIM4中断没有使能)。
如果将TIM4的中断优先级仍然分别设置为 0,2将SPI的设置为1,0 SPI也不能正常进入中断。
中断优先级的设置有什么特殊的要求吗?请遇到类似情况的帮忙解答。
程序如下。
void SPI1_IRQHandler(void)
{
if(SPI_I2S_GetITStatus(SPI1, SPI_I2S_IT_TXE)==SET)
{
SPI1->DR=0x0001; //中断中只不断发数据
}
}
void spi_init(void)
{
SPI_InitTypeDef SPI_InitStructure;
SPI_InitStructure.SPI_Direction = SPI_Direction_1Line_Tx; //设置SPI单向或者双向的数据模式:SPI设置为双线双向全双工
SPI_InitStructure.SPI_Mode = SPI_Mode_Slave; //设置SPI工作模式:设置为从SPI
SPI_InitStructure.SPI_DataSize = SPI_DataSize_16b; //设置SPI的数据大小:SPI发送接收16位帧结构
SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low; //选择了串行时钟的稳态:时钟悬空低
SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge; //数据捕获于第二个时钟沿
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; //指定数据传输从MSB位还是LSB位开始:数据传输从MSB位开始
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; //NSS信号由硬件(NSS管脚)还是软件(使用SSI位)管理:内部NSS信号有SSI位控制
SPI_NSSInternalSoftwareConfig(SPI1, SPI_NSSInternalSoft_Reset);
SPI_Init(SPI1, &SPI_InitStructure); //根据SPI_InitStruct中指定的参数初始化外设SPIx寄存器
SPI_I2S_ITConfig(SPI1, SPI_I2S_IT_TXE, ENABLE);
SPI_Cmd(SPI1, ENABLE); //使能SPI外设 // SPI1->CR1 |= (u16)0x0040;
SPI_I2S_SendData(SPI1, 0x0);
}
void NVIC_Configuration(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
/* Enable the TIM4 global Interrupt DISABLE,ENABLE*/
NVIC_InitStructure.NVIC_IRQChannel=TIM1_CC_IRQChannel;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority =0 ;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
/* Enable the SPI global Interrupt DISABLE,ENABLE*/
NVIC_InitStructure.NVIC_IRQChannel=SPI1_IRQChannel;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
} |