实验中用到的几个主要函数:
int32_t DrvGPIO_InitFunction(E_DRVGPIO_FUNC function);//用来选择IO口的PWM功能
void DrvPWM_SelectClockSource(uint8_t u8Timer, uint8_t u8ClockSourceSelector);//选择PWM的时钟源
void DrvPWM_Open(void);//开启PWM时钟,并复位PWM时钟
uint32_t DrvPWM_SetTimerClk(uint8_t u8Timer, S_DRVPWM_TIME_DATA_T *sPt);//设置PWM定时器频率等
void DrvPWM_SetTimerIO(uint8_t u8Timer, int32_t i32Enable);//使能PWM IO口输出
void DrvPWM_Enable(uint8_t u8Timer, int32_t i32Enable);//使能PWM工作
main函数:
/////////////////////////////////////////////////
//工程:PWM实验
//日期:2011年9月25日
////////////////////////////////////////////////
#include <stdio.h>
#include "NUC1xx.h"
#include "DrvGPIO.h"
#include "DrvSYS.h"
#include "DrvPWM.h"
#define LED_PWM_VAL PWMA->CMR0 //通过比较器调节占空比
int main(void)
{
UNLOCKREG();
DrvSYS_Open(48000000); //将时钟设定为48MHz
DrvGPIO_Open(E_GPB, 10, E_IO_OUTPUT); //关闭蜂鸣器
DrvGPIO_ClrBit(E_GPB, 10);
DrvGPIO_Open(E_GPA, 2, E_IO_OUTPUT); // 设置GPA2端口为输出模式
DrvGPIO_Open(E_GPA, 3, E_IO_OUTPUT); // 设置GPA3端口为输出模式
DrvGPIO_Open(E_GPA, 4, E_IO_OUTPUT); // 设置GPA4端口为输出模式
DrvGPIO_Open(E_GPA, 5, E_IO_OUTPUT); // 设置GPA5端口为输出模式
DrvGPIO_InitFunction(E_FUNC_PWM01); // 设置GPIO口的PWM01功能
DrvPWM_SelectClockSource(DRVPWM_TIMER0,DRVPWM_HCLK); //选择系统时钟作为PWM的时钟
DrvPWM_Open(); //使能PWM时钟并复位
DrvSYS_Delay(500);
{
S_DRVPWM_TIME_DATA_T spt;
spt.u8Mode=1; // 自动装载模式
spt.u8HighPulseRatio=0; //占空比取值0到100
spt.i32Inverter=1; //反转输出开启
spt.u32Frequency=8000; //设定平率为8000Hz
spt.u8ClockSelector=0; //
spt.u8PreScale=0;
spt.u32Duty=0; //捕捉定时用的计数值
DrvPWM_SetTimerClk(DRVPWM_TIMER0,&spt); //初始化TIMER0时钟
}
DrvPWM_SetTimerIO(DRVPWM_TIMER0,1); //使能IO输出
DrvPWM_Enable(DRVPWM_TIMER0,1); //使能PWM0让它工作
{
uint16_t ledpwmval=0;
uint8_t dir=1;
while(1) //这里参考了正点原子的STM32不完全手册PWM实验部分
{
DrvSYS_Delayms(10);
if(dir)
{
ledpwmval++;
}
else if(dir==0)
{
ledpwmval--;
}
if(ledpwmval>400)
{
dir=0;
}
else if(ledpwmval==0)
{
dir=1;
}
LED_PWM_VAL=ledpwmval; //加载数值到CMR0比较器中来调节其占空比
}
}
}
工程包:
PWM实验.rar
(260.54 KB)
|