Source code analysis:
void MX_USART1_UART_Init(void)
{
huart1.Instance = USART1;
huart1.Init.BaudRate = 115200;
huart1.Init.WordLength = UART_WORDLENGTH_8B;
huart1.Init.StopBits = UART_STOPBITS_1;
huart1.Init.Parity = UART_PARITY_NONE;
Mode = UART_MODE_TX_RX. huart1.Init.Mode = UART_MODE_TX_RX;
huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
huart1.Init.OverSampling = UART_OVERSAMPLING_16;
if (HAL_UART_Init(&huart1) ! = HAL_OK)
{
Error_Handler();
}
}
The servo driver is driven using the microcontroller’s own PWM generator, configured as follows

void MX_TIM2_Init(void)
{
TIM_MasterConfigTypeDef sMasterConfig = {0};
TIM_OC_InitTypeDef sConfigOC = {0};
htim2.Instance = TIM2;
htim2.Init.Prescaler = 1000-1;
CounterMode = TIM_COUNTERMODE_UP. htim2.Init;
htim2.Init.Period = 1000-1;
htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1. htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
if (HAL_TIM_PWM_Init(&htim2) ! = HAL_OK)
{
Error_Handler();
}
sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
if (HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig) ! = HAL_OK)
{
Error_Handler();
}
sConfigOC.OCMode = TIM_OCMODE_PWM1;
sConfigOC.Pulse = 51;
sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
if (HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_1) ! = HAL_OK)
{
Error_Handler();
}
HAL_TIM_MspPostInit(&htim2);
}
Sensor ranging uses interrupt control and is configured as follows.

Ranging procedure:
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
if(GPIO_Pin == GPIO_PIN_1)
{
if( (HAL_GPIO_ReadPin(ECHO_GPIO_Port,ECHO_Pin) == 1) && (bit_bit == 1) )
{
__HAL_TIM_SetCounter(&htim3,0);
HAL_TIM_Base_Start_IT(&htim3);
}
else if( (HAL_GPIO_ReadPin(ECHO_GPIO_Port,ECHO_Pin) == 0) && (bit_bit == 1) )
{
HAL_TIM_Base_Stop_IT(&htim3);
cm = msHcCount*1000;
cm += __HAL_TIM_GetCounter(&htim3); __HAL_TIM_SetCounter(&htim3,0); msHcCount = 0;
bit_bit = 0;
}}}
The microcontroller packages the measured data and sends it to the touchscreen: the
void HOME(void *argument)
{
uint8_t data_ico[24] = {0xA5, 0x5A, 0x14, 0x85, 0x00, 0x00, 0x00 ,0x00 ,0x00 ,0x00 ,0xff ,0xff ,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff};
uint8_t k = 0;
uint16_t j = 0,bit = 0;
for(;;)
{
if(bit_state)
{
if(bit == 0)
{
j++;
}
else
{
j–;
}
if(bit == 0 && j >= 180)
{
bit = 1;
}
else if(bit == 1 && j <= 0)
{
bit = 0;
}
}
jiaodu = j;
for(k=0;k<7;k++) { if(Y>=600)
Y = 600;
if(Y<170) Y = 170; data_ico[5] = X>>8;//x
data_ico[6] = X;
data_ico[7] = Y>>8;//y
data_ico[8] = (Y+k)&0x00ff;
UART1_Send_Array(data_ico,23);
}
data_send[4]=0x06;
data_send[5]=0xc8;
data_send[6]=juli>>8;
data_send[7]=juli;
UART1_Send_Array(data_send,8);
data_send[4]=0x00;
data_send[5]=0x01;
data_send[6]=0x00;
data_send[7]=jiaodu;
UART1_Send_Array(data_send,8);
vTaskDelay(pdMS_TO_TICKS(10));
osDelay(1);
}
}