Nucleo-F411RE (STM32F411)LL库体验 3 - 滴嗒定时器的配置

news2024/12/23 16:41:46

Nucleo-F411RE (STM32F411)LL库体验 3 - 滴嗒定时器的配置

1、LL库延时

LL库初始化时钟的时候调用了LL_Init1msTick(100000000)函数,这个函数其实就是初始化了系统的滴答定时器。
LL_InitTick原型如下:
在这里插入图片描述
在这里插入图片描述
load值 = sysclk/1000,即计时1ms需要120000个数。
CTRL clksource = 1,不分频,systick的频率为120M。

2、添加自己的延时函数

注释掉 LL_Init1msTick函数,初始化滴答定时器为中断模式,设置load = 120000,即1ms进入中断函数一次。

#include "systick.h"
#include "main.h"

volatile static uint32_t delay;

uint32_t BOARD_Systick_Init(uint32_t ticks)
{ 
  if (ticks > SysTick_LOAD_RELOAD_Msk)  return (1);            /* Reload value impossible */
                                                               
  SysTick->LOAD  = (ticks & SysTick_LOAD_RELOAD_Msk) - 1;      /* set reload register */
  NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1);  /* set Priority for Cortex-M0 System Interrupts */
  SysTick->VAL   = 0;                                          /* Load the SysTick Counter Value */
  SysTick->CTRL  = SysTick_CTRL_CLKSOURCE_Msk | 
                   SysTick_CTRL_ENABLE_Msk;                    /* Enable SysTick IRQ and SysTick Timer */
  SysTick->CTRL  |= SysTick_CTRL_TICKINT_Msk;
  return (0);                                                  /* Function successful */
}

void BOARD_Delay1Ms(uint32_t count)
{
    delay = count;

    while(0U != delay){
    }
}

void BOARD_Delay_Decrement(void)
{
    if (0U != delay){
        delay--;
    }
}

中断处理函数:
在这里插入图片描述
在初始化时钟的地方初始化滴答定时器。
在这里插入图片描述
调用延时函数:
在这里插入图片描述

3、软件延时函数

比如时钟为100M,延时1us需要100个__NOP();
那么可以简单写延时函数如下:

/* Software delay millisecond. */
void APP_SoftwareDelay_Ms(uint32_t ms)
{
    for (uint32_t i = 0u; i < ms; i++)
    {
        for (uint32_t j = 0u; j < (SystemCoreClock / 1000u); j++)
        {
            __NOP();
        }
    }
}

void APP_SoftwareDelay_Us(uint32_t us)
{
    for (uint32_t j = 0u; j < (SystemCoreClock / 1000000u); j++)
    {
        __NOP();
    } 
}

4、代码

代码下载

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/650852.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

RocketMQ架构和工作流程

一.MQ概述 1.简介 MQ&#xff0c;Message Queue&#xff0c;是一种提供消息队列服务的中间件&#xff0c;也称为消息中间件&#xff0c;是一套提供了消息生产、存储、消费全过程API的软件系统。消息即数据。一般消息的体量不会很大。 2.用途 限流削峰 MQ可以将系统的超量请求…

接口测试工具怎么选?这个技巧你一定要知道

目录 前言 一、易用性 二、灵活性 三、可靠性 测试用例 接口测试数据 自动化测试 测试报告 总结 前言 当今软性开发中&#xff0c;接口测试已成为必不可少的一环&#xff0c;该如何选择接口测试工具?选择合适的接口测试工具对于程房员来说非常重要&#xff0c;因为…

SQL死锁

前言&#xff1a; 使用脚本刷数据时&#xff0c;开多线程经常遇到死锁现象&#xff0c;面试也经常问到&#xff0c;故开此篇 日志错误示例&#xff1a; ### Error updating database. Cause: com.mysql.cj.jdbc.exceptions.MySQLTransactionRollbackException: Deadlock fo…

Tplink企业版开启ipv6

Tplink企业版开启ipv6 1、登录路由器 路由器的默认地址一般为&#xff1a;192.168.0.1&#xff0c;登录成功后如下图&#xff1a; 2、WAN设置ipv6 wan是设置启用ipv6模式&#xff0c;如果这里无法启用&#xff0c;主要是因为“接口模式”中启用了桥接模式&#xff0c;可以关闭…

多线程详解

多线程详解 Process和Thread 程序是指令和数据的有序结合&#xff0c;其本身没有任何运行的含义&#xff0c;是一个静态的概念 进程是执行程序的一次执行过程&#xff0c;是一个动态的概念&#xff0c;是系统资源分配的单位 通常在一个进程中可以包含若干个线程。线程是CPU调…

(数组) 922. 按奇偶排序数组 II ——【Leetcode每日一题】

❓922. 按奇偶排序数组 II 难度&#xff1a;简单 给定一个非负整数数组 nums&#xff0c; nums 中一半整数是 奇数 &#xff0c;一半整数是 偶数 。 对数组进行排序&#xff0c;以便当 nums[i] 为奇数时&#xff0c;i 也是 奇数 &#xff1b;当 nums[i] 为偶数时&#xff0c…

开发语言的更新换代,都是为了更好地提高生产力,Kotlin也是如此~

作为一名Android开发&#xff0c;学习Kotlin是很有必要的。以下是一些原因&#xff1a; 1.Kotlin是官方支持的语言。 在2017年Google宣布支持Kotlin作为官方开发语言后&#xff0c;Kotlin已成为Android生态系统的重要组成部分。此举表明Kotlin的发展前景非常广阔&#xff0c;…

