A Fast PWM for CSR101x

CSR101x是CSR的一款蓝牙低功耗芯片,在介绍PWM之前,这里先对它基本特征做一个简单的描述,

  • CSR101x内部有两个独立的MCU, 一个16位的主芯片XAP,一个8位的8051。
  • XAP工作在16M频率上,而8051能工作在16M和32KHz的频率上。
  • XAP能够送中断事件到8051,8051也能够送Wake-up事件到XAP。
  • 8051能使用XAP的PIO口,不过PIO同一时间只能被一方使用。
  • 它们有一个64Bytes的共享数据区 。
  • 8051有1K字节的代码区和64字节的数据区。

下面是它的内存示意图:

A Fast PWM for CSR101x_第1张图片

从CSR xIDE上可以得到如下宏定义:

#define PIO_CONTROLLER_RAM_START ((uint16*)0xE800)

#define PIO_CONTROLLER_DATA_WORD (PIO_CONTROLLER_RAM_START + 0x0020)


这两个定义对我们理解其两者的数据共享非常有用。下面这个API就是XAP用来设置PWM宽度的,其中就有用到这些定义,

 bool PioFastPwmSetWidth(uint8 pwm_port, uint8 bright_width, uint8 dull_width,
                        bool inverted)
{
    uint8 port = pwm_port;
    
    if( bright_width > 255 || dull_width > 255 )
    {
        return FALSE;
    }
    
    switch( pwm_port )
    {
    case PWM0_PORT:
        port = 0;
        break;
    case PWM1_PORT:
        port = 1;
        break;
    case PWM2_PORT:
        port = 2;
        break;
    case PWM3_PORT:
        port = 3;
        break;
    default:
        return FALSE;
    }

    uint16*address=PIO_CONTROLLER_DATA_WORD+(port>>1);

    if(port&1)
    {
        *address&=0x00ff;
        *address|=(bright_width<<8);
        address+=2;
        *address&=0x00ff;
        *address|=(dull_width<<8);
    }
    else
    {
        *address&=0xff00;
        *address|=bright_

你可能感兴趣的:(蓝牙应用,蓝牙低功耗,BLE)