STM32CUBE-delay_us学习
根据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的,就这样