锦锐单片机 CA51F003单片机D型8051单片机(兼容STM8S003)有2路uart和ADC演示代码

软件开发大郭
0 评论
/
27 阅读
/
7998 字
01 2023-02

锦锐单片机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++;
	}
}
    暂无数据