废话不多直接上代码
void HAL_TIM_MspPostInit()
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
__HAL_RCC_GPIOA_CLK_ENABLE();
GPIO_InitStruct.Pin = GPIO_PIN_0;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
GPIO_InitStruct.Alternate = GPIO_AF2_TIM2;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
}
void TIM2_Init(uint16_t arr, uint16_t CCR4_Val)
{
TIM_ClockConfigTypeDef sClockSourceConfig = {0};
TIM_MasterConfigTypeDef sMasterConfig = {0};
TIM_OC_InitTypeDef sConfigOC = {0};
__HAL_RCC_TIM2_CLK_ENABLE();
uint16_t psr = 0;
if(arr < 999)
{
psr = 99;
arr = 64000000 / arr / 100 - 1;
}
else
{
psr = 0;
arr = 64000000 / arr - 1;
}
CCR4_Val = (CCR4_Val * arr) / 100;
htim2.Instance = TIM2;
htim2.Init.Prescaler = psr;
htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
htim2.Init.Period = arr;
htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
HAL_TIM_Base_Init(&htim2);
sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
HAL_TIM_ConfigClockSource(&htim2, &sClockSourceConfig);
sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig);
sConfigOC.OCMode = TIM_OCMODE_PWM1;
sConfigOC.Pulse = CCR4_Val;
sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
sConfigOC.OCFastMode = TIM_OCFAST_ENABLE;
HAL_TIM_OC_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_1);
HAL_TIM_OC_Init(&htim2);
HAL_TIM_MspPostInit();
HAL_TIM_Base_Start_IT(&htim2);
HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_1);
}
void TIM2_Channel_1_Set_Duty(uint16_t arr, uint16_t CCR4_Val)
{
if(arr < 999)
{
arr = 64000000 / arr / 100 - 1;
}
else
{
arr = 64000000 / arr - 1;
}
CCR4_Val = (CCR4_Val * arr) / 100;
__HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_1, CCR4_Val);
}
int main(void)
{
HAL_Init();
SystemClock_Config();
Led_GPIO_Init();
TIM2_Init(100, 0);
TIM3_Init();
USART1_UART_Init();
IIC_GPIO_Init();
calc_value_pressure();
TIM2_Channel_1_Set_Duty(100, 20);
uint8_t val = 0;
while (1)
{
/* if(get_sys_time_100us() % 2000 == 0)
{
val += 20;
if(val > 100) val = 0;
TIM2_Channel_1_Set_Duty(100, val);
// Put_press_and_temp_value();
//JHM1200_get_cal();
//DEBUG_PRINTF("Pressure %f\r\n",pressure);
//DEBUG_PRINTF("TEMP %f\r\n",temp);
}*/
led_task_ontick();
}
}