#include <stdint.h>
#include <stdbool.h>
#include <raw_api.h>
#include <lib_string.h>
#include <2416_reg.h>
#include <pwm.h>
#include <irq.h>
#include <timer.h>
#include <pwm.h>
#include <rsh.h>
#include "command.h"
static struct{
uint16_t hwLevelMax;
uint16_t hwLevelNow;
bool bIncreasing;
}m_tBreathLed;
#define SET_RELOAD(CNT) do{ TCNTB1_REG = (CNT);}while(0)
#define SET_LEVEL_MAX(CNT) do{ m_tBreathLed.hwLevelMax = (CNT);}while(0)
#define SET_TIMER_COMPARE(CNT) do{ TCMPB1_REG = (CNT);}while(0)
void irq_breathled(void)
{
//clear pending
//copy from pwm.c
//line 57
SRCPND_REG |= ( 0x01 << 11);
INTPND_REG |= ( 0x01 << 11);
if(m_tBreathLed.bIncreasing){
if(m_tBreathLed.hwLevelNow >= m_tBreathLed.hwLevelMax){
m_tBreathLed.bIncreasing = false;
// Uart_Printf("led_loop\n");
}else{
m_tBreathLed.hwLevelNow++;
}
}else{
if(m_tBreathLed.hwLevelNow <= 0){
m_tBreathLed.bIncreasing = true;
}else{
m_tBreathLed.hwLevelNow--;
}
}
SET_TIMER_COMPARE(m_tBreathLed.hwLevelNow);
}
void set_config(uint16_t hwBreathLedSpeedLevel)
{
TCON_REG |= (0x1 << 9);
SET_RELOAD(hwBreathLedSpeedLevel);
SET_LEVEL_MAX(hwBreathLedSpeedLevel);
SET_TIMER_COMPARE(hwBreathLedSpeedLevel/2);
TCON_REG &= ~(1<<9);
TCON_REG |= (0x1<<8);
}
void breathled_init(void)
{
//set the GPB1 10 to enable the tout1
GPBCON_REG &= ~(0x3<<2);
GPBCON_REG |= (0x2<<2);
TCON_REG &= ~(0xF << 8); //clear the register of TIM1
//it will be config when finish
//all config
//TCON_REG &=
TCFG0_REG &= ~(0xFF);
TCFG1_REG &= ~(0xF0);
//timer_1_ISRInit from raw-os
//file: Pwm.c
//Line: 124
INTMOD_REG = 0x00000000;
PRIORITY_MODE_REG = 0x00000000;
INTMSK_REG &= ~(0x1 << 11); //reset the bit 11 to restart the
register_irq(11,irq_breathled);
//ISR_REGISTER[11] = irq_breathled;
TCFG0_REG |= 15; //Prescaler = 15
TCFG1_REG |= 0x10; //divide value = 1/4
TCON_REG &= ~(0xF << 8);
TCON_REG |= (0xCD<<8);
}
//¹Ø±ÕPWM1Êä³öͨµÀ
void breathled_close(void)
{
TCON_REG &= ~(0X1 << 8);
INTMSK_REG |= (0X1 << 11);
}
int do_breathled(struct cmd_tbl_s *cmdtp, int flag, int argc, char * const argv[])
{
char* pchLed;
uint16_t hwSpeedLevel = 0;
// int i;
// for(i=0;i<argc;i++)
// {
// Uart_Printf("%s\r\n",argv[i]);
// }
pchLed = argv[1];
while((*pchLed <= ‘9‘)
&&(*pchLed >= ‘0‘)){
hwSpeedLevel *= 10;
hwSpeedLevel += *pchLed-‘0‘;
pchLed++;
}
Uart_Printf("Level:%d\r\n",hwSpeedLevel);
set_config(hwSpeedLevel);
breathled_init();
return 0;
} 因为移植了cli 所以有类似teminal的效果
整体程序再说了
视频地址:
http://v.youku.com/v_show/id_XNzQxMTg1Nzgw.html
原文地址:http://my.oschina.net/mummy108/blog/291293