stm32f407 初始时钟是多少?怎么改

stm32f407 初始时钟是多少?怎么改,第1张

unsigned char SysClockSet(unsigned char OSC, unsigned char Clock)

用于设置MCU的时钟,两个参数,前一个(OSC)用于选择内部晶振还是外部晶振,这能是HSE或者HSI,这个在H文件中有定义;

第二个参数 Clock,范围0~25,对应不同的主频,具体值看程序里面switch语句部分就明白了;

然后要说一点,HSE_VALUE 和 HSI_VALUE是外部和内部晶振的频率,这个值在 stm32f4xx.h 里面有定义的,如果是你自己做的板子,那么就需要根据你所采用的晶振数值到stm32f4xx.h里面把 HSE_VALUE 修改一下即可;

SysClockGet(void)函数用来获取当前MCU主频,返回值的单位是Hz;

再PS:用此程序,可以动态的调整MCU主频,就是在MCU运行中,根据实际工作量的多少升降主频,我试过,蛮好使的,而且可以超频,216MHz没有问题,240MHz要看芯片体质,有些可以长时间运行,260MHz,更要看体质了,反正我的芯片是真呢过跑个几分钟,然后就死机了。

这个是与编程思想有关,你按键用的消抖方式是延时消抖,不是用状态机的编程方式,所以会如此

参考一下电路及代码

#include<reg51.h>

#include<INTRINS.H>

#define Key_State_0 0

#define Key_State_1 1

#define Key_State_2 2

#define unlock 0

#define lock   1

#define Init_DATA 999

unsigned char key1_state

bit key1_debounce_flag

bit key1_debounce

sbit Key_1 = P1^0

sbit seg1  = P1^7

sbit seg2  = P1^6

sbit seg3  = P1^5

sbit seg4  = P1^4

unsigned char time_1ms_flag,display_flag

unsigned int  add_data

unsigned char key1_debounce_C

unsigned char code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}

void MCU_init(void)

{

TMOD = 0x01

TH0  = 0xFC

TL0  = 0x18

EA   = 1

ET0  = 1

TR0  = 1

add_data = Init_DATA

}

void MCU_clock(void)

{

if(time_1ms_flag==1)

{

time_1ms_flag = 0

display_flag++

if(display_flag == 4)

{

display_flag = 0

}

if(key1_debounce_flag==unlock)

{

key1_debounce_C++

if(key1_debounce_C==20)

{

key1_debounce_C = 0

key1_debounce_flag = lock

key1_debounce = 1

}

}

}

}

void display(void)

{

switch(display_flag)

{

case 0:

seg4 = 0

P2=table[add_data/1000]

seg1 = 1

break

case 1:

seg1 = 0

P2=table[add_data%1000/100]

seg2 = 1

break

case 2:

seg2 = 0

P2=table[add_data%100/10]

seg3 = 1

break

case 3:

seg3 = 0

P2=table[add_data%10]

seg4 = 1

break

}

}

void Key_1_Scan (void)

{

bit key_press

key_press = Key_1

switch(key1_state)

{

case Key_State_0:

if(!key_press)

{

key1_state = Key_State_1

key1_debounce_flag = unlock

}

break

case Key_State_1:

if(key1_debounce==1)

{

key1_debounce = 0

if(!key_press)

{

key1_state = Key_State_2

}

else

{

key1_state = Key_State_0

}

}

break

case Key_State_2:

if(key_press)

{

key1_state = Key_State_0

add_data++

if(add_data==10000)

{

add_data = 0

}

}

break

}

}

void main (void)

{

MCU_init()

while (1)

{

MCU_clock()

Key_1_Scan()

display()

}

}

void Timer0Interrupt(void) interrupt 1

{

TH0 = 0xFC

TL0 = 0x18

time_1ms_flag = 1

}


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

原文地址:https://www.54852.com/tougao/11299328.html

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

发表评论

登录后才能评论

评论列表(0条)

    保存