打印
[牛人杂谈]

如何改变N76E003的频率HIRC,以用于更准确的UART传输?

[复制链接]
2594|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
643757107|  楼主 | 2018-3-22 21:27 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

N76E003的HIRC频率为16 MHz,常温下偏差在1%以内。当用于38400以上baud rate的UART传输时,会因为16 MHz无法除频出38400 Hz的频率,造成baud rate偏差过大,无法稳定传输。

此时用户可以更改HIRC的频率到16.588 MHz,就能产生精准的baud rate。

  • 更改HIRC频率的步骤如下:
    1. Trim value = RCTRIM0(HIRCTRIM[8:1]) + RCTRIM1(HIRCTRIM[0])

    将Trim value–15可以调整HIRC的频率为16.6 MHz。

    2. 将计算值写回RCTRIM0 和RCTRIM1,写入后HIRC的更改会立即生效。

    3. 每次上电后HIRC会恢复成16 MHz,使用者需要通过写SFR来更改HIRC。

    4. 按照16.588 MHz重新计算baud rate,再设定timer产生的baud rate就能符合标准baud rate。



沙发
643757107|  楼主 | 2018-3-22 21:27 | 只看该作者
例程序如下:
sfr RCTRIM0 = 0x84;

sfr RCTRIM1 = 0x85;

bit BIT_TMP;



#define set_IAPEN  BIT_TMP = EA; EA=0; TA=0xAA; TA=0x55; CHPCON |= SET_BIT0; EA= BIT_TMP

#define set_IAPGO  BIT_TMP = EA; EA = 0; TA = 0xAA; TA = 0x55; IAPTRG |= SET_BIT0; EA = BIT_TMP

#define clr_IAPEN  BIT_TMP = EA; EA = 0; TA = 0xAA; TA = 0x55; CHPCON &= ~SET_BIT0; EA=BIT_TMP



unsigned char hircmap0,hircmap1;

unsigned int trimvalue16bit;



void MODIFY_HIRC_VLAUE(void)

{

    set_IAPEN;

    IAPAL = 0x30;

    IAPAH = 0x00;

    IAPCN = READ_UID;

    set_IAPGO;

    hircmap0 = IAPFD;

    IAPAL = 0x31;

    IAPAH = 0x00;

    set_IAPGO;

    hircmap1 = IAPFD;

    clr_IAPEN;

    trimvalue16bit = ((hircmap0<<1)+(hircmap1&0x01));

    trimvalue16bit = trimvalue16bit - 15;

    hircmap1 = trimvalue16bit&0x01;

    hircmap0 = trimvalue16bit>>1;

    TA=0XAA;

    TA=0X55;

    RCTRIM0 = hircmap0;

    TA=0XAA;

    TA=0X55;

    RCTRIM1 = hircmap1;

使用特权

评论回复
板凳
jiekou001| | 2018-3-25 16:35 | 只看该作者
这个频率用默认的就好,这个芯片不支持无源晶振。

使用特权

评论回复
地板
电子95| | 2018-8-15 20:17 | 只看该作者
试一下

使用特权

评论回复
5
lacha| | 2018-9-7 16:18 | 只看该作者
不错,值得试下

使用特权

评论回复
6
平凡的小鸟99| | 2018-9-21 16:16 | 只看该作者
这段代码放哪里啊?

使用特权

评论回复
7
平凡的小鸟99| | 2018-9-21 16:16 | 只看该作者
放在初始化哪里吗?

使用特权

评论回复
8
andygesy| | 2018-9-25 00:35 | 只看该作者
楼主,请确认代码是否完整?如果运行代码后,频率还是16M,有没有什么原因?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

199

主题

3697

帖子

11

粉丝