锦锐单片机CA51F003单片机,有2路uart和ADC
深圳市锦锐科技股份有限公司_电子电工 (cachip.com.cn)
CA51F003 系列芯片是基于 1T 8051 内核的 8 位微控制器,通常情况下,运行速度比传统的 8051 芯片快 10倍,性能更加优越。内置 18K Flash 程序存储器,可多次重复编程的特性,给用户开发带来了极大的方便。
不仅保留了传统 8051 芯片的基本特性,还集成了 12Bit ADC、16 Bit PWM、UART、I²C、运放以及低电压检测(LVD)等功能模块,并支持在线仿真功能。支持 IDLE、STOP 和低速运行三种省电模式以适应不同功耗要求的应用,广泛应用于消费类电子和家电产品。
芯片成本1元
CA51F003S4
产品概述
内核 工作电压
● CPU:1T 8051,最高速度比传统8051快10倍 ● 工作电压:1.8 - 5.5V宽电压工作范围
● 兼容8051指令集, 双DPTR工作模式
存储器 中断系统
● Flash: 18K 字节,支持多次重复擦写 ● 15 个有效中断源
● Flash可划分为程序空间和数据空间 ● 两级中断优先级,支持中断嵌套
● 数据空间可用于存储掉电需要保存的数据,可省略EEPROM ● 10 个外部中断源,每个中断可配置任意信号引脚作为中断输入脚
● RAM:256字节内部RAM,1024K字节外部RAM
时钟系统 通用输入输出口(GPIO)
● 内置低速RC振荡器:131KHz ● 最多支持 18 个GPIO口,支持推挽、开漏、强上拉、
● 内置高速 RC 振荡器:16MHz ( 精度可达 ±1%@3.3V/25℃) 弱上拉、强下拉、弱下拉、高阻模式
● 外部高速振荡器:1 - 24MHz ● 推挽模式下可设置不同驱动强度和翻转速度
● 外部时钟输入:1 - 24MHz
模/数转换器( ADC) 通用串行接口(UART0/UART1)
● 最多支持 12 通道 12 位 SAR ADC(型号不同会有不同) ● 支持 2 个UART接口
● 支持 3 种基准电压源:VDD、内部基准、外部基准 ● 支持 1 字节接收缓存
● 选择内部电压为基准电压时可测量 VDD 电压
● 支持可设置的比较器模式
● 内置运放,支持检测信号缩小功能,缩小倍数可选
● ADC 可直接检测运放 A 输出
● ADC 可与 PWM 结合使用,由 PWM 中断启动 ADC 转换
PWM 运放(AMP)
● 支持 6 通道 PWM,在 16 位范围内可任意配置周期和占空比 ● 运放 A 内置校正机制,校正后全温条件下失调电压小于 0.5mV
● PWM0~PWM5 可选择任意 IO 引脚作为 PWM 输出引脚 ● 运放 B 专用于无线充通信解码
● 支持互补模式和死区控制,可用于驱动直流无刷电机
● 支持可设置边沿对齐和中心对齐模式
● 支持软件刹车及硬件刹车
● 支持 PWM 暂停功能
● 支持可直接输出内部时钟功能
● 支持 PWM 中断
复位模式 定时器
● 芯片支持多种复位源:硬复位,软复位,看门狗复位,低电 ● 3个16位通用定时器: 定时器0,定时器1,定时器2
压检测复位,上电/掉电复位
低电压检测(LVD) 看门狗
● 可配置四档触发电压 2.0V、2.7V、3.7V 和 4.4V ● 27位看门狗定时器,16位调节精度,可配置看门狗复位或中断
● 可设置低电压复位或中断
I2C接口 SPI接口
● 内置1路I2C接口,支持主从模式,支持标准/快速/高速模式 ● 内置 1 个 4 线 SPI 接口,支持主从模式
乘除法器(MDU) TMC功能
● 支持 1 个时钟周期 16 位 × 16 位乘法 ● 时钟源为内置低速 RC 振荡器,中断时间最小单位为 512 个低速 RC 振荡器
● 支持 8 个时钟周期 32 位 ÷ 32 位除法 时钟周期
● 支持 1 个时钟周期 32 位数据左右移位操作 ● 可配置中断时间为 1-256 个最小单位时间
低功耗 程序下载和仿真
● STOP模式,电流<10uA ● 支持ISP和IAP
● IDLE模式,电流<15uA ● 支持在线仿真功能
● 低速运行模式,电流<30uA
封装形式:SOP20
参数
串口和ADC演示代码:
// main.c
//
#include <stdio.h>
#include "basicType.h"
#include "ca51f003_config.h"
#include "ca51f003sfr.h"
#include "ca51f003xsfr.h"
#include "gpiodef_f003.h"
#include "system_clock.h"
#include "uart.h"
#include "timer.h"
#include "adc.h"
// RAM/FLASH : 1024+256 / 18KB
extern u32 g_sysTick;
extern xdata FrameOut g_fo1;
extern xdata FrameOut g_fo2;
u16 g_AD_Value;
u16 g_AD_Smpl = 0;
void main(void)
{
u8 buff[32];
u8 sz;
#ifdef LVD_RST_ENABLE
LVDCON = 0xE0;
#endif
initTmr0();
initUart1();
initUart2();
initADC();
EA = 1;
P00F = OUTPUT; //
P10F = OUTPUT; //
// uart1write("ddd\n", 4);
int tnext = 50;
volatile int rounds = 0;
while (1)
{
if (g_sysTick > tnext)
{
P00 = !P00;
tnext = g_sysTick + 50;
rounds++;
sz = sprintf(buff, "uart1:%d ;", rounds);
uart1write(buff, sz);
sz = sprintf(buff, "smplc:%u;", g_AD_Smpl);
uart1write(buff, sz);
sz = sprintf(buff, "adc:%u\n", g_AD_Value);
uart1write(buff, sz);
sz = sprintf(buff, "uart2:%d\n", rounds);
uart2write(buff, sz);
}
}
}
void isr_tmr0() __interrupt 1
{
TH0 = TH_VAL;
TL0 = TL_VAL;
g_sysTick++;
if (g_sysTick % 17 == 0)
{
// P10 = !P10;
}
}
void isr_uart1(void) __interrupt 6
{
if (S1CON & 0x01) // read coming byte
{
S1CON |= 0x01;
u8 c = S1BUF;
}
if (S1CON & 0x02) // write byte in buffer out
{
S1CON |= 0x02;
if (g_fo1.sz)
{
S1BUF = g_fo1.arr[g_fo1.inextout++];
g_fo1.inextout &= 0x7f;
g_fo1.sz--;
}
else
{
g_fo1.inextin = 0;
g_fo1.inextout = 0;
g_fo1.isrunning = 0;
}
}
}
void isr_uart2(void) __interrupt 8
{
if (S2CON & 0x01) // read coming byte
{
S2CON |= 0x01;
u8 c = S2BUF;
}
if (S2CON & 0x02) // write byte in buffer out
{
S2CON |= 0x02;
if (g_fo2.sz)
{
S2BUF = g_fo2.arr[g_fo2.inextout++];
g_fo2.inextout &= 0x7f;
g_fo2.sz--;
}
else
{
g_fo2.inextin = 0;
g_fo2.inextout = 0;
g_fo2.isrunning = 0;
}
}
}
void isr_adc(void) __interrupt 7
{
if (ADCON & ADIF)
{
ADCON |= ADIF;
//清中断标志
g_AD_Value = ADCDH * 256 + ADCDL;
//读取 AD 值
g_AD_Value >>= 4;
ADCON |= AST(1);
//启动下一次 AD 转换
P10 = !P10;
g_AD_Smpl++;
}
}