温度对于GD32F103C8T6芯片的影响

[复制链接]
15172|58
zkcaptain 发表于 2013-10-21 14:42 | 显示全部楼层
本帖最后由 zkcaptain 于 2013-10-21 15:05 编辑

我还有几个问题想问下楼主:
1.楼主是用什么方法得出:GD的i=14;while(i--);大约就是1us,是编译成汇编看的吗?
2.楼主之前用的自减延迟中的i等于多少?
3.系统时钟是多少?72Mhz?还是别的?
还有我觉得DS18B20对时序的要求不会那么严格。。
么么沫沫 发表于 2013-10-21 15:24 | 显示全部楼层
STC测温,MARK
 楼主| miaomiaode 发表于 2013-10-21 15:31 | 显示全部楼层
zkcaptain 发表于 2013-10-21 14:42
我还有几个问题想问下楼主:
1.楼主是用什么方法得出:GD的i=14;while(i--);大约就是1us,是编译成汇编看的 ...

示波器抓的,软件上可能没那么准,对于系统时钟是移植了STM32F103V8T6的程序,是72M,但是奇怪的是一样的i(i值相同)延迟程序,结果STM32延迟比GD32的长,这点我比较郁闷。这个也就个大约延迟,没有那么严格,无需较真
zkcaptain 发表于 2013-10-21 15:54 | 显示全部楼层
本帖最后由 zkcaptain 于 2013-10-21 15:58 编辑
miaomiaode 发表于 2013-10-21 15:31
示波器抓的,软件上可能没那么准,对于系统时钟是移植了STM32F103V8T6的程序,是72M,但是奇怪的是一样的 ...


我只是想帮你找到原因,别介意。

因为GD的MCU读取Flash的速度比ST的要快,这个跟GD的Flash技术有关,论坛也有提到,所以在执行同样的代码情况下,GD的效率会高一些,反映到延迟函数上,就是同样的代码,ST延迟2ms,或许GD就只延迟了1.x ms。

所以我想知道你的延迟都用了多少,或许正因为上面的原因,再加上你的延迟刚好卡在DS18B20的时序节点上,才造成了误码的产生。因此最好你在找到GD的精确延迟时间的基础上,根据DS18B20的时序来设定延迟,保证一定的延迟宽裕度。
 楼主| miaomiaode 发表于 2013-10-21 16:22 | 显示全部楼层
zkcaptain 发表于 2013-10-21 15:54
我只是想帮你找到原因,别介意。

因为GD的MCU读取Flash的速度比ST的要快,这个跟GD的Flash技术有关,论 ...

没关系,现在你这么一说明朗了很多,刚接触不是太懂
精确延迟用systick延迟确实好,就是好比一个RTC中断中调用systick延迟,由于优先级的原因,程序就会死在systick上(这样的问题社区里提的很多,就没没看见解决之道),有机会再想想办法。
zkcaptain 发表于 2013-10-23 15:49 | 显示全部楼层
miaomiaode 发表于 2013-10-21 15:31
示波器抓的,软件上可能没那么准,对于系统时钟是移植了STM32F103V8T6的程序,是72M,但是奇怪的是一样的 ...

这个我又测了一下,也是用示波器,确实延迟不一样,在72Mhz下,

ST的芯片1us执行11.63次i--,也就是i=11.63时,Delay是1us
而GD的芯片1u执行17.85次i--,也就是i=17.85时,Delay是1us
zkcaptain 发表于 2013-10-23 15:59 | 显示全部楼层
本帖最后由 zkcaptain 于 2013-10-23 16:05 编辑
miaomiaode 发表于 2013-10-21 16:22
没关系,现在你这么一说明朗了很多,刚接触不是太懂
精确延迟用systick延迟确实好,就是好比一个RTC中断 ...


