新手上路
- 积分
- 29
- 金钱
- 29
- 注册时间
- 2021-11-2
- 在线时间
- 7 小时
|
目前使用STM32F407IGT6的TIM1CH1生成2MHz的PWM波,然后想在启动TIM1的同时触发TIM2启动,同步产生0.1MHz的PWM波,根据网上的例程修改程序后,一直调试不出来,启动TIM1的时候,TIM2无法同步启动输出PWM波,不知道是程序哪里出了问题,烦请大佬们帮忙看看,感谢。程序如下:
/**
* 函数功能: 主定时器初始化
* 输入参数: 无
* 返 回 值: 无
* 说 明: 无
*/
void MASTER_TIMx_Init(void)
{
TIM_ClockConfigTypeDef sClockSourceConfig;
TIM_MasterConfigTypeDef sMasterConfig;
TIM_BreakDeadTimeConfigTypeDef sBreakDeadTimeConfig;
TIM_OC_InitTypeDef sConfigOC;
/* 基本定时器外设时钟使能 */
MASTER_TIM_RCC_CLK_ENABLE();
/* 主定时器基本功能配置 */
htimx_MasterTIM.Instance = MASTER_TIM;
htimx_MasterTIM.Init.Prescaler = MASTER_TIM_PRESCALER;
htimx_MasterTIM.Init.CounterMode = TIM_COUNTERMODE_UP;
htimx_MasterTIM.Init.Period = MASTER_TIM_PERIOD;
htimx_MasterTIM.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
htimx_MasterTIM.Init.RepetitionCounter = MASTER_TIM_REPETITIONCOUNTER;
HAL_TIM_Base_Init(&htimx_MasterTIM);
/* 定时器时钟源选择 */
sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
HAL_TIM_ConfigClockSource(&htimx_MasterTIM, &sClockSourceConfig);
HAL_TIM_PWM_Init(&htimx_MasterTIM);
/* 主模式配置 */
sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_ENABLE;
sMasterConfig.MasterOutputTrigger = TIM_TRGO_UPDATE;
HAL_TIMEx_MasterConfigSynchronization(&htimx_MasterTIM,&sMasterConfig);
sBreakDeadTimeConfig.OffStateRunMode = TIM_OSSR_DISABLE;
sBreakDeadTimeConfig.OffStateIDLEMode = TIM_OSSI_DISABLE;
sBreakDeadTimeConfig.LockLevel = TIM_LOCKLEVEL_OFF;
sBreakDeadTimeConfig.DeadTime = 100;
sBreakDeadTimeConfig.BreakState = TIM_BREAK_ENABLE;
sBreakDeadTimeConfig.BreakPolarity = TIM_BREAKPOLARITY_HIGH;
sBreakDeadTimeConfig.AutomaticOutput = TIM_AUTOMATICOUTPUT_DISABLE;
HAL_TIMEx_ConfigBreakDeadTime(&htimx_MasterTIM, &sBreakDeadTimeConfig);
sConfigOC.OCMode = TIM_OCMODE_PWM1;
sConfigOC.Pulse = MASTER_TIM_CCR;
sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
sConfigOC.OCNPolarity = TIM_OCNPOLARITY_HIGH;
sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
sConfigOC.OCIdleState = TIM_OCIDLESTATE_RESET;
sConfigOC.OCNIdleState = TIM_OCNIDLESTATE_RESET;
HAL_TIM_PWM_ConfigChannel(&htimx_MasterTIM, &sConfigOC, TIM_CHANNEL_1);
/* 调用定时器GPIO引脚初始化函数 */
HAL_MASTER_TIM_MspPostInit();
}
/**
* 函数功能: 从定时器初始化
* 输入参数: 无
* 返 回 值: 无
* 说 明: 无
*/
void SLAVE_TIMx_Init(void)
{
TIM_ClockConfigTypeDef sClockSourceConfig;
TIM_SlaveConfigTypeDef sSlaveConfig;
TIM_OC_InitTypeDef sConfigOC;
/* 基本定时器外设时钟使能 */
SLAVE_TIM_RCC_CLK_ENABLE();
/* 从定时器基本功能配置 */
htimx_SlaveTIM.Instance = SLAVE_TIM;
htimx_SlaveTIM.Init.Prescaler = SLAVE_TIM_PRESCALER;
htimx_SlaveTIM.Init.CounterMode = TIM_COUNTERMODE_UP;
htimx_SlaveTIM.Init.Period = SLAVE_TIM_PERIOD;
htimx_SlaveTIM.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
HAL_TIM_Base_Init(&htimx_SlaveTIM);
/* 定时器时钟源选择 */
sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
HAL_TIM_ConfigClockSource(&htimx_SlaveTIM, &sClockSourceConfig);
HAL_TIM_PWM_Init(&htimx_SlaveTIM);
/* 从模式:外部触发模式1(内部定时器触发)*/
sSlaveConfig.SlaveMode = TIM_SLAVEMODE_TRIGGER; // 定时器同步:触发模式
sSlaveConfig.InputTrigger = TIM_TS_ITR0; // 输入触发:选择 ITR0 作为输入源
sSlaveConfig.TriggerPolarity = TIM_TRIGGERPOLARITY_RISING; // 触发极性:上升沿
sSlaveConfig.TriggerPrescaler = TIM_TRIGGERPRESCALER_DIV1; // 触发预分频:无
sSlaveConfig.TriggerFilter = 0x0; // 滤波:本例中不需要任何滤波
HAL_TIM_SlaveConfigSynchronization(&htimx_SlaveTIM,&sSlaveConfig);
sConfigOC.OCMode = TIM_OCMODE_PWM1;
sConfigOC.Pulse = SLAVE_TIM_PULSE;
sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
HAL_TIM_PWM_ConfigChannel(&htimx_SlaveTIM, &sConfigOC, TIM_CHANNEL_1);
/* 调用定时器GPIO引脚初始化函数 */
HAL_SLAVE_TIM_MspPostInit();
}
/**
* 函数功能: 主函数.
* 输入参数: 无
* 返 回 值: 无
* 说 明: 无
*/
int main(void)
{
/* 复位所有外设,初始化Flash接口和系统滴答定时器 */
HAL_Init();
/* 配置系统时钟 */
SystemClock_Config();
/* 主从定时器初始化 */
MASTER_TIMx_Init();
SLAVE_TIMx_Init();
/* 启动通道PWM输出 */
HAL_TIM_PWM_Start(&htimx_MasterTIM, TIM_CHANNEL_1);
/* 无限循环 */
while (1)
{
}
}
|
|