- /////////////////////////////////////////////////
- //工程: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比较器中来调节其占空比
- }
- }
- }
工程包: