当前位置:网站首页>STM32 system timer flashing LED
STM32 system timer flashing LED
2022-07-07 04:50:00 【DS. Fu Hongxue】
SysTick Register introduction
SysTick Register summary
Register name | Register description |
---|---|
CTRL | SysTick Control and status register |
LOAD | SysTick Reload the load value register |
VAL | SysTick Current value register |
CALIB | SysTick Calibration value register |
①SysTick Control and status register
Bit segment | name | type | reset value | describe |
---|---|---|---|---|
16 | COUNTFLAG | R/W | 0 | If after last reading this register ,SysTick It has been counted 0, The bit is 1 |
2 | CLKSOURCE | R/W | 0 | Clock source selection bit ,0=AHB/8,1= Processor clock AHB |
1 | TICKINT | R/W | 0 | 1:SysTick Count down to 0 Time production SysTick Exception request ,0: Count to 0 No action |
0 | ENABLE | R/W | 0 | SysTick Enable bit of timer |
②SystTick Reload the load value register
Bit segment | name | type | reset value | describe |
---|---|---|---|---|
23:0 | RELOAD | R/W | 0 | When count down to 0 when , Values to be reloaded |
③SysTick Current value register
Bit segment | name | type | reset value | describe |
---|---|---|---|---|
23:0 | CURRENT | R/W | 0 | When reading, return the value of the current reciprocal count , Writing it clears it , At the same time, it will also clean up in SysTick Control and status register COUNTFLAG sign |
SysTick Timing experiments
Programming points
1) Set the value of the reload register .
2) Clear the value of the current value register .
3) Configure control and status registers .
bsp_led.c file
#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 file
#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 file
#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) // Company ms
void SysTick_Delay_Us( __IO uint32_t us);
void SysTick_Delay_Ms( __IO uint32_t ms);
#endif /* __SYSTICK_H */
bsp_SysTick.c file
#include "bsp_SysTick.h"
#include "core_cm3.h"
#include "misc.h"
static __IO u32 TimingDelay;
/* Start the system tick timer */
void SysTick_Init(void)
{
/* SystemCoreClock / 1000 1ms Break once * SystemCoreClock / 100000 10us Break once * SystemCoreClock / 1000000 1us Break once */
if (SysTick_Config(SystemCoreClock / 100000))
{
/* Capture error */
while (1);
}
}
/* Delay_us(1): Realization 1x10us = 10us Time delay */
void Delay_us(__IO u32 nTime)
{
TimingDelay = nTime;
// Enable tick timer
SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;
while(TimingDelay != 0);
}
// Get the beat program , stay SysTick Interrupt function SysTick_Handler() Call in
void TimingDelay_Decrement(void)
{
if (TimingDelay != 0x00)
{
TimingDelay--;
}
}
#if 0
// This firmware library function is in core_cm3.h in
static __INLINE uint32_t SysTick_Config(uint32_t ticks)
{
// reload The register is 24bit, The maximum value is 2^24
if (ticks > SysTick_LOAD_RELOAD_Msk) return (1);
// To configure reload Initial value
SysTick->LOAD = (ticks & SysTick_LOAD_RELOAD_Msk) - 1;
// Configure interrupt priority as :1<<4-1 = 15, The priority is the lowest
NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1);
// To configure counter The value of the counter
SysTick->VAL = 0;
// To configure systick The clock is 72M
// Interrupt enable
// Can make systick
SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk|SysTick_CTRL_TICKINT_Msk|SysTick_CTRL_ENABLE_Msk;
return (0);
}
#endif
// couter Minus one is equal to 1/systick_clk
// When counter from reload The value of is reduced to 0 When , For a cycle , If interrupt is turned on, the interrupt service program is executed .
// meanwhile CTRL Of countflag Position meeting position 1
// The time of this cycle is :reload * (1/systick_clk)
void SysTick_Delay_Us( __IO uint32_t us)//SysTick Subtle level delay
{
uint32_t i;
SysTick_Config(SystemCoreClock/1000000);
for(i=0;i<us;i++)
{
// When the value of the counter is reduced to 0 When ,CRTL Bit of register 16 I'll set 1
while( !((SysTick->CTRL)&(1<<16)) );
}
// close SysTick Timer
SysTick->CTRL &=~SysTick_CTRL_ENABLE_Msk;
}
void SysTick_Delay_Ms( __IO uint32_t ms)//SysTick Millisecond delay
{
uint32_t i;
SysTick_Config(SystemCoreClock/1000);
for(i=0;i<ms;i++)
{
// When the value of the counter is reduced to 0 When ,CRTL Bit of register 16 I'll set 1
// Dangzhi 1 when , Reading this bit clears 0
while( !((SysTick->CTRL)&(1<<16)) );
}
// close SysTick Timer
SysTick->CTRL &=~ SysTick_CTRL_ENABLE_Msk;
}
main.c file
#include "stm32f10x.h"
#include "bsp_SysTick.h"
#include "bsp_led.h"
int main(void)
{
/* LED Port initialization */
LED_GPIO_Config();
/* To configure SysTick by 10us Break once */
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 );
}
#else
for(;;)
{
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
}
Running results
边栏推荐
- 【实践出真理】import和require的引入方式真的和网上说的一样吗
- [line segment tree practice] recent requests + area and retrieval - array modifiable + my schedule I / III
- DFS和BFS概念及实践+acwing 842 排列数字(dfs) +acwing 844. 走迷宫(bfs)
- 广告归因:买量如何做价值衡量?
- Case reward: Intel brings many partners to promote the innovation and development of multi domain AI industry
- Master the secrets of software security testing methods, and pinch the security test report with your hands
- A series of shortcut keys for jetbrain pychar
- Basic idea of counting and sorting
- 什么是Web3
- Chapter 9 Yunji datacanvas company has been ranked top 3 in China's machine learning platform market
猜你喜欢
程序员上班摸鱼,这么玩才高端!
Intel and Xinbu technology jointly build a machine vision development kit to jointly promote the transformation of industrial intelligence
acwing 843. N-queen problem
How to package the parsed Excel data into objects and write this object set into the database?
A detailed explanation of head pose estimation [collect good articles]
窗口可不是什么便宜的东西
Introduction to the PureMVC series
AttributeError: module ‘torch._C‘ has no attribute ‘_cuda_setDevice‘
AI landing new question type RPA + AI =?
Digital chemical plant management system based on Virtual Simulation Technology
随机推荐
Code source de la fonction [analogique numérique] MATLAB allcycles () (non disponible avant 2021a)
指针与数组在函数中输入实现逆序输出
【数模】Matlab allcycles()函数的源代码(2021a之前版本没有)
Digital chemical plant management system based on Virtual Simulation Technology
MySQL null value processing and value replacement
Comment les tests de logiciels sont - ils effectués sur le site Web? Testez la stratégie!
mpf2_线性规划_CAPM_sharpe_Arbitrage Pricin_Inversion Gauss Jordan_Statsmodel_Pulp_pLU_Cholesky_QR_Jacobi
Vscode automatically adds a semicolon and jumps to the next line
全国气象数据/降雨量分布数据/太阳辐射数据/NPP净初级生产力数据/植被覆盖度数据
Lecture 3 of "prime mover x cloud native positive sounding, cost reduction and efficiency enhancement lecture" - kubernetes cluster utilization improvement practice
九章云极DataCanvas公司获评36氪「最受投资人关注的硬核科技企业」
A series of shortcut keys for jetbrain pychar
两个div在同一行,两个div不换行「建议收藏」
Case reward: Intel brings many partners to promote the innovation and development of multi domain AI industry
食堂用户菜品关系系统(C语言课设)
【736. Lisp 语法解析】
Thesis landing strategy | how to get started quickly in academic thesis writing
广告归因:买量如何做价值衡量?
Up to 5million per person per year! Choose people instead of projects, focus on basic scientific research, and scientists dominate the "new cornerstone" funded by Tencent to start the application
What if win11 pictures cannot be opened? Repair method of win11 unable to open pictures