首先去下载官方提供的资源包。打开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 */
}
}
编译下载后就能看到实验现象
|