当前位置: 首页 > news >正文

系统滴答定时器

1 main.c

#include "stm32f10x.h"
#include "stm32f10x_pal.h"
#include "stm32f10x_pal_button.h"
#include "Serial.h"static PalButton_HandleTypeDef hButton;
static uint32_t ledBlinkMode = 0; // 0-慢, 1-普通,2-快闪
static uint32_t ledBlinkInterval[] = {1000, 200, 50};static void LED_Init(void); // LED的初始化
static void Button_Init(void); // 按钮的初始化
static void ButtonDetect_Proc(void); // 按钮检测进程
static void OnButtonReleased(void);
static void LEDBlink_Proc(void);int main(void)
{PAL_Init();LED_Init(); // LED的初始化Button_Init(); // 按钮的初始化
//	Serial_Init();while(1){//        printf("1");ButtonDetect_Proc(); // 按钮检测进程LEDBlink_Proc(); // 闪灯进程}
}static void LED_Init(void)
{// PC13 输出开漏模式RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);GPIO_InitTypeDef GPIOInitStruct;GPIOInitStruct.GPIO_Pin = GPIO_Pin_13;GPIOInitStruct.GPIO_Mode = GPIO_Mode_Out_OD;GPIOInitStruct.GPIO_Speed = GPIO_Speed_2MHz;GPIO_Init(GPIOC, &GPIOInitStruct);
}static void Button_Init(void)
{hButton.Init.GPIOx = GPIOA;hButton.Init.GPIO_Pin = GPIO_Pin_0;hButton.Init.Button_Mode = Button_Mode_IPU;hButton.Init.ButtonPressedCallback = 0;hButton.Init.ButtonReleasedCallback = OnButtonReleased;PAL_Button_Init(&hButton);
}static void ButtonDetect_Proc(void)
{PAL_Button_Proc(&hButton);
}static void OnButtonReleased(void)
{ledBlinkMode = (ledBlinkMode+1) % 3;
}static uint32_t stage = 0;
static uint64_t ledLastToggleTime = 0; // LED上次翻转的时间static void LEDBlink_Proc(void)
{
//	GPIO_WriteBit(GPIOC, GPIO_Pin_13, Bit_RESET); // 点亮
//	PAL_Delay(ledBlinkInterval[ledBlinkMode]);
//	GPIO_WriteBit(GPIOC, GPIO_Pin_13, Bit_SET); // 熄灭
//	PAL_Delay(ledBlinkInterval[ledBlinkMode]);switch(stage){case 0: // 灭if(PAL_GetTick() - ledLastToggleTime > ledBlinkInterval[ledBlinkMode]){GPIO_WriteBit(GPIOC, GPIO_Pin_13, Bit_RESET); // 点亮ledLastToggleTime = PAL_GetTick();stage = 1;}break;case 1: // 亮if(PAL_GetTick() - ledLastToggleTime > ledBlinkInterval[ledBlinkMode]){GPIO_WriteBit(GPIOC, GPIO_Pin_13, Bit_SET); // 熄灭ledLastToggleTime = PAL_GetTick();stage = 0;}break;}
}

2 sys.c

/********************************************************************************* @file    stm32f10x_pal.c * @author  铁头山羊* @version V 1.0.0* @date    2022年8月30日* @brief   外设抽象层源文件*******************************************************************************/#include "stm32f10x_pal.h"static __IO uint64_t ulTicks;
static float us_per_mini_tick;
static void Systick_Init(void);// @简介:初始化PAL库
// @参数:无
// @返回值:无
// @注意:请务必在使用PAL库之前调用此方法
void PAL_Init(void)
{Systick_Init(); // 初始化系统滴答定时器	
}// @简介:毫秒级延迟
// @参数:Delay - 延迟时长,以毫秒为单位(千分之一秒)
// @返回值:无
// @注意:不允许在中断响应函数中调用此方法
void PAL_Delay(uint32_t Delay)
{uint64_t expiredTime = ulTicks + Delay;while(ulTicks <  expiredTime){}
}// @简介:微秒级延迟
// @参数:Us - 延迟时长,单位微秒(百万分之一秒)
// @返回值:无
// @注意:不允许在中断响应函数中调用此方法
void PAL_DelayUs(uint32_t Us)
{uint64_t expiredTime = PAL_GetUs() + Us;while(PAL_GetUs() < expiredTime);
}// @简介:延迟直到某一时刻
// @参数:WakeupTime - 延迟停止的时刻,单位毫秒(千分之一秒)
// @返回值:无
// 注意:不允许在中断响应函数中调用此方法
void PAL_DelayUntil(uint64_t WakeupTime)
{while(ulTicks < WakeupTime);
}// @简介:获取当前时间,以毫秒(千分之一秒)为单位
// @参数:无
// @返回值:当前时间,单位为毫秒(千分之一秒)
uint64_t PAL_GetTick(void)
{return ulTicks;
}// @简介:获取当前时间,以微秒(百万分之一秒)为单位
// @参数:空
// @返回值:当前时间,单位为微秒(百万分之一秒)
uint64_t PAL_GetUs(void)
{uint64_t tick;uint32_t mini_tick;SysTick->CTRL &= ~SysTick_CTRL_COUNTFLAG; // 清除COUNTFLAGtick = ulTicks; // 读取毫秒值mini_tick = SysTick->VAL; // 读取SYSTICK的值// 直到无溢出标志// 读取COUNTERFLAG也会清除它的值while(SysTick->CTRL & SysTick_CTRL_COUNTFLAG) {mini_tick = SysTick->VAL;tick = ulTicks;}// 换算成微秒tick *= 1000; // 毫秒部分乘以1000tick += (uint32_t)((SysTick->LOAD - mini_tick) * us_per_mini_tick); // 小数部分折算成微秒return tick;
}// @简介:系统滴答定时器中断的处理代码
// @参数:无
// @返回值:无
// @注意:此方法应当在Systick_IRQHandler中被调用
void PAL_Systick_IRQHandler(void)
{ulTicks++;
}static void Systick_Init(void)
{RCC_ClocksTypeDef clockinfo = {0};uint32_t tmp;SysTick->CTRL &= ~SysTick_CTRL_ENABLE; // 禁止SYSTICKulTicks = 0;RCC_GetClocksFreq(&clockinfo);SysTick->CTRL |= SysTick_CTRL_TICKINT; // 开启中断// 设置中断优先级为0SCB->SHP[7] = 0;// 设置自动重装值以保证1ms的时钟tmp =  clockinfo.HCLK_Frequency / 1000;if(tmp > 0x00ffffff){tmp = tmp / 8;SysTick->CTRL &= ~SysTick_CTRL_CLKSOURCE; }else{SysTick->CTRL |= SysTick_CTRL_CLKSOURCE; }SysTick->LOAD = tmp - 1;SysTick->CTRL |= SysTick_CTRL_ENABLE; us_per_mini_tick = 1000.0 / ((SysTick->LOAD & 0x00ffffff) + 1);
}

 3 sys.h

