12
返回列表 发新帖
楼主: 小白2010

[已解决] 请教(已解决)

[复制链接]

该用户从未签到

4

主题

26

帖子

0

注册会员

Rank: 2

积分
53
最后登录
1970-1-1
 楼主| 发表于 2014-1-2 16:33:25 | 显示全部楼层

回复:请教

回复第 10 楼 于2014-01-02 16:09:45发表:
回复第 9 楼 于2014-01-02 15:48:19发表:
回复第 8 楼 于2014-01-02 15:35:14发表:
回复第 7 楼 于2014-01-02 15:17:50发表:
非常感谢,看了文件,cw设置好这个频率值通过编程器烧写到芯片的NVM”地址“永久保存,这个“地址”是编程器默认的或者是可以自定义的?
 

编译器默认就会烧到trim对应的地址上去
 

基本上知道是怎么回事啦,不明白的是其他芯片在datasheet里都指定了这个地址,而这个片子却要依靠编程器显示才能知道,是不是说明书有误还是啥原因?
 

你可以在代码里设置trim寄存器的值来设置trim.
文件里提供的方法是CW特有的feature, 让用户可以在下载的过程中能够用这种简单的方法设置trim
 
 

trim寄存器就是ICS_C3和ICS_C4(1位)了吧,总共是9BIT,最大值是512,如果直接进行赋值频率值显然容量太小(频率30多K),如果是周期,好像也不行(小数点没办法)。。cw处理器专家是这么搞的:
    ICS_C3 = *(uint8_t*)0xFF6FU;       /* Initialize ICS_C3 register from a non volatile memory */
    ICS_C4 = (uint8_t)((*(uint8_t*)0xFF6EU) & (uint8_t)0x01U);
疑问1:您所说的在代码里直接给trim赋值,到底是什么值。
疑问2:这个0xFF6F为啥说明书里不指明,而在编程序的时候又用得着。
谢谢,别被我问烦了,我的名字叫小白,哈哈
 
回复 支持 反对

使用道具 举报

该用户从未签到

0

主题

7

帖子

0

新手上路

Rank: 1

积分
12
最后登录
1970-1-1
发表于 2014-1-3 00:40:27 | 显示全部楼层

回复:请教

各种芯片datasheet资料上搜IC数据手册看中文版吧,不仅datasheet是中文的,还可以用中文关键字搜索datasheet内容,适合中国电子工程师
回复 支持 反对

使用道具 举报

该用户从未签到

0

主题

218

帖子

0

中级会员

Rank: 3Rank: 3

积分
472
最后登录
1970-1-1
发表于 2014-1-3 11:42:16 | 显示全部楼层

回复:请教

回复第 11 楼 于2014-01-02 16:33:25发表:
回复第 10 楼 于2014-01-02 16:09:45发表:
回复第 9 楼 于2014-01-02 15:48:19发表:
回复第 8 楼 于2014-01-02 15:35:14发表:
回复第 7 楼 于2014-01-02 15:17:50发表:
非常感谢,看了文件,cw设置好这个频率值通过编程器烧写到芯片的NVM”地址“永久保存,这个“地址”是编程器默认的或者是可以自定义的?
 

编译器默认就会烧到trim对应的地址上去
 

基本上知道是怎么回事啦,不明白的是其他芯片在datasheet里都指定了这个地址,而这个片子却要依靠编程器显示才能知道,是不是说明书有误还是啥原因?
 

你可以在代码里设置trim寄存器的值来设置trim.
文件里提供的方法是CW特有的feature, 让用户可以在下载的过程中能够用这种简单的方法设置trim
 
 

trim寄存器就是ICS_C3和ICS_C4(1位)了吧,总共是9BIT,最大值是512,如果直接进行赋值频率值显然容量太小(频率30多K),如果是周期,好像也不行(小数点没办法)。。cw处理器专家是这么搞的:
    ICS_C3 = *(uint8_t*)0xFF6FU;       /* Initialize ICS_C3 register from a non volatile memory */
    ICS_C4 = (uint8_t)((*(uint8_t*)0xFF6EU) & (uint8_t)0x01U);
疑问1:您所说的在代码里直接给trim赋值,到底是什么值。
疑问2:这个0xFF6F为啥说明书里不指明,而在编程序的时候又用得着。
谢谢,别被我问烦了,我的名字叫小白,哈哈
 
 

我不是专门搞8bit MCU的,只是看了你的问题很感兴趣,找了9S08PA8的Reference Manual 和Data Sheet 看了下,如你所说,出厂时,trim值会烧写在flash中,而这个地址对用户是不可见的,Manual 上说是 "in a factory reserved memory location"。 其实在我所接触过的MCU中,这个地址对于用户都是不可知的,复位初始化时,这个值会拷入到ICS_C3 和 ICS_C4中,这个是MCU自己做的,不需要用户操作。

你看到的代码:
 
    ICS_C3 = *(uint8_t*)0xFF6FU;       /* Initialize ICS_C3 register from a non volatile memory */
    ICS_C4 = (uint8_t)((*(uint8_t*)0xFF6EU) & (uint8_t)0x01U);
这个地址不是上面所说的出厂时的'reserved memory location', 这是我的理解,因为对照memory map来看,这个地址就是个普通的flash地址,客户可以随意访问的。而且0xFF6F和0xFF6E,是用户自己在PE里面设置的,用户可以设置为其它地址。还有一个原因,这个拷贝是客户的application 去做的,并不是MCU复位自动作的。

