当前位置:网站首页>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
边栏推荐
- MySQL null value processing and value replacement
- Deeply cultivate the developer ecosystem, accelerate the innovation and development of AI industry, and Intel brings many partners together
- mpf2_ Linear programming_ CAPM_ sharpe_ Arbitrage Pricin_ Inversion Gauss Jordan_ Statsmodel_ Pulp_ pLU_ Cholesky_ QR_ Jacobi
- Terms used in the Web3 community
- Depth first traversal template principle of tree and graph
- Canteen user dish relationship system (C language course design)
- 【线段树实战】最近的请求次数 + 区域和检索 - 数组可修改+我的日程安排表Ⅰ/Ⅲ
- 日常工作中程序员最讨厌哪些工作事项?
- Local tool [Navicat] connects to remote [MySQL] operation
- Chapter 9 Yunji datacanvas company won the highest honor of the "fifth digital finance innovation competition"!
猜你喜欢
3GPP信道模型路损基础知识
[line segment tree practice] recent requests + area and retrieval - array modifiable + my schedule I / III
How does vscade use the built-in browser?
程序员上班摸鱼,这么玩才高端!
Deeply cultivate the developer ecosystem, accelerate the innovation and development of AI industry, and Intel brings many partners together
为什么很多人对技术债务产生误解
DFS和BFS概念及实践+acwing 842 排列数字(dfs) +acwing 844. 走迷宫(bfs)
JDBC link Oracle reference code
计数排序基础思路
Intel and Xinbu technology jointly build a machine vision development kit to jointly promote the transformation of industrial intelligence
随机推荐
How to open win11 remote desktop connection? Five methods of win11 Remote Desktop Connection
Complimentary tickets quick grab | industry bigwigs talk about the quality and efficiency of software qecon conference is coming
食堂用户菜品关系系统(C语言课设)
Intel and Xinbu technology jointly build a machine vision development kit to jointly promote the transformation of industrial intelligence
Run the command once per second in Bash- Run command every second in Bash?
【实践出真理】import和require的引入方式真的和网上说的一样吗
Comment les tests de logiciels sont - ils effectués sur le site Web? Testez la stratégie!
抖音或将推出独立种草社区平台:会不会成为第二个小红书
图灵诞辰110周年,智能机器预言成真了吗?
The worse the AI performance, the higher the bonus? Doctor of New York University offered a reward for the task of making the big model perform poorly
namespace基础介绍
Oracle - views and sequences
Acl2022 | decomposed meta learning small sample named entity recognition
[hand torn STL] list
Detect when a tab bar item is pressed
[digital analog] source code of MATLAB allcycles() function (not available before 2021a)
Win11 control panel shortcut key win11 multiple methods to open the control panel
5G VoNR+之IMS Data Channel概念
九章云极DataCanvas公司摘获「第五届数字金融创新大赛」最高荣誉!
深入解析Kubebuilder