一、实验目的
- 了解CPU中断(Interrupt Request)的过程,了解嵌套向量中断控制器NVIC的结构和功能
- 了解SysTick定时器(系统滴答定时器)的结构和功能,使用SysTick寄存器计时
二、实验过程
1.编写SysTick_Delay_250Ms函数,用来精准计时0.25s
a) 设置计数器变量i
b) 调用SysTick_Config函数,配置reload寄存器的初始值,配置中断优先级为1<<4-1 = 15,优先级为最低,配置counter计数器的值,配置systick的时钟为72M,使能中断,使能systick
c) 使用for循环语句进行计时,当计数器的值减小到0的时候,CRTL寄存器的位16会置1,当置1时,读取该位会清0
d) 关闭SysTick定时器
2.主函数
a) 设置短鸣计数器变量i=4
b) 调用LED_GPIO_Config函数,初始化LED端口配置
c) 调用SysTick_Init函数,配置SysTick为10μs中断一次
d) 调用BEEP_GPIO_Config函数,初始化蜂鸣器端口配置
e) 使用for循环语句,使蜂鸣器短鸣0.25s,同时红色LED灯亮起,间隔1s后重复以上操作,共4次,然后蜂鸣器长鸣1s,同时红色LED灯亮起,间隔1s后重复e)步所有过程
3.查看实验录像音频,发现计时准确
三、附录
#include "stm32f10x.h"
#include "bsp_led.h"
#include "bsp_SysTick.h"
#include "bsp_beep.h"
void SysTick_Delay_250Ms(void)
{
uint32_t i;
SysTick_Config(SystemCoreClock/1000);
for(i=0;i<250;i++)
{
// 当计数器的值减小到0的时候,CRTL寄存器的位16会置1
// 当置1时,读取该位会清0
while( !((SysTick->CTRL)&(1<<16)) );
}
// 关闭SysTick定时器
SysTick->CTRL &=~ SysTick_CTRL_ENABLE_Msk;
}
int main()
{
/* 计数4次 */
unsigned int i=4;
/* LED 端口初始化 */
LED_GPIO_Config();
/* 配置SysTick 为10us中断一次 */
SysTick_Init();
/* 蜂鸣器端口初始化 */
BEEP_GPIO_Config();
while(1){
for(;i>0;i--)
{
BEEP(BEEPON);
LED1(ON);
SysTick_Delay_250Ms();
BEEP(BEEPOFF);
LED1(OFF);
SysTick_Delay_Ms(1000);
}
BEEP(BEEPON);
LED1(ON);
SysTick_Delay_Ms(1000);
BEEP(BEEPOFF);
LED1(OFF);
i=4;
SysTick_Delay_Ms(1000);
}
}