📄 pwm.c
字号:
}
if (pArgData->uiActCtrl > __PWM_ACT_MAX) { /* 判断匹配响应动作是否正确 */
pArgData->uiActCtrl = __PWM_NONE; /* 用户不输入该参数的默认值 */
}
if (pArgData->uiPwmDown == -1) { /* 用户没有输入下降沿数据 */
return OPERATE_FAIL; /* 返回错误 */
}
if (pArgData->uiEdg == __PWM_SIG_OUT) { /* 单边沿 */
puiBaseAddr[GucMRxTab[uiChanle] << uiOffBase] = __pwmUsToFre(pArgData->uiPwmDown);
/* 设置MRX匹配值 */
if (uiChanle != 1) { /* 1通道为单通道不需要设置 */
puiBaseAddr[__B_PWM_PCR << uiOffBase] &= ~(1 << uiChanle);
/* 设置为单边沿模式 */
}
} else { /* 双边沿 */
if (uiChanle == 1) { /* 1通道不支持双边沿 */
return OPERATE_FAIL;
}
/*
* 双边沿触发,不设置上升沿匹配值,默认使用前一个通道值作为该通道上升沿的值
*/
if (pArgData->uiPwmUp != -1) {
puiBaseAddr[GucMRxTab[uiChanle-1] << uiOffBase] = __pwmUsToFre(pArgData->uiPwmUp);
/* 设置上升沿匹配值 */
puiBaseAddr[__B_PWM_LER << uiOffBase] |= (1 << (uiChanle - 1));
/* 匹配锁存指定的通道 */
}
puiBaseAddr[GucMRxTab[uiChanle] << uiOffBase] = __pwmUsToFre(pArgData->uiPwmDown);
/* 设置下降沿匹配值 */
puiBaseAddr[__B_PWM_PCR << uiOffBase] |= (1 << uiChanle); /* 设置为双边沿模式 */
}
puiBaseAddr[__B_PWM_MCR << uiOffBase] |= pArgData->uiActCtrl << 3*uiChanle;
/* 通道匹配时相应的动作 */
puiBaseAddr[__B_PWM_LER << uiOffBase] |= (1 << uiChanle); /* 匹配锁存指定的通道 */
puiBaseAddr[__B_PWM_PCR << uiOffBase] |= (1 << (uiChanle + 8)); /* 使能该通道PWM输出 */
return OPERATE_SUCCESS;
}
/*********************************************************************************************************
** Function name: pwmModeSet
** Descriptions: pwm模式设置参数,字符串传入参数
** Input parameters: uiArgID 部件ID,0表示使用PWM0设备
** uiChanle 设置的通道范围:1 - 6
** pucData 字符串传入参数指针,必选参数关键字如下
** PwmEdg 边沿输出模式,0表示单边沿输出,1表示双边沿输出
** PwmDowm 设置通道的下降沿位置,该位置可为单双边沿下降沿
** 可选关键字:
** PwmUp 设置通道的上升沿位置,仅在双边沿时有效,单边沿可不设置,双边沿
** 模式不设置该参数,该参数采用上一通道的参数做为上升沿参数
** PwmOutCtrl 1,设置PWM输出到管脚,0表示PWM不输出到管脚,不设置默认输出到管脚
** PwmActCtrl 当设置通道匹配的TC动作:0,无动作 1,产生中断 2,TC复位
** 3,TC复位且产生中断 4,TC停止 5,TC停止同时也产生中断
** 不设置默认无动作
** Output parameters: NONE
** Returned value: OPERATE_FAIL 设置失败
** OPERATE_SUCCESS 设置成功
*********************************************************************************************************/
int32 pwmModeSet (uint32 uiArgID,
uint32 uiChanle,
char *pucData)
{
uint32 uiTemp[7] ={-1, -1, -1, -1, -1, -1, -1};
if (!pucData) {
return OPERATE_FAIL;
}
ImpCmd(Tab_PWM, pucData, uiTemp);
return __pwmModeSet(uiArgID, uiChanle, (__PPWM_PARM)uiTemp);
}
/*********************************************************************************************************
** Function name: pwmStart
** Descriptions: pwm启动函数
** Input parameters: uiArgID 部件ID,0表示使用PWM0设备
** Output parameters: NONE
** Returned value: OPERATE_FAIL 启动失败
** OPERATE_SUCCESS 启动成功
*********************************************************************************************************/
int32 pwmStart (uint32 uiArgID)
{
volatile uint32 *puiBaseAddr;
uint32 uiOffBase;
if (uiArgID >= __PWM_MAX_NUM) { /* 传入ID号错误 */
return OPERATE_FAIL;
}
puiBaseAddr = GppwiDataTab[uiArgID]->puiAddrBase; /* 获取寄存器基地址 */
uiOffBase = GppwiDataTab[uiArgID]->uiOffBase;
puiBaseAddr[__B_PWM_TCR << uiOffBase] &= ~(3 << 1); /* 停止复位计数器 */
puiBaseAddr[__B_PWM_TCR << uiOffBase] |= (1 << 0); /* 计数器使能 */
return OPERATE_SUCCESS;
}
/*********************************************************************************************************
** Function name: __pwmTimeDly
** Descriptions: pwmn内部使用的一个短延时函数
** Input parameters: uiDly 延时时间,数字越大,时间越久
** Output parameters: NONE
** Returned value: NONE
*********************************************************************************************************/
static void __pwmTimeDly (uint32 uiDly)
{
uint32 i, j;
for (; j < uiDly; j++) {
for (i = 0; i < 100; i++);
}
}
/*********************************************************************************************************
** Function name: pwmReStart
** Descriptions: pwm重启动函数
** Input parameters: uiArgID 部件ID,0表示使用PWM0设备
** Output parameters: NONE
** Returned value: OPERATE_FAIL 重启失败
** OPERATE_SUCCESS 重启成功
*********************************************************************************************************/
int32 pwmReStart (uint32 uiArgID)
{
volatile uint32 *puiBaseAddr;
uint32 uiOffBase;
if (uiArgID >= __PWM_MAX_NUM) { /* 传入ID号错误 */
return OPERATE_FAIL;
}
puiBaseAddr = GppwiDataTab[uiArgID]->puiAddrBase; /* 获取寄存器基地址 */
uiOffBase = GppwiDataTab[uiArgID]->uiOffBase;
puiBaseAddr[__B_PWM_TCR << uiOffBase] |= (1 << 1); /* 复位计数器 */
__pwmTimeDly(1); /* 确保复位计数器成功 */
puiBaseAddr[__B_PWM_TCR << uiOffBase] &= ~(3 << 1); /* 停止复位计数器 */
puiBaseAddr[__B_PWM_TCR << uiOffBase] |= (1 << 0); /* 计数器使能 */
return OPERATE_SUCCESS;
}
/*********************************************************************************************************
** Function name: pwmStop
** Descriptions: pwm停止函数
** Input parameters: uiArgID 部件ID,0表示使用PWM0设备
** Output parameters: NONE
** Returned value: OPERATE_FAIL 停止失败
** OPERATE_SUCCESS 停止成功
*********************************************************************************************************/
int32 pwmStop (uint32 uiArgID)
{
volatile uint32 *puiBaseAddr;
uint32 uiOffBase;
if (uiArgID >= __PWM_MAX_NUM) { /* 传入ID号错误 */
return OPERATE_FAIL;
}
puiBaseAddr = GppwiDataTab[uiArgID]->puiAddrBase; /* 获取寄存器基地址 */
uiOffBase = GppwiDataTab[uiArgID]->uiOffBase;
puiBaseAddr[__B_PWM_TCR << uiOffBase] &= ~(1 << 0); /* 关闭定时计数器 */
return OPERATE_SUCCESS;
}
/*********************************************************************************************************
** Function name: __pwmISR
** Descriptions: pwm中断服务函数,驱动部分,只有清中断,用户部分代码可以在钩子函数里实现
** Input parameters: uiArgID 部件ID,0表示使用PWM0设备
** Output parameters: NONE
** Returned value: NONE
*********************************************************************************************************/
void __pwmIsr (uint32 uiArgID)
{
volatile uint32 *puiBaseAddr;
uint32 uiOffBase;
if (uiArgID >= __PWM_MAX_NUM) { /* 传入ID号错误 */
return;
}
puiBaseAddr = GppwiDataTab[uiArgID]->puiAddrBase; /* 获取寄存器基地址 */
uiOffBase = GppwiDataTab[uiArgID]->uiOffBase;
puiBaseAddr[__B_PWM_IR << uiOffBase] |= ((7 << 8) | 0x0f); /* 清除所有中断标志位 */
}
/*********************************************************************************************************
** Function name: pwm0ISR
** Descriptions: pwm0中断服务函数,被用户中断管理函数调用
** Input parameters: NONE
** Output parameters: NONE
** Returned value: NONE
*********************************************************************************************************/
void pwm0Isr (void)
{
pwm0Hook();
__pwmIsr(0); /* 清除中断标志 */
VICVectAddr = 0;
}
/*********************************************************************************************************
END FILE
*********************************************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -