stm32f103rct6使用内部晶振作为时钟源
创始人
2025-06-01 16:59:51
0

目录

  • 1.void SystemInit(void)
  • 2.FLASH
  • 3.宏定义
  • 4.查看
  • 5.延时
  • 6.最终结果
  • 7.精准延时尝试(失败)

stm32f103rct6(库函数版例程)使用内部晶振8M,倍频64M

参考
https://blog.csdn.net/oHuanCheng/article/details/105112884
http://www.openedv.com/forum.php?mod=viewthread&tid=286233
https://blog.csdn.net/ll148305879/article/details/106138302

1.void SystemInit(void)

修改system_stm32f10x.c文件中的void SystemInit(void)函数

void SystemInit(void)  //mychange
{  /* Enable Prefetch Buffer */FLASH->ACR |= FLASH_ACR_PRFTBE;/* Flash 2 wait state */FLASH->ACR &= (uint32_t)((uint32_t)~FLASH_ACR_LATENCY);FLASH->ACR |= (uint32_t)FLASH_ACR_LATENCY_2;RCC_DeInit(); //set RCC to initializationRCC_HSICmd(ENABLE);//Enable HSI  while(RCC_GetFlagStatus(RCC_FLAG_HSIRDY) == RESET);//wait HSI enable//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);// Set PLL clock source and frequency doubling coefficientRCC_PLLConfig(RCC_PLLSource_HSI_Div2, RCC_PLLMul_16);//4*16=64M  RCC_PLLMul_9 36MRCC_PLLCmd(ENABLE);// Waiting for the specified RCC flag bit settings to succeed // and waiting for the PLL initialization to succeedwhile(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);//  Setting PLL as System Clock SourceRCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);//Waiting for PLL to be successfully used as clock source for system clock//  0x00:HSI //  0x04:HSE//  0x08:PLLwhile(RCC_GetSYSCLKSource() != 0x08);
} 

2.FLASH

内部时钟用到了FLASH,需要添加stm32f10x_flash.c
在这里插入图片描述

3.宏定义

将宏定义注释
system_stm32f10x.c
在这里插入图片描述

4.查看

配置后的时钟频率
main.c

int main(void)
{RCC_ClocksTypeDef  RCC_Clocks; //初始化时钟频率结构体RCC_GetClocksFreq(&RCC_Clocks); //获取各个时钟频率while(1){printf("SYSCLK_Frequency %d \r\n",RCC_Clocks.SYSCLK_Frequency);//串口输出主频delay_ms(1000);//延迟1s} 
}

5.延时

设置延时函数
参考https://blog.csdn.net/sky_Buddha/article/details/106093426
delay.c中

void delay_us(u32 nus)
{u16 i=0;  while(nus--){i=7;  while(i--) ;    }
}
void delay_ms(u16 nms)
{u16 i=0;  while(nms--){i=7000;  while(i--) ;    }}

6.最终结果

(虽然这样时间不是很准,但都使用内部晶振了,谁会在意精度呢?)
在这里插入图片描述

7.精准延时尝试(失败)

没来得及看的参考链接https://blog.csdn.net/qq_20222919/article/details/103820476
精准延时的一些尝试,但是失败。参考https://blog.csdn.net/coderdd/article/details/97612514

失败的尝试如下:
直接操作寄存器,查看手册说明:
SysTick->CTRL&=0xfffffffb;这一句把 SysTick 的时钟选择外部时钟,这里需要注意的是:
SysTick 的时钟源自 HCLK 的 8 分频,假设我们外部晶振为 8M,然后倍频到 72M,那么 SysTick
的时钟即为 9Mhz,也就是 SysTick 的计数器 VAL 每减 1,就代表时间过了 1/9us。所以fac_us应该就是72M/8000000=9。

fac_us=SystemCoreClock/8000000;				//ΪϵͳʱÖÓµÄ1/8  

在这里插入图片描述

//延时 nus
//nus 为要延时的 us 数. 
void delay_us(u32 nus)
{
u32 temp;
SysTick->LOAD=nus*fac_us; //时间加载 
SysTick->VAL=0x00; //清空计数器
SysTick->CTRL=0x01 ; //开始倒数
do
{
temp=SysTick->CTRL;
}while((temp&0x01)&&!(temp&(1<<16)));//等待时间到达 
SysTick->CTRL=0x00; //关闭计数器
SysTick->VAL =0X00; //清空计数器
}
//延时 nms
//注意 nms 的范围
//SysTick->LOAD 为 24 位寄存器,所以,最大延时为:
//nms<=0xffffff*8*1000/SYSCLK
//SYSCLK 单位为 Hz,nms 单位为 ms
//对 72M 条件下,nms<=1864 
void delay_ms(u16 nms)
{ 
u32 temp; 
SysTick->LOAD=(u32)nms*fac_ms;//时间加载(SysTick->LOAD 为 24bit)
SysTick->VAL =0x00; //清空计数器
SysTick->CTRL=0x01 ; //开始倒数 
do
{
temp=SysTick->CTRL;
}while((temp&0x01)&&!(temp&(1<<16)));//等待时间到达 
SysTick->CTRL=0x00; //关闭计数器
SysTick->VAL =0X00; //清空计数器 
}

