8m晶振怎么写延时函数

1.stm32外部晶振由8m换成12m系统延时函数如何更改下面我们就通过简单的三个步骤就可以让你随意的使用4—16MHz之内任何频点的晶振,我们以STM32F10x_StdPeriph_Lib_V3.4.0为例说明 。第一步,打开stm32f10x.h,将
#define HSE_VALUE ((uint32_t)8000000) 修改为:
#define HSE_VALUE ((uint32_t)12000000)
第二步,打开system_stm32f10x.c,修改PLL参数,将
RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLMULL));
RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSE | RCC_CFGR_PLLMULL9); 修改为:
RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLMULL));
RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSE | RCC_CFGR_PLLMULL6); 至此,原文件已经修改完成,如果你想将主频修改至其他频率,请自行修改 。但是,到现在,如果您直接编译调试的话,就会出现上文所说的USART的波特率不正确,Systick走时不准等问题,原因就是我们需要进行第三部的修改,这个修改不是在原文件中,而是在编译环境中 。我们已Keil MDK为例说明 。
第三步,打开你已经建立的STM32工程,选择Projects-〉Options for target ***,找到Target标签,你会发现,外接的晶振默认还是8MHz,我们将外接的晶振参数修改为12MHz,确定保存,再编译,调试,你就会发现,所有的参数都回归的正常轨道,设置波特率为9600,它也不会跑到14400,设置Systick为1ms中断,它不会1.5ms中断 。
2.24M晶振怎么用DELAY函数延时#include
#define uchar unsigned char #define uint unsigned int //延时子程序 void mDelay(uchar Delay) { uchar i; for(;Delay>0;Delay--) { for(i=0;i } } void main() { uchar i,d; P0 = 0; //所以LED点亮 。
mDelay(250);//延时250mS(12M晶振)
mDelay(250);//延时250mS(12M晶振)
while(1) { d = 0x01; for(i=0;i { P0 = ~d; //数据取反 。
d//左移一位 mDelay(200);//延时200mS(12M晶振) } } }
#include
#define uchar unsigned char
#define uint unsigned int //延时子程序 void mDelay(uchar Delay)
{ uchar i; for(;Delay>0;Delay--)
{ for(i=0;i } } void main() { uchar i,d; P0 = 0; //所以LED点亮 。
mDelay(250);//延时250mS(12M晶振)
mDelay(250);//延时250mS(12M晶振)
while(1) { d = 0x01; for(i=0;i { P0 = ~d; //数据取反 。
d//左移一位 mDelay(200);//延时200mS(12M晶振) } } }
3.求教ATmega128在8M内部晶振下ms和us的精确延时子程序//us级延时
void delay_1us(void) //1us延时函数,不能连续调用,
{
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
}
void delay_3us(void) //3us延时函数,,可重复调用不影响精度
{
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
}
void delay_10us(void) //10us延时函数,可重复调用不影响精度
{
delay_3us();
delay_3us();
delay_3us();
}
void delay_50us(void) //48us延时函数,可重复调用不影响精度
{
delay_10us();
delay_10us();
delay_10us();
delay_10us();
delay_10us();
}
void delay_100us(void)//exactly 98us延时函数,可重复调用不影响精度
{
delay_50us();
delay_50us();
delay_3us();
}
//ms级延时
【8m晶振怎么写延时函数】void delay_1ms(void)
{
delay_100us();
delay_100us();
delay_100us();
delay_100us();
delay_100us();