hal库微秒函数

根据cubeIDE编写delay_us函数

原文链接https://blog.csdn.net/weixin_42727214/article/details/131670190
根据上文链接自学了一下如何在cubeide的环境下建立us的延迟函数,(唯一看懂的方法😭)写下来怕忘记

基础环境

STM32-CubeIDE
stm32f103c8TX请添加图片描述
忽略乱七八糟的引脚设置,重来一遍(实际上是自己懒得建立新project)

时钟选择

step1-system core的RCC

请添加图片描述
将high/low speed clock 设置为水晶陶瓷共振器(Crystal/Ceramic Resonator)

HSE:高速外部时钟源
LSE:低速外部时钟源
Disable:禁用
BYPASS Clock Source:旁路时钟源(由外部给定时钟信号作为同步时钟)
Crystal/Ceramic Resonator :水晶/陶瓷共振器(外接晶振,经过内部振荡电路产生时钟)

step2 配置时钟树(我完全看不懂,跟着改的)
请添加图片描述
修改的部分
1)enable css
2)hse
3)hclk改为72

step3-
回到rcc,选择TIM1,改clock为internal clock
下方的parameter settings
1)prescaler-分频 72-1(我感觉是把上文的72M赫兹分成了72份,每份1Mhz。原因为1/1Mhz=1us
2)mode:选up向上计数
3)period:0

我的理解是从零开始向上计数,1us计一下,不知道对不对。恳请知道的伙伴在评论区告诉我
然后保存就可以了

请添加图片描述

代码

到main.c 函数这里,发现已经有请添加图片描述
这说明设置成功了,代码拉到最后可以发现完整代码


static void MX_TIM1_Init(void)
{

  /* USER CODE BEGIN TIM1_Init 0 */

  /* USER CODE END TIM1_Init 0 */

  TIM_ClockConfigTypeDef sClockSourceConfig = {0};
  TIM_MasterConfigTypeDef sMasterConfig = {0};

  /* USER CODE BEGIN TIM1_Init 1 */

  /* USER CODE END TIM1_Init 1 */
  htim1.Instance = TIM1;
  htim1.Init.Prescaler = 72-1;
  htim1.Init.CounterMode = TIM_COUNTERMODE_UP;
  htim1.Init.Period = 0;
  htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  htim1.Init.RepetitionCounter = 0;
  htim1.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
  if (HAL_TIM_Base_Init(&htim1) != HAL_OK)
  {
    Error_Handler();
  }
  sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
  if (HAL_TIM_ConfigClockSource(&htim1, &sClockSourceConfig) != HAL_OK)
  {
    Error_Handler();
  }
  sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
  sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  if (HAL_TIMEx_MasterConfigSynchronization(&htim1, &sMasterConfig) != HAL_OK)
  {
    Error_Handler();
  }
  /* USER CODE BEGIN TIM1_Init 2 */



  /* USER CODE END TIM1_Init 2 */

}

这里应该不用懂吧(其实是我看不懂)
然后就是我们的us代码

void Delay_uS(uint16_t uS_Count)
 {
 	uint16_t counter = 0;                         /*暂存定时器的计数值*/
 	__HAL_TIM_SET_AUTORELOAD(&htim1, uS_Count);   /*设置定时器自动加载值,到该值后重新计数*/
 	__HAL_TIM_SET_COUNTER(&htim1, 0);             /*设置定时器初始值*/
 	HAL_TIM_Base_Start(&htim1);                   /*启动定时器*/
 	while(counter < uS_Count)                     /*直到定时器计数从0计数到uS_Count结束循环,刚好uS_Count uS*/
 	{
 		counter = __HAL_TIM_GET_COUNTER(&htim1);    /*获取定时器当前计数*/
 	}
 	HAL_TIM_Base_Stop(&htim1);                    /*停止定时器*/
 }

把他加到main.c里,然后就可以用啦

运行结果

我点的小灯

HAL_GPIO_WritePin(led_GPIO_Port, led_Pin, GPIO_PIN_SET);
	  HAL_Delay(300);
	  HAL_GPIO_WritePin(led_GPIO_Port, led_Pin, GPIO_PIN_RESET);
	  Delay_uS(2000)

-----第一次写不知道无法上传视频,很明显小灯一闪一闪,代码应该是ok的,就这样

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ssl433

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值