锦锐单片机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

参数

CA51F003单片机

串口和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++;


	}


}