虽然没找到内核时钟是多少,但应该是8M,就是 SysTick 的计数器 VAL 每减 1,就代表时间过了 1/8us,所以fac_us=8。
使用内核时钟,即
SysTick->CTRL=0x05 ; //开始倒数 0000 0101
SysTick->CTRL=0x04; //关闭计数器0000 0100
在这里插入图片描述

//延时 nus
//nus 为要延时的 us 数. 
void delay_us(u32 nus)
{
u32 temp;
SysTick->LOAD=nus*8; //时间加载 
SysTick->VAL=0x00; //清空计数器
SysTick->CTRL=0x05 ; //开始倒数
do
{
temp=SysTick->CTRL;
}while((temp&0x01)&&!(temp&(1<<16)));//等待时间到达 
SysTick->CTRL=0x04; //关闭计数器
SysTick->VAL =0X00; //清空计数器
}
//延时 nms
//注意 nms 的范围
//SysTick->LOAD 为 24 位寄存器,所以,最大延时为:
//nms<=0xffffff*8*1000/SYSCLK
//SYSCLK 单位为 Hz,nms 单位为 ms
//对 72M 条件下,nms<=1864 
void delay_ms(u16 nms)
{ 
u32 temp; 
SysTick->LOAD=(u32)nms*8000;//时间加载(SysTick->LOAD 为 24bit)
SysTick->VAL =0x00; //清空计数器
SysTick->CTRL=0x05 ; //开始倒数 
do
{
temp=SysTick->CTRL;
}while((temp&0x01)&&!(temp&(1<<16)));//等待时间到达 
SysTick->CTRL=0x04; //关闭计数器
SysTick->VAL =0X00; //清空计数器 
}

但是,还是失败了,不知道问题出在哪,有大神知道的可以在评论区指导一下!!!

相关内容

热门资讯

最新或2023(历届)关于国庆...   小朋友们,我愿我的祝福是小溪,悄悄地流淌在朋友的心上,绵绵不绝;我愿我的关怀是枫叶,轻轻地摇着秋...
最新或2023(历届)关于国庆...   小朋友们大家早上好啊,大家知道为什么要把十月一号定位国庆节呢,并不是中华人民共和国是在这一天建立...
最新或2023(历届)十一国庆...   大家早上好啊,也许在我们每个人的嘴上不是经常说着自己的祖国,可是我相信在我们的心中祖国永远都是很...
最新或2023(历届)最好的国...   每一阵清风细雨,都会让我将你轻轻想起;每一条祝福,都会将我们的心靠得更近;恰逢国庆之际,借此送上...
最新或2023(历届)关于国庆...   国庆节就是一个国家的节日。我们国家的国庆节是哪一天小朋友们知道吗?是农历的十月一日哦,大家会有很...
最新或2023(历届)最好的国...   小朋友们早上好啊,大家觉得在国庆的时候必不可少的是什么,当然是升国旗了,国庆节的时候都会在现在我...
最新或2023(历届)小学生国...   从1949年的中华人民共和国成立到现在,中华人民共和国已经走过了65年的风风雨雨,经过改革开放三...
最新或2023(历届)十一国庆...   国庆节是每个国家的重要节日,但是每个国家的叫法各有不同,有的国家叫国庆节或者是国庆日,还有一些国...
最新或2023(历届)关于国庆...   看到飞舞的五星红旗,大家知道五星红旗是谁设计的吗?是曾联松先生,他的设计稿从全国设计稿中脱颖而出...
最新或2023(历届)十一国庆...   大家早上啊,以前在国际上要是有人说自己是中国人,迎来的肯定是嘲讽和讽刺,但是现在你可以勇敢和骄傲...
关于五一放假的通知公告 杭州中... 劳作创造了前史,劳作创造了将来。下面小编为你精心收拾了几篇五一放假的告诉,期待阅览!  五一放假的告...
关于最新或2023(历届)五一... 五一劳作节即将来临,它是全国际劳作人民一起具有的节日,下面小编为你精心收拾了几篇五一放假的告诉,期待...
最新或2023(历届)学校5.... 中国人民庆祝劳动节的活动可追溯至1918 年。下面小编为你精心整理了几篇五一放假的告诉,欢迎阅览! ...
物业五一放假有通知吗 物业放假... 物业公司五一放假吗?下面小编为你精心整理了几篇五一放假的告诉,期待阅览!  五一放假的告诉【一】  ...
最新或2023(历届)国际劳动...  五一劳作节即将来临,它是全世界劳作人民一起具有的节日,下面小编为你精心收拾了几篇五一放假的告诉,期...
今年怎么写五一放假的通知公告 ...  五一要来了,如何写好一份放假告诉?下面小编为你精心整理了几篇五一放假的告诉,欢迎阅览!  五一放假...
最新或2023(历届)学校五一... 如何写好一份放假告诉?下面小编为你精心整理了几篇五一放假的告诉,期待阅览!  五一放假的告诉【一】 ...
最新或2023(历届)五四青年...  青年节放假告诉一  依照国务院发布的《全国年节及纪念日放假方法》的规则,“青年节(5月4日),14...
关于最新或2023(历届)五四... 五四青年节源于我国1919年反帝爱国的“五四运动”,以下是芒果教育网小编网罗的青年节放假告诉,期待参...
关于青年节学校安排放假通知 五...  青年节放假告诉一  各单位:  依据国务院《全国年节及纪念日放假方法》精力,现就五四青年节放假组织...