本次实验用到嵌入式仿真教学实验平台:嵌入式仿真实验教学平台
SysTick简介
SysTick属于CM3 内核中的一个外设,内嵌在NVIC中,是一个24bit的向下递减的计数器,计数器每计数一次的时间为1/SYSCLK。
一般我们设置系统时钟SYSCLK等于72M,当重装载数值寄存器的值递减到 0 的时候,系统定时器就产生一次中断,以此循环往复。
因为SysTick 是属于CM3 内核的外设,所以所有基于CM3 内核的单片机都具有这个系统定时器,使得软件在CM3 单片机中可以很容易的移植。
系统定时器一般用于操作系统,用于产生时基,维持操作系统的心跳。
使用到的关键函数(标准库版本)
1.SysTick_Config()
(它会根据传入的参数设置 SysTick 的重载值(RELOAD 寄存器),当 SysTick 定时器从重载值递减到 0 时,就会触发一次 SysTick 中断,同时自动重装数值继续计数。)
中断周期的计算公式 = 重载值 / 系统核心时钟频率(SystemCoreClock)
函数原型为:
static __INLINE uint32_t SysTick_Config(uint32_t ticks)
{
if (ticks > SysTick_LOAD_RELOAD_Msk) return (1); /* Reload value impossible */
SysTick->LOAD = (ticks & SysTick_LOAD_RELOAD_Msk) – 1; /* 设置重装载寄存器的值 */
NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) – 1); /* 设置 Cortex-M0 内核的系统中断设置优先级 */
SysTick->VAL = 0; /* 加载 SysTick 计数器数值 */
SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk |
SysTick_CTRL_TICKINT_Msk |
SysTick_CTRL_ENABLE_Msk; /* 启动滴答定时器中断及滴答定时器*/
return (0); /* Function successful */
}
2.SysTick_Handler() 滴答定时器的中断服务函数
我们要实现的LED翻转功能就编写在这个函数当中。
准备工作就绪 我们开始 原神 启动!
模拟电路如图 我们的目的是使用滴答定时器实现 LED灯的重复点亮 熄灭 开始编写代码

主函数代码如下:
#include "sys.h"
#include "stm32f10x_conf.h"
#include "delay.h"
#include "led.h"
#include "system_stm32f10x.h"
int main(void)
{
SysTick_Config(SystemCoreClock/10);/*根据公式计算 滴答定时器
进入中断周期的时间为 100ms*/
LED_Init();
while(1)
{
}
}
void SysTick_Handler(void)
{
LED = !LED;//LED电平翻转
}
led.c以及.h代码如下
#include "stm32f10x.h"
#include "led.h"
// 初始化 PA12 用于控制 LED
void LED_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_SetBits(GPIOA,GPIO_Pin_12);
}
#ifndef __LED_H
#define __LED_H
#include "stm32f10x.h"
// LED 输出宏定义
#define LED PAout(12) // PA12
// 初始化 PA12 用于控制 LED
void LED_Init(void);
#endif
编译 运行 现象如图

网硕互联帮助中心





评论前必须登录!
注册