|
楼主 |
发表于 2009-10-13 13:21:36
|
显示全部楼层
prj-ekk8962-3工程:
main.c的内容如下:
#include "inc_os.h"
#include "gpio.h"
#include "sysctl.h"
#include "pwm.h"
uint16_t pg_evtt_flash_led;
uint32_t pwm0_int(ufast_t int_line)
{
pg_pwm_reg->PWM0ISC = 1<<bo_pwm0_intisc_intcntzero; //清过零中断
pg_pwm_reg->PWMISC = 1<<bo_pwm_intisc_pwm0; //清PWM0中断
djy_event_pop(pg_evtt_flash_led,0,0,0);
return 0;
}
void flash_led(struct event_script *my_event)
{
static s32 compare = 0;
static bool_t up = true;
bb_sysctl_rcgc2_gpiof = 1; //使能gpiof
pg_gpio_regf->LOCK = 0x1ACCE551; //解锁CR寄存器
pg_gpio_regf->CR = 1; //允许修改AFSEL的PF0位
pg_gpio_regf->AFSEL |= 0x1; //PF0设为PWM0输出
pg_gpio_regf->LOCK = 0; //重新锁定CR寄存器
pg_gpio_regf->DEN |= 1; //允许PF0
pg_gpio_regf->IM &= 0xfe; //屏蔽掉PF0中断
pg_gpio_regf->DR8R |= 1; //设置PF0=8mA驱动
//配置PWM0
pg_sysctl_reg->RCC &= ~bm_sysctl_rcc_pwmdiv;
pg_sysctl_reg->RCC |= 5<<bo_sysctl_rcc_pwmdiv; //置pwm时钟为系统时钟64分频
bb_sysctl_rcc_enpwmdiv = 1;
bb_sysctl_rcgc0_pwm = 1; //使能pwm
pg_pwm_reg->PWM0CTL = 0;
pg_pwm_reg->PWM0GENA = (0<<bo_pwmx_act_zero)
+(0<<bo_pwmx_act_load)
+(3<<bo_pwmx_act_comp_au)
+(2<<bo_pwmx_act_comp_ad)
+(0<<bo_pwmx_act_comp_bu)
+(0<<bo_pwmx_act_comp_bd);
pg_pwm_reg->PWM0LOAD = 3000; //pwm周期约7.7mS
bb_pwm0_ctl_mode = 1; //增减循环模式
bb_pwm0_ctl_enable = 1; //使能pwm0模块
bb_pwm0_ctl_debug = 1; //使能pwm0输出
bb_pwm_enable_pwm0en = 1;
int_isr_connect(cn_int_line_PWM0,pwm0_int); //中断连接
int_setto_asyn_signal(cn_int_line_PWM0);
int_restore_line(cn_int_line_PWM0);
bb_pwm0_inten_intcntzero = 1; //使能PWM0的过零中断
bb_pwm_inten_pwm0 = 1; //使能PWM0中断
while(1)
{
if(up == true)
{
compare += 150;
if(compare >= 3000 - 150)
up = false;
}else
{
compare -=150;
if(compare <= 150)
up = true;
}
pg_pwm_reg->PWM0CMPA = compare;
djy_evtt_pop_sync(my_event->evtt_id,5,cn_timeout_forever);
}
}
//本应命名为main的,但调试器总是默认这是整个程序的入口点,罢了
void djy_main(void)
{
pg_evtt_flash_led = djy_evtt_regist(true,true,cn_prio_real,1,
flash_led,10,NULL);
djy_event_pop(pg_evtt_flash_led,0,0,0);
}
说明:这个工程和prj-ekk8962-2工程只有很小的差别:
1、main函数中不再调用 int_evtt_connect 函数连接中断和事件。
2、在中断响应函数pwm0_int中调用 djy_event_pop(pg_evtt_flash_led,0,0,0); 弹出事件。
本工程的执行过程和prj-ekk8962-2也非常相似,唯一的差别是,弹出事件由系统执行还是由应用程序执行。系统执行则灵活性差,只能弹出一条事件,且难于灵活控制事件参数,应用程序执行则可以弹出多条事件,以及灵活控制事件参数。 |
|