打印
[STM32H7]

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

[复制链接]
43|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
首先去下载官方提供的资源包。打开cubemx点help去包管理那里下载对应h7的包,然后到下载路径就可以看到。


然后文件管理里面打开例程目录CubeMX\STM32Cube_FW_H7_V1.11.2\Projects\STM32H745I-DISCO\Examples

对应外设的目录就在这里。先打开GPIO的看一下。用keil打开,可以看到整个工程分CM7和CM4两个部分。同样有两个主函数,应该是一个核对应一个main函数吧。
先看CM4这边,首先是初始化与低功耗模式,启用硬件信号量时钟,激活通知功能,等待CM7完成系统初始化;然后CM4进入低功耗状态(HAL_PWREx_EnterSTOPMode),直到CM7释放HSEM信号量唤醒它;紧接着配置系统时钟、NVIC优先级、配置LED2、将PC13引脚(按键)连接到EXTI线,配置为上升沿触发,并使能中断。最后设置触发中断当PC13触发中断时,切换LED2状态。

CM7这边配置比CM4稍微复杂点多了mpu的配置。设置内存保护单元,定义内存区域访问权限之类的。然后配置系统时钟,使用HSE和PLL将系统时钟设置为400MHz,分频后各总线时钟为100-200MHz。最后唤醒CM4核心通过HAL_HSEM_FastTake和HAL_HSEM_Release通知CM4退出停止模式。
后面外设初始化就跟CM4一样了。

了解工程结构后就可以开始本次点灯了。 代码主要包含双核启动同步、系统初始化、LED 控制三个模块,工程主文件如下所示:
#include "main.h"

GPIO_InitTypeDef gpio_init_structure;

#ifndef HSEM_ID_0

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

#endif

void SystemClock_Config(void);

void PeriphCommonClock_Config(void);

static void MX_GPIO_Init(void);

int main(void)

{

int32_t timeout;

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

timeout = 0xFFFF;

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

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

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

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

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

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

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

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

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

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

timeout = 0xFFFF;

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

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

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

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

__HAL_RCC_GPIOJ_CLK_ENABLE();

gpio_init_structure.Pin = GPIO_PIN_2;

gpio_init_structure.Mode = GPIO_MODE_OUTPUT_PP;

gpio_init_structure.Pull = GPIO_PULLUP;

gpio_init_structure.Speed = GPIO_SPEED_FREQ_VERY_HIGH;

HAL_GPIO_Init(GPIOJ, &gpio_init_structure);

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

while (1)

{

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

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

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

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

}

}

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

80d8b556c423c1474bd306c861ad4c80.gif (4.79 MB )

80d8b556c423c1474bd306c861ad4c80.gif

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

25

主题

143

帖子

0

粉丝