STM32F407IGH6学习笔记
Cortex-M4 内核(NVIC)理论上能够支持最多 256 个中断,其中包含 16 个系统中断(内核中断)和 240 个外部中断。然而,在实际的产品设计中,芯片厂商通常不会完全利用Cortex-M4 内核提供的所有中断资源。以这款微控制器为例,它虽然基于 Cortex-M4 内核,但只使用了92个中断,其中有10个不可屏蔽中断,82个可屏蔽中断。如下图文及代码/***/具有 16 级可编程中断
文章目录
STM32F407IGH6 GPIO引脚分布
| 外设 | 引脚 |
|---|---|
| KEY1 | PC9 |
| KEY2 | PC8 |
| KEY3 | PC5 |
| STATE_LED | PF8 |
| USER | PF9 |
| LED1 | PC4 |
| LED2 | PC3 |
| LED3 | PC13 |
| BEEP | PA15 |
| UART2_RX | PA13 |
| UART2_TX | PA12 |
| UART3_RX | PB11 |
| UART3_TX | PB10 |
| IO_PIR(人体红外线) | PB4 |
| IO_Fire(火焰传感器) | PB3 |
| IO_ITR(光电传感器) | PB2 |
通信协议
| 外设 | 引脚 |
|---|---|
| I2C1_SDA | PB7 |
| I2C1_SDL | PB6 |
| SPI2_MOSI | PB15 |
| SPI2_MISO | PB14 |
| SPI2_SCK | PB13 |
| SPI2_NSS | PB12 |
| CAN_TX | PB9 |
| CAN_RX | PB8 |
STM32F407IGH6 RCC时钟设置

STM32F407IGH6 GPIO常用寄存器

输出模式

输入模式
上拉输入
在上拉输入模式下,寄存器直接读取IO端口的电平
IO端口为高电平,读取的就是高电平;
IO端口为低电平,读取的就是低电平;
IO端口悬空无信号输入时,读取的是高电平;
下拉输入
在下拉输入模式下,寄存器直接读取IO端口的电平
IO端口为高电平,读取的就是高电平;
IO端口为低电平,读取的就是低电平;
IO端口悬空无信号输入时,读取的是低电平;
浮空输入
在浮空输入模式下,寄存器直接读取IO端口的电平
IO端口为高电平,读取的就是高电平;
IO端口为低电平,读取的就是低电平;
IO端口悬空无信号输入时,读取的电平不确定;
总结

STM32F407 时钟树

STM32F407IGH6 中断
Cortex-M4 内核(NVIC)理论上能够支持最多 256 个中断,其中包含 16 个系统中断(内核中断)和 240 个外部中断。
然而,在实际的产品设计中,芯片厂商通常不会完全利用 Cortex-M4 内核提供的所有中断资源。以 STM32F407IGH6 这款微控制器为例,它虽然基于 Cortex-M4 内核,但只使用了 92个中断,其中有 10个不可屏蔽中断,82个可屏蔽中断。 如下图文及代码

