3.1stm32f407时钟专解,时钟配置,systick使用

为什么配置时钟?因为时钟配置可以提升芯片的运行效率.

  1. 常见振荡器

RC,LC,晶体振荡器

<1>RC振荡器

电阻电容组成,所以成本低,容易受环境影响.

使用区间:刚开机准备加载外部时钟时,外部时钟出错时,临时使用

<2>石英晶体振荡器

较高精度振荡器,所以成本较高

使用区间:通信系统中用于频率发生器,为数据产生时钟信号和为特定系统提供基准信号

  1. Stm32时钟源

<1>HSI:高速内部时钟,RC振荡器,频率为16MHz;

使用区间:上述RC

<2>HSE:高速外部时钟,可接石英/陶瓷谐振器,或者接外部时钟源,频率范围为4MHz~26MHz,我们开发板是25MHz

使用区间:上述晶体

<3>LSI:低速内部时钟,RC 振荡器,频率为 32kHz 左右。供独立看门狗和自动唤醒单元使用。

使用区间:特殊外设,看门狗

<4>LSE:低速外部时钟,接频率为 32.768kHz 的石英晶体。这个主要是 RTC 的时钟源

使用区间:高精度时钟源

  1. stm32时钟树分析

实验一:中断配置实验

  1. 要求:分别观察HSI(初始高速内部时钟),HSE(自己设置高速外部时钟)对程序运行速度的影响
  2. 配置

2.1 Rcc->HSI设置为Crystal/Ceramic Res onator(晶振)

2.2 下图为时钟设置界面步骤(点HSE-->/25-->*336-->/2-->点PLLCLK-->APB1为/4-->APB2为/2)

时钟设置,这样设置时程序的频率正好达到最高,程序运行速度最快

实验二. systick定时器使用(串口一秒发送一个数据)

1.cubemx创建文件

(1)RCC设置外部晶振

 (2)RCC时钟配置

(3)串口配置

2.步骤:
(1)print函数重写

int fputc(int ch, FILE *p)

{

while(!(USART1->SR&(1<<7)));

USART1->DR=ch;

return ch;

}

 (2)找到systick的回调函数,重写中断函数(一千次中断printf一次)

void HAL_SYSTICK_Callback(void)
{
	static uint32_t i = 0;
	if(i<1000){
		i++;
	}else{
		i=0;
		printf("one miao\n");
	}
}

(3)结果:间断1秒左右print一次

3.补充,寻找systick回调函数

(1)startup...xx.s中寻找systick中断函数

 (2)找到中断函数

 (3)找到回调函数

实验三:systick仿写Hal_delay()函数

1.cubemx创建工程(同上)

2.代码

void HAL_Delay(uint32_t Delay)
 
{
 
uint32_t temp;
 
SysTick->LOAD = Delay * 4000;
 
SysTick->VAL=0X00;//清空计数器
 
SysTick->CTRL=0X01;//使能,减到零是无动作,采用外部时钟源
 
do
 
{
 
  temp=SysTick->CTRL;//读取当前倒计数值
 
}while((temp&0x01)&&(!(temp&(1<<16))));//等待时间到达
 
     SysTick->CTRL=0x00; //关闭计数器
 
    SysTick->VAL =0X00; //清空计数器
 
}    
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值