uniapp兼容多pda扫描扫码

前景 网上有现成的针对单个pda扫码录入的代码&#xff0c;但是公司的需求是在多个不同厂商pda上运行&#xff0c;这就会导致不同的pda默认的广播动作和广播标签不一致的情况&#xff0c;目前也没有获取这俩字段的api。 单个pda扫描扫码代码 先创建一个scanCode.js的文件 le…

UnoCSS给了我一个不用tailwindcss的理由

相同的原由 & 前言 如果你没有听说过 tailwindcss 或者 unocss&#xff0c;请先 return 先去了解一下&#x1f61d;。 开发上&#xff1a;可能为你甚至你们的前端团队节省很多写样式的时间&#xff0c;也能让你或者你们的项目开发体验有很大提升生产上&#xff1a;你们的…

VS2013创建一个MFC工程的步骤

目录 1、新建项目&#xff0c;选择”MFC应用程序“&#xff1b; 2、应用程序类型&#xff0c;选择“基于对话框”&#xff1b; 3、对话框的标题&#xff0c;默认是和项目的名字一致&#xff0c;按需修改&#xff1b; 4、高级功能&#xff0c;可以保持默认&#xff1b; 5、…

一个女测试工程师的大厂日常

今天给大家分享两个朋友的故事&#xff0c;他们分别在国内两家顶尖的互联网大厂&#xff0c;一个在头条&#xff0c;一个在蚂蚁。 头条的故事 头条的主人公&#xff0c;在入职后的一年里&#xff0c;晚上十点半下班是比较早了&#xff0c;基本上都是十一点半左右下班&#xff…

低成本开发专属小程序支持自定义开发设计

传统定制开发小程序成本高&#xff0c;还需要不断地沟通和交流才能一步步地去实现你想要的功能和效果&#xff0c;那么除了传统的定制开发小程序外&#xff0c;用户其实还可以选择使用模板开发小程序&#xff0c;不仅能实现小程序的所有基础功能&#xff0c;还不用编程维护和开…

进程的描述与控制

文章目录 前趋图和程序执行前趋图程序顺序执行程序并发执行 进程引入目的进程的描述进程的定义进程的特征进程的基本状态与转换挂起操作和进程状态的转换挂起操作引入引入挂起操作后进程3个基本状态间的转换引入挂起操作后进程5个基本状态间的转换进程管理中的数据结构OS中用于…

antdb-upgrade大版本升级介绍

antdb-upgrade pg_upgrade 是postgresql 大版本升级的得力工具。 数据库系统数据部分通过 new version的pg_upgrade自动升级完成数据库用户数据部分&#xff0c;主要有两种用法&#xff1a; 使用pg_upgrade copy物理拷贝方式升级(非copy to/copy from逻辑拷贝)。使用pg_upgra…

内网渗透—隧道搭建SPP与NPS内网穿透

内网渗透—隧道搭建&SPP与NPS内网穿透 1. 前言2. SPP2.1. SPP代理通信2.1.1. 服务端配置2.1.2. 客户端配置2.1.3. CS设置2.1.3.1. 设置生成的监听器2.1.3.2. 设置监听的监听器 2.1.4. 执行效果 2.2. SPP隧道建立2.2.1. 服务端设置2.2.2. 客户端配置2.2.3. CS设置2.2.3.1. 设…

Mybatis学习笔记三

目录 一、MyBatis的缓存1.1 MyBatis的一级缓存1.2 MyBatis的二级缓存1.3 二级缓存的相关配置1.4 MyBatis缓存查询的顺序1.5 整合第三方缓存EHCache&#xff08;了解&#xff09; 二、MyBatis的逆向工程2.1 创建逆向工程的步骤2.2 简单使用查询增改 三、 分页插件3.1 分页插件使…

Endnote解决文章题目Title大小写问题,以及专有名词保持全部大写

在写毕业论文或综述类文章时&#xff0c;需要添加大量参考文献&#xff08;100左右或更多&#xff09;&#xff0c;而每个期刊的要求是不一样的&#xff0c;因此手动输入或修改参考文献的格式是愚蠢的&#xff08;狗头保命&#xff09;&#xff0c;所以需要强大的endnote来进行…

一篇博客搞定C++11之Lambda表达式(附案例代码+解析)

Lambda表达式 1.lambda表达式语法2.捕获列表说明3.lambda表达式实现原理4.具体案例5.总结 1.lambda表达式语法 ambda表达式的语法非常简单&#xff0c;具体定义如下&#xff1a; [ captures ] ( params ) specifiers exception -> ret { body } 先不用急于解读这个定义&…

面向对象内部类

概念 将一个类 A 定义在另一个类 B 里面&#xff0c;里面的那个类 A 就称为内部类 &#xff08;InnerClass&#xff09;&#xff0c;类 B 则称为外部类&#xff08;OuterClass&#xff09; 根据内部类声明的位置&#xff08;如同变量的分类&#xff09;&#xff0c;我们可以分…

首次使用云服务器搭建网站(二)

书接上文&#xff0c;我们已经完成了服务器的租赁&#xff0c;宝塔面板的下载与安装。 接下来我们将正式开始网站搭建。 一、网站创建 点击网站、添加站点 输入网站域名、数据库选择MySQL数据库&#xff0c;选择utf8&#xff0c;数据库账号密码会自动生成。无论你要创建什么样…