本帖最后由 yang_alex 于 2020-4-4 09:08 编辑
评估第一件事:首先肯定是点灯啊。赛元的SC95F8617_8616_8615_8613_Demo_Code程序中没有提供点灯示例程序,我们自己写好了。LED闪烁延时肯定不能用简单的空循,太浪费MCU资源了。
Timer定时器中断定时是个好办法。
#include "H/Function_Init.H"
void IO_Init(void);
void Timer_Init(void);
unsigned int T_ms; //定义一个全局变量进行计数,满100mS反转一次。
void main(void)
{
IO_Init();
Timer_Init();
T_ms = 0;
while(1);
}
GPIO初始化程序
/*****************************************************
*函数名称:void IO_Init(void)
*函数功能:IO初始化
*入口参数:void
*出口参数:void
*****************************************************/
void IO_Init(void)
{
P0CON = 0xFF; //设置P0为强推挽模式
P0PH = 0x00;
}
Timer0初始化程序和中断处理程序:
/*****************************************************
*函数名称:void Timer_Init(void)
*函数功能:T0/T1/T2初始化
*入口参数:void
*出口参数:void
*****************************************************/
void Timer_Init(void)
{
TMCON = 0X00; //Timer0选择时钟Fsys/12
//T0设置
TMOD |= 0x01; //0000 0001;Timer0设置工作方式1
TL0 = (65536 - 7192)%256; //时钟为Fsys/12,则溢出时间=7192*(1/Fsys);
TH0 = (65536 - 7192)/256;
TR0 = 0;
ET0 = 1;//定时器0允许
TR0 = 1;//打开定时器0
EA = 1;
}
/**************************************************
*函数名称:void timer0() interrupt 1
*函数功能:定时器中断产生方波
*入口参数:void
*出口参数:void
**************************************************/
void timer0() interrupt 1
{
TL0 = (65536 - 7192)%256;
TH0 = (65536 - 7192)/256;
T_ms ++;
if(T_ms == 100)
{
T_ms = 0;
P02 = ~P02;
}
}
编译、下载、运行、OK!
在学习的过程中发现赛元的另一个功能:Base Timer(BTM)可以把 CPU 从 STOP mode 唤醒,并且产生中断。
拿Base Timer来定时闪烁LED也是个好办法。说干就干:
#include "H/Function_Init.H"
void IO_Init(void);
void BTM_Init(void);
void main(void)
{
IO_Init();
BTM_Init();
while(1)
{
}
}
GPIO初始化程序
/*****************************************************
*函数名称:void IO_Init(void)
*函数功能:IO初始化
*入口参数:void
*出口参数:void
*****************************************************/
void IO_Init(void)
{
P0CON = 0xFF; //设置P0为强推挽模式
P0PH = 0x00;
}
BTM初始化程序和中断处理程序:
/*****************************************************
*函数名称:void BTM_Init(void)
*函数功能:BTM初始化
*入口参数:void
*出口参数:void
*****************************************************/
void BTM_Init(void)
{
BTMCON = 0x84; //每0.25s产生一个中断
EA = 1; //开启总中断
IE1 |= 0x04; //开启BTM中断
}
/*****************************************************
*函数名称:void BTM_Int(void) interrupt 9
*函数功能:中断函数
*入口参数:void
*出口参数:void
*****************************************************/
void BTM_Int(void) interrupt 9
{
if(!(BTMCON&0X40)) //中断标志位判断
{
P02 = ~P02;
}
}
运行的效果和使用定时器定时一样,这里就不上图了。用BTM的方便之处在于代码简单, 可以让CPU进入 STOP mode,然后定时从 STOP mode中把CPU唤醒,并且产生中断,执行完中断程序可以再次进入STOP mode。适用于低功耗应用。
这里说几个建立新项目后设置容易出错的地方。
1、项目设置的标签组的“Output”标签下面,“Debug Information”和“ Create HEX File ”必须选择。前者不选的话,不会生成调试信息,后续无法调试。后者不选的话,不会生成目标烧录文件,没法下载烧录。
2、项目设置的标签组的“Debug”标签下面,“SinOne Chip Debug Driver”和“ Run to main ”必须选择。前者不选的话,没有对应的仿真器驱动,没法仿真调试。后者不选的话,调试时不是从你写的C语言代码开始调试。
3、项目设置的标签组的“utilities”标签下面,“Use Target Driver for Flash Programming”和“ Use Debug Driver ”必须选择。
不选的话,没有对应的仿真器驱动,没法仿真调试。下载按钮或者下载菜单是灰色的,没法选择。
或者
4、3中的“Use Target Driver for Flash Programming”选择后,还要选择“Settings”进行下一步设置。有时候虽然 “Use Target Driver for Flash Programming”前面的选择圆点选中了,但下面的显示框中仍然是空的。这样在下载时,会出现下面的错误:
选择“Settings”进行下一步设置后,会出项芯片的下载选项:
“芯片选择”要选对,要和你开发板上器件型号一致,这个不对的话,就是之前错误提示中“IC型号选择错误”的来源。
另外,从这个标签可以看到赛元MCU的烧录熔丝。对应你的需求去进行设置。
WDT: 要不要使能MCU内部的看门狗
External 32K: 要不要使用外部的32KHz的晶体-----------赛元MCU内部有±4%精度低频 32kHz 振荡器
System clock: 系统时钟要不要进行分频。赛元MCU内部有±2%高精度高频 32/16/8/4MHz 振荡器
P52: P52当作正常IO引脚还是当作外部复位引脚
LVR: 电压低于多少MCU进行复位
Vref: MCU内部参考电压来源
lAP Range: IAP程序地址空间
DISJTG: 是否禁止JTAG调试口。可以进行加密,不过我没敢试,万一芯片锁了,就没法继续玩了。
从上面看,赛元的MCU硬件还是相当不错的。当然,还有很多很好的MCU硬件,后面慢慢说。
|