淘宝店可以做团购的网站网络营销seo招聘

张小明 2026/1/10 5:22:20
淘宝店可以做团购的网站,网络营销seo招聘,网站建设 培训,梦想小镇旅游官方网站建设本章讲解系统定时器#xff08;SysTick#xff09;#xff0c;主要分成三部分内容。首先是简单介绍一下系统定时器#xff0c;然后是分析它的功能框图#xff0c;最后是设计一个实验。系统定时器属于 Cortex-M 内核中的一个定时器#xff0c;只要你是 Cortex-M 内核的SysTick主要分成三部分内容。首先是简单介绍一下系统定时器然后是分析它的功能框图最后是设计一个实验。系统定时器属于 Cortex-M 内核中的一个定时器只要你是 Cortex-M 内核的不管是 M3、M4 还是 M7都会有这个系统定时器。因此本章内容不仅兼容霸道和指南者开发板其他开发板也可以参考学习。一、系统定时器简介系统定时器英文名为 System Tick Timer中文译为系统定时器。它是一个 24 位的计数器只能递减计数属于 Cortex-M3 内核的一部分。如前所述无论使用的是 Cortex-M3、M4 还是 M7 内核都包含这个 SysTick 定时器并且它嵌套在 NVIC嵌套向量中断控制器中。SysTick 中断在 NVIC 的向量表中有固定的中断号IRQn 为 SysTick_IRQn负数属于内核中断但它的优先级配置不在普通的 NVIC_IPR 寄存器中而是在 SCB系统控制块的 SHPR3 寄存器中完成这也是后面优先级部分的重点。简介部分我们主要记住两点第一它存在于内核中SysTick 属于 Cortex-M3 内核的一部分在 ARM 官方的Cortex-M3 编程手册中被划分到 “System timer (SysTick)” 小节在 STM32 的芯片参考手册中只会在 “中断和事件” 章节中简单提到其中断号和基本说明细节都在 ARM 的手册里。第二它是 24 位的递减计数器计数宽度固定为 24 位最大重装载值 224−10xFFFFFF16,777,215。只能递减计数从 RELOAD 设定的值往 0 数不能递增。每次计到 0 时如果没有关闭 SysTick会自动从 RELOAD 重新装载开始下一轮计数。二、功能框图详解在 STM32 的官方参考手册中关于 SysTick 的讲解相对较少。通常在中断和事件章节可能只有简要提及。由于其属于内核级外设详细信息需要查阅 ARM 公司提供的Cortex-M3 编程手册通常是英文版在 ARM 官方的Cortex-M3 编程手册中被划分到 “System timer (SysTick)” 小节。 STM32 的芯片参考手册中只会在 “中断和事件” 章节中简单提到其中断号和基本说明细节都在 ARM 的手册里。1. 根据资料它主要包含三个核心部分时钟源递减计数器24 位宽度最大值为 2^24。重装载寄存器Reload Register同样是 24 位用于设定计数器的初始值。2. 其工作原理是计数器在时钟的驱动下从重装载寄存器RELOAD设定的初值开始递减计数。在递减过程中可以通过 VALCurrent Value Register寄存器实时读取当前计数值。当计数器从重装载值递减到 0 时会触发两个动作如果使能了中断则会产生 SysTick 中断从而执行相应的中断服务程序。同时控制和状态寄存器CTRL中的 COUNTFLAG 标志位会被置 1。此后如果计数器未被关闭它会自动从重装载寄存器中重新加载初始值并开始新一轮的递减计数如此周而复始。3. 结合工程代码详解功能框图根据core_cm3.h中的定义可以更直观地看到 SysTick 的寄存器模型// 文件: 19-systick/Libraries/CMSIS/core_cm3.h (第365-371行附近) typedef struct { __IO uint32_t CTRL; /*! Offset: 0x00 SysTick Control and Status Register */ __IO uint32_t LOAD; /*! Offset: 0x04 SysTick Reload Value Register */ __IO uint32_t VAL; /*! Offset: 0x08 SysTick Current Value Register */ __I uint32_t CALIB; /*! Offset: 0x0C SysTick Calibration Register */ } SysTick_Type;CTRL 寄存器控制 / 状态控制定时器是否使能、是否产生中断、时钟源选择。状态位中最关键的是COUNTFLAG计数到 0 标志。LOAD 寄存器重装载值24 位有效决定了单次计数周期的长度。用于设置计数器递减到 0 后重新装载的数值。每次计数到 0 后硬件会把此值装入VAL开始新一轮倒计时。VAL 寄存器当前计数值24 位有效当前递减计数器的值。读取时返回计数器的当前值。向该寄存器写入任何值都会将其清零并同时清除 CTRL 寄存器中的 COUNTFLAG 标志。CALIB 寄存器校准值内部工厂校准值用于在某个固定频率下生成 10ms/1ms 基准。实际工程中通常较少使用。例如手册中提到当时钟为 9MHz 时校准值固定为 9000可用于产生 1ms 的时间基准但最常用的还是前三个寄存器。4. 结合代码可以把功能框图总结为一条“工作通路”选择时钟源CTRL.CLKSOURCE例如 AHB 72MHz 时SysTick 时钟可为 72MHz 或 AHB/8 9MHz。设置LOAD为希望的计数周期减到 0 的计数次数。清零VAL清除历史计数。设置CTRL.ENABLE使能计数。每次计到 0若TICKINT1产生 SysTick 中断COUNTFLAG被硬件置 1若未关闭 SysTick自动从LOAD重新装载。三、寄存器描述在core_cm3.h中对 CTRL、LOAD、VAL、CALIB 的重要位有宏定义方便固件库代码使用// 文件: 19-systick/Libraries/CMSIS/core_cm3.h (第373-402行附近) /* SysTick Control / Status Register Definitions */ #define SysTick_CTRL_COUNTFLAG_Pos 16 /*! SysTick CTRL: COUNTFLAG Position */ #define SysTick_CTRL_COUNTFLAG_Msk (1ul SysTick_CTRL_COUNTFLAG_Pos) /*! SysTick CTRL: COUNTFLAG Mask */ #define SysTick_CTRL_CLKSOURCE_Pos 2 /*! SysTick CTRL: CLKSOURCE Position */ #define SysTick_CTRL_CLKSOURCE_Msk (1ul SysTick_CTRL_CLKSOURCE_Pos) /*! SysTick CTRL: CLKSOURCE Mask */ #define SysTick_CTRL_TICKINT_Pos 1 /*! SysTick CTRL: TICKINT Position */ #define SysTick_CTRL_TICKINT_Msk (1ul SysTick_CTRL_TICKINT_Pos) /*! SysTick CTRL: TICKINT Mask */ #define SysTick_CTRL_ENABLE_Pos 0 /*! SysTick CTRL: ENABLE Position */ #define SysTick_CTRL_ENABLE_Msk (1ul SysTick_CTRL_ENABLE_Pos) /*! SysTick CTRL: ENABLE Mask */ /* SysTick Reload Register Definitions */ #define SysTick_LOAD_RELOAD_Pos 0 /*! SysTick LOAD: RELOAD Position */ #define SysTick_LOAD_RELOAD_Msk (0xFFFFFFul SysTick_LOAD_RELOAD_Pos) /*! SysTick LOAD: RELOAD Mask */ /* SysTick Current Register Definitions */ #define SysTick_VAL_CURRENT_Pos 0 /*! SysTick VAL: CURRENT Position */ #define SysTick_VAL_CURRENT_Msk (0xFFFFFFul SysTick_VAL_CURRENT_Pos) /*! SysTick VAL: CURRENT Mask */ /* SysTick Calibration Register Definitions */ #define SysTick_CALIB_NOREF_Pos 31 /*! SysTick CALIB: NOREF Position */ #define SysTick_CALIB_NOREF_Msk (1ul SysTick_CALIB_NOREF_Pos) /*! SysTick CALIB: NOREF Mask */ #define SysTick_CALIB_SKEW_Pos 30 /*! SysTick CALIB: SKEW Position */ #define SysTick_CALIB_SKEW_Msk (1ul SysTick_CALIB_SKEW_Pos) /*! SysTick CALIB: SKEW Mask */ #define SysTick_CALIB_TENMS_Pos 0 /*! SysTick CALIB: TENMS Position */ #define SysTick_CALIB_TENMS_Msk (0xFFFFFFul SysTick_VAL_CURRENT_Pos) /*! SysTick CALIB: TENMS Mask */SysTick 主要包含四个寄存器CTRL控制与状态寄存器仅有部分位有效。第 16 位COUNTFLAG每次计数器从 1 递减到 0 时由硬件置 1软件通过读CTRL寄存器时读到该位为 1表示“本周期到 0 过一次”读出该位的同时会自动清 0下次需要再次等到 0 才会重新置 1。工程中常见用法为轮询COUNTFLAG实现“每 N 个时钟周期触发一次”的轮询式延时就像本例的SysTick_Delay_us/ms所做的那样。第 2 位CLKSOURCE时钟源选择位。设置为 0 时时钟频率 AHB 总线时钟 / 8若 AHB 为 72MHz则 SysTick 时钟为 9MHz设置为 1 时时钟频率直接等于 AHB 总线时钟72MHz。对于 F103如果系统时钟 72MHz、AHB 不再分频则 SysTick 时钟要么是 72MHz要么是 9MHz。参考 STM32 时钟树系统时钟经 AHB 预分频后可选择是否 8 分频后提供给 Cortex 系统定时器。第 1 位TICKINT中断使能位。设置为 0 时禁止中断只是置位COUNTFLAG设置为 1 时使能中断当计数器递减到 0 时会产生SysTick 中断请求。第 0 位ENABLE定时器使能位。设置为 0 时关闭定时器设置为 1 时使能启动定时器。四、定时时间计算定时时间T指的是计数器完成一个完整计数循环从重装载值递减到 0所需的时间。它取决于时钟频率CLK和重装载值RELOAD。计算公式为T reload × (1/CLK)其中CLK 可以是 72MHz 或 9MHz由 CTRL 寄存器的 CLKSOURCE 位决定RELOAD 是用户配置的 24 位值。举例说明当 CLK 72MHz 时当 CLK 72MHz 时若设置 RELOAD 72则 T72 × (1/72MHz)0.000001秒 1 微秒 (us)。当 CLK 72MHz 时若设置 RELOAD 72000则 T72000 × (1/72MHz)0.001秒 1 毫秒 (ms)。时间单位换算​ 1秒(s) 1000毫秒(ms) 1,000,000微秒(us) 1,000,000,000纳秒(ns)。在实际编程中微秒级延时常用于精确时序控制但若采用中断方式实现微秒延时会因频繁进入中断而影响程序效率。因此对于一般应用毫秒级延时更为常用和实用。例如要实现 1 秒的延时可以设置产生 1ms 的中断然后在中断服务程序中计数 1000 次。五、固件库中的 SysTick在 STM32 固件库中SysTick 作为内核外设其寄存器定义通常在core_cm3.h或对应内核的头文件中。相关的库函数也在该头文件或对应的源文件中定义。关键的寄存器定义包括SysTick-CTRL(控制与状态寄存器)SysTick-LOAD(重装载值寄存器)SysTick-VAL(当前值寄存器)SysTick-CALIB(校准值寄存器较少使用)常用的固件库函数是SysTick_Config(uint32_t ticks)该函数会检查传入的ticks参数是否超过重装载寄存器的最大值2^24 - 1。将ticks值设置到 LOAD 寄存器。初始化 SysTick 计数器并将其清零。配置中断优先级。使能 SysTick 定时器和其中断。结合代码详解固件库中的 SysTick你在笔记中引用的SysTick_Config、NVIC_SetPriority、__NVIC_PRIO_BITS在本工程core_cm3.h中确实是这样定义的1.__NVIC_PRIO_BITS宏定义// 文件: 19-systick/Libraries/CMSIS/core_cm3.h (第97-99行附近) #ifndef __NVIC_PRIO_BITS #define __NVIC_PRIO_BITS 4 /*! standard definition for NVIC Priority Bits */ #endif含义本内核实现了 4 位中断优先级位因此中断优先级数值范围为 0~15。这 4 位既适用于内核中断通过 SCB-SHP也适用于外设中断通过 NVIC-IP。2.NVIC_SetPriority函数// 文件: 19-systick/Libraries/CMSIS/core_cm3.h (第1586-1592行附近) static __INLINE void NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) { if(IRQn 0) { SCB-SHP[((uint32_t)(IRQn) 0xF)-4] ((priority (8 - __NVIC_PRIO_BITS)) 0xff); } /* set Priority for Cortex-M3 System Interrupts */ else { NVIC-IP[(uint32_t)(IRQn)] ((priority (8 - __NVIC_PRIO_BITS)) 0xff); } /* set Priority for device specific Interrupts */ }逐句解释IRQn 0中断号为负表示这是内核中断比如 SysTick、PendSV、SVCall 等。对应的优先级寄存器是SCB-SHP[x]System Handler Priority Registers。((uint32_t)(IRQn) 0xF)-4用来把负的中断号映射到 0~11 范围的 SHP 数组下标。IRQn 0表示这是片上外设中断使用NVIC-IP[]数组设置优先级。priority (8 - __NVIC_PRIO_BITS)NVIC 的每个优先级字段在 8 位中只实现了高__NVIC_PRIO_BITS位这里是 4 位低位保留不用。因此需要把用户传入的 4 位priority左移到高位比如priority 0x0F→ 寄存器中写入0xF0。 0xff保证只写入 8 位数据防御性写法。这段和同后文中“内核中断优先级 vs 外设中断优先级”以及“4 位优先级数值”的解释完全对应。3.SysTick_Config函数// 文件: 19-systick/Libraries/CMSIS/core_cm3.h (第1694-1704行附近) static __INLINE uint32_t SysTick_Config(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_TICKINT_Msk | SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ return (0); /* Function successful */ }详细注释版逻辑解释if (ticks SysTick_LOAD_RELOAD_Msk) return (1);SysTick_LOAD_RELOAD_Msk 0xFFFFFF若用户传入的ticks超出 24 位范围说明无法装入 RELOAD直接返回 1 表示错误。SysTick-LOAD (ticks SysTick_LOAD_RELOAD_Msk) - 1;把有效的 24 位ticks值写入 RELOAD。之所以减 1是因为硬件的计数范围是从这个值计到 0总共会经历LOAD 1个计数周期。例如希望产生 72 个周期则应写入 71。NVIC_SetPriority (SysTick_IRQn, (1__NVIC_PRIO_BITS) - 1);设置 SysTick 的中断优先级为 0x0F四位全 1即最低优先级。这印证了你的笔记SysTick_Config 默认把 SysTick 优先级设置为最低不是“天然最高”。SysTick-VAL 0;清空当前计数值保证重新开始计数且清除COUNTFLAG。SysTick-CTRL SysTick_CTRL_CLKSOURCE_Msk | SysTick_CTRL_TICKINT_Msk | SysTick_CTRL_ENABLE_Msk;CLKSOURCE 1时钟源选择 AHB对于 F103 即 72MHz。TICKINT 1使能中断。ENABLE 1启动计数器。六、中断优先级配置详解SysTick 的中断优先级配置是一个需要特别注意的重点也是容易产生误解的地方。下面将从优先级表示、配置寄存器、分组影响、比较规则及常见误区等方面进行详细说明。1. 优先级表示与配置寄存器优先级表示在 STM32 中无论是内核外设如 SysTick还是片上外设如 GPIO、USART其中断优先级都是用4 个二进制位来表示的数值范围为 0-150为最高15为最低。配置寄存器不同片上外设的中断优先级配置在NVIC_IPRx​ 寄存器组中。内核外设如 SysTick、PendSV的中断优先级则配置在系统控制块 (SCB)​ 的SHPRxSystem Handler Priority Registers寄存器中。例如SysTick 的中断中断号为 -1优先级对应SHPR3 寄存器的 Bit31:Bit24​ 这个8位字段的高4位。正因为配置寄存器不同所以不能使用配置外设中断的NVIC_Init函数来配置 SysTick 的优先级而应使用NVIC_SetPriority函数。2. 优先级分组的影响与比较规则优先级分组的影响中断优先级分组通过SCB-AIRCR寄存器的PRIGROUP字段设置不仅对片上外设有效同样对内核外设也有效。它决定了4位优先级数值中多少位表示抢占优先级Preemption Priority多少位表示子优先级Subpriority。例如分组2表示高2位为抢占优先级低2位为子优先级。比较规则当比较内核外设如 SysTick与片上外设的中断优先级时需要遵循以下统一规则首先比较抢占优先级。抢占优先级数值小的中断可以打断抢占优先级数值大的正在执行的中断。如果抢占优先级相同则比较子优先级。子优先级数值小的中断优先执行。如果抢占优先级和子优先级都相同则比较它们的硬件中断编号在中断向量表中的位置。编号越小的中断其自然优先级越高。SysTick 的中断编号-1非常靠前这意味着在软件优先级相同的情况下它的自然优先级高于许多片上外设。3. 关键认识与常见误区纠正最关键的认识SysTick不是“天生最高优先级”它的优先级可以设得比外设低。在本工程中因为用的是库函数SysTick_Config其默认优先级为 0x0F即15是最低优先级所以完全可以被任意设置为更高优先级数值更小的外设中断打断。常见误区纠正误区内核外设的中断优先级一定高于片上外设。纠正并非如此。例如如果用户将一个片上外设的中断优先级设置为 0x02二进制0010而SysTick保持默认的0x0F二进制1111且中断优先级分组设置为2即高2位是抢占优先级。那么片上外设的抢占优先级是000而SysTick的抢占优先级是113。由于0 3因此这个片上外设中断可以打断SysTick中断。关键在于正确理解并统一用优先级分组规则来解析和比较它们各自的4位优先级数值。4. 工程应用与总结后续实验工程中并没有真正使用 SysTick 中断而是通过轮询COUNTFLAG来实现延时因此SysTick_Config中配置的中断优先级在当前实验里不影响功能但理解它对以后写系统“滴答时基”如RTOS或系统心跳至关重要。理解这一点对于构建稳定的系统非常重要特别是在使用 SysTick 作为系统时钟基准并同时处理其他中断的应用程序中。如果配置不当可能会导致时序错乱或中断响应不及时。开发者需要根据实际应用需求合理配置 SysTick 及其他外设的中断优先级。
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

