/**************************************************
** 文件名称:NUC120_USM.c
** 文件说明:NUC120助学板练习程序
** 创建日期:2011-08-02** 修改日期:
** 备 注:PWM0输出波形测试,初始频率为40KHZ,初始占空比为30%
按键key2按下时占空比反向(原来是30%的话,现在是70%)
此程序仅作为学习PWM输出时的一个反向输出的一个例子,
这是我初次接触芯唐NUC120时用过测试的,当时没有保存,
现在把它整理出来,希望对有些人有用。
**************************************************/
#include <stdio.h>
#include "NUC1xx.h"
#include "Driver\DrvGPIO.h"
#include "Driver\DrvSYS.h"
#include "Driver\DrvPWM.h"
#define Run_Led 2 //2----LED1 3----LED2 4----LED3 5----LED4
uint8_t flag;
/***************
** 函数声明 **
***************/
void Init_System (void);
void Init_PWM0(void);
void EINT0Callback(void);
void Init_GPIO (void);
/*****************************
** Name: EINT0Callback
** Function: EINT0中断服务函数
** Input: None
** OutPut: None
** Data: 2011-08-02
** Note:
****************************/
void EINT0Callback(void)
{
flag=~flag;
}
/*****************************
** Name: Init_System
** Function: 系统初始化函数
** Input: None
** OutPut: None
** Data: 2011-03-17
** Note:
****************************/
void Init_System(void)
{
/* Unlock the locked registers before access */
UNLOCKREG(x); //寄存器锁定键地址寄存器(RegLockAddr) :有些系统控制寄存器需要被保护起来,以防止误操作而影响芯片运行,
//这些寄存器在上电复位到用户解锁定之前是锁定的。用户可以连续依次写入“59h”, “16h” “88h”到0x5000_0100解锁定.
/* Enable the 12MHz oscillator oscillation */
DrvSYS_SetOscCtrl(E_SYS_XTL12M, 1); //SYSCLK->WRCON.XTL12M_EN = 1;
/* Waiting for 12M Xtal stable */
//while (DrvSYS_GetChipClockSourceStatus(E_SYS_XTL12M) != 1); //SYSCLK->CLKSTATUS.XTL12M_STB
/*eClkSrc - [in] E_SYS_XTL12M / E_SYS_XTL32K / E_SYS_OSC22M / E_SYS_OSC10K / E_SYS_PLL */
// Note: Only some of NuMicro NUC100 Series support this function.
DrvSYS_Delay(5000);
LOCKREG(x);
//向“0x5000_0100”写入任何值,就可以重锁保护寄存器
}
/*****************************
** Name: Init_GPIO
** Function: GPIO初始化函数
** Input: None
** OutPut: None
** Data: 2011-08-02
** Note:
****************************/
void Init_GPIO (void)
{
/*set GPI0 output*/
DrvGPIO_Open(E_GPA,2, E_IO_OUTPUT); // 设置GPA2端口为输出模式 连接LED_1
DrvGPIO_Open(E_GPA,3, E_IO_OUTPUT); // 设置GPA3端口为输出模式 连接LED_2
DrvGPIO_Open(E_GPA,4, E_IO_OUTPUT); // 设置GPA4端口为输出模式 连接LED_3
DrvGPIO_Open(E_GPA,5, E_IO_OUTPUT); // 设置GPA5端口为输出模式 连接LED_4
DrvGPIO_Open(E_GPB,14,E_IO_INPUT); // 设置GPB14端口为输入模式 连接按KEY1
DrvGPIO_Open(E_GPB,15,E_IO_INPUT); // 设置GPB15端口为输入模式 连接按KEY2
DrvGPIO_InitFunction(E_FUNC_EXTINT0);
DrvGPIO_EnableEINT0(E_IO_FALLING, E_MODE_EDGE, EINT0Callback);
//若设置为上升沿中断即E_IO_RISING,则在每次按键弹起时响应中断
//若设置为下降沿中断即E_IO_FALLING,则在每次按键按下时相应中断
}
/*****************************
** Name: Init_PWM0
** Function: Timer0初始化函数
** Input: None
** OutPut: None
** Data: 2011-06-02
** Note:
****************************/
void Init_PWM0(void)
{
S_DRVPWM_TIME_DATA_T sPt;
/*
声明 PWM Timer设置的结构体 位于DRVPWM.H
结构体如下:
typedef struct
{
uint8_t u8Mode;
uint8_t u8HighPulseRatio;
uint8_t u8ClockSelector;
uint8_t u8PreScale;
uint32_t u32Frequency;
uint32_t u32Duty;
int32_t i32Inverter;
}S_DRVPWM_TIME_DATA_T;
*/
/* PWM Timer property */
sPt.u8Mode = DRVPWM_AUTO_RELOAD_MODE; /*自动重载模式 DRVPWM_ONE_SHOT_MODE为单触发模式*/
sPt.u32Frequency = 40000; /*PWM 频率 为40KHZ*/
sPt.u8HighPulseRatio = 30; /* 高脉冲宽度 : 总脉冲宽度 = 30 : 100 */
sPt.i32Inverter = 0; /*反向关闭*/
/* Enable PWM clock */
DrvPWM_Open();
/* Select PWM engine clock */
DrvPWM_SelectClockSource(DRVPWM_TIMER0, DRVPWM_EXT_12M);
/* Set PWM Timer0 Configuration */
DrvPWM_SetTimerClk(DRVPWM_TIMER0, &sPt);
/* Enable Output for PWM Timer0 */
DrvPWM_SetTimerIO(DRVPWM_TIMER0, 1);
/* Set PWM pins */
DrvGPIO_InitFunction(E_FUNC_PWM01);
/* Enable the PWM Timer 0 */
DrvPWM_Enable(DRVPWM_TIMER0, 1);
}
int main (void)
{
S_DRVPWM_TIME_DATA_T sPt;
Init_System();
Init_PWM0();
Init_GPIO () ;
DrvGPIO_Open(E_GPA,Run_Led, E_IO_OUTPUT); //程序运行指示
DrvGPIO_ClrBit(E_GPA,Run_Led);
while(1)
{
if(flag)
{
sPt.u8Mode = DRVPWM_AUTO_RELOAD_MODE; /*自动重载模式 DRVPWM_ONE_SHOT_MODE为单触发模式*/
sPt.u32Frequency = 40000; /*PWM 频率 为40KHZ*/
sPt.u8HighPulseRatio = 30; /* 高脉冲宽度 : 总脉冲宽度 = 30 : 100 */
sPt.i32Inverter = 1; /*反向打开*/
DrvPWM_SetTimerClk(DRVPWM_TIMER0, &sPt);
DrvPWM_SetTimerIO(DRVPWM_TIMER0, 1);
DrvPWM_Enable(DRVPWM_TIMER0, 1);
}
else
{
sPt.u8Mode = DRVPWM_AUTO_RELOAD_MODE; /*自动重载模式 DRVPWM_ONE_SHOT_MODE为单触发模式*/
sPt.u32Frequency = 40000; /*PWM 频率 为40KHZ*/
sPt.u8HighPulseRatio = 30; /* 高脉冲宽度 : 总脉冲宽度 = 30 : 100 */
sPt.i32Inverter = 0; /*反向关闭*/
DrvPWM_SetTimerClk(DRVPWM_TIMER0, &sPt);
DrvPWM_SetTimerIO(DRVPWM_TIMER0, 1);
DrvPWM_Enable(DRVPWM_TIMER0, 1);
}
}
}
|