|
void MO_SetPrescaler(BYTE t_num, BYTE value)
{
v_pPWMRegs->TCFG0 &= (~0xFF<< 8);
v_pPWMRegs->TCFG0 |= (value<< 8); // 设置定时器 2 的预分频值
}
BOOL MO_SetDivider(BYTE t_num, BYTE value)
{
BYTE tmp;
if (value > 16)
return FALSE;
for (tmp = 0; tmp < 4; tmp++)
{
if ((2 << tmp) == value)
break;
}
if (tmp > 4)
return FALSE; // value 取值只能为 2,4,8,16
v_pPWMRegs->TCFG1 &= ~(0x0F << 8);
v_pPWMRegs->TCFG1 |= (0<< 8);
v_pPWMRegs->TCFG1 &= ~(0x11 << 10);
return TRUE;
}
BOOL GIO_IOControl(DWORD hOpenContext, DWORD dwCode, PBYTE pBufIn, DWORD dwLenIn, PBYTE pBufOut, DWORD dwLenOut, PDWORD pdwActualOut)
{
switch(dwCode)
{
case IOCTL_MO_SET_PRESCALER: // 设置预分频值
if (dwLenIn >= 2) // 需要2个字节缓冲区
{
MO_SetPrescaler(pBufIn[0], pBufIn[1]);
//bErr = TRUE;
}
break;
case IOCTL_MO_SET_DIVIDER:
if (dwLenIn >= 2) // 需要2个字节缓冲区
MO_SetDivider(pBufIn[0], pBufIn[1]); // 设置分频值 (定时器编号, 分频值)
break;
case IOCTL_MO_INITI:
InitTimer();
break;
case IOCTL_MO_START:
if (dwLenIn >= 3) // 需要3个字缓冲区
{
DWORD t_num = *((DWORD *)pBufIn);
DWORD cycle = *((DWORD *)(pBufIn + 4));
DWORD duty = *((DWORD *)(pBufIn + 8));
MO_StartPWM(t_num, cycle, duty);
}
break;
default:
break;
}
RETAILMSG(DEBUG_GPIO,(TEXT("GPIO_Control:Ioctl code = 0x%x\r\n"), dwCode));
return TRUE;
}
应用程序是
#define S3C6410_PCLK 50000000 // PCLK是50MHz
#define Prescaler0 15 // 预分频
#define MUX0 8 // 定时器分频值
#define TCNTB0 250 // 工作频率
//#define TCMPB0 (TCNTB0>>1) // 占空比,默认是50%
BYTE prescale[2] = {2, 15};
BYTE divider[2] = {2, 8};
DWORD buff[3] = {2, 250, 125};
void CADC64Dlg::OnBnClickedButton15()
{
// TODO: 在此添加控件通知处理程序代码
BOOL ret;
DWORD IDThread;
// 设置 PWM0 定时器预分频值
ret = ::DeviceIoControl(m_gpiodriver, IOCTL_MO_SET_PRESCALER, prescale, 2, NULL, 0, NULL, NULL);
if (ret != TRUE)
{
OnBnClickedButton16();
MessageBox(_T("设置 PWM0 定时器预分频值失败!"));
return;
}
// 设置PWM0定时器分频值
ret = ::DeviceIoControl(m_gpiodriver, IOCTL_MO_SET_DIVIDER, divider, 2, NULL, 0, NULL, NULL);
if (ret != TRUE)
{
OnBnClickedButton16();
MessageBox(_T("设置 PWM0 定时器分频值失败!"));
return;
}
ret = ::DeviceIoControl(m_gpiodriver, IOCTL_MO_INITI,NULL , 0, NULL, 0, NULL, NULL);
if (ret != TRUE)
{
OnBnClickedButton16();
MessageBox(_T("设置 PWM0 定时器初始化失败!"));
return;
}
buff[1] = 250;//freq
buff[2] = 125;//duty
//printf("buff[1]=%d\n",buff[1]);
ret = ::DeviceIoControl(m_gpiodriver, IOCTL_MO_START, buff, 3, NULL, 0, NULL, NULL);
if (ret != TRUE)
{
// MessageBox(_T("蜂鸣器启动失败!"));
//return 0;
}
} |
|