东风地区网站建设公司网站关键词google优化怎么做

博主介绍 💗博主介绍:✌全栈领域优质创作者,专注于Java、小程序、Python技术领域和计算机毕业项目实战✌💗 👇🏻 精彩专栏 推荐订阅👇🏻 2025-2026年最新1000个热门Java毕业设计选题…

张小明 2026/1/10 3:43:37 网站建设

网页游戏网站模压板网站建站系统有哪些

在当今多媒体时代,一个功能强大且易于定制的视频播放器对于网站和应用程序至关重要。Moovie.js作为一个专为电影设计的HTML5视频播放器,凭借其丰富的功能和灵活的配置选项,正在成为开发者的首选解决方案。 【免费下载链接】moovie.js Movie f…

张小明 2026/1/10 3:43:35 网站建设

如何免费开自己的网站如何利用网站模板

gsplat实战:鱼眼相机渲染配置与性能优化全解析 【免费下载链接】gsplat CUDA accelerated rasterization of gaussian splatting 项目地址: https://gitcode.com/GitHub_Trending/gs/gsplat 在3D高斯溅射渲染领域,gsplat凭借其高效的CUDA加速能力…

张小明 2026/1/10 3:43:33 网站建设

17. 整个网站建设中的关键是可以做国外购物的网站有哪些

如何提高TensorFlow模型的泛化能力? 在工业界,一个深度学习模型上线后的表现往往比它在训练集上的准确率更重要。我们见过太多这样的案例:模型在实验室里表现惊艳,准确率高达98%,可一旦投入真实业务场景,面…

张小明 2026/1/10 3:43:31 网站建设

叶榭做网站dede网站怎么做404页面

字节跳动发布ByteFF2:AI极化力场重构药物与新材料研发范式 【免费下载链接】byteff2 项目地址: https://ai.gitcode.com/hf_mirrors/ByteDance-Seed/byteff2 导语 字节跳动推出AI驱动的极化力场模型ByteFF2(ByteFF-Pol),…

张小明 2026/1/10 3:43:29 网站建设

郑州网站制作公司汉狮wordpress图片发布火车头

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容: 生成一个快速体验JDK17的技术方案文档,包含以下无需安装的方法:1) 使用Docker临时容器运行JDK17;2) 通过Web版VS Code在线编译;3) 利…

张小明 2026/1/10 3:43:28 网站建设