STM32CuBeMX___学习打卡1

STM32CubeMX

关于生成代码就报错的问题

现象如下:

图1
在这里插入图片描述
图2
在这里插入图片描述
原因:::是因为我的生成路径上有中文字,也就是说 我生成的代码的文件夹名字叫做:STM32CubeMX_流水灯实验;这里面有中文字,所以会报错!!!

只要图1中的Project name这里面不要包含中文字就不会报错!!!


关于用STM32F4刚一生成代码,编译就报错的问题

问题图片:
在这里插入图片描述
解决办法:
在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述
再次编译即可。

解决后的现象图:
在这里插入图片描述

实践1—SysTick

1.在STM32CuBeMX中配置好时钟树,特别注意系统嘀嗒定时器的时钟,选择内部时钟,也就是系统时钟的8分频!(SystemCLK/8)。
在这里插入图片描述

在STM32CUBEMX中我们说白了就是只需要配置一个灯的GPIO。因为实验需要用灯来观测闪烁情况。

进入主函数后,我们自己需要写函数:(写关于滴答定时器的延时函数)

static uint16_t fac_us=0;
static uint16_t fac_ms=0;

void delay_us(uint32_t nus)
{
	uint32_t temp;
	SysTick->LOAD = (nus*fac_us);//时间加载
	SysTick->VAL = 0x00;//清空计数器
	SysTick->CTRL = 0x01;//开启计数
	do
	{
		temp = SysTick->CTRL;
	}while(temp&0x01 && !(temp&(1<<16)));
	SysTick->CTRL = 0x00;
	SysTick->VAL = 0x00;
}

void delay_ms(uint32_t nms)
{
	uint32_t temp;
	SysTick->LOAD = (nms*fac_ms);
	SysTick->VAL = 0x00;
	SysTick->CTRL = 0x01;//开启计数
	do
	{
		temp = SysTick->CTRL;
	}while(temp&0x01 && !(temp&(1<<16)));
	SysTick->CTRL = 0x00;
	SysTick->VAL = 0x00;
}

void delay_init(uint8_t SYSCLK)//其中系统时钟SYSCLK是以MHZ为单位的!
{
	fac_us = (SYSCLK/8);
	fac_ms = (uint16_t)fac_us*1000;
}

然后我们在值函数中调用即可:

delay_init(72);
	while (1)
  {
	  HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_1);
	  delay_ms(500);
  }

以上就是配置系统滴答定时器!


实践2—基本定时器

首先也是关于基本定时器的配置,这里选用了基本定时器6,其他的定时器一样的配置。
在这里插入图片描述
这里的预分频选择了,7199,也就是选择了计数一次的频率是:72MHZ/(7199+1)==10KHZ。

然后技术周期选择了4999,即(4999+1)/10000=0.5s产生一次中断。

计数模式选择了向上计数,不需要自动重装载。然后弄完这之后,在System Core中勾选TIM6 global interrupt这个选项。

其他的RCC SYS都是以前设置的那样设置。

然后生成代码。

进入主函数中,只有配置了MX_GPIO_Init()和MX_TIM6_Init()。第一个函数主要是配置灯的GPIO,第二个函数是关于基本定时器的配置。

打开第二个文件发现,把GPIO和中断都配置了。


TIM_HandleTypeDef htim6;

/* TIM6 init function */
void MX_TIM6_Init(void)
{

  /* USER CODE BEGIN TIM6_Init 0 */

  /* USER CODE END TIM6_Init 0 */

  TIM_MasterConfigTypeDef sMasterConfig = {0};

  /* USER CODE BEGIN TIM6_Init 1 */

  /* USER CODE END TIM6_Init 1 */
  htim6.Instance = TIM6;
  htim6.Init.Prescaler = 7199;
  htim6.Init.CounterMode = TIM_COUNTERMODE_UP;
  htim6.Init.Period = 4999;
  htim6.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
  if (HAL_TIM_Base_Init(&htim6) != HAL_OK)
  {
    Error_Handler();
  }
  sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
  sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  if (HAL_TIMEx_MasterConfigSynchronization(&htim6, &sMasterConfig) != HAL_OK)
  {
    Error_Handler();
  }
  /* USER CODE BEGIN TIM6_Init 2 */

  /* USER CODE END TIM6_Init 2 */

}

