[STM32H7] 【STM32H745I-DISCO试用】官方GPIO例程分析&点灯

[复制链接]
1981|2
 楼主| 新曲难觅旧知音 发表于 2025-5-19 11:25 | 显示全部楼层 |阅读模式
首先去下载官方提供的资源包。打开cubemx点help去包管理那里下载对应h7的包,然后到下载路径就可以看到。
f89c86bdddb1ec2c41837bbeb4253de0
44c2954dea14af9145ce0026a24bcf6c
然后文件管理里面打开例程目录CubeMX\STM32Cube_FW_H7_V1.11.2\Projects\STM32H745I-DISCO\Examples
899c894a587cdad2bb56cd663fee4452
对应外设的目录就在这里。先打开GPIO的看一下。用keil打开,可以看到整个工程分CM7和CM4两个部分。同样有两个主函数,应该是一个核对应一个main函数吧。
先看CM4这边,首先是初始化与低功耗模式,启用硬件信号量时钟,激活通知功能,等待CM7完成系统初始化;然后CM4进入低功耗状态(HAL_PWREx_EnterSTOPMode),直到CM7释放HSEM信号量唤醒它;紧接着配置系统时钟、NVIC优先级、配置LED2、将PC13引脚(按键)连接到EXTI线,配置为上升沿触发,并使能中断。最后设置触发中断当PC13触发中断时,切换LED2状态。
cb1bae1bb45c2bd1fd7576a05d761ac0
CM7这边配置比CM4稍微复杂点多了mpu的配置。设置内存保护单元,定义内存区域访问权限之类的。然后配置系统时钟,使用HSE和PLL将系统时钟设置为400MHz,分频后各总线时钟为100-200MHz。最后唤醒CM4核心通过HAL_HSEM_FastTake和HAL_HSEM_Release通知CM4退出停止模式。
后面外设初始化就跟CM4一样了。
68f1ddaa86910d9b0042c6a14446c8b5
了解工程结构后就可以开始本次点灯了。 代码主要包含双核启动同步、系统初始化、LED 控制三个模块,工程主文件如下所示:
  1. #include "main.h"

  2. GPIO_InitTypeDef gpio_init_structure;

  3. #ifndef HSEM_ID_0

  4. #define HSEM_ID_0 (0U) /* 硬件信号量ID,用于双核通信 */

  5. #endif

  6. void SystemClock_Config(void);

  7. void PeriphCommonClock_Config(void);

  8. static void MX_GPIO_Init(void);

  9. int main(void)

  10. {

  11. int32_t timeout;

  12. /* 等待CM4核心启动并进入停止模式 */

  13. timeout = 0xFFFF;

  14. while((__HAL_RCC_GET_FLAG(RCC_FLAG_D2CKRDY) != RESET) && (timeout-- > 0));

  15. if (timeout < 0) { Error_Handler(); }

  16. HAL_Init(); /* 初始化HAL库 */

  17. SystemClock_Config(); /* 配置系统时钟 */

  18. PeriphCommonClock_Config(); /* 配置外设公共时钟 */

  19. /* 双核同步机制:释放硬件信号量唤醒CM4 */

  20. __HAL_RCC_HSEM_CLK_ENABLE(); /* 使能HSEM时钟 */

  21. HAL_HSEM_FastTake(HSEM_ID_0); /* 获取信号量 */

  22. HAL_HSEM_Release(HSEM_ID_0,0); /* 释放信号量以通知CM4 */

  23. /* 等待CM4从停止模式唤醒 */

  24. timeout = 0xFFFF;

  25. while((__HAL_RCC_GET_FLAG(RCC_FLAG_D2CKRDY) == RESET) && (timeout-- > 0));

  26. if (timeout < 0) { Error_Handler(); }

  27. MX_GPIO_Init(); /* 初始化GPIO外设 */

  28. /* 配置GPIOJ2为推挽输出模式控制LED */

  29. __HAL_RCC_GPIOJ_CLK_ENABLE();

  30. gpio_init_structure.Pin = GPIO_PIN_2;

  31. gpio_init_structure.Mode = GPIO_MODE_OUTPUT_PP;

  32. gpio_init_structure.Pull = GPIO_PULLUP;

  33. gpio_init_structure.Speed = GPIO_SPEED_FREQ_VERY_HIGH;

  34. HAL_GPIO_Init(GPIOJ, &gpio_init_structure);

  35. /* 主循环:LED闪烁控制 */

  36. while (1)

  37. {

  38. HAL_GPIO_WritePin(GPIOJ, GPIO_PIN_2, GPIO_PIN_RESET); /* LED亮 */

  39. HAL_Delay(500); /* 延时500ms */

  40. HAL_GPIO_WritePin(GPIOJ, GPIO_PIN_2, GPIO_PIN_SET); /* LED灭 */

  41. HAL_Delay(500); /* 延时500ms */

  42. }

  43. }

编译下载后就能看到实验现象

80d8b556c423c1474bd306c861ad4c80.gif
flycamelaaa 发表于 2025-6-5 17:15 | 显示全部楼层
独家原创必须好好观摩一下。
AdaMaYun 发表于 2025-6-8 22:12 | 显示全部楼层
官方GPIO例程分析&点灯
您需要登录后才可以回帖 登录 | 注册

本版积分规则

26

主题

144

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部