你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

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

[复制链接]
STMCU-管管 发布时间:2021-6-1 15:03
相信大家一开始入门32都是103,后面对性能要求更高了开始学习407,但两者之间区别虽然不大,但是还是有一些区别的,这是我的一些体会


我这里选用的是STM32F407ZGT6STM32F103ZET6,应该是103和407的顶配了,分别对应正点原子的精英版和探索者

STM32F407ZGT6的基本外设
  1. STM32F407ZGT6 作为 MCU,该芯片是
  2. STM32F407 里面配置非常强大的了,它拥有的资源包括:集成 FPU 和 DSP 指令,并具有 192KB

  3. 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 来说进行了重大改进,比如
  4. FSMC 的速度,F4 刷屏速度可达 3300W 像素/秒,而 F1 的速度则只有 500W 左右。
复制代码
STM32F103ZET6的基本外设
  1. STM32F103ZETT6 作为 MCU,该芯片是
  2. 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)

  3. 可以用来外扩 SRAM 和连接 LCD 等,通过 FSMC 驱动 LCD,可以显著提高 LCD 的刷屏速度,
  4. 是 STM32F1 家族常用型号里面,最高配置的芯片了
复制代码
407的系统时钟
  1. SYSCLK(系统时钟) =168MHz
  2. AHB 总线时钟(HCLK=SYSCLK) =168MHz
  3. APB1 总线时钟(PCLK1=SYSCLK/4) =42MHz
  4. APB2 总线时钟(PCLK2=SYSCLK/2) =84MHz
  5. PLL 主时钟 =168MHz
复制代码
103的系统时钟
  1. SYSCLK(系统时钟) =72MHz
  2. AHB 总线时钟(使用 SYSCLK) =72MHz
  3. APB1 总线时钟(PCLK1=SYSCLK/2) =36MHz
  4. APB2 总线时钟(PCLK2) =72MHz
  5. PLL 时钟 =72MHz
复制代码
时钟是非常重要的外设在使用之前,必须对时钟进行使能
IO的配置
两者的io都支持如下配置
  1. 1、输入浮空
  2. 2、输入上拉
  3. 3、输入下拉
  4. 4、模拟输入
  5. 5、开漏输出
  6. 6、推挽输出
  7. 7、推挽式复用功能
  8. 8、开漏式复用功能
复制代码
407IO输出配置
首先初始化io的时钟
  1. 使能 IO 口时钟。调用函数为 RCC_AHB1PeriphClockCmd ()

  2. RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);//使能GPIOF时钟
复制代码
  1. 初始化 IO 参数。调用函数 GPIO_Init();

  2.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9
  3.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//普通输出模式
  4.   GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
  5.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
  6.   GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
  7.   GPIO_Init(GPIOF, &GPIO_InitStructure);//初始化GPIO
复制代码
407IO输入配置
  1. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4;
  2.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;//普通输入模式
  3.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100M
  4.   GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
  5.   GPIO_Init(GPIOE, &GPIO_InitStructure);//初始化GPIOE2,3,4
复制代码
103IO的输出配置
首先初始化io的时钟
  1. 使能 IO 口时钟。调用函数为 RCC_APB2PeriphClockCmd()。

  2. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //使能 PB 端口时钟
复制代码
  1. 初始化 IO 参数。调用函数 GPIO_Init()

  2. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //LED0-->PB.5 推挽输出
  3. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
  4. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  5. GPIO_Init(GPIOB, &GPIO_InitStructure);
  6. GPIO_SetBits(GPIOB,GPIO_Pin_5); //PB.5 输出高
复制代码
103IO的输入配置
  1. GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_4|GPIO_Pin_3;
  2. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //设置成上拉输入
  3. GPIO_Init(GPIOE, &GPIO_InitStructure);//初始化GPIOE4,3
  4. ————————————————
复制代码
不同点
  1. 首先F4的io的时钟挂载在AHB1下,调用
  2. RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);//使能GPIOF时钟

  3. 其次
  4. typedef struct
  5. {
  6. uint32_t GPIO_Pin;
  7. GPIOMode_TypeDef GPIO_Mode;
  8. GPIOSpeed_TypeDef GPIO_Speed;
  9. GPIOOType_TypeDef GPIO_OType;//配置输出模式
  10. GPIOPuPd_TypeDef GPIO_PuPd; //上下拉的配置
  11. }GPIO_InitTypeDef;

  12. typedef enum
  13. {
  14.   GPIO_PuPd_NOPULL = 0x00,
  15.   GPIO_PuPd_UP     = 0x01,
  16.   GPIO_PuPd_DOWN   = 0x02
  17. }GPIOPuPd_TypeDef;

  18. f4能在GPIO_Init配置时就配置引脚的上下拉高低电平

  19. typedef enum
  20. {
  21.   GPIO_OType_PP = 0x00,
  22.   GPIO_OType_OD = 0x01
  23. }GPIOOType_TypeDef;

  24. f4配置了输出后专门可以选择配置开漏输出和推挽输出,也就是比103分的更细一些了

  25. f4的速度最高可以配置为100mhz 103只有50mhz
复制代码
NVIC
  1. 首先两者都要在main函数里面设置中断优先级的分组,且只设置一次设置了就别改了避免发生错误

  2. NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
