- 打卡等级:初来乍到
- 打卡总天数:4
- 最近打卡:2025-06-27 09:09:32
已绑定手机
注册会员
- 积分
- 85
|
我尝试使用代码直接指定工作频率为24Mhz,我做了测试,在isp的时候专门把IRC设为11m,测试发现timer1的时间工作是正常的,确认代码是可以把工作频率改为24Mhz的。但是有一个副作用,就是iap无效。
即P_SW2 =0x80;这里开的到CLKDIV = 0; 发现无法保存iap数据 或者是读取iap数据. 但是直接使用isp指定为24mhz, 注释掉代码设置时钟为24Mhz工作是正常。
请问为什么会这样? 需要更长的时候等时钟稳定吗?还是其它原因?
以下是我的代码:
P3M1=0x03; // 将P3M1寄存器设置为0x00 (二进制 0000 0011)。这通常用于设置P3端口的模式。根据您提供的模式表 (P3M1位, P3M0位):
P3M0=0x0C; // 0000 1100 P3.2 P3.3 推挽输出 (强上拉), P3.0 , P3.1 高阻输入
P5M1=0x0F; // 将P5M1寄存器设置为0x00 (二进制 0000 0000)。这通常用于设置P5端口的模式。根据您提供的模式表 (P5M1位, P5M0位)://(0, 0): 准双向口 (弱上拉)
P5M0=0xF0; //11 0000 -- P5.5 P5.4 推挽输出 (强上拉)
P3=0; // 上电时将P3端口设置为0xF0 (二进制 1111 0000)。
// 这通常用于设置端口的初始电平状态。
// 具体哪些引脚被设置为高电平或低电平取决于微控制器的硬件连接。
P5=0;
//设置时钟为24Mhz
P_SW2 =0x80;
CLKDIV = 0x04;
IRTRIM = T24M_ROMADDR;
VRTRIM = VRT20M_ROMADDR;
IRCBAND = 0x00;
CLKDIV = 0;
//等一下时钟稳定
delay_ms(500);
//从iap读配置
loadConfigFromIap();
Timer1_Init();
//写iap
saveConfigToIap();
其它引有到的代码如下:
void IapIdle()
{
IAP_CONTR = 0; //关闭IAP功能
IAP_CMD = 0; //清除命令寄存器
IAP_TRIG = 0; //清除触发寄存器
IAP_ADDRH = 0x80; //将地址设置到非IAP区域
IAP_ADDRL = 0;
}
char IapRead(int addr)
{
char dat;
IAP_CONTR = 0x80; //使能IAP
IAP_TPS = 24; //设置等待参数12MHz
IAP_CMD = 1; //设置IAP读命令
IAP_ADDRL = addr; //设置IAP低地址
IAP_ADDRH = addr >> 8; //设置IAP高地址
IAP_TRIG = 0x5a; //写触发命令(0x5a)
IAP_TRIG = 0xa5; //写触发命令(0xa5)
NOP();
dat = IAP_DATA; //读IAP数据
IapIdle(); //关闭IAP功能
return dat;
}
void IapProgram(int addr, char dat)
{
IAP_CONTR = 0x80; //使能IAP
IAP_TPS = 24; //设置等待参数12MHz
IAP_CMD = 2; //设置IAP写命令
IAP_ADDRL = addr; //设置IAP低地址
IAP_ADDRH = addr >> 8; //设置IAP高地址
IAP_DATA = dat; //写IAP数据
IAP_TRIG = 0x5a; //写触发命令(0x5a)
IAP_TRIG = 0xa5; //写触发命令(0xa5)
NOP();
IapIdle(); //关闭IAP功能
}
void IapErase(int addr)
{
IAP_CONTR = 0x80; //使能IAP
IAP_TPS = 24; //设置等待参数12MHz
IAP_CMD = 3; //设置IAP擦除命令
IAP_ADDRL = addr; //设置IAP低地址
IAP_ADDRH = addr >> 8; //设置IAP高地址
IAP_TRIG = 0x5a; //写触发命令(0x5a)
IAP_TRIG = 0xa5; //写触发命令(0xa5)
NOP(); //
IapIdle(); //关闭IAP功能
}
// IAP地址定义
#define CONFIG_IAP_ADDR 0x200 // 配置参数的IAP起始地址
// 从IAP读取配置参数
void loadConfigFromIap(void)
{
u8 tmp;
// 读取settings_mix
tmp = IapRead(CONFIG_IAP_ADDR);
settings_mix = (tmp == 0xFF || tmp == 0 || tmp > PARAM_MIX_ENABLE) ? PARAM_MIX_DISABLE : tmp;
}
// 保存配置参数到IAP
void saveConfigToIap(void)
{
// 先擦除IAP区域
IapErase(CONFIG_IAP_ADDR);
// 写入settings_mix
IapProgram(CONFIG_IAP_ADDR, settings_mix);
}
|
|