在实现delay_us()微妙延时的时候,出现了一些问题。
亮:5000us * 10 = 50 000us = 50ms
灭:5000us * 10 = 50 000us = 50ms
亮+灭=100ms = 0.1s
但是实现出来的是大概1秒亮一次,一秒灭一次。
如果将循环变成100的话就是10S一闪,10s一灭,自己粗略记时了。
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
int i;
HAL_GPIO_WritePin(GPIOB, BlueLed_Pin, GPIO_PIN_RESET);
for(i=0; i<10; i++)
{
delay_us(5000);
}
HAL_GPIO_WritePin(GPIOB, BlueLed_Pin, GPIO_PIN_SET);
for(i=0; i<10; i++)
{
delay_us(5000);
}
}
/* USER CODE END 3 */
void delay_us(uint16_t us)
{
uint16_t differ = 60000-us;
HAL_TIM_Base_Start(&htim6);
__HAL_TIM_SET_COUNTER(&htim6, differ);
while( differ < 60000 )
{
differ = __HAL_TIM_GET_COUNTER(&htim6);
}
HAL_TIM_Base_Stop(&htim6);
}
while( differ < 60000 )
{
differ = __HAL_TIM_GET_COUNTER(&htim6);
}
这里采用抓tim6当前值的方式来判断是否达到定时时间,然而执行这些语句也是需要时间的,有可能上一次循环还小于60000,下一次直接超过65535了。
如果tim6定时器的计数模式是在达到65535后,会重新回到0继续计数,那么依然跳不出循环。直到某次运气好,读当前值时正好介于60000-65535。
参考了一下正点原子的代码,他们会多判断一下当前值是否小于起始值,如果小于则说明定时器溢出了