作者:陈广
日期:2021-12-5
https://item.taobao.com/item.htm?spm=a1z09.2.0.0.62de2e8de2lzxI&id=566913718044&_u=5htvhlo0151
https://item.taobao.com/item.htm?spm=a1z09.2.0.0.62de2e8de2lzxI&id=596604876229&_u=5htvhlo1efe
http://iotxfd.cn/down/STM32/US-025.pdf
tim.c 文件:
#include "tim.h"
/* TIM6 init function */
void MX_TIM6_Init(void)
{
/* USER CODE BEGIN TIM6_Init 0 */
/* USER CODE END TIM6_Init 0 */
LL_TIM_InitTypeDef TIM_InitStruct = {0};
/* Peripheral clock enable */
LL_APB1_GRP1_EnableClock(LL_APB1_GRP1_PERIPH_TIM6);
/* USER CODE BEGIN TIM6_Init 1 */
/* USER CODE END TIM6_Init 1 */
TIM_InitStruct.Prescaler = 7199;
TIM_InitStruct.CounterMode = LL_TIM_COUNTERMODE_UP;
TIM_InitStruct.Autoreload = 4999;
LL_TIM_Init(TIM6, &TIM_InitStruct);
LL_TIM_DisableARRPreload(TIM6);
LL_TIM_SetTriggerOutput(TIM6, LL_TIM_TRGO_RESET);
LL_TIM_DisableMasterSlaveMode(TIM6);
/* USER CODE BEGIN TIM6_Init 2 */
/* USER CODE END TIM6_Init 2 */
}
/* USER CODE BEGIN 1 */
void Delay_ms(uint32_t delay)
{
TIM6->PSC = 7200 - 1;
TIM6->ARR = 10 * delay - 1;
TIM6->EGR |= 1;
TIM6->CR1 = 0x0D;
while(!(TIM6->SR));
TIM6->SR = 0;
}
void Delay_us(uint32_t delay)
{
TIM6->PSC = 8 - 1;
TIM6->ARR = 9 * delay - 1;
TIM6->EGR |= 1;
TIM6->CR1 = 0x0D;
while(!(TIM6->SR));
TIM6->SR = 0;
}
/*
* 描述:测量超声波模块返回脉冲宽度
* 参数:
* GPIOx:Echo引脚所在端口
* PinMask:引脚号
* 返回值:
* -1:返回信号的低电平超时
* -2:返回信号的高电平超时
* 正数:超声波模块与障碍物的距离,以毫米为单位
*/
int Measure_Pulse_Len(GPIO_TypeDef *GPIOx, uint32_t PinMask)
{
TIM6->PSC = 72 - 1;
TIM6->ARR = 0xFFFF - 1;
TIM6->EGR |= 1;
int time = 0;
TIM6->CR1 = 0x05;
while(!LL_GPIO_IsInputPinSet(GPIOx, PinMask))
{
if(TIM6->SR)
{
TIM6->SR = 0;
time++;
if(time > 2) return -1;
}
}
time = 0;
TIM6->EGR |= 1;
while(LL_GPIO_IsInputPinSet(GPIOx, PinMask))
{
if(TIM6->SR)
{
TIM6->SR = 0;
time++;
if(time > 2) return -2;
}
}
TIM6->CR1 = 0x04;
time = time * 65536 + TIM6->CNT;
time = (time * 340) / 2000;
return time;
}
/* USER CODE END 1 */
;