- /**************************************************
- ** 文件名称: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);
- }
- }
- }
|