【经验分享】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个回答
