[资源共享] 板子收到了,对这两天使用心得和代码。

[复制链接]
297|1
 楼主 | 2018-3-6 18:10 | 显示全部楼层 |阅读模式
开发板前天收到,首先非常感谢芯圣。
对于时钟,芯圣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;                                                        //使能串口中断
        //---------------------------------------------
}
/**************************************************************************/
| 2018-3-19 12:59 | 显示全部楼层
芯圣003的PWM是12位的
扫描二维码,随时随地手机跟帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复

您需要登录后才可以回帖
登录 | 注册
高级模式
我要创建版块 申请成为版主

论坛热帖

快速回复 返回顶部 返回列表