前言
百度链接:
链接: https://pan.baidu.com/s/1M_UwCi4RASzla_WUi-JhSA?pwd=enyd
提取码: enyd
资料可自行搜索官网免费下载
我这边主要用它做pwm/adc相关的产品研发
新建工程:
1/安装环境:请在资料包中找到该文件:开发环境破解版本HI-TECH PICC9.83进行安装
2/环境使用说明:TICE99IDE_SV11编辑器使用说明
3/安装好后,
(1)设置语言:
(2)新建工程:file->New->Project(文件->新建->工程)
(3)选择对应芯片,右侧会有相应描述,我选择的是既可以C编辑,也可以汇编的。工程名不能超过36字节;工程路径名中不能有 含有空格的文件名。其他默认直接确定即可。
(4)接下来复制几个文件到工程文件夹中(资料包中找到例程文件:固件例程TM56M1522_STDIOKIT_v_0_0_6);随意点进去一个文件把红框里的文件复制到新建工程文件夹中。
tenx_TM56M1522.h:所有寄存器的库函数文件
TM56M1522_sfr_config.h:寄存器名的宏参
TM56M1522_bsp.c:延时函数/时钟初始化函数
TM56M1522_bsp.h:函数申明头文件
TM56M1522_OT.h:一些参数名称简化定义
(5)主函数中 将头文件:tenx_TM56M1522.h,TM56M1522_bsp.h包含进去即可
(6)点击下面图标进行工程设置(工程-->工程设置)
选择好路径后,点击Add添加,然后‘OK’。还有个头文件路径在新建工程文件中
主板供电:我选的3V
找到这个文件就设置完成了
*(7)接下来就可以根据自己的需求编写程序了;(可以在固件例程文件中找程序进行模仿:TM56M1522_STDIOKIT_v_0_0_6)
注:(针对TM56M1522,其他的请仔细阅读芯片规格书)主函数里面需要设置
//main function
void main(void)
{
RDCTL |= 0x03; // 程序 ROM 的读信号延迟控制;
//用户必须将该寄存器切换到“8ns”,
//以提高最低工作电压的性能
while(1)
{
}
}
①系统时钟配置
//-------------------------------------------------
//系统时钟使用内部RC16MHz快速时钟
//div:系统分频00:8分频 01:4分频 02:2分频 03:1分频
//-------------------------------------------------
void Sys_Init(unsigned char div )
{
FASTSTP=0; //启动快时钟
asm("nop");
asm("nop");
asm("nop");
CPUCKS=1; //切换到快时钟
asm("nop");
CPUPSC = div;//系统时钟分频
asm("nop");
}
②GPIO初始化
//------------------------------------------------
//GPIO初始化PB5 CMOS输出模式
//------------------------------------------------
void GPIO_Init(void)
{
PA0MOD = 2; //PA0 推挽输出
PAD0 = 0;//输出di
}
③PWM
/**********************************************************************************************************
**函数名称:pwm_init()
**函数描述:pwm设置
**输入 :①周期:r_g_b_prd ②占空比:duty
**输出 :None
**
**PWM时钟=16M;
**PWM周期= r_g_b_prd;
**PWM占空比= duty;
**PWM输出频率=16 MHz / (周期+1) = 16 MHz / 32768 = 488 Hz
**PWM输出占空比 = 占空比 / (周期+1) = 50%
**********************************************************************************************************/
void pwm_init(unsigned int r_g_b_prd, unsigned int duty)
{
PA4MOD = 7; //PA4 PWM0P
PAD4 = 1;//输出高
PWMIE = 0; //关闭PWM中断
PWMCKS = 2; //PWM clock source :FIRC:16Mhz
PWM0OM = 0; //PWM输出模式选择0
PWM0DZ = 0; //没有非重叠
PWMEN = 1; //PWM0~5 disable enable
PWMPRDL = r_g_b_prd & 0xff; // PWMPRDL 周期低字节
PWMPRDH = r_g_b_prd >> 8; // PWMPRDH 周期高字节
PWM0DL = duty & 0XFF; // PWM4DL占空比低字节
PWM0DH = duty >> 8; // PWM4DH
}
④ADC
/****************************************************************
**ADC模式初始化(12bit)
[CPU 运行在快速模式 , Fsys = FIRC 16 MHz ]
ADC 时钟频率 = 1 MHz,
ADC 通道 = ADC1 (PA1)
ADC 参考电压vcc
****************************************************************/
void IO_ADC1_PA1_Init(void)
{
ADCIE = 0; //关闭ADC中断
ADCKS = 4; //Fsys/16分频,ADC时钟要<=1Mhz
ADVREFS = 0;//参考电压vcc
PA1MOD = 3; //IO口模拟输入模式
}
//------------------------------------------------
// 获取ADC数据 ,返回读取到的数据 (12bit)
/*
00000: ADC0 (PA0) 01000: ADC8 (PB1)
00001: ADC1 (PA1) 01001: ADC9 (PB2)
00010: ADC2 (PA2) 01010: ADC10 (PB4)
00011: ADC3 (PA3) 01011: ADC11 (PB5)
00100: ADC4 (PA4) 01100: ADC12 (PB6)
00101: ADC5 (PA5) 01110: VBG
00110: ADC6 (PA6) 10111: 1/4 VCC
00111: ADC7 (PB0) others: 保留
*/
//------------------------------------------------
unsigned int Get_ADC(unsigned char ch )
{
unsigned int dat=0;
unsigned char temp =0;
ADCHS = ch; //通道选择
ADST = 1; //启动ADC
while( ADST ); //等待ADC转换完成
dat = ADCDH; //ADC 输出数据位 11~4
temp = ADCTL>>4;//ADC 输出数据位 3~0
dat <<= 4;
dat |= temp;
return dat;
}
⑤比较器
/**********************************************************************************************************
**函数名称:isr_rec
**函数描述:中断处理函数
**输入 :无
**输出 :无
**********************************************************************************************************/
void interrupt isr_rec (void)
{
if(CMPIF)
{
CMPIF = 0;
LED1 = ~LED1; // 1S 变换一次状态
}
}
/**********************************************************************************************************
**函数名称:CMP_init
**函数描述:比较器初始化函数 :PA1>DAC时,CMPOX=1
**输入 :无
**输出 :无
**********************************************************************************************************/
void CMP_init()
{
PA0MOD = 2;//LED0--PA0 设置为CMOS
PAD0 = 1;//输出高
PA1MOD = 3;//PAD1设置为模式3-->C1P1;
PAD1 = 1;
SVRF = 0;//DAC参考电压选择VCC
SVL = 100;//100/128 * 参考电压 = 100/128 * VCC
SCIP = 0;//比较器 CMPP 外部输入为 CIP1 (PA1)
/*这里仿真时必须打开*/
//CMPPNS = (CMPPNS&~CMPPNS_OPOF_MASK) | 1<<CMPPNS_OPOF_POS;//TM56F1552仿真需设置这个bit位。比较器 CMPP 源为外部引脚 (CIPx)
SCMPN = 1;//1:比较器 CMPN 源为 DAC 输出; 0: 比较器 CMPN 源为外部引脚 (CINx)
//SCIN = 0; //000:比较器 CMPN 外部输入为 CIN1 (PA3)
CMPDBS = 1;//比较器原始输出 (CMPOX) 去抖时间:4 Fsys
CMPTRIG = 1;//比较器中断触发模式:下降沿
PDCMP = 0;//启用比较器和 DAC
//CMPOE = 1;//比较器输出 (CMPO) 信号输出到 PA5; PA5MOD 应设置为 xx10b
CMPIF = 0 ;//清除比较器中断标志
CMPIE = 1;//比较器中断启用
}
⑥定时器
#define LED1 PAD0
unsigned char t100us_cnt = 0;
unsigned char t4ms_cnt = 0;
/**********************************************************************************************************
**函数名称:isr_rec
**函数描述:中断处理函数
**输入 :无
**输出 :无
**********************************************************************************************************/
void interrupt isr_rec (void)
{
if(TM0IE && TM0IF)//定时器0 自动重装
{
INTIF = 0b11101111; //clear Timer0 Interrupt flag
t100us_cnt++;
// 100US ++
if (t100us_cnt >= 39)
{
t100us_cnt = 0;
t4ms_cnt++;
if (t4ms_cnt >= 249) // 1S
{
t4ms_cnt = 0;
LED1 = ~LED1; // 1S 变换一次状态
}
}
}
}
//TM0 interrupt interval cycle time = Fsys / 2 / TM0PSC / (256-TM0RLD)
/**********************************************************************************************************
**函数名称:timer0_init(),默认tm0的时钟源为 Fsys / 2
**函数描述:timer0初始化函数
**输入 :无
**输出 :无
**********************************************************************************************************/
void timer0_init()
{
TM0PSC = 3; //8分频
TM0RLD = TM0 = 156;// 1 / 16MHZ * 2 * 8 * 100 = 100US
TM0STP = 0;//tm0运行
TM0IE = 1;//使能tm0
PA0MOD=2;//LED1 CMOS推挽输出
PAD0 = 1;//输出高
}
其中有问题的仔细阅读芯片参考手册,还是很仔细的。
⑧编译下载仿真
编辑 器左下角框内显示编译下载结果