OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 6783|回复: 10

江湖告急!!!在线等!!!内部HSI时钟做系统时钟,原子哥寄存器版本编写的代码,delay.c函数该如何修改?USMART要不要修改

[复制链接]

2

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
125
金钱
125
注册时间
2015-12-23
在线时间
47 小时
发表于 2016-1-12 15:35:28 | 显示全部楼层 |阅读模式
10金钱
      我刚开始接触STM32F103,在正点原子寄存器版本上组织的工程,使用STM32F103R8T6做了一个板子,没有外置8MHz晶振,因此采用内部HSI时钟做系统时钟,无论我怎么修改原子哥的延时函数delay.c里面的内容,延时都不准确,使用逻辑分析仪仿真,延时时间不是偏大就是偏小,搞得我很恼火,实在是没招了。
    现在我只能求救众位大牛给予提示或解决,问题有二:
问题1,基于我的情况,delay.c里面如何修改?越详细越好
问题2,USMART程序代码要不要处理?如何处理?



最佳答案

查看完整内容[请看2#楼]

[mw_shl_code=c,false]//系统内部时钟初始化函数 //pll:选择的倍频数,从2开始,最大值为16 最大64MHz void Stm32_Clock_Init(u8 PLL) { unsigned char temp=0; MYRCC_DeInit(); //复位并配置向量表 RCC->CR|=0x00000001; //内部高速时钟使能HSION while(!(RCC->CR>>1));//等待内部时钟就绪 RCC->CFGR=0X00000400; //APB1=DIV2;APB2=DIV1;AHB=DIV1; PLL-=2;//抵消2个单位 RCC->CFGR|=PLLCR>>25));// ...
哭着过不如笑着活!
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

2170

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
5781
金钱
5781
注册时间
2013-11-22
在线时间
1212 小时
发表于 2016-1-12 15:35:29 | 显示全部楼层
Andy天涯共此时 发表于 2016-1-13 16:13
原子哥,我使用HSI时钟作为系统时钟,最大频率能配置成72MHz(我从多方面获悉,采用HSI时钟作为系统时钟 ...

[mw_shl_code=c,false]//系统内部时钟初始化函数
//pll:选择的倍频数,从2开始,最大值为16                最大64MHz
void Stm32_Clock_Init(u8 PLL)
{
        unsigned char temp=0;   
        MYRCC_DeInit();                  //复位并配置向量表
        RCC->CR|=0x00000001;  //内部高速时钟使能HSION
        while(!(RCC->CR>>1));//等待内部时钟就绪
        RCC->CFGR=0X00000400; //APB1=DIV2;APB2=DIV1;AHB=DIV1;
        PLL-=2;//抵消2个单位
        RCC->CFGR|=PLL<<18;   //设置PLL值 2~16
        RCC->CFGR&=~(1<<16);        //PLLSRC = HSI/2 = 4MHz
        FLASH->ACR|=0x32;          //FLASH 2个延时周期

        RCC->CR|=0x01000000;  //PLLON
        while(!(RCC->CR>>25));//等待PLL锁定
        RCC->CFGR|=0x00000002;//PLL作为系统时钟         
        while(temp!=0x02)     //等待PLL作为系统时钟设置成功
        {   
                temp=RCC->CFGR>>2;
                temp&=0x03;
        }   
}[/mw_shl_code]

如果使用64M系统时钟,Stm32_Clock_Init(16);        //系统时钟设置 内部时钟64MHz        delay初始化和usmart初始化参数改64就可以了   
回复

使用道具 举报

14

主题

82

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
375
金钱
375
注册时间
2014-12-11
在线时间
64 小时
发表于 2016-1-12 17:32:34 | 显示全部楼层
寄存器版本里的两个初始化函数有输入频率的参数,直接delay_init(8)   uart_init(8,115200)不就可以了  8就是8MHz
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2016-1-12 23:12:25 | 显示全部楼层
你先得知道自己的主频是多少.
回复

使用道具 举报

2

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
125
金钱
125
注册时间
2015-12-23
在线时间
47 小时
 楼主| 发表于 2016-1-13 13:48:00 | 显示全部楼层
lujiashun1 发表于 2016-1-12 17:32
寄存器版本里的两个初始化函数有输入频率的参数,直接delay_init(8)   uart_init(8,115200)不就可以了  8就 ...

不是你说的这么简单吧,我从多方面获悉:如果采用内部HSI时钟作为系统时钟,最大频率为64MHz,而采用外部的8MHz的HSE作为系统时钟,最大频率是72MHz,应该要修改时钟初始化
哭着过不如笑着活!
回复

使用道具 举报

2

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
125
金钱
125
注册时间
2015-12-23
在线时间
47 小时
 楼主| 发表于 2016-1-13 16:13:33 | 显示全部楼层
正点原子 发表于 2016-1-12 23:12
你先得知道自己的主频是多少.

原子哥,我使用HSI时钟作为系统时钟,最大频率能配置成72MHz(我从多方面获悉,采用HSI时钟作为系统时钟,最大频率好像是64MHz)的吗?如果能配置成72MHz那就好办了。下面是我修改的系统时钟初始化函数,你看看正确吗?
void Stm32_Clock_Init(u8 PLL)
{
    unsigned char temp=0;   
    MYRCC_DeInit();           //复位并配置向量表
    RCC->CR|=0x00000001;          //内部高速时钟使能HSION
    while(!(RCC->CR>>1));        //等待内部时钟就绪               
    RCC->CFGR=0X00000400; //APB1=DIV2;APB2=DIV1;AHB=DIV1; 设置APB1为2分频,APB2为1分频,AHB为1分频
    PLL-=2;                //抵消2个单位                       
    RCC->CFGR|=PLL<<18;          //设置PLL值 2~16                       
    RCC->CFGR&=~(1<<16);   //HSI经2分频后作为PLL输入时钟                  
    FLASH->ACR|=0x32;           //FLASH 2个延时周期               
    FLASH->ACR:闪存存储器接口寄存器

    RCC->CR|=0x01000000;          //PLLON       
    while(!(RCC->CR>>25));        //等待PLL锁定               
    RCC->CFGR|=0x00000002;        //PLL作为系统时钟                  
    while(temp!=0x02)             //等待PLL作为系统时钟设置成功
    {   
           temp=RCC->CFGR>>2;
           temp&=0x03;
     }
}       
在初始化延时函数中,将SysTick的时钟源改成了:
SysTick->CTRL |= (1<<2);        //SYSTICK使用内部HSI时钟源
fac_us=SYSCLK/8;               
程序其他地方没有修改,在调试跑马灯实验,使用逻辑分析仪获取的时间非常不准确。

原子哥,你帮忙给看看怎么处理?
哭着过不如笑着活!
回复

使用道具 举报

2

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
125
金钱
125
注册时间
2015-12-23
在线时间
47 小时
 楼主| 发表于 2016-1-13 17:58:43 | 显示全部楼层
lycreturn 发表于 2016-1-12 15:35
[mw_shl_code=c,false]//系统内部时钟初始化函数
//pll:选择的倍频数,从2开始,最大值为16                最大64MHz  ...

:handshake大牛,非常感谢你!!!经过你的点拨,困扰我好几天的问题终于解决了。后来经过我多次测试,验证了你的方案是最佳的,在使用内部HSI时钟作为系统时钟时,延时大概有千分之二的误差(一般是偏大点),这正好也诠释了原子哥为什么要在mini板、战舰板外置8M晶振的原因,好多时钟都用到72MHz的频率,内部时钟精度不高等等。
哭着过不如笑着活!
回复

使用道具 举报

14

主题

82

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
375
金钱
375
注册时间
2014-12-11
在线时间
64 小时
发表于 2016-1-19 11:47:56 | 显示全部楼层
你已经说过用HSI做系统时钟了  也就是直接设置SW选择HSI  那就是8MHZ
回复

使用道具 举报

14

主题

82

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
375
金钱
375
注册时间
2014-12-11
在线时间
64 小时
发表于 2016-1-19 11:52:27 | 显示全部楼层
看时钟树   HSI要想经过PLL需要先2分频至4MHz  然后最大倍频16倍至64MHz
回复

使用道具 举报

2

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
125
金钱
125
注册时间
2015-12-23
在线时间
47 小时
 楼主| 发表于 2016-1-19 14:30:38 | 显示全部楼层
lujiashun1 发表于 2016-1-19 11:52
看时钟树   HSI要想经过PLL需要先2分频至4MHz  然后最大倍频16倍至64MHz

懂了,谢谢你,现在是越来越明朗了
哭着过不如笑着活!
回复

使用道具 举报

2

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
125
金钱
125
注册时间
2015-12-23
在线时间
47 小时
 楼主| 发表于 2016-1-25 11:13:22 | 显示全部楼层
正点原子 发表于 2016-1-12 23:12
你先得知道自己的主频是多少.

原子哥,我采用上述2楼的方案设计的代码,单独设计PB0,不论程序中给PB0赋高电平还是低电平,用万用表量着PB0都是高电平怎么回事?是我时钟设置有问题吗?
哭着过不如笑着活!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-21 21:17

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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