本人写的博客是自己个人感悟,学习思路的整理,毕竟能力有限,欢迎各位批评指正。转载请注明出处。
STM32 外设中断配置流程
参考资料:《STM32库开发实战指南》
时间:2013.12.05
以SPI为例:
(至于那些结构体为什么这么配置,大家可以在STM32的官方资料以及相关学习书籍上找到,这里不再多说,只是针对流程进行简单介绍)
/***********SPI2配置函数***********/
void SPI_Config(void)
{
/*①声明结构体*/
GPIO_InitTypeDef GPIO_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
SPI_InitTypeDef SPI_InitStructure;
/*②使能外设时钟*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB , ENABLE );
RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);
/*③配置GPIO_InitStructure引脚参数 */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOB, &GPIO_InitStructure);
/*④配置NVIC_InitStructure参数*/
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
NVIC_InitStructure.NVIC_IRQChannel = SPI2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
/*⑤配置SPI_InitStructure参数*/
SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex ;
SPI_InitStructure.SPI_Mode = SPI_Mode_Slave;
SPI_InitStructure.SPI_DataSize = SPI_DataSize_16b ;
SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2 ;
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB ;
SPI_InitStructure.SPI_CRCPolynomial = 7;
SPI_Init(SPI2 , &SPI_InitStructure );
/*⑥注意以上配置完后要使能外设,不然外设是不会工作的*/
SPI_Cmd(SPI2 , ENABLE);//使能SPI2
/*⑦配置SPI的事件触发中断*/
SPI_I2S_ITConfig( SPI2, SPI_I2S_IT_RXNE, ENABLE );//相当于开启中断
}
然后在stm32f10x_it.c文件中填入中断服务函数
void SPI2_IRQHandler(void)
{
if (SPI_I2S_GetITStatus(SPI2, SPI_I2S_IT_RXNE) == SET)//注意标志位的选择
{
SPI_I2S_ClearITPendingBit( SPI2 , SPI_I2S_IT_RXNE ) ;//清除标志位
//写下自己的代码
}
}
好啦,基本上就是这些了。ST的官方库有很多共通的地方,比如xxx_Cmd()函数来使能外设,xxx_ITConfig()函数来配置外设的事件触发中断。