/**
* @brief STM32F4XX Interrupt Number Definition, according to the selected device
* in @ref Library_configuration_section
*/
typedef enum
{
/****** Cortex-M4 Processor Exceptions Numbers ****************************************************************/
NonMaskableInt_IRQn = -14, /*!< 2 Non Maskable Interrupt */
MemoryManagement_IRQn = -12, /*!< 4 Cortex-M4 Memory Management Interrupt */
BusFault_IRQn = -11, /*!< 5 Cortex-M4 Bus Fault Interrupt */
UsageFault_IRQn = -10, /*!< 6 Cortex-M4 Usage Fault Interrupt */
SVCall_IRQn = -5, /*!< 11 Cortex-M4 SV Call Interrupt */
DebugMonitor_IRQn = -4, /*!< 12 Cortex-M4 Debug Monitor Interrupt */
PendSV_IRQn = -2, /*!< 14 Cortex-M4 Pend SV Interrupt */
SysTick_IRQn = -1, /*!< 15 Cortex-M4 System Tick Interrupt */
/****** STM32 specific Interrupt Numbers **********************************************************************/
WWDG_IRQn = 0, /*!< Window WatchDog Interrupt */
PVD_IRQn = 1, /*!< PVD through EXTI Line detection Interrupt */
TAMP_STAMP_IRQn = 2, /*!< Tamper and TimeStamp interrupts through the EXTI line */
RTC_WKUP_IRQn = 3, /*!< RTC Wakeup interrupt through the EXTI line */
FLASH_IRQn = 4, /*!< FLASH global Interrupt */
RCC_IRQn = 5, /*!< RCC global Interrupt */
EXTI0_IRQn = 6, /*!< EXTI Line0 Interrupt */
EXTI1_IRQn = 7, /*!< EXTI Line1 Interrupt */
EXTI2_IRQn = 8, /*!< EXTI Line2 Interrupt */
EXTI3_IRQn = 9, /*!< EXTI Line3 Interrupt */
EXTI4_IRQn = 10, /*!< EXTI Line4 Interrupt */
DMA1_Stream0_IRQn = 11, /*!< DMA1 Stream 0 global Interrupt */
DMA1_Stream1_IRQn = 12, /*!< DMA1 Stream 1 global Interrupt */
DMA1_Stream2_IRQn = 13, /*!< DMA1 Stream 2 global Interrupt */
DMA1_Stream3_IRQn = 14, /*!< DMA1 Stream 3 global Interrupt */
DMA1_Stream4_IRQn = 15, /*!< DMA1 Stream 4 global Interrupt */
DMA1_Stream5_IRQn = 16, /*!< DMA1 Stream 5 global Interrupt */
DMA1_Stream6_IRQn = 17, /*!< DMA1 Stream 6 global Interrupt */
ADC_IRQn = 18, /*!< ADC1, ADC2 and ADC3 global Interrupts */
CAN1_TX_IRQn = 19, /*!< CAN1 TX Interrupt */
CAN1_RX0_IRQn = 20, /*!< CAN1 RX0 Interrupt */
CAN1_RX1_IRQn = 21, /*!< CAN1 RX1 Interrupt */
CAN1_SCE_IRQn = 22, /*!< CAN1 SCE Interrupt */
EXTI9_5_IRQn = 23, /*!< External Line[9:5] Interrupts */
TIM1_BRK_TIM9_IRQn = 24, /*!< TIM1 Break interrupt and TIM9 global interrupt */
TIM1_UP_TIM10_IRQn = 25, /*!< TIM1 Update Interrupt and TIM10 global interrupt */
TIM1_TRG_COM_TIM11_IRQn = 26, /*!< TIM1 Trigger and Commutation Interrupt and TIM11 global interrupt */
TIM1_CC_IRQn = 27, /*!< TIM1 Capture Compare Interrupt */
TIM2_IRQn = 28, /*!< TIM2 global Interrupt */
TIM3_IRQn = 29, /*!< TIM3 global Interrupt */
TIM4_IRQn = 30, /*!< TIM4 global Interrupt */
I2C1_EV_IRQn = 31, /*!< I2C1 Event Interrupt */
I2C1_ER_IRQn = 32, /*!< I2C1 Error Interrupt */
I2C2_EV_IRQn = 33, /*!< I2C2 Event Interrupt */
I2C2_ER_IRQn = 34, /*!< I2C2 Error Interrupt */
SPI1_IRQn = 35, /*!< SPI1 global Interrupt */
SPI2_IRQn = 36, /*!< SPI2 global Interrupt */
USART1_IRQn = 37, /*!< USART1 global Interrupt */
USART2_IRQn = 38, /*!< USART2 global Interrupt */
USART3_IRQn = 39, /*!< USART3 global Interrupt */
EXTI15_10_IRQn = 40, /*!< External Line[15:10] Interrupts */
RTC_Alarm_IRQn = 41, /*!< RTC Alarm (A and B) through EXTI Line Interrupt */
OTG_FS_WKUP_IRQn = 42, /*!< USB OTG FS Wakeup through EXTI line interrupt */
TIM8_BRK_TIM12_IRQn = 43, /*!< TIM8 Break Interrupt and TIM12 global interrupt */
TIM8_UP_TIM13_IRQn = 44, /*!< TIM8 Update Interrupt and TIM13 global interrupt */
TIM8_TRG_COM_TIM14_IRQn = 45, /*!< TIM8 Trigger and Commutation Interrupt and TIM14 global interrupt */
TIM8_CC_IRQn = 46, /*!< TIM8 Capture Compare global interrupt */
DMA1_Stream7_IRQn = 47, /*!< DMA1 Stream7 Interrupt */
FSMC_IRQn = 48, /*!< FSMC global Interrupt */
SDIO_IRQn = 49, /*!< SDIO global Interrupt */
TIM5_IRQn = 50, /*!< TIM5 global Interrupt */
SPI3_IRQn = 51, /*!< SPI3 global Interrupt */
UART4_IRQn = 52, /*!< UART4 global Interrupt */
UART5_IRQn = 53, /*!< UART5 global Interrupt */
TIM6_DAC_IRQn = 54, /*!< TIM6 global and DAC1&2 underrun error interrupts */
TIM7_IRQn = 55, /*!< TIM7 global interrupt */
DMA2_Stream0_IRQn = 56, /*!< DMA2 Stream 0 global Interrupt */
DMA2_Stream1_IRQn = 57, /*!< DMA2 Stream 1 global Interrupt */
DMA2_Stream2_IRQn = 58, /*!< DMA2 Stream 2 global Interrupt */
DMA2_Stream3_IRQn = 59, /*!< DMA2 Stream 3 global Interrupt */
DMA2_Stream4_IRQn = 60, /*!< DMA2 Stream 4 global Interrupt */
ETH_IRQn = 61, /*!< Ethernet global Interrupt */
ETH_WKUP_IRQn = 62, /*!< Ethernet Wakeup through EXTI line Interrupt */
CAN2_TX_IRQn = 63, /*!< CAN2 TX Interrupt */
CAN2_RX0_IRQn = 64, /*!< CAN2 RX0 Interrupt */
CAN2_RX1_IRQn = 65, /*!< CAN2 RX1 Interrupt */
CAN2_SCE_IRQn = 66, /*!< CAN2 SCE Interrupt */
OTG_FS_IRQn = 67, /*!< USB OTG FS global Interrupt */
DMA2_Stream5_IRQn = 68, /*!< DMA2 Stream 5 global interrupt */
DMA2_Stream6_IRQn = 69, /*!< DMA2 Stream 6 global interrupt */
DMA2_Stream7_IRQn = 70, /*!< DMA2 Stream 7 global interrupt */
USART6_IRQn = 71, /*!< USART6 global interrupt */
I2C3_EV_IRQn = 72, /*!< I2C3 event interrupt */
I2C3_ER_IRQn = 73, /*!< I2C3 error interrupt */
OTG_HS_EP1_OUT_IRQn = 74, /*!< USB OTG HS End Point 1 Out global interrupt */
OTG_HS_EP1_IN_IRQn = 75, /*!< USB OTG HS End Point 1 In global interrupt */
OTG_HS_WKUP_IRQn = 76, /*!< USB OTG HS Wakeup through EXTI interrupt */
OTG_HS_IRQn = 77, /*!< USB OTG HS global interrupt */
DCMI_IRQn = 78, /*!< DCMI global interrupt */
RNG_IRQn = 80, /*!< RNG global Interrupt */
FPU_IRQn = 81 /*!< FPU global interrupt */
} IRQn_Type;
具有 16 级可编程中断优先级,82 个可屏蔽中断的打开与关闭、挂起等,都是被寄存器控制。这些寄存器都已被标准封装成 NVIC_Type 的结构体,如图所示:
typedef struct
{
__IOM uint32_t ISER[8U]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register 中断使能寄存器组*/
uint32_t RESERVED0[24U];
__IOM uint32_t ICER[8U]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register 中断清除使能寄存器组*/
uint32_t RESERVED1[24U];
__IOM uint32_t ISPR[8U]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register 个中断使能挂起控制寄存器组*/
uint32_t RESERVED2[24U];
__IOM uint32_t ICPR[8U]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register 中断解挂控制寄存器组*/
uint32_t RESERVED3[24U];
__IOM uint32_t IABR[8U]; /*!< Offset: 0x200 (R/W) Interrupt Active bit Register 中断激活标志位寄存器组*/
uint32_t RESERVED4[56U];
__IOM uint8_t IP[240U]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register (8Bit wide) 中断优先级控制寄存器组*/
uint32_t RESERVED5[644U];
__OM uint32_t STIR; /*!< Offset: 0xE00 ( /W) Software Trigger Interrupt Register */
} NVIC_Type;
中断优先级
typedef struct
{
__IO uint32_t ISER[8]; //中断使能寄存器组
uint32_t RESERVED0[24];
__IO uint32_t ICER[8]; //中断清除寄存器组
uint32_t RSERVED1[24];
__IO uint32_t ISPR[8]; //中断挂起寄存器组
uint32_t RESERVED2[24];
__IO uint32_t ICPR[8]; //中断解挂寄存器组
uint32_t RESERVED3[24];
__IO uint32_t IABR[8]; //中断激活标志位寄存器组
uint32_t RESERVED4[56];
__IO uint8_t IP[240]; //中断优先级控制的寄存器组
uint32_t RESERVED5[644];
__O uint32_t STIR;
} NVIC_Type;

