day06笔记
一、回顾
系统定时器的时钟频率由系统sysclk提供,sysclk时钟的时钟频率由HSE提供
clock tree:由HSE经过PLL的倍频给sysclk ,提供72MHz的时钟频率
分频器prescaler
sysclk--->AHB bus---> APB--->peripheral
官方固件库中对系统定时器 :
1、只有打开没有关闭
2、默认使能了系统定时器的中断
中断---》 打断cpu的执行 ---》startup_stm32f10x_md.s ---> 异常向量表(函数的入口地址)
xxxxx_IRQHandler ----> SysTick_IRQHandler (注意:至此所有的跳转都是硬件上自动完成的, 无需软件上的参与)
---》 timing_delay ---> main.c ---> flag ---> mydelay (ms) --> flag = ms
二 、系统定时器想要即开即用
原因:stm32f系列的开发板, 默认只有打开没有关闭定时器的功能
解决方案:操作系统定时器的三个寄存器
delay.c delay.h
培养自己读代码的能力
读懂delay.c 的代码
实验步骤:
1. copy一份05systick,重命名为06delay
2. 进入到06delay的mylib中, 将delay.c 和delay.h拷贝进来
3. 打开06delay的项目工程
想要的是, 系统定时器打开即开即用
四、位带操作
1、各种类型变量在内存中的位置:
栈:局部变量 函数参数 函数返回值
数据段(全局区、静态区):静态局部变量 全局变量
堆:动态申请变量
未初始化的全局变量在数据段的bss段中分配空间
2、将寄存器上的24位置1,25位清0
*(int *)0xc001c200 |=(1<<24);
*(int *)0xc001c200 &=~(1<<25)
置1就是或等,清0就是与等非
企业中标准做法:
*(volatile int *)0xc001c200 |=(1<<24);
*(volatile int *)0xc001c200 &=~(1<<25);
volatile:cpu每次取变量的值时,不再去缓存中曲奇备份,而是每次都小心翼翼的从内存中取