相信大家一开始入门32都是103,后面对性能要求更高了开始学习407,但两者之间区别虽然不大,但是还是有一些区别的,这是我的一些体会
我这里选用的是STM32F407ZGT6STM32F103ZET6,应该是103和407的顶配了,分别对应正点原子的精英版和探索者
STM32F407ZGT6的基本外设
- STM32F407ZGT6 作为 MCU,该芯片是
- STM32F407 里面配置非常强大的了,它拥有的资源包括:集成 FPU 和 DSP 指令,并具有 192KB
- SRAM、1024KB FLASH、12 个 16 位定时器、2 个 32 位定时器、2 个 DMA 控制器(共 16 个通道)、3 个 SPI、2 个全双工 I2S、3 个 IIC、6 个串口、2 个 USB(支持 HOST /SLAVE)、2 个CAN、3 个 12 位 ADC、2 个 12 位 DAC、1 个 RTC(带日历功能)、1 个 SDIO 接口、1 个 FSMC接口、1 个 10/100M 以太网 MAC 控制器、1 个摄像头接口、1 个硬件随机数生成器、以及 112个通用 IO 口等。该芯片的配置十分强悍,很多功能相对 STM32F1 来说进行了重大改进,比如
- FSMC 的速度,F4 刷屏速度可达 3300W 像素/秒,而 F1 的速度则只有 500W 左右。
复制代码 STM32F103ZET6的基本外设
- STM32F103ZETT6 作为 MCU,该芯片是
- STM32F103 里面配置非常强大的了,它拥有的资源包括:64KB SRAM、512KB FLASH、2 个基本定时器、4 个通用定时器、2 个高级定时器、2 个 DMA 控制器(共 12 个通道)、3 个 SPI、2 个 IIC、5 个串口、1 个 USB、1 个 CAN、3 个 12 位 ADC、1 个 12 位 DAC、1 个 SDIO 接口、1 个 FSMC 接口以及 112 个通用 IO 口。该芯片的配置十分强悍,并且还带外部总线(FSMC)
- 可以用来外扩 SRAM 和连接 LCD 等,通过 FSMC 驱动 LCD,可以显著提高 LCD 的刷屏速度,
- 是 STM32F1 家族常用型号里面,最高配置的芯片了
复制代码 407的系统时钟
- SYSCLK(系统时钟) =168MHz
- AHB 总线时钟(HCLK=SYSCLK) =168MHz
- APB1 总线时钟(PCLK1=SYSCLK/4) =42MHz
- APB2 总线时钟(PCLK2=SYSCLK/2) =84MHz
- PLL 主时钟 =168MHz
复制代码 103的系统时钟
- SYSCLK(系统时钟) =72MHz
- AHB 总线时钟(使用 SYSCLK) =72MHz
- APB1 总线时钟(PCLK1=SYSCLK/2) =36MHz
- APB2 总线时钟(PCLK2) =72MHz
- PLL 时钟 =72MHz
复制代码 时钟是非常重要的外设在使用之前,必须对时钟进行使能
IO的配置
两者的io都支持如下配置
- 1、输入浮空
- 2、输入上拉
- 3、输入下拉
- 4、模拟输入
- 5、开漏输出
- 6、推挽输出
- 7、推挽式复用功能
- 8、开漏式复用功能
复制代码 407IO输出配置
首先初始化io的时钟
- 使能 IO 口时钟。调用函数为 RCC_AHB1PeriphClockCmd ()
- RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);//使能GPIOF时钟
复制代码- 初始化 IO 参数。调用函数 GPIO_Init();
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//普通输出模式
- GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
- GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
- GPIO_Init(GPIOF, &GPIO_InitStructure);//初始化GPIO
复制代码 407IO输入配置
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;//普通输入模式
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100M
- GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
- GPIO_Init(GPIOE, &GPIO_InitStructure);//初始化GPIOE2,3,4
复制代码 103IO的输出配置
首先初始化io的时钟
- 使能 IO 口时钟。调用函数为 RCC_APB2PeriphClockCmd()。
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //使能 PB 端口时钟
复制代码- 初始化 IO 参数。调用函数 GPIO_Init()
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //LED0-->PB.5 推挽输出
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_Init(GPIOB, &GPIO_InitStructure);
- GPIO_SetBits(GPIOB,GPIO_Pin_5); //PB.5 输出高
复制代码 103IO的输入配置
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4|GPIO_Pin_3;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //设置成上拉输入
- GPIO_Init(GPIOE, &GPIO_InitStructure);//初始化GPIOE4,3
- ————————————————
复制代码 不同点
- 首先F4的io的时钟挂载在AHB1下,调用
- RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);//使能GPIOF时钟
- 其次
- typedef struct
- {
- uint32_t GPIO_Pin;
- GPIOMode_TypeDef GPIO_Mode;
- GPIOSpeed_TypeDef GPIO_Speed;
- GPIOOType_TypeDef GPIO_OType;//配置输出模式
- GPIOPuPd_TypeDef GPIO_PuPd; //上下拉的配置
- }GPIO_InitTypeDef;
- typedef enum
- {
- GPIO_PuPd_NOPULL = 0x00,
- GPIO_PuPd_UP = 0x01,
- GPIO_PuPd_DOWN = 0x02
- }GPIOPuPd_TypeDef;
- f4能在GPIO_Init配置时就配置引脚的上下拉高低电平
- typedef enum
- {
- GPIO_OType_PP = 0x00,
- GPIO_OType_OD = 0x01
- }GPIOOType_TypeDef;
- f4配置了输出后专门可以选择配置开漏输出和推挽输出,也就是比103分的更细一些了
- f4的速度最高可以配置为100mhz 103只有50mhz
复制代码 NVIC
- 首先两者都要在main函数里面设置中断优先级的分组,且只设置一次设置了就别改了避免发生错误
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
复制代码 407NVIC 中断优先级
- STM32F40xx/STM32F41xx 的 92 个中断里面,包括 10 个内核中断和 82 个可屏蔽中断,具
- 有 16 级可编程的中断优先级,而我们常用的就是这 82 个可屏蔽中断
复制代码 103NVIC 中断优先级
- 说了 CM3 内核支持 256 个中断,这里用 8 个 32 位寄存器来控制,每个位控制一个中断。但是
- STM32F103 的可屏蔽中断只有 60 个
复制代码 NVIC 的配置也是一样的
- NVIC_InitTypeDef NVIC_InitStructure;
- NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;//串口 1 中断
- NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1 ;// 抢占优先级为 1
- NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;// 子优先级位 2
- NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ 通道使能
- NVIC_Init(&NVIC_InitStructure); //根据上面指定的参数初始化 NVIC 寄存器
复制代码 外部中断
407的外部中断
- STM32F407 的中断控制器支持 22
- 个外部中断/事件请求。每个中断设有状态位,每个中断/事件都有独立的触发和屏蔽设置。
- STM32F407 的 22 个外部中断为:
- EXTI 线 0~15:对应外部 IO 口的输入中断。
- EXTI 线 16:连接到 PVD 输出。
- EXTI 线 17:连接到 RTC 闹钟事件。
- EXTI 线 18:连接到 USB OTG FS 唤醒事件。
- EXTI 线 19:连接到以太网唤醒事件。
- EXTI 线 20:连接到 USB OTG HS(在 FS 中配置)唤醒事件。
- EXTI 线 21:连接到 RTC 入侵和时间戳事件。
- EXTI 线 22:连接到 RTC 唤醒事件。
- STM32F4 供 IO 口使用的中断线只有 16 个
复制代码 103的外部中断
- STM32F103 的中断控制器支持 19 个外部中断/
- 事件请求。每个中断设有状态位,每个中断/事件都有独立的触发和屏蔽设置。STM32F103 的
- 19 个外部中断为:
- 线 0~15:对应外部 IO 口的输入中断。
- 线 16:连接到 PVD 输出。
- 线 17:连接到 RTC 闹钟事件。
- 线 18:连接到 USB 唤醒事件。
- STM32f103 供 IO 口使用的中断线只有 16 个
复制代码 外部中断服务函数都是一样的
- EXTI0_IRQHandler
- EXTI1_IRQHandler
- EXTI2_IRQHandler
- EXTI3_IRQHandler
- EXTI4_IRQHandler
- EXTI9_5_IRQHandler
- EXTI15_10_IRQHandler
- ————————————————
复制代码 103外部中断的配置步骤
- 初始化IO口为输入。
- GPIO_Init();
- 开启IO口复用时钟。
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
- 设置IO口与中断线的映射关系。
- void GPIO_EXTILineConfig();
- 初始化线上中断,设置触发条件等。
- EXTI_Init();
- 配置中断分组(NVIC),并使能中断。
- NVIC_Init();
- 编写中断服务函数。
- EXTIx_IRQHandler();
- 清除中断标志位
- EXTI_ClearITPendingBit();
复制代码- typedef struct
- {
- uint32_t EXTI_Line; //指定要配置的中断线
- EXTIMode_TypeDef EXTI_Mode; //模式:事件 OR中断
- EXTITrigger_TypeDef EXTI_Trigger;//触发方式:上升沿/下降沿/双沿触发
- FunctionalState EXTI_LineCmd; //使能 OR失能
- }EXTI_InitTypeDef;
复制代码- io初始化省略
- EXTI_InitTypeDef EXTI_InitStructure;
- NVIC_InitTypeDef NVIC_InitStructure;
- //使能复用功能时钟
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
- //配置 GPIO 与中断线的映射关系
- //void GPIO_EXTILineConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource)
- GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource3);
- 将中断线 3 与 GPIOE 映射起来,那么很显然是 GPIOE.3 与 EXTI3 中断线连接了
- //初始化线上中断,设置触发条件等
- EXTI_InitStructure.EXTI_Line=EXTI_Line3; //设置中断线的标号
- EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; //中断模式
- //有两个模式中断和事件可选这里是中断
- EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;//设置触发方式
- //设置触发方式,有上升沿和下降沿,还有双边沿,这里配置的是下降沿
- EXTI_InitStructure.EXTI_LineCmd = ENABLE;
- EXTI_Init(&EXTI_InitStructure); //根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器
- //配置中断分组(NVIC),并使能中断
- NVIC_InitStructure.NVIC_IRQChannel = EXTI3_IRQn; //使能外部中断通道
- NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02; //抢占优先级2
- NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x01; //子优先级1
- NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能外部中断通道
- NVIC_Init(&NVIC_InitStructure); //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器
- 后面就是根据具体的要求写中断函数了
复制代码 未完待续...
|