day05笔记
一、内容回顾吧
1、GPIO的固件库函数:
GPIO_Init
GPIO_Delint 复位
GPIO_Setbits
GPIO_Resetbits
GPPIO_ReadInputDatabits
引用:& 解引用:*
2、会用一函数的:功能 参数 返回值
man 3 c库函数
man 2 系统调用
man 1 命令
二、定时器
延时分两种:
粗略延时:用for while 可实现
精确延时:通过定时器实现
在STM32中有很多种定时器资源:
24_downcounter 2*wdg 4*16bits 定时器RTC
定时器可以分为两类:普通定时器和特殊定时器(wdg RTC)
watch dog 看门狗除了提供计时功能外,还提供了让系统重启复位的功能
看门狗可以帮助程序监测硬件的一场状态,可以监测软件有没有跑飞
RTC real time clock 实时时钟
无论是普通定时器还是特殊定时器,决定定时时长的因素有两个:
时钟频率 计数值
1s=1000ms=1000000us=1000000000ns
三、系统定时器
24-downcounter指代系统定时器(systimer|systick)
系统时钟不是由ST提供,而是由ARM core提供的
1、STM32F103RBT6提供了几种基础时钟源
五种
HSI:系统内部高速时钟 8MHz(internal)(high)
HSE:系统外部高速时钟 (external) (low)
LSI:系统内部低速时钟
LSE:系统外部低速时钟 提供基础的时钟频率
PLL:倍频器 乘法器 起到放大频率的作用
osc 晶振
2、系统时钟的时钟源由哪个基础时钟源提供时钟频率:HSE
HSI:基础时钟频率是8MHz,经过PLL的倍频可以达到72MHz
PLL:时钟源本身并不提供基础时钟频率
HSE:基础时钟频率是 4~16MHz,经过PLL的倍频可以达到72MHz
因为系统内部的晶振频率往往不稳定,所以系统时钟sysclk的基础时钟频率由HSE提供!
将来开发板上的所有外设的时钟频率,都是由SYSCLK经过AHB的分频,在经过APB进一步分频得到
3、系统定时器的寄存器(32中所以寄存器都是32位的)
a、系统定时器一共有四个
CSR:控制及状态寄存器 0xe000e01c
[0]位: 0/1 禁止/使能计数器
[1]位: 0/1 不/上报中断信号给CPU (计数值减小到0的时候)
[2]位: 0/1 选择HSE/HSI做为时钟源
[16]位: 1/0 当计数器的计数值减到/没减到 0
RVR:重装载值寄存器
保存重装载值, 当CVR被使能且计数值减小到0时, 将重装值放入到当前值寄存器中
[23:0] 0X000000 ~ 0xFFFFFF
CVR:当前值寄存器
当前值寄存器, 保存的是当前值, 一直做递减
写操作会影响CSR bit16 ---> 0
CALL:校准寄存器
b、哪几个寄存器决定计数值范围
RVR:重装载值寄存器
CVR:当前值寄存器
c、系统定时器的定时范围:0~2^24-1(即0~16M-1)
字节对齐:
4字节对齐
struct node{
char data;
int a;
double b;
short c;
};
struct node node1;
node ---> sizeof (node1) ----> 20
struct Node{
char data;
short c;
int a;
double b;
};
Node ---> 16
4. 系统定时器的固件库
打开《STM32RBT6\DataSheet\STM32\STM32固件库使用手册(中文版).pdf》
注意:STM32的官方固件库存在两个短板:
a) 官方固件库默认开启了系统定时器的中断 (无需再去读CSR 的bit16)
b) 官方固件库对系统定时器只有打开没有关闭, 没有达到即开即用
实验步骤:
1. copy 一份04button的代码, 重命名为05systick
2. 进入到05systick的project中, 打开项目工程
3. 双击fwlib, 将固件库中的misc.c 添加到fwlib中 (misc.c 是和arm core相关的)
9000
9000000hz
每隔1ms给cpu报一次系统定时器中断
中断信号一到来, 会打断cpu的执行, cpu要跳转到某个位置去执行
在startup_stm32f10x_md.s中,维护了一张异常向量表,保存了各个中断的入口
总结:
由于stm32f10x官方固件对系统定时器的中断默认使能了, 而且只有打开
每隔一段时间, 系统定时器就会给cpu上报中断信号
cpu一旦接收到中断信号, 就会打断cpu的执行, cpu跳转到异常向量表中去执行
到systick_IRQHandler 中执行
设定的systick的时钟频率是9MHz, 设定的计数值是9000 故, 每隔1ms,systick就会上报一次中断给cpu