8m晶振怎么写延时函数( 二 )


delay_100us();
delay_100us();
delay_100us();
delay_100us();
delay_100us();
}
void delay_ms(uint ms )
{
while(ms--)
delay_1ms();//8MHZ主频时,25分钟误差小于1秒
}
4.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中断 。
5.单片机不同晶振怎么计算延迟时间一般来说要是通过延时函数来得到一个精准的延时时间(比如你说的1us、2us)是让正常人无法忍受的工作量,你可以点击编辑环境中的放大镜图标,在左边会弹出显示栏,sys下sec就是延时时间(要通过设置断点),你可以改变函数中变量值大概地调出需要的时间(希望你不要固执地去尝试调出你要的时间,因为这会让你享受到一天都不止的漫长调试“乐趣”中) 。
晶振频率不同自然在相同参数的情况下得出延时时间不同 。另外如果你确实需要得到一个比较精准的延时时间,建议你采用定时/计数器,至于怎么用这玩意儿,很简单!不到十分钟就能学会的事儿!这里就不提供教程了,用你调试的时间去学它会让你更有成就感 。
写了那么多,希望能帮助点什么 。
6.求教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级延时void delay_1ms(void) { delay_100us(); delay_100us(); delay_100us(); delay_100us(); delay_100us(); delay_100us(); delay_100us(); delay_100us(); delay_100us(); delay_100us(); }void delay_ms(uint ms ){ while(ms--) delay_1ms();//8MHZ主频时,25分钟误差小于1秒} 。
7.8MHZ的晶振定时10us该怎么写,C语言你是想用定时器中断还是软件定时(相当于延时)
定时器中断: