打印
[STM32F1]

记得stm32初始化晶振是否起振就是用的软件延时啊!!!!

[复制链接]
1154|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xlsbz|  楼主 | 2014-9-25 22:01 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
难道不怕不准么????
沙发
xlsbz|  楼主 | 2014-9-26 08:16 | 只看该作者
static void SetSysClockTo72(void)
{
  __IO uint32_t StartUpCounter = 0, HSEStatus = 0;
  
  /* SYSCLK, HCLK, PCLK2 and PCLK1 configuration ---------------------------*/   
  /* Enable HSE */   
  RCC->CR |= ((uint32_t)RCC_CR_HSEON);

  /* Wait till HSE is ready and if Time out is reached exit */
  do
  {
    HSEStatus = RCC->CR & RCC_CR_HSERDY;
    StartUpCounter++;  
  } while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT));

使用特权

评论回复
板凳
diweo| | 2014-9-26 08:33 | 只看该作者
晶振早点起振和晚点起振关系应该不大。
另外,这个时候芯片刚刚运行,其他模块都没初始化,都没有工作。中断什么的也都没有。所以不存在打断指令执行的情况。所以软件延时应该还是准的。

使用特权

评论回复
地板
xlsbz|  楼主 | 2014-9-26 08:36 | 只看该作者
diweo 发表于 2014-9-26 08:33
晶振早点起振和晚点起振关系应该不大。
另外,这个时候芯片刚刚运行,其他模块都没初始化,都没有工作。中 ...

我觉得 是 因为延时内部有寄存器语句

HSEStatus = RCC->CR & RCC_CR_HSERDY

所以不能差的太离谱,所以就官方库就用延时了

使用特权

评论回复
5
diweo| | 2014-9-26 08:43 | 只看该作者
xlsbz 发表于 2014-9-26 08:36
我觉得 是 因为延时内部有寄存器语句

HSEStatus = RCC->CR & RCC_CR_HSERDY

可能还有个原因:库要考虑通用性,不能随便用定时器,用掉了万一用户没得用了,或者万一这款芯片有这个定时器,换一款芯片没了。
所以为了简单化和可移植性,就用延时了。

使用特权

评论回复
6
xlsbz|  楼主 | 2014-9-26 08:51 | 只看该作者
diweo 发表于 2014-9-26 08:43
可能还有个原因:库要考虑通用性,不能随便用定时器,用掉了万一用户没得用了,或者万一这款芯片有这个定 ...

所以我想了一个办法
static __IO uint16_t m = 1000;
while (m  > 0) {
     m--;
     然后这里放个没啥用的寄存器代码比如  RCC->CR= RCC->CR;
  
}

另外那个nop指令 ,我查了STM32是有nop的

static __IO uint16_t m = 1000;
while (m  > 0) {
     m--;
     _nop();
  
}

大家发表下看法  

多谢楼上支持

使用特权

评论回复
7
diweo| | 2014-9-26 09:09 | 只看该作者
除非你把中断关了。不然随便中断一下,几个us没了很正常。

使用特权

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

本版积分规则

190

主题

1614

帖子

4

粉丝