自学内容网 自学内容网

锦锐科技CA51F7系列笔记

1、PWM

(1)芯片一共有6个PWM通道(PWM0~PWM5)

(2)IRCH时钟IRCH 频率为 16MHz

(3)IRCL时钟(IRCL频率为100KHz)

(4)PFG时钟(PWM0的时钟固定为PFG)

(5)PWM1~5可以选择IRCH、IRCL和PFG时钟作为时钟源

(6)例程:
 

#define PWMxDIV 100    //分频比,根据时钟源可以算出频率

#define PWMxDUT 50     //50除以100为占空比

PWMxDIVH = PWMxDIV / 256

PWMxDIVL = PWMxDIV % 256

PWMxDUTH = PWMxDUT / 256

PWMxDUTL = PWMxDUT % 256

PWMDIV和PWMDUT是两个16位的数值(0到65535)。为了将它们储存在8位寄存器里面,需要将它们分为高8位部分和低8位部分

高8位部分(高字节):这是通过除以256得到的。是由于256是2的8次方,除以256相当于向右移动8位。

低8位部分(低字节):这是通过对256取余数 (% 256) 得到的

例如:

  • PWMxDIV = 100:

    • 高字节 (PWMxDIVH): 100 / 256 = 0
    • 低字节 (PWMxDIVL): 100 % 256 = 100
  • PWMxDUT = 50:

    • 高字节 (PWMxDUTH): 50 / 256 = 0
    • 低字节 (PWMxDUTL): 50 % 256 = 50

这样,你就可以将16位的值(100和50)分成两个8位的值,分别存储在8位的寄存器中。这个操作使得处理较大的数值在硬件资源有限的微控制器上成为可能。

(7)P07C = 0x3C,强灌电流

2、GPIO

例如, P00 设置为推挽输出,程序如下:
P00F = 2;
P00 设置为开漏输出,程序如下:
P00F = (1<<5)|2;
P00 设置为开漏输出,并且打开上拉,程序如下:
P00F = (1<<7) (1<<5) 2;
P00 设置为输入功能,并且打开上拉,程序如下:
P00F = (1<<7) 1;

LED1输出高电平,LED输出低电平,LED3悬浮输入,则D5亮红灯,其他灯不亮

void LED1_light()
{
    P14F = 2;
    P13F = 2;
    P12F = ~((1<<7) | (1<<6)) | 1;
    P14 = 1;
    P13 = 0;
    P12 = 0;
}

要让灯光按顺序亮,需要加入定时器中断和灯光扫描函数,这样能在快速不断的打开关闭IO口的时候,实现好几个灯同时点亮的效果。

void fun_led_scan()
{
    static unsigned char ledIndex = 0;
    ledIndex ++;
    if(ledIndex >= 6)
    {
        ledIndex = 0;
    }
    switch(ledIndex)
    {
        case 0:
            if(bLED1)
                LED1_light();
            break;

        case 1:
            if(bLED2)
                LED2_light();
            break;

        case 2:
            if(bLED3)
                LED3_light();
            break;

        case 3:
            if(bLED4)
                LED4_light();
            break;

        case 4:
            if(bLED5)
                LED5_light();
            break;

        case 5:
            if(bLED6)
                LED6_light();
            break;

        default:
            LEDall_OFF();
            ledIndex = 0;
            break;
     }
}

unsigned char bTimeBase_Onetime;

void TIMER0_ISR (void) interrupt 1
{
    bTimeBase_Onetime = 1;
    TH0 = TH_VAL;
    TL0 = TL_VAL;
    
    fun_led_scan();
}

3、中断

定时器0有4种模式,用户手册里面的东西太繁琐

定时器1有4种模式,用户手册里面的东西太繁琐

直接例程里面的代码拿来用就是。1ms中断(模式0),10ms中断(模式1),100us中断(模式2)

4、adc

例程直接拿来用


原文地址:https://blog.csdn.net/m0_64937226/article/details/142765217

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!