3 驱动设计
PWM驱动为字符设备驱动,主要实现了open、close、ioctl三个接口。使用ST提供的Hal库函数避免了直接操作具体的寄存器,目前使用1.2版本Hal库。
3.1 open
open中主要对指定的pwm定时器进行初始化操作,即调用__timPwmInit()。初始化内容包括引脚初始化、定时器初始化和通道初始化三个部分。默认配置占空比50%。__timPwmInit()具体实现如程序清单 3.1所示。
程序清单 3.1 pwm初始化操作
/*********************************************************************************************************
** 函数名称: __timPwmInit
** 功能描述: pwm初始化
** 输 入 : uiIndex PWM 设备控制器序号
** 输 出 : NONE
** 返 回 : ERROR_CODE
*********************************************************************************************************/
static void __timPwmInit (INT uiIndex)
{
GPIO_InitTypeDef GPIO_Initure;
if (uiIndex < 0 || uiIndex >= HW_PWM_MAX) {
printk(KERN_ERR "%s: pwm index invalid!\n", __func__);
return;
}
switch (uiIndex) {
case HW_PWM0:
__HAL_RCC_TIM10_CLK_ENABLE(); /* 使能定时器10 */
__HAL_RCC_GPIOF_CLK_ENABLE(); /* 开启GPIOF时钟 */
GPIO_Initure.Pin = GPIO_PIN_6; /* PF6 */
GPIO_Initure.Mode = GPIO_MODE_AF_PP; /* 复用推完输出 */
GPIO_Initure.Pull = GPIO_PULLDOWN; /* 上拉 */
GPIO_Initure.Speed = GPIO_SPEED_HIGH; /* 高速 */
GPIO_Initure.Alternate = GPIO_AF3_TIM10; /* PF6 复用为TIM10 */
HAL_GPIO_Init(GPIOF, &GPIO_Initure);
_G_timHandler[uiIndex].Instance = TIM10; /* 定时器10 */
_G_timHandler[uiIndex].Init.Prescaler = PWM_PSC_DEFAULT; /* 定时器分频 */
_G_timHandler[uiIndex].Init.CounterMode = TIM_COUNTERMODE_UP; /* 向上计数模式 */
_G_timHandler[uiIndex].Init.Period = PWM_ARR_DEFAULT; /* 自动重装载值 */
_G_timHandler[uiIndex].Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
_G_timChannel[uiIndex].OCMode = TIM_OCMODE_PWM1; /* 模式选择PWM1 */
_G_timChannel[uiIndex].Pulse = PWM_ARR_DEFAULT / 2;
/* 设置比较值,此值用来确定占空比 */
/* 默认比较值为自动重装载值的一 */
/* 半,即占空比为50% */
_G_timChannel[uiIndex].OCPolarity = TIM_OCPOLARITY_HIGH;
/* 输出比较极性为高 */
break;
case HW_PWM1:
__HAL_RCC_TIM11_CLK_ENABLE(); /* 使能定时器11 */
__HAL_RCC_GPIOF_CLK_ENABLE(); /* 开启GPIOF时钟 */
GPIO_Initure.Pin = GPIO_PIN_7; /* PF7 */
GPIO_Initure.Mode = GPIO_MODE_AF_PP; /* 复用推完输出 */
GPIO_Initure.Pull = GPIO_PULLDOWN; /* 上拉 */
GPIO_Initure.Speed = GPIO_SPEED_HIGH; /* 高速 */
GPIO_Initure.Alternate = GPIO_AF3_TIM11; /* PF7 复用为TIM11 */
HAL_GPIO_Init(GPIOF, &GPIO_Initure);
_G_timHandler[uiIndex].Instance = TIM11; /* 定时器11 */
_G_timHandler[uiIndex].Init.Prescaler = PWM_PSC_DEFAULT; /* 定时器分频 */
_G_timHandler[uiIndex].Init.CounterMode = TIM_COUNTERMODE_UP; /* 向上计数模式 */
_G_timHandler[uiIndex].Init.Period = PWM_ARR_DEFAULT; /* 自动重装载值 */
_G_timHandler[uiIndex].Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
_G_timChannel[uiIndex].OCMode = TIM_OCMODE_PWM1; /* 模式选择PWM1 */
_G_timChannel[uiIndex].Pulse = PWM_ARR_DEFAULT / 2;
/* 设置比较值,此值用来确定占空比 */
/* 默认比较值为自动重装载值的一 */
/* 半,即占空比为50% */
_G_timChannel[uiIndex].OCPolarity = TIM_OCPOLARITY_HIGH;
/* 输出比较极性为高 */
break;
case HW_PWM2:
__HAL_RCC_TIM13_CLK_ENABLE(); /* 使能定时器13 */
__HAL_RCC_GPIOF_CLK_ENABLE(); /* 开启GPIOF时钟 */
GPIO_Initure.Pin = GPIO_PIN_8; /* PF8 */
GPIO_Initure.Mode = GPIO_MODE_AF_PP; /* 复用推完输出 */
GPIO_Initure.Pull = GPIO_PULLDOWN; /* 上拉 */
GPIO_Initure.Speed = GPIO_SPEED_HIGH; /* 高速 */
GPIO_Initure.Alternate = GPIO_AF9_TIM13; /* PF8 复用为TIM13 */
HAL_GPIO_Init(GPIOF, &GPIO_Initure);
_G_timHandler[uiIndex].Instance = TIM13; /* 定时器13 */
_G_timHandler[uiIndex].Init.Prescaler = PWM_PSC_DEFAULT; /* 定时器分频 */
_G_timHandler[uiIndex].Init.CounterMode = TIM_COUNTERMODE_UP; /* 向上计数模式 */
_G_timHandler[uiIndex].Init.Period = PWM_ARR_DEFAULT; /* 自动重装载值 */
_G_timHandler[uiIndex].Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
_G_timChannel[uiIndex].OCMode = TIM_OCMODE_PWM1; /* 模式选择PWM1 */
_G_timChannel[uiIndex].Pulse = PWM_ARR_DEFAULT / 2;
/* 设置比较值,此值用来确定占空比 */
/* 默认比较值为自动重装载值的一 */
/* 半,即占空比为50% */
_G_timChannel[uiIndex].OCPolarity = TIM_OCPOLARITY_HIGH;
/* 输出比较极性为高 */
break;
case HW_PWM3:
__HAL_RCC_TIM14_CLK_ENABLE(); /* 使能定时器14 */
__HAL_RCC_GPIOF_CLK_ENABLE(); /* 开启GPIOF时钟 */
GPIO_Initure.Pin = GPIO_PIN_9; /* PF9 */
GPIO_Initure.Mode = GPIO_MODE_AF_PP; /* 复用推完输出 */
GPIO_Initure.Pull = GPIO_PULLDOWN; /* 上拉 */
GPIO_Initure.Speed = GPIO_SPEED_HIGH; /* 高速 */
GPIO_Initure.Alternate = GPIO_AF9_TIM14; /* PF9 复用为TIM14 */
HAL_GPIO_Init(GPIOF, &GPIO_Initure);
_G_timHandler[uiIndex].Instance = TIM14; /* 定时器14 */
_G_timHandler[uiIndex].Init.Prescaler = PWM_PSC_DEFAULT; /* 定时器分频 */
_G_timHandler[uiIndex].Init.CounterMode = TIM_COUNTERMODE_UP; /* 向上计数模式 */
_G_timHandler[uiIndex].Init.Period = PWM_ARR_DEFAULT; /* 自动重装载值 */
_G_timHandler[uiIndex].Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
_G_timChannel[uiIndex].OCMode = TIM_OCMODE_PWM1; /* 模式选择PWM1 */
_G_timChannel[uiIndex].Pulse = PWM_ARR_DEFAULT / 2;
/* 设置比较值,此值用来确定占空比 */
/* 默认比较值为自动重装载值的一 */
/* 半,即占空比为50% */
_G_timChannel[uiIndex].OCPolarity = TIM_OCPOLARITY_HIGH;
/* 输出比较极性为高 */
break;
default:
printk(KERN_ERR "__timPwmInit(): uiIndex Invalid!\n");
return;
break;
}
HAL_TIM_PWM_Init(&_G_timHandler[uiIndex]); /* 初始化PWM */
HAL_TIM_PWM_ConfigChannel(&_G_timHandler[uiIndex],
&_G_timChannel[uiIndex],
TIM_CHANNEL_1); /* 配置通道 */
HAL_TIM_PWM_Start(&_G_timHandler[uiIndex], TIM_CHANNEL_1); /* 开启PWM通道 */
}
|