当前位置:网站首页>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
边栏推荐
- SQL where multiple field filtering
- 全国气象数据/降雨量分布数据/太阳辐射数据/NPP净初级生产力数据/植被覆盖度数据
- Some understandings about 01 backpacker
- What if the win11 screenshot key cannot be used? Solution to the failure of win11 screenshot key
- 过气光刻机也不能卖给中国!美国无理施压荷兰ASML,国产芯片再遭打压
- System framework of PureMVC
- Vscode 如何使用内置浏览器?
- Programmers go to work fishing, so play high-end!
- Common Oracle SQL statements
- npm ERR! 400 Bad Request - PUT xxx - “devDependencies“ dep “xx“ is not a valid dependency name
猜你喜欢
5G VoNR+之IMS Data Channel概念
【线段树实战】最近的请求次数 + 区域和检索 - 数组可修改+我的日程安排表Ⅰ/Ⅲ
Meow, come, come: do you really know if, if else
为什么很多人对技术债务产生误解
Network Security Learning - Information Collection
Read of shell internal value command
A row of code r shows the table of Cox regression model
【实践出真理】import和require的引入方式真的和网上说的一样吗
Depth first traversal template principle of tree and graph
The root file system of buildreoot prompts "depmod:applt not found"
随机推荐
Acl2022 | decomposed meta learning small sample named entity recognition
DFS和BFS概念及实践+acwing 842 排列数字(dfs) +acwing 844. 走迷宫(bfs)
Detect when a tab bar item is pressed
Jetson nano configures pytorch deep learning environment / / to be improved
指针与数组在函数中输入实现逆序输出
Web3 社区中使用的术语
使用Thread类和Runnable接口实现多线程的区别
深入解析Kubebuilder
Basic idea of counting and sorting
Analyse approfondie de kubebuilder
3GPP信道模型路损基础知识
每人每年最高500万经费!选人不选项目,专注基础科研,科学家主导腾讯出资的「新基石」启动申报
【ArcGIS教程】专题图制作-人口密度分布图——人口密度分析
offer如何选择该考虑哪些因素
A row of code r shows the table of Cox regression model
A series of shortcut keys for jetbrain pychar
深入解析Kubebuilder
Zhou Yajin, a top safety scholar of Zhejiang University, is a curiosity driven activist
Programmers go to work fishing, so play high-end!
DFS and BFS concepts and practices +acwing 842 arranged numbers (DFS) +acwing 844 Maze walking (BFS)