这个方法或许能帮到你,systick延迟,相当于查询法,不进入systick中断,优点是不进中断,延迟精确:
void delay_us(u32 nus)
{
u32 temp;
SysTick->LOAD = 9*nus;
SysTick->VAL=0X00;//清空计数器
SysTick->CTRL=0X01;//使能,减到零是无动作,采用外部时钟源
do
{
  temp=SysTick->CTRL;//读取当前倒计数值
}while((temp&0x01)&&(!(temp&(1<<16))));//等待时间到达
     SysTick->CTRL=0x00; //关闭计数器
    SysTick->VAL =0X00; //清空计数器
}
void delay_ms(u16 nms)
{
u32 temp;
SysTick->LOAD = 9000*nms;
SysTick->VAL=0X00;//清空计数器
SysTick->CTRL=0X01;//使能,减到零是无动作,采用外部时钟源
do
{
  temp=SysTick->CTRL;//读取当前倒计数值
}while((temp&0x01)&&(!(temp&(1<<16))));//等待时间到达
    SysTick->CTRL=0x00; //关闭计数器
    SysTick->VAL =0X00; //清空计数器
}
 楼主| miaomiaode 发表于 2013-10-23 17:45 | 显示全部楼层
zkcaptain 发表于 2013-10-23 15:49
这个我又测了一下,也是用示波器,确实延迟不一样,在72Mhz下,

ST的芯片1us执行11.63次i--,也就是i=11 ...

你这个是延迟了10us或是100us这样再整除的结果吗?
我用的程序其中14没法搞成小数形式,什么强制转换都试过了,若你的是小数形式的,可否给下程序?
void delay_us(__IO u16 nTime)
{
        nTime=nTime*14;
        while(--nTime);
}
这个程序可以大概的实现延迟多少us
zkcaptain 发表于 2013-10-23 18:02 | 显示全部楼层
本帖最后由 zkcaptain 于 2013-10-23 18:05 编辑
miaomiaode 发表于 2013-10-23 17:45
你这个是延迟了10us或是100us这样再整除的结果吗?
我用的程序其中14没法搞成小数形式,什么强制转换都试 ...

我的i=500,i--减完500次是28us,500/28us就是17.85,至于小数,100us以下的延迟只能四舍五入了。本来靠这种方法就没法做到那么精确。

有空了试试那个systick不进中断的延迟吧,期待你的实验结果,哈哈
 楼主| miaomiaode 发表于 2013-10-23 20:57 | 显示全部楼层
zkcaptain 发表于 2013-10-23 18:02
我的i=500,i--减完500次是28us,500/28us就是17.85,至于小数,100us以下的延迟只能四舍五入了。本来靠这 ...

程序不错啊!有时间试试,带中断的优先级也已设定好,可以在stm32f103中运行正常,就是在stm32f100系列中无法延迟1us等较短时间,10us的却可以,可能是硬件之类的问题。
 楼主| miaomiaode 发表于 2013-10-24 11:56 | 显示全部楼层
zkcaptain 发表于 2013-10-23 15:59
这个方法或许能帮到你,systick延迟,相当于查询法,不进入systick中断,优点是不进中断,延迟精确:
voi ...

这种查询方式的延迟比较好,避开了中断的方式,程序可以运行
张亚杰 发表于 2013-10-24 17:02 | 显示全部楼层
楼主怎么测试的呢?和官方的给的曲线差了多少呢
 楼主| miaomiaode 发表于 2013-10-24 22:13 | 显示全部楼层
张亚杰 发表于 2013-10-24 17:02
楼主怎么测试的呢?和官方的给的曲线差了多少呢

有数据就行,非专业
黄晨 发表于 2013-10-30 22:29 | 显示全部楼层
不错不错
zhangmangui 发表于 2013-11-26 23:50 | 显示全部楼层
外部晶振  这么牛X
 楼主| miaomiaode 发表于 2013-12-3 10:18 | 显示全部楼层
zhangmangui 发表于 2013-11-26 23:50
外部晶振  这么牛X

用的是外部晶振
huangjia22 发表于 2013-12-22 10:03 | 显示全部楼层
很奇怪啊
luoxiaobing 发表于 2013-12-22 10:11 | 显示全部楼层
高低温测试要花不少钱吧?我都没有钱买设备的
zhouli09 发表于 2013-12-22 12:02 | 显示全部楼层
等级是不是一样的?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 在线客服 返回列表 返回顶部