/********************************************************************************* @file    stm32f10x_pal.h * @author  铁头山羊* @version V 1.0.0* @date    2022年8月30日* @brief   外设抽象层头文件*******************************************************************************/#ifndef _STM32F10X_PAL_H_
#define _STM32F10X_PAL_H_#include "stm32f10x.h"#define _STM32F10X_PAL_VERSION_MAJOR (uint32_t)2  // 主版本
#define _STM32F10x_PAL_VERSION_MINOR (uint32_t)0  // 副版本号
#define _STM32F10x_PAL_VERSION_BUILD (uint32_t)60 // 编译版本号#define PAL_MAX_DELAY 0xffffffff
#define PAL_INVALID_TICK 0xffffffffffffffff
#define PAL_FLOAT_INFINATE 3.402823E38#define PAL_IS_FLOAT_INFINATE(v) ((v)==PAL_FLOAT_INFINATE)#define CHECK(v) if((v)!=SUCCESS) return ERROR;#define RCC_GPIOx_ClkCmd(GPIOx, NewState) do{\if(GPIOx == GPIOA)\{\RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, NewState);\}\else if(GPIOx == GPIOB)\{\RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, NewState);\}\else if(GPIOx == GPIOC)\{\RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, NewState);\}\else if(GPIOx == GPIOD)\{\RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, NewState);\}\else if(GPIOx == GPIOE)\{\RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, NewState);\}\else if(GPIOx == GPIOF)\{\RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOF, NewState);\}\else if(GPIOx == GPIOG)\{\RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOG, NewState);\}\
}while(0)void PAL_Init(void);
void PAL_Delay(uint32_t Delay);
void PAL_DelayUntil(uint64_t WakeupTime);
uint64_t PAL_GetTick(void);
void PAL_DelayUs(uint32_t Us);
uint64_t PAL_GetUs(void);
void PAL_Systick_IRQHandler(void);#endif


http://www.mrgr.cn/news/60005.html

相关文章:

  • UML之用例视图
  • 力扣382:链表随机结点
  • Android 添加如下飞行模式(飞行模式开和关、飞行模式开关菜单显示隐藏)接口
  • 获取 Excel 文件中的所有工作表名称,可以通过 OleDbConnection 获取表架构
  • AudioSegment 提高音频音量 - python 实现
  • Spring Cache-基于注解的缓存
  • 构成正方形的数量
  • 基于SSM+微信小程序的跑腿平台管理系统(跑腿3)
  • 进程间通信(管道)
  • 【已解决,含泪总结】非root权限在服务器上配置python和torch环境,代码最终成功训练(一)
  • Ubuntu22.04编译安装实时内核
  • 2-135 基于matlab的有限差分法计算电位分布
  • 1025. 除数博弈
  • maven之pom.xml文件解读
  • flink1.17.2安装和使用
  • 基于协同过滤算法的旅游网站推荐系统
  • iTerm2 保持SSH远程连接
  • PyQt入门指南二十九 QListView列表视图组件
  • leetcode day7 442
  • 揭秘:如何用Puppeteer和BrowserWS解锁网站性能的隐秘角落
  • 【CTF】 文件包含漏洞——data伪协议 【详】
  • python之多任务爬虫——线程、进程、协程的介绍与使用(16)
  • C++20新特性探索:概念(Concepts)与范围库(Ranges)
  • 特定机器学习问题的基准测试数据
  • 【Vue3】第二篇
  • 15-5小C的外卖超时判断