【经验分享】STM32F103与407的不同点总结

[复制链接]

STMCU-管管

发布时间:2021-6-1 15:03

文章

文章封面:

文章简介:

相信大家一开始入门32都是103,后面对性能要求更高了开始学习407,但两者之间区别虽然不大,但是还是有一些区别的,这是我的一些体会

相信大家一开始入门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寄存器

后面就是根据具体的要求写中断函数了

复制代码未完待续...

赞 0

收藏 0

评论0

分享

发布时间:2021-6-1 15:03

举报

请先登录后回复

0个回答