STM32系统定时器闪烁LED灯
SysTick寄存器介绍
SysTick寄存器总汇
寄存器名称 | 寄存器描述 |
---|---|
CTRL | SysTick控制及状态寄存器 |
LOAD | SysTick重装载数值寄存器 |
VAL | SysTick当前数值寄存器 |
CALIB | SysTick校准数值寄存器 |
①SysTick控制及状态寄存器
位段 | 名称 | 类型 | 复位值 | 描述 |
---|---|---|---|---|
16 | COUNTFLAG | R/W | 0 | 如果在上次读取本寄存器后,SysTick已经计到了0,则该位为1 |
2 | CLKSOURCE | R/W | 0 | 时钟源选择位,0=AHB/8,1=处理器时钟AHB |
1 | TICKINT | R/W | 0 | 1:SysTick倒数计数到0时产生SysTick异常请求,0:计数到0时无动作 |
0 | ENABLE | R/W | 0 | SysTick定时器的使能位 |
②SystTick重装载数值寄存器
位段 | 名称 | 类型 | 复位值 | 描述 |
---|---|---|---|---|
23:0 | RELOAD | R/W | 0 | 当倒数计数至0时,将被重装载的值 |
③SysTick当前数值寄存器
位段 | 名称 | 类型 | 复位值 | 描述 |
---|---|---|---|---|
23:0 | CURRENT | R/W | 0 | 读取时返回当前倒数计数的值,写它则使之清零,同时还会清除在SysTick控制及状态寄存器中的COUNTFLAG标志 |
SysTick定时实验
编程要点
1)设置重装载寄存器的值。
2)清除当前数值寄存器的值。
3)配置控制与状态寄存器。
bsp_led.c文件
#include "./led/bsp_led.h" void LED_GPIO_Config(void)
{ GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd( LED1_GPIO_CLK | LED2_GPIO_CLK | LED3_GPIO_CLK, ENABLE);GPIO_InitStructure.GPIO_Pin = LED1_GPIO_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(LED1_GPIO_PORT, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = LED2_GPIO_PIN;GPIO_Init(LED2_GPIO_PORT, &GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin = LED3_GPIO_PIN;GPIO_Init(LED3_GPIO_PORT, &GPIO_InitStructure);GPIO_SetBits(LED1_GPIO_PORT, LED1_GPIO_PIN);GPIO_SetBits(LED2_GPIO_PORT, LED2_GPIO_PIN); GPIO_SetBits(LED3_GPIO_PORT, LED3_GPIO_PIN);
}
bsp_led.h文件
#ifndef __LED_H
#define __LED_H#include "stm32f10x.h"#define LED1_GPIO_PORT GPIOB
#define LED1_GPIO_CLK RCC_APB2Periph_GPIOB
#define LED1_GPIO_PIN GPIO_Pin_5 #define LED2_GPIO_PORT GPIOB
#define LED2_GPIO_CLK RCC_APB2Periph_GPIOB
#define LED2_GPIO_PIN GPIO_Pin_0 #define LED3_GPIO_PORT GPIOB
#define LED3_GPIO_CLK RCC_APB2Periph_GPIOB
#define LED3_GPIO_PIN GPIO_Pin_1 #define ON 0
#define OFF 1#define LED1(a) if (a) \GPIO_SetBits(LED1_GPIO_PORT,LED1_GPIO_PIN);\else \GPIO_ResetBits(LED1_GPIO_PORT,LED1_GPIO_PIN)#define LED2(a) if (a) \GPIO_SetBits(LED2_GPIO_PORT,LED2_GPIO_PIN);\else \GPIO_ResetBits(LED2_GPIO_PORT,LED2_GPIO_PIN)#define LED3(a) if (a) \GPIO_SetBits(LED3_GPIO_PORT,LED3_GPIO_PIN);\else \GPIO_ResetBits(LED3_GPIO_PORT,LED3_GPIO_PIN)#define digitalHi(p,i) {p->BSRR=i;}
#define digitalLo(p,i) {p->BRR=i;} #define LED1_TOGGLE digitalToggle(LED1_GPIO_PORT,LED1_GPIO_PIN)
#define LED1_OFF digitalHi(LED1_GPIO_PORT,LED1_GPIO_PIN)
#define LED1_ON digitalLo(LED1_GPIO_PORT,LED1_GPIO_PIN)#define LED2_TOGGLE digitalToggle(LED2_GPIO_PORT,LED2_GPIO_PIN)
#define LED2_OFF digitalHi(LED2_GPIO_PORT,LED2_GPIO_PIN)
#define LED2_ON digitalLo(LED2_GPIO_PORT,LED2_GPIO_PIN)#define LED3_TOGGLE digitalToggle(LED3_GPIO_PORT,LED3_GPIO_PIN)
#define LED3_OFF digitalHi(LED3_GPIO_PORT,LED3_GPIO_PIN)
#define LED3_ON digitalLo(LED3_GPIO_PORT,LED3_GPIO_PIN)void LED_GPIO_Config(void);#endif /* __LED_H */
bsp_SysTick.h文件
#ifndef __SYSTICK_H
#define __SYSTICK_H#include "stm32f10x.h"void SysTick_Init(void);
void Delay_us(__IO u32 nTime);
#define Delay_ms(x) Delay_us(100*x) //单位msvoid SysTick_Delay_Us( __IO uint32_t us);
void SysTick_Delay_Ms( __IO uint32_t ms);#endif /* __SYSTICK_H */
bsp_SysTick.c文件
#include "bsp_SysTick.h"
#include "core_cm3.h"
#include "misc.h"static __IO u32 TimingDelay;/*启动系统嘀嗒定时器*/
void SysTick_Init(void)
{/* SystemCoreClock / 1000 1ms中断一次* SystemCoreClock / 100000 10us中断一次* SystemCoreClock / 1000000 1us中断一次*/if (SysTick_Config(SystemCoreClock / 100000)){ /* Capture error */ while (1);}
}/*
Delay_us(1):实现1x10us = 10us延时
*/
void Delay_us(__IO u32 nTime)
{ TimingDelay = nTime; //使能嘀嗒定时器SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;while(TimingDelay != 0);
}//获取节拍程序,在SysTick中断函数SysTick_Handler()中调用
void TimingDelay_Decrement(void)
{if (TimingDelay != 0x00){ TimingDelay--;}
}#if 0
// 这个固件库函数在core_cm3.h中
static __INLINE uint32_t SysTick_Config(uint32_t ticks)
{ // reload 寄存器为24bit,最大值为2^24if (ticks > SysTick_LOAD_RELOAD_Msk) return (1);// 配置reload初始值 SysTick->LOAD = (ticks & SysTick_LOAD_RELOAD_Msk) - 1;//配置中断优先级为:1<<4-1 = 15,优先级为最低NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1); //配置counter计数器的值SysTick->VAL = 0;//配置systick的时钟为72M//中断使能//使能systickSysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk|SysTick_CTRL_TICKINT_Msk|SysTick_CTRL_ENABLE_Msk; return (0);
}
#endif// couter减一的时间等于1/systick_clk
//当counter 从reload 的值减小到0的时候,为一个循环,如果开启了中断则执行中断服务程序。
//同时CTRL的countflag位会置1
//这一个循环的时间为:reload * (1/systick_clk)void SysTick_Delay_Us( __IO uint32_t us)//SysTick微妙级延时
{uint32_t i;SysTick_Config(SystemCoreClock/1000000);for(i=0;i<us;i++){//当计数器的值减到0的时候,CRTL寄存器的位16会置1while( !((SysTick->CTRL)&(1<<16)) );}//关闭SysTick定时器SysTick->CTRL &=~SysTick_CTRL_ENABLE_Msk;
}void SysTick_Delay_Ms( __IO uint32_t ms)//SysTick毫秒级延时
{uint32_t i; SysTick_Config(SystemCoreClock/1000);for(i=0;i<ms;i++){//当计数器的值减少到0的时候,CRTL寄存器的位16会置1//当置1时,读取该位会清0while( !((SysTick->CTRL)&(1<<16)) );}//关闭SysTick定时器SysTick->CTRL &=~ SysTick_CTRL_ENABLE_Msk;
}
main.c文件
#include "stm32f10x.h"
#include "bsp_SysTick.h"
#include "bsp_led.h"int main(void)
{ /* LED端口初始化 */LED_GPIO_Config();/* 配置SysTick 为10us中断一次*/SysTick_Init();
#if 0 for(;;){LED1( ON ); Delay_us(100000); // 100000 * 10us = 1000ms//Delay_ms(100);LED1( OFF );LED2( ON );Delay_us(100000); // 100000 * 10us = 1000ms//Delay_ms(100);LED2( OFF );LED3( ON );Delay_us(100000); // 100000 * 10us = 1000ms//Delay_ms(100);LED3( OFF );}
#elsefor(;;){LED1( ON ); SysTick_Delay_Ms( 1000 );LED1( OFF );LED2( ON );SysTick_Delay_Ms( 1000 );LED2( OFF );LED3( ON );SysTick_Delay_Ms( 1000 );LED3( OFF );}
#endif
}
运行结果
STM32系统定时器闪烁LED灯相关推荐
- 瑞萨开发记录02:定时器闪烁LED灯(R5F104FEA芯片)
02.定时器闪烁lED灯 一.引脚配置 1.配置LED 2.配置定时器 二.编写代码 1.定时器定时 2.LED引脚定义 3.主函数 三.烧录程序 上一篇博客记录了点亮一颗LED灯以及工程文件的配 ...
- 嵌入式小白学习:STM32实现定时器控制LED灯
嵌入式小白学习:STM32实现定时器控制LED 目录 嵌入式小白学习:STM32实现定时器控制LED Part1.理论基础 Part2.环境的配置 Part3.代码的更改 Part4.实物的连线 Pa ...
- STM32系统定时器SysTick(只能向下递减)延时闪烁灯
参考:stm32 系统定时器 SysTick 作者:点灯小哥 发布时间: 2021-03-10 13:46:00 网址:https://blog.csdn.net/weixin_46016743/ar ...
- STM32定时器控制LED灯闪烁及PWM练习
一.STM32定时器控制LED灯闪烁 1.相关配置 1)配置RCC和SYS 2)配置IO 配置PC15,并命名为D1. 3)配置定时器 选定时器2,配置Clock Source为Internal Cl ...
- STM32实现定时器控制LED闪烁
文章目录 一.定时器介绍 二.STM32C配置项目 1.新建工程 2.配置引脚 3.配置SYS 4.配置GPIO 5.配置定时器 6.配置中断 7.时钟配置 8.创建代码 三.修改keil代码 四.实 ...
- STM32汇编语言点亮led灯
STM32汇编语言点亮led灯 首先,这篇blog的主要内容是在C语言中调用汇编语言写的函数.即在我们常用的标准库函数工程中,对外设(这里指led)使用汇编语言完成相关的寄存器配置和控制. 一.背景 ...
- STM32驱动全彩LED灯模块WS2812
STM32驱动全彩LED灯模块WS2812 WS2812全彩LED灯模块系列,可以进行级联实现灯带的效果,MCU端通过一个管脚可以控制所有级联的LED灯的不同发光颜色显示. 级联电路 WS2811(未 ...
- 点亮stm32开发板的led灯
点亮stm32开发板的led灯 简述 我使用的是STM公司stm32f103系列开发板,我们通过看原理图,对LED进行操作,以实现led灯的控制.(对于小白来说很有作用哈!废话不说,上料!) 1.查看 ...
- 闪烁LED灯Verilog
1.计数器工作原理 计数器的核心元件是触发器,基本功能是对脉冲进行计数,其所能记忆脉冲最大的数目称为该计数器的模/值.计数器常用在分频.定时等处.计数器的种类很多,按照计数方式的不同可以分为二进制计数 ...
- STM32实现定时器和LED呼吸灯
目录 一.实现定时器 1.定时器的介绍 1.1定时器的概念及作用 1.2定时器的分类 2.新建项目 2.1新建 2.2选择STM32F103C8T6芯片 2.3配置SYS 2.4配置RCC 2.5配置 ...
最新文章
- java算法面试题_【干货】经典算法面试题代码实现-Java版
- java plc通讯_树莓派+西门子PLC+Aliyun
- Java数据类型转换全解
- 【Flask】SQLALchemy的介绍
- 周昌印:忘记技术 从用户与市场考虑问题
- 三、Eclipse快捷键
- (二)spring MVC配置
- JavaScript 基础(十六):Navigator对象
- 机器学习第二回——多变量线性回归
- 如何在ps中调整文字的行距和间距_Wps如何调整文字字符的间距
- 润乾报表不显示的分析原因
- CentOS 5.5编译安装lnmp
- 工控计算机+isa接口,研华工控机IPC-610系列可提供多个PCI、ISA总线
- 建筑工程PPP项目财务风险控制探析
- 《计算机操作系统》(慕课版)课后习题
- CentOS 官网下载 iso 镜像
- 网络安全之黑客入侵的步骤
- Visual C++ 2008入门经典 Ivor Horton
- wx.getLocation接口申请
- C语言--指向指针的指针
热门文章
- Linux软件磁盘列阵RAID
- mac 更新系统后无法使用 git
- WordPress系列教程(一)----WordPress环境准备与安装
- HDU-6468 zyb的面试(模拟十叉树+dfs)
- linux nas mp4 播放器,我的NAS我的地盘 篇十:威联通NAS软件介绍与应用之QVideo篇
- Karma、Jasager与WiFiPineApple之间的关系
- 在padavan运行wifidog
- 百思不得姐php源码,百思不得姐源代码(xcode)
- m3u8\ts片段文件解密合成转换
- tomcat 配置文件 conf/server.xml 中的 appBase和docBase