STM32F407IGH6 异常

中断与事件的区别
中断,是检测到外部上升或者下降沿,触发中断,进入中断服务函数。
事件,是检测到外部上升或者下降沿,最终产生的是指定频率的脉冲信号
光电开关

结合红外发射、光电接收与遮挡逻辑分析光电开关中**光电三极管U13(ITR9608-F)**的状态变化:
1. 红外发射管的工作状态
左侧红外发射管(引脚1接VCC 3.3V,引脚2接地)始终处于导通状态,持续发射红外光。
2. 光电三极管U13的状态(核心:“光照→导通;无光照→截止”)
U13是反射式光电三极管,其导通/截止由“是否接收到反射的红外光”决定:
-
无物体遮挡时:
红外发射管的光经反射后,被U13接收。此时光电三极管因光照产生载流子,进入导通状态。
U13的集电极(引脚3)通过导通的三极管直接拉到发射极(引脚4,接地),因此引脚3电位为低电平(接近0V)。 -
有物体遮挡时:
红外光被物体阻挡,无法反射到U13。此时光电三极管因缺乏光照,载流子极少,进入截止状态。
U13的集电极(引脚3)通过上拉电阻R46(100Ω)接VCC 3.3V,因此引脚3电位为高电平(接近3.3V)。
3. 对后续电路的影响
U13集电极的电平变化(高/低)会输入到比较器U14A(LM393)的同相输入端(引脚3+),与反相输入端(引脚2-)的参考电压比较后,输出电平控制PE15引脚和指示灯LD5的状态,最终实现“遮挡检测→电信号反馈”的功能。
总结:
- 无遮挡 → 光电三极管导通 → 集电极低电平;
- 有遮挡 → 光电三极管截止 → 集电极高电平。
HCLK(高性能总线时钟)
HCLK(高性能总线时钟)是STM32微控制器中连接AHB总线的时钟信号,由系统时钟(SYSCLK)分频得到,通常直接等于SYSCLK的频率。
核心作用
HCLK为AHB总线提供时钟信号,直接关联CPU和外设的工作频率。例如,当SYSCLK为72MHz时,HCLK通常也为72MHz,用于驱动高性能外设(如串口、定时器等)。
与其他时钟的关系
SYSCLK:系统时钟,决定CPU和外设的整体运行节奏,通过分频器生成HCLK等子时钟。
FCLK:直接为CPU内核提供时钟信号(如主频),与HCLK并行运行但独立分频。
PCLK:为APB总线提供时钟信号,通常由HCLK分频得到。
更多推荐








所有评论(0)