打印
[STM32WBA]

【STM32WBA52CG测评】+2LED闪烁

[复制链接]
277|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
【STM32WBA52CG测评】+2LED闪烁
1、环境搭建
STM32WBA52CG支持多种开发模式,包括IAR EmbeddedWorkbench®, MDK-ARM, 和 STM32CubeIDE。在本例程中我们使用MDK-ARM作为开发环境,具体搭建流程如下:
Step1:安装MDK-ARM开发环境。可以自行百度,也可以参考https://blog.csdn.net/Brendon_Tan/article/details/103809771。
Step2:打开GPIO_IOToggle.uvprojx工程。在\en.stm32cubewba-v1-1-0 (1)\STM32Cube_FW_WBA_V1.1.0\Projects\NUCLEO-WBA52CG\Examples\GPIO\GPIO_IOToggle\MDK-ARM,可以在官方网站下载(https://www.st.com/zh/evaluation-tools/nucleo-wba52cg.html#tools-software)。
Step3:运行GPIO_IOToggle.uvprojx工程。运行时提示需要安装PACK,可以不管他,也可以到网站上下载,具体为:https://www.keil.arm.com/packs/stm32wbaxx_dfp-keil/devices/。

如果下载也可以正常运行。
Step4:编译、生成
在本文中没有安装PACK,因此无法直接下载。但是可以通过配置生成HEX文件。
Step5:闪灯设置
在GPIO_IOToggle工程中闪烁的灯为LD1、LD2,稍作修改可以进三个灯跑马灯,具体如程序所示
2、程序
程序分析
1. 包含主要头文件main.h
2. 定义一个GPIO初始化结构体GPIO_InitStruct
3. 声明系统时钟、GPIO、ICACHE相关的初始化函数
4. main()函数,程序入口
- 调用系统时钟、GPIO、ICACHE初始化函数
- 使能LD1、LD2、LD3的GPIO时钟
- 初始化GPIO_InitStruct,设置为推挽输出、无上拉下拉、高速
- 分别初始化LD1、LD2、LD3的GPIO
- 进入循环,翻转LD1、LD2、LD3的GPIO电平,间隔100ms
5. SystemClock_Config()函数
- 设置电源电压规模为Scale 1
- 配置HSE作为PLL时钟源,PLL输出频率为100MHz
- 配置AHB、APB1、APB2的时钟分频系数为1
- 配置系统时钟为PLL时钟,频率为100MHz
- 配置Flash访问延时周期为3个时钟周期
6. MX_ICACHE_Init()函数
- 配置ICACHE为1-way组相联
- 使能ICACHE
7. MX_GPIO_Init()函数,空函数,用于留接口
8. Error_Handler()函数,错误处理,死循环
9. assert_failed()函数,断言失败处理,死循环
程序


#include "main.h"
static GPIO_InitTypeDef  GPIO_InitStruct;
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_ICACHE_Init(void);
int main(void)
{

  SystemClock_Config();
  MX_GPIO_Init();
  MX_ICACHE_Init();
  LD1_GPIO_CLK_ENABLE();
  LD2_GPIO_CLK_ENABLE();
  LD3_GPIO_CLK_ENABLE();

  GPIO_InitStruct.Mode  = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull  = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;

  GPIO_InitStruct.Pin = LD1_PIN;
  HAL_GPIO_Init(LD1_GPIO_PORT, &GPIO_InitStruct);
  GPIO_InitStruct.Pin = LD2_PIN;
  HAL_GPIO_Init(LD2_GPIO_PORT, &GPIO_InitStruct);
        GPIO_InitStruct.Pin = LD3_PIN;
  HAL_GPIO_Init(LD3_GPIO_PORT, &GPIO_InitStruct);
  while (1)
  {
    HAL_GPIO_TogglePin(LD1_GPIO_PORT, LD1_PIN);
    HAL_Delay(100);
    HAL_GPIO_TogglePin(LD2_GPIO_PORT, LD2_PIN);
    HAL_Delay(100);
    HAL_GPIO_TogglePin(LD3_GPIO_PORT, LD3_PIN);
    HAL_Delay(100);

  }
}
void SystemClock_Config(void)
{
  RCC_OscInitTypeDef RCC_OscInitStruct = {0};
  RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
  if (HAL_PWREx_ControlVoltageScaling(PWR_REGULATOR_VOLTAGE_SCALE1) != HAL_OK)
  {
    Error_Handler();
  }
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
  RCC_OscInitStruct.HSEState = RCC_HSE_ON;
  RCC_OscInitStruct.HSEDiv = RCC_HSE_DIV1;
  RCC_OscInitStruct.PLL1.PLLState = RCC_PLL_ON;
  RCC_OscInitStruct.PLL1.PLLSource = RCC_PLLSOURCE_HSE;
  RCC_OscInitStruct.PLL1.PLLM = 4;
  RCC_OscInitStruct.PLL1.PLLN = 25;
  RCC_OscInitStruct.PLL1.PLLP = 2;
  RCC_OscInitStruct.PLL1.PLLQ = 2;
  RCC_OscInitStruct.PLL1.PLLR = 2;
  RCC_OscInitStruct.PLL1.PLLFractional = 0;
  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  {
    Error_Handler();
  }
  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
                              |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2
                              |RCC_CLOCKTYPE_PCLK7|RCC_CLOCKTYPE_HCLK5;
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
  RCC_ClkInitStruct.APB7CLKDivider = RCC_HCLK_DIV1;
  RCC_ClkInitStruct.AHB5_PLL1_CLKDivider = RCC_SYSCLK_PLL1_DIV4;
  RCC_ClkInitStruct.AHB5_HSEHSI_CLKDivider = RCC_SYSCLK_HSEHSI_DIV1;
  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_3) != HAL_OK)
  {
    Error_Handler();
  }
}
static void MX_ICACHE_Init(void)
{  if (HAL_ICACHE_ConfigAssociativityMode(ICACHE_1WAY) != HAL_OK)
  {
    Error_Handler();
  }
  if (HAL_ICACHE_Enable() != HAL_OK)
  {
    Error_Handler();
  }
}
static void MX_GPIO_Init(void)
{
void Error_Handler(void)
{
  while(1)
  {
  }
}
#ifdef  USE_FULL_ASSERT
void assert_failed(uint8_t *file, uint32_t line)
{
  while (1)
  {
  }
}
#endif /* USE_FULL_ASSERT */

3、效果图

使用特权

评论回复
沙发
xinpian101| | 2024-1-12 17:09 | 只看该作者
之前看过一个点灯,用的函数指针,通过按键调用不同的流水灯函数。

使用特权

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

本版积分规则

68

主题

578

帖子

2

粉丝