复制代码
407NVIC 中断优先级
  1. STM32F40xx/STM32F41xx 的 92 个中断里面,包括 10 个内核中断和 82 个可屏蔽中断,具
  2. 有 16 级可编程的中断优先级,而我们常用的就是这 82 个可屏蔽中断
复制代码
103NVIC 中断优先级
  1. 说了 CM3 内核支持 256 个中断,这里用 8 个 32 位寄存器来控制,每个位控制一个中断。但是
  2. STM32F103 的可屏蔽中断只有 60 个
复制代码
NVIC 的配置也是一样的
  1. NVIC_InitTypeDef NVIC_InitStructure;
  2. NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;//串口 1 中断
  3. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1 ;// 抢占优先级为 1
  4. NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;// 子优先级位 2
  5. NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ 通道使能
  6. NVIC_Init(&NVIC_InitStructure); //根据上面指定的参数初始化 NVIC 寄存器
复制代码
外部中断
407的外部中断
  1. STM32F407 的中断控制器支持 22
  2. 个外部中断/事件请求。每个中断设有状态位,每个中断/事件都有独立的触发和屏蔽设置。
  3. STM32F407 的 22 个外部中断为:
  4. EXTI 线 0~15:对应外部 IO 口的输入中断。
  5. EXTI 线 16:连接到 PVD 输出。
  6. EXTI 线 17:连接到 RTC 闹钟事件。
  7. EXTI 线 18:连接到 USB OTG FS 唤醒事件。
  8. EXTI 线 19:连接到以太网唤醒事件。
  9. EXTI 线 20:连接到 USB OTG HS(在 FS 中配置)唤醒事件。
  10. EXTI 线 21:连接到 RTC 入侵和时间戳事件。
  11. EXTI 线 22:连接到 RTC 唤醒事件。

  12. STM32F4 供 IO 口使用的中断线只有 16 个
复制代码
103的外部中断
  1. STM32F103 的中断控制器支持 19 个外部中断/
  2. 事件请求。每个中断设有状态位,每个中断/事件都有独立的触发和屏蔽设置。STM32F103 的
  3. 19 个外部中断为:
  4. 线 0~15:对应外部 IO 口的输入中断。
  5. 线 16:连接到 PVD 输出。
  6. 线 17:连接到 RTC 闹钟事件。
  7. 线 18:连接到 USB 唤醒事件。

  8. STM32f103 供 IO 口使用的中断线只有 16 个

复制代码
外部中断服务函数都是一样的
  1. EXTI0_IRQHandler           
  2. EXTI1_IRQHandler
  3. EXTI2_IRQHandler           
  4. EXTI3_IRQHandler           
  5. EXTI4_IRQHandler           
  6. EXTI9_5_IRQHandler         
  7. EXTI15_10_IRQHandler   
  8. ————————————————
复制代码
103外部中断的配置步骤
  1. 初始化IO口为输入。
  2.        GPIO_Init();
  3. 开启IO口复用时钟。
  4.        RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
  5. 设置IO口与中断线的映射关系。
  6.         void GPIO_EXTILineConfig();
  7. 初始化线上中断,设置触发条件等。
  8.        EXTI_Init();
  9. 配置中断分组(NVIC),并使能中断。
  10.        NVIC_Init();
  11. 编写中断服务函数。
  12.       EXTIx_IRQHandler();
  13. 清除中断标志位
  14.       EXTI_ClearITPendingBit();
复制代码
  1. typedef struct
  2. {
  3.   uint32_t EXTI_Line;   //指定要配置的中断线           
  4.   EXTIMode_TypeDef EXTI_Mode;   //模式:事件 OR中断
  5.   EXTITrigger_TypeDef EXTI_Trigger;//触发方式:上升沿/下降沿/双沿触发
  6.   FunctionalState EXTI_LineCmd;  //使能 OR失能
  7. }EXTI_InitTypeDef;
复制代码
  1. io初始化省略
  2. EXTI_InitTypeDef EXTI_InitStructure;
  3. NVIC_InitTypeDef NVIC_InitStructure;
  4. //使能复用功能时钟
  5. RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);       

  6. //配置 GPIO 与中断线的映射关系
  7. //void GPIO_EXTILineConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource)

  8. GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource3);
  9. 将中断线 3 与 GPIOE 映射起来,那么很显然是 GPIOE.3 与 EXTI3 中断线连接了

  10. //初始化线上中断,设置触发条件等
  11. EXTI_InitStructure.EXTI_Line=EXTI_Line3; //设置中断线的标号
  12. EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; //中断模式
  13. //有两个模式中断和事件可选这里是中断       
  14. EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;//设置触发方式
  15. //设置触发方式,有上升沿和下降沿,还有双边沿,这里配置的是下降沿
  16. EXTI_InitStructure.EXTI_LineCmd = ENABLE;
  17. EXTI_Init(&EXTI_InitStructure);                  //根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器

  18. //配置中断分组(NVIC),并使能中断
  19. NVIC_InitStructure.NVIC_IRQChannel = EXTI3_IRQn;                        //使能外部中断通道
  20.           NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02;        //抢占优先级2
  21.           NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x01;                                        //子优先级1
  22.           NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                                                                //使能外部中断通道
  23.           NVIC_Init(&NVIC_InitStructure);            //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器

  24. 后面就是根据具体的要求写中断函数了
复制代码
未完待续...


收藏 评论0 发布时间:2021-6-1 15:03

举报

0个回答
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版