trim.png

下面这段是从Reference Manual 拷贝的,基本可以解释清楚:

All MCU devices are factory programmed with a trim value in a factory reserved
memory location. This value is uploaded to the ICS_C3 register and ICS_C4 register
during any reset initialization. For finer precision, trim the internal oscillator in the
application and set the ICS_C4[SCFTRIM] bit accordingly.
我没怎么接触过8bit 的MCU, 上面仅仅是我刚才浏览manual的理解,希望大家共同讨论,特别是8bit的专家给出宝贵指导

 
回复 支持 反对

使用道具 举报

该用户从未签到

4

主题

26

帖子

0

注册会员

Rank: 2

积分
53
最后登录
1970-1-1
 楼主| 发表于 2014-1-3 13:56:51 | 显示全部楼层

回复:请教

回复第 13 楼 于2014-01-03 11:42:16发表:
回复第 11 楼 于2014-01-02 16:33:25发表:
回复第 10 楼 于2014-01-02 16:09:45发表:
回复第 9 楼 于2014-01-02 15:48:19发表:
回复第 8 楼 于2014-01-02 15:35:14发表:
回复第 7 楼 于2014-01-02 15:17:50发表:
非常感谢,看了文件,cw设置好这个频率值通过编程器烧写到芯片的NVM”地址“永久保存,这个“地址”是编程器默认的或者是可以自定义的?
 

编译器默认就会烧到trim对应的地址上去
 

基本上知道是怎么回事啦,不明白的是其他芯片在datasheet里都指定了这个地址,而这个片子却要依靠编程器显示才能知道,是不是说明书有误还是啥原因?
 

你可以在代码里设置trim寄存器的值来设置trim.
文件里提供的方法是CW特有的feature, 让用户可以在下载的过程中能够用这种简单的方法设置trim
 
 

trim寄存器就是ICS_C3和ICS_C4(1位)了吧,总共是9BIT,最大值是512,如果直接进行赋值频率值显然容量太小(频率30多K),如果是周期,好像也不行(小数点没办法)。。cw处理器专家是这么搞的:
    ICS_C3 = *(uint8_t*)0xFF6FU;       /* Initialize ICS_C3 register from a non volatile memory */
    ICS_C4 = (uint8_t)((*(uint8_t*)0xFF6EU) & (uint8_t)0x01U);
疑问1:您所说的在代码里直接给trim赋值,到底是什么值。
疑问2:这个0xFF6F为啥说明书里不指明,而在编程序的时候又用得着。
谢谢,别被我问烦了,我的名字叫小白,哈哈
 
 

我不是专门搞8bit MCU的,只是看了你的问题很感兴趣,找了9S08PA8的Reference Manual 和Data Sheet 看了下,如你所说,出厂时,trim值会烧写在flash中,而这个地址对用户是不可见的,Manual 上说是 "in a factory reserved memory location"。 其实在我所接触过的MCU中,这个地址对于用户都是不可知的,复位初始化时,这个值会拷入到ICS_C3 和 ICS_C4中,这个是MCU自己做的,不需要用户操作。

你看到的代码:
 
    ICS_C3 = *(uint8_t*)0xFF6FU;       /* Initialize ICS_C3 register from a non volatile memory */
    ICS_C4 = (uint8_t)((*(uint8_t*)0xFF6EU) & (uint8_t)0x01U);
这个地址不是上面所说的出厂时的'reserved memory location', 这是我的理解,因为对照memory map来看,这个地址就是个普通的flash地址,客户可以随意访问的。而且0xFF6F和0xFF6E,是用户自己在PE里面设置的,用户可以设置为其它地址。还有一个原因,这个拷贝是客户的application 去做的,并不是MCU复位自动作的。



下面这段是从Reference Manual 拷贝的,基本可以解释清楚:

All MCU devices are factory programmed with a trim value in a factory reserved
memory location. This value is uploaded to the ICS_C3 register and ICS_C4 register
during any reset initialization. For finer precision, trim the internal oscillator in the
application and set the ICS_C4[SCFTRIM] bit accordingly.
我没怎么接触过8bit 的MCU, 上面仅仅是我刚才浏览manual的理解,希望大家共同讨论,特别是8bit的专家给出宝贵指导

 
 

感谢回复!我觉得你说的有道理,PE生成的那个地址0xFF6FU可以由用户指定,也可以CW自动生成。某些系列的单片机是指定这个地址的。这款为啥不指定我搞不清楚。
很多其他品牌的单片机内部RC都是标称值8M,校准是由工厂搞定的,用户不必参与。但是HCS08系列内部RC不是标称值,而是一个可调范围,范围是多少不知道,手册里只是说ICS能接受31.25 kHz to 39.0625 kHz这个频率范围。初次上电的时候芯片可以在默认态正常工作,但不知道时钟是多少。
用户想得到准确的时钟就必须重新设定,并自己定一个FLASH地址把调整值存起来,然后初始化的时候COPY到C3,C4 里去(这时候,C3寄存器中的工厂设定值被替换了)。
 
 
 
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条

Archiver|手机版|小黑屋|恩智浦技术社区

GMT+8, 2025-7-18 21:40 , Processed in 0.090255 second(s), 24 queries , MemCache On.

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.

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