CC2530裸机demo,包括adc,串口,tim4,看门狗,低功耗,pwm等

CC2530裸机开发详解

CC2530裸机demo,包括adc,串口,tim4,看门狗,低功耗,pwm等

内容简介

cc2530裸机例程,包括adc,uart,tim4,看门狗,低功耗,pwm等,稍微比其他部分全一点,比如adc采用中断模式,串口添加了环形缓冲区,使用定时器4的通道0输出pwm到指定引脚,五种功耗运行模式,尾部附带完整程序

1.ADC部分

常见的adc部分demo是使用查询模式读取adc值,但大多数情况下还是希望采用中断模式,只需要简单配置相关寄存器。再添加中断函数即可,我这里采集P0_0引脚的模拟输出信号

// adc初始化
/****************************************************************************
* 名    称: void InitialAD(void)
* 功    能: adc初始化函数
* 入口参数: 无
* 出口参数: 无
****************************************************************************/
void InitialAD(void)
{

  P0SEL  |= (1 << (0));	  //设置P0.0为外设IO口
  P0DIR  &= ~ (1 << (0)); //设置P0.0为输入I/O
  //修改========
  IEN0 |= 0x02;  //中断使能 IEN0.ADCIE=1
  EA = 1;

  ADCCON1 &= ~0x80;		//清EOC标志
  APCFG  |=1;             //设置P0.0为模拟I/O
  ADCCON3=0xb0;		//单次转换,参考电压为电源电压  //14位分辨率
  ADCCON1 = 0X30;	//停止A/D
  ADCCON1 |= 0X40;	//ADCCON1.ST=1,启动A/D
  
  adc_valve = 0;    //adc值初始为0

}

中断函数以及再一次启动adc

/****************************************************************************
* 名    称: ADC_ISR(void) adc中断处理函数 
* 描    述: 当adc产生接收中断,将收到的数据通过串口输出
****************************************************************************/
extern int adc_valve;
#pragma vector = ADC_VECTOR
__interrupt void ADC_ISR(void)
{
  uint temp[2];
  uint8_t buf[20];
  temp[1] = ADCL;
  temp[0] = ADCH;
  
  adc_valve |= (uint)temp[1];
  adc_valve |= ( (uint) temp[0] )<<8;
  adc_valve>>=2; // ADCL[1:0]没用使用
  sprintf(buf, "adc == %d", adc_valve);
  UartSendString(buf, sizeof(buf));	//串口输出adc值

	
  adc_valve = 0;    //在下一次转换前清零
}
main
{
		...
        //启动adc
        ADCCON3=0xb0;		//单次转换,参考电压为电源电压  //14位分辨率
        ADCCON1 = 0X30;	//停止A/D
        ADCCON1 |= 0X40;	//ADCCON1.ST=1,启动A/D
        ...
}

2.串口

使用串口0,默认波特率为115200,如果需要修改,只需要改对于的寄存器组合值,下面是初始化和中断函数

/****************************************************************************
* 名    称: InitUart()
* 功    能: 串口初始化函数
* 入口参数: 无
* 出口参数: 无
****************************************************************************/
void InitUart(void)
{ 
    PERCFG = 0x00;           //外设控制寄存器 USART 0的IO位置:0为P0口位置1 
    P0SEL |= 0x0c;            //P0_2,P0_3用作串口(外设功能)
    P2DIR &= ~0xC0;          //P0优先作为UART0    
    U0CSR |= 0x80;           //设置为UART方式
    U0GCR |= 11;		     //该寄存器与下面寄存器组合确定波特率
    U0BAUD |= 216;           //波特率设为115200
    UTX0IF = 0;              //UART0 TX中断标志初始置位0
    U0CSR |= 0x40;           //允许接收 
    IEN0 |= 0x84;            //开总中断允许接收中断 

    ring_buffer_init(&r_buff);
    UartSendString("uart init ok\n",13);
}

// An highlighted block
/****************************************************************************
* 名    称: UART0_ISR(void) 串口中断处理函数 
* 描    述: 当串口0产生接收中断,将收到的数据保存在RxBuf中
****************************************************************************/
#pragma vector = URX0_VECTOR 
__interrupt void UART0_ISR(void) 
{ 
    URX0IF = 0;       // 清中断标志 
    char RxBuf = U0DBUF;   
    if(RxBuf == '#')
    {
        uart_ok = 1;
    }
    ring_buffer_put(&r_buff,RxBuf);//写入环形缓冲区                        
}

3.tim4与pwm

使用定时器4的通道1输出pwm波,直接映射到引脚P1_1,只需要在程序中修改占空比即可,下面是初始化与修改占空比函数

