本帖最后由 芯圣电子官方QQ 于 2023-7-24 15:41 编辑
开发板前天收到,首先非常感谢芯圣。
对于时钟,芯圣003内部RC最高可选32M频率。 每个外设都能选择自己的时钟,这点非常好。
对于PWM,芯圣003支持10位3组6路PWM,每组可独立设置周期,每路独立占空比。共用一个中断入口,每路都有独立的中断标志。唯一遗憾的就是分辨率是10位的。
对于AD,芯圣003可以选择基准电压,对采集一次AD时间也有寄存器控制。
对于URAT(模式1),同样的时钟,芯圣003波特率的分辨率比芯唐003的高。
下面是本人写的外设程序初始化
#include "global.h"
/**************************************************************************/
//偶数位IO口 0246
#define ou_input 0x00 //输入口 无斯密特
#define ou_down_input 0x01 //下拉输入 无斯密特
#define ou_up_input 0x02 //上拉输入 无斯密特
#define ou_sim_input 0x03 //模拟输入
#define ou_input_smt 0x04 //输入口 斯密特
#define ou_down_input_smt 0x05 //下拉输入 斯密特
#define ou_up_input_smt 0x06 //上拉输入 斯密特
#define ou_push_output 0x08 //推挽输出
#define ou_open_output 0x09 //开漏输出
#define ou_open_up_output 0x0a //开漏上拉输出
//奇数位IO口 1357
#define ji_input 0x00 //输入口 无斯密特
#define ji_down_input 0x10 //下拉输入 无斯密特
#define ji_up_input 0x20 //上拉输入 无斯密特
#define ji_sim_input 0x30 //模拟输入
#define ji_input_smt 0x40 //输入口 斯密特
#define ji_down_input_smt 0x50 //下拉输入 斯密特
#define ji_up_input_smt 0x60 //上拉输入 斯密特
#define ji_push_output 0x80 //推挽输出
#define ji_open_output 0x90 //开漏输出
#define ji_open_up_output 0xa0 //开漏上拉输出
/**************************************************************************/
void GPIO_AllConfig(void) //IO口初始化
{ //---------------------------------------------------
P0 =0;
P0M0 = ji_push_output | ou_push_output; //设置P00 P01
P0M1 = ji_push_output | ou_push_output; //设置P02 P03
P0M2 = ji_push_output | ou_push_output; //设置P04 P05
P0M3 = ji_push_output | ou_push_output; //设置P06 P07
P0 =0;
//---------------------------------------------------
P2 =0;
P2M0 = ji_push_output | ou_push_output; //设置P20 P21
P2M1 = ji_push_output | ou_push_output; //设置P22 P23
P2M2 = ji_push_output | ou_push_output; //设置P24 P25
P2M3 = ji_push_output | ou_push_output; //设置P26 P27
P2 =0;
//---------------------------------------------------
P1 =0;
P1M0 = ji_push_output | ou_push_output; //设置P10 P11
P1 =0;
//---------------------------------------------------
}
/**************************************************************************/
/**************************************************************************/
void delay_1xms(u8 xms)
{ u8 i,j;
for(j=0;j<xms;j++)
{ for(i=0;i<100;i++) //16M 1clk
{ IWDG_Refresh();
IWDG_Refresh();
IWDG_Refresh();
}
}
}
/**************************************************************************/
/**************************************************************************/
void CLK_Config(void) //系统时钟初始化
{ //---------------------------------------------------
WDTCCR = 0x00; //关闭看门狗
while((CLKCON&0x20)!=0x20); //等待内部高频RC起振
CLKSWR = 0x51; //选择内部高频时钟为主时钟,内部高频RC2分频,Fosc=16MHz
while((CLKSWR&0xC0)!=0x40); //等待内部高频切换完成
CLKDIV = 0x02; //Fosc1分频得到Fcpu,Fcpu=8MHz 等于几 就是几分频
//---------------------------------------------------
}
/**************************************************************************/
#define WDT_REST_ON 0x40 //看门狗复位使能
#define WDT_CLOCK_32 0x02 //分频
#define IDLE_OR_POWERDOWN_STOP 0x08 //掉电模式下 不工作
#define CCRValue 40 //复位计数
/**************************************************************************/
void IWDG_Config(void) //看门狗初始化
{ //------------------------------------------------------------------
WDTC |= WDT_CLR;
while(WDTC&WDT_CLR);
WDTC = (WDT_REST_ON&WDT_RST)|(WDT_CLOCK_32&WDT_PS)|(IDLE_OR_POWERDOWN_STOP|WDT_PD);
WDTCCR =CCRValue;
//------------------------------------------------------------------
}
/**************************************************************************/
void IWDG_Refresh(void) //清看门狗
{ WDTC |= WDT_CLR;
while(WDTC&WDT_CLR); //等待清完
}
/**************************************************************************/
/**************************************************************************/
void time1_Config(void) //定时器1初始化
{ TMOD = TMOD | 0x00; //工作在方式0 16位自动装载定时器
TCON1 = TCON1 |0x00; //bit4 为1 时钟为系统时钟 为0 系统时钟12分频
TH1 = RELOAD_VALUE_H1; //赋初值
TL1 = RELOAD_VALUE_L1; //赋初值
TR1=1; TF1=0;
ET1=1;
}
/**************************************************************************/
/**************************************************************************/
void pwm_init(void) //3组12位PWM
{
PWM0C = 0x00; //关闭PWM0模块中断 分频系统时钟1 bit0-1 分频系数 1 8 32 128
//PWM0C = PWM0C |0x04; //bit2=1 PWM01反向 bit3=1 PWM0反向
PWM0P = buf_period0-1; //PWM0模块周期设定
PWM0D = 0; //独立模式下 PWM0占空比 互补 PWM0 PWM01占空比
PWM0DT = 0; //独立模式下 PWM01占空比 互补 死区时间寄存器 置0为死区时间为0
PWM0EN = 0x0f; //使能PWM0 独立模式 //bit3=0互补 bit3=1 独立 bit2 bit1 分别使能PWM01 PWM00输出
PWM0C = PWM0C | 0x80; //开启PWM中断
PWM0_MAP = 0x04; //映射PWM0到P04
PWM01_MAP = 0x05; //映射PWM01到P05
// PWM1C = 0x02; //关闭PWM0模块中断 分频系统时钟1 bit0-1 分频系数 1 8 32 128
// //PWM1C = PWM1C |0x04; //bit2=1 PWM01反向 bit3=1 PWM0反向
// PWM1P = buf_period1-1; //PWM0模块周期设定
// PWM1D = 100; //独立模式下 PWM0占空比 互补 PWM0 PWM01占空比
// PWM1DT = 0; //独立模式下 PWM01占空比 互补 死区时间寄存器 置0为死区时间为0
// PWM1EN = 0x0f; //使能PWM0 独立模式 //bit3=0互补 bit3=1 独立
// //PWM1C = PWM1C | 0x80; //开启PWM中断
//
// //PWM1_MAP = 0x04; //映射PWM0到P04
// //PWM11_MAP = 0x05; //映射PWM01到P05
//
// PWM2C = 0x03; //关闭PWM0模块中断 分频系统时钟1 bit0-1 分频系数 1 8 32 128
// //PWM2C = PWM2C |0x04; //bit2=1 PWM01反向 bit3=1 PWM0反向
// PWM2P = buf_period2-1; //PWM0模块周期设定
// PWM2D = 100; //独立模式下 PWM0占空比 互补 PWM0 PWM01占空比
// PWM2DT = 0; //独立模式下 PWM01占空比 互补 死区时间寄存器 置0为死区时间为0
// PWM2EN = 0x0f; //使能PWM0 独立模式 //bit3=0互补 bit3=1 独立
// //PWM2C = PWM2C | 0x80; //开启PWM中断
//
// //PWM2_MAP = 0x06; //映射PWM0到P04
// //PWM21_MAP = 0x07; //映射PWM01到P05
}
/**************************************************************************/
/**************************************************************************/
void pwm_8bit_init(void) //1路8位PWM初始化
{ PWM3C = 0x01; //设定PWM3分频系统时钟 bit0-2 1 2 4 8 16 32 64 128
//PWM3C = PWM3C | 0x08; //bit3=1 PWM3反向
PWM3P = buf_period3-1; //PWM3模块周期设定
//PWM3D = 100; //独立模式下 PWM3占空比
PWM3C = PWM3C | 0x80; //打开PWM3
PWM3C = PWM3C | 0x40; //开启PWM3中断
PWM3C = PWM3C & 0xdf; //清PWM3中断标志
//PWM3C = PWM3C | 0x10; //允许PWM3输出
//PWM3_MAP=0x06; //映射PWM3到P06
}
/**************************************************************************/
/**************************************************************************/
void adc_init(void)
{
P0M0 =P0M0&0xf0|ou_sim_input; //设置P00(AD0)为模拟输入口
// P0M1 =P0M1&0x0f|ji_sim_input; //设置P03(AD3)为模拟输入口
// P0M2 =P0M2&0xf0|ou_sim_input; //设置P04(AD4)为模拟输入口
// P0M2 =P0M2&0x0f|ji_sim_input; //设置P05(AD5)为模拟输入口
// P0M3 =P0M3&0xf0|ou_sim_input; //设置P06(AD6)为模拟输入口
// P0M3 =P0M3&0x0f|ji_sim_input; //设置P07(AD7)为模拟输入口
// P2M0 =P2M0&0xf0|ou_sim_input; //设置P20(AD8)为模拟输入口
// P2M0 =P2M0&0x0f|ji_sim_input; //设置P20(AD9)为模拟输入口
ADCC0 =0x80; //开启ADC 选择内部VDD基准电压
ADCC1 =0x00; //禁止内部通道
ADCC2 =0x4D; //ADC时钟16分频 转换结果 高4位 低8位 一次AD转换 20us
delay_1xms(5);
}
/**************************************************************************/
#define bandbuf 38400
/**************************************************************************/
void urat_init(void)
{ //---------------------------------------------
P2M0 = P2M0&0x0F|0x80; //P21设置为推挽输出
P0M1 = P0M1&0x0F|0x20; //P03设置为上拉输入
P21 =1; //TXD输出高电平
TXD_MAP = 0x21; //TXD映射P21
RXD_MAP = 0x03; //RXD映射P03
SCON =0x10; //开启接收
SCON2 =0x02; //工作在方式1 停止位无效
//---------------------------------------------
user16_0=65536-(1000000/bandbuf);
TH4 =user16_0>>8;
TL4=user16_0&0x00ff;
T4CON =0x06; //Time4作为波特率发生器
IE1 =IE1 & 0xfb; //关闭定时器4中断
IE |= 0X10; //使能串口中断
//---------------------------------------------
}
/**************************************************************************/ |