Tôi đang làm việc trong một dự án liên quan đến MCM STM32 (trên bảng STM32303C-EVAL chính xác) phải đáp ứng với ngắt ngoài. Tôi muốn phản ứng với ngắt bên ngoài càng nhanh càng tốt. Tôi đã sửa đổi một ví dụ thư viện ngoại vi tiêu chuẩn từ trang web ST và chương trình hiện tại chỉ đơn giản là bật đèn LED ở mỗi cạnh tăng liên tiếp trên PE6:
#include "stm32f30x.h"
#include "stm32303c_eval.h"
EXTI_InitTypeDef EXTI_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
static void EXTI9_5_Config(void);
int main(void)
{
/* Initialize LEDs mounted on STM32303C-EVAL board */
STM_EVAL_LEDInit(LED1);
/* Configure PE6 in interrupt mode */
EXTI9_5_Config();
/* Infinite loop */
while (1)
{
}
}
// Configure PE6 and PD5 in interrupt mode
static void EXTI9_5_Config(void)
{
/* Enable clocks */
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOD | RCC_AHBPeriph_GPIOE, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
/* Configure input */
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
GPIO_Init(GPIOD, &GPIO_InitStructure);
/* Connect EXTI6 Line to PE6 pin */
SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOE, EXTI_PinSource6);
/* Configure Button EXTI line */
EXTI_InitStructure.EXTI_Line = EXTI_Line6;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
/* Enable and set interrupt to the highest priority */
NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x00;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
Trình xử lý ngắt trông như thế này:
void EXTI9_5_IRQHandler(void)
{
if((EXTI_GetITStatus(EXTI_Line6) != RESET))
{
/* Toggle LD1 */
STM_EVAL_LEDToggle(LED1);
/* Clear the EXTI line 6 pending bit */
EXTI_ClearITPendingBit(EXTI_Line6);
}
}
Trong trường hợp cụ thể này, các ngắt được tạo bởi một bộ tạo chức năng lập trình bên ngoài chạy ở tần số 100 Hz. Sau khi kiểm tra phản hồi MCU trên máy hiện sóng, tôi khá ngạc nhiên khi phải mất gần 1,32 chúng tôi để MCU bắt đầu xử lý ngắt:
Với MCU chạy ở 72 MHz (tôi đã kiểm tra đầu ra SYSCLK trên chân MCO trước đó), con số này lên tới gần 89 chu kỳ xung nhịp. Không nên phản ứng MCU với ngắt nhanh hơn nhiều?
PS Mã được biên dịch với IAR Embedded Workbench và được tối ưu hóa cho tốc độ cao nhất.
if{}
câu lệnh là cần thiết vì thói quen ngắt không biết nguồn ngắt là gì.