/****************************************************************************
* 名    称: InitT4()
* 功    能: 定时器4通道1初始化,16M时钟,128分频,256计数,128*256/16000000 * 1000 = 2.048毫秒每一个周期2.048毫秒
* 入口参数: 无
* 出口参数: 无
****************************************************************************/
void InitT4()
{     
    // 配置P1.1为外设功能(Timer4通道1输出)
    P1SEL |= 0x02;  // 将P1.1 (BIT1) 设置为外设功能
    P1DIR |= 0x02;  // 将P1.1 (BIT1) 设置为输出方向
    
    // 通过PERCFG寄存器将Timer4映射到备用位置1(P1.1):cite[2]
    PERCFG |= 0x00;  // 设置Timer4使用alternative 2 location,具体位域请参考数据手册
    
    
    // 设置PWM周期(计数上限)
    T4CC0 = 0xFF;  // 根据需求调整此值,例如0xFF
    
    // 设置初始占空比(比较值)
    T4CC1 = 0x80;  // 初始占空比50% (0x80/0xFF)
    
    // 配置通道0为比较输出模式 (例如模式2: 0x1C 或 模式4: 0x2C):cite[5]
    // 模式2: 在T4CC0处翻转,在T4CC1处翻转;模式4: 在T4CC1处置低,在T4CC0处置高
    T4CCTL1 = 0x2C; // 以模式4为例 (0x2C)
    
    // 配置Timer4为模模式,并设置分频系数 (例如128分频)
    T4CTL = 0xE6;   // 模模式,128分频:cite[2]

    T4CTL |= 0x10;  // 启动Timer4 (设置T4CTL.4为1)
}
/****************************************************************************
* 名    称: updatePWM4DutyCycle()
* 功    能: pwm占空比修改
* 入口参数: dutyCycle:高电平占用比例,范围,0-255
* 出口参数: 无
****************************************************************************/
void updatePWM4DutyCycle(uint dutyCycle) 
{
 
    T4CC1 = dutyCycle;  // 更新占空比
}

4.看门狗

看门狗配置也比较简单,只需要初始化看门时长和喂狗函数

/****************************************************************************
* 名    称: Init_Watchdog()
* 功    能: 看门狗初始化函数
* 入口参数: 无
* 出口参数: 无
****************************************************************************/
void Init_Watchdog(void) 
{ 
    WDCTL = 0x00;       //打开IDLE才能设置看门狗
    WDCTL |= 0x08;      //定时器间隔选择,间隔一秒
}

/****************************************************************************
* 名    称: FeetDog()
* 功    能: 看门狗喂狗函数,看门狗只运行在正常模式和空闲模式
* 入口参数: 无
* 出口参数: 无
****************************************************************************/
void FeetDog(void) 
{ 
    WDCTL = 0xa0;       //清除定时器。当0xA跟随0x5写到这些位,定时器被清除
    WDCTL = 0x50; 
}

5.低功耗

主要有五种模式,工作模式,空闲模式,PM1,2,3三种模式,采用睡眠定时器唤醒,看门狗在PM模式下不允许,对于的模式只需要调用对应函数即可


//进入空闲模式
void Enter_IDEL()
{
  SLEEPCMD &= ~0x03;
  PCON |= 0x01;
}

//进入PM1模式
void Enter_PM1()
{
  SLEEPCMD &= ~0x03;
  SLEEPCMD |=  0x01;
  PCON |= 0x01;
}

//进入PM2模式
void Enter_PM2()
{
  SLEEPCMD &= ~0x03;
  SLEEPCMD |=  0x02;
  PCON |= 0x01;
}

//进入PM3模式
void Enter_PM3()
{
  SLEEPCMD &= ~0x03;
  SLEEPCMD |=  0x03;
  PCON |= 0x01;
}
//退出低功耗模式,进入主动模式
void Exit_Pm()
{
  PCON = 0;
}

睡眠定时器初始化和中断函数

/****************************
//初始化函数
*****************************/
void Initial_low_power(void)
{
    ST2 = 0; // 初始化睡眠定时器中断
    ST1 = 0x0F;
    ST0 = 0x0F;
    STIE = 1;
    STIF = 0;
    EA = 1; // 使能总中断
}

//设置睡眠定时唤醒时间
void Set_ST_Time(unsigned short time)
{
  unsigned long sleepTime = 0;
  
  sleepTime |= ST0; 
  sleepTime |= (unsigned long)ST1 << 8; 
  sleepTime |= (unsigned long)ST2 << 16; 
  
  sleepTime += (unsigned long)time * (unsigned long)32768;
  
  ST2 = (unsigned char )(sleepTime >> 16);
  ST1 = (unsigned char )(sleepTime >> 8);
  ST0 = (unsigned char )(sleepTime);
}

6.完整iar工程gitee链接

链接: gitee路径
下载教程说明:

  1. 如果懂git的直接克隆即可
  2. 如果不懂git的话,再打开的页面中间偏右上点击《克隆/下载》按钮,再出现的页面右上角有下载zip,相当于下载压缩包,如果需要有更新的话,需要重新下载压缩包
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值