void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* tim_baseHandle)
{

  if(tim_baseHandle->Instance==TIM6)
  {
  /* USER CODE BEGIN TIM6_MspInit 0 */

  /* USER CODE END TIM6_MspInit 0 */
    /* TIM6 clock enable */
    __HAL_RCC_TIM6_CLK_ENABLE();

    /* TIM6 interrupt Init */
    HAL_NVIC_SetPriority(TIM6_IRQn, 0, 0);
    HAL_NVIC_EnableIRQ(TIM6_IRQn);
  /* USER CODE BEGIN TIM6_MspInit 1 */
	HAL_TIM_Base_Start_IT(&htim6);
  /* USER CODE END TIM6_MspInit 1 */
  }
}

void HAL_TIM_Base_MspDeInit(TIM_HandleTypeDef* tim_baseHandle)
{

  if(tim_baseHandle->Instance==TIM6)
  {
  /* USER CODE BEGIN TIM6_MspDeInit 0 */

  /* USER CODE END TIM6_MspDeInit 0 */
    /* Peripheral clock disable */
    __HAL_RCC_TIM6_CLK_DISABLE();

    /* TIM6 interrupt Deinit */
    HAL_NVIC_DisableIRQ(TIM6_IRQn);
  /* USER CODE BEGIN TIM6_MspDeInit 1 */

  /* USER CODE END TIM6_MspDeInit 1 */
  }
}

注意这里面的HAL_TIM_Base_Start_IT(&htim6);需要自己配置写上去!!!不能忘!!!我就是这里出了问题!

所以我们只需要去到终端服务函数中找到相应的中断:TIM6_IRQn的中断服务函数

找到 HAL_TIM_IRQHandler(&htim6);并按F12,进入公共中断服务函数void HAL_TIM_IRQHandler(TIM_HandleTypeDef *htim),然后在这个公共中断服务函数中,找到 HAL_TIM_PeriodElapsedCallback(htim);再对他按F12,我们会找到一个——WEAK开头的函数,这个就是们需要的终端服务回调函数!复制它,到main()中,进行如下代码配置:

 void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
	if(htim->Instance == TIM6)
	{
		HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_0);	
	}
		
}

以上就是配置基本定时器定时的代码。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
`micro_ros_stm32cubemx_utils` 是一个用于在 STM32CubeMX 中使用 micro-ROS 的实用程序库。要使用 `micro_ros_stm32cubemx_utils`,可以按照以下步骤进行: 1. 下载 `micro_ros_stm32cubemx_utils` 库。您可以从 micro-ROS 官方网站上下载该库。 2. 将 `micro_ros_stm32cubemx_utils` 库添加到 STM32CubeMX 项目中。您可以将该库添加为外部库或将其直接复制到项目目录中。 3. 在 STM32CubeMX配置 micro-ROS 应用程序。您可以使用 `micro_ros_stm32cubemx_utils` 库提供的插件来自动配置 micro-ROS 应用程序,并生成必要的代码和配置文件。 4. 在 STM32CubeMX 中生成代码并使用适当的编译工具链编译和链接应用程序。 以下是一个示例代码片段,展示了如何在 STM32CubeMX 中使用 `micro_ros_stm32cubemx_utils`: ``` #include "main.h" #include "micro_ros_stm32cubemx_utils.h" int main(void) { // 初始化 micro-ROS 应用程序 micro_ros_init(); // 运行 micro-ROS 应用程序 while(1) { micro_ros_spin(); } } void Error_Handler(void) { // 发生错误时执行的代码 } #ifdef USE_FULL_ASSERT void assert_failed(uint8_t *file, uint32_t line) { // 断言失败时执行的代码 } #endif /* USE_FULL_ASSERT */ ``` 在这个示例中,我们使用 `micro_ros_stm32cubemx_utils` 库提供的 `micro_ros_init()` 和 `micro_ros_spin()` 函数来初始化和运行 micro-ROS 应用程序。该应用程序将在无限循环中运行,并使用 `micro_ros_spin()` 函数来处理 micro-ROS 消息。我们还使用 STM32CubeMX 自动生成的错误处理和断言失败处理函数来处理错误情况。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值