嵌套向量中斷控制器
- 68個(gè)中斷通道
- 16級(jí)優(yōu)先級(jí)
- 電源管理控制
- 系統(tǒng)控制寄存器的時(shí)間
系統(tǒng)滴答
系統(tǒng)嘀嗒校準(zhǔn)值固定為9000掉蔬,當(dāng)系統(tǒng)嘀嗒時(shí)鐘設(shè)定為9MHz(HCLK/8的最大值),產(chǎn)生1ms時(shí)間基準(zhǔn)愚屁。
中斷和異常向量
68個(gè)中斷,按照分組肉津,可以分成:(小容量的有不同杆故,比如增加了TIM8的中斷,F(xiàn)SMC中斷等侨歉,但是少了OTG等中斷)
- 窗口定時(shí)器屋摇,電源電壓PVD,侵入檢測(cè),RTC實(shí)時(shí)時(shí)鐘和鬧鐘中斷,FLASH全局幽邓,RCC(復(fù)位和時(shí)鐘控制)炮温,一共8個(gè)
- 外部中斷,EXTI0EXTI4牵舵,一共5個(gè)柒啤,59共用一個(gè)倦挂,中斷10~15共用一個(gè)。
- DMA和DMA2 7個(gè)通道+5個(gè)通道白修,一共12個(gè)
- ADC1和ADC2全局
- CAN1的4個(gè)中斷和CAN2的4個(gè)
- TIM1高級(jí)定時(shí)器1,4個(gè)妒峦,TIM2,3兵睛,4全局共7個(gè)肯骇,以及定時(shí)器567各一個(gè)全局,
- I2C兩個(gè)模塊的時(shí)間和錯(cuò)誤祖很,一共4個(gè)
- SPI1和SPI2全局各1各
- USART1到USART5一共5個(gè)全局
- 以太網(wǎng)全局和喚醒笛丙,兩個(gè)
- OTG喚醒和全局
另外要注意的是,每一個(gè)模塊有很多的中斷源假颇,比如SPI通信胚鸯,這里只有一個(gè)全局的中斷,具體模塊中的中斷源笨鸡,需要在使用具體模塊時(shí)進(jìn)行設(shè)置姜钳,并打開全局中斷。
外部中斷/事件控制器
對(duì)于互聯(lián)型產(chǎn)品形耗,外部中斷/事件控制器由20個(gè)產(chǎn)生事件/中斷請(qǐng)求的邊沿檢測(cè)器組成哥桥,每個(gè)輸入線可以獨(dú)立地配置輸入類型(脈沖
或掛起)和對(duì)應(yīng)的觸發(fā)事件(上升沿或下降沿或者雙邊沿都觸發(fā))。
喚醒事件
可以通過外部或者內(nèi)部事件來喚醒內(nèi)核激涤,配置方法如下:
- 在外設(shè)中設(shè)置中斷時(shí)拟糕,不設(shè)置NVIC使能,而是設(shè)置SEVONPEND位倦踢,CPU喚醒以后送滞,需要軟件進(jìn)行清除。
- 也可以設(shè)置EXTI為事件模式辱挥,用來喚醒內(nèi)核犁嗅。
功能說明
外部中斷可以做中斷,也可以作為事件晤碘,如果作為事件愧哟,則要先配置并使能事件線,配置方法如下:
- 硬件中斷
- 打開屏蔽位
- 設(shè)置觸發(fā)選擇
- 設(shè)置NVIC通道使能和屏蔽位
- 硬件事件
硬件事件則只需要配置兩步哼蛆,同上 - 軟件中斷/軟件事件
- 配置屏蔽位,設(shè)置軟件中斷寄存器請(qǐng)求位
端口映射
- 端口一共有PA0霞赫,PB0腮介,PC0PG0,一共7組端口的第0位掛在EXT10上端衰,同樣叠洗,PA1甘改,PB1,掛在EXTI1上,這樣PA0~PA15一共占16個(gè)通道灭抑。
- 另外還有4根單獨(dú)的先十艾,分配給PVD,RTC腾节,USB喚醒和以太網(wǎng)喚醒忘嫉。
庫函數(shù)介紹
初始化和去初始化,以及結(jié)構(gòu)體初始化函數(shù)
初始化結(jié)構(gòu)體如下:
- uint32_t EXTI_Line //具體的中斷線
- FunctionalState EXTI_LineCmd //使能
- EXTIMode_TypeDef EXTI_Mode //中斷OR事件
- EXTITrigger_TypeDef EXTI_Trigger //觸發(fā)沿
狀態(tài)位 GetFlagStatus ClearFlag
這個(gè)簡(jiǎn)單案腺,入口參數(shù)是某條中斷線庆冕,返回的參數(shù)是是否產(chǎn)生了中斷,這個(gè)在中斷服務(wù)程序中使用劈榨。
中斷和掛起 GetITStatus 和ClearITPendingBit
同上访递,掛起和查詢某條中斷線的標(biāo)志。
GenerateSWInterrupt
產(chǎn)生一個(gè)軟件中斷同辣,由軟件來控制拷姿,相當(dāng)于虛擬一個(gè)硬件中斷。
GPIO_EXTILineConfig
在GPIO的頭文件中旱函,有一個(gè)GPIO_EXTILineConfig函數(shù)响巢,函數(shù)的功能是使用某個(gè)腳作為中斷線。
下面的中斷口配置功能中陡舅,用到了這些函數(shù)抵乓。
void EXTI0_Config(void)
{
//使能GPIOA的時(shí)鐘
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
//設(shè)置A0初始化
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &GPIO_InitStructure);
//使用的是A0的復(fù)用功能,打開復(fù)用時(shí)鐘
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
//使用GPIOA的PIN0作為中斷線
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0);
//配置中斷線的初始化
EXTI_InitStructure.EXTI_Line = EXTI_Line0;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
//配置中斷優(yōu)先級(jí)和使能中斷靶衍,并配置中斷服務(wù)程序的位置
NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x0F;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x0F;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}