stm32的内部时钟在哪儿配置

stm32的内部时钟在哪儿配置,第1张

首先在主程序中注释掉SystemInit();

然后使用下面的函数做为系统时钟的初始化函数

void RCC_Configuration(void)

{

RCC_DeInit();//将外设 RCC寄存器重设为缺省值

RCC_HSICmd(ENABLE);//使能HSI

while(RCC_GetFlagStatus(RCC_FLAG_HSIRDY) == RESET);//等待HSI使能成功

//FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);

//FLASH_SetLatency(FLASH_Latency_2);

RCC_HCLKConfig(RCC_SYSCLK_Div1);

RCC_PCLK1Config(RCC_HCLK_Div2);

RCC_PCLK2Config(RCC_HCLK_Div1);

//设置 PLL 时钟源及倍频系数

RCC_PLLConfig(RCC_PLLSource_HSI_Div2, RCC_PLLMul_2);//使能或者失能 PLL,这个参数可以取:ENABLE或者DISABLE

RCC_PLLCmd(ENABLE);//如果PLL被用于系统时钟,那么它不能被失能

//等待指定的 RCC 标志位设置成功 等待PLL初始化成功

while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);

//设置系统时钟(SYSCLK) 设置PLL为系统时钟源

RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);//选择想要的系统时钟

//等待PLL成功用作于系统时钟的时钟源

//  0x00:HSI 作为系统时钟

//  0x04:HSE作为系统时钟

//  0x08:PLL作为系统时钟

while(RCC_GetSYSCLKSource() != 0x08);//需与被选择的系统时钟对应起来,RCC_SYSCLKSource_PLL

}

void RCC_Configuration(void)

{

   RCC_DeInit();//将外设 RCC寄存器重设为缺省值

   RCC_HSICmd(ENABLE);//使能HSI  

   while(RCC_GetFlagStatus(RCC_FLAG_HSIRDY) == RESET);//等待HSI使能成功

   //FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);

   //FLASH_SetLatency(FLASH_Latency_2);

 

   RCC_HCLKConfig(RCC_SYSCLK_Div1);  

   RCC_PCLK1Config(RCC_HCLK_Div2);

   RCC_PCLK2Config(RCC_HCLK_Div1);

   

   //设置 PLL 时钟源及倍频系数

   RCC_PLLConfig(RCC_PLLSource_HSI_Div2, RCC_PLLMul_2);//使能或者失能 PLL,这个参数可以取:ENABLE或者DISABLE

   RCC_PLLCmd(ENABLE);//如果PLL被用于系统时钟,那么它不能被失能

   //等待指定的 RCC 标志位设置成功 等待PLL初始化成功

   while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);

   //设置系统时钟(SYSCLK) 设置PLL为系统时钟源

   RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);//选择想要的系统时钟

   //等待PLL成功用作于系统时钟的时钟源

   //  0x00:HSI 作为系统时钟

   //  0x04:HSE作为系统时钟

   //  0x08:PLL作为系统时钟  

   while(RCC_GetSYSCLKSource() != 0x08);//需与被选择的系统时钟对应起来,RCC_SYSCLKSource_PLL

}

补充一点:

由图可以看出系统时钟的供给可以有3种方式,HSI,HSE,PLL。如果选用内部时钟作为系统时钟,其倍频达不到72Mhz,最多也就8Mhz/216 = 64Mhz。

在你的main函数初始化的最后,进入大循环之前,添加如下语句:

RCC->CFGR &= ~0x00000003;//系统时钟清0

RCC->CFGR |= 0x00000001 ;//00:HSI 01:HSE 10:PLL,最低两位00内部RC,01外部晶振,是没有倍频的

几个方面:

1、最大的问题是循环体里面的 pause(01),尤其是里面那一层循环。

2、很多赋值语句后面应该加分号,避免显示。

3、数组预置(对于这段代码而言不是很重要)。

里面那层的pause是在这样的循环结构中:

for k=1:10;

    i=i+1;

    for x=2:z-1;

        for y=2:z-1;

粗略估算一下,会执行101818次,每次01秒,仅这一句就会耗时324秒。

删除上述pasue之后,在我的电脑上运行大约需要27秒。

有多处赋值语句的尾部没有使用分号,导致数组在命令窗口中回显,这也会占用很多时间。那些语句就不一一列举了,修改后的代码如下:

clear all;clc;

z=20;i=0;

a=cat(3,rand(z),rand(z),zeros(z));

b=a(:,:,1);%HSI

c=a(:,:,2);%生物量

imh=image(cat(3,c,zeros(z),zeros(z)));%先生成一个图像

for k=1:10;

    i=i+1;

    for x=2:z-1;

        for y=2:z-1;

            d{x,y}=[b(x-1,y-1),b(x-1,y),b(x-1,y+1);

                b(x,y-1),b(x,y),b(x,y+1);

                b(x+1,y-1),b(x+1,y),b(x+1,y+1)];%表示周围8个HSI

            e{x,y}=[c(x-1,y-1),c(x-1,y),c(x-1,y+1);

                c(x,y-1),1,c(x,y+1);

                c(x+1,y-1),c(x+1,y),c(x+1,y+1)];%表示周围8个生物量 

            while c(x,y)>0&&min(min(e{x,y}))<1&&min(min(d{x,y}))~=0&&c(x,y)~=0%如果当前位置(x,y)生物量大于0,并且

                %该位置周围8个网格生物量有小于环境容纳量,

                %并且,周围8个网格最小适宜度值不等于0

                %并且,当前位置生物量不等于0的情况

                [m,n]=find(d{x,y}==max(max(d{x,y})));%获取周围8个网格最大的HSI,确定迁移方向

                if isequal([m,n],[x,y])%如果目标单元是当前位置,即m,n和x,y相等

                    c(m,n)=c(x,y);%那么生物量不迁移

                    set(imh,'cdata',cat(3,c,zeros(z),zeros(z)));

                    break

                else

                    if c(m,n)<1%判定目标单元生物量是否饱和,若不饱和

                        c(m,n)=c(m,n)+c(x,y);%目标单元生物量等于已有+迁移的(x,y)的生物量

                        if c(m,n)>1

                            c(m,n)=1;

                        end

                        c(x,y)=1-c(m,n);

                        if c(x,y)>=0

                            c(x,y)=0;%迁移过后命令该点生物量等于零

                            set(imh,'cdata',cat(3,c,zeros(z),zeros(z)));

                            break 

                        else 

                            c(x,y)=c(m,n)-1;

                        end

                    else

                        d{x,y}(m,n)=0;%若饱和了,重新选择方向,命令目标单元HSI=0重新选择方向

                    end

                end

            end

              % pause(01)

        end

    end

    set(imh,'cdata',cat(3,c,zeros(z),zeros(z)));

    pause(01)

end

i

这样修改之后,在我的电脑上运行至需要大约13秒。如果再把最后的一个pause删掉,则仅需大约03秒。

%读图像

img=imread('D:\我的文档\桌面\10096009_0762641JPG');

subplot(121),imshow(img);

%将RGB分量转换成HSI,具体见:>

以上就是关于stm32的内部时钟在哪儿配置全部的内容,包括:stm32的内部时钟在哪儿配置、如何降低stm32核心时钟频率、matlab 运行下面这个程序需要好长时间,怎么优化等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9856772.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-02
下一篇 2023-05-02

发表评论

登录后才能评论

评论列表(0条)

保存