<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>不知名LZJ的博客</title>
        <link>https://www.mcoi.top/</link>
        <description>分享技术与经历 | 学习嵌入式ing</description>
        <lastBuildDate>Wed, 16 Sep 2026 06:16:50 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>zh-CN</language>
        <copyright>All rights reserved 2026, L_Z_J</copyright>
        <item>
            <title><![CDATA[STM32-HAL库学习笔记]]></title>
            <link>https://www.mcoi.top/article/Post-stm32-hal</link>
            <guid>https://www.mcoi.top/article/Post-stm32-hal</guid>
            <pubDate>Tue, 01 Oct 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[学习STM32HAL库笔记]]></description>
            <content:encoded><![CDATA[<div id="notion-article" class="mx-auto overflow-hidden "><main class="notion light-mode notion-page notion-block-2a9e940c69bb80cb9db7d32dd8e45ba1"><div class="notion-viewport"></div><div class="notion-collection-page-properties"></div><div class="notion-callout notion-gray_background_co notion-block-2a9e940c69bb80ed8c91cc584c634834"><div class="notion-page-icon-inline notion-page-icon-span"><span class="notion-page-icon" role="img" aria-label="😀">😀</span></div><div class="notion-callout-text">一个简单的开头</div></div><details class="notion-toggle notion-block-2a9e940c69bb81b9b7d6fd0c8a65fb0b"><summary><h2 class="notion-h notion-h1 notion-h-indent-0 notion-block-2a9e940c69bb81b9b7d6fd0c8a65fb0b" data-id="2a9e940c69bb81b9b7d6fd0c8a65fb0b"><span><div id="2a9e940c69bb81b9b7d6fd0c8a65fb0b" class="notion-header-anchor"></div><span class="notion-h-title">介绍</span></span></h2></summary><div><div class="notion-text notion-block-2a9e940c69bb81379a42fd6a118c5f33">此笔记为观看B站UP：超子说物联网所写，感谢老师。老师的架构真的特别好！</div><div class="notion-text notion-block-2a9e940c69bb817db391cc61aca38f51">我在学习HAL库之前有标准库基础，所以学习稍快，但会尽量详细记录</div><div class="notion-text notion-block-2a9e940c69bb810b97a4d446eb19b7b0"><b>笔记和项目文件在gitee开源了</b></div><div class="notion-text notion-block-2a9e940c69bb8188a4eedf0e5e3509cc"><b>大家可以在</b><b><a class="notion-link" href="https://gitee.com/Xiao____liu/sm32--hal" target="_blank" rel="noopener noreferrer">我的gitee仓库</a></b><b> 中下载笔记源文件、STM32F1C8T6资料等</b></div><div class="notion-text notion-block-2a9e940c69bb817885c5d49912cc2a7e"><b>笔记源文件可以在Notion中导入</b></div><div class="notion-text notion-block-2a9e940c69bb814297e3f5f0fd7ae308">正在更新~</div><blockquote class="notion-quote notion-block-2a9e940c69bb813db77fce2425e8c225"><div>超子物联网 HAL库学习
写作不易，如果您觉得写的不错，欢迎给博主来一波点赞、收藏~让博主更有动力吧！</div></blockquote><details class="notion-toggle notion-block-2a9e940c69bb815d9a45d334a3b3ecda"><summary><h2 class="notion-h notion-h1 notion-block-2a9e940c69bb815d9a45d334a3b3ecda" data-id="2a9e940c69bb815d9a45d334a3b3ecda"><span><div id="2a9e940c69bb815d9a45d334a3b3ecda" class="notion-header-anchor"></div><span class="notion-h-title">内容导航</span></span></h2></summary><div><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb81958844ebd59c9d5a08"><li><a class="notion-link" href="https://blog.csdn.net/L_Z_J_I/article/details/143312537?sharetype=blogdetail&amp;sharerId=143312537&amp;sharerefer=PC&amp;sharesource=L_Z_J_I&amp;spm=1011.2480.3001.8118" target="_blank" rel="noopener noreferrer">超子物联网HAL库笔记：准备篇</a></li></ul><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb81c19403f752d92cddea"><li><a class="notion-link" href="https://blog.csdn.net/L_Z_J_I/article/details/143312804?sharetype=blogdetail&amp;sharerId=143312804&amp;sharerefer=PC&amp;sharesource=L_Z_J_I&amp;spm=1011.2480.3001.8118" target="_blank" rel="noopener noreferrer">超子物联网HAL库笔记：时钟篇</a></li></ul><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb81f0afd1da1e0f37a5e8"><li><a class="notion-link" href="https://blog.csdn.net/L_Z_J_I/article/details/143312972?spm=1001.2014.3001.5501" target="_blank" rel="noopener noreferrer">超子物联网HAL库笔记：中断处理函数及weak弱声明中断回调函数详解</a></li></ul><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb81d7bb2ad1e8ca9ff7f0"><li><a class="notion-link" href="https://blog.csdn.net/L_Z_J_I/article/details/143313014?spm=1001.2014.3001.5501" target="_blank" rel="noopener noreferrer">超子物联网HAL库笔记：GPIO篇</a></li></ul><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb8180ab3ed2026f9b5da9"><li><a class="notion-link" href="https://blog.csdn.net/L_Z_J_I/article/details/143374811?sharetype=blogdetail&amp;sharerId=143374811&amp;sharerefer=PC&amp;sharesource=L_Z_J_I&amp;spm=1011.2480.3001.8118" target="_blank" rel="noopener noreferrer">超子物联网HAL库笔记：串口篇：多指针定位+循环收发缓冲区方案设计</a></li></ul><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb817b992ed0fc8ee87e64"><li><a class="notion-link" href="https://blog.csdn.net/L_Z_J_I/article/details/143598046?spm=1001.2014.3001.5501" target="_blank" rel="noopener noreferrer">超子物联网HAL库笔记：串口篇</a></li></ul><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb81aca7d8dff1bc88d91d"><li><a class="notion-link" href="https://blog.csdn.net/L_Z_J_I/article/details/143662409?sharetype=blogdetail&amp;sharerId=143662409&amp;sharerefer=PC&amp;sharesource=L_Z_J_I&amp;spm=1011.2480.3001.8118" target="_blank" rel="noopener noreferrer">超子物联网HAL库笔记：定时器[基础定时]篇</a></li></ul></div></details><details class="notion-toggle notion-block-2a9e940c69bb81d2bf81f3c5715f79df"><summary><h2 class="notion-h notion-h1 notion-block-2a9e940c69bb81d2bf81f3c5715f79df" data-id="2a9e940c69bb81d2bf81f3c5715f79df"><span><div id="2a9e940c69bb81d2bf81f3c5715f79df" class="notion-header-anchor"></div><span class="notion-h-title">子页面开头</span></span></h2></summary><div><blockquote class="notion-quote notion-block-2a9e940c69bb816c9732f3bc5f74b201"><div>超子物联网 HAL库学习
汇总入口：<a class="notion-link" href="https://blog.csdn.net/L_Z_J_I/article/details/143312140?sharetype=blogdetail&amp;sharerId=143312140&amp;sharerefer=PC&amp;sharesource=L_Z_J_I&amp;spm=1011.2480.3001.8118" target="_blank" rel="noopener noreferrer">超子物联网HAL库笔记：[汇总]</a>
写作不易，如果您觉得写的不错，欢迎给博主来一波点赞、收藏~让博主更有动力吧！</div></blockquote></div></details><div class="notion-blank notion-block-2a9e940c69bb81748410de22b103aaeb"> </div></div></details><details class="notion-toggle notion-block-2a9e940c69bb8116a675ed0a95a31386"><summary><h2 class="notion-h notion-h1 notion-h-indent-0 notion-block-2a9e940c69bb8116a675ed0a95a31386" data-id="2a9e940c69bb8116a675ed0a95a31386"><span><div id="2a9e940c69bb8116a675ed0a95a31386" class="notion-header-anchor"></div><span class="notion-h-title">准备篇</span></span></h2></summary><div><details class="notion-toggle notion-block-2a9e940c69bb81d09815e72a43d796b0"><summary><h3 class="notion-h notion-h2 notion-block-2a9e940c69bb81d09815e72a43d796b0" data-id="2a9e940c69bb81d09815e72a43d796b0"><span><div id="2a9e940c69bb81d09815e72a43d796b0" class="notion-header-anchor"></div><span class="notion-h-title">1. HAL库简介</span></span></h3></summary><div><div class="notion-text notion-block-2a9e940c69bb8172b313d5498bd46b07"><b>HAL库</b></div><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb81b0b2b6de276d219e1a"><li>HAL库（Hardware Abstraction Layer）是STMicroelectronics提供的STM32微控制器的硬件抽象层库。</li></ul><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb819dabf9e105908f79d7"><li>它通过一套统一的API接口，简化了对STM32外设的配置和操作，使开发者能够更快速地进行嵌入式系统开发，而不必深入了解底层硬件细节。</li></ul><div class="notion-text notion-block-2a9e940c69bb81b88e00cf221b5e959e"><b>HAL库的优点</b></div><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb8129ba9fd8996d78a3ec"><li>高层次抽象：HAL库提供了高层次的抽象接口，简化了对硬件外设的操作。开发者可以通过调用库函数完成复杂的硬件配置，而不必直接操作寄存器。</li></ul><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb817a8daccf82387e3dc7"><li>易于使用：由于提供了丰富的库函数和示例代码，开发者可以快速上手进行开发，减少了开发时间。</li></ul><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb8172b978c3b9eedb0bec"><li>一致性和移植性：HAL库在不同的STM32系列中保持了一致的API接口，增强了代码的移植性和重用性。如果需要更换STM32系列微控制器，代码的修改量较小。</li></ul><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb819ab6eac5f178e05dc3"><li>简化调试：由于HAL库屏蔽了底层的寄存器操作，调试过程中更容易定位和解决问题，减少了开发和维护的复杂性。</li></ul><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb81269a49f7ce6d1e783f"><li>代码维护性好：HAL库的高层次封装和良好的代码结构使得代码更容易维护和更新。</li></ul><div class="notion-text notion-block-2a9e940c69bb8135b6acd73a90141f8d"><b>对比标准固件库的不同</b></div><ol start="1" class="notion-list notion-list-numbered notion-block-2a9e940c69bb81639a26c31db570e905" style="list-style-type:decimal"><li><b>抽象层次：</b></li><ol class="notion-list notion-list-numbered notion-block-2a9e940c69bb81639a26c31db570e905" style="list-style-type:lower-alpha"><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb812a824bc06753a7e71b"><li>标准固件库：直接操作寄存器，提供底层硬件访问，要求开发者对STM32微控制器的寄存器有较深入的理解。</li></ul><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb815f9facd33653c24ab9"><li>HAL库：提供高层次的抽象接口，屏蔽底层寄存器操作，使开发者可以更快速地进行开发。</li></ul></ol></ol><ol start="2" class="notion-list notion-list-numbered notion-block-2a9e940c69bb81edb7d6d8300d24d6c5" style="list-style-type:decimal"><li>代<b>码复杂性：</b></li><ol class="notion-list notion-list-numbered notion-block-2a9e940c69bb81edb7d6d8300d24d6c5" style="list-style-type:lower-alpha"><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb81869d16cfcfcba52359"><li>标准固件库：代码较复杂，涉及大量的寄存器配置，开发者需要处理更多的细节。</li></ul><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb81ada9a8e9e393d4210b"><li>HAL库：代码简洁易读，通过调用库函数进行配置和操作，减少了代码量和复杂性。</li></ul></ol></ol><ol start="3" class="notion-list notion-list-numbered notion-block-2a9e940c69bb81c9b722dc5e602151e2" style="list-style-type:decimal"><li><b>学习曲线：</b></li></ol><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb8128a5b7c6e66dbc9a8e"><li>标准固件库：学习曲线较陡，需要花费较多时间了解和掌握硬件细节。</li></ul><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb81cd8356f0d04c09cf81"><li>HAL库：学习曲线较缓，提供了丰富的示例代码和文档，开发者可以快速上手。</li></ul><ol start="1" class="notion-list notion-list-numbered notion-block-2a9e940c69bb810295a9f63638368a25" style="list-style-type:decimal"><li><b>开发效率：</b></li></ol><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb81eaa8fac9f2e27a722c"><li>标准固件库：适合对性能和功耗有严格要求的项目，但开发和调试时间较长。</li></ul><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb8193b0dfc267b435d6e5"><li>HAL库：提高了开发效率，适合快速开发和原型设计，缩短了开发周期。</li></ul><ol start="1" class="notion-list notion-list-numbered notion-block-2a9e940c69bb81fa9782d6e9ed13a0d3" style="list-style-type:decimal"><li><b>移植性：</b></li></ol><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb8160882ec8030df8c014"><li>标准固件库：不同系列的STM32微控制器之间存在较大的差异，代码移植工作量较大。</li></ul><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb814b904bc45cbd100852"><li>HAL库：提供一致的API接口，增强了代码的移植性和重用性，不同系列之间的移植工作量较小。</li></ul></div></details><details class="notion-toggle notion-block-2a9e940c69bb81ffbddfd4a3bda28e06"><summary><h3 class="notion-h notion-h2 notion-block-2a9e940c69bb81ffbddfd4a3bda28e06" data-id="2a9e940c69bb81ffbddfd4a3bda28e06"><span><div id="2a9e940c69bb81ffbddfd4a3bda28e06" class="notion-header-anchor"></div><span class="notion-h-title">2. 创建HAL库工程模板</span></span></h3></summary><div><details class="notion-toggle notion-block-2a9e940c69bb81f9b1a8fcec5ed17b09"><summary><h4 class="notion-h notion-h3 notion-block-2a9e940c69bb81f9b1a8fcec5ed17b09" data-id="2a9e940c69bb81f9b1a8fcec5ed17b09"><span><div id="2a9e940c69bb81f9b1a8fcec5ed17b09" class="notion-header-anchor"></div><span class="notion-h-title">1. 制作文件模板</span></span></h4></summary><div><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb81409a89f037ef605585"><li>先找一个位置，存放工程模板</li></ul><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb812fa8f9ef8cca922ca4"><li>在工程模板中  添加 User、Library 、 Hardware 、 CMSIS  文件夹：</li><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb812fa8f9ef8cca922ca4"><li><b>User：</b></li><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb8174ae80f521ce13c39a"><li>main.c</li></ul><li><b>Library：</b></li><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb8160aca0ef6945f9fbb0"><li>Include</li><li>Source</li></ul><li><b>Hardware：</b></li><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb81338f27fcb53f8219f5"><li>Include</li><li>Source</li></ul><li><b>CMSIS ：</b></li><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb81a2a8ddd8d3786e5ade"><li>Include</li><li>Source</li></ul></ul></ul><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb8143bd55d5e4cdd6f7e8"><li>下载HAL库 源码 <a class="notion-link" href="https://www.st.com.cn/zh/embedded-software/stm32cube-mcu-mpu-packages/products.html" target="_blank" rel="noopener noreferrer">STM32Cube MCU和MPU包: 相关产品</a></li></ul><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb81149319d7e51178f554"><li>解压并打开</li></ul><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb81088f7ae38125095e17"><li><b>拷贝HAL库（Library）</b></li><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb81088f7ae38125095e17"><ol start="1" class="notion-list notion-list-numbered notion-block-2a9e940c69bb8149a6cec9a64f2d98fa" style="list-style-type:decimal"><li>进入<code class="notion-inline-code">\STM32Cube_FW_F1_V1.8.0\Drivers\STM32F1xx_HAL_Driver</code> 
把头文件夹 Inc 和源文件夹 Src 移动到自己的<span class="notion-teal"><b>Library</b></span><span class="notion-default"><b>的对应的</b></span>文件中</li></ol></ul></ul><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb81ba872ec8bce512b188"><li><b>拷贝启动文件（CMSIS\Include）</b></li><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb81ba872ec8bce512b188"><ol start="1" class="notion-list notion-list-numbered notion-block-2a9e940c69bb816e8f37fe1ef21e9b2b" style="list-style-type:decimal"><li>先进入内核文件<code class="notion-inline-code">\STM32Cube_FW_F1_V1.8.0\Drivers\CMSIS</code></li></ol><ol start="2" class="notion-list notion-list-numbered notion-block-2a9e940c69bb81c5bdb9e23f4bea1441" style="list-style-type:decimal"><li>进入头文件<code class="notion-inline-code">\CMSIS\Include</code>
把所有文件拷贝到自己的<span class="notion-pink"><b>CMSIS/Include</b></span>文件中
再进入<code class="notion-inline-code">\CMSIS\Device\ST\STM32F1xx\Include</code> 
把所有文件拷贝到自己的<span class="notion-pink"><b>CMSIS/Include</b></span>文件中</li></ol></ul></ul><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb812a829be58ffb60da16"><li><b>拷贝源文件（CMSYS\Source）</b></li><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb812a829be58ffb60da16"><ol start="1" class="notion-list notion-list-numbered notion-block-2a9e940c69bb81ef901fe914ac626a60" style="list-style-type:decimal"><li>进入<code class="notion-inline-code">\STM32Cube_FW_F1_V1.8.0\Drivers\CMSIS\Device\ST\STM32F1xx\Source\Templates</code></li></ol><ol start="2" class="notion-list notion-list-numbered notion-block-2a9e940c69bb81b1a1e6d6a238403352" style="list-style-type:decimal"><li>把<code class="notion-inline-code">\Templates</code> 文件的的system_stm32f1xx.c拷贝到自己的<span class="notion-blue"><b>CMSIS/Source</b></span>文件中</li></ol><ol start="3" class="notion-list notion-list-numbered notion-block-2a9e940c69bb8124b137c0eeb1597cd3" style="list-style-type:decimal"><li>再进入/arm文件下，把所有文件拷贝到自己的<span class="notion-blue"><b>CMSIS/Source</b></span>文件中</li></ol></ul></ul><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb81f58b0be0a9364fb609"><li>编辑Hardware文件夹</li><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb81f58b0be0a9364fb609"><div class="notion-text notion-block-2a9e940c69bb81b3a31ae94a10bc50a0">分别在源文件家和头文件夹添加stm32f1xx_it.c 和stm32f1xx_it.h
代码如下</div></ul></ul><details class="notion-toggle notion-block-2a9e940c69bb818baf05e176443f3a5b"><summary><h4 class="notion-h notion-h3 notion-block-2a9e940c69bb818baf05e176443f3a5b" data-id="2a9e940c69bb818baf05e176443f3a5b"><span><div id="2a9e940c69bb818baf05e176443f3a5b" class="notion-header-anchor"></div><span class="notion-h-title">stm32f1xx_it.c</span></span></h4></summary><div></div></details><details class="notion-toggle notion-block-2a9e940c69bb812fa9fbe2eae023450b"><summary><h4 class="notion-h notion-h3 notion-block-2a9e940c69bb812fa9fbe2eae023450b" data-id="2a9e940c69bb812fa9fbe2eae023450b"><span><div id="2a9e940c69bb812fa9fbe2eae023450b" class="notion-header-anchor"></div><span class="notion-h-title">stm32f1xx_it.h</span></span></h4></summary><div></div></details></div></details></div></details><blockquote class="notion-quote notion-block-46dac12614604d0287780e5be772dc42"><div><b>最后需要把自己的</b><span class="notion-teal"><b>Library</b></span><b>文件中的Include 文件中的stm32f1xx_hal_conf_template.h 更名为  stm32f1xx_hal_conf.h 。否则编译会找不到这个头文件 </b></div></blockquote><details class="notion-toggle notion-block-2571d7ad677247d89510e8cfc5357331"><summary><h4 class="notion-h notion-h3 notion-block-2571d7ad677247d89510e8cfc5357331" data-id="2571d7ad677247d89510e8cfc5357331"><span><div id="2571d7ad677247d89510e8cfc5357331" class="notion-header-anchor"></div><span class="notion-h-title">文件结构</span></span></h4></summary><div><details class="notion-toggle notion-block-8ba056b58b7d40b7aa95ec46bc1082fc"><summary><h4 class="notion-h notion-h3 notion-block-8ba056b58b7d40b7aa95ec46bc1082fc" data-id="8ba056b58b7d40b7aa95ec46bc1082fc"><span><div id="8ba056b58b7d40b7aa95ec46bc1082fc" class="notion-header-anchor"></div><span class="notion-h-title">2. Keil 创建工程</span></span></h4></summary><div><ol start="1" class="notion-list notion-list-numbered notion-block-9cf770a71a5c436691629365fec19c7d" style="list-style-type:decimal"><li><b>创建工程、选择User为目录。</b></li></ol><ol start="2" class="notion-list notion-list-numbered notion-block-1d4444902827484cb7cb53044c4fdbd8" style="list-style-type:decimal"><li><b>点击木箱子设置分组</b></li><ol class="notion-list notion-list-numbered notion-block-1d4444902827484cb7cb53044c4fdbd8" style="list-style-type:lower-alpha"><ul class="notion-list notion-list-disc notion-block-2a33c64597a945f4b72e4bd5f9090997"><li>User 、 Library 、 Hardware 、 CMSIS </li></ul></ol></ol><ol start="3" class="notion-list notion-list-numbered notion-block-bd9e3cba120049b2abf4b5ee4b557289" style="list-style-type:decimal"><li><b>导入文件</b></li><ol class="notion-list notion-list-numbered notion-block-bd9e3cba120049b2abf4b5ee4b557289" style="list-style-type:lower-alpha"><ul class="notion-list notion-list-disc notion-block-ca5e780929a54d9c998213c9e613e2f9"><li>这里只导入必备的。以后用哪个再加那个</li></ul><ul class="notion-list notion-list-disc notion-block-fe2a1b939b4243469d3d793419a9be70"><li><b>Library：</b></li><ul class="notion-list notion-list-disc notion-block-fe2a1b939b4243469d3d793419a9be70"><li>stm32f1xx_hal.c</li><li>stm32f1xx_hal_cortex.c</li><li>stm32f1xx_hal_gpio.c</li><li>stm32f1xx_hal_gpio_ex.c</li><li>stm32f1xx_hal_rcc.c</li><li>stm32f1xx_hal_rcc_ex.c</li></ul></ul><ul class="notion-list notion-list-disc notion-block-b3e289f521bb4e11a60efd893b2fd4f6"><li><b>CNSIS：</b></li><ul class="notion-list notion-list-disc notion-block-b3e289f521bb4e11a60efd893b2fd4f6"><li>system_stm32f1xx.c</li><li>startup_stm32f103xb.s</li></ul></ul><ul class="notion-list notion-list-disc notion-block-da5e67c2a5ad4091a122d348d12b6c47"><li>User：</li><ul class="notion-list notion-list-disc notion-block-da5e67c2a5ad4091a122d348d12b6c47"><li>main.c</li></ul></ul></ol></ol><ol start="4" class="notion-list notion-list-numbered notion-block-9ed6baa5d4e24aae89276e8832949bde" style="list-style-type:decimal"><li><b>在魔术棒中设置：</b></li><ol class="notion-list notion-list-numbered notion-block-9ed6baa5d4e24aae89276e8832949bde" style="list-style-type:lower-alpha"><div class="notion-text notion-block-6df50918228d4cc4bed6fe921295e690"><b>C/C++中：</b>
在Define输入STM32F103xB   (目的是通知编译器我们用的是xb)
添加头文件路径（Hardware、CMSIS、Library）。以后有别的添加则再添加。
<b>Target中：</b></div><div class="notion-text notion-block-5107112bdb444abea012ab6ce3c943be">选择ARM编译器为v6.16  否则会报错</div></ol></ol><ol start="5" class="notion-list notion-list-numbered notion-block-5d5c9d8089964add84b86315013bcc4e" style="list-style-type:decimal"><li>在main.c中引入头文件stm32f1xx_hal.h （在hal.c中可找到）</li></ol><ol start="6" class="notion-list notion-list-numbered notion-block-3774e0de1e4c4c06baee988bf714a39c" style="list-style-type:decimal"><li>最后编译即可。0错误0警告</li></ol></div></details><details class="notion-toggle notion-block-4dcde5b582c54cb5aad9a70f5db2c2ee"><summary><h3 class="notion-h notion-h2 notion-block-4dcde5b582c54cb5aad9a70f5db2c2ee" data-id="4dcde5b582c54cb5aad9a70f5db2c2ee"><span><div id="4dcde5b582c54cb5aad9a70f5db2c2ee" class="notion-header-anchor"></div><span class="notion-h-title"><b>3. HAL库结构初步分析</b></span></span></h3></summary><div><ul class="notion-list notion-list-disc notion-block-0caa107ce2184764befb089588d5d83b"><li><b>以HAL库的串口为例来讲解</b></li><ul class="notion-list notion-list-disc notion-block-0caa107ce2184764befb089588d5d83b"><ol start="1" class="notion-list notion-list-numbered notion-block-4a3366a4a1f14018a5c2e4aed4d9bca3" style="list-style-type:decimal"><li>串口分为USART和UART  他们分别是同步通信和异步通信。一般我们用异步的</li><ol class="notion-list notion-list-numbered notion-block-4a3366a4a1f14018a5c2e4aed4d9bca3" style="list-style-type:lower-alpha"><div class="notion-text notion-block-68f639e520ac4e75bb49f1b340c075bf"><b>所以这里我们添加uart.c的文件。</b></div></ol></ol><ol start="2" class="notion-list notion-list-numbered notion-block-84388181bed14b9387625bbb991327d1" style="list-style-type:decimal"><li>hal库之中，串口包含三种方式： 轮询、中断、DMA。所以在库文件中必须添加DMA<b>库</b></li><ol class="notion-list notion-list-numbered notion-block-84388181bed14b9387625bbb991327d1" style="list-style-type:lower-alpha"><div class="notion-text notion-block-75e2e3fc31124e50a5cdebaa879c8f2a"><b>所以我们这里添加DMA.c的文件</b></div></ol></ol></ul></ul><ul class="notion-list notion-list-disc notion-block-1ece40de82bd435d859f89c250157d5b"><li>在HAL库中每个外设都有两个关键的部分：</li><ul class="notion-list notion-list-disc notion-block-1ece40de82bd435d859f89c250157d5b"><ol start="1" class="notion-list notion-list-numbered notion-block-4929668f209343e2aca6cb2c99a3bf42" style="list-style-type:decimal"><li>Private：（私有的），是HAL库内部自己调用的</li></ol><ol start="2" class="notion-list notion-list-numbered notion-block-52d775524d364b4b88a7e3fccb4b0807" style="list-style-type:decimal"><li>Exported：（对外的），我们的应用程序中去调用。Exported分为四个部分</li><ol class="notion-list notion-list-numbered notion-block-52d775524d364b4b88a7e3fccb4b0807" style="list-style-type:lower-alpha"><ul class="notion-list notion-list-disc notion-block-42113bc4d2ec47128279f147ca109969"><li>types，各种Struct结构体，用于外设功能配置。对应了CubeMax软件的配置项</li></ul><ul class="notion-list notion-list-disc notion-block-524bae871c844b5ab55eac6c7ebc3178"><li>constants，上方各种Struct结构体中的成员的可以配置的选项</li></ul><ul class="notion-list notion-list-disc notion-block-99ab3a5911fc45008d95f1bc8156c748"><li>macro，宏定义，相当于直接对寄存器操作。因为在某些时候调用api反而效率不高</li></ul><ul class="notion-list notion-list-disc notion-block-0285555d72c749fc8875fb59884ce8b8"><li>functions，API函数。</li></ul></ol></ol><div class="notion-text notion-block-5e2c5811fbc94b19bc5251770522bac2">这些是可以在文件中验证的。hal_uart.c中 可见</div><div class="notion-text notion-block-99dc6aa3f1af4e65945274623c45f043">我们对CubeMax的操作，实际上就是与这些结构体、成员变量一一对应的</div><div class="notion-text notion-block-07e9608ac3a74906bd75bcd9f57b2e9e">一个外设的相关结构体会被定义在一个总的结构体中。比如串口是UART_HandleTypedef</div></ul></ul></div></details><div class="notion-blank notion-block-07d03c246fcb4892b9a92fb138747148"> </div></div></details></div></details><details class="notion-toggle notion-block-dd557ae374aa4697a6c7cae2bb4a97d8"><summary><h2 class="notion-h notion-h1 notion-h-indent-0 notion-block-dd557ae374aa4697a6c7cae2bb4a97d8" data-id="dd557ae374aa4697a6c7cae2bb4a97d8"><span><div id="dd557ae374aa4697a6c7cae2bb4a97d8" class="notion-header-anchor"></div><span class="notion-h-title">时钟篇</span></span></h2></summary><div><details class="notion-toggle notion-block-973482b9c37a47bcba3131549ba71d71"><summary><h3 class="notion-h notion-h2 notion-block-973482b9c37a47bcba3131549ba71d71" data-id="973482b9c37a47bcba3131549ba71d71"><span><div id="973482b9c37a47bcba3131549ba71d71" class="notion-header-anchor"></div><span class="notion-h-title">1. 汇编启动文件调用SystemInit对时钟的配置内容</span></span></h3></summary><div><div class="notion-text notion-block-11313c614cbd4546a218ea79b4e0fde0">汇编的启动文件（.s结尾的那个）在每次复位时，都是先调用SystemInit函数去配置时钟。
默认的最终时钟是 使用的是内部的HSI  内部高速时钟 8MHZ</div><ul class="notion-list notion-list-disc notion-block-919a396f172046238263b605dc701818"><li>SystemInit首先会设置CR寄存器（时钟控制寄存器）把位0置1（使用内部高速时钟）。</li></ul><ul class="notion-list notion-list-disc notion-block-1bf38fb698a84d398ceccb37816f42a5"><li>然后会去设置CFGR寄存器，主要是设置路径，以及倍频之类的东西</li></ul></div></details><details class="notion-toggle notion-block-41e5f695b0f84d088a64dbfec0936d0c"><summary><h3 class="notion-h notion-h2 notion-block-41e5f695b0f84d088a64dbfec0936d0c" data-id="41e5f695b0f84d088a64dbfec0936d0c"><span><div id="41e5f695b0f84d088a64dbfec0936d0c" class="notion-header-anchor"></div><span class="notion-h-title">2. HAL库输出内部时钟HSI</span></span></h3></summary><div><div class="notion-text notion-block-39f22ba2bb0e476b95b0d5638bfa6202">我们可以调用<code class="notion-inline-code">HAL_RCC_MCOConfig</code> 来把时钟输出8MHZ的方波到默认的PA8上验证一下。</div><div class="notion-text notion-block-7b3e0ddef61249c98d5bbd955d772400">在使用HAL库前要用HAL_Init()初始化一下。</div><div class="notion-text notion-block-66c4e2cb1c06492cbb2076b237c7951d"><b>main.c</b></div><div class="notion-text notion-block-f0cab72a45404374a70edd1a55de3db2">HAL_Init();//初始化HAL库</div><div class="notion-text notion-block-175ab0cc99fa4cdeb0530c7e9d0a5fdf">HAL_RCC_MCOConfig(RCC_MCO1,RCC_MCO1SOURCE_SYSCLK,RCC_MCODIV_1);//PA8引脚输出、系统时钟、不分频</div><div class="notion-text notion-block-f7581597464148c4bcc46a4d356a5c70">所以仅仅需要这两行就可以输出时钟了。示波器验证正确。</div><div class="notion-blank notion-block-c6102e49a4e54ecebd84c339cecdd595"> </div></div></details></div></details><details class="notion-toggle notion-block-ab8c19ce8b9f41688cf86aae71adf2f7"><summary><h3 class="notion-h notion-h2 notion-h-indent-1 notion-block-ab8c19ce8b9f41688cf86aae71adf2f7" data-id="ab8c19ce8b9f41688cf86aae71adf2f7"><span><div id="ab8c19ce8b9f41688cf86aae71adf2f7" class="notion-header-anchor"></div><span class="notion-h-title">3. 使用内部HSI时钟通过PLL倍频到64MHZ</span></span></h3></summary><div><div class="notion-text notion-block-deb0f39b8f834f53b2e1a45c5feecae6"><b>注意</b></div><ul class="notion-list notion-list-disc notion-block-a96891c98d05487a922197da036e9475"><li>APB1最大时钟为36MHZ</li></ul><ul class="notion-list notion-list-disc notion-block-a88bc69b6e514dbba452e3effa709608"><li>APB2最大时钟为72MHZ</li></ul><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-67aee50b3c934f51ad8b71b43d065d14"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:100%;max-width:100%;flex-direction:column"><img style="object-fit:cover" src="https://cdn.jsdmirror.com/gh/LZJ-I/picx-images-hosting@main/images/%E5%B5%8C%E5%85%A5%E5%BC%8F%E8%BD%AF%E4%BB%B6%E5%BC%80%E5%8F%91/Post-stm32-hal/b33c7d3a-1272-4b67-965f-163a2a8c4f9a-image.webp?spaceId=3a565fcb-f425-4846-b72a-d32a98183896&amp;t=67aee50b-3c93-4f51-ad8b-71b43d065d14" alt="notion image" loading="lazy" decoding="async"/></div></figure><div class="notion-text notion-block-065fdc8a877a40e8965fc5a6c07a6448">需要设置的。和路线，其实就是在函数中一步步设置。</div><div class="notion-text notion-block-5a9a94dc10034a6aaaf62892426fd453">代码如下</div><div class="notion-text notion-block-aa44873a111048128529eb623f7ec9d9"><b>main.c</b></div><div class="notion-text notion-block-0a48bbef167b48429ca19516828a09a6">#include &quot;stm32f1xx_hal.h&quot;</div><div class="notion-text notion-block-d92a06bcad994a08ad4ec9fe69245285">#include &quot;rcc.h&quot;</div><div class="notion-text notion-block-8b66c5fc0e734040b944b0f20e204279">/*函 数 名：hal库rcc输出内部8Mhz方波</div><div class="notion-text notion-block-889621bddc02436d87868c086e8b4713">*参    数：</div><div class="notion-text notion-block-441aab41220543e6ac595bef661e640c">*返 回 值：</div><div class="notion-text notion-block-0d6cee82845043a1acb1ab16a863fb5b">*注意事项：</div><div class="notion-text notion-block-205391807195493f934548d3e855479f">*/</div><div class="notion-text notion-block-c40f3950cd9c4e63b0f5e409ba6c9f1f">uint32_t HCLKFreq  = 0;//显示时钟树三处频率</div><div class="notion-text notion-block-4c982b653fae44fa960bce23f2bc5f02">uint32_t PCLK1Freq = 0;</div><div class="notion-text notion-block-0694482819c0425181377662c96e6800">uint32_t PCLK2Freq = 0;</div><div class="notion-text notion-block-609ea368554f4aca844c19090765846d">int main (void)</div><div class="notion-text notion-block-1cf6eb7889a642dbbbceb18432a80cf4">{<div class="notion-text-children"><div class="notion-text notion-block-1f259cb327a74edbb5914978aba1b2cc">HAL_Init();//初始化HAL库</div><div class="notion-text notion-block-c9553c9d5c264f1bb6229e4f24fc90b9">RCC_ClockInit();//配置时钟树初始化</div><div class="notion-text notion-block-24c449939a99422fa892817f50ef6dd7">HAL_RCC_MCOConfig(RCC_MCO1,RCC_MCO1SOURCE_SYSCLK,RCC_MCODIV_1);//PA8引脚输出、系统时钟、不分频</div><div class="notion-text notion-block-1433041ec5584eab945e97baf82358d8">HCLKFreq  = HAL_RCC_GetHCLKFreq();</div><div class="notion-text notion-block-235b69ba8eb343a98eca483e523d5ef3">PCLK1Freq = HAL_RCC_GetPCLK1Freq();</div><div class="notion-text notion-block-6ea4fe3eefaa42edad972d9fefbfc4e3">PCLK2Freq = HAL_RCC_GetPCLK2Freq();</div><div class="notion-text notion-block-00bbd2713ac240a98bddbc6c4b5956b1">while(1)</div><div class="notion-text notion-block-45b18b8334d74e9ebc284ae8286fcc6f">{</div></div></div><div class="notion-text notion-block-278a669cfe5e4ec593bcb50a47133dd1">}</div><div class="notion-text notion-block-4fc17ac8d6484db49273ee1063acf021">}</div><div class="notion-text notion-block-ffdde37cc0f542638bea7898fa64f35d">#include &quot;stm32f1xx_hal.h&quot;</div><div class="notion-text notion-block-e8c20a538e774ea6bab0609b205b5741">#include &quot;rcc.h&quot;</div><div class="notion-text notion-block-46cc220ba0bc46e38d6d87937198fc37">void RCC_ClockInit()</div><div class="notion-text notion-block-11713a8f5fe44cb8a2ec91d729933200">{<div class="notion-text-children"><div class="notion-text notion-block-880e33b0a61947a8aed7ab82523ada1d">RCC_OscInitTypeDef RCC_OsInitStructure; //设置内外部时钟源配置结构体</div><div class="notion-text notion-block-9f91eaa8c78f44dea329066fd410c426">RCC_ClkInitTypeDef RCC_ClkInitStructure;//设置总线时钟结构体</div><div class="notion-text notion-block-5c5ca291d69e4d44ae5a7b52c1eddec4">RCC_OsInitStructure.OscillatorType = RCC_OSCILLATORTYPE_HSI;    //选择震荡电路为内部高速</div><div class="notion-text notion-block-52e0f564c3fa4492a75b7b4ba893a04d">RCC_OsInitStructure.HSIState = RCC_HSI_ON;  //打开时钟</div><div class="notion-text notion-block-c9c5ad7285434348b1088d295c60319e">RCC_OsInitStructure.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;   //设置微调值 默认</div><div class="notion-text notion-block-ab8573763b6b4a80a5138b0fa48856d8">RCC_OsInitStructure.PLL.PLLState = RCC_PLL_ON;  //设置PLL为打开</div><div class="notion-text notion-block-2cb801008724451cbabb8fe0225b8d05">RCC_OsInitStructure.PLL.PLLSource = RCC_PLLSOURCE_HSI_DIV2; //选择PLL输入为内部高速时钟</div><div class="notion-text notion-block-4853a38bf9a24a9baedb4f45002fdc0b">RCC_OsInitStructure.PLL.PLLMUL = RCC_PLL_MUL16;          //设置16倍频</div><div class="notion-text notion-block-b048660b94084919b75fa42e273a3ebd">HAL_RCC_OscConfig(&amp;RCC_OsInitStructure);    //传给话务员..</div><div class="notion-text notion-block-d27e30db387b4387942c5c3e8df7cddc">RCC_ClkInitStructure.ClockType = RCC_CLOCKTYPE_HCLK  | RCC_CLOCKTYPE_PCLK1 |RCC_CLOCKTYPE_PCLK2 | RCC_CLOCKTYPE_SYSCLK;//需要配置的时钟</div><div class="notion-text notion-block-8d22a4fede96484789cc0d8443bdd45e">RCC_ClkInitStructure.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; //SYSCLK系统时钟输入源 PLL作为系统时钟</div><div class="notion-text notion-block-26f4faf1c9094613b33f01dcbec2e0d1">RCC_ClkInitStructure.AHBCLKDivider = RCC_SYSCLK_DIV1;   //AHB预分频 1分频</div><div class="notion-text notion-block-c0aecddfde154bdab21bd74256b4b3b7">RCC_ClkInitStructure.APB1CLKDivider = RCC_HCLK_DIV2;    //APB1预分频 2分频</div><div class="notion-text notion-block-c51823d611b8499bb2cfd8f8bab01134">RCC_ClkInitStructure.APB2CLKDivider = RCC_HCLK_DIV1;    //APB2预分频 1分频</div><div class="notion-text notion-block-1e6e5c8b75fb4d93897faffc8c9f05bc">HAL_RCC_ClockConfig(&amp;RCC_ClkInitStructure,FLASH_LATENCY_2);//传给话务员，并且根据频率设置FLASH等待周期为2</div><div class="notion-text notion-block-f0b88deb67e3477f9f4111f86b4a92df">//话务员相关配置可以在API函数中找到。结构体相关配置在结构体和成员中可找到</div></div></div><div class="notion-text notion-block-b283654a9a4b4b5c8d72bd21116242f3">}</div><div class="notion-text notion-block-933359a4de774bfb96ac009f84047fe7">结果如下（转换成10进制）：分别为 64M 32M 64M</div><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-42bd30aec9314f81b96811631d86394d"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:100%;max-width:100%;flex-direction:column"><img style="object-fit:cover" src="https://cdn.jsdmirror.com/gh/LZJ-I/picx-images-hosting@main/images/%E5%B5%8C%E5%85%A5%E5%BC%8F%E8%BD%AF%E4%BB%B6%E5%BC%80%E5%8F%91/Post-stm32-hal/b73827cb-63df-4c9f-9ec0-31832e93da48-image.webp?spaceId=3a565fcb-f425-4846-b72a-d32a98183896&amp;t=42bd30ae-c931-4f81-b968-11631d86394d" alt="notion image" loading="lazy" decoding="async"/></div></figure><div class="notion-blank notion-block-3b9c7bf64bba495dbde17fa55260eb9b"> </div></div></details><details class="notion-toggle notion-block-fa4123b72dd847758f611dfe66e25f63"><summary><h3 class="notion-h notion-h2 notion-h-indent-1 notion-block-fa4123b72dd847758f611dfe66e25f63" data-id="fa4123b72dd847758f611dfe66e25f63"><span><div id="fa4123b72dd847758f611dfe66e25f63" class="notion-header-anchor"></div><span class="notion-h-title">4. 使用外部HSE时钟通过PLL倍频到72MHZ</span></span></h3></summary><div><div class="notion-text notion-block-7e7d1a90e4644089a0c7d0ba4b2021ce">流程如下</div><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-15d18df7e08443baa7ebac486c8bb84e"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:100%;max-width:100%;flex-direction:column"><img style="object-fit:cover" src="https://cdn.jsdmirror.com/gh/LZJ-I/picx-images-hosting@main/images/%E5%B5%8C%E5%85%A5%E5%BC%8F%E8%BD%AF%E4%BB%B6%E5%BC%80%E5%8F%91/Post-stm32-hal/5282be6b-bc07-40c1-afdc-bceaf90248d2-image.webp?spaceId=3a565fcb-f425-4846-b72a-d32a98183896&amp;t=15d18df7-e084-43ba-a7eb-ac486c8bb84e" alt="notion image" loading="lazy" decoding="async"/></div></figure><div class="notion-text notion-block-442df37ad690453b9e5b1c2dd9ccedad">只修改了rcc.c的文件</div><div class="notion-text notion-block-f73015edc4fa475796c86479e12c0efb"><b>rcc.c</b></div><div class="notion-text notion-block-fa95a78b96cf4f39b02d26b5f0c384f3">#include &quot;stm32f1xx_hal.h&quot;</div><div class="notion-text notion-block-a91cf2483c814a8f91a2bace35187b02">#include &quot;rcc.h&quot;</div><div class="notion-text notion-block-0b28a0c453c742f8a056348a20dc00bf">void RCC_ClockInit()</div><div class="notion-text notion-block-53d4dbfeabe64c458c0bf847fb874ee7">{</div><div class="notion-text notion-block-d76601d3a85f45afbdaaaeec5b37f5c4">RCC_OscInitTypeDef RCC_OsInitStructure; //设置内外部时钟源配置结构体</div><div class="notion-text notion-block-58f193b91eb54b0daed41bcc34fcf104">RCC_ClkInitTypeDef RCC_ClkInitStructure;//设置总线时钟结构体</div><div class="notion-text notion-block-29dad4aaf65046db88457a09c7f16e8a">RCC_OsInitStructure.OscillatorType = RCC_OSCILLATORTYPE_HSE;    //选择震荡电路为外部高速</div><div class="notion-text notion-block-bb1189e3659445cfb073d9e0fb95be71">RCC_OsInitStructure.HSEState = RCC_HSE_ON;  //打开HSE时钟</div><div class="notion-text notion-block-edbf439b6c9445a584dd6794cab8a778">RCC_OsInitStructure.HSEPredivValue = RCC_HSE_PREDIV_DIV1;   //不分频</div><div class="notion-text notion-block-010be3eff53a43778580c24a0b1febd1">RCC_OsInitStructure.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;   //设置微调值 默认</div><div class="notion-text notion-block-cb4b1b7ed15d454987d758fb000ff36c">RCC_OsInitStructure.PLL.PLLState = RCC_PLL_ON;  //设置PLL为打开</div><div class="notion-text notion-block-2a3daa469fae444f87222e91712de490">RCC_OsInitStructure.PLL.PLLSource = RCC_PLLSOURCE_HSE; //选择PLL输入为外部高速时钟</div><div class="notion-text notion-block-368449c1274d43149f8e6b102df6a3fd">RCC_OsInitStructure.PLL.PLLMUL = RCC_PLL_MUL9;          //设置9倍频</div><div class="notion-text notion-block-a25a5b4abf1e49eea6d8293738689733">HAL_RCC_OscConfig(&amp;RCC_OsInitStructure);    //传给话务员..</div><div class="notion-text notion-block-fa98ca37605648fabd71e56e5bdb3418">RCC_ClkInitStructure.ClockType = RCC_CLOCKTYPE_HCLK  | RCC_CLOCKTYPE_PCLK1 |RCC_CLOCKTYPE_PCLK2 | RCC_CLOCKTYPE_SYSCLK;//需要配置的时钟</div><div class="notion-text notion-block-5ae848f9cfc24960bc73666363c74085">RCC_ClkInitStructure.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; //SYSCLK系统时钟输入源 PLL作为系统时钟</div><div class="notion-text notion-block-6731df5773814d94972ef0bfc29b3f57">RCC_ClkInitStructure.AHBCLKDivider = RCC_SYSCLK_DIV1;   //AHB预分频 1分频</div><div class="notion-text notion-block-2d5097ab491947859f9fd422a5b46984">RCC_ClkInitStructure.APB1CLKDivider = RCC_HCLK_DIV2;    //APB1预分频 2分频</div><div class="notion-text notion-block-c2323fd8ec8447a4950d1f1cfd1c23a4">RCC_ClkInitStructure.APB2CLKDivider = RCC_HCLK_DIV1;    //APB2预分频 1分频</div><div class="notion-text notion-block-76dc35a1cb8242f0a9b33fe45c4ab734">HAL_RCC_ClockConfig(&amp;RCC_ClkInitStructure,FLASH_LATENCY_2);//传给话务员，并且根据频率设置FLASH等待周期为2</div><div class="notion-text notion-block-48fd0d378bf0469ea2c1bb2c7ec207b3">//话务员相关配置可以在API函数中找到。结构体相关配置在结构体和成员中可找到</div><div class="notion-text notion-block-07bdbc50321144818c5bdf5b8bceface">}</div><div class="notion-text notion-block-716b12acf914469eafcfb495ebe569ae">结果：</div><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-2e5990233e904c5886d23efe9e4f8cc0"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:100%;max-width:100%;flex-direction:column"><img style="object-fit:cover" src="https://cdn.jsdmirror.com/gh/LZJ-I/picx-images-hosting@main/images/%E5%B5%8C%E5%85%A5%E5%BC%8F%E8%BD%AF%E4%BB%B6%E5%BC%80%E5%8F%91/Post-stm32-hal/89d9ca6e-f580-4ea2-b3d4-f70c7faa3a69-image.webp?spaceId=3a565fcb-f425-4846-b72a-d32a98183896&amp;t=2e599023-3e90-4c58-86d2-3efe9e4f8cc0" alt="notion image" loading="lazy" decoding="async"/></div></figure><details class="notion-toggle notion-block-30b9615477c84dd792685e07c059842e"><summary><h3 class="notion-h notion-h2 notion-block-30b9615477c84dd792685e07c059842e" data-id="30b9615477c84dd792685e07c059842e"><span><div id="30b9615477c84dd792685e07c059842e" class="notion-header-anchor"></div><span class="notion-h-title">5. HAL_Init库函数源码分析 及 Systick时基</span></span></h3></summary><div><div class="notion-text notion-block-73ee0798bea64c258845ed27722e5c74">HAL_Init 是 HAL库要求我们调用的第一个函数。</div><div class="notion-text notion-block-d1fd95bf649d4530a0d4cb471340a69f"><b>下面是HAL_Init调用时 做的工作：</b></div><ol start="1" class="notion-list notion-list-numbered notion-block-ed71d22d1b3e4e6a815e6c4f44d3da80" style="list-style-type:decimal"><li>把指令预取功能打开</li></ol><ol start="2" class="notion-list notion-list-numbered notion-block-22f63003781e43f184f9d699c019b836" style="list-style-type:decimal"><li>设置中断分组</li></ol><ol start="3" class="notion-list notion-list-numbered notion-block-3a991ff494d647f7bb1befed5775b98e" style="list-style-type:decimal"><li>将Systick作为时间基准，配置为1ms的中断</li></ol><ol start="4" class="notion-list notion-list-numbered notion-block-c71545897db544269be089d8f30d6443" style="list-style-type:decimal"><li>初始化底层硬件</li></ol><ol start="5" class="notion-list notion-list-numbered notion-block-348fb2418d0744fb8421611655d919db" style="list-style-type:decimal"><li>返回 HAL_OK</li></ol><div class="notion-text notion-block-0589969e1774454eb7684f233d708e75"><b>标准库和HAL库的很大的一个区别：Systick</b></div><ul class="notion-list notion-list-disc notion-block-f21e775e05eb495d827b5bb79fb70820"><li>每次进入Systick中断时 对32位全局变量uwTick累加1</li></ul><ul class="notion-list notion-list-disc notion-block-138da78943c74e56a754adae720d2d49"><li>提供了HAL_GetTick 获取uwTick全局变量</li></ul><div class="notion-text notion-block-c36e915251c24f99b0ba837c139b3323">Systick时基最常用的地方就是各个外设采用阻塞轮训处理数据时，做超时判断、阻塞延时、</div></div></details></div></details><details class="notion-toggle notion-block-b4a81663ddc342c8abd1b704c0e5d105"><summary><h2 class="notion-h notion-h1 notion-h-indent-0 notion-block-b4a81663ddc342c8abd1b704c0e5d105" data-id="b4a81663ddc342c8abd1b704c0e5d105"><span><div id="b4a81663ddc342c8abd1b704c0e5d105" class="notion-header-anchor"></div><span class="notion-h-title">中断处理函数及weak弱声明中断回调函数详解</span></span></h2></summary><div><details class="notion-toggle notion-block-504a1bfef44f4f018a1f1c79540bab3f"><summary><h3 class="notion-h notion-h2 notion-block-504a1bfef44f4f018a1f1c79540bab3f" data-id="504a1bfef44f4f018a1f1c79540bab3f"><span><div id="504a1bfef44f4f018a1f1c79540bab3f" class="notion-header-anchor"></div><span class="notion-h-title"><b>一、STM32 中断处理方式概述</b></span></span></h3></summary><div><div class="notion-text notion-block-93b107254e5b4fc8a8a959ae955400b3">在 STM32 的开发中，中断是一种非常重要的机制，用于响应外部事件或内部异常情况。STM32 在启动文件（stmxxxxx.s）中为我们预先定义了所有中断的中断服务函数。这意味着当特定的中断发生时，处理器会自动跳转到相应的中断服务函数处执行代码。</div></div></details><details class="notion-toggle notion-block-1fcce120491c4733be33069a3d78e213"><summary><h3 class="notion-h notion-h2 notion-block-1fcce120491c4733be33069a3d78e213" data-id="1fcce120491c4733be33069a3d78e213"><span><div id="1fcce120491c4733be33069a3d78e213" class="notion-header-anchor"></div><span class="notion-h-title"><b>二、标准库中断处理方式</b></span></span></h3></summary><div><div class="notion-text notion-block-d4d452db02c74c368dbe576a5c8058eb">在标准库中，处理中断需要开发者自己去判断中断标志位，确定中断是否发生，然后执行相应的操作，最后还需要手动清除中断标志位。例如在 EXTI15_10_IRQHandler 中断服务函数中，开发者需要通过检查特定的线（比如线 12）的中断标志位来判断该中断是否发生，如果中断标志位为真，则执行特定的操作，最后还需要清除线 12 产生的中断标志位，以确保下次中断能够正确响应。</div></div></details><details class="notion-toggle notion-block-bd44798e9a344ca4985d76747de76534"><summary><h3 class="notion-h notion-h2 notion-block-bd44798e9a344ca4985d76747de76534" data-id="bd44798e9a344ca4985d76747de76534"><span><div id="bd44798e9a344ca4985d76747de76534" class="notion-header-anchor"></div><span class="notion-h-title"><b>三、HAL 库中断处理方式</b></span></span></h3></summary><div><ol start="1" class="notion-list notion-list-numbered notion-block-ab1b1bcc61e3417a8b8a44abe641f108" style="list-style-type:decimal"><li><b>自动判断与清除标志位</b>：</li><ol class="notion-list notion-list-numbered notion-block-ab1b1bcc61e3417a8b8a44abe641f108" style="list-style-type:lower-alpha"><ul class="notion-list notion-list-disc notion-block-ca87b452643f4017b36d134fc27fe6a4"><li>HAL 库（以 gpio.c 为例）为各个外设的中断提供了更加便捷的处理方式。在 HAL 库提供的中断处理函数中，会自动判断中断标志位并清除标志位。例如在 <code class="notion-inline-code">void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin)</code>函数中，首先使用<code class="notion-inline-code">__HAL_GPIO_EXTI_GET_IT(GPIO_Pin)!= 0x00u</code>来判断标志位，确定中断是否发生。如果中断发生，接着使用<code class="notion-inline-code">__HAL_GPIO_EXTI_CLEAR_IT(GPIO_Pin)</code>来清除标志位，确保下次中断能够正常响应。</li></ul></ol></ol><ol start="2" class="notion-list notion-list-numbered notion-block-a1691e0cfc2d4a6894ebf4a0e3b640a5" style="list-style-type:decimal"><li><b>回调函数机制</b>：</li><ol class="notion-list notion-list-numbered notion-block-a1691e0cfc2d4a6894ebf4a0e3b640a5" style="list-style-type:lower-alpha"><ul class="notion-list notion-list-disc notion-block-be90ffa5bf564fe6a6ab14f34d8c73ef"><li>在自动判断和清除标志位的函数中，还提供了一个回调函数<code class="notion-inline-code">HAL_GPIO_EXTI_Callback(GPIO_Pin)</code>。这个回调函数的作用是在中断发生并且标志位被正确处理后，执行用户自定义的操作。</li></ul></ol></ol><ol start="3" class="notion-list notion-list-numbered notion-block-37e59c28a4734e99990e20d9cc7387b3" style="list-style-type:decimal"><li><b>弱声明的回调函数</b>：</li><ol class="notion-list notion-list-numbered notion-block-37e59c28a4734e99990e20d9cc7387b3" style="list-style-type:lower-alpha"><ul class="notion-list notion-list-disc notion-block-d46c0af80f3c4b5ba5473be30ebed577"><li>在自动判断和清除标志位的函数下，会有回调函数有一个弱声明：<code class="notion-inline-code">__weak void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)</code>。这个弱声明的回调函数只是为了防止编译报错而存在的，它内部实际上什么操作都不执行，只是通过<code class="notion-inline-code">UNUSED(GPIO_Pin)</code>来告诉编译器这个参数虽然没有被使用，防止产生编译错误。</li></ul></ol></ol><ol start="4" class="notion-list notion-list-numbered notion-block-504ffee23a7b4845b0a748c279b71fc7" style="list-style-type:decimal"><li><b>强声明的回调函数</b>：</li><ol class="notion-list notion-list-numbered notion-block-504ffee23a7b4845b0a748c279b71fc7" style="list-style-type:lower-alpha"><ul class="notion-list notion-list-disc notion-block-06dc6194071f4755913bf05b1016ad59"><li>开发者可以在自己的代码中定义一个 “强声明” 的中断回调函数，即<code class="notion-inline-code">void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)</code>。当程序编译时，会自动使用这个强声明的回调函数替代弱声明的回调函数。这样，当中断发生时，就会执行开发者自定义的回调函数，而不是弱声明的空函数。</li></ul></ol></ol><div class="notion-text notion-block-9122afe4785b4106b74fe6693f46bbdf">gpio.c中判断中断、清除中断、执行回调函数和对应的弱声明的代码部分：</div></div></details><div class="notion-text notion-block-b1011db8761f475984a7c4bd5a78f2aa">//stm启动文件中已经定义的中断服务函数</div><div class="notion-text notion-block-71fc2a761cb0420d8579775e4755fd84">void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin)</div><div class="notion-text notion-block-c2dc717395b046c98ad89ece5c124a61">{</div><div class="notion-text notion-block-2ffc7b0722cc4815912fde4bcb70bce9">if (__HAL_GPIO_EXTI_GET_IT(GPIO_Pin) != 0x00u)//帮我们判断标志位</div><div class="notion-text notion-block-c1752707f1a54eb082ef3ccbd9f92c23">{<div class="notion-text-children"><div class="notion-text notion-block-374ade84494a450f990099340b5f3054">__HAL_GPIO_EXTI_CLEAR_IT(GPIO_Pin);//帮我们清除标志位</div><div class="notion-text notion-block-d6f14e0a68eb4b1fad4e26aacc5d0243">HAL_GPIO_EXTI_Callback(GPIO_Pin);//执行回调函数</div></div></div><div class="notion-text notion-block-c67cee9bb2364551ac4adba60440bc48">}</div><div class="notion-text notion-block-1d74e85e19824b7c989dc0d5b6118c31">}</div><div class="notion-text notion-block-489aa60e736b4190a61951c347329223">// 弱声明 的回调函数  只是为了防止报错用</div><div class="notion-text notion-block-4570fb0acfcf4230b57d877ae4057ad9">__weak void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)</div><div class="notion-text notion-block-9a95d3c0b49e4da98f7601077b7d7641">{</div><div class="notion-text notion-block-82f9233bab26413b94f70b5903236705">UNUSED(GPIO_Pin);//什么都不执行，只是为了防止编译时报错：没有使用xxx</div><div class="notion-text notion-block-188b9121a21f4a218823deb217c7c525">}</div></div></details><details class="notion-toggle notion-block-1fcd01ac03c242f180a68dfcf989cca1"><summary><h3 class="notion-h notion-h2 notion-h-indent-1 notion-block-1fcd01ac03c242f180a68dfcf989cca1" data-id="1fcd01ac03c242f180a68dfcf989cca1"><span><div id="1fcd01ac03c242f180a68dfcf989cca1" class="notion-header-anchor"></div><span class="notion-h-title"><b>四、在程序中的应用</b></span></span></h3></summary><div><div class="notion-text notion-block-36857e0375af4966aa5645b58ca93919">为了让 HAL 库的中断处理函数能够正确地响应中断并执行自定义的回调函数，我们只需要在 it.c 文件中，在中断发生时跳转到 HAL 库的中断处理函数。这样，当中断发生时，HAL 库的中断处理函数就会自动帮我们判断中断标志位、清除标志位，并进入对应的回调函数，执行我们自定义的操作。</div><div class="notion-text notion-block-6ec071844aff47e589042f97a9c935f0">比如（以gpio.c为例）：</div><div class="notion-text notion-block-d083d121f112448990e5bbd79880d7cf"><b>it.c文件：</b></div><div class="notion-text notion-block-b8414979eee34c9c9b62bc5c3e2e78d5">void EXTI15_10_IRQHandler (void) //如果发生了这个中断</div><div class="notion-text notion-block-e2866df669494f948e670f1ab54050a1">{</div><div class="notion-text notion-block-25de8d9cbfb449b3969759d7f41247e4">HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_13);//跳转到HAL库的中断处理</div><div class="notion-text notion-block-9af080fa679d42c681c8102ced483d44">HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_12);//跳转到HAL库的中断处理</div><div class="notion-text notion-block-ca0afda33d31499ea124f96013d56879">} </div><div class="notion-text notion-block-9f2b1178d0ff4050a660eb8a8076e28d">/<em> 注册回调函数 </em>/</div><div class="notion-text notion-block-ac36fef4d04c476a8c9b73b935e56a72">void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)</div><div class="notion-text notion-block-f8c2a818c381420196b9b283d4e006f5">{</div><div class="notion-text notion-block-f0907ca2aa604313bf00319277b29077">if (GPIO_Pin == GPIO_PIN_13) // 判断是不是13线</div><div class="notion-text notion-block-61ff5895c182468e8ad2a4d010b9abae">{<div class="notion-text-children"><div class="notion-text notion-block-310dfceca3eb4e9d9888763a1f6e25a3">// 执行13线程序</div><div class="notion-text notion-block-7c1c9da580834ef19311c4bf49a034d9">// ...</div></div></div><div class="notion-text notion-block-edb5b8a5f34b4d4baca8af9c38bd87ba">}</div><div class="notion-text notion-block-3ef958d6a42449a2894d41e064075083">else if (GPIO_Pin == GPIO_PIN_12) // 判断是不是12线</div><div class="notion-text notion-block-d381ff44bd454f77a1713601a4baaffb">{<div class="notion-text-children"><div class="notion-text notion-block-5219fdad669e4d4e89546605041f40ad">// 执行12线程序</div><div class="notion-text notion-block-87b6ebd426ed4a508a7ec9e98a14ad69">// ...</div></div></div><div class="notion-text notion-block-1e1db845e1504be7ba823e44cc448da0">}</div><div class="notion-text notion-block-a6a24419d10f4c04b9de0a02a071bb80">}</div></div></details><details class="notion-toggle notion-block-553f7f78c331459399d5af8bf055dfea"><summary><h2 class="notion-h notion-h1 notion-h-indent-0 notion-block-553f7f78c331459399d5af8bf055dfea" data-id="553f7f78c331459399d5af8bf055dfea"><span><div id="553f7f78c331459399d5af8bf055dfea" class="notion-header-anchor"></div><span class="notion-h-title">串口篇</span></span></h2></summary><div><div class="notion-text notion-block-f8cb17caf2b0467fb6cc787d63358bc3"><span class="notion-blue">这篇文章介绍了HAL库大多的使用方法，并配有详细的思路和注释。</span></div><details class="notion-toggle notion-block-0810e2226ca944cbb0a6ea4b602a4477"><summary><h3 class="notion-h notion-h2 notion-block-0810e2226ca944cbb0a6ea4b602a4477" data-id="0810e2226ca944cbb0a6ea4b602a4477"><span><div id="0810e2226ca944cbb0a6ea4b602a4477" class="notion-header-anchor"></div><span class="notion-h-title">一、介绍</span></span></h3></summary><div><div class="notion-text notion-block-3e27c5fcfc79469fa91845a8f88eb1e2"><b>HAL库在 异步通信UART 串口部分提供了三种方式：</b></div><ul class="notion-list notion-list-disc notion-block-a06003a3569340ddabfed321e0eba6ce"><li>轮询阻塞</li></ul><ul class="notion-list notion-list-disc notion-block-744eced3458349b3acfb3011ef8e90ff"><li>非阻塞中断 或者 DMA</li></ul><ul class="notion-list notion-list-disc notion-block-bfe9feaba3234aa99441b0d833e6d13d"><li>所以在使用串口时，也要添加DMA.c到库</li></ul><div class="notion-text notion-block-26f8a8001b1b473890e0614d9728861d"><b>以STM32C8T6为例，有三个串口资源：</b></div><ul class="notion-list notion-list-disc notion-block-09a75529b050400a8a3c2785943d313f"><li><b>USART1</b>：</li><ul class="notion-list notion-list-disc notion-block-09a75529b050400a8a3c2785943d313f"><li><b>TX</b>：PA9    可重映射为 PB 6</li><li><b>RX</b>：PA10  可重映射为 PB 7</li></ul></ul><ul class="notion-list notion-list-disc notion-block-64b8e8d4ae9d49df8fe7137e3acfd268"><li><b>USART2</b>：</li><ul class="notion-list notion-list-disc notion-block-64b8e8d4ae9d49df8fe7137e3acfd268"><li><b>TX</b>：PA2</li><li><b>RX</b>：PA3</li></ul></ul><ul class="notion-list notion-list-disc notion-block-a844db7348bf49409b0705b834152b0f"><li><b>USART3</b>：</li><ul class="notion-list notion-list-disc notion-block-a844db7348bf49409b0705b834152b0f"><li><b>TX</b>：PB10</li><li><b>RX</b>：PB11</li></ul></ul></div></details><details class="notion-toggle notion-block-a3be10d5e98b4334aba1b13e7e23e783"><summary><h3 class="notion-h notion-h2 notion-block-a3be10d5e98b4334aba1b13e7e23e783" data-id="a3be10d5e98b4334aba1b13e7e23e783"><span><div id="a3be10d5e98b4334aba1b13e7e23e783" class="notion-header-anchor"></div><span class="notion-h-title">二、HAL库：阻塞轮询方式 实现USART1 串口 异步收发</span></span></h3></summary><div><details class="notion-toggle notion-block-ded482fd3c69411186ff54bf752065bf"><summary><h4 class="notion-h notion-h3 notion-block-ded482fd3c69411186ff54bf752065bf" data-id="ded482fd3c69411186ff54bf752065bf"><span><div id="ded482fd3c69411186ff54bf752065bf" class="notion-header-anchor"></div><span class="notion-h-title">1. 引脚定义</span></span></h4></summary><div><ul class="notion-list notion-list-disc notion-block-dfdf59f2c5f241168d1de567f41c2a1e"><li><b>USART1</b>：</li><ul class="notion-list notion-list-disc notion-block-dfdf59f2c5f241168d1de567f41c2a1e"><li><b>TX</b>：PA9</li><li><b>RX</b>：PA10</li></ul></ul></div></details><details class="notion-toggle notion-block-14fe8dccfaed4828a5dd01ec6e08a2b4"><summary><h4 class="notion-h notion-h3 notion-block-14fe8dccfaed4828a5dd01ec6e08a2b4" data-id="14fe8dccfaed4828a5dd01ec6e08a2b4"><span><div id="14fe8dccfaed4828a5dd01ec6e08a2b4" class="notion-header-anchor"></div><span class="notion-h-title">2. 补充：为什么在while循环接收时，没必要对HAL_ERROR、HAL_BUSY进行处理</span></span></h4></summary><div><div class="notion-text notion-block-42287452c03f4b2cb73a115e2b85f904">HAL_ERROR：</div><ul class="notion-list notion-list-disc notion-block-f6ebcc8bd0ba4b60bd5516d45a239278"><li>用于判断buff为空指针或者数据长度为0的情况</li></ul><div class="notion-text notion-block-e728818d98834506998f492dd4e0bcd8">HAL_BUSY：</div><ul class="notion-list notion-list-disc notion-block-da01948ae8594b20baaa84bb47055f02"><li>用于判断Busy状态</li></ul><div class="notion-text notion-block-1114feab432740568aaa33f3d0b3412f">所以我们只需要判断他的另外两种状态，HAL_OK(在规定时间内接收到n个数据)、和HAL_TIMEOUT(未在规定时间接收到n个数据，导致超时退出接收)</div></div></details></div></details><details class="notion-toggle notion-block-01468cd61adb412ab6ec51c667cbfc16"><summary><h4 class="notion-h notion-h3 notion-block-01468cd61adb412ab6ec51c667cbfc16" data-id="01468cd61adb412ab6ec51c667cbfc16"><span><div id="01468cd61adb412ab6ec51c667cbfc16" class="notion-header-anchor"></div><span class="notion-h-title">3. 注意事项：</span></span></h4></summary><div><ul class="notion-list notion-list-disc notion-block-16adf41f794b4002b026e8c98b748a2a"><li>HAL库的串口初始化， 硬件部分的时钟以及GPIO口的配置，需要我们自己来配置</li><ul class="notion-list notion-list-disc notion-block-16adf41f794b4002b026e8c98b748a2a"><div class="notion-text notion-block-7c0ae21a9672465f8d0b4ee3c2f8140b">在<code class="notion-inline-code">HAL_UART_Init(&amp;Uart1); </code>函数被调用时。
会调用一个weak弱声明的<code class="notion-inline-code">void HAL_UART_MspInit(UART_HandleTypeDef *huart)</code> 函数。
这个函数就是留给我们强声明 配置硬件用的。我们需要在里边打开 串口1 和 GPIO的 时钟。 </div></ul></ul><ul class="notion-list notion-list-disc notion-block-f7672273385e47b7a99d48780e859dce"><li>需要注意的是USART1与定时器的引脚有冲突。 如果发生冲突
可以重映射 串口到别的引脚。</li></ul><ul class="notion-list notion-list-disc notion-block-23fe8dd35afa4fb8a1d0426370fdab52"><li>RxXferSiZe是用来记录接收总量的</li></ul><ul class="notion-list notion-list-disc notion-block-ed47a32e1f824e53ac9e8508c2cfac6c"><li>RxXferCount是用来记录剩余需要接收数量的</li></ul><div class="notion-text notion-block-72317a865d864f41ad12389befc9cd7b">注意，这里的RxXferCount 进到while中就先减1 了。<b>这个知识点后面会用到</b>
</div></div></details><details class="notion-toggle notion-block-562f9089ec41438fb5c30acf99e281e6"><summary><h4 class="notion-h notion-h3 notion-block-562f9089ec41438fb5c30acf99e281e6" data-id="562f9089ec41438fb5c30acf99e281e6"><span><div id="562f9089ec41438fb5c30acf99e281e6" class="notion-header-anchor"></div><span class="notion-h-title">4. 串口1初始化部分：</span></span></h4></summary><div></div></details><details class="notion-toggle notion-block-1a1c92fd6b3a40a79280a201fe90d8a7"><summary><h4 class="notion-h notion-h3 notion-block-1a1c92fd6b3a40a79280a201fe90d8a7" data-id="1a1c92fd6b3a40a79280a201fe90d8a7"><span><div id="1a1c92fd6b3a40a79280a201fe90d8a7" class="notion-header-anchor"></div><span class="notion-h-title">5. 串口1配置硬件部分</span></span></h4></summary><div></div></details></div></details><details class="notion-toggle notion-block-7773bb7c16c1435e81cd6880a64cbd6f"><summary><h4 class="notion-h notion-h3 notion-h-indent-1 notion-block-7773bb7c16c1435e81cd6880a64cbd6f" data-id="7773bb7c16c1435e81cd6880a64cbd6f"><span><div id="7773bb7c16c1435e81cd6880a64cbd6f" class="notion-header-anchor"></div><span class="notion-h-title">6. 主函数部分</span></span></h4></summary><div><ul class="notion-list notion-list-disc notion-block-79330e01dcd942f7b05bb505edee4b7b"><li>主函数中。需要使用接收串口的函数：<code class="notion-inline-code">HAL_UART_Receive(&amp;Uart1,Buff,Rx_Size,200)</code></li><ul class="notion-list notion-list-disc notion-block-79330e01dcd942f7b05bb505edee4b7b"><div class="notion-text notion-block-93a901ed398845aeb021005dd11d0588">他的参数分别为：串口配置结构体地址、接收缓冲区（我们自己定义的数组）、预计接收的字节个数（我们自己定义）、超时时间（单位为ms）</div><div class="notion-text notion-block-b9489534d32a4e53a0d43fb78009d50f">这里的 <code class="notion-inline-code">Rx_Size</code> 为 200</div><div class="notion-text notion-block-4cbc91bc104f48b8b021f4cf8eed47cb">因此我们需要在UART.h  头文件中添加结构体对外声明<code class="notion-inline-code">extern UART_HandleTypeDef Uart1;</code></div></ul></ul><ul class="notion-list notion-list-disc notion-block-f14522c882ce4b949a93612086b28143"><li>接收串口的函数会有 四个返回值：</li><ul class="notion-list notion-list-disc notion-block-f14522c882ce4b949a93612086b28143"><li>HAL_OK、  代表此次在200ms内接受到了 200 字节。 （也就是与预计相等） </li><li>HAL_ERROR 、代表传参错误、 比如超时时间为0、或者数据缓冲区地址为空</li><li>HAL_TIMEOUT 、代表未能在规定时间内接收到 200 个字节</li><ul class="notion-list notion-list-disc notion-block-35be6c5973254ed2af97cfd9da851f60"><li>往往分为两种情况： 1、接收了但没接收完、2、一点没接收</li></ul><li>HAL_BUSY、代表已经在接受了。你别来烦我</li></ul></ul><div class="notion-text notion-block-d575f0a56a964c55b30ae363a8819c51">下面可以看代码来分析</div></div></details><details class="notion-toggle notion-block-975836dce5d945e5bb2f0df87be0be16"><summary><h3 class="notion-h notion-h2 notion-h-indent-1 notion-block-975836dce5d945e5bb2f0df87be0be16" data-id="975836dce5d945e5bb2f0df87be0be16"><span><div id="975836dce5d945e5bb2f0df87be0be16" class="notion-header-anchor"></div><span class="notion-h-title">三、HAL库：阻塞轮询方式 实现串口2、3 和串口1重映射</span></span></h3></summary><div><details class="notion-toggle notion-block-9c5466840a3e4f25a26eb9cb74a2be26"><summary><h4 class="notion-h notion-h3 notion-block-9c5466840a3e4f25a26eb9cb74a2be26" data-id="9c5466840a3e4f25a26eb9cb74a2be26"><span><div id="9c5466840a3e4f25a26eb9cb74a2be26" class="notion-header-anchor"></div><span class="notion-h-title">1. 引脚定义</span></span></h4></summary><div><ul class="notion-list notion-list-disc notion-block-967b6a7d0e4e47a9bca3e348f92b8947"><li><b>USART1</b>：</li><ul class="notion-list notion-list-disc notion-block-967b6a7d0e4e47a9bca3e348f92b8947"><li><b>TX</b>：PA9    可重映射为 PB 6</li><li><b>RX</b>：PA10  可重映射为 PB 7</li></ul></ul><ul class="notion-list notion-list-disc notion-block-6124377710824af897604ed3c5a8d896"><li><b>USART2</b>：</li><ul class="notion-list notion-list-disc notion-block-6124377710824af897604ed3c5a8d896"><li><b>TX</b>：PA2</li><li><b>RX</b>：PA3</li></ul></ul><ul class="notion-list notion-list-disc notion-block-d5c88b1bf7e54838988c8570599f8748"><li><b>USART3</b>：</li><ul class="notion-list notion-list-disc notion-block-d5c88b1bf7e54838988c8570599f8748"><li><b>TX</b>：PB10</li><li><b>RX</b>：PB11</li></ul></ul></div></details><details class="notion-toggle notion-block-e96a42e192ee41899b71a5db19b840c7"><summary><h4 class="notion-h notion-h3 notion-block-e96a42e192ee41899b71a5db19b840c7" data-id="e96a42e192ee41899b71a5db19b840c7"><span><div id="e96a42e192ee41899b71a5db19b840c7" class="notion-header-anchor"></div><span class="notion-h-title">2. 关键代码：</span></span></h4></summary><div><ul class="notion-list notion-list-disc notion-block-501b9b3ac2494ca29dbea033f22d47ae"><li>如果需要重映射，则还需要打开AFIO的时钟和 使用重映射 API：</li></ul></div></details><details class="notion-toggle notion-block-497373d24c9841ee85c0e6d70f4d584a"><summary><h4 class="notion-h notion-h3 notion-block-497373d24c9841ee85c0e6d70f4d584a" data-id="497373d24c9841ee85c0e6d70f4d584a"><span><div id="497373d24c9841ee85c0e6d70f4d584a" class="notion-header-anchor"></div><span class="notion-h-title">3. 串口1、2、3、初始化部分：</span></span></h4></summary><div><div class="notion-text notion-block-ace4635de34340a49c9a3f46b9e4029b">与之前的无异，只是添加拷贝了三次</div></div></details><details class="notion-toggle notion-block-6028661697384bc9a16171c30bb706bf"><summary><h4 class="notion-h notion-h3 notion-block-6028661697384bc9a16171c30bb706bf" data-id="6028661697384bc9a16171c30bb706bf"><span><div id="6028661697384bc9a16171c30bb706bf" class="notion-header-anchor"></div><span class="notion-h-title">4. 主函数部分</span></span></h4></summary><div><ul class="notion-list notion-list-disc notion-block-483272c912e542c8af66d71dedea1ede"><li>与之前的一样，想使用什么修改下”UartX“参数就行，</li></ul></div></details></div></details><details class="notion-toggle notion-block-374b6c166ddf46859f7ad36561a146bd"><summary><h3 class="notion-h notion-h2 notion-h-indent-1 notion-block-374b6c166ddf46859f7ad36561a146bd" data-id="374b6c166ddf46859f7ad36561a146bd"><span><div id="374b6c166ddf46859f7ad36561a146bd" class="notion-header-anchor"></div><span class="notion-h-title">四、HAL库：中断方式 实现串口1 定长数组异步收发</span></span></h3></summary><div><div class="notion-text notion-block-7403c78368244052826b15171f81957f"><b>我们就使用上一小节所讲的多指针定位+循环收发缓冲区方案设计，来实现这次的中断接收~</b></div><details class="notion-toggle notion-block-1e59c81093784579a59e9684d7e381df"><summary><h4 class="notion-h notion-h3 notion-block-1e59c81093784579a59e9684d7e381df" data-id="1e59c81093784579a59e9684d7e381df"><span><div id="1e59c81093784579a59e9684d7e381df" class="notion-header-anchor"></div><span class="notion-h-title">1. 注意事项</span></span></h4></summary><div><ol start="1" class="notion-list notion-list-numbered notion-block-a4ae3efff4ec44529b21da77cb9093f8" style="list-style-type:decimal"><li>HAL库为 串口中断提供了很多回调函数。 比如 错误回调、半完成回调、Rx、Tx完成回调。你需要用什么回调，就声明什么回调~</li><ol class="notion-list notion-list-numbered notion-block-a4ae3efff4ec44529b21da77cb9093f8" style="list-style-type:lower-alpha"><ul class="notion-list notion-list-disc notion-block-caafa762bea845889937af0ac96238f4"><li>这里只用了接收完成回调函数：<code class="notion-inline-code">void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)</code></li><ul class="notion-list notion-list-disc notion-block-caafa762bea845889937af0ac96238f4"><div class="notion-text notion-block-e03feba13b664611968fedb69cf51822">其中“RxCpltCallback” 可以分解为以下部分：</div><li>“Rx” 通常代表 “Receive”，即接收。</li><li>“Cplt” 通常代表 “Complete”，即完成。</li><li>“Callback” 即回调，指的是当某个特定事件发生时被调用的函数。</li></ul></ul></ol></ol><ol start="2" class="notion-list notion-list-numbered notion-block-23006618a437437cba36d072bff4e7a8" style="list-style-type:decimal"><li><b>我们在回调函数中。</b>
我们将接收缓冲区的数据memcpy到 发送缓冲区。
并置 接收完成标志位。 
在主函数中，只需要循环检测 标志位 后 并发送发送缓冲区中的数据就可以完成接收并发送数据了。
<b>中断接收在接收到数据之后  需要在回调函数中要重新打开。 因为中断接收一次会自动关闭</b></li></ol><ol start="3" class="notion-list notion-list-numbered notion-block-d58e4b57f76f4b1ebdb09a99a00a5407" style="list-style-type:decimal"><li>在使用UART 的IT 接收时。要配置NVIC   ：USART 线的 优先级和  使能USART线</li></ol></div></details><ol start="1" class="notion-list notion-list-numbered notion-block-79def29aa6fa4949bd5ac036a42cfe77" style="list-style-type:decimal"><li>这里的定长，是因为中断只有接收到20个字节之后，才会进入回调函数</li></ol></div></details><details class="notion-toggle notion-block-17e6baec58214eb4bd7753be2b1308d8"><summary><h4 class="notion-h notion-h3 notion-h-indent-2 notion-block-17e6baec58214eb4bd7753be2b1308d8" data-id="17e6baec58214eb4bd7753be2b1308d8"><span><div id="17e6baec58214eb4bd7753be2b1308d8" class="notion-header-anchor"></div><span class="notion-h-title">2. 初始化UART1部分</span></span></h4></summary><div><ul class="notion-list notion-list-disc notion-block-2044609d079444f7bdc24dae45e2e7d2"><li>主要关注中断 完成接收回调函数部分。
主要完成了数据cpy 和置位接收状态以及 重新启动接收数据。</li></ul><ul class="notion-list notion-list-disc notion-block-d18de191169e4411976349546cbc0136"><li>以及关注定义的接收、发送缓冲区和Rx_Date接收状态标志位</li></ul></div></details><details class="notion-toggle notion-block-0c0add5541db4e618b29ed62bdec4744"><summary><h4 class="notion-h notion-h3 notion-h-indent-2 notion-block-0c0add5541db4e618b29ed62bdec4744" data-id="0c0add5541db4e618b29ed62bdec4744"><span><div id="0c0add5541db4e618b29ed62bdec4744" class="notion-header-anchor"></div><span class="notion-h-title">3. UART硬件初始化回调</span></span></h4></summary><div></div></details><details class="notion-toggle notion-block-840cf69946de40ed9982fcdd20661439"><summary><h4 class="notion-h notion-h3 notion-h-indent-2 notion-block-840cf69946de40ed9982fcdd20661439" data-id="840cf69946de40ed9982fcdd20661439"><span><div id="840cf69946de40ed9982fcdd20661439" class="notion-header-anchor"></div><span class="notion-h-title">3. 回调函数部分</span></span></h4></summary><div><div class="notion-text notion-block-39a3d723919443869cd2d3b7ca311364">/<em> 强声明的错误回调函数 </em>/</div><div class="notion-text notion-block-75c1e92defa24f2a91ce4481dbbdecc9">void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart)</div><div class="notion-text notion-block-c30a930126654ca5b21b594fc141ac4f">{</div><div class="notion-text notion-block-d2ae8574ef694049a6898aa4bf76ac99">if(huart-&gt;Instance == USART1){<div class="notion-text-children"><div class="notion-text notion-block-6c6e8bd539e6463c88a670fecb3cc692">}else if(huart-&gt;Instance == USART2){</div><div class="notion-text notion-block-243e6480927e444ca4dccf7e287aa8c7">}else if(huart-&gt;Instance == USART3){</div><div class="notion-text notion-block-0bf5efa914da47fd886d33498caf1509">}</div></div></div><div class="notion-text notion-block-7915ac69d7ea450893df49eeeccaf369">}</div><div class="notion-text notion-block-f84cd5aa57bd40c6ac4a8ce76228dcf7">/<em> 强声明的发送完成回调函数 </em>/</div><div class="notion-text notion-block-908a53a6617248c9938bedbea5362457">void HAL_UART_TxHalfCpltCallback(UART_HandleTypeDef *huart)</div><div class="notion-text notion-block-9d734cb78bbc44a9ade89aa7a4078576">{</div><div class="notion-text notion-block-68acbc83ffda40dfb44b5f0e1b6a0cd9">if(huart-&gt;Instance == USART1){</div><div class="notion-text notion-block-9ac6ed2170264c37897294b2638f64e8">}else if(huart-&gt;Instance == USART2){</div><div class="notion-text notion-block-79c34d0a10ee45af9887efd484aa60ae">}else if(huart-&gt;Instance == USART3){</div><div class="notion-text notion-block-18a40d17762f4876acd0760e5f63cb4b">}</div><div class="notion-text notion-block-c3948c2f31ea4895a2996a9f82aa0f52">}</div></div></details><details class="notion-toggle notion-block-fa4fa086072346cfabc4c752a4cab3ee"><summary><h4 class="notion-h notion-h3 notion-h-indent-2 notion-block-fa4fa086072346cfabc4c752a4cab3ee" data-id="fa4fa086072346cfabc4c752a4cab3ee"><span><div id="fa4fa086072346cfabc4c752a4cab3ee" class="notion-header-anchor"></div><span class="notion-h-title">4.  函数测试部分</span></span></h4></summary><div><ul class="notion-list notion-list-disc notion-block-317e64700e2b407db928f15fffad948d"><li>主要完成了轮询检测状态并返回接收到的  拷贝到 发送缓冲区 的 数据</li></ul><div class="notion-text notion-block-852b969d4a364ff7a09f5004697f0c91">#include &quot;stm32f1xx_hal.h&quot;</div><div class="notion-text notion-block-03b6d3be2ae54de38612173943c1f155">#include &quot;rcc.h&quot;</div><div class="notion-text notion-block-38d2386c19b14535b748fca40cb3c2fe">#include &quot;led.h&quot;</div><div class="notion-text notion-block-760e5a13ea914e21a1213838ebb6438b">#include &quot;key.h&quot;</div><div class="notion-text notion-block-01010b4e60624e969374585e40b82cc0">#include &quot;Uart.h&quot;</div><div class="notion-text notion-block-32ff7f36485d4f7dae0f78a14b2127b0">/<em>函 数 名：HAL库：中断方式。实现UART串口数据收发。 定长  20字节 </em>/</div><div class="notion-text notion-block-ff2a90c6905249c6a7136f54883a6640">int main (void)</div><div class="notion-text notion-block-259bf8605f60496fbcca4cb927e08732">{</div><div class="notion-text notion-block-9ce08a9539d2412eb9cc778069835929">HAL_Init();//初始化HAL库</div><div class="notion-text notion-block-d0da0a0d4d42403d8d20a53759dc7843">RccClock_Init();//配置时钟树72M</div><div class="notion-text notion-block-cf66350d5d804ab28a5f6c0a16a6a1cd">LED_Init();</div><div class="notion-text notion-block-c0cf3ce39988492c87dc8e8185748230">Uart1_Init(921600);//初始化串口1</div><div class="notion-text notion-block-25e4d73b20d9453aa648d4cbd7db4f7c">while(1)</div><div class="notion-text notion-block-8d77342a55d04852a327150ef765ea76">{<div class="notion-text-children"><div class="notion-text notion-block-471260bd5b374fab90ba2f88f2a8742f">if(Rx_Date == 1) //如果接收标志位置1 </div><div class="notion-text notion-block-f9e8556fe53845d797af98038de22778">{<div class="notion-text-children"><div class="notion-text notion-block-c57909869f8d4028bf63941ed2b057c5">Rx_Date = 0;</div><div class="notion-text notion-block-468e60a7065040e0adf3c04b31e4bbc5">HAL_UART_Transmit_IT(&amp;Uart1,Tx_Buff,20);//发送 发送缓冲区的20个字节</div></div></div><div class="notion-text notion-block-d014eed90bec4edc8bd8c575ee09fc53">}</div></div></div><div class="notion-text notion-block-7b327849ee3a4724a0fe81f6b6b5d26f">}</div><div class="notion-text notion-block-e202412e97eb4296bd7433e028f7d1f7">}</div></div></details><details class="notion-toggle notion-block-fbb86f1b0c464fcea298fbea81e0a090"><summary><h3 class="notion-h notion-h2 notion-h-indent-1 notion-block-fbb86f1b0c464fcea298fbea81e0a090" data-id="fbb86f1b0c464fcea298fbea81e0a090"><span><div id="fbb86f1b0c464fcea298fbea81e0a090" class="notion-header-anchor"></div><span class="notion-h-title">五、多指针定位+循环收发缓冲区方案设计（“六”为实践此方案）</span></span></h3></summary><div><details class="notion-toggle notion-block-d3040f67001b42f69e044ab2fb080b58"><summary><h4 class="notion-h notion-h3 notion-block-d3040f67001b42f69e044ab2fb080b58" data-id="d3040f67001b42f69e044ab2fb080b58"><span><div id="d3040f67001b42f69e044ab2fb080b58" class="notion-header-anchor"></div><span class="notion-h-title">1. 介绍</span></span></h4></summary><div><div class="notion-text notion-block-e242ecb89f934168b6f81219b1cea52c">轮询阻塞的方式效率不高，一般会使用中断或者DMA方式收发数据</div><div class="notion-text notion-block-85754ad22af045018c1ec2294a169263">这时就需要定义一个缓冲区，这里暂定为2048字节。</div><ul class="notion-list notion-list-disc notion-block-d747398298c04d019c3550c39298e645"><li>缓冲区为一个、一维数组，循环使用，要注意缓冲区不要出现回卷覆盖，接收的数据要及时处理。</li></ul></div></details><details class="notion-toggle notion-block-df206be7d54c413ab36856569fd4ff85"><summary><h4 class="notion-h notion-h3 notion-block-df206be7d54c413ab36856569fd4ff85" data-id="df206be7d54c413ab36856569fd4ff85"><span><div id="df206be7d54c413ab36856569fd4ff85" class="notion-header-anchor"></div><span class="notion-h-title">2. 大致思路</span></span></h4></summary><div><div class="notion-text notion-block-26c29ab54a444e61bb47f1ff864ebfd7"><b>标记2048缓冲区每次数据的起始和结束位置</b></div><ul class="notion-list notion-list-disc notion-block-43fe3204e6e74ef181ce5a7028995312"><li>创建一个标记结构体，成员为指针pS（Start）和pE（Een）。他们用来在2048的缓冲区中，指向每次接收的数据的开头和起始位置。</li></ul><ul class="notion-list notion-list-disc notion-block-7f5af2f96f1d490093518a7a66aaa2a6"><li>使用我们刚才创建的‘标记结构体’，创建一个有10个成员的数组SN</li></ul><ul class="notion-list notion-list-disc notion-block-0cc4ce722c2b4de584ed34553c898e53"><li>创建一个IN和OUT指针，初始化时指向SN数组的起始位置（0号成员）</li></ul><ul class="notion-list notion-list-disc notion-block-597cf6f509b643d884c8d056d0fef61d"><li>创建一个END指针，指向SN数组的结束位置（9号成员）</li></ul><div class="notion-text notion-block-08630a8ae33c4321accce2dead57e65b"><b>巧妙地判断接收到数据，并循环利用标记</b></div><ul class="notion-list notion-list-disc notion-block-0062a2c00a104263bda8c6faa9ef21d2"><li>当第一次接收到数据之后，使用0号成员的pS、pE指针定位数组的起始和结束位置，
同时IN++，指向数组SN的1号成员</li><ul class="notion-list notion-list-disc notion-block-0062a2c00a104263bda8c6faa9ef21d2"><li>此时，可以在while循环中判断，当OUT指针与IN指针不指向同一个位置了，那么就代表已经缓冲区收到数据了。在处理完数据之后，使得OUT++，指向第1号成员~</li></ul></ul><ul class="notion-list notion-list-disc notion-block-798edf9ed83c4df0926223e12bdf39db"><li>当第pS跳到END指向的位置时，应使得PS下次跳的位置为数组SN的起始位置：数据回滚，防止越界</li></ul><div class="notion-text notion-block-cc14eab0e19d49cd90dc6368d1410b7d"><b>防止2048缓冲区空余位置不够</b></div><ul class="notion-list notion-list-disc notion-block-0c9863cebb5e4670b0aa341c547f0df1"><li>约定每次接收数据的MAX值，防止空余位置不够。</li></ul><ul class="notion-list notion-list-disc notion-block-223163b9363c45ceb9ee097c73fa624c"><li>所以在每次接收之后，都需要判断空余位置，若小于MAX值，则直接回卷，防止越界</li></ul><div class="notion-text notion-block-8885a4f45e2944158ec077c44f36eeda"><b>利用空闲中断，完成对数据的处理</b></div><ul class="notion-list notion-list-disc notion-block-f858c0d449824317a2c6acc641172b01"><li>定义了单次接收的最大值MAX，若MAX=256，那么别人一次发送的值最多为255字节，因为当一次次发送256时，会同时触发完成中断和空闲中断，这是不允许的。</li></ul><ul class="notion-list notion-list-disc notion-block-9581829f61c74576a31aaa2e89356d01"><li>我们只利用空闲中断对数据进行处理哦~</li></ul></div></details></div></details><details class="notion-toggle notion-block-919b998359fa436da4891da20f9cc1ce"><summary><h3 class="notion-h notion-h2 notion-h-indent-1 notion-block-919b998359fa436da4891da20f9cc1ce" data-id="919b998359fa436da4891da20f9cc1ce"><span><div id="919b998359fa436da4891da20f9cc1ce" class="notion-header-anchor"></div><span class="notion-h-title">六、HAL库：空闲中断方式实现串口1+不定长数据接收+循环收发缓冲区+收发数据</span></span></h3></summary><div><details class="notion-toggle notion-block-2a594f02308f4c8383c8a114a72d99e3"><summary><h4 class="notion-h notion-h3 notion-block-2a594f02308f4c8383c8a114a72d99e3" data-id="2a594f02308f4c8383c8a114a72d99e3"><span><div id="2a594f02308f4c8383c8a114a72d99e3" class="notion-header-anchor"></div><span class="notion-h-title">1. 不定长接收数据的实现思路及相关函数</span></span></h4></summary><div><div class="notion-text notion-block-99a9e669e53943e69b52edf9cd455582">在使用简单串口时，无法知道对方给我发送的确切的数据量。我就没法确切的定义我们需要接收多少个字节的字节。只能接收到固定长度的字节后统一处理。</div><div class="notion-text notion-block-b2c65fe485b04888839f2a623d6e9f47">要实现不定长接收数据，我们通常是利用<b>空闲中断。</b></div><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-9e20c60134304ea096f21b7fb91ef371"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:100%;max-width:100%;flex-direction:column"><img style="object-fit:cover" src="https://cdn.jsdmirror.com/gh/LZJ-I/picx-images-hosting@main/images/%E5%B5%8C%E5%85%A5%E5%BC%8F%E8%BD%AF%E4%BB%B6%E5%BC%80%E5%8F%91/Post-stm32-hal/3008e63d-8757-4803-89b0-2912a92ab00a-image.webp?spaceId=3a565fcb-f425-4846-b72a-d32a98183896&amp;t=9e20c601-3430-4ea0-96f2-1b7fb91ef371" alt="notion image" loading="lazy" decoding="async"/></div></figure><div class="notion-text notion-block-ec953424a5bd495ba4acdc37e577afa9">当一次连续的接收完成后，会出现空闲帧，然后进入空闲中断中。</div><div class="notion-text notion-block-625eb71c90de48978df07675205566c5">我们就可以利用空闲中断，来判断当前为一次数据的接收结束。</div><div class="notion-text notion-block-bc11ebb434d840edada834b0bbde851c">然后可以利用RxferCount，来获取本次接受了多少个字节。</div><div class="notion-text notion-block-e53e576e122c47fa921281e4930ee016">在空闲中断回调中，我们可以对数据进行处理或判断</div><details class="notion-toggle notion-block-daa3f30cbe434199b12b704dc145a677"><summary><h4 class="notion-h notion-h3 notion-block-daa3f30cbe434199b12b704dc145a677" data-id="daa3f30cbe434199b12b704dc145a677"><span><div id="daa3f30cbe434199b12b704dc145a677" class="notion-header-anchor"></div><span class="notion-h-title"><b>注意：</b></span></span></h4></summary><div><ol start="1" class="notion-list notion-list-numbered notion-block-b6c7852928fa4a948ed147d9d79abaa0" style="list-style-type:decimal"><li><b>定义了单次接收的最大值MAX，若MAX=256，那么别人一次发送的值最多为255字节，因为当一次次发送256时，会同时触发完成中断和空闲中断，这是不允许的。</b></li></ol><ol start="2" class="notion-list notion-list-numbered notion-block-783c7463e26b419faa7a487d5b698af2" style="list-style-type:decimal"><li><b>一定要想明白，位置控制数组rxLocation 和 rxInPtr和 rxOutPtr的关系，可以看图理解</b></li><ol class="notion-list notion-list-numbered notion-block-783c7463e26b419faa7a487d5b698af2" style="list-style-type:lower-alpha"><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-99fb74b51c8940bcb071a1efa49d0f45"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:100%;max-width:100%;flex-direction:column"><img style="object-fit:cover" src="https://cdn.jsdmirror.com/gh/LZJ-I/picx-images-hosting@main/images/%E5%B5%8C%E5%85%A5%E5%BC%8F%E8%BD%AF%E4%BB%B6%E5%BC%80%E5%8F%91/Post-stm32-hal/4cd0e751-5ed1-450b-9b39-55e035e273cf-image.webp?spaceId=3a565fcb-f425-4846-b72a-d32a98183896&amp;t=99fb74b5-1c89-40bc-b071-a1efa49d0f45" alt="notion image" loading="lazy" decoding="async"/></div></figure><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-d406c6e969394b808258f2ff0c67f52e"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:100%;max-width:100%;flex-direction:column"><img style="object-fit:cover" src="https://cdn.jsdmirror.com/gh/LZJ-I/picx-images-hosting@main/images/%E5%B5%8C%E5%85%A5%E5%BC%8F%E8%BD%AF%E4%BB%B6%E5%BC%80%E5%8F%91/Post-stm32-hal/67d50887-3efc-4127-b50d-19936521523e-image.webp?spaceId=3a565fcb-f425-4846-b72a-d32a98183896&amp;t=d406c6e9-6939-4b80-8258-f2ff0c67f52e" alt="notion image" loading="lazy" decoding="async"/></div></figure></ol></ol><ul class="notion-list notion-list-disc notion-block-be3bee88d53940eaacb58d4eaddeb927"><li>我们只利用空闲中断对数据进行处理哦~</li></ul></div></details><details class="notion-toggle notion-block-e182943e485c4b358869b78880a82cfd"><summary><h4 class="notion-h notion-h3 notion-block-e182943e485c4b358869b78880a82cfd" data-id="e182943e485c4b358869b78880a82cfd"><span><div id="e182943e485c4b358869b78880a82cfd" class="notion-header-anchor"></div><span class="notion-h-title">相关函数</span></span></h4></summary><div><ul class="notion-list notion-list-disc notion-block-c3e6fcd349db4c268a8d52739eec82f0"><li><b>空闲中断打开函数：</b><code class="notion-inline-code">__HAL_UART_ENABLE_IT(&amp;uart1.uart,UART_IT_IDLE);</code></li></ul><ul class="notion-list notion-list-disc notion-block-e6d94b25abbc43a38e011d195529272d"><li><b>在每次进入中断后，判断是否为空闲中断：</b>
<code class="notion-inline-code">if(__HAL_UART_GET_FLAG(&amp;uart1.uart, UART_FLAG_IDLE))</code></li></ul><ul class="notion-list notion-list-disc notion-block-09cc240676154c829a729a072da6a9ce"><li><b>清除空闲标志位</b><em>
</em><em><code class="notion-inline-code">__HAL_UART_CLEAR_FLAG(&amp;uart1.uart, UART_FLAG_IDLE);</code></em></li></ul><ul class="notion-list notion-list-disc notion-block-dd6a1c78ac6d40baa9ec0ae01b6de1a3"><li><b>终止当前的接收(会把RxferCount清零) </b>
<code class="notion-inline-code">HAL_UART_AbortReceive_IT(&amp;uart1.uart);</code> </li></ul><ul class="notion-list notion-list-disc notion-block-223f8e66887249b290b239c4ebb92f8f"><li>终止接收回调函数</li><ul class="notion-list notion-list-disc notion-block-223f8e66887249b290b239c4ebb92f8f"><div class="notion-text notion-block-f0f2209014714f6ba6d18c492df21a19"><code class="notion-inline-code">void HAL_UART_AbortReceiveCpltCallback(UART_HandleTypeDef *huart)</code></div></ul></ul><ul class="notion-list notion-list-disc notion-block-0d28720420bd4c5992c65c589c1113ca"><li>发送完成回调函数</li><ul class="notion-list notion-list-disc notion-block-0d28720420bd4c5992c65c589c1113ca"><div class="notion-text notion-block-b4c3bcd00a3a446ab8fd51a314abffa7"><code class="notion-inline-code">HAL_UART_TxCpltCallback</code></div></ul></ul></div></details></div></details><details class="notion-toggle notion-block-8428943f01fb47fabc2c59ef013f37f7"><summary><h4 class="notion-h notion-h3 notion-block-8428943f01fb47fabc2c59ef013f37f7" data-id="8428943f01fb47fabc2c59ef013f37f7"><span><div id="8428943f01fb47fabc2c59ef013f37f7" class="notion-header-anchor"></div><span class="notion-h-title">2. 程序设计</span></span></h4></summary><div><div class="notion-text notion-block-dd517c48232447408a4133e6e118d1a6">STM32C8T6单片机一共有20K的RAM</div><details class="notion-toggle notion-block-66be5429cf4244b899b724b2dcf7e1ba"><summary><h4 class="notion-h notion-h3 notion-block-66be5429cf4244b899b724b2dcf7e1ba" data-id="66be5429cf4244b899b724b2dcf7e1ba"><span><div id="66be5429cf4244b899b724b2dcf7e1ba" class="notion-header-anchor"></div><span class="notion-h-title"><b>2.1 设计介绍：</b></span></span></h4></summary><div><ul class="notion-list notion-list-disc notion-block-ea6cc09675e64edd96d4ee04da45bffc"><li>定义缓冲区宏</li></ul></div></details></div></details><div class="notion-text notion-block-67ebaf8bdc3c4aaea89f28948165e5cf">/<em> 缓冲区宏定义 </em>/</div><div class="notion-text notion-block-eb28cb76c79641f096ef9b3d3c4eae26">#define U1_RX_SIZE 2048</div><div class="notion-text notion-block-8c346d0b9eb5420f8ebfb9a1b1db518c">#define U1_TX_SIZE 2048</div><div class="notion-text notion-block-1533e7c5d48749e6acc6a8ac2ebfa8f6">#define U1_RX_MAX  256          //这里需要注意，我们是利用空闲中断对数据进行处理，不能单次发送256字节，否则进入完成中断</div><div class="notion-text notion-block-036fec3b30634d518f7b750ef0ad99c1">/<em> 缓冲区 </em>/</div><div class="notion-text notion-block-bfa4f6eee9694c0b9d64db82a2aba175">uint8_t U1_Rx_Buff[U1_RX_SIZE];</div><div class="notion-text notion-block-80ef1c7c096642f390101662d7d7d9b5">uint8_t U1_Tx_Buff[U1_TX_SIZE];</div><div class="notion-text notion-block-47685dfbbcb44f8e96245e86dfea18e2">/<em> Location Ctrl Block </em>/</div><div class="notion-text notion-block-10c9795bab2442fd92cce7f97d8f1721">/<em> （接收/发送）位置控制块 </em>/</div><div class="notion-text notion-block-fc966c549b864f3d89ad933ad2ff0c21">typedef struct{</div><div class="notion-text notion-block-b60d5609a06845309d31c09e5222034c">uint8_t* start;</div><div class="notion-text notion-block-595a327e69904ea08d2926c32dfb6d46">uint8_t* end;</div><div class="notion-text notion-block-75f9603da2bf4ee9a9eb5eb2662b5e57">}LCB;</div><div class="notion-text notion-block-7dde9c10fabe44ca892ffbcbeda4586a">/<em> Uart Ctrl Block </em>/</div><div class="notion-text notion-block-b428792f808c44ef9898ab38b300806b">/<em> 串口控制块 </em>/</div><div class="notion-text notion-block-af655cb5bc1a4a8fa90075570607e2f4">typedef struct{</div><div class="notion-text notion-block-8195e85d01374f81bcaba2b8bc0adea0">uint32_t    rxCount;            //记录接收缓冲区中当前已有的数据量</div><div class="notion-text notion-block-bfe61c08118a4bf5bdf9ce7cd5ff5265">uint32_t    txCount;            //记录发送缓冲区中当前已有的数据量</div><div class="notion-text notion-block-c4d1272d7c9e49dfb0098430078dcc79">LCB         rxLocation[10];     //记录接收缓冲区每次接收的位置</div><div class="notion-text notion-block-9d7e7233e97a45d8a0edbcc4123bcafa">LCB         txLocation[10];     //记录发送缓冲区每次接收的位置</div><div class="notion-text notion-block-42a027c47d034acdab1ab5188b1dd4fa">LCB*        rxInPtr;            //指向下次接收缓冲区存放位置</div><div class="notion-text notion-block-784d5f3b7de04250b212c8a85dc43e0f">LCB*        rxOutPtr;           //指向下次接收缓冲区读取位置</div><div class="notion-text notion-block-f0c6c433956e42bfa0424b6286771f6a">LCB*        rxEndPtr;           //指向接收缓冲区结束位置</div><div class="notion-text notion-block-1a0c5773ed40478398651485bf71d4f0">LCB*        txInPtr;            //指向下次发送缓冲区存放位置</div><div class="notion-text notion-block-a4079a5f90a1427c8a62d492d38180c2">LCB*        txOutPtr;           //指向下次发送缓冲区读取位置</div><div class="notion-text notion-block-4cda29cddea34b8d9d134c550808c5d8">LCB*        txEndPtr;           //指向发送缓冲区结束位置</div><div class="notion-text notion-block-e5de31c55f8b483b96517511a67c5d6b">UART_HandleTypeDef  uart;       //串口总控结构体</div><div class="notion-text notion-block-b1b7227db7af41cab044eefbcfaa3c21">uint8_t     TxState;            //发送忙碌标志位</div><div class="notion-text notion-block-59f1b4c2a5914ef8863c78e245e06b64">}UCB;</div><div class="notion-text notion-block-d7b0c1dbc5574974b317c517e12a8732">/<em> 初始化 </em>/</div><div class="notion-text notion-block-c886f663b87143b1941de58438f45617">void U1_Init(uint32_t bandrate);</div><div class="notion-text notion-block-6a0cc36690b541bda1b2d25b02975587">/<em> 初始化UCB控制块指针 </em>/</div><div class="notion-text notion-block-3a73adfac70e432bb77eb53ba7d43a3a">void U1_PtrInit(void);</div><div class="notion-text notion-block-5af35a3251444f3ea5ff909579ea1bf2">/<em> 转移RxBuff数据到TxBuff </em>/</div><div class="notion-text notion-block-9a05410b7af045ef9c16cbdf1961c962">void U1_DataRxToTx(uint8_t* data, uint32_t data_len);</div><div class="notion-text notion-block-bcb5ad0a8de146a1bb907d8791ff38ee">/<em> 总控结构体 </em>/</div><div class="notion-text notion-block-f8661e2ce8ee448aabe9566cef3f6887">extern UCB  uart1;</div><div class="notion-text notion-block-e879184d401e4d0b8f263bc0b48674d0">/<em> 缓冲区 </em>/</div><div class="notion-text notion-block-75842a2c57e64b1ba707823f385af421">extern uint8_t U1_Rx_Buff[U1_RX_SIZE];</div><div class="notion-text notion-block-70e0161adcf3461a99dbc991ea32f5ed">extern uint8_t U1_Tx_Buff[U1_TX_SIZE];</div><div class="notion-text notion-block-57b4383d54cd4e7ea3bfaec8b4d3ee75">/<em> 状态位 </em>/</div><div class="notion-text notion-block-73668090f1b74f4c9190e1ce2d832a50">extern uint8_t rxState;</div><details class="notion-toggle notion-block-010c88852e7a4dfeae3c4e70298963b2"><summary><h4 class="notion-h notion-h3 notion-block-010c88852e7a4dfeae3c4e70298963b2" data-id="010c88852e7a4dfeae3c4e70298963b2"><span><div id="010c88852e7a4dfeae3c4e70298963b2" class="notion-header-anchor"></div><span class="notion-h-title">2.2 文件架构：</span></span></h4></summary><div><ul class="notion-list notion-list-disc notion-block-56aa295e89ae435fb92b7956234d0ab1"><li>Uart.h      ：定义了 宏、结构体、函数与变量声明</li></ul><ul class="notion-list notion-list-disc notion-block-63a7b6b4a3c44dee9089f251ee7ca447"><li>Uart.c      ：主要针对串口 1 进行配置：空闲中断打开和处理、包括初始化参数、设置缓冲区指针….</li></ul><ul class="notion-list notion-list-disc notion-block-8215fd0626e74a2285bd0cd674441d4f"><li>stm32fxx_It.c   ： 主要是<code class="notion-inline-code"> void USART1_IRQHandler(void)</code> 的中断函数：该函数是串口 1 的中断服务函数。首先调用 HAL 库的中断处理函数，后续 检测到串口 1 进入空闲状态时，清除空闲中断标志位，计算接收字节数量并累加，然后终止接收，触发终止接收回调函数。终止接收回调函数在Uart.c中</li></ul><ul class="notion-list notion-list-disc notion-block-5906402118b94699b54bf42f587c4502"><li>main.c      ：在主循环中，通过判断接收和发送缓冲区的指针状态，实现数据的接收和发送，并在指针到达末尾时进行回卷操作。当接收缓冲区有数据时，将其拷贝到发送缓冲区并移动输出指针；当发送缓冲区有数据且处于空闲状态时，发送数据并移动输出指针。</li></ul><details class="notion-toggle notion-block-3bec601ccf63431ebc7e73a27b710fba"><summary><h4 class="notion-h notion-h3 notion-block-3bec601ccf63431ebc7e73a27b710fba" data-id="3bec601ccf63431ebc7e73a27b710fba"><span><div id="3bec601ccf63431ebc7e73a27b710fba" class="notion-header-anchor"></div><span class="notion-h-title">uart.h</span></span></h4></summary><div><div class="notion-text notion-block-19db33c3b84b4e0db70dbfed944d65af">#ifndef __UART_H</div><div class="notion-text notion-block-979c16cec41d4d0ba00a998cd5a60c62">#define __UART_H</div><div class="notion-text notion-block-a5f259e69fe44ad990c9a3088b73f573">#include &quot;stm32f1xx_hal.h&quot;</div><div class="notion-text notion-block-e7bbe37558c94d569cd2a9b8380c779b">#include &quot;stdint.h&quot;</div><div class="notion-text notion-block-a33d48b401f042e796945627325f96f6">#include &quot;string.h&quot;</div><div class="notion-text notion-block-a9d764dca21443dd884c553d63bef5ff">/<em> 缓冲区宏定义 </em>/</div><div class="notion-text notion-block-68939383a1094246b0e8ea8a2fab9024">#define U1_RX_SIZE 2048</div><div class="notion-text notion-block-00c9ab743e564360b993bae642095817">#define U1_TX_SIZE 2048</div><div class="notion-text notion-block-fcaad5cc64624aeca527b78c5cb75290">#define U1_RX_MAX  256          //这里需要注意，我们是利用空闲中断对数据进行处理，不能单次发送256字节，否则进入完成中断</div><div class="notion-text notion-block-9f68e80aadc841438f4eaafa3a4e0254">/<em> Location Ctrl Block </em>/</div><div class="notion-text notion-block-461f7ece9c72422fbaab20183e7e713b">/<em> （接收/发送）位置控制块 </em>/</div><div class="notion-text notion-block-0ef8704088d84257919b771bc8168db7">typedef struct{<div class="notion-text-children"><div class="notion-text notion-block-3f6d780e20af43caba3d6c994a311983">uint8_t* start;</div><div class="notion-text notion-block-07518ede78f54ac4b6f29d5eed22b4e0">uint8_t* end;</div></div></div><div class="notion-text notion-block-accad868937d47f5bf3b916ffed8d1e4">}LCB;</div><div class="notion-text notion-block-18811f8c10064a5db9c5d23de58207ce">/<em> Uart Ctrl Block </em>/</div><div class="notion-text notion-block-67156c1f37cd4cf8aa5216f87e3f47a4">/<em> 串口控制块 </em>/</div><div class="notion-text notion-block-79846058244044d99c7498e0460d30dd">typedef struct{<div class="notion-text-children"><div class="notion-text notion-block-2bacc7a299614cbabd68ef213fee84de">uint32_t    rxCount;            //记录接收缓冲区中当前已有的数据量</div><div class="notion-text notion-block-e28c15e0b54d4a30815bd17184f67417">uint32_t    txCount;            //记录发送缓冲区中当前已有的数据量</div><div class="notion-text notion-block-1846961ecc6145e4a98c5160e51cde9d">LCB         rxLocation[10];     //记录接收缓冲区每次接收的位置</div><div class="notion-text notion-block-5649e18130e04eec84ae5d1c9aa185dc">LCB         txLocation[10];     //记录发送缓冲区每次接收的位置</div><div class="notion-text notion-block-071faa0655864607bf81cb0e40d79d21">LCB*        rxInPtr;            //指向下次接收缓冲区存放位置</div><div class="notion-text notion-block-3570a74f20734aa0928f1a6d8087298d">LCB*        rxOutPtr;           //指向下次接收缓冲区读取位置</div><div class="notion-text notion-block-07dcf73d195f46edbca9e40dfc411e92">LCB*        rxEndPtr;           //指向接收缓冲区结束位置</div><div class="notion-text notion-block-260eab6d3e60460abb9bbdaf0d0d5253">LCB*        txInPtr;            //指向下次发送缓冲区存放位置</div><div class="notion-text notion-block-d15fae23dbe1490d934ea1ed8539cbef">LCB*        txOutPtr;           //指向下次发送缓冲区读取位置</div><div class="notion-text notion-block-d04fb2d3796b407682282c787aefb1d0">LCB*        txEndPtr;           //指向发送缓冲区结束位置</div><div class="notion-text notion-block-834785aae79540cfb085cb70920d05c0">UART_HandleTypeDef  uart;       //串口总控结构体</div><div class="notion-text notion-block-bce6f99685274d958bfbe7db4b8555c9">uint8_t     TxState;            //发送忙碌标志位</div></div></div><div class="notion-text notion-block-4145c99b05eb4ba8adfa85d00260e826">}UCB;</div><div class="notion-text notion-block-2198a09d13c146dcb67584c20c741890">/<em> 初始化 </em>/</div><div class="notion-text notion-block-b307845272d649f8aba9504d1c6982e4">void U1_Init(uint32_t bandrate);</div><div class="notion-text notion-block-bb01fa1d654f4065ab4278b2f17b6f30">/<em> 初始化UCB控制块指针 </em>/</div><div class="notion-text notion-block-a34e18515b1142f2b8f4c39ccf32cc66">void U1_PtrInit(void);</div><div class="notion-text notion-block-9878cadc7cb94ed3aaad12f50fd73348">/<em> 转移RxBuff数据到TxBuff </em>/</div><div class="notion-text notion-block-7e6e7f6219714cf78ec054f40b82a284">void U1_DataRxToTx(uint8_t* data, uint32_t data_len);</div><div class="notion-text notion-block-f7ca964a7ef7437eadea248e865544b7">/<em> 总控结构体 </em>/</div><div class="notion-text notion-block-802ab8f0fcb84f6b8cffbe74bec04f89">extern UCB  uart1;</div><div class="notion-text notion-block-043003d05eb54c1a843000fc4afb01db">/<em> 缓冲区 </em>/</div><div class="notion-text notion-block-9f9bad2d010441149aea256e28a862c4">extern uint8_t U1_Rx_Buff[U1_RX_SIZE];</div><div class="notion-text notion-block-ff43ada6f76f4c7aa62cae16a8df34ed">extern uint8_t U1_Tx_Buff[U1_TX_SIZE];</div><div class="notion-text notion-block-680407aa0c3e4ec7b3666b4eadb300b7">/<em> 状态位 </em>/</div><div class="notion-text notion-block-e7279ef632ff4f10a23480c1b075fdec">extern uint8_t rxState;</div><div class="notion-text notion-block-a1e802b743e1497a8a6b2f98fb68747a">#endif</div></div></details><details class="notion-toggle notion-block-b5317c0862554363bc9dc9f6f816b8e6"><summary><h4 class="notion-h notion-h3 notion-block-b5317c0862554363bc9dc9f6f816b8e6" data-id="b5317c0862554363bc9dc9f6f816b8e6"><span><div id="b5317c0862554363bc9dc9f6f816b8e6" class="notion-header-anchor"></div><span class="notion-h-title">uart.c</span></span></h4></summary><div><div class="notion-text notion-block-4aec02170aa64116bc62924a2476ac70">#include &quot;uart.h&quot;</div><div class="notion-text notion-block-6165bfde32ce44a3a192e65a07994a49">/<em> 创建串口总控结构体 </em>/</div><div class="notion-text notion-block-e6fdd5d1a8854475bcddecd2f17a47e1">UCB uart1;</div><div class="notion-text notion-block-ce7a45d008974853883349fa0b0b7523">/<em> 缓冲区 </em>/</div><div class="notion-text notion-block-a425fd3926ae4e8b8b0cfe876265536d">uint8_t U1_Rx_Buff[U1_RX_SIZE];</div><div class="notion-text notion-block-3a8d2e06fa2840eda01dc944dc69f657">uint8_t U1_Tx_Buff[U1_TX_SIZE];</div><div class="notion-text notion-block-2b220c98ac2c4f9f8a181342d98df129">/<em> 初始化串口 </em>/</div><div class="notion-text notion-block-dd4f4859728a4675bc80faf61d96d420">void U1_Init(uint32_t bandrate){<div class="notion-text-children"><div class="notion-text notion-block-5081530e55114e7b9dd02346fdf728f6">uart1.uart.Instance = USART1;                    //使用那个串口</div><div class="notion-text notion-block-6d8f656569894f159e600eb0a0d7ee03">uart1.uart.Init.BaudRate = bandrate;             //波特率</div><div class="notion-text notion-block-6520de719d0b4252baa6cda5867e3e9d">uart1.uart.Init.WordLength = UART_WORDLENGTH_8B; //数据位长度</div><div class="notion-text notion-block-ce8e1a6f2ca64129966b8d32f267a241">uart1.uart.Init.StopBits = UART_STOPBITS_1;      //停止位</div><div class="notion-text notion-block-ed283fad0b814fa5a5a5e06fece0a5c2">uart1.uart.Init.Parity = UART_PARITY_NONE;       //校验模式</div><div class="notion-text notion-block-7a213d8509084d5594936a247c21dc95">uart1.uart.Init.Mode = UART_MODE_TX_RX;          //传输模式</div><div class="notion-text notion-block-1322058ef4d142939c1b75f182e6fc59">uart1.uart.Init.HwFlowCtl = UART_HWCONTROL_NONE; //流控</div><div class="notion-text notion-block-a3b22f75d25047278d99594f44ebf926">HAL_UART_Init(&amp;uart1.uart);</div><div class="notion-text notion-block-b59fdcb4e7b340e3bc66c639711bcfc4">/<em> 初始化UCB控制块指针 </em>/</div><div class="notion-text notion-block-ddbe34099ab34207a538bf804737b3e7">U1_PtrInit();</div><div class="notion-text notion-block-2ed4a674619e410c808d62155bb3063d">/<em> 打开空闲中断 </em>/</div><div class="notion-text notion-block-0a17da2c39084bc3adc12106e0c74a00">__HAL_UART_ENABLE_IT(&amp;uart1.uart,UART_IT_IDLE);</div><div class="notion-text notion-block-1163223a60b644c78e46b9e8e2d6c6e8">/<em> 开始接收数据 </em>/</div><div class="notion-text notion-block-85db07311e8f44bebea7ea9f9ce5062e">HAL_UART_Receive_IT(&amp;uart1.uart, uart1.rxInPtr-&gt;start, U1_RX_MAX);  //接收位置为当前LCB位置控制块的In指针所指向的缓冲区的位置</div></div></div><div class="notion-text notion-block-dbccad1a37604120983a75f40cecfc6a">}</div><div class="notion-text notion-block-c1971bf1e54a4c66b393df945d85d0c9">/<em> 初始化U1_UCB控制块指针 </em>/</div><div class="notion-text notion-block-ac970ca00f8b43f985865fa5310e4bd7">void U1_PtrInit(void){<div class="notion-text-children"><div class="notion-text notion-block-fedd454b1d2d4ab78f42209949ddc50f">uart1.rxCount  = 0;</div><div class="notion-text notion-block-3c96df61a1ce4a8b9e3132f5f5c4c9ee">uart1.rxInPtr  = &amp;uart1.rxLocation[0];</div><div class="notion-text notion-block-0f6f71c2e9ac468c998b5975a8700a27">uart1.rxOutPtr = &amp;uart1.rxLocation[0];</div><div class="notion-text notion-block-5d893f9814a24e158de775d01eaac37f">uart1.rxEndPtr = &amp;uart1.rxLocation[9];</div><div class="notion-text notion-block-a14e975e6bdf40b4ae9d582b8505574d">uart1.rxInPtr-&gt;start = &amp;U1_Rx_Buff[0];      //让当前接收位置控制块的start，指向下一次接收到的数据将要存放的位置</div><div class="notion-text notion-block-d458d436b1b546ff8a4322a6c21641e1">uart1.txCount  = 0;</div><div class="notion-text notion-block-b7a14282eee34c349137483849211016">uart1.txInPtr  = &amp;uart1.txLocation[0];</div><div class="notion-text notion-block-a6809052efda44a7b3a305e165328cb4">uart1.txOutPtr = &amp;uart1.txLocation[0];</div><div class="notion-text notion-block-f8fe39000f2e41659374aab37093d68a">uart1.txEndPtr = &amp;uart1.txLocation[9];</div><div class="notion-text notion-block-72d503bca7fc4b7184d1834bee39a6a3">uart1.txInPtr-&gt;start = &amp;U1_Tx_Buff[0];      //让当前发送位置控制块的start，指向下一次需要发送的数据的存放位置</div></div></div><div class="notion-text notion-block-e0fb16f18415413c818138f47fbf4f1a">}</div><div class="notion-text notion-block-71bf43875f7c4ec287b4b3835f662ef9">/<em> 转移U1_Rx_Buff数据到 U1_Tx_Buff </em>/</div><div class="notion-text notion-block-aabf55d5ee3c4a11b3660774753bf36b">void U1_DataRxToTx(uint8_t* data, uint32_t data_len){<div class="notion-text-children"><div class="notion-text notion-block-ded3f4dbbe56408cbcf8d2dc36fa1b51">/<em> 判断剩余空间是否足够，要不要回卷 </em>/</div><div class="notion-text notion-block-b4c532d4c3094ca2b3d6a912d0f71792">if((U1_TX_SIZE - uart1.txCount) &gt; data_len){    <div class="notion-text-children"><div class="notion-text notion-block-77acd4762b494be388761205fc8d3105">/<em> 如果够 </em>/</div><div class="notion-text notion-block-3596ab1491274c15ab273efa79609b7b">uart1.txInPtr-&gt;start = &amp;U1_Tx_Buff[uart1.txCount];</div></div></div><div class="notion-text notion-block-9d0f3f7f249c4564b9e52e891e40bf06">}</div><div class="notion-text notion-block-9bb659b95ce543aaae4dc363568385c2">else{/<em> 如果剩余空间不够 </em>/<div class="notion-text-children"><div class="notion-text notion-block-691494f1493a4902bd88be2c6c12324a">uart1.txCount = 0;</div><div class="notion-text notion-block-1dd059264d6740eb98e15d73f4f11b21">uart1.txInPtr-&gt;start = &amp;U1_Tx_Buff[0];</div></div></div><div class="notion-text notion-block-d591df74ee9848aba999b44f01abff8d">}</div><div class="notion-text notion-block-702efee5827a41f084f39ac82cc03293">/<em> 复制data到U1_Tx_Buff缓冲区 </em>/</div><div class="notion-text notion-block-ca8c05a1a7564848929ed98cf00dd465">memcpy(uart1.txInPtr-&gt;start, data, data_len);</div><div class="notion-text notion-block-e06dfa88877d4803a46498d8e87e8c79">/<em> 累加txCount </em>/</div><div class="notion-text notion-block-245076b422bb4c37bb9a04f87f13691b">uart1.txCount += data_len;</div><div class="notion-text notion-block-2f2b4434d5784db3bcf64fa6b58a471c">/<em> 标记这次的发送数据的结束位置 </em>/</div><div class="notion-text notion-block-5e95b8ed1e614f3691870a9e2c53f0f6">uart1.txInPtr-&gt;end = &amp;U1_Tx_Buff[uart1.txCount - 1];</div><div class="notion-text notion-block-dcfa5a9f884049f9affedefefa9bdd88">/<em> 移动txIn </em>/</div><div class="notion-text notion-block-0c8748f68ca64fe5bd764f4f07644186">uart1.txInPtr++;</div><div class="notion-text notion-block-6fa6cfa436aa4f31817c9ca91016c85a">/<em> 判断txIn指针是否需要回卷 </em>/</div><div class="notion-text notion-block-1eabf2d671404c98a2ff475a10a5d60f">if(uart1.txInPtr == uart1.txEndPtr){<div class="notion-text-children"><div class="notion-text notion-block-79f8266c29984c6dbc66d400e66cf9af">uart1.txInPtr = &amp;uart1.txLocation[0];</div></div></div><div class="notion-text notion-block-436baa33d5b14c438f365f5d57506b1d">}</div></div></div><div class="notion-text notion-block-7d84222d1d6c4d4e8e6bd8715ab7c489">}</div><div class="notion-text notion-block-ee8527fbc17a4a6f8031aacdb91d40e7">/<em> UART硬件初始化回调 </em>/</div><div class="notion-text notion-block-f2d76aa4472b432990cfd6ea80dcc86c">void HAL_UART_MspInit(UART_HandleTypeDef *huart){<div class="notion-text-children"><div class="notion-text notion-block-4f9cb8571a8a48ef8eb57f0c4df2a0d8">GPIO_InitTypeDef GPIO_InitType;</div><div class="notion-text notion-block-1eab1f4d869e4203b7590fd817f5426b">if(huart-&gt;Instance == USART1){          //判断那个串口在进行初始化<div class="notion-text-children"><div class="notion-text notion-block-56613e91bc4742d1941428bf109713e6">__HAL_RCC_USART1_CLK_ENABLE();</div><div class="notion-text notion-block-1f04da2255b94158ac7c8bec5c9bca4f">__HAL_RCC_GPIOA_CLK_ENABLE();</div><div class="notion-text notion-block-b18474bb655a411d969d62261c45480b">GPIO_<a class="notion-link" href="http://InitType.Pin" target="_blank" rel="noopener noreferrer">InitType.Pin</a> = GPIO_PIN_9;</div><div class="notion-text notion-block-04fd5310f6b545dda59b81f3e6f8a608">GPIO_InitType.Mode = GPIO_MODE_AF_PP;</div><div class="notion-text notion-block-5690afe010d348bd898d2d418930bfb5">GPIO_InitType.Speed = GPIO_SPEED_FREQ_MEDIUM;</div><div class="notion-text notion-block-29c30fad616545f6a233bb61cc6e7a65">HAL_GPIO_Init(GPIOA,&amp;GPIO_InitType);</div><div class="notion-text notion-block-f85d4ef5529544318044b941e8c4735b">GPIO_<a class="notion-link" href="http://InitType.Pin" target="_blank" rel="noopener noreferrer">InitType.Pin</a> = GPIO_PIN_10;</div><div class="notion-text notion-block-5a8c02fd6d594e14834419bed3d390b9">GPIO_InitType.Mode = GPIO_MODE_AF_INPUT;</div><div class="notion-text notion-block-d33e395476c24fb69925d96aa7fbb54a">GPIO_InitType.Pull = GPIO_NOPULL;</div><div class="notion-text notion-block-97fead1742f6495f9762469ee5fc059c">HAL_GPIO_Init(GPIOA,&amp;GPIO_InitType);</div><div class="notion-text notion-block-f3f556f388a64871a9fea6a3ac98de08">//打开了串口1的总中断</div><div class="notion-text notion-block-b5e06e1eea0e4383bbb2a995fb760774">HAL_NVIC_SetPriority(USART1_IRQn,3,0);</div><div class="notion-text notion-block-37b0941c6ee8462b8d8bbac17d782625">HAL_NVIC_EnableIRQ(USART1_IRQn);</div></div></div><div class="notion-text notion-block-e4138e909ca74d258adfe4d8cf265ee3">}else if(huart-&gt;Instance == USART2){<div class="notion-text-children"><div class="notion-text notion-block-b137c1b460d946c7a65019974f0c5397">__HAL_RCC_GPIOA_CLK_ENABLE();</div><div class="notion-text notion-block-993f936ba2bc4bf9bcf258e75ce1d3bc">__HAL_RCC_USART2_CLK_ENABLE();</div><div class="notion-text notion-block-5aaed051db0c469fa1bc54910a361d8f">GPIO_<a class="notion-link" href="http://InitType.Pin" target="_blank" rel="noopener noreferrer">InitType.Pin</a> = GPIO_PIN_2;</div></div></div><div class="notion-text notion-block-8a59abcc086640f78bc9acbae3b5f660">GPIO_InitType.Mode = GPIO_MODE_AF_PP;</div><div class="notion-text notion-block-43bc83a1f0c643e28eb0c1e4245d1816">GPIO_InitType.Speed = GPIO_SPEED_FREQ_MEDIUM;</div><div class="notion-text notion-block-ce59d064333a492fbbc4c455e18120d3">HAL_GPIO_Init(GPIOA,&amp;GPIO_InitType);</div><div class="notion-text notion-block-04ae283b3a2d445abad4eac9a6c4feae">GPIO_<a class="notion-link" href="http://InitType.Pin" target="_blank" rel="noopener noreferrer">InitType.Pin</a> = GPIO_PIN_3;</div><div class="notion-text notion-block-3d02897485244237a5413456df8a104b">GPIO_InitType.Mode = GPIO_MODE_AF_INPUT;</div><div class="notion-text notion-block-e3abe63b169f4450a4d239e8fb6c7911">GPIO_InitType.Pull = GPIO_NOPULL;</div><div class="notion-text notion-block-a528bd6207754d85a2eb30fce41b2521">HAL_GPIO_Init(GPIOA,&amp;GPIO_InitType);</div></div></div><div class="notion-text notion-block-a63c57038421484f800dc4c087ebb1b0">}else if(huart-&gt;Instance == USART3){<div class="notion-text-children"><div class="notion-text notion-block-36be13ceee18401aa0a6fd10121f4ff7">__HAL_RCC_GPIOB_CLK_ENABLE();</div><div class="notion-text notion-block-a0b763961eb44b5db9f8b614b1a6bfc0">__HAL_RCC_USART3_CLK_ENABLE();</div><div class="notion-text notion-block-ba4d87d20a214c1899d54fb06024a4ad">GPIO_<a class="notion-link" href="http://InitType.Pin" target="_blank" rel="noopener noreferrer">InitType.Pin</a> = GPIO_PIN_10;</div><div class="notion-text notion-block-a33cd8a65d8b4fa5a35a81905bc779cc">GPIO_InitType.Mode = GPIO_MODE_AF_PP;</div><div class="notion-text notion-block-099205e3d2fb4695acf77f4668ae3b15">GPIO_InitType.Speed = GPIO_SPEED_FREQ_MEDIUM;</div><div class="notion-text notion-block-0c085260ddd64b4f929e5e40f40d43ad">HAL_GPIO_Init(GPIOB,&amp;GPIO_InitType);</div><div class="notion-text notion-block-a7eae31ec1c94903bf40662c7dff4f7e">GPIO_<a class="notion-link" href="http://InitType.Pin" target="_blank" rel="noopener noreferrer">InitType.Pin</a> = GPIO_PIN_11;</div><div class="notion-text notion-block-edfbc3a07c6847038ba396254fdd903c">GPIO_InitType.Mode = GPIO_MODE_AF_INPUT;</div><div class="notion-text notion-block-cbc98529afdb46239c04e7a938d644f4">GPIO_InitType.Pull = GPIO_NOPULL;</div><div class="notion-text notion-block-f883a7a9345f4b22b988ff8f7f10a978">HAL_GPIO_Init(GPIOB,&amp;GPIO_InitType);</div></div></div><div class="notion-text notion-block-73815d39261f4fa78839d036bc73eaaa">}</div></div></details><div class="notion-text notion-block-a0caff04df83454a99cb451cd2e12749">}</div><div class="notion-text notion-block-676e37dd98ec49df8295bf8fd6bcd99f">/<em> 强声明的接收完成回调函数 </em>/</div><div class="notion-text notion-block-d68d4d0f17af4bcb86ee39b82619d29d">void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)</div><div class="notion-text notion-block-805e97d2c4e24bb5a0e7742c92b3ee8d">{<div class="notion-text-children"><div class="notion-text notion-block-9304ac2c2d9a4f7fa127c3318f06dbc9">if(huart-&gt;Instance == USART1){</div><div class="notion-text notion-block-b014cac8a3744e80aa3e84158801c84e">}else if(huart-&gt;Instance == USART2){</div><div class="notion-text notion-block-0ba721f2414b4f9fa6671a6dfc134460">}else if(huart-&gt;Instance == USART3){</div><div class="notion-text notion-block-580cdbb230e443ebbf02c08173c475a1">}</div></div></div><div class="notion-text notion-block-4eba585d79234327922236dd713bbce8">}</div><div class="notion-text notion-block-235a7a03b1134949bc05e235a5ce4ccf">/<em> 强声明的错误回调函数 </em>/</div><div class="notion-text notion-block-9fffbf1b706a44c98a39fbb81650b650">void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart)</div><div class="notion-text notion-block-2f2d178aef8f42b6a8c3d220b101294f">{<div class="notion-text-children"><div class="notion-text notion-block-b7e7d249a978435095cc0e4a330476c9">if(huart-&gt;Instance == USART1){<div class="notion-text-children"><div class="notion-text notion-block-28a25f79a15441acae4867b216d3eff1">}else if(huart-&gt;Instance == USART2){</div><div class="notion-text notion-block-30f0cabba5224043ae7c5f0c74c66d75">}else if(huart-&gt;Instance == USART3){</div><div class="notion-text notion-block-f0d9880a18fb409480888015736df9f9">}</div></div></div></div></div><div class="notion-text notion-block-3f20b9550bcd47ffaf2b78ae7f649326">}</div><div class="notion-text notion-block-bcbe038e80844612b036d4d78aaec8a1">/<em> 强声明的发送完成回调函数 </em>/</div><div class="notion-text notion-block-a30953b7c1b64a66a868a3231c525318">void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)</div><div class="notion-text notion-block-1bffdc1895b947a18ab15ab3074d356b">{<div class="notion-text-children"><div class="notion-text notion-block-31d615cac58f4aa4a634be6e51be442d">if(huart-&gt;Instance == USART1){<div class="notion-text-children"><div class="notion-text notion-block-5265a8349ca44902854404b701e96710">/<em> 发送完成，标志位清零 </em>/</div><div class="notion-text notion-block-abb331bb03ef46ac8f2eed6b2afa07eb">uart1.TxState = 0;</div></div></div><div class="notion-text notion-block-49b24c66b495479fa51f06aa88702640">}else if(huart-&gt;Instance == USART2){</div><div class="notion-text notion-block-b83a7f01673641f29bd8e495c9efdf6c">}else if(huart-&gt;Instance == USART3){</div><div class="notion-text notion-block-56eb4335a3d740a78b6a8d3ff4f6d582">}</div></div></div><div class="notion-text notion-block-215b98b1fb924e18a2569cea49fc20b8">}</div><div class="notion-text notion-block-bef29e7135d844beb3a0281f97fdc218">/<em> 强声明的接收终止回调函数 </em>/</div><div class="notion-text notion-block-81537d672a7849b19ed32cf109b56018">void HAL_UART_AbortReceiveCpltCallback(UART_HandleTypeDef *huart)</div><div class="notion-text notion-block-759cdbf1469544d8b8faacaf3858bc9e">{<div class="notion-text-children"><div class="notion-text notion-block-57dce3f4c57e4b23b1bed9113eb26175">if(huart-&gt;Instance == USART1){<div class="notion-text-children"><div class="notion-text notion-block-aad8174893b7451798c13ce919eb324f">/<em> 标记结束位置 </em>/</div><div class="notion-text notion-block-b18524a94eed4bc7a4ba726ec05e248c">uart1.rxInPtr-&gt;end = &amp;U1_Rx_Buff[uart1.rxCount - 1];</div><div class="notion-text notion-block-22b656f90be54abc8fa9b7edb4def1a6">/<em> 挪动rxIn指针 </em>/</div><div class="notion-text notion-block-116cfb502b3545b0b4fbf9046f9ab5da">uart1.rxInPtr++;</div><div class="notion-text notion-block-7b08138af0be453d84ce0b09e221c7d4">/<em> 判断rxIn指针是否需要回卷 </em>/</div><div class="notion-text notion-block-b4cc77c9b57d43238aebd950154067f6">if(uart1.rxInPtr == uart1.rxEndPtr){<div class="notion-text-children"><div class="notion-text notion-block-1e4cac58c8ef493b870eda460fb3627a">uart1.rxInPtr = &amp;uart1.rxLocation[0];</div></div></div><div class="notion-text notion-block-cc2f5a4a7bb2433aac151f1c018cde2d">}</div><div class="notion-text notion-block-ac87acd824944d5d9cd0949f34674e14">/<em> 判断接收缓冲区是否需要回卷 </em>/</div><div class="notion-text notion-block-892af05a8508474bb4a27ed7b4515e15">if((U1_RX_SIZE - uart1.rxCount) &lt; U1_RX_MAX){<div class="notion-text-children"><div class="notion-text notion-block-3ee2fda7bb154600ade462abb3a44768">uart1.rxCount = 0;</div><div class="notion-text notion-block-8a990c95b95b4edb9ed77e5fa5aef141">uart1.rxInPtr-&gt;start = &amp;U1_Rx_Buff[0];</div></div></div><div class="notion-text notion-block-ed9839b51f1c4f97a90488bfa7347796">}else{<div class="notion-text-children"><div class="notion-text notion-block-d0b8b073763c403b9be94020480ada27">/<em> 剩余位置够 </em>/</div><div class="notion-text notion-block-46fbfbc612d84cdfac0429f954db5e89">uart1.rxInPtr-&gt;start = &amp;U1_Rx_Buff[uart1.rxCount];</div></div></div><div class="notion-text notion-block-703363f0b5504e83a5c96552256cefdd">}</div><div class="notion-text notion-block-59f9a380d7d54be6bb95ccb3e1991708">/<em> 重新开启中断接收 </em>/</div><div class="notion-text notion-block-a86ab009c090496b88fd059d49151060">HAL_UART_Receive_IT(&amp;uart1.uart, uart1.rxInPtr-&gt;start, U1_RX_MAX);</div></div></div><div class="notion-text notion-block-daa8631ee6494f75b3093f9a16a883f9">}else if(huart-&gt;Instance == USART2){</div><div class="notion-text notion-block-934a8aa5b610467a8d9edeb367b88298">}else if(huart-&gt;Instance == USART3){</div><div class="notion-text notion-block-9e43ee65169d4dbdbbb49fd94043df96">}</div></div></div><div class="notion-text notion-block-8f1b933ad65c4920a2c5937e752a6439">}</div></div></details><details class="notion-toggle notion-block-023de58e922f4272980eddbf7d2a188c"><summary><h4 class="notion-h notion-h3 notion-block-023de58e922f4272980eddbf7d2a188c" data-id="023de58e922f4272980eddbf7d2a188c"><span><div id="023de58e922f4272980eddbf7d2a188c" class="notion-header-anchor"></div><span class="notion-h-title">stm32fxx_It.c</span></span></h4></summary><div><div class="notion-text notion-block-c43493e2f5de452686c9decb9639bb8c">/<em>-------------------------------------------------</em>/</div><div class="notion-text notion-block-5139198b83dd4c6e86ccf4f6adffa4cf">/<em>                                                 </em>/</div><div class="notion-text notion-block-f76846d217a948a79297af9f3647b22f">/<em>          实现各种中断服务函数的源文件           </em>/</div><div class="notion-text notion-block-d707c922325243e983f14e8e11b76d3e">/<em>                                                 </em>/</div><div class="notion-text notion-block-6ca8347d5d2e4f4bbf1f881efe4c7c49">/<em>-------------------------------------------------</em>/</div><div class="notion-text notion-block-f0ce07c58023453fae639660f227214c">#include &quot;stm32f1xx_hal.h&quot;   </div><div class="notion-text notion-block-bd0be2bb6d0640958b947efcb472be3c">#include &quot;stm32f1xx_it.h&quot;</div><div class="notion-text notion-block-072e25500c684760b3c682a342dbd2c6">#include &quot;uart.h&quot;</div><div class="notion-text notion-block-6b768eec6cd44480818c9f0aa18fa494">void EXTI15_10_IRQHandler(void)</div><div class="notion-text notion-block-7f19eef054414ef79106a666ab1be780">{<div class="notion-text-children"><div class="notion-text notion-block-e4fae26bbc3247b0ab33f45b611db451">HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_13);</div></div></div><div class="notion-text notion-block-5237b6b09cca4da594de2e02167b11eb">}</div><div class="notion-text notion-block-f070e24af24d4cf3aa19ad7e559a10b5">void EXTI0_IRQHandler(void)</div><div class="notion-text notion-block-7e0be349d19c484695bdeba1959052f0">{<div class="notion-text-children"><div class="notion-text notion-block-22c8c731aba140c5b1c95655d3cf97bc">HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_0);</div></div></div><div class="notion-text notion-block-a02cafa0a7544abb947652f702555840">}</div><div class="notion-text notion-block-9e45183ddf4e4113b6736021df045f1b">/<em>-------------------------------------------------</em>/</div><div class="notion-text notion-block-dc52259d273c4d2ea7366e4fa84cb075">/<em>函数名：不可屏蔽中断处理函数                     </em>/</div><div class="notion-text notion-block-45b42407ab0d4cb497bc2afe9733677b">/<em>参  数：无                                       </em>/</div><div class="notion-text notion-block-c2981bd0253b43909eef93325a6565bc">/<em>返回值：无                                       </em>/</div><div class="notion-text notion-block-0477a72149584e0cb6f086341d22b20e">/<em>-------------------------------------------------</em>/</div><div class="notion-text notion-block-700491a2a399445bbd8a0784c95bddf0">void NMI_Handler(void)</div><div class="notion-text notion-block-fa045681bcdc4d6282925b9b238b1a84">{</div><div class="notion-text notion-block-a7143743deb84727ae4117f55a82f49a">}</div><div class="notion-text notion-block-52d6957d020c4b01ac2c50f5d8f61a4f">/<em>-------------------------------------------------</em>/</div><div class="notion-text notion-block-78568542831247398788708aed8c58a1">/<em>函数名：硬件出错后进入的中断处理函数             </em>/</div><div class="notion-text notion-block-4a996ce722964c548b9d4a364d4e0a3e">/<em>参  数：无                                       </em>/</div><div class="notion-text notion-block-e317adda49a64b4e9cf1922bdb1b4c90">/<em>返回值：无                                       </em>/</div><div class="notion-text notion-block-f041673edd28452f96bda95c33a00bd0">/<em>-------------------------------------------------</em>/</div><div class="notion-text notion-block-d61b6e2ee09e429694827d40217f4f4b">void HardFault_Handler(void)</div><div class="notion-text notion-block-8b818846d2f54317800971c1947cb997">{</div><div class="notion-text notion-block-c34ac7559b6d4cb7be4fab7b2da8d298">}</div><div class="notion-text notion-block-f08b090778ff4b0481be28fcf2e63050">/<em>-------------------------------------------------</em>/</div><div class="notion-text notion-block-afb92534044d4fbea0e7ad005f9c49f9">/<em>函数名：软中断，SWI 指令调用的处理函数           </em>/</div><div class="notion-text notion-block-78e3cf864e5a459cb853c1dccd3a9c90">/<em>参  数：无                                       </em>/</div><div class="notion-text notion-block-4ed9859e012342a9b0fad06cd6f46d94">/<em>返回值：无                                       </em>/</div><div class="notion-text notion-block-0e77ed1190794609843a595f175902f5">/<em>-------------------------------------------------</em>/</div><div class="notion-text notion-block-993b0446eeff467c85f952095a7e3a7e">void SVC_Handler(void)</div><div class="notion-text notion-block-267c36c4a982453b85680c6d1c5152db">{</div><div class="notion-text notion-block-0689a1ceec9f457db8904e6b5d853dc1">}</div><div class="notion-text notion-block-dabf60a1872f4d91b82163e06f9925e5">/<em>-------------------------------------------------</em>/</div><div class="notion-text notion-block-2a030ccace6e42028c954c66e06c928e">/<em>函数名：可挂起的系统服务处理函数                 </em>/</div><div class="notion-text notion-block-101b3f6a55aa42aab50c2008298d94b5">/<em>参  数：无                                       </em>/</div><div class="notion-text notion-block-4d44ae876294421285da3f7de968cef7">/<em>返回值：无                                       </em>/</div><div class="notion-text notion-block-3bc244568a1c417d987e5dee37dce275">/<em>-------------------------------------------------</em>/</div><div class="notion-text notion-block-99e11098a3b9421f8d10c8a69c9cce60">void PendSV_Handler(void)</div><div class="notion-text notion-block-fa5e86025f304b50aad85e840b4c8f8c">{</div><div class="notion-text notion-block-fdc45ce671ec4d08b2bdf549aea5f4e4">}</div><div class="notion-text notion-block-857d5ba5b4594baaae87d50b726dc52d">/<em>-------------------------------------------------</em>/</div><div class="notion-text notion-block-13c3964b2c4549c0bbddb74c91d34527">/<em>函数名：SysTic系统嘀嗒定时器处理函数             </em>/</div><div class="notion-text notion-block-9bb28fff2e414922a2ed089f83dc94c5">/<em>参  数：无                                       </em>/</div><div class="notion-text notion-block-04fb09eba82e444a93d23b514cfc30ac">/<em>返回值：无                                       </em>/</div><div class="notion-text notion-block-2fe4fc034a924c6c83adc0f21edf1a61">/<em>-------------------------------------------------</em>/</div><div class="notion-text notion-block-d8bf9278516143c99d359b61f8c689a5">void SysTick_Handler(void)</div><div class="notion-text notion-block-c462ade7d8f14c5a9d59abdac5f93b6d">{  <div class="notion-text-children"><div class="notion-text notion-block-67e16ccacd5748d5aa3e0e969d771554">HAL_IncTick();</div></div></div><div class="notion-text notion-block-33ee564761b6477688a79ae96294daef">}</div><div class="notion-text notion-block-047cc4d95bc140c9a49fe7f9d9b92fff">/<em>-------------------------------------------------</em>/</div><div class="notion-text notion-block-d1a79706edf3473dbb44bb7f047b8e07">/<em>函数名：串口1中断处理函数             </em>/</div><div class="notion-text notion-block-ff3d180b961146f28f2ff57bd247ef83">/<em>参  数：无                                       </em>/</div><div class="notion-text notion-block-dfa4716d544d4aee9dc486dad8e274fb">/<em>返回值：无                                       </em>/</div><div class="notion-text notion-block-542ec45429144832b63b9832cb592b3e">/<em>-------------------------------------------------</em>/</div><div class="notion-text notion-block-c43a9a1c06384d4594dc428dcf2e5018">void USART1_IRQHandler(void)</div><div class="notion-text notion-block-fb0772f8f58d4f4e9445f446a0019888">{  <div class="notion-text-children"><div class="notion-text notion-block-91a8dfb438a147479130d4f593bddd67">HAL_UART_IRQHandler(&amp;uart1.uart);</div><div class="notion-text notion-block-7c0dbdf11dfd49899e334bb9315ddcfb">/<em> 在每次进入中断后，判断是否为空闲中断 </em>/</div><div class="notion-text notion-block-b785fc6dd4d94598bcd7a4cdbe5e8bf0">if(__HAL_UART_GET_FLAG(&amp;uart1.uart, UART_FLAG_IDLE)){<div class="notion-text-children"><div class="notion-text notion-block-fd2bf7fa11814ef9a4fc6f7783fe6002">/<em> 清除空闲标志位 </em>/</div><div class="notion-text notion-block-a0c535920cef4af3aa2e6ccb6af9435c">//__HAL_UART_CLEAR_FLAG(&amp;uart1.uart, UART_FLAG_IDLE);</div><div class="notion-text notion-block-224a2b1468f748608a4d7dbe8c625804">__HAL_UART_CLEAR_IDLEFLAG(&amp;uart1.uart);</div><div class="notion-text notion-block-a6d2733768364e9eba5f5974ecce02bc">/<em> 获取这次传输了多少字节 </em>/</div><div class="notion-text notion-block-a807af6ebb1a4ef297c88dfc59203a0f">uart1.rxCount += (U1_RX_MAX - uart1.uart.RxXferCount);</div><div class="notion-text notion-block-9ae926ed9e6d4749aed0f15d83dd0526">/<em> 终止当前的接收(会把RxferCount清零) </em>/</div><div class="notion-text notion-block-06c7185bbc1e437485b18eb62fb8a920">HAL_UART_AbortReceive_IT(&amp;uart1.uart);</div></div></div><div class="notion-text notion-block-bed6e6220d8141ee880b0d23f293a668">}</div></div></div><div class="notion-text notion-block-cba12ff4d1d54d389294aeb05e07987b">}</div><details class="notion-toggle notion-block-b70f50f8e8d641aaa5023cd7ef7d7a79"><summary><h4 class="notion-h notion-h3 notion-block-b70f50f8e8d641aaa5023cd7ef7d7a79" data-id="b70f50f8e8d641aaa5023cd7ef7d7a79"><span><div id="b70f50f8e8d641aaa5023cd7ef7d7a79" class="notion-header-anchor"></div><span class="notion-h-title">main.c</span></span></h4></summary><div><div class="notion-text notion-block-30815ca4fa0049ef9bcf7b7e720d8c68">#include &quot;stm32f1xx_hal.h&quot;</div><div class="notion-text notion-block-bf5c3167937d49efb836215cde88327d">#include &quot;rcc.h&quot;</div><div class="notion-text notion-block-6265e8ce43954f08b07ce87b9c16f6f9">#include &quot;led.h&quot;</div><div class="notion-text notion-block-5691b1bf86314a7e96a833376ce1f0a7">#include &quot;sw.h&quot;</div><div class="notion-text notion-block-376d731288ab4993ab71a056da615317">#include &quot;uart.h&quot;</div><div class="notion-text notion-block-2d180f8b67f04875b10dc58b015e8789">int main(void){<div class="notion-text-children"><div class="notion-text notion-block-0232e26082d645038416a30bb813fe65">HAL_Init();</div><div class="notion-text notion-block-74b9fb81b55f46a79c4086b5b2206f80">RccClock_Init();</div><div class="notion-text notion-block-4fdd041542eb4685bbb1fb6fbfce38a3">U1_Init(921600);</div><div class="notion-text notion-block-87ade06908164295828b0530401decc1">while(1){<div class="notion-text-children"><div class="notion-text notion-block-ee05a727a68c43d9a15540e9f588e914">/<em> 判断接收缓冲区是否有数据 </em>/</div><div class="notion-text notion-block-fb8c07a59e9340c1a6c3b43d3c43cd50">if(uart1.rxInPtr != uart1.rxOutPtr){<div class="notion-text-children"><div class="notion-text notion-block-ac4ddd73532945a1823d368425d60ce7">/<em> 转移这次接收的一段数据到发送缓冲区 </em>/</div><div class="notion-text notion-block-7ff161459e084378a182de2e9008d33a">U1_DataRxToTx(uart1.rxOutPtr-&gt;start, (uart1.rxOutPtr-&gt;end - uart1.rxOutPtr-&gt;start + 1));</div><div class="notion-text notion-block-148064506ec44a12a93cffe12feafe6f">/<em> 移动rxOutPtr到下一次cpy的地址 </em>/</div><div class="notion-text notion-block-43303dff442947289b572d08330dd875">uart1.rxOutPtr++;</div><div class="notion-text notion-block-fc8f46a04104461aa2d12b165d53ee78">/<em> 判断rxOutPtr是否需要回卷 </em>/</div><div class="notion-text notion-block-92e36265ccd74f9a8daa682106fb3102">if(uart1.rxOutPtr == uart1.rxEndPtr){<div class="notion-text-children"><div class="notion-text notion-block-bd8bffe50ee4430ebc90dbd47f2eda27">uart1.rxOutPtr = &amp;uart1.rxLocation[0];</div></div></div><div class="notion-text notion-block-54cf82c2813940338df7b328971a4e66">}</div></div></div><div class="notion-text notion-block-e1c6c6537de84ac6b5e32891bae3dc40">}</div><div class="notion-text notion-block-a5c7867899ab47d2b1cea0118d5ba686">/<em> 判断发送缓冲区是否有数据 </em>/</div><div class="notion-text notion-block-711bc862420a49b8b8997728eedae36b">if((uart1.txInPtr != uart1.txOutPtr) &amp;&amp; (uart1.TxState == 0) ){<div class="notion-text-children"><div class="notion-text notion-block-9c41cb7a55574e809c678f61399d8297">uart1.TxState = 1;</div><div class="notion-text notion-block-08776b1a59c0421faafc72e6543a46f2">/<em> 发送数据 </em>/</div><div class="notion-text notion-block-5ffcc87e91b842cc9ad63f0dce8c29ad">HAL_UART_Transmit_IT(&amp;uart1.uart, uart1. txOutPtr-&gt;start, (uart1.txOutPtr-&gt;end - uart1.txOutPtr-&gt;start + 1));</div><div class="notion-text notion-block-9c4d7abd81fc48c7a4a0f81c7be0aa14">/<em> 移动txOutPtr到下一次cpy的地址 </em>/</div><div class="notion-text notion-block-2b8a389a4df9431da50a8f7ec88ec9b2">uart1.txOutPtr++;</div><div class="notion-text notion-block-57b70dd5087847828d3c0ad706fe1c57">/<em> 判断txOutPtr是否需要回卷 </em>/</div><div class="notion-text notion-block-b2b7b956ec2e4bfe896a87b17ef5849e">if(uart1.txOutPtr == uart1.txEndPtr){<div class="notion-text-children"><div class="notion-text notion-block-4967e9dd7fd64a648b3c1a6a6ba8e2ff">uart1.txOutPtr = &amp;uart1.txLocation[0];</div></div></div><div class="notion-text notion-block-cac85dc1483842adaecbc33305fb6d78">}</div></div></div><div class="notion-text notion-block-3603ca2287ce45c69d0514b4b3112c40">}</div></div></div><div class="notion-text notion-block-e1e9d6ac11ea4462b21e77a0ee051a47">}</div></div></div><div class="notion-text notion-block-4279092af05c43159836ff3889811004">}<div class="notion-text-children"><div class="notion-blank notion-block-177b2e51b72c462684f5faf6915f2c69"> </div></div></div></div></details></div></details></div></details><details class="notion-toggle notion-block-99d6b72761bd459bb4925a8a56713ebf"><summary><h3 class="notion-h notion-h2 notion-h-indent-1 notion-block-99d6b72761bd459bb4925a8a56713ebf" data-id="99d6b72761bd459bb4925a8a56713ebf"><span><div id="99d6b72761bd459bb4925a8a56713ebf" class="notion-header-anchor"></div><span class="notion-h-title">七、HAL库：空闲中断方式实现串口123+不定长数据接收+循环收发缓冲区+收发数据</span></span></h3></summary><div><div class="notion-text notion-block-158986b20ac342688a9a6ef0e53266ca">在第七小节拓展而来：<b>实现串口1 2 3 同时收发数据，可以用来控制多个设备用</b></div><details class="notion-toggle notion-block-d3244bf5938a42eebe6bc0e64e02658c"><summary><h4 class="notion-h notion-h3 notion-block-d3244bf5938a42eebe6bc0e64e02658c" data-id="d3244bf5938a42eebe6bc0e64e02658c"><span><div id="d3244bf5938a42eebe6bc0e64e02658c" class="notion-header-anchor"></div><span class="notion-h-title">uart.h</span></span></h4></summary><div><div class="notion-text notion-block-07cd6613fdd64d8c9d31b5bbc4702b85">#ifndef __UART_H</div><div class="notion-text notion-block-4f5010ac552b4d5886221503fefa1102">#define __UART_H</div><div class="notion-text notion-block-dc7fff9e8f9848cfac92ead22d39d3d9">#include &quot;stm32f1xx_hal.h&quot;</div><div class="notion-text notion-block-12f28bfa6a3c423cafb36b56da83b778">#include &quot;stdint.h&quot;</div><div class="notion-text notion-block-ed4329524790470c85a13552c5bb2339">#include &quot;string.h&quot;</div><div class="notion-text notion-block-f2894ae4dbf74691a2aff7bea72b9155">/<em> 缓冲区宏定义 </em>/</div><div class="notion-text notion-block-c5a17effb70a4c82a649c5ca2c43d115">#define U1_RX_SIZE 2048         //接收缓冲区长度</div><div class="notion-text notion-block-2c34368125e14f81aeec8410938ecd64">#define U1_TX_SIZE 2048         //发送缓冲区长度</div><div class="notion-text notion-block-a4fa8f5d118445fd9643efa90c4ec511">#define U1_RX_MAX  256          //最大单次发送量（实际值 - 1 = 255字节）</div><div class="notion-text notion-block-b13fafa2a35e4afdb96be6709c1367ef">#define U2_RX_SIZE 2048</div><div class="notion-text notion-block-f336e08c4fd043ac979528fefb0953dd">#define U2_TX_SIZE 2048</div><div class="notion-text notion-block-92da4d6c00304f0cbb78521c981d72a8">#define U2_RX_MAX  256 </div><div class="notion-text notion-block-8e737e8b83bb453ba0109663e04dec63">#define U3_RX_SIZE 2048</div><div class="notion-text notion-block-42ab009d0fd54cb983970e916a08b76f">#define U3_TX_SIZE 2048</div><div class="notion-text notion-block-71dfe9e236e54f96b7313e93d82bf484">#define U3_RX_MAX  256 </div><div class="notion-text notion-block-600b74d6bdd749d08e2d308874c1c758">/<em> Location Ctrl Block </em>/</div><div class="notion-text notion-block-171fb58953ac490094cfe0961a56f4a8">/<em> （接收/发送）位置控制块 </em>/</div><div class="notion-text notion-block-3771c9329cd04d1bac82681a797d87dc">typedef struct{<div class="notion-text-children"><div class="notion-text notion-block-8a84757f4bbd40e6bbb9d71a96498c7d">uint8_t* start;</div><div class="notion-text notion-block-ce6661ffcae54371a8085e32ebc9f659">uint8_t* end;</div></div></div><div class="notion-text notion-block-6d7c4fef182e43409030ee57911b7995">}LCB;</div><div class="notion-text notion-block-dd81374672b3497c81dfc860b8e92373">/<em> Uart Ctrl Block </em>/</div><div class="notion-text notion-block-c8d62b3e14264f68a49680c7d8939404">/<em> 串口控制块 </em>/</div><div class="notion-text notion-block-f037e737ae3742709d72f0dea82ca6d0">typedef struct{<div class="notion-text-children"><div class="notion-text notion-block-fec57fbfc2ff456e8025d79362485cc4">uint32_t    rxCount;            //记录接收缓冲区中当前已有的数据量</div><div class="notion-text notion-block-5bdb71e5ed8642d186b01974d77636b2">uint32_t    txCount;            //记录发送缓冲区中当前已有的数据量</div><div class="notion-text notion-block-2590e849f47d431f928631d9816b3284">LCB         rxLocation[10];     //记录接收缓冲区每次接收的位置</div><div class="notion-text notion-block-7c7b2ad663df4209918947f1e05f3703">LCB         txLocation[10];     //记录发送缓冲区每次接收的位置</div><div class="notion-text notion-block-0b4c28158b7645a5836bf2831bc952c1">LCB*        rxInPtr;            //指向下次接收缓冲区存放位置</div><div class="notion-text notion-block-7558a37bd01a4a3b861dcd04aa7a7379">LCB*        rxOutPtr;           //指向下次接收缓冲区读取位置</div><div class="notion-text notion-block-7930f989e4484c58b67f4483582cfd68">LCB*        rxEndPtr;           //指向接收缓冲区结束位置</div><div class="notion-text notion-block-0110a36e725c4df5a629214c0ddbd964">LCB*        txInPtr;            //指向下次发送缓冲区存放位置</div><div class="notion-text notion-block-b30f64442a254309ab4cbe7397a24232">LCB*        txOutPtr;           //指向下次发送缓冲区读取位置</div><div class="notion-text notion-block-98fbc49642294890b083f0c5bd8221b4">LCB*        txEndPtr;           //指向发送缓冲区结束位置</div><div class="notion-text notion-block-491ad44a745d4f028abee7f55ed0ea37">UART_HandleTypeDef  uart;       //串口总控结构体</div><div class="notion-text notion-block-c1010014748345a6a28f1ce703c9d14f">uint8_t     TxState;            //发送忙碌标志位</div></div></div><div class="notion-text notion-block-325311b1666249788270244a8e37fc8e">}UCB;</div><div class="notion-text notion-block-2164cd821f0148a4b1569baa81f4c9ac">/<em> 初始化 </em>/</div><div class="notion-text notion-block-af9bd762896841bba5c80f7d866bffa7">void U1_Init(uint32_t bandrate);</div><div class="notion-text notion-block-19b78a8213bf49e6883c359970c7e3f9">void U2_Init(uint32_t bandrate);</div><div class="notion-text notion-block-29c5f3bd187a4dd5b26c7692a038817f">void U3_Init(uint32_t bandrate);</div><div class="notion-text notion-block-a76f36156e77400fbb9a9adb3eb9a5a0">/<em> 初始化UCB控制块指针 </em>/</div><div class="notion-text notion-block-9b3e13426ed0442d9cf6aea01f90bee8">void U1_PtrInit(void);</div><div class="notion-text notion-block-d772954d4bd247088079c653f487eb57">void U2_PtrInit(void);</div><div class="notion-text notion-block-e86aefbc6abf404a8f2d057aec6a0423">void U3_PtrInit(void);</div><div class="notion-text notion-block-404396d176d0461ca7518366a6a15f09">/<em> 转移RxBuff数据到TxBuff </em>/</div><div class="notion-text notion-block-e9e0a22cfa3448a5b3cde68b7575b040">void U1_DataRxToTx(uint8_t* data, uint32_t data_len);</div><div class="notion-text notion-block-56822f1c41fb45558f05be587f0b651c">void U2_DataRxToTx(uint8_t* data, uint32_t data_len);</div><div class="notion-text notion-block-09935a04ea674c16ade0a60e00bc3d86">void U3_DataRxToTx(uint8_t* data, uint32_t data_len);</div><div class="notion-text notion-block-a5febdc33c9841ffac2ea0d1973edcd2">/<em> 总控结构体 </em>/</div><div class="notion-text notion-block-101dec7b2f0b4d17b9d2cb2b50449a5c">extern UCB  uart1;</div><div class="notion-text notion-block-1974574221e34fc98f35c41c42e140ed">extern UCB  uart2;</div><div class="notion-text notion-block-7b0bd23e71a94bd9a488cf451d4c2fd9">extern UCB  uart3;</div><div class="notion-text notion-block-ed12ad64eab24c67ac75fafca215f18a">/<em> 缓冲区 </em>/</div><div class="notion-text notion-block-29ad352e5fad457fbc21a4f76e8cf443">extern uint8_t U1_Rx_Buff[U1_RX_SIZE];</div><div class="notion-text notion-block-6ca0a07a7d7244d78b65bf2aca8d85c1">extern uint8_t U1_Tx_Buff[U1_TX_SIZE];</div><div class="notion-text notion-block-5aa850e9943c4d02aed517ce53f79987">extern uint8_t U2_Rx_Buff[U2_RX_SIZE];</div><div class="notion-text notion-block-7140f3f498fb4f72bb49a8e30c8e17f3">extern uint8_t U2_Tx_Buff[U2_TX_SIZE];</div><div class="notion-text notion-block-443069c9299c4b4a87e5d963f40710bd">extern uint8_t U3_Rx_Buff[U3_RX_SIZE];</div><div class="notion-text notion-block-8bc7593d04c642c38b841da323927dad">extern uint8_t U3_Tx_Buff[U3_TX_SIZE];</div><div class="notion-text notion-block-3d22b8a46e2c40aeadb922ce1e465a20">#endif</div></div></details><details class="notion-toggle notion-block-bdf21c42d3ae4c5e8f63f21cd6073bae"><summary><h4 class="notion-h notion-h3 notion-block-bdf21c42d3ae4c5e8f63f21cd6073bae" data-id="bdf21c42d3ae4c5e8f63f21cd6073bae"><span><div id="bdf21c42d3ae4c5e8f63f21cd6073bae" class="notion-header-anchor"></div><span class="notion-h-title">uart.c</span></span></h4></summary><div><div class="notion-text notion-block-4ef1684646704032931a9407b934af1a">#include &quot;uart.h&quot;</div><div class="notion-text notion-block-4be0dcd342ee4913af7cf2a27d30a775">/<em> 创建串口总控结构体 </em>/</div><div class="notion-text notion-block-7aadc63ce5d34ab59c96d201e45ada3f">UCB uart1;</div><div class="notion-text notion-block-141581c120514683a616531c49b3117b">UCB uart2;</div><div class="notion-text notion-block-1990fb969f5a408fa5c52095d3f05993">UCB uart3;</div><div class="notion-text notion-block-15a6f52423b64d14bfd4cfec9c857361">/<em> 缓冲区 </em>/</div><div class="notion-text notion-block-5c34c3f349644303a66e8d8b04a3ad74">uint8_t U1_Rx_Buff[U1_RX_SIZE];</div><div class="notion-text notion-block-d4fd727beeb84b95ac01889b526529b6">uint8_t U1_Tx_Buff[U1_TX_SIZE];</div><div class="notion-text notion-block-12bd72296f7a43639ff133aaa993ef2d">uint8_t U2_Rx_Buff[U2_RX_SIZE];</div><div class="notion-text notion-block-b708d351b0154dc6b803d9e94deba84a">uint8_t U2_Tx_Buff[U2_TX_SIZE];</div><div class="notion-text notion-block-3e2fbd87efe14f5ca8720e4bc3c590e9">uint8_t U3_Rx_Buff[U3_RX_SIZE];</div><div class="notion-text notion-block-51e2e65fc1ff4747931ba54ecedda295">uint8_t U3_Tx_Buff[U3_TX_SIZE];</div><div class="notion-text notion-block-bd67ba40e6714e35b330bf8fd0521b9e">/<em> 初始化串口 </em>/</div><div class="notion-text notion-block-0f90acaa88d34c5481d71fa3eb5e8796">void U1_Init(uint32_t bandrate){</div><div class="notion-text notion-block-782330f938ee4b9daa19e3c0ef106318">uart1.uart.Instance = USART1;                    //使用那个串口</div><div class="notion-text notion-block-f9f22e837f6145b1bdde77c17ef7e2a4">uart1.uart.Init.BaudRate = bandrate;             //波特率</div><div class="notion-text notion-block-b2b9537c28f34d97991c81542386f137">uart1.uart.Init.WordLength = UART_WORDLENGTH_8B; //数据位长度</div><div class="notion-text notion-block-e24c52d2e2d040daa2495c41b9c53ab0">uart1.uart.Init.StopBits = UART_STOPBITS_1;      //停止位</div><div class="notion-text notion-block-619f863bf31f4be79582e8bf584e1f2a">uart1.uart.Init.Parity = UART_PARITY_NONE;       //校验模式</div><div class="notion-text notion-block-d651e6bef9a04685a1cd138392c2d166">uart1.uart.Init.Mode = UART_MODE_TX_RX;          //传输模式</div><div class="notion-text notion-block-b087fdc0204f42ad98198ba2173727be">uart1.uart.Init.HwFlowCtl = UART_HWCONTROL_NONE; //流控</div><div class="notion-text notion-block-fc89b0967601431a96cab66285469c64">HAL_UART_Init(&amp;uart1.uart);</div><div class="notion-text notion-block-df49bf5aab544da9b9d23d66a50aa645">/<em> 初始化UCB控制块指针 </em>/</div><div class="notion-text notion-block-1d8cfb8898a14c1994a8c8131ecd6147">U1_PtrInit();</div><div class="notion-text notion-block-4c6e5df20fb649ea8befc8aa3b91ee86">}</div><div class="notion-text notion-block-3eab16c8d52d4a77bb3e7084d4821bd0">/<em> 初始化串口 </em>/</div><div class="notion-text notion-block-ec22b5aae93f43d1b9cf7fa1755e7cc4">void U2_Init(uint32_t bandrate){</div><div class="notion-text notion-block-e1ad0bcdc1a141ddbf1a236c96f13b0e">uart2.uart.Instance = USART2;                    //使用那个串口</div><div class="notion-text notion-block-a80ba8d912c14faeb2ef8b0281386793">uart2.uart.Init.BaudRate = bandrate;             //波特率</div><div class="notion-text notion-block-9c422c56bfb549bd89311f74faa457d8">uart2.uart.Init.WordLength = UART_WORDLENGTH_8B; //数据位长度</div><div class="notion-text notion-block-16dc62aec19e418ab78ab8f747f29b1e">uart2.uart.Init.StopBits = UART_STOPBITS_1;      //停止位</div><div class="notion-text notion-block-453cecbee4e9471684bf95f8b7b3989f">uart2.uart.Init.Parity = UART_PARITY_NONE;       //校验模式</div><div class="notion-text notion-block-a1518bf5928c4ad18a287f13d3164ba1">uart2.uart.Init.Mode = UART_MODE_TX_RX;          //传输模式</div><div class="notion-text notion-block-7f7a18c551164e1d8b93ecee7047b0e3">uart2.uart.Init.HwFlowCtl = UART_HWCONTROL_NONE; //流控</div><div class="notion-text notion-block-d2fbf7f19da548e7a4c8a2505e0b9831">HAL_UART_Init(&amp;uart2.uart);</div><div class="notion-text notion-block-18529538d7cd4744bab4585cd4cbc6bf">/<em> 初始化UCB控制块指针 </em>/</div><div class="notion-text notion-block-8230902110a941feb491ac7258ce9a9e">U2_PtrInit();</div><div class="notion-text notion-block-8185c314f4fd476886a76a1214fc8a03">}</div><div class="notion-text notion-block-a8792d527b5840498bb9a3395917cd32">/<em> 初始化串口 </em>/</div><div class="notion-text notion-block-8d114380d47041a6aa01e87788674fd3">void U3_Init(uint32_t bandrate){</div><div class="notion-text notion-block-9f0ee54b4c894a41a07116e3503a1183">uart3.uart.Instance = USART3;                    //使用那个串口</div><div class="notion-text notion-block-1a191fb058014c8196f5bbc03b558642">uart3.uart.Init.BaudRate = bandrate;             //波特率</div><div class="notion-text notion-block-f40c2ed2f6514796957f0301d266aa79">uart3.uart.Init.WordLength = UART_WORDLENGTH_8B; //数据位长度</div><div class="notion-text notion-block-04ff3d08f61e4235b55f55016472c27f">uart3.uart.Init.StopBits = UART_STOPBITS_1;      //停止位</div><div class="notion-text notion-block-8e572d9a6937421aab9445d434f32c55">uart3.uart.Init.Parity = UART_PARITY_NONE;       //校验模式</div><div class="notion-text notion-block-a49ade15a7e546e980f7568c7b5a5b35">uart3.uart.Init.Mode = UART_MODE_TX_RX;          //传输模式</div><div class="notion-text notion-block-18de80b4f4a2495ab83ac10579a3ce49">uart3.uart.Init.HwFlowCtl = UART_HWCONTROL_NONE; //流控</div><div class="notion-text notion-block-2402b53d351d430cb8b8ddab996fb0bd">HAL_UART_Init(&amp;uart3.uart);</div><div class="notion-text notion-block-8d946ceec4f64c0ca3ba2737a6d399cb">/<em> 初始化UCB控制块指针 </em>/</div><div class="notion-text notion-block-86cb2353c0d94be788b88660d4947f23">U3_PtrInit();</div><div class="notion-text notion-block-805ac3fa965e4b739b1dc1a5fcb21bcb">}</div><div class="notion-text notion-block-61a5ebf356ee492ca81dc8c21a534589">/<em> 初始化U1_UCB控制块指针 </em>/</div><div class="notion-text notion-block-a34e09ee10b34294a57dd67620b3d240">void U1_PtrInit(void){</div><div class="notion-text notion-block-a61883651f0d41dd953e8899bc96631c">uart1.rxCount  = 0;</div><div class="notion-text notion-block-3945ea8903fc4cef86314c9f5bc3ce48">uart1.rxInPtr  = &amp;uart1.rxLocation[0];</div><div class="notion-text notion-block-11b5025e26d446bbae474d95a3014619">uart1.rxOutPtr = &amp;uart1.rxLocation[0];</div><div class="notion-text notion-block-eaef948d31d84c6e9fec13a738a60ed4">uart1.rxEndPtr = &amp;uart1.rxLocation[9];</div><div class="notion-text notion-block-5d341a06595a44e3a850fb566f43fade">uart1.rxInPtr-&gt;start = &amp;U1_Rx_Buff[0];</div><div class="notion-text notion-block-889f81c40eee425dae5582c2c09fcead">uart1.txCount  = 0;</div><div class="notion-text notion-block-4390320409234fb4b2b37a87a44419d9">uart1.txInPtr  = &amp;uart1.txLocation[0];</div><div class="notion-text notion-block-325ecd471642411db382c6a126f4f4ca">uart1.txOutPtr = &amp;uart1.txLocation[0];</div><div class="notion-text notion-block-e5d0f952d6c147398e062ad927800d67">uart1.txEndPtr = &amp;uart1.txLocation[9];</div><div class="notion-text notion-block-8c3b27390133455497e315257098c63a">uart1.txInPtr-&gt;start = &amp;U1_Tx_Buff[0];</div><div class="notion-text notion-block-a3cd9a0a84424ed191f492def8a285d6">__HAL_UART_ENABLE_IT(&amp;uart1.uart,UART_IT_IDLE);</div><div class="notion-text notion-block-c28c026696434046afeb819ab6834b1c">HAL_UART_Receive_IT(&amp;uart1.uart, uart1.rxInPtr-&gt;start, U1_RX_MAX);</div><div class="notion-text notion-block-f8866a55ea6449cc9ea18ee2574f59ad">}</div><div class="notion-text notion-block-87e7380d1d5c47a8ad121a12c1fe708a">void U2_PtrInit(void){</div><div class="notion-text notion-block-6166d1f76a664071a043b40e2126a740">uart2.rxCount  = 0;</div><div class="notion-text notion-block-92e1540fb07e4789a7fb823ddb14a5a2">uart2.rxInPtr  = &amp;uart2.rxLocation[0];</div><div class="notion-text notion-block-7f901be799914dca91542682baeff40d">uart2.rxOutPtr = &amp;uart2.rxLocation[0];</div><div class="notion-text notion-block-e9f251d69dc64740b7b90a837de0ac03">uart2.rxEndPtr = &amp;uart2.rxLocation[9];</div><div class="notion-text notion-block-d2253d30a16f45bcb2661725a3982cf5">uart2.rxInPtr-&gt;start = &amp;U2_Rx_Buff[0];</div><div class="notion-text notion-block-5e8565f4c8cb429884362bdf09ba76ca">uart2.txCount  = 0;</div><div class="notion-text notion-block-9d6481fb6c11447da4321ab38fa3cd6d">uart2.txInPtr  = &amp;uart2.txLocation[0];</div><div class="notion-text notion-block-a5d450e9336744548b25effb5b8fd169">uart2.txOutPtr = &amp;uart2.txLocation[0];</div><div class="notion-text notion-block-bb0b86c6c29046afb1eed8a38b541778">uart2.txEndPtr = &amp;uart2.txLocation[9];</div><div class="notion-text notion-block-191fa51abec1495ebe6692ffba873bbe">uart2.txInPtr-&gt;start = &amp;U2_Tx_Buff[0];</div><div class="notion-text notion-block-d51aa0f208aa4750ab4bcf2f9fe486fd">__HAL_UART_ENABLE_IT(&amp;uart2.uart,UART_IT_IDLE);</div><div class="notion-text notion-block-657bf3f480a04242a4165ab0331ec19c">HAL_UART_Receive_IT(&amp;uart2.uart, uart2.rxInPtr-&gt;start, U2_RX_MAX);</div><div class="notion-text notion-block-3e83d917b7f84afba2ac02d2a7e191d3">}</div><div class="notion-text notion-block-4593354617864fb9904c2f4d0a393288">void U3_PtrInit(void){</div><div class="notion-text notion-block-7258cb4e77334508b80a8c0c1ceaa22f">uart3.rxCount  = 0;</div><div class="notion-text notion-block-fc01433c60194d7b8a803045f9db1b04">uart3.rxInPtr  = &amp;uart3.rxLocation[0];</div><div class="notion-text notion-block-2a699f0975e44eefb6fd232f82cf8516">uart3.rxOutPtr = &amp;uart3.rxLocation[0];</div><div class="notion-text notion-block-d56b817b3da14dbb817e7c26d4dc15fa">uart3.rxEndPtr = &amp;uart3.rxLocation[9];</div><div class="notion-text notion-block-7d6b2120e05f4d7b9ffea32388158d28">uart3.rxInPtr-&gt;start = &amp;U3_Rx_Buff[0];</div><div class="notion-text notion-block-f799af1ef62c43b6affc8fe707c6769e">uart3.txCount  = 0;</div><div class="notion-text notion-block-098be644596e43138678f2a4dffaa0fc">uart3.txInPtr  = &amp;uart3.txLocation[0];</div><div class="notion-text notion-block-7ab654dfccdc4937841e9a4735f676e6">uart3.txOutPtr = &amp;uart3.txLocation[0];</div><div class="notion-text notion-block-cf9e0afaa076480aac1ace312b5c253c">uart3.txEndPtr = &amp;uart3.txLocation[9];</div><div class="notion-text notion-block-8cf7b57ba0734faabd957f4ef7cc49bc">uart3.txInPtr-&gt;start = &amp;U3_Tx_Buff[0];</div><div class="notion-text notion-block-c14343133d34420392d68b7b2ff41754">__HAL_UART_ENABLE_IT(&amp;uart3.uart,UART_IT_IDLE);</div><div class="notion-text notion-block-d83d86b893344a9d91f18fed60cbc258">HAL_UART_Receive_IT(&amp;uart3.uart, uart3.rxInPtr-&gt;start, U3_RX_MAX);</div><div class="notion-text notion-block-dc6809199cf54ccf97a7eea6e111551d">}</div><div class="notion-text notion-block-22e183edfb244970a3fd74886bd5024e">/<em> 转移Rx_Buff数据到 Tx_Buff </em>/</div><div class="notion-text notion-block-d48b5afa3d874fdf9d30c92187a3976e">void U1_DataRxToTx(uint8_t* data, uint32_t data_len){</div><div class="notion-text notion-block-ff09abc3763e44098e9d17bf495ba99f">if((U1_TX_SIZE - uart1.txCount) &gt; data_len){<div class="notion-text-children"><div class="notion-text notion-block-db5ff0a7752c475f97b05d44e58b8d78">uart1.txInPtr-&gt;start = &amp;U1_Tx_Buff[uart1.txCount];</div></div></div><div class="notion-text notion-block-53e02d504a724960b145e881513e5f11">}</div><div class="notion-text notion-block-fcecec051d5c460385ab986a62c975b6">else{<div class="notion-text-children"><div class="notion-text notion-block-3b375ee6e65541c1b9274c59771c6831">uart1.txCount = 0;</div><div class="notion-text notion-block-76a42931e62f4b66bc0f107452ff0926">uart1.txInPtr-&gt;start = &amp;U1_Tx_Buff[0];</div></div></div><div class="notion-text notion-block-5e075dc955754e7daf82032fe4a6ad58">}</div><div class="notion-text notion-block-d519424c552b4d99888c4c8eed63935f">memcpy(uart1.txInPtr-&gt;start, data, data_len);</div><div class="notion-text notion-block-ec513467934a4110b5ee72143b6edd70">uart1.txCount += data_len;</div><div class="notion-text notion-block-9d3e500a22544957978e3380d116475f">uart1.txInPtr-&gt;end = &amp;U1_Tx_Buff[uart1.txCount - 1];</div><div class="notion-text notion-block-46ddfb22105747a3811f2e25b1727f73">uart1.txInPtr++;</div><div class="notion-text notion-block-7bc2f701726d4e268175571d6f748f90">if(uart1.txInPtr == uart1.txEndPtr){<div class="notion-text-children"><div class="notion-text notion-block-fbd964bc13ce499eb29a083bf0e70347">uart1.txInPtr = &amp;uart1.txLocation[0];</div></div></div><div class="notion-text notion-block-55ed5ad2ee7643e1a4ef565810d170a7">}</div><div class="notion-text notion-block-1bd03dcb098c4cb2aab5cad8af3a4510">}</div><div class="notion-text notion-block-e6a9964ea761433b9f6d126bdb1121d4">void U2_DataRxToTx(uint8_t* data, uint32_t data_len){</div><div class="notion-text notion-block-627368a35cc94d70abe4338949e77bcd">if((U2_TX_SIZE - uart2.txCount) &gt; data_len){<div class="notion-text-children"><div class="notion-text notion-block-fd5d0c38233e4cb3aa1ed97ac2428988">uart2.txInPtr-&gt;start = &amp;U2_Tx_Buff[uart2.txCount];</div></div></div><div class="notion-text notion-block-ace07b80e9ff40d78eb853ec7b154adb">}</div><div class="notion-text notion-block-3905778010b142fba359e0b380278bbc">else{<div class="notion-text-children"><div class="notion-text notion-block-fe09c2fbce00428fb4a287b34f31e01d">uart2.txCount = 0;</div><div class="notion-text notion-block-c175650217ea4961acafed5306a857b4">uart2.txInPtr-&gt;start = &amp;U2_Tx_Buff[0];</div></div></div><div class="notion-text notion-block-85213b7f2f4c4683b8f8e7ae135e51e8">}</div><div class="notion-text notion-block-47bd31b7c21a4dfb92e1c50e4bbf1860">memcpy(uart2.txInPtr-&gt;start, data, data_len);</div><div class="notion-text notion-block-ef7ba46c4a9a4523a24cabf0364cc8aa">uart2.txCount += data_len;</div><div class="notion-text notion-block-64c1d402aacb4d36a8196ba32537206c">uart2.txInPtr-&gt;end = &amp;U2_Tx_Buff[uart2.txCount - 1];</div><div class="notion-text notion-block-c988744a34794e67b688d1294df37e12">uart2.txInPtr++;</div><div class="notion-text notion-block-bf8370f3cba1445bb496bd8019cd92a4">if(uart2.txInPtr == uart2.txEndPtr){<div class="notion-text-children"><div class="notion-text notion-block-05ea387355594129b5520a81485a7403">uart2.txInPtr = &amp;uart2.txLocation[0];</div></div></div><div class="notion-text notion-block-521b639f3df742ab937abda76c8865ff">}</div><div class="notion-text notion-block-c5f64558ee3b4b52891d95ddbaa6c79c">}</div><div class="notion-text notion-block-7ed726928c2e4ac3a426a1c269ff0ef4">void U3_DataRxToTx(uint8_t* data, uint32_t data_len){</div><div class="notion-text notion-block-38d3d9abf5fe4f6992837c1fa35500e2">if((U3_TX_SIZE - uart3.txCount) &gt; data_len){<div class="notion-text-children"><div class="notion-text notion-block-8aedfd78efeb44f7915bc80c8408934c">uart3.txInPtr-&gt;start = &amp;U3_Tx_Buff[uart3.txCount];</div></div></div><div class="notion-text notion-block-9be7a8fe5d324898855d5e291354fe6b">}</div><div class="notion-text notion-block-a25b4180303d4b29b7464208a7049442">else{<div class="notion-text-children"><div class="notion-text notion-block-3937db1b225f4fb3951523813087165e">uart3.txCount = 0;</div><div class="notion-text notion-block-e9f85234378341fbb500949ab6962396">uart3.txInPtr-&gt;start = &amp;U3_Tx_Buff[0];</div></div></div><div class="notion-text notion-block-9b4aa530a573422a9f7c247c3e765ac5">}</div><div class="notion-text notion-block-045bf1ab14674c39aa416d9b61839922">memcpy(uart3.txInPtr-&gt;start, data, data_len);</div><div class="notion-text notion-block-593079a7021c4d119f3277c7f3802d4c">uart3.txCount += data_len;</div><div class="notion-text notion-block-06f4a2dc23f649439087099731cbf0a7">uart3.txInPtr-&gt;end = &amp;U3_Tx_Buff[uart3.txCount - 1];</div><div class="notion-text notion-block-facd0981222a4ebf9b937fc3ce1340d3">uart3.txInPtr++;</div><div class="notion-text notion-block-a63601158626462db1f779562d7e63b1">if(uart3.txInPtr == uart3.txEndPtr){<div class="notion-text-children"><div class="notion-text notion-block-cb3a12bb40504e8bb37d58b417079ac3">uart3.txInPtr = &amp;uart3.txLocation[0];</div></div></div><div class="notion-text notion-block-955a8c69104c489f90e6c5f6c8cb1985">}</div><div class="notion-text notion-block-7858a844f531466e80984e433e5d04fd">}</div><div class="notion-text notion-block-32afa3045d8d4c5bbff6a36b7d775387">/<em> UART硬件初始化回调 </em>/</div><div class="notion-text notion-block-4ab7c6de0738490084b99e9fa29a4824">void HAL_UART_MspInit(UART_HandleTypeDef *huart){</div><div class="notion-text notion-block-38972c83956843c9abd141ee2330195d">GPIO_InitTypeDef GPIO_InitType;</div><div class="notion-text notion-block-6a748bc3fd134ab7a3f90e8aa6fcfbd1">if(huart-&gt;Instance == USART1){<div class="notion-text-children"><div class="notion-text notion-block-05958626572b4dcdacc5000cd96177fd">__HAL_RCC_USART1_CLK_ENABLE();</div><div class="notion-text notion-block-9d0a832ba6d8416b9b10b7d8c0ca3352">__HAL_RCC_GPIOA_CLK_ENABLE();</div><div class="notion-text notion-block-41be5623d2db4d79b61853e030f6a3ed">GPIO_<a class="notion-link" href="http://InitType.Pin" target="_blank" rel="noopener noreferrer">InitType.Pin</a> = GPIO_PIN_9;</div><div class="notion-text notion-block-85ab3cbaa2ba43e3b087075d60e91efb">GPIO_InitType.Mode = GPIO_MODE_AF_PP;</div><div class="notion-text notion-block-be9f62537a554b479123d35935214d48">GPIO_InitType.Speed = GPIO_SPEED_FREQ_MEDIUM;</div><div class="notion-text notion-block-92d66d228c7f4978a353eff7a4f6fa01">HAL_GPIO_Init(GPIOA,&amp;GPIO_InitType);</div><div class="notion-text notion-block-53562c4a41d346788fb097b091b5f801">GPIO_<a class="notion-link" href="http://InitType.Pin" target="_blank" rel="noopener noreferrer">InitType.Pin</a> = GPIO_PIN_10;</div><div class="notion-text notion-block-c0232cea53774781814c8e822f1d4301">GPIO_InitType.Mode = GPIO_MODE_AF_INPUT;</div><div class="notion-text notion-block-8dcfb9d250604098a350f335ff3704bc">GPIO_InitType.Pull = GPIO_NOPULL;</div><div class="notion-text notion-block-aaaaebd7930a441dac1889c06a84c579">HAL_GPIO_Init(GPIOA,&amp;GPIO_InitType);</div><div class="notion-text notion-block-e00e00163d6540dfa662c513e03abe79">HAL_NVIC_SetPriority(USART1_IRQn,3,0);</div><div class="notion-text notion-block-5e47e8432c4b480984931c9fcab0328e">HAL_NVIC_EnableIRQ(USART1_IRQn);</div></div></div><div class="notion-text notion-block-6d24d0b978ac4b7b8089366ab1db3f32">}else if(huart-&gt;Instance == USART2){<div class="notion-text-children"><div class="notion-text notion-block-492607291f134e77b7d7542d498d2bd8">__HAL_RCC_GPIOA_CLK_ENABLE();</div><div class="notion-text notion-block-0c4b59adbbb041358f5c9e5f6ada264e">__HAL_RCC_USART2_CLK_ENABLE();</div><div class="notion-text notion-block-4e143b8c96564cacb6bf7c29e8c03949">GPIO_<a class="notion-link" href="http://InitType.Pin" target="_blank" rel="noopener noreferrer">InitType.Pin</a> = GPIO_PIN_2;</div><div class="notion-text notion-block-9a1233f3617a448f84e3fd1a4421a47b">GPIO_InitType.Mode = GPIO_MODE_AF_PP;</div><div class="notion-text notion-block-413a355ff97f439b96b46d87b990dc59">GPIO_InitType.Speed = GPIO_SPEED_FREQ_MEDIUM;</div><div class="notion-text notion-block-f10b43e423884062aca8cc9bcc84fea2">HAL_GPIO_Init(GPIOA,&amp;GPIO_InitType);</div><div class="notion-text notion-block-756e429ef6af4603821b269d6a355eca">GPIO_<a class="notion-link" href="http://InitType.Pin" target="_blank" rel="noopener noreferrer">InitType.Pin</a> = GPIO_PIN_3;</div><div class="notion-text notion-block-4ef066dde6154f4db9ed7222e33786e6">GPIO_InitType.Mode = GPIO_MODE_AF_INPUT;</div><div class="notion-text notion-block-2fe54199441042d19c89be51cda79290">GPIO_InitType.Pull = GPIO_NOPULL;</div><div class="notion-text notion-block-035f97e69b50455e9858a5ec52bbd211">HAL_GPIO_Init(GPIOA,&amp;GPIO_InitType);</div><div class="notion-text notion-block-ae07e6751a3c4442ba4014d0486ff35b">HAL_NVIC_SetPriority(USART2_IRQn,3,0);</div><div class="notion-text notion-block-d9d46bad804540dc87647f4df7b8111d">HAL_NVIC_EnableIRQ(USART2_IRQn);</div></div></div><div class="notion-text notion-block-527abb8df1354eb8b8cc2457fac150ab">}else if(huart-&gt;Instance == USART3){<div class="notion-text-children"><div class="notion-text notion-block-8d2ec3ed02974700b469b1014ecb8424">__HAL_RCC_GPIOB_CLK_ENABLE();</div><div class="notion-text notion-block-084463391e084d2c928f712ff88126c2">__HAL_RCC_USART3_CLK_ENABLE();</div><div class="notion-text notion-block-696b7c37eb2943949b7d8e2587509bf5">GPIO_<a class="notion-link" href="http://InitType.Pin" target="_blank" rel="noopener noreferrer">InitType.Pin</a> = GPIO_PIN_10;</div><div class="notion-text notion-block-50114e3b6fe2407b85b2272816a4012a">GPIO_InitType.Mode = GPIO_MODE_AF_PP;</div><div class="notion-text notion-block-efdc3f0369a14e0083d5fbf5b02100c1">GPIO_InitType.Speed = GPIO_SPEED_FREQ_MEDIUM;</div><div class="notion-text notion-block-931ee53c19134f27a3418c15c90c29e8">HAL_GPIO_Init(GPIOB,&amp;GPIO_InitType);</div><div class="notion-text notion-block-1ab4f37b584744b9810c28551dab5ec8">GPIO_<a class="notion-link" href="http://InitType.Pin" target="_blank" rel="noopener noreferrer">InitType.Pin</a> = GPIO_PIN_11;</div><div class="notion-text notion-block-072a35d1993948a6b601b0dd400e66f4">GPIO_InitType.Mode = GPIO_MODE_AF_INPUT;</div><div class="notion-text notion-block-9eb80922a9c54542af96bfd36d695dc0">GPIO_InitType.Pull = GPIO_NOPULL;</div><div class="notion-text notion-block-249bb3c8023e4813a0447be65c0650eb">HAL_GPIO_Init(GPIOB,&amp;GPIO_InitType);</div><div class="notion-text notion-block-9785276e54804fd09bf509490aa72e11">HAL_NVIC_SetPriority(USART3_IRQn,3,0);</div><div class="notion-text notion-block-98a7f40b5c684ee8baf21af0eb593861">HAL_NVIC_EnableIRQ(USART3_IRQn);</div></div></div><div class="notion-text notion-block-6ad42866893142b3a169a3458f313f61">}</div><div class="notion-text notion-block-3ea544d65ba047eea7e9a058e7ac4b3b">}</div><div class="notion-text notion-block-db07e25a9b574b8fbe0ede915179f225">/<em> 强声明的接收完成回调函数 </em>/</div><div class="notion-text notion-block-4396966d3c934c089fd7b0c12feb63bb">void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)</div><div class="notion-text notion-block-70843420ad5744b19b75ec797285ce64">{</div><div class="notion-text notion-block-694927a550c44f518a471a0b46de3a4e">if(huart-&gt;Instance == USART1){</div><div class="notion-text notion-block-38867880a0984d548c0aaef16b148a12">}else if(huart-&gt;Instance == USART2){</div><div class="notion-text notion-block-883991e9d4c94ef69056afba33cb80ab">}else if(huart-&gt;Instance == USART3){</div><div class="notion-text notion-block-202685e1d51b496d859e9118dceb0efa">}</div><div class="notion-text notion-block-c3e1861f620d4e2593d4ab43034be932">}</div><div class="notion-text notion-block-324bb9f4c68a4f85895b425cd24d5f8e">/<em> 强声明的错误回调函数 </em>/</div><div class="notion-text notion-block-2f9311609a884d7db876d7b09f98efb6">void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart)</div><div class="notion-text notion-block-2053fc1ea7754763bd189adf1c93644d">{</div><div class="notion-text notion-block-8e99884d7bb84bf48f185bbc5eb8701e">if(huart-&gt;Instance == USART1){<div class="notion-text-children"><div class="notion-text notion-block-352a57686cd7428eafb7a70ac725c2f8">}else if(huart-&gt;Instance == USART2){</div><div class="notion-text notion-block-9fc25c119f3543d69809085578aee1c4">}else if(huart-&gt;Instance == USART3){</div><div class="notion-text notion-block-f37e6d50edee4a89b2acc7c4ddc0ad33">}</div></div></div><div class="notion-text notion-block-417a69252da44465a512abfc86e19488">}</div><div class="notion-text notion-block-e95d871bfc224e25b02b68d0eb4678b6">/<em> 强声明的发送完成回调函数 </em>/</div><div class="notion-text notion-block-8952a61eb0de45ca9ff6373c528a31e2">void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)</div><div class="notion-text notion-block-c3208c15269e4df18d31e5d67d410d6e">{</div><div class="notion-text notion-block-4b4c1cc68c2949fd90de74f43313fb60">if(huart-&gt;Instance == USART1){<div class="notion-text-children"><div class="notion-text notion-block-2d4ac23d8c7e4b5b87ada5cf85eb8c9b">/<em> 发送完成，标志位清零 </em>/</div><div class="notion-text notion-block-976551e76e2a4f6f819136293469160a">uart1.TxState = 0;</div></div></div><div class="notion-text notion-block-d290e4817c254e52b1a95ac1e5bf60ef">}else if(huart-&gt;Instance == USART2){<div class="notion-text-children"><div class="notion-text notion-block-58d5579482e34d4db38c6593ee582919">uart2.TxState = 0;</div></div></div><div class="notion-text notion-block-8fce6f81c8ee48d5a959438103971c35">}else if(huart-&gt;Instance == USART3){<div class="notion-text-children"><div class="notion-text notion-block-ee6e7f01b02e4df083d40eb709b88344">uart3.TxState = 0;</div></div></div><div class="notion-text notion-block-70b79cc124bd4d9591c3a5412055e7f8">}</div><div class="notion-text notion-block-64bbeaaf2f874a5da0e8105ccbe5c72e">}</div><div class="notion-text notion-block-642d59b03ee54208b1cbf0cf692ab8d6">/<em> 强声明的接收终止回调函数 </em>/</div><div class="notion-text notion-block-4716e33b2aff4791a19838b515582aa7">void HAL_UART_AbortReceiveCpltCallback(UART_HandleTypeDef *huart)</div><div class="notion-text notion-block-8668825f7fbd4d7aaf23663051eac791">{</div><div class="notion-text notion-block-dfae214c864e412db4ca0d93ae7432e1">if(huart-&gt;Instance == USART1){<div class="notion-text-children"><div class="notion-text notion-block-01e3d35ed5b74315aace85555e4af0b0">uart1.rxInPtr-&gt;end = &amp;U1_Rx_Buff[uart1.rxCount - 1];</div><div class="notion-text notion-block-9db90567defe46259d2468b07bdf21b7">uart1.rxInPtr++;</div><div class="notion-text notion-block-1240559442504070af18dd486b7ff105">if(uart1.rxInPtr == uart1.rxEndPtr){<div class="notion-text-children"><div class="notion-text notion-block-8148026973184c3aa2631bcc6b611207">uart1.rxInPtr = &amp;uart1.rxLocation[0];</div></div></div><div class="notion-text notion-block-8d7455aef2bf47fca3a0c078f10b73a4">}</div><div class="notion-text notion-block-51d10f894a9a4a98bab6dc2c87a9d002">if((U1_RX_SIZE - uart1.rxCount) &lt; U1_RX_MAX){<div class="notion-text-children"><div class="notion-text notion-block-96df17ac14e4482a95457a337f6a2d70">uart1.rxCount = 0;</div><div class="notion-text notion-block-6c714a5331b84b319ae36d4b25c219f3">uart1.rxInPtr-&gt;start = &amp;U1_Rx_Buff[0];</div></div></div><div class="notion-text notion-block-d63bb6848f1b4ecfa69e7c8fff1cd4a3">}else{<div class="notion-text-children"><div class="notion-text notion-block-d131584753144014a02053cb40f4cdfa">uart1.rxInPtr-&gt;start = &amp;U1_Rx_Buff[uart1.rxCount];</div></div></div><div class="notion-text notion-block-42483b7b4a1c4428aabdc0b89b0e84b2">}</div><div class="notion-text notion-block-8710f63245d64977ac6be93d4e61e2f3">HAL_UART_Receive_IT(&amp;uart1.uart, uart1.rxInPtr-&gt;start, U1_RX_MAX);</div></div></div><div class="notion-text notion-block-96ff49f524894d5a9ee38f3adf0463dd">}else if(huart-&gt;Instance == USART2){<div class="notion-text-children"><div class="notion-text notion-block-10eafc8e53f9464f9ce2166b9176f676">uart2.rxInPtr-&gt;end = &amp;U2_Rx_Buff[uart2.rxCount - 1];</div><div class="notion-text notion-block-e249d138504042b1ac11271aa10cf8e2">uart2.rxInPtr++;</div><div class="notion-text notion-block-d17060e813db4fbc915ff2469d5a54ac">if(uart2.rxInPtr == uart2.rxEndPtr){<div class="notion-text-children"><div class="notion-text notion-block-9ca5826d1ad543f29391a253b659ada8">uart2.rxInPtr = &amp;uart2.rxLocation[0];</div></div></div><div class="notion-text notion-block-67ddb73e93154557966fceb46e3c569c">}</div><div class="notion-text notion-block-0dcea90113d047d3889eb5b6fc949737">if((U2_RX_SIZE - uart2.rxCount) &lt; U2_RX_MAX){<div class="notion-text-children"><div class="notion-text notion-block-b474958e2e5648c39384ffb6f72fe333">uart2.rxCount = 0;</div><div class="notion-text notion-block-d06c951269584c12ae9fe3e338a07d40">uart2.rxInPtr-&gt;start = &amp;U2_Rx_Buff[0];</div></div></div><div class="notion-text notion-block-8c9ab902e5b14bc189210665b1037651">}else{<div class="notion-text-children"><div class="notion-text notion-block-97be5eeaff564f3583c8f10924f66340">uart2.rxInPtr-&gt;start = &amp;U2_Rx_Buff[uart2.rxCount];</div></div></div><div class="notion-text notion-block-e7207a68260b496a89ab096497014d4a">}</div><div class="notion-text notion-block-37a75b62bba04162a723f7606c66c680">HAL_UART_Receive_IT(&amp;uart2.uart, uart2.rxInPtr-&gt;start, U2_RX_MAX);</div></div></div><div class="notion-text notion-block-9e044f21084a4621b1d93e3e9bff6450">}else if(huart-&gt;Instance == USART3){<div class="notion-text-children"><div class="notion-text notion-block-2c00171349a7403f96f66ae931e3cdbb">uart3.rxInPtr-&gt;end = &amp;U3_Rx_Buff[uart3.rxCount - 1];</div><div class="notion-text notion-block-39e68f5005f84cdaac493011e4bce126">uart3.rxInPtr++;</div><div class="notion-text notion-block-95ed4793f7cc478497c2358d7e9dc160">if(uart3.rxInPtr == uart3.rxEndPtr){<div class="notion-text-children"><div class="notion-text notion-block-836d95d56ebe47ff9700afb6235c6194">uart3.rxInPtr = &amp;uart3.rxLocation[0];</div></div></div><div class="notion-text notion-block-f4410c25a4f94c16908b7e43af314099">}</div><div class="notion-text notion-block-144bc42b006e4fde9d0b08f862743c84">if((U3_RX_SIZE - uart3.rxCount) &lt; U3_RX_MAX){<div class="notion-text-children"><div class="notion-text notion-block-b0a34879acdd46afa5179666e4b3a0fc">uart3.rxCount = 0;</div><div class="notion-text notion-block-43d29b5fd00c4dee8b35c780e93cdfbf">uart3.rxInPtr-&gt;start = &amp;U3_Rx_Buff[0];</div></div></div><div class="notion-text notion-block-15dd6c11e05c474fa8fb0d00a137b089">}else{<div class="notion-text-children"><div class="notion-text notion-block-a510f18dc3cb41cf9c754381cb973f35">uart3.rxInPtr-&gt;start = &amp;U3_Rx_Buff[uart3.rxCount];</div></div></div><div class="notion-text notion-block-4ec5e0738cd344d3b58d08b9a6e2b84a">}</div><div class="notion-text notion-block-1d2bdf1760ee4c9990c7f5a9b29af53b">HAL_UART_Receive_IT(&amp;uart3.uart, uart3.rxInPtr-&gt;start, U3_RX_MAX);</div></div></div><div class="notion-text notion-block-bdaf20b23bdb421eb1c8f0ea4bcafef8">}</div><div class="notion-text notion-block-0349485c263140dd84d3dece2fa9b226">}</div></div></details><details class="notion-toggle notion-block-14da79a85a22469ea226acee5c29a76a"><summary><h4 class="notion-h notion-h3 notion-block-14da79a85a22469ea226acee5c29a76a" data-id="14da79a85a22469ea226acee5c29a76a"><span><div id="14da79a85a22469ea226acee5c29a76a" class="notion-header-anchor"></div><span class="notion-h-title">stm32fxx_It.c</span></span></h4></summary><div><div class="notion-text notion-block-65c77299383a4be3956c8d344768a7ef">/<em>-------------------------------------------------</em>/</div><div class="notion-text notion-block-de12e846ed214fdeb69993b7bb8060b9">/<em>                                                 </em>/</div><div class="notion-text notion-block-ddd05705b84e47668be2434184e657b4">/<em>          实现各种中断服务函数的源文件           </em>/</div><div class="notion-text notion-block-ca0e2c1005e045ed84050fec72207bec">/<em>                                                 </em>/</div><div class="notion-text notion-block-0a1830b60e68459fa0aff23affe947a3">/<em>-------------------------------------------------</em>/</div><div class="notion-text notion-block-5e27237c5fe7458ca956ea71a2e68923">#include &quot;stm32f1xx_hal.h&quot;   </div><div class="notion-text notion-block-eb1bbd1a427649229ac03458a32e8215">#include &quot;stm32f1xx_it.h&quot;</div><div class="notion-text notion-block-52195ef795ef4b4c9fa57372f90d5b6f">#include &quot;uart.h&quot;</div><div class="notion-text notion-block-c69ae3bb5b5f4c849aae82c8880be3a1">void EXTI15_10_IRQHandler(void)</div><div class="notion-text notion-block-30f2df3331d343abb315757f41be389d">{<div class="notion-text-children"><div class="notion-text notion-block-8d063c332b524e38ad0a307e50e97247">HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_13);</div></div></div><div class="notion-text notion-block-c130b4bcba664e16be44864753646751">}</div><div class="notion-text notion-block-22be57cd855449d6916059f4cd03272b">void EXTI0_IRQHandler(void)</div><div class="notion-text notion-block-378637895bbc4ab0bcb1e78ae217900e">{<div class="notion-text-children"><div class="notion-text notion-block-8c127783438342d8b164d1476eb34760">HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_0);</div></div></div><div class="notion-text notion-block-d18bda0fa95e4dc7b7aecb083743f9c5">}</div><div class="notion-text notion-block-16e11e3d1ccb4ed2b45ad20bdb86a6e9">/<em>-------------------------------------------------</em>/</div><div class="notion-text notion-block-2477ef44ff8b476a9f798c8ec8566e27">/<em>函数名：不可屏蔽中断处理函数                     </em>/</div><div class="notion-text notion-block-6fc8c4ec319c4cae840806e02bb5b0d8">/<em>参  数：无                                       </em>/</div><div class="notion-text notion-block-d5efdab8ffe34bedb37b9a803cc73e70">/<em>返回值：无                                       </em>/</div><div class="notion-text notion-block-2acab01fc45c4fa2bc058dc8c5063f39">/<em>-------------------------------------------------</em>/</div><div class="notion-text notion-block-0c5383d4e9154b3aa9db17226be7d8d1">void NMI_Handler(void)</div><div class="notion-text notion-block-338beba10a274209941d0650d7b3d35f">{</div><div class="notion-text notion-block-fdec36986b2f4f6590a8b4476e9aa190">}</div><div class="notion-text notion-block-b94f8ef0efb94abcaec29356e7b1c74b">/<em>-------------------------------------------------</em>/</div><div class="notion-text notion-block-4545602f141246559a1b1c141d94feef">/<em>函数名：硬件出错后进入的中断处理函数             </em>/</div><div class="notion-text notion-block-75c706f0eab74f9e82067b6bbabc12fc">/<em>参  数：无                                       </em>/</div><div class="notion-text notion-block-25f020e3ecd54a9ca7f859f0eee04459">/<em>返回值：无                                       </em>/</div><div class="notion-text notion-block-9d698a99126c43edb93297117269139e">/<em>-------------------------------------------------</em>/</div><div class="notion-text notion-block-f353165fcf904291af6dca0cb0c0aa98">void HardFault_Handler(void)</div><div class="notion-text notion-block-f624bf897d7843c69e8f941aaae43f20">{</div><div class="notion-text notion-block-1c26ad7369664c728c1cea60faf35c09">}</div><div class="notion-text notion-block-f7ffe4038dec4a93bc29f04e178aa42e">/<em>-------------------------------------------------</em>/</div><div class="notion-text notion-block-ed8043a68b5849bda4e86085b309f71b">/<em>函数名：软中断，SWI 指令调用的处理函数           </em>/</div><div class="notion-text notion-block-c9b28a9a5847460586333d679bd04cd4">/<em>参  数：无                                       </em>/</div><div class="notion-text notion-block-0ed9a0479bc74d02bdc8021f6cad9107">/<em>返回值：无                                       </em>/</div><div class="notion-text notion-block-49b062c809af4fedb250e7c65813bbd2">/<em>-------------------------------------------------</em>/</div><div class="notion-text notion-block-289e57a086c147d5b221e28b244cb3c0">void SVC_Handler(void)</div><div class="notion-text notion-block-3ee7f01e301647318787c449f85cfc96">{</div><div class="notion-text notion-block-b46d7060d328402b85e1af3826555787">}</div><div class="notion-text notion-block-78eeedabb16e46e79ffdd172bfbed480">/<em>-------------------------------------------------</em>/</div><div class="notion-text notion-block-cbaaa0cacf1c4935ae5d89ef6c2e584a">/<em>函数名：可挂起的系统服务处理函数                 </em>/</div><div class="notion-text notion-block-f80943f0b8c740dd950c9e1a44f83d65">/<em>参  数：无                                       </em>/</div><div class="notion-text notion-block-fcaa593a550a4993893eef3fc34c6cd0">/<em>返回值：无                                       </em>/</div><div class="notion-text notion-block-1311b1fc76b246279f31b1b2647bf8a6">/<em>-------------------------------------------------</em>/</div><div class="notion-text notion-block-8ba7ff188707458aae2883071470ff3e">void PendSV_Handler(void)</div><div class="notion-text notion-block-c3837806fc6d48e785f4ff3afebb0bf1">{</div><div class="notion-text notion-block-b10bba4d5db4463486e78bae3623cd98">}</div><div class="notion-text notion-block-9c1652867ade42f99f803286f735d042">/<em>-------------------------------------------------</em>/</div><div class="notion-text notion-block-1e857a7ddf7e42f1ad34caad8b8b9237">/<em>函数名：SysTic系统嘀嗒定时器处理函数             </em>/</div><div class="notion-text notion-block-bec590b7bbbf4d2da1351904f0c59dbc">/<em>参  数：无                                       </em>/</div><div class="notion-text notion-block-a55fad43571c424fb3eadd39bc33610a">/<em>返回值：无                                       </em>/</div><div class="notion-text notion-block-5e39d41ea05045ddbad9cc028eb54fcc">/<em>-------------------------------------------------</em>/</div><div class="notion-text notion-block-15da51c5740d49ad8109ce67ecf678cb">void SysTick_Handler(void)</div><div class="notion-text notion-block-ba065471b827476bbfbf4fbfcc515afd">{  </div><div class="notion-text notion-block-a092402eb4234d81b4fd99b8a7d0b5ed">HAL_IncTick();</div><div class="notion-text notion-block-80261532a2e34a0288a81f8e9b2856d8">}</div><div class="notion-text notion-block-be9601e81868481981eccde25359e313">/<em>-------------------------------------------------</em>/</div><div class="notion-text notion-block-3364cced87364910b16b77827c2a3042">/<em>函数名：串口1中断处理函数                        </em>/</div><div class="notion-text notion-block-4d0bdda8b53744409225223ff4989189">/<em>参  数：无                                       </em>/</div><div class="notion-text notion-block-3307c7d1bfad46a3aed02b55cf9085a2">/<em>返回值：无                                       </em>/</div><div class="notion-text notion-block-36febf591159472cafdd24dcdcf9c055">/<em>-------------------------------------------------</em>/</div><div class="notion-text notion-block-2c285cc535ab4c81864deb6dc5860acd">void USART1_IRQHandler(void)</div><div class="notion-text notion-block-701026086334467b82bbc08169a8db7f">{  </div><div class="notion-text notion-block-1e77cefe177045d2946d467fb618b899">HAL_UART_IRQHandler(&amp;uart1.uart);</div><div class="notion-text notion-block-f0c7a7142ca74ca7a03c31a4c12554e5">/<em> 在每次进入中断后，判断是否为空闲中断 </em>/</div><div class="notion-text notion-block-5b8050b6ba3b4ab99c0514815289d390">if(__HAL_UART_GET_FLAG(&amp;uart1.uart, UART_FLAG_IDLE)){<div class="notion-text-children"><div class="notion-text notion-block-9b8631096cff4061b459e8aeafea776a">/<em> 清除空闲标志位 </em>/</div><div class="notion-text notion-block-a82a61d0a519415d8a659a52f884e964">//__HAL_UART_CLEAR_FLAG(&amp;uart1.uart, UART_FLAG_IDLE);</div><div class="notion-text notion-block-ed72fa1aec2947d5b6dc6d63871c9486">__HAL_UART_CLEAR_IDLEFLAG(&amp;uart1.uart);</div><div class="notion-text notion-block-331daac6a37d494b956f77a20d43a95c">/<em> 获取这次传输了多少字节 </em>/</div><div class="notion-text notion-block-427a620200d649629fdf2e3be23ad0e8">uart1.rxCount += (U1_RX_MAX - uart1.uart.RxXferCount);</div><div class="notion-text notion-block-98e4eb621f0e4ce3be24da5da8b64d41">/<em> 终止当前的接收(会把RxferCount清零) </em>/</div><div class="notion-text notion-block-889102a81af540058da629ec705ebf35">HAL_UART_AbortReceive_IT(&amp;uart1.uart);</div></div></div><div class="notion-text notion-block-45d5e5ef4ab245b086b930c9994d375f">}</div><div class="notion-text notion-block-953ed1d5408c47be8cfd977b783d4bba">}</div><div class="notion-text notion-block-69397c224e72401c89995b897e93dbd5">/<em>-------------------------------------------------</em>/</div><div class="notion-text notion-block-359879904c354030af58ddc0813b8635">/<em>函数名：串口2中断处理函数                        </em>/</div><div class="notion-text notion-block-65815d40380e4e33a7b9c4a3d74dd117">/<em>参  数：无                                       </em>/</div><div class="notion-text notion-block-cc9795429a1944e38c19183ca8a20cf5">/<em>返回值：无                                       </em>/</div><div class="notion-text notion-block-2d85248335254fbca5ba6b7048e2e4d4">/<em>-------------------------------------------------</em>/</div><div class="notion-text notion-block-42c77e4b0e2f49d4af823799a85a98d7">void USART2_IRQHandler(void)</div><div class="notion-text notion-block-a5ba73803c6945edbf002460f9c98c0b">{  </div><div class="notion-text notion-block-407fcd7ece074d82afb5d2a31a255adf">HAL_UART_IRQHandler(&amp;uart2.uart);</div><div class="notion-text notion-block-329ef26a43344d62aba25db5effb3be9">if(__HAL_UART_GET_FLAG(&amp;uart2.uart, UART_FLAG_IDLE)){<div class="notion-text-children"><div class="notion-text notion-block-30f1a5e4ca804fce94a1e7f84aba0e37">__HAL_UART_CLEAR_IDLEFLAG(&amp;uart2.uart);</div><div class="notion-text notion-block-75526b92fa6443d28d04e7527919fbef">uart2.rxCount += (U2_RX_MAX - uart2.uart.RxXferCount);</div><div class="notion-text notion-block-f68c7542e5f34b8288de666554333c31">HAL_UART_AbortReceive_IT(&amp;uart2.uart);</div></div></div><div class="notion-text notion-block-5b390ff7a37e45069232e9de6c62866c">}</div><div class="notion-text notion-block-44cb276c219a4fcb824b4c387e075227">}</div><div class="notion-text notion-block-1677f5e926d7448d832db1f1fa0bae01">/<em>-------------------------------------------------</em>/</div><div class="notion-text notion-block-bb16430478344204a62b234a938d4a3c">/<em>函数名：串口3中断处理函数                        </em>/</div><div class="notion-text notion-block-c21b11cdfe1a442facf35fca76e4c3fc">/<em>参  数：无                                       </em>/</div><div class="notion-text notion-block-f34a1ce087914bc89cf57094de8568ed">/<em>返回值：无                                       </em>/</div><div class="notion-text notion-block-45d16a340d664288bff22bd8ef91de17">/<em>-------------------------------------------------</em>/</div><div class="notion-text notion-block-e66b89b2d4324b9fa8a86a6835fdf140">void USART3_IRQHandler(void)</div><div class="notion-text notion-block-6022a4c9de9a4427845ddd949b942968">{  </div><div class="notion-text notion-block-130404ccefd74f55a0798994a485708b">HAL_UART_IRQHandler(&amp;uart3.uart);</div><div class="notion-text notion-block-63e5dd5c78b44dfaa6fee3a14b77e055">if(__HAL_UART_GET_FLAG(&amp;uart3.uart, UART_FLAG_IDLE)){<div class="notion-text-children"><div class="notion-text notion-block-dc6b558d21a64e84a5de9b79bc0955f7">__HAL_UART_CLEAR_IDLEFLAG(&amp;uart3.uart);</div><div class="notion-text notion-block-2149ed2d920144caa295d3acfcd3c3e7">uart3.rxCount += (U3_RX_MAX - uart3.uart.RxXferCount);</div><div class="notion-text notion-block-f3bab50103794a5cabdf4864ae4919d7">HAL_UART_AbortReceive_IT(&amp;uart3.uart);</div></div></div><div class="notion-text notion-block-094d08514b6d437bb843c01375c3e326">}</div><div class="notion-text notion-block-da3853e4f07d4e059433cc9249d293e4">}</div></div></details><details class="notion-toggle notion-block-7c26b81b43614ebeb8cd901b0719d662"><summary><h4 class="notion-h notion-h3 notion-block-7c26b81b43614ebeb8cd901b0719d662" data-id="7c26b81b43614ebeb8cd901b0719d662"><span><div id="7c26b81b43614ebeb8cd901b0719d662" class="notion-header-anchor"></div><span class="notion-h-title">main.c</span></span></h4></summary><div><div class="notion-text notion-block-f719c18878e440239ffdcb03cf167260">#include &quot;stm32f1xx_hal.h&quot;</div><div class="notion-text notion-block-0ef29fcf64534530a1b14c475c1114c1">#include &quot;rcc.h&quot;</div><div class="notion-text notion-block-2e654c516a2044f3821e1035f2776ff1">#include &quot;led.h&quot;</div><div class="notion-text notion-block-a2435a2cdc2a47f69b2092c7b3f11c2d">#include &quot;sw.h&quot;</div><div class="notion-text notion-block-065d2c49881f494ba017d391077fc4d4">#include &quot;uart.h&quot;</div><div class="notion-text notion-block-62d90b1d3cbb45a79cdeb88af69230e8">int main(void){<div class="notion-text-children"><div class="notion-text notion-block-83222918166a46bfbd52d052d517cb1d">HAL_Init();</div><div class="notion-text notion-block-bafad38e38c64248a807a45135dd8a21">RccClock_Init();</div><div class="notion-text notion-block-6715581104a0440194f4cb12d617fe49">U1_Init(921600);</div><div class="notion-text notion-block-6b7fcfc083c041e0a8644eded534d566">U2_Init(921600);</div><div class="notion-text notion-block-1bd75d99157e4766ae23a741177727e9">U3_Init(921600);</div><div class="notion-text notion-block-6a190830bfd94fd9ae529ef214c23227">while(1){<div class="notion-text-children"><div class="notion-text notion-block-49bde726c1ee48779ab4036a5147b9d0">/<em> ------------------UART1------------------ </em>/</div><div class="notion-text notion-block-53a11e3679c948d2a2b64d2ba7148006">/<em> 判断接收缓冲区是否有数据 </em>/</div><div class="notion-text notion-block-e4664d3c8fa84bd395061ca8284178bf">if(uart1.rxInPtr != uart1.rxOutPtr){<div class="notion-text-children"><div class="notion-text notion-block-91a11eed941d46c49b72af9d8234e5d8">U1_DataRxToTx(uart1.rxOutPtr-&gt;start, (uart1.rxOutPtr-&gt;end - uart1.rxOutPtr-&gt;start + 1));</div><div class="notion-text notion-block-9acebe9d382a42689709ff74052bdedc">uart1.rxOutPtr++;</div><div class="notion-text notion-block-ecbc07c8088d46cbaac7592d4affa7b7">if(uart1.rxOutPtr == uart1.rxEndPtr){<div class="notion-text-children"><div class="notion-text notion-block-74420dc25f75419195d38180439b7531">uart1.rxOutPtr = &amp;uart1.rxLocation[0];</div></div></div><div class="notion-text notion-block-09de49ba47fa48cd8c95782000ba85fe">}</div></div></div><div class="notion-text notion-block-ec232b7a2bb445379303e0b11dd891c4">}</div><div class="notion-text notion-block-986dd5bc27f7476e86f32726b1f51121">/<em> 判断发送缓冲区是否有数据 </em>/</div><div class="notion-text notion-block-d22c163c23f04e25b44c115d5e81f254">if((uart1.txInPtr != uart1.txOutPtr) &amp;&amp; (uart1.TxState == 0) ){<div class="notion-text-children"><div class="notion-text notion-block-b8ddc28885744fde997e43d8f4a0ff89">uart1.TxState = 1;</div><div class="notion-text notion-block-8b23395ee4384cae8b529fcb0055f0a4">HAL_UART_Transmit_IT(&amp;uart1.uart, uart1. txOutPtr-&gt;start, (uart1.txOutPtr-&gt;end - uart1.txOutPtr-&gt;start + 1));</div><div class="notion-text notion-block-7bc945196dfe4090af914050ad73237e">uart1.txOutPtr++;</div><div class="notion-text notion-block-ae0537732c804e089090a1eab5525dcb">if(uart1.txOutPtr == uart1.txEndPtr){<div class="notion-text-children"><div class="notion-text notion-block-ff4c57ee7cbe402ebacffab3a59bb2c8">uart1.txOutPtr = &amp;uart1.txLocation[0];</div></div></div><div class="notion-text notion-block-a8ce70170dab4f58ac1ef0f6d514803a">}</div></div></div><div class="notion-text notion-block-21362253769f4983a2e074434cc0006b">}</div><div class="notion-text notion-block-0d023afe7ce2415682671d2665cbf200">/<em> ------------------UART2------------------ </em>/</div><div class="notion-text notion-block-9fcfa239a47d4cbf8d12d02b9b5d98db">if(uart2.rxInPtr != uart2.rxOutPtr){<div class="notion-text-children"><div class="notion-text notion-block-edcba91b8fe84d83b38ba2464f558a21">U2_DataRxToTx(uart2.rxOutPtr-&gt;start, (uart2.rxOutPtr-&gt;end - uart2.rxOutPtr-&gt;start + 1));</div><div class="notion-text notion-block-78738a891a09437bbbad80dc751f1878">uart2.rxOutPtr++;</div><div class="notion-text notion-block-0f337a97e43348c2810a0fe46dfb0eaa">if(uart2.rxOutPtr == uart2.rxEndPtr){<div class="notion-text-children"><div class="notion-text notion-block-28b8f651e72c435b99a6bb1edde7dfdd">uart2.rxOutPtr = &amp;uart2.rxLocation[0];</div></div></div><div class="notion-text notion-block-182af5fe44644b40a140657baa07ab17">}</div></div></div><div class="notion-text notion-block-95af6f4b062c4906bb293720f87a43bc">}</div><div class="notion-text notion-block-0b0e624954c74a4c9e0be2d86b57a88f">/<em> 判断发送缓冲区是否有数据 </em>/</div><div class="notion-text notion-block-b066d6a32e304221a24c11e3be511686">if((uart2.txInPtr != uart2.txOutPtr) &amp;&amp; (uart2.TxState == 0) ){<div class="notion-text-children"><div class="notion-text notion-block-8be83c50304b4becb2cac88981c103fb">uart2.TxState = 1;</div><div class="notion-text notion-block-8d3999ec8384496bb481c9447c5a14c5">HAL_UART_Transmit_IT(&amp;uart2.uart, uart2. txOutPtr-&gt;start, (uart2.txOutPtr-&gt;end - uart2.txOutPtr-&gt;start + 1));</div><div class="notion-text notion-block-3f41be8b0f9b44d59f195c314ca91c61">uart2.txOutPtr++;</div><div class="notion-text notion-block-ac89298c6d6c4153a52d89c610e02978">if(uart2.txOutPtr == uart2.txEndPtr){<div class="notion-text-children"><div class="notion-text notion-block-60ab8c34496f4ad384a6101c0a49c964">uart2.txOutPtr = &amp;uart2.txLocation[0];</div></div></div><div class="notion-text notion-block-22d9b1536b8745ad9b11de34130ab2ca">}</div></div></div><div class="notion-text notion-block-ebebb4c6267d4b1e848331f8cc7b9e93">}</div><div class="notion-text notion-block-453258367fdb44cc961d25d4cad26c52">/<em> ------------------UART3------------------ </em>/</div><div class="notion-text notion-block-5bd3dc59beb6427c9aee585079b99322">if(uart3.rxInPtr != uart3.rxOutPtr){<div class="notion-text-children"><div class="notion-text notion-block-025f91a65897424e811aa652c86f2e2f">U3_DataRxToTx(uart3.rxOutPtr-&gt;start, (uart3.rxOutPtr-&gt;end - uart3.rxOutPtr-&gt;start + 1));</div><div class="notion-text notion-block-2cb42a50d24b42f38624f73c1de2c3c0">uart3.rxOutPtr++;</div><div class="notion-text notion-block-ad4cca1543ad46199770033b0c46d3ba">if(uart3.rxOutPtr == uart3.rxEndPtr){<div class="notion-text-children"><div class="notion-text notion-block-87b5d5ac05414fd8b4d1e0e71d8cded6">uart3.rxOutPtr = &amp;uart3.rxLocation[0];</div></div></div><div class="notion-text notion-block-46d1b4ca2cd94ac8b9d2240250fc3728">}</div></div></div><div class="notion-text notion-block-7d383f39a40b450cb5c4a63175f115bb">}</div><div class="notion-text notion-block-0f068f99a55b4fac86e9d11a2a0756e7">/<em> 判断发送缓冲区是否有数据 </em>/</div><div class="notion-text notion-block-a79f59604ba341fe9e1d6906e64d3149">if((uart3.txInPtr != uart3.txOutPtr) &amp;&amp; (uart3.TxState == 0) ){<div class="notion-text-children"><div class="notion-text notion-block-eeb99e37c32f4690862c908f8c6923e9">uart3.TxState = 1;</div><div class="notion-text notion-block-16911571df4c4a8a97f6d70a9f9686a0">HAL_UART_Transmit_IT(&amp;uart3.uart, uart3. txOutPtr-&gt;start, (uart3.txOutPtr-&gt;end - uart3.txOutPtr-&gt;start + 1));</div><div class="notion-text notion-block-70062d5903824a24be0563c954ae1cd0">uart3.txOutPtr++;</div><div class="notion-text notion-block-2a68013832764575b99b6a7e59d24408">if(uart3.txOutPtr == uart3.txEndPtr){<div class="notion-text-children"><div class="notion-text notion-block-53894222ea6c459ebb8ac27fd76f0670">uart3.txOutPtr = &amp;uart3.txLocation[0];</div></div></div><div class="notion-text notion-block-126f143d30cb4c8789771ade5eb123b9">}</div></div></div><div class="notion-text notion-block-2624d58b8f3742a8ab0ac4304eb865a7">}</div></div></div><div class="notion-text notion-block-57268a8e2a0843eab5d8d0fed54f13ee">}</div></div></div><div class="notion-text notion-block-23db057db94f40d184f9f5b16274d33c">}<div class="notion-text-children"><div class="notion-blank notion-block-c944d3e8798d4b39a2f0feee16c488c8"> </div></div></div></div></details></div></details><details class="notion-toggle notion-block-cb02bfceb7904b85a8e6b7ec1fa692a7"><summary><h3 class="notion-h notion-h2 notion-h-indent-1 notion-block-cb02bfceb7904b85a8e6b7ec1fa692a7" data-id="cb02bfceb7904b85a8e6b7ec1fa692a7"><span><div id="cb02bfceb7904b85a8e6b7ec1fa692a7" class="notion-header-anchor"></div><span class="notion-h-title">八、HAL库：DMA不定长接收 + 空闲中断 + 循环收发缓冲区  串口123收发数据</span></span></h3></summary><div><details class="notion-toggle notion-block-ed4252376c1643739a0c875655bcab0e"><summary><h4 class="notion-h notion-h3 notion-block-ed4252376c1643739a0c875655bcab0e" data-id="ed4252376c1643739a0c875655bcab0e"><span><div id="ed4252376c1643739a0c875655bcab0e" class="notion-header-anchor"></div><span class="notion-h-title">1. 介绍</span></span></h4></summary><div><div class="notion-text notion-block-c38ac951073949c7bfb4d21718b03e32">DMA（Direct Memory Access）是一种直接内存访问技术，</div><div class="notion-text notion-block-79da20809cdd490d847ff597b73b16c1"><b>可以在不经过CPU</b>的情况下实现外设与内存之间的数据传输，提高数据传输效率</div></div></details><details class="notion-toggle notion-block-8505e08c30184cdf9ea8c64dc8fe19b1"><summary><h4 class="notion-h notion-h3 notion-block-8505e08c30184cdf9ea8c64dc8fe19b1" data-id="8505e08c30184cdf9ea8c64dc8fe19b1"><span><div id="8505e08c30184cdf9ea8c64dc8fe19b1" class="notion-header-anchor"></div><span class="notion-h-title">2. DMA实现的相关函数</span></span></h4></summary><div><div class="notion-text notion-block-a0786e7568c1430ab9b4f46cd850f855"><code class="notion-inline-code">#define __HAL_LINKDMA(</code><code class="notion-inline-code"><b>HANDLE</b></code><code class="notion-inline-code">, </code><code class="notion-inline-code"><b>PPP_DMA_FIELD</b></code><code class="notion-inline-code">, </code><code class="notion-inline-code"><b>DMA_HANDLE</b></code><code class="notion-inline-code">)        
   do{                                                           
       (</code><code class="notion-inline-code"><b>HANDLE</b></code><code class="notion-inline-code">)-&gt;</code><code class="notion-inline-code"><b>PPP_DMA_FIELD</b></code><code class="notion-inline-code"> = &amp;(</code><code class="notion-inline-code"><b>DMA_HANDLE</b></code><code class="notion-inline-code">);                  
       (</code><code class="notion-inline-code"><b>DMA_HANDLE</b></code><code class="notion-inline-code">).Parent = (</code><code class="notion-inline-code"><b>HANDLE</b></code><code class="notion-inline-code">);                           
   } while(0U)</code></div><ul class="notion-list notion-list-disc notion-block-154aa0376d1041eabedc352f6b7d3e8c"><li>三个参数：第一个是外设句柄，第二个是外设句柄内的一个DMA句柄指针，最后一个参数是DMA句柄。</li></ul><ul class="notion-list notion-list-disc notion-block-e0bbcfd58e9247df90fff3a5210f8ac9"><li>每个外设的句柄结构体中都一个该外设关于DMA相关的设置例如串口为 </li><ul class="notion-list notion-list-disc notion-block-e0bbcfd58e9247df90fff3a5210f8ac9"><li><code class="notion-inline-code">DMA_HandleTypeDef      *hdmatx;          </code>UART TX 的DMA句柄参数</li><li><code class="notion-inline-code">DMA_HandleTypeDef      *hdmarx;          </code>UART RX 的DMA句柄参数</li><li>函数的第二个参数用于指定外设中的 DMA 请求标识符。
<b>不同外设有不同含义：</b>
如在<b>定时器中</b>可对应更新、捕获 / 比较等事件的 DMA 请求标识符，用于触发相关 DMA 传输实现自动更新参数等；
在 <b>SPI </b>中是发送或接收 DMA 请求标识符，能实现高速自动收发数据；
在<b> ADC 中</b>则通常是转换完成 DMA 请求标识符，可将转换结果自动存储到内存缓冲区。
总之，该参数起到将特定外设事件与 DMA 传输关联起来的作用，以提高数据传输处理效率。</li></ul></ul><div class="notion-text notion-block-f43dc233a15b48b4be3af6a23a55c92d">调用这个API，会把用到DMA的外设总控结构体和DMA响应通道的总控结构体 进行<b>双向的父子链接</b>， 也就是 你能找到我 我也能找到你。</div><div class="notion-text notion-block-971d0cbf7d7d44acbd65f57045b9e388">DMA 1 - 7 有各自的中断入口点， 有各自的 中断处理函数。</div><div class="notion-text notion-block-28acb9efac5a4456b0e27bb5d5d357b5">通过这个Link  就建立起来的 DMA和外设的双向的链接了。 </div><div class="notion-text notion-block-adca70dfd7b7450d86f72c76b9117b66"><b>然后HAL库会自动配置好 在 发生特定事件时，对内存进行搬运的代码。</b></div><div class="notion-blank notion-block-74f2214654464b8499f8e11643f2a9da"> </div><div class="notion-text notion-block-4531ab43e5784e8b9e1941e166519757"><code class="notion-inline-code">__HAL_DMA_GET_COUNTER(__HANDLE__);</code></div><ul class="notion-list notion-list-disc notion-block-be8e79dac61e4941ad7f60853c178c75"><li><code class="notion-inline-code"><b>HANDLE</b></code>用到DMA的外设 </li></ul><div class="notion-text notion-block-58abdcf713eb4901bc10357fc534bfd4">获取DMA剩余 未传输的数据量</div></div></details><details class="notion-toggle notion-block-fe531b05757d4a22ab2a49bfa65ad4db"><summary><h4 class="notion-h notion-h3 notion-block-fe531b05757d4a22ab2a49bfa65ad4db" data-id="fe531b05757d4a22ab2a49bfa65ad4db"><span><div id="fe531b05757d4a22ab2a49bfa65ad4db" class="notion-header-anchor"></div><span class="notion-h-title">3. 注意事项：</span></span></h4></summary><div><ol start="1" class="notion-list notion-list-numbered notion-block-b8e7b64df54d401ea8ba353938bedff7" style="list-style-type:decimal"><li>DMA有不同的通道，也就需要有不同的DMA总控结构体， 例如 串口3的Tx在通道2 ， Rx在通道3…</li><ol class="notion-list notion-list-numbered notion-block-b8e7b64df54d401ea8ba353938bedff7" style="list-style-type:lower-alpha"><div class="notion-text notion-block-7eee27c4495748e9a46c21af68ec28bc"><b>所以在选用DMA通道的时候， 一定要选对！千万不要Link错了</b></div><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-7f87a4bee6ec48c5b6a677835a7eea25"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:100%;max-width:100%;flex-direction:column"><img style="object-fit:cover" src="https://cdn.jsdmirror.com/gh/LZJ-I/picx-images-hosting@main/images/%E5%B5%8C%E5%85%A5%E5%BC%8F%E8%BD%AF%E4%BB%B6%E5%BC%80%E5%8F%91/Post-stm32-hal/ab2b835b-2eba-4f92-9c8b-9d4a7525152f-1730703779427.webp?spaceId=3a565fcb-f425-4846-b72a-d32a98183896&amp;t=7f87a4be-e6ec-48c5-b6a6-77835a7eea25" alt="notion image" loading="lazy" decoding="async"/></div></figure></ol></ol><ol start="2" class="notion-list notion-list-numbered notion-block-18d29179e3014fb2853a0b7e5eb0f4a4" style="list-style-type:decimal"><li>使用串口的DMA接收和发送之后， 是不会通过中断来接收的（RXNE）</li></ol><ol start="3" class="notion-list notion-list-numbered notion-block-e54e49ed259c47669ce80eea7d8dd1c3" style="list-style-type:decimal"><li>使用串口的DMA发送之后， 会进入发送完成回调函数， 和 中断等一样。</li><ol class="notion-list notion-list-numbered notion-block-e54e49ed259c47669ce80eea7d8dd1c3" style="list-style-type:lower-alpha"><div class="notion-text notion-block-d71710bdc5f642d59b7fe35b6266fb88">（DMA发送完毕之后会置TCIE 发送完成中断为 1）</div></ol></ol><ol start="4" class="notion-list notion-list-numbered notion-block-25d0afae1a454fb3b948fde800e6882d" style="list-style-type:decimal"><li>注意循环和正常模式。</li></ol></div></details><details class="notion-toggle notion-block-be1d46ab295247da873b256d16fabfb0"><summary><h4 class="notion-h notion-h3 notion-block-be1d46ab295247da873b256d16fabfb0" data-id="be1d46ab295247da873b256d16fabfb0"><span><div id="be1d46ab295247da873b256d16fabfb0" class="notion-header-anchor"></div><span class="notion-h-title">4. 程序设计</span></span></h4></summary><div><details class="notion-toggle notion-block-5880554064a64425a2e3c43a5e5023bb"><summary><h4 class="notion-h notion-h3 notion-block-5880554064a64425a2e3c43a5e5023bb" data-id="5880554064a64425a2e3c43a5e5023bb"><span><div id="5880554064a64425a2e3c43a5e5023bb" class="notion-header-anchor"></div><span class="notion-h-title">3.1 大致流程</span></span></h4></summary><div><ol start="1" class="notion-list notion-list-numbered notion-block-51863ba357e647458289a9091b476cee" style="list-style-type:decimal"><li>打开DMA时钟</li></ol><ol start="2" class="notion-list notion-list-numbered notion-block-1f69cb9e6d2749f4af3ed0dd811c890b" style="list-style-type:decimal"><li>配置 <code class="notion-inline-code">DMA_HandleTypeDef </code>类型的 DMA通道</li><ol class="notion-list notion-list-numbered notion-block-1f69cb9e6d2749f4af3ed0dd811c890b" style="list-style-type:lower-alpha"><ul class="notion-list notion-list-disc notion-block-59459cf849754814b45d7456c2aa4a2a"><li>实例、初始化的方向、存储区是否递增、目标地址是否自增、两方字长、工作模式等</li></ul></ol></ol><ol start="3" class="notion-list notion-list-numbered notion-block-fee7e84f9aaa4b2e8548b80e1c531758" style="list-style-type:decimal"><li>通过<code class="notion-inline-code">__HAL_LINKDMA</code> 链接 外设与通道，并配置第二个参数。在发生发送、或接收事件时，开始搬运数据。</li></ol><ol start="4" class="notion-list notion-list-numbered notion-block-154295ebf52442e6a285de55e67e6aa4" style="list-style-type:decimal"><li>打开对应通道的中断（虽然暂时不用）</li></ol></div></details></div></details><ol start="1" class="notion-list notion-list-numbered notion-block-3ea914e80d364ff98d617e7d938adeff" style="list-style-type:decimal"><li>可以利用<code class="notion-inline-code">__HAL_DMA_GET_COUNTER</code>函数来获得当前DMA的未搬运的量</li></ol><details class="notion-toggle notion-block-50e0221bbf6647d6a2f518d22488a730"><summary><h4 class="notion-h notion-h3 notion-block-50e0221bbf6647d6a2f518d22488a730" data-id="50e0221bbf6647d6a2f518d22488a730"><span><div id="50e0221bbf6647d6a2f518d22488a730" class="notion-header-anchor"></div><span class="notion-h-title">uart.h</span></span></h4></summary><div></div></details><details class="notion-toggle notion-block-fc51ed0be91e4481b748cce1e96a6ffe"><summary><h4 class="notion-h notion-h3 notion-block-fc51ed0be91e4481b748cce1e96a6ffe" data-id="fc51ed0be91e4481b748cce1e96a6ffe"><span><div id="fc51ed0be91e4481b748cce1e96a6ffe" class="notion-header-anchor"></div><span class="notion-h-title">uart.c</span></span></h4></summary><div><div class="notion-text notion-block-1984c5d434b943c78afff2563a7acea0">/<em> UART硬件初始化回调 </em>/</div><div class="notion-text notion-block-4747838e9f1041009037ce3ecbd41fba">void HAL_UART_MspInit(UART_HandleTypeDef *huart){</div><div class="notion-text notion-block-362b040dd65a4ebe9ff14267787ab871">GPIO_InitTypeDef GPIO_InitType;</div><div class="notion-text notion-block-9c4b0a5e0fde4f2993677bcba2387497">if(huart-&gt;Instance == USART1){</div><div class="notion-text notion-block-ed059d34d56147269a502b1c1743685d">__HAL_RCC_USART1_CLK_ENABLE();</div><div class="notion-text notion-block-1ffeb4fcec0a4f48b2b515e1315954d8">__HAL_RCC_GPIOA_CLK_ENABLE();</div><div class="notion-text notion-block-72ff812335f34a0497f55459dea6d450">__HAL_RCC_DMA1_CLK_ENABLE();    //打开DMA时钟</div><div class="notion-text notion-block-a889414ef13940ef89d3edae4059aefd">GPIO_<a class="notion-link" href="http://InitType.Pin" target="_blank" rel="noopener noreferrer">InitType.Pin</a> = GPIO_PIN_9;</div><div class="notion-text notion-block-bd90d323dfe0416f91979722c19bdd1e">GPIO_InitType.Mode = GPIO_MODE_AF_PP;</div><div class="notion-text notion-block-1c53a52e2e414259bcb43fa66e97f2ab">GPIO_InitType.Speed = GPIO_SPEED_FREQ_MEDIUM;</div><div class="notion-text notion-block-5d7205f23b72480687da53cb14625a26">HAL_GPIO_Init(GPIOA,&amp;GPIO_InitType);</div><div class="notion-text notion-block-7ac538d36d8f47148d367c818864f29e">GPIO_<a class="notion-link" href="http://InitType.Pin" target="_blank" rel="noopener noreferrer">InitType.Pin</a> = GPIO_PIN_10;</div><div class="notion-text notion-block-bb7c883c6d1846708d9dfd0132bf39dd">GPIO_InitType.Mode = GPIO_MODE_AF_INPUT;</div><div class="notion-text notion-block-2605fd99379844d9aa3567c45ac63f9e">GPIO_InitType.Pull = GPIO_NOPULL;</div><div class="notion-text notion-block-fb6a87ce9c7e47c78b22bc7f99237070">HAL_GPIO_Init(GPIOA,&amp;GPIO_InitType);</div><div class="notion-text notion-block-40899cb061ce4b3882f23a7ba84f2985">HAL_NVIC_SetPriority(USART1_IRQn,3,0);</div><div class="notion-text notion-block-9578225d35c842189d31057fc3dd52c4">HAL_NVIC_EnableIRQ(USART1_IRQn);</div><div class="notion-text notion-block-1aa4cf4bca8e40b0a185223265a1baf3">/<em> DMA配置 </em>/</div><div class="notion-text notion-block-23497964edec4317b7f6218aa019b744">//    发送配置</div><div class="notion-text notion-block-168c473640da4bf29e92faa4f6892f0b">uart1.dmaTx.Instance = DMA1_Channel4;                       //DMA通道:4</div><div class="notion-text notion-block-369a15ac02f9432c83e5ebec26af7c38">uart1.dmaTx.Init.Direction = DMA_MEMORY_TO_PERIPH;          //方向：存储区到外设</div><div class="notion-text notion-block-fb54accbefac414ab1d65174ac5f0d81">uart1.dmaTx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;    //存储区数据宽度</div><div class="notion-text notion-block-aa5b1d4454864e649bd9fb011cf95f9b">uart1.dmaTx.Init.MemInc = DMA_MINC_ENABLE;                  //存储区是否递增？</div><div class="notion-text notion-block-450e23cbb9d84fea9bf552bf2bc567af">uart1.dmaTx.Init.Mode = DMA_NORMAL;                         //工作模式（正常或循环）</div><div class="notion-text notion-block-c8743a5a21ef4e48a3e0c2cd4fb3714a">uart1.dmaTx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE; //外设数据宽度</div><div class="notion-text notion-block-08222984aa984c788303d3b540ccf95c">uart1.dmaTx.Init.PeriphInc = DMA_PINC_DISABLE;              //目标地址是否递增？</div><div class="notion-text notion-block-29c1dd6b385a4ea3b2975b8351e61dbe">uart1.dmaTx.Init.Priority = DMA_PRIORITY_MEDIUM;            //优先级</div><div class="notion-text notion-block-51183f954a6641bfa7c0a4e105dee996">//链接</div><div class="notion-text notion-block-f66989d0b6ff45eaa54e199dd1296c6b">__HAL_LINKDMA(huart, hdmatx, uart1.dmaTx);</div><div class="notion-text notion-block-42617759e23446aea7c73c34085a4056">//初始化</div><div class="notion-text notion-block-8ec623f6ea4d4c32b78adb4dc63bf73d">HAL_DMA_Init(&amp;uart1.dmaTx);</div><div class="notion-text notion-block-bbca1f7546d346cab378b8222c7596f3">//打开DMA通道中断</div><div class="notion-text notion-block-c58d829baaba429fb2f7ad0b507541f1">HAL_NVIC_SetPriority(DMA1_Channel4_IRQn,3,0);</div><div class="notion-text notion-block-07b8ed99d22d45289a1aab3bd8270971">HAL_NVIC_EnableIRQ(DMA1_Channel4_IRQn);</div><div class="notion-text notion-block-bf86cda674aa4a3c93a14c8999543e4b">//    接收配置</div><div class="notion-text notion-block-250cc9f789d9466d9dc0c53ea514e47b">uart1.dmaRx.Instance = DMA1_Channel5;                      //DMA通道:5</div><div class="notion-text notion-block-f5a7c3be44a940d9ba8f443dcff70ab6">uart1.dmaRx.Init.Direction = DMA_PERIPH_TO_MEMORY;         //方向：外设区到存储</div><div class="notion-text notion-block-2641c7def6984985bd11a4ef62f9d0eb">uart1.dmaRx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;   </div><div class="notion-text notion-block-0a17635f91b847c5a957dd0ba852dd0d">uart1.dmaRx.Init.MemInc = DMA_MINC_ENABLE;                 </div><div class="notion-text notion-block-9d72a04fd32e4bc187c3e90855c53b9f">uart1.dmaRx.Init.Mode = DMA_NORMAL;                        </div><div class="notion-text notion-block-0dfcfbed95894eed8078cabc27e4c842">uart1.dmaRx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;</div><div class="notion-text notion-block-512186ac6cad4d13860fa84a2543ec64">uart1.dmaRx.Init.PeriphInc = DMA_PINC_DISABLE;             </div><div class="notion-text notion-block-d0144d0153a844d1b05637766420d51b">uart1.dmaRx.Init.Priority = DMA_PRIORITY_MEDIUM;           </div><div class="notion-text notion-block-6729d71ee5e246539040743c581ade8e">//链接</div><div class="notion-text notion-block-31f219cd398b4bd18b1eec1b7bbcc469">__HAL_LINKDMA(huart, hdmarx, uart1.dmaRx);</div><div class="notion-text notion-block-c18f4516ae894d4482b1c660e2002058">//初始化</div><div class="notion-text notion-block-de30f18a5d2a47389e1c3eca39ac3ba1">HAL_DMA_Init(&amp;uart1.dmaRx);</div><div class="notion-text notion-block-2e4406bf0c5c40f0b1bff694b93b93bc">//打开DMA中断</div><div class="notion-text notion-block-4a15d336b70046d6a8facf2b2ed61ccd">HAL_NVIC_SetPriority(DMA1_Channel5_IRQn,3,0);</div><div class="notion-text notion-block-dbd30bcdd26144468d1d289004e1be47">HAL_NVIC_EnableIRQ(DMA1_Channel5_IRQn);</div><div class="notion-text notion-block-1209ff2376324d7b95ecaf51755053a2">}else if(huart-&gt;Instance == USART2){</div><div class="notion-text notion-block-558b9f9601d846f88149e81123e8e75e">__HAL_RCC_GPIOA_CLK_ENABLE();</div><div class="notion-text notion-block-9848d666a25649528fadcfe60b9b4c70">__HAL_RCC_USART2_CLK_ENABLE();</div><div class="notion-text notion-block-a48812c6ecf34489af915c122545e1b4">__HAL_RCC_DMA1_CLK_ENABLE();</div><div class="notion-text notion-block-d079864e29cb49e48ebbbc5da830c972">GPIO_<a class="notion-link" href="http://InitType.Pin" target="_blank" rel="noopener noreferrer">InitType.Pin</a> = GPIO_PIN_2;</div><div class="notion-text notion-block-3b5edf4f60254d6baf53745f41102cf3">GPIO_InitType.Mode = GPIO_MODE_AF_PP;</div><div class="notion-text notion-block-7b53a4304ee04795bcd95b44b8fac260">GPIO_InitType.Speed = GPIO_SPEED_FREQ_MEDIUM;</div><div class="notion-text notion-block-4bd2ec0913024cf8844933c4c0243761">HAL_GPIO_Init(GPIOA,&amp;GPIO_InitType);</div><div class="notion-text notion-block-b35dd1854ed5479487f4753176bffbd7">GPIO_<a class="notion-link" href="http://InitType.Pin" target="_blank" rel="noopener noreferrer">InitType.Pin</a> = GPIO_PIN_3;</div><div class="notion-text notion-block-55a8d75f93424dc78461e97b9bef278d">GPIO_InitType.Mode = GPIO_MODE_AF_INPUT;</div><div class="notion-text notion-block-ec63c2b6f573417ca66b26804091e04e">GPIO_InitType.Pull = GPIO_NOPULL;</div><div class="notion-text notion-block-eedcf6624d78435fadb460d5d3e952d3">HAL_GPIO_Init(GPIOA,&amp;GPIO_InitType);</div><div class="notion-text notion-block-7aad71ef8bb049038cff457c9dc35f66">HAL_NVIC_SetPriority(USART2_IRQn,3,0);</div><div class="notion-text notion-block-53dd0019a16744dbbc984081114f53db">HAL_NVIC_EnableIRQ(USART2_IRQn);</div><div class="notion-text notion-block-96c552566c124047b273e83564b815f0">/<em> DMA配置 </em>/</div><div class="notion-text notion-block-d6be2e3f06f94a199f49a0924d740234">uart2.dmaTx.Instance = DMA1_Channel7;                      </div><div class="notion-text notion-block-480755ed4188499e997adc6ed4033935">uart2.dmaTx.Init.Direction = DMA_MEMORY_TO_PERIPH;         </div><div class="notion-text notion-block-b9cba1fdbda74ad0b7ed932af72ae105">uart2.dmaTx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;   </div><div class="notion-text notion-block-afacb1868ace415385456f11449453c9">uart2.dmaTx.Init.MemInc = DMA_MINC_ENABLE;                 </div><div class="notion-text notion-block-4037a933ba5b476bb29fb321d684669d">uart2.dmaTx.Init.Mode = DMA_NORMAL;                        </div><div class="notion-text notion-block-1955ca0f3a4d483eb715c23a323defe1">uart2.dmaTx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;</div><div class="notion-text notion-block-f5056de5cdc846cfaa5e44761d3bf2db">uart2.dmaTx.Init.PeriphInc = DMA_PINC_DISABLE;             </div><div class="notion-text notion-block-a9b1cefd36354211acc88215912daa03">uart2.dmaTx.Init.Priority = DMA_PRIORITY_MEDIUM;           </div><div class="notion-text notion-block-272c8c7108b0493eaa44a150a13bfeff">__HAL_LINKDMA(huart, hdmatx, uart2.dmaTx);</div><div class="notion-text notion-block-6fd5f16de53a4c50940a65c489fdb755">HAL_DMA_Init(&amp;uart2.dmaTx);</div><div class="notion-text notion-block-35f2214d04e349e495ea8f4ba66b1c21">HAL_NVIC_SetPriority(DMA1_Channel7_IRQn,3,0);</div><div class="notion-text notion-block-725e5978cc504dbf86c17e867686f857">HAL_NVIC_EnableIRQ(DMA1_Channel7_IRQn);</div><div class="notion-text notion-block-2240d10574e84c3c9fd51e0f4be94850">uart2.dmaRx.Instance = DMA1_Channel6;</div><div class="notion-text notion-block-091c4053a7b3446186ebb7953cdf33e8">uart2.dmaRx.Init.Direction = DMA_PERIPH_TO_MEMORY;</div><div class="notion-text notion-block-727c9275b39a429f94307a2aadf64337">uart2.dmaRx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;   </div><div class="notion-text notion-block-c43abddc51df4291b7f474f2dcf0ca62">uart2.dmaRx.Init.MemInc = DMA_MINC_ENABLE;                 </div><div class="notion-text notion-block-ac8df8e04b364f90ac9f54ad1a8cd5cc">uart2.dmaRx.Init.Mode = DMA_NORMAL;                        </div><div class="notion-text notion-block-2ac78df8af52486291c872106a9f8e32">uart2.dmaRx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;</div><div class="notion-text notion-block-ae8051d25b6e442287fc97a141a4ea79">uart2.dmaRx.Init.PeriphInc = DMA_PINC_DISABLE;             </div><div class="notion-text notion-block-bb5517dd2bc4438b87a376fff095c39f">uart2.dmaRx.Init.Priority = DMA_PRIORITY_MEDIUM;</div><div class="notion-text notion-block-4029e3ad1aad468c95da0a83658c5cd4">__HAL_LINKDMA(huart, hdmarx, uart2.dmaRx);</div><div class="notion-text notion-block-f2af66298bcc4910a91147a506d83e45">HAL_DMA_Init(&amp;uart2.dmaRx);</div><div class="notion-text notion-block-9db57f1e92bc466db342fbe48ba1d173">HAL_NVIC_SetPriority(DMA1_Channel6_IRQn,3,0);</div><div class="notion-text notion-block-9fa3c307e2864bcdb91217cc0aaa6362">HAL_NVIC_EnableIRQ(DMA1_Channel6_IRQn);</div><div class="notion-text notion-block-1a10905e76b144fba2c4b33fc3bcaa76">}else if(huart-&gt;Instance == USART3){</div><div class="notion-text notion-block-3c5391c5747a429389f36fad7ba90a8e">__HAL_RCC_GPIOB_CLK_ENABLE();</div><div class="notion-text notion-block-7640d76a69a448f6879d51f30db18b7c">__HAL_RCC_USART3_CLK_ENABLE();</div><div class="notion-text notion-block-cf31c9d20a464327b1766ad956f2d1ea">__HAL_RCC_DMA1_CLK_ENABLE();</div><div class="notion-text notion-block-e5e22bbd588446b88ba25ef95f4c03f7">GPIO_<a class="notion-link" href="http://InitType.Pin" target="_blank" rel="noopener noreferrer">InitType.Pin</a> = GPIO_PIN_10;</div><div class="notion-text notion-block-e21a253612ad401b8caff0269666b5af">GPIO_InitType.Mode = GPIO_MODE_AF_PP;</div><div class="notion-text notion-block-e89c1ff3ad0948babed905fd2edf0fe0">GPIO_InitType.Speed = GPIO_SPEED_FREQ_MEDIUM;</div><div class="notion-text notion-block-efd419f7eed949418b57814b6886a3e4">HAL_GPIO_Init(GPIOB,&amp;GPIO_InitType);</div><div class="notion-text notion-block-195f87ea32d346c8a2c276447f8a84e8">GPIO_<a class="notion-link" href="http://InitType.Pin" target="_blank" rel="noopener noreferrer">InitType.Pin</a> = GPIO_PIN_11;</div><div class="notion-text notion-block-cbf0ccd0646a460ca771e229531f72d0">GPIO_InitType.Mode = GPIO_MODE_AF_INPUT;</div><div class="notion-text notion-block-49320674e77d4ddd94354acdff98e9f5">GPIO_InitType.Pull = GPIO_NOPULL;</div><div class="notion-text notion-block-db409955b8de43dc9a17d7b37853a2a1">HAL_GPIO_Init(GPIOB,&amp;GPIO_InitType);</div><div class="notion-text notion-block-110bf25f29824554a7f04dd8fa6b45bc">HAL_NVIC_SetPriority(USART3_IRQn,3,0);</div><div class="notion-text notion-block-ae49c9b2389940ad95da9259b9728745">HAL_NVIC_EnableIRQ(USART3_IRQn);</div><div class="notion-text notion-block-f54e11cc7efe483689ba536410c0c0f5">/<em> DMA配置 </em>/</div><div class="notion-text notion-block-2554404785c74c9b90a164c01cc835e1">uart3.dmaTx.Instance = DMA1_Channel2;                      </div><div class="notion-text notion-block-811a218da4d14000a31f97254d4d4288">uart3.dmaTx.Init.Direction = DMA_MEMORY_TO_PERIPH;         </div><div class="notion-text notion-block-c144cbef660c4634879d83da90d7b3f9">uart3.dmaTx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;   </div><div class="notion-text notion-block-563e82b12bbe4334882fd5c7357258a5">uart3.dmaTx.Init.MemInc = DMA_MINC_ENABLE;                 </div><div class="notion-text notion-block-5289b8f466434f5988ce0b9f8a7fbd17">uart3.dmaTx.Init.Mode = DMA_NORMAL;                        </div><div class="notion-text notion-block-0ad5cf55f17c468ebb02fa53c96e9e20">uart3.dmaTx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;</div><div class="notion-text notion-block-ef50877a5231457b856c56de665180cc">uart3.dmaTx.Init.PeriphInc = DMA_PINC_DISABLE;             </div><div class="notion-text notion-block-a8b6a2473b3340d8b161bbeb83b22eaa">uart3.dmaTx.Init.Priority = DMA_PRIORITY_MEDIUM;           </div><div class="notion-text notion-block-fc167121abaf47c6ae43731f4b1408ce">__HAL_LINKDMA(huart, hdmatx, uart3.dmaTx);</div><div class="notion-text notion-block-4d13c780cadb443f819072b7a2adf65c">HAL_DMA_Init(&amp;uart3.dmaTx);</div><div class="notion-text notion-block-0ac98131bcbe43c684b9a5dfd5f27dbe">HAL_NVIC_SetPriority(DMA1_Channel2_IRQn,3,0);</div><div class="notion-text notion-block-c470150d86fd4cddb4528a4553c5780f">HAL_NVIC_EnableIRQ(DMA1_Channel2_IRQn);</div><div class="notion-text notion-block-76549f7d17414ad8a86c6094f2cd517b">uart3.dmaRx.Instance = DMA1_Channel3;</div><div class="notion-text notion-block-04aebfaeaa3542f4a61ac92c9c1fb6b2">uart3.dmaRx.Init.Direction = DMA_PERIPH_TO_MEMORY;</div><div class="notion-text notion-block-0c39019764974ed8a6238d7a2d18492d">uart3.dmaRx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;   </div><div class="notion-text notion-block-ed3dcc660f1846a6aab2c5a141df4f29">uart3.dmaRx.Init.MemInc = DMA_MINC_ENABLE;                 </div><div class="notion-text notion-block-c1cd4481231d4fc79c50b0a4a5207428">uart3.dmaRx.Init.Mode = DMA_NORMAL;                        </div><div class="notion-text notion-block-125cd156e8164ef68922350999141792">uart3.dmaRx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;</div><div class="notion-text notion-block-f0d5cdc09ff94b57b40993b317faaaa4">uart3.dmaRx.Init.PeriphInc = DMA_PINC_DISABLE;             </div><div class="notion-text notion-block-f9ae70d101264c0f99a4d1668ae4ab0d">uart3.dmaRx.Init.Priority = DMA_PRIORITY_MEDIUM;</div><div class="notion-text notion-block-6e65692ab88241dcab7ea5353a11e60a">__HAL_LINKDMA(huart, hdmarx, uart3.dmaRx);</div><div class="notion-text notion-block-8e2e917ca5b84b1c87b1d881e823c5c0">HAL_DMA_Init(&amp;uart3.dmaRx);</div><div class="notion-text notion-block-17a9b1092ffd43ab81cd78dbb20c9a85">HAL_NVIC_SetPriority(DMA1_Channel3_IRQn,3,0);</div><div class="notion-text notion-block-34a3583cdaef494cbe01010b55707313">HAL_NVIC_EnableIRQ(DMA1_Channel3_IRQn);</div><div class="notion-text notion-block-b0783f58e2a44dbb9e86c4ac846c0914">}</div><div class="notion-text notion-block-e4060c3ca2db4ad6a35e02c91ba19180">}</div><div class="notion-text notion-block-7ea6e812f98f4f95ba5497450904c605">/<em> 强声明的接收完成回调函数 </em>/</div><div class="notion-text notion-block-1b2109e343d847f2859ee086c6465728">void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)</div><div class="notion-text notion-block-4ddcafc3fc03420b86ad612b2233fbbb">{</div><div class="notion-text notion-block-f86d6d89d5ad452dacaf645d5b3a93e0">if(huart-&gt;Instance == USART1){</div><div class="notion-text notion-block-3ee4c75ab2db4f5faa1902bdebc66a9b">}else if(huart-&gt;Instance == USART2){</div><div class="notion-text notion-block-1e0b9de40e364595a3caa140fabb9d0c">}else if(huart-&gt;Instance == USART3){</div><div class="notion-text notion-block-80c5aa8fcc494d3688edbf753ed20cc2">}</div><div class="notion-text notion-block-0513e65cfd8b48d38278250a24c93413">}</div><div class="notion-text notion-block-aa54cf4fc4a146bba7e327145bfebf9d">/<em> 强声明的错误回调函数 </em>/</div><div class="notion-text notion-block-e10625bdcf374705949020432dd37e35">void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart)</div><div class="notion-text notion-block-07b11a1f311d4d618eeab9e74b095b98">{</div><div class="notion-text notion-block-ce962bad1ac8495da912327b9783e685">if(huart-&gt;Instance == USART1){</div><div class="notion-text notion-block-c78243a8bc8e49b388018d9ab0033922">}else if(huart-&gt;Instance == USART2){<div class="notion-text-children"><div class="notion-text notion-block-27c69c6df77443e2bfcc7fbd7a76a481">}else if(huart-&gt;Instance == USART3){</div><div class="notion-text notion-block-382d9ae01331441896a735306f20d757">}</div></div></div><div class="notion-text notion-block-ed9dcf30524941cfae0bec6c3e529dfd">}</div><div class="notion-text notion-block-8c61925646be4b398adb8bf403d64fcc">/<em> 强声明的发送完成回调函数 </em>/</div><div class="notion-text notion-block-96a9b57a012d46868341c025afb0bf15">void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)</div><div class="notion-text notion-block-3256d4c2fdba4b27b01a3323d8ae1dea">{</div><div class="notion-text notion-block-391c3733ca73422c9ab2b5443ba922ae">if(huart-&gt;Instance == USART1){</div><div class="notion-text notion-block-52d0670b59ba4c10bbb925867e596200">/<em> 发送完成，标志位清零 </em>/</div><div class="notion-text notion-block-6d78dc4396f441eeafa91774e931f3d9">uart1.TxState = 0;</div><div class="notion-text notion-block-28d0992e6c0e448a87accb2212895159">}else if(huart-&gt;Instance == USART2){</div><div class="notion-text notion-block-c6d93830a000432584cbff594707498a">uart2.TxState = 0;</div><div class="notion-text notion-block-9f82b50c1a3f44e1ac9a87ae9f51f368">}else if(huart-&gt;Instance == USART3){</div><div class="notion-text notion-block-5fcec708bc4146ffaa121a7e16709d69">uart3.TxState = 0;</div><div class="notion-text notion-block-0412bb2b4da44d72970d891acbb981f7">}</div><div class="notion-text notion-block-a6ec3197d1894872b0a977aef1eadc7b">}</div><div class="notion-text notion-block-99b573ee3cc442e2859c574306505242">/<em> 强声明的接收终止回调函数 </em>/</div><div class="notion-text notion-block-370b2a803fc749d08c6a4707d40d9549">void HAL_UART_AbortReceiveCpltCallback(UART_HandleTypeDef *huart)</div><div class="notion-text notion-block-f408ad84dd9843cfbd34a24a7627b5ae">{</div><div class="notion-text notion-block-b6704b794e814fc6ae3157b7680ca62e">if(huart-&gt;Instance == USART1){</div><div class="notion-text notion-block-25c65eea8fc946e088c73f00552035fa">uart1.rxInPtr-&gt;end = &amp;U1_Rx_Buff[uart1.rxCount - 1];</div><div class="notion-text notion-block-40a46272d2b54fefb4adfc87ac8f47a1">uart1.rxInPtr++;</div><div class="notion-text notion-block-c7b827070a2d4300add516b90b9cd9e0">if(uart1.rxInPtr == uart1.rxEndPtr){<div class="notion-text-children"><div class="notion-text notion-block-c0c918c0addd459e844a70ade72e4f8a">uart1.rxInPtr = &amp;uart1.rxLocation[0];</div></div></div><div class="notion-text notion-block-83465017ea074c08ba3c48219feb386c">}</div><div class="notion-text notion-block-82af3133322e45f7b418fa3df9f49cff">if((U1_RX_SIZE - uart1.rxCount) &lt; U1_RX_MAX){<div class="notion-text-children"><div class="notion-text notion-block-8eef513c7bd04d3bab8dc5d7c5f19df0">uart1.rxCount = 0;</div><div class="notion-text notion-block-30de8b17b36245e995d5207b2d33e794">uart1.rxInPtr-&gt;start = &amp;U1_Rx_Buff[0];</div></div></div><div class="notion-text notion-block-c748e250cf3a4d34b82ee5890f280a5c">}else{<div class="notion-text-children"><div class="notion-text notion-block-fd12b1c991ba41e1a9565a10565ae405">uart1.rxInPtr-&gt;start = &amp;U1_Rx_Buff[uart1.rxCount];</div></div></div><div class="notion-text notion-block-dbdaf656d0a04699a76cc8ee56c8c999">}</div><div class="notion-text notion-block-fefd3cc7075843588d3299c7e9923f63">HAL_UART_Receive_DMA(&amp;uart1.uart, uart1.rxInPtr-&gt;start, U1_RX_MAX);</div><div class="notion-text notion-block-e4752ec64b6f4242bd959ebf6c9f0a5f">}else if(huart-&gt;Instance == USART2){</div><div class="notion-text notion-block-f7876d11882c4bb4a6445b2edda083d5">uart2.rxInPtr-&gt;end = &amp;U2_Rx_Buff[uart2.rxCount - 1];</div><div class="notion-text notion-block-d9cbf699ea9a452b846aea4af9e60f09">uart2.rxInPtr++;</div><div class="notion-text notion-block-3a8180cb47a84226a2bd4c611820a152">if(uart2.rxInPtr == uart2.rxEndPtr){<div class="notion-text-children"><div class="notion-text notion-block-5fa96183a1324e96b0f596d683192d53">uart2.rxInPtr = &amp;uart2.rxLocation[0];</div></div></div><div class="notion-text notion-block-3b47eaf85a554312911888b9288b8df6">}</div><div class="notion-text notion-block-593c7c588a324d5bba9a9ef41e785602">if((U2_RX_SIZE - uart2.rxCount) &lt; U2_RX_MAX){<div class="notion-text-children"><div class="notion-text notion-block-54eb6352c6024a3f93925a728d9d29b9">uart2.rxCount = 0;</div><div class="notion-text notion-block-870765c62fb74981b3a5091c5aa8d9f9">uart2.rxInPtr-&gt;start = &amp;U2_Rx_Buff[0];</div></div></div><div class="notion-text notion-block-bf0a2095b67c4d059428fef2612f6a06">}else{<div class="notion-text-children"><div class="notion-text notion-block-80503fb380454226a2721a8f5dc374ee">uart2.rxInPtr-&gt;start = &amp;U2_Rx_Buff[uart2.rxCount];</div></div></div><div class="notion-text notion-block-1e2ddadb023d460aa2f8faf9c0481f93">}</div><div class="notion-text notion-block-85fcc1835ad5437dbdc88920441e2e2a">HAL_UART_Receive_DMA(&amp;uart2.uart, uart2.rxInPtr-&gt;start, U2_RX_MAX);</div><div class="notion-text notion-block-5869467a11f646498c0ed5273e511e57">}else if(huart-&gt;Instance == USART3){</div><div class="notion-text notion-block-31138e0ee3e64d13bffd7eea7bb4157f">uart3.rxInPtr-&gt;end = &amp;U3_Rx_Buff[uart3.rxCount - 1];</div><div class="notion-text notion-block-ef701e9c82b8419c982d6c65fe1567ad">uart3.rxInPtr++;</div><div class="notion-text notion-block-a15c79a4289347edb1d0d745d97ea7fb">if(uart3.rxInPtr == uart3.rxEndPtr){<div class="notion-text-children"><div class="notion-text notion-block-26a6ef0fa6f34dc59ec16648a93efd99">uart3.rxInPtr = &amp;uart3.rxLocation[0];</div></div></div><div class="notion-text notion-block-a993ccbdeb3d4eb9b23629278c23a3c2">}</div><div class="notion-text notion-block-1c1e2216d58a422db57740c5697603cd">if((U3_RX_SIZE - uart3.rxCount) &lt; U3_RX_MAX){<div class="notion-text-children"><div class="notion-text notion-block-6805dc5d34d84ec7ba071a37818b6204">uart3.rxCount = 0;</div><div class="notion-text notion-block-5b99654e521945afa01e29d426a4d4e5">uart3.rxInPtr-&gt;start = &amp;U3_Rx_Buff[0];</div></div></div><div class="notion-text notion-block-fb27194346274984ad9e68eb7bb2b8a5">}else{<div class="notion-text-children"><div class="notion-text notion-block-2978422def6b49a29e72d7e111ed2e41">uart3.rxInPtr-&gt;start = &amp;U3_Rx_Buff[uart3.rxCount];</div></div></div><div class="notion-text notion-block-f848c672b9bd460690e87ca862cd14e5">}</div><div class="notion-text notion-block-2226bd466bfc483281b6859dd93cb53b">HAL_UART_Receive_DMA(&amp;uart3.uart, uart3.rxInPtr-&gt;start, U3_RX_MAX);</div><div class="notion-text notion-block-9af069151d994db4a646e9710b11dc09">}</div><div class="notion-text notion-block-eb4d7a5c439d4e5b9f0aab111017d1d0">}</div></div></details><details class="notion-toggle notion-block-dc5b2c21fb094435943a626105d09a96"><summary><h4 class="notion-h notion-h3 notion-block-dc5b2c21fb094435943a626105d09a96" data-id="dc5b2c21fb094435943a626105d09a96"><span><div id="dc5b2c21fb094435943a626105d09a96" class="notion-header-anchor"></div><span class="notion-h-title">stm32fxx_It.c</span></span></h4></summary><div><div class="notion-text notion-block-cecf7162ba9043e5a7d5eaf3eb12f011">/<em>-------------------------------------------------</em>/</div><div class="notion-text notion-block-d181fa6241ad4d9ba991a7a26303d07e">/<em>                                                 </em>/</div><div class="notion-text notion-block-934b9a9b6d4f4ab6882670e9b57100c3">/<em>          实现各种中断服务函数的源文件           </em>/</div><div class="notion-text notion-block-606addc5f33547db828e1ea62228ca39">/<em>                                                 </em>/</div><div class="notion-text notion-block-da37884978524639bc53af19a7b3b17f">/<em>-------------------------------------------------</em>/</div><div class="notion-text notion-block-0b45de8b5ad04d9a85a672837a808ab9">#include &quot;stm32f1xx_hal.h&quot;   </div><div class="notion-text notion-block-ea22c0bbb79444bc821d0a9c1d4b0442">#include &quot;stm32f1xx_it.h&quot;</div><div class="notion-text notion-block-b2287c29a92344f99c47b50474b97976">#include &quot;uart.h&quot;</div><div class="notion-text notion-block-5135d9d70d3d489ba1ac842ab7ad4769">void EXTI15_10_IRQHandler(void)</div><div class="notion-text notion-block-148ce275999843bfb0bd14f37ee7b9f2">{<div class="notion-text-children"><div class="notion-text notion-block-ea475a83f6d64cfeaaf59ea8e2655507">HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_13);</div></div></div><div class="notion-text notion-block-06c01dc3043c4b8ca415490e3376ffc2">}</div><div class="notion-text notion-block-e37e6c6f557743149ad609fd30073bb0">void EXTI0_IRQHandler(void)</div><div class="notion-text notion-block-21f4e0aa33b345218df101fd67fd0258">{<div class="notion-text-children"><div class="notion-text notion-block-844b972042f04244884a57e59a94e68d">HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_0);</div></div></div><div class="notion-text notion-block-fd6a2e3fcbea4c568472217cd3920645">}</div><div class="notion-text notion-block-3a2ce28cca284381b83c3ccfa60740dc">/<em>-------------------------------------------------</em>/</div><div class="notion-text notion-block-fb11deaed5a541a9b102a0dadd058761">/<em>函数名：不可屏蔽中断处理函数                     </em>/</div><div class="notion-text notion-block-800ab28b6e0644c6b9cc0c9ffa03db37">/<em>参  数：无                                       </em>/</div><div class="notion-text notion-block-cd0f8e681b6d43e78bfc399df21c54a2">/<em>返回值：无                                       </em>/</div><div class="notion-text notion-block-8122b6540a2e47648463ce2e0508cff4">/<em>-------------------------------------------------</em>/</div><div class="notion-text notion-block-7b164d4b1a3240e786dc194804c03073">void NMI_Handler(void)</div><div class="notion-text notion-block-c3525a36b29749578abc586f3e641d78">{</div><div class="notion-text notion-block-b079d5dcd5e647f1a31a2dfb96f3018e">}</div><div class="notion-text notion-block-0b8bb3b4d6d84c958c513af821c5360a">/<em>-------------------------------------------------</em>/</div><div class="notion-text notion-block-0542581e0b7c4c96964cc7f534b7ca0a">/<em>函数名：硬件出错后进入的中断处理函数             </em>/</div><div class="notion-text notion-block-14cd629cf6304ecab3e55fc4a0dd65d1">/<em>参  数：无                                       </em>/</div><div class="notion-text notion-block-9e724db6c01546e18d75bab7b7f41087">/<em>返回值：无                                       </em>/</div><div class="notion-text notion-block-7f4e4b9ab0de413e9492c1c47048c96e">/<em>-------------------------------------------------</em>/</div><div class="notion-text notion-block-d40c93b6d07e4dc1b9b2c8f6f1c9481d">void HardFault_Handler(void)</div><div class="notion-text notion-block-77bf9fd59a224f88ac9f575b21e1745d">{</div><div class="notion-text notion-block-afbecee7ed694efd9f5c5233e1bd61da">}</div><div class="notion-text notion-block-78ac34108c7243799ccb4499cd3d1434">/<em>-------------------------------------------------</em>/</div><div class="notion-text notion-block-1183ba3c8716415fab7345ea78a4fda3">/<em>函数名：软中断，SWI 指令调用的处理函数           </em>/</div><div class="notion-text notion-block-a7107f78670c474bae55a99a71ca13b5">/<em>参  数：无                                       </em>/</div><div class="notion-text notion-block-5020ef25503e486593a856de1dd810ba">/<em>返回值：无                                       </em>/</div><div class="notion-text notion-block-40566352cfaa4d93b5d3ec8d0bcb5957">/<em>-------------------------------------------------</em>/</div><div class="notion-text notion-block-fed8331fa08244c3a0803130bee6e72f">void SVC_Handler(void)</div><div class="notion-text notion-block-3b0cef9754004928a6ba80ae010fbae3">{</div><div class="notion-text notion-block-27e15f13ed894c9e863b2f7749dfa163">}</div><div class="notion-text notion-block-3ffbd78145a34fe3bb03b0404f11816b">/<em>-------------------------------------------------</em>/</div><div class="notion-text notion-block-97dfc475388149e495d6b0513aea56cf">/<em>函数名：可挂起的系统服务处理函数                 </em>/</div><div class="notion-text notion-block-fbdba228f83d443988cc11812f7c84ae">/<em>参  数：无                                       </em>/</div><div class="notion-text notion-block-025c6cde7ef04848ba5826fc08bc9ed9">/<em>返回值：无                                       </em>/</div><div class="notion-text notion-block-802fd8f3952145de83791d7e61ddb3a9">/<em>-------------------------------------------------</em>/</div><div class="notion-text notion-block-a08851e57a0f46998c8e1429eafaa9f8">void PendSV_Handler(void)</div><div class="notion-text notion-block-492b9e98d87944009bb0b738de7a9dd3">{</div><div class="notion-text notion-block-a58be1c150f942d4a36edc57bfc7cbc1">}</div><div class="notion-text notion-block-b48a67ed9e0c4991bd8e5293a521056c">/<em>-------------------------------------------------</em>/</div><div class="notion-text notion-block-d1bf2e852a244895a8b7126ca4e6658f">/<em>函数名：SysTic系统嘀嗒定时器处理函数             </em>/</div><div class="notion-text notion-block-c72ba459b1e84add96613e12bdab96be">/<em>参  数：无                                       </em>/</div><div class="notion-text notion-block-689f58de4dcf4c4d9a7507e0fd467fbf">/<em>返回值：无                                       </em>/</div><div class="notion-text notion-block-581e031532164472857ad6d9280bb255">/<em>-------------------------------------------------</em>/</div><div class="notion-text notion-block-53d58655d4c545b383ab702705c227b1">void SysTick_Handler(void)</div><div class="notion-text notion-block-2b509b6094de4a508680a9b72524b27f">{  </div><div class="notion-text notion-block-b8c99842408a405a9fccc8a650e2e26b">HAL_IncTick();</div><div class="notion-text notion-block-55c1880fa8574830b1846a41b0db0a4e">}</div><div class="notion-text notion-block-665f1ff5f2b54f7e8e9330db581c36e3">/<em>-------------------------------------------------</em>/</div><div class="notion-text notion-block-a700ce9809e747e2acdaf31712e9c80b">/<em>函数名：串口1中断处理函数                        </em>/</div><div class="notion-text notion-block-5ca53af0a5eb4129961f1252c3f6fad4">/<em>参  数：无                                       </em>/</div><div class="notion-text notion-block-12fba6a038e4485b815fc075cbe026b7">/<em>返回值：无                                       </em>/</div><div class="notion-text notion-block-dab7ca923f2846cf9e4c838db1cdddc6">/<em>-------------------------------------------------</em>/</div><div class="notion-text notion-block-d19741a2b87f424a91364e4ac401c7f9">void USART1_IRQHandler(void)</div><div class="notion-text notion-block-df08737d3b4c4965b6331f2d81c6704a">{  </div><div class="notion-text notion-block-27e12edf9ad64f458b3989d2cd4bf5bd">HAL_UART_IRQHandler(&amp;uart1.uart);</div><div class="notion-text notion-block-1d208277bf494c96b8d4313087161aba">/<em> 在每次进入中断后，判断是否为空闲中断 </em>/</div><div class="notion-text notion-block-d63e518d8ef74bf59cbda68fd3fb5b76">if(__HAL_UART_GET_FLAG(&amp;uart1.uart, UART_FLAG_IDLE)){<div class="notion-text-children"><div class="notion-text notion-block-c7b30be6a54b4606bb4b4064c02d965a">/<em> 清除空闲标志位 </em>/</div><div class="notion-text notion-block-3ca64ecdaf314f6d9b78627dcf00a415">//__HAL_UART_CLEAR_FLAG(&amp;uart1.uart, UART_FLAG_IDLE);</div><div class="notion-text notion-block-52e36c66ef454b48b59cfe7ac9b86f78">__HAL_UART_CLEAR_IDLEFLAG(&amp;uart1.uart);</div><div class="notion-text notion-block-eac0cbe706244fa0a0769de349e9b0b1">/<em> 获取这次传输了多少字节 </em>/</div><div class="notion-text notion-block-db0589a1c783458cb60e480b7c8751ca">//uart1.rxCount += (U1_RX_MAX - uart1.uart.RxXferCount);</div><div class="notion-text notion-block-5805d033fc854a388a9bc093f75a7955">uart1.rxCount += (U1_RX_MAX - (__HAL_DMA_GET_COUNTER(&amp;uart1.dmaRx)));   //利用DMA的api 获取剩余未发送数据量</div><div class="notion-text notion-block-f39cd8a556a6446ba8df376647d75204">/<em> 终止当前的接收(会把RxferCount清零) </em>/</div><div class="notion-text notion-block-beaf6ebf15e045fe8265250f68834382">HAL_UART_AbortReceive_IT(&amp;uart1.uart);</div></div></div><div class="notion-text notion-block-d4c6e8dfb7514f9caa93e4517b911a12">}</div><div class="notion-text notion-block-e339d1dcd9a043d0a9cccfd88a6222e5">}</div><div class="notion-text notion-block-a6703e172b874be08c3137e355d0bf36">/<em>-------------------------------------------------</em>/</div><div class="notion-text notion-block-5ffd383f3f5d4ea59cc6b7515b6db4e6">/<em>函数名：串口2中断处理函数                        </em>/</div><div class="notion-text notion-block-c235d5719e8a49038cd6242423366375">/<em>参  数：无                                       </em>/</div><div class="notion-text notion-block-ba3036d59ab647ad8c0ae8d1d0099033">/<em>返回值：无                                       </em>/</div><div class="notion-text notion-block-95040c64519547cdacb2953cc3cbaa0a">/<em>-------------------------------------------------</em>/</div><div class="notion-text notion-block-9c42438e1b5f4d6e960192a9e3400d63">void USART2_IRQHandler(void)</div><div class="notion-text notion-block-2b567f90df7a408a96bd31d6871f890b">{  </div><div class="notion-text notion-block-4cc5db35689e4e7aabc5e077c3455c5d">HAL_UART_IRQHandler(&amp;uart2.uart);</div><div class="notion-text notion-block-13f9f415a3f74093b83ead2a46677931">if(__HAL_UART_GET_FLAG(&amp;uart2.uart, UART_FLAG_IDLE)){<div class="notion-text-children"><div class="notion-text notion-block-405adf2bff5d4ed7bf44384987b32ca0">__HAL_UART_CLEAR_IDLEFLAG(&amp;uart2.uart);</div><div class="notion-text notion-block-2bed3b0dd679477aa93c903fa8dba0d8">uart2.rxCount += (U2_RX_MAX - (__HAL_DMA_GET_COUNTER(&amp;uart2.dmaRx)));</div><div class="notion-text notion-block-06556202aae34056bb83434be6c16681">HAL_UART_AbortReceive_IT(&amp;uart2.uart);</div></div></div><div class="notion-text notion-block-9a84d84c6c4d408ebc0a4f61c0862b7a">}</div><div class="notion-text notion-block-4e3b359379504aada534c43068719f46">}</div><div class="notion-text notion-block-6414e5bdfdd640b2906dc01974124008">/<em>-------------------------------------------------</em>/</div><div class="notion-text notion-block-13c5bc216c664635aa8a91d84b0858c5">/<em>函数名：串口3中断处理函数                        </em>/</div><div class="notion-text notion-block-f934859d217e43ef919e351d7a6475f7">/<em>参  数：无                                       </em>/</div><div class="notion-text notion-block-6313d2a1737b4f0698095c558cfdfd9a">/<em>返回值：无                                       </em>/</div><div class="notion-text notion-block-ba1a84f80ab648eba6feaa5598cea739">/<em>-------------------------------------------------</em>/</div><div class="notion-text notion-block-4e44d6e7343c466c8c0823043d6d721f">void USART3_IRQHandler(void)</div><div class="notion-text notion-block-ef32ab839bb243918638a2a8288727c4">{  </div><div class="notion-text notion-block-9b33cbaf0e9b41a1aaab5dff914df11b">HAL_UART_IRQHandler(&amp;uart3.uart);</div><div class="notion-text notion-block-dbcbdd2be1e449c29ea1f3e288a972ea">if(__HAL_UART_GET_FLAG(&amp;uart3.uart, UART_FLAG_IDLE)){<div class="notion-text-children"><div class="notion-text notion-block-f80d005f4b1a4282b8cb5a2e0758e1ab">__HAL_UART_CLEAR_IDLEFLAG(&amp;uart3.uart);</div><div class="notion-text notion-block-d2ce25e449994aa48207a58b9c1efc1e">uart3.rxCount += (U3_RX_MAX - (__HAL_DMA_GET_COUNTER(&amp;uart3.dmaRx)));</div><div class="notion-text notion-block-0092f8b87e1748e3ac56c8235ed341bb">HAL_UART_AbortReceive_IT(&amp;uart3.uart);</div></div></div><div class="notion-text notion-block-6dbe373265224c468fb97dfcccf63d97">}</div><div class="notion-text notion-block-d360eccb3aad48e881ed14dc4ab3342f">}</div><div class="notion-text notion-block-7de66c196f4647f8872b6b3d1ba47402">/<em>-------------------------------------------------</em>/</div><div class="notion-text notion-block-a6c1a1df196e42b4967af68d8d02a79c">/<em>函数名：DMA通道4中断处理函数                     </em>/</div><div class="notion-text notion-block-bf54df381a774988bc3b14b0c3e1301c">/<em>参  数：无                                       </em>/</div><div class="notion-text notion-block-326364b8ba8549d0a55abbc7f0aab6db">/<em>返回值：无                                       </em>/</div><div class="notion-text notion-block-2e18f5a6840f45c1af3ac327ecc36c67">/<em>-------------------------------------------------</em>/</div><div class="notion-text notion-block-fd90c1b32bfd469c90e18b3563e06bad">void DMA1_Channel4_IRQHandler(void) //Uart1 Tx通道</div><div class="notion-text notion-block-8e385dca82dd463ebdc1bd0f59284934">{  </div><div class="notion-text notion-block-fb60ca4fc359463e97eed35b92739308">HAL_DMA_IRQHandler(&amp;uart1.dmaTx);</div><div class="notion-text notion-block-97f058a397ca4e28bcb8b2ff9b062f5a">}</div><div class="notion-text notion-block-be740765dc4840e9aa912d8fc39bc131">/<em>-------------------------------------------------</em>/</div><div class="notion-text notion-block-9f1d367dcd8141dd8defc718f13eb9e3">/<em>函数名：DMA通道5中断处理函数                     </em>/</div><div class="notion-text notion-block-8f026bee0b174566923165b50e7527fb">/<em>参  数：无                                       </em>/</div><div class="notion-text notion-block-752463d9fe784d518407043c342f8a1e">/<em>返回值：无                                       </em>/</div><div class="notion-text notion-block-a57bc83ed0d842229b8b279aa8c2dcd5">/<em>-------------------------------------------------</em>/</div><div class="notion-text notion-block-70dd9c3185d24cc9a0b911ba32775fad">void DMA1_Channel5_IRQHandler(void) //Uart1 Rx通道</div><div class="notion-text notion-block-c13e6c1d4c6f44b482a826669385dce7">{  </div><div class="notion-text notion-block-9bc0996491794b1aa8deaabad0aafa63">HAL_DMA_IRQHandler(&amp;uart1.dmaRx);</div><div class="notion-text notion-block-a959ab6ba4384c1c94bf6e471dc47f11">}</div><div class="notion-text notion-block-7a3c25be31874a3bb8a67a45b0d27d8b">/<em>-------------------------------------------------</em>/</div><div class="notion-text notion-block-a26089ca82674bac901a1779ff72e3c4">/<em>函数名：DMA通道7中断处理函数                     </em>/</div><div class="notion-text notion-block-ccb64b4fab114836ac13710296092280">/<em>参  数：无                                       </em>/</div><div class="notion-text notion-block-290584099fd64f67b269d2cee5040372">/<em>返回值：无                                       </em>/</div><div class="notion-text notion-block-97b1f15692c1498b985aa60a9539b3f7">/<em>-------------------------------------------------</em>/</div><div class="notion-text notion-block-95d2fc52799549a086d8d8ecd47c0ddb">void DMA1_Channel7_IRQHandler(void) //Uart2 Tx通道</div><div class="notion-text notion-block-a8e5b2f40c924739b20c69b3792c786c">{  </div><div class="notion-text notion-block-f7a646ca45d742b0bba43a7bb2a0feb9">HAL_DMA_IRQHandler(&amp;uart2.dmaTx);</div><div class="notion-text notion-block-ae5c4f7bce59485e8628e3a708232aa5">}</div><div class="notion-text notion-block-3168c3e95b8c45df8473c69ad866d226">/<em>-------------------------------------------------</em>/</div><div class="notion-text notion-block-907e2d2607f14cba99acc0d561bf31a9">/<em>函数名：DMA通道6中断处理函数                     </em>/</div><div class="notion-text notion-block-057849cfeca04e8785d5c82af79ab01d">/<em>参  数：无                                       </em>/</div><div class="notion-text notion-block-e270ca312dbc48bcbe2b084046134273">/<em>返回值：无                                       </em>/</div><div class="notion-text notion-block-c1391d4501734ed9aae6a71aa9015c6b">/<em>-------------------------------------------------</em>/</div><div class="notion-text notion-block-a2df25ce715a4b8781a0aa15847f285d">void DMA1_Channel6_IRQHandler(void) //Uart2 Rx通道</div><div class="notion-text notion-block-d1c238cd1e674904900cd89baf6fb62f">{  </div><div class="notion-text notion-block-0273934c731e489eaaf362bcfc5cd71b">HAL_DMA_IRQHandler(&amp;uart2.dmaRx);</div><div class="notion-text notion-block-1b2ce040e3e140af9ba72c502b111e95">}</div><div class="notion-text notion-block-b2f8adf2fcdb4d2e9aad11b57ca96c1c">/<em>-------------------------------------------------</em>/</div><div class="notion-text notion-block-63403bea75124136beeae4e6b460724a">/<em>函数名：DMA通道2中断处理函数                     </em>/</div><div class="notion-text notion-block-d151898260c9463bb108af828749402c">/<em>参  数：无                                       </em>/</div><div class="notion-text notion-block-1e297fcc0ffa4606aaad73f7ffac7eca">/<em>返回值：无                                       </em>/</div><div class="notion-text notion-block-ba35a390232d46f09f3f663bce47fd65">/<em>-------------------------------------------------</em>/</div><div class="notion-text notion-block-5693468114ce45609dfc4433af088172">void DMA1_Channel2_IRQHandler(void) //Uart3 Tx通道</div><div class="notion-text notion-block-5d490c883c114ad0a3a80a83f53d5ed6">{  </div><div class="notion-text notion-block-c18a07a33068479db90a52eae93c8fd9">HAL_DMA_IRQHandler(&amp;uart3.dmaTx);</div><div class="notion-text notion-block-f4682ceb6faa4b048f92c6141fae5f68">}</div><div class="notion-text notion-block-718faf9b3a9642b1915539ebb86fdf63">/<em>-------------------------------------------------</em>/</div><div class="notion-text notion-block-ee626dc859b34db182c8fd40a0956ad3">/<em>函数名：DMA通道3中断处理函数                     </em>/</div><div class="notion-text notion-block-13fafaacd2504ce1b045ff6f6747b4b6">/<em>参  数：无                                       </em>/</div><div class="notion-text notion-block-b1fcfae94a5f463fba0db5f7f116b42f">/<em>返回值：无                                       </em>/</div><div class="notion-text notion-block-0eda20d390ed4cfba2324db04e8a3f46">/<em>-------------------------------------------------</em>/</div><div class="notion-text notion-block-856614676040421dbc97ffcc47886056">void DMA1_Channel3_IRQHandler(void) //Uart3 Rx通道</div><div class="notion-text notion-block-76cb89dcac40400f82dab34e604ed432">{  </div><div class="notion-text notion-block-ea30c34ad30d4d16a3e7ba9bb2e35174">HAL_DMA_IRQHandler(&amp;uart3.dmaRx);</div><div class="notion-text notion-block-19c5800b4ca5465493b767e73a15b605">}</div><details class="notion-toggle notion-block-67ef1b818b3246218a38718832d7c8c7"><summary><h4 class="notion-h notion-h3 notion-block-67ef1b818b3246218a38718832d7c8c7" data-id="67ef1b818b3246218a38718832d7c8c7"><span><div id="67ef1b818b3246218a38718832d7c8c7" class="notion-header-anchor"></div><span class="notion-h-title">main.c</span></span></h4></summary><div><div class="notion-text notion-block-9639ff218a9c40ee9ac4ab4f8044a03d">#include &quot;stm32f1xx_hal.h&quot;</div><div class="notion-text notion-block-1dca598853e140cd826430c8666b950f">#include &quot;rcc.h&quot;</div><div class="notion-text notion-block-27c492d69a4e458db5211d223ad6d68b">#include &quot;led.h&quot;</div><div class="notion-text notion-block-37f9c86c7d204d9aa36489143b1bb8b8">#include &quot;sw.h&quot;</div><div class="notion-text notion-block-9bb36089e2bb4d8d801143f8689e91f7">#include &quot;uart.h&quot;</div><div class="notion-text notion-block-080348d8dc8b4e998d0ee611da88d8c6">int main(void){<div class="notion-text-children"><div class="notion-text notion-block-85c51647350d490d99e6b1a3b13f9779">HAL_Init();</div><div class="notion-text notion-block-88f4b1d188ec4f57b5501867bd2d0fb0">RccClock_Init();</div><div class="notion-text notion-block-65eb790986804842b4b19df1ad45910a">U1_Init(921600);</div><div class="notion-text notion-block-e62d09ab74a2477a88c17ac17102af9d">U2_Init(921600);</div><div class="notion-text notion-block-7de7c1261f79473a999ccd37b579db22">U3_Init(921600);</div><div class="notion-text notion-block-d36ec9189e3b412cb9d455cbdadd4b5e">while(1){<div class="notion-text-children"><div class="notion-text notion-block-255c31044d574c1994f5c78e25d94bb0">/<em> ------------------UART1------------------ </em>/</div><div class="notion-text notion-block-5a5385b0c58b4bfda0f4eb8b67c954e3">/<em> 判断接收缓冲区是否有数据 </em>/</div><div class="notion-text notion-block-6a01b1b10fd643398757c1e45a6895b1">if(uart1.rxInPtr != uart1.rxOutPtr){<div class="notion-text-children"><div class="notion-text notion-block-1badf74e57e44c99a07ff5e8940f6519">U1_DataRxToTx(uart1.rxOutPtr-&gt;start, (uart1.rxOutPtr-&gt;end - uart1.rxOutPtr-&gt;start + 1));</div><div class="notion-text notion-block-773e5efee4444fd788da9cdd316cbd84">uart1.rxOutPtr++;</div><div class="notion-text notion-block-9c8a206dbf6f4921bed512a0f296fe71">if(uart1.rxOutPtr == uart1.rxEndPtr){<div class="notion-text-children"><div class="notion-text notion-block-676890704745471b92d913da265a1a5e">uart1.rxOutPtr = &amp;uart1.rxLocation[0];</div></div></div><div class="notion-text notion-block-2d8e1dd702a44f3d94e26a63e091916b">}</div></div></div><div class="notion-text notion-block-378bea527bf64d528611063513d5274d">}</div><div class="notion-text notion-block-ee785c9689104e5d937c171aa379f01f">/<em> 判断发送缓冲区是否有数据 </em>/</div><div class="notion-text notion-block-5d5e4952541544048827366f1826a509">if((uart1.txInPtr != uart1.txOutPtr) &amp;&amp; (uart1.TxState == 0) ){<div class="notion-text-children"><div class="notion-text notion-block-99b7e9854d244fda8956fb47410b6175">uart1.TxState = 1;</div><div class="notion-text notion-block-e366904e41204491a1225ee43b0adf1f">HAL_UART_Transmit_DMA(&amp;uart1.uart, uart1. txOutPtr-&gt;start, (uart1.txOutPtr-&gt;end - uart1.txOutPtr-&gt;start + 1));</div><div class="notion-text notion-block-4bcbdac6f67e48e8928d710e7cbd56e4">uart1.txOutPtr++;</div><div class="notion-text notion-block-d6f766b834b443c484d3a7af32bc91ec">if(uart1.txOutPtr == uart1.txEndPtr){<div class="notion-text-children"><div class="notion-text notion-block-9a4ee3c10aac407eb0a750526c176014">uart1.txOutPtr = &amp;uart1.txLocation[0];</div></div></div><div class="notion-text notion-block-d0687c059e9c407fb9b4552c06a9bf14">}</div></div></div><div class="notion-text notion-block-86ca8a49b48e4060b35a3c01b582559f">}</div><div class="notion-text notion-block-028d08c93ae04fd1a69f6ab09f8aca60">/<em> ------------------UART2------------------ </em>/</div><div class="notion-text notion-block-1e7b4e1974e44590a418f0565ac8e278">if(uart2.rxInPtr != uart2.rxOutPtr){<div class="notion-text-children"><div class="notion-text notion-block-72f5f781049f47e7a1bfda1d1f03a25e">U2_DataRxToTx(uart2.rxOutPtr-&gt;start, (uart2.rxOutPtr-&gt;end - uart2.rxOutPtr-&gt;start + 1));</div><div class="notion-text notion-block-146b4dd7b0154626b6598bd6f12a165a">uart2.rxOutPtr++;</div><div class="notion-text notion-block-35a49a9d9f8a4b60b2987f8a9391600e">if(uart2.rxOutPtr == uart2.rxEndPtr){<div class="notion-text-children"><div class="notion-text notion-block-9d7f6ff616d64de8921fb5a30b3e743b">uart2.rxOutPtr = &amp;uart2.rxLocation[0];</div></div></div><div class="notion-text notion-block-af221d4edec147d487caf5a9249210d3">}</div></div></div><div class="notion-text notion-block-b2d70892a4cc483ebc88f285d9519ca7">}</div><div class="notion-text notion-block-e94759f5314243f08a652f5a8528276b">/<em> 判断发送缓冲区是否有数据 </em>/</div><div class="notion-text notion-block-4f8b057102bf4329903afec7eadcf7e9">if((uart2.txInPtr != uart2.txOutPtr) &amp;&amp; (uart2.TxState == 0) ){<div class="notion-text-children"><div class="notion-text notion-block-577e1b5661b149dd99603d75aba8afca">uart2.TxState = 1;</div><div class="notion-text notion-block-eaa4bbda8ae340df9b8d5eedeac91be6">HAL_UART_Transmit_DMA(&amp;uart2.uart, uart2. txOutPtr-&gt;start, (uart2.txOutPtr-&gt;end - uart2.txOutPtr-&gt;start + 1));</div><div class="notion-text notion-block-0e7e961f70c149898afb3ac3061c86e8">uart2.txOutPtr++;</div><div class="notion-text notion-block-bb25ff3157a04da78bbfae77c0be37a4">if(uart2.txOutPtr == uart2.txEndPtr){<div class="notion-text-children"><div class="notion-text notion-block-d82ecefe64cc42a6bb353b66347376ea">uart2.txOutPtr = &amp;uart2.txLocation[0];</div></div></div><div class="notion-text notion-block-13ceeb35f1f64066b3094b1cc4596aab">}</div></div></div><div class="notion-text notion-block-79dfdfb0b0664358855e678c90d9c539">}</div><div class="notion-text notion-block-8070fc872e784b5391afe14eed2171c8">/<em> ------------------UART3------------------ </em>/</div><div class="notion-text notion-block-87bf19cdf21c49ca83300ec756ca11ab">if(uart3.rxInPtr != uart3.rxOutPtr){<div class="notion-text-children"><div class="notion-text notion-block-8fd2abcf3e284487a6de2d82c00a3cb1">U3_DataRxToTx(uart3.rxOutPtr-&gt;start, (uart3.rxOutPtr-&gt;end - uart3.rxOutPtr-&gt;start + 1));</div><div class="notion-text notion-block-b4b5053b4e274d95a4a7d6e3ecbd9d1d">uart3.rxOutPtr++;</div><div class="notion-text notion-block-90afa0b1725e41cd9e801a79935cf4fd">if(uart3.rxOutPtr == uart3.rxEndPtr){<div class="notion-text-children"><div class="notion-text notion-block-94f83e090eca4756bd1128510093d5f5">uart3.rxOutPtr = &amp;uart3.rxLocation[0];</div></div></div><div class="notion-text notion-block-c45c5f5d584842739e1e89b0c2452e4a">}</div></div></div><div class="notion-text notion-block-b32686f7e7f44fe2ac24971c8265ffda">}</div><div class="notion-text notion-block-6212a67c9a034a6bbcc7e454136fa750">/<em> 判断发送缓冲区是否有数据 </em>/</div><div class="notion-text notion-block-50f1e3e3d2d543b5931633834e7495da">if((uart3.txInPtr != uart3.txOutPtr) &amp;&amp; (uart3.TxState == 0) ){<div class="notion-text-children"><div class="notion-text notion-block-df312de253e2488586dd3a007edb4c8f">uart3.TxState = 1;</div><div class="notion-text notion-block-0d7a0f7f31204e0e892c6b91c678312e">HAL_UART_Transmit_DMA(&amp;uart3.uart, uart3. txOutPtr-&gt;start, (uart3.txOutPtr-&gt;end - uart3.txOutPtr-&gt;start + 1));</div><div class="notion-text notion-block-8eadaba17ad440869c366025da4b0dd4">uart3.txOutPtr++;</div><div class="notion-text notion-block-55f7bd51eef74a4b9a506fc7dbcabfe6">if(uart3.txOutPtr == uart3.txEndPtr){<div class="notion-text-children"><div class="notion-text notion-block-c47c9811f04f45edb6cb91f60b97735c">uart3.txOutPtr = &amp;uart3.txLocation[0];</div></div></div><div class="notion-text notion-block-848abaeba0444f3791c5a9fbcb6ce29a">}</div></div></div><div class="notion-text notion-block-a1514f08c7e141ed93e3b1a2afd6fe06">}</div></div></div><div class="notion-text notion-block-6c677ceabd474324b72f1f8674a3afbb">}</div></div></div><div class="notion-text notion-block-f017d7b848f84d5e808310230b1b20ac">}<div class="notion-text-children"><div class="notion-blank notion-block-b89a78e8850946c9826f462fede6ae14"> </div><div class="notion-blank notion-block-f95ec74d2c6b4efeb45c6e3943c281a3"> </div></div></div></div></details></div></details></div></details><details class="notion-toggle notion-block-8c2a8f093cf142069eed0baa7084afbb"><summary><h3 class="notion-h notion-h2 notion-h-indent-1 notion-block-8c2a8f093cf142069eed0baa7084afbb" data-id="8c2a8f093cf142069eed0baa7084afbb"><span><div id="8c2a8f093cf142069eed0baa7084afbb" class="notion-header-anchor"></div><span class="notion-h-title">九、HAL库：双机通信，DMA方式收发 控制对方LED灯</span></span></h3></summary><div><div class="notion-text notion-block-46d7eadca7974913a9b676349e38ad1f">在上面的基础上进行修改</div><details class="notion-toggle notion-block-ab5d29faf14c4f9bbdfe1ff5118ac6f4"><summary><h4 class="notion-h notion-h3 notion-block-ab5d29faf14c4f9bbdfe1ff5118ac6f4" data-id="ab5d29faf14c4f9bbdfe1ff5118ac6f4"><span><div id="ab5d29faf14c4f9bbdfe1ff5118ac6f4" class="notion-header-anchor"></div><span class="notion-h-title">1. 大概思路</span></span></h4></summary><div></div></details><div class="notion-text notion-block-2111a018236d467483b02f78874477ea">在本机 按键按下时，进入中断。在中断回调中使用UART1 发送数据LED_ON或LED_OFF</div><div class="notion-text notion-block-0f5609ec93ce49e8b5c7134d1b557157">在UART1接收到数据时，进行判断，使用strcmp函数</div><div class="notion-text notion-block-d567ec9fed214921a1f577402c695c51">插线的话，两个设备 TX对RX  RX对TX， GND对GND就Ok了</div></div></details><div class="notion-blank notion-block-c1f34c7214154e5c81be586ee2f2ce46"> </div><details class="notion-toggle notion-block-631248e6ba1b48c68aba31966fe60fc9"><summary><h3 class="notion-h notion-h2 notion-h-indent-1 notion-block-631248e6ba1b48c68aba31966fe60fc9" data-id="631248e6ba1b48c68aba31966fe60fc9"><span><div id="631248e6ba1b48c68aba31966fe60fc9" class="notion-header-anchor"></div><span class="notion-h-title">十、HAL库：单线半双工，双机通信，DMA方式收发 控制对方LED灯</span></span></h3></summary><div><div class="notion-text notion-block-29d1c6dda67b4b44bbd5baceeb6819a3">在上面的基础上进行修改</div><details class="notion-toggle notion-block-96517ba9832d4bef99fa5f1d00574a27"><summary><h4 class="notion-h notion-h3 notion-block-96517ba9832d4bef99fa5f1d00574a27" data-id="96517ba9832d4bef99fa5f1d00574a27"><span><div id="96517ba9832d4bef99fa5f1d00574a27" class="notion-header-anchor"></div><span class="notion-h-title">1. 单线半双工简介</span></span></h4></summary><div><div class="notion-text notion-block-9fd85735fb214e8c892492f9d6983468">两个单片机之间通过串口，<b>单线半双工通信。</b></div><div class="notion-text notion-block-9e36f6a321f64249b4feb0099aa3c55e"><b>半双工：</b>同一时间只能发送或者接收，<b>此时仅使用TX引脚</b></div><div class="notion-text notion-block-aace374fdcf0447285e2fdcd171c7e11">注意：<b>此时TX引脚需要配置为OD模式，外接上拉电阻</b></div></div></details><details class="notion-toggle notion-block-dd46b33d17394db4928b4cd8be497068"><summary><h4 class="notion-h notion-h3 notion-block-dd46b33d17394db4928b4cd8be497068" data-id="dd46b33d17394db4928b4cd8be497068"><span><div id="dd46b33d17394db4928b4cd8be497068" class="notion-header-anchor"></div><span class="notion-h-title">2. 大概思路</span></span></h4></summary><div><div class="notion-text notion-block-6aabf08261954459993b69c259470816">在本机 按键按下时，进入中断。在中断回调中使用UART1 发送数据LED_ON或LED_OFF</div><div class="notion-text notion-block-d5d784020a8348a689938576b963e517">在UART1接收到数据时，进行判断，使用strcmp函数</div></div></details><div class="notion-text notion-block-c4aea3503c78402e85dbfd025fb99c19">插线的话，两个设备 TX对RX  RX对TX， GND对GND就Ok了</div><details class="notion-toggle notion-block-913d2b449e9a44a3b80a10ef4714a801"><summary><h4 class="notion-h notion-h3 notion-block-913d2b449e9a44a3b80a10ef4714a801" data-id="913d2b449e9a44a3b80a10ef4714a801"><span><div id="913d2b449e9a44a3b80a10ef4714a801" class="notion-header-anchor"></div><span class="notion-h-title">3. 注意</span></span></h4></summary><div><ul class="notion-list notion-list-disc notion-block-ef8d8288464744abbf5143638c09357c"><li>在初始化时，要使用<code class="notion-inline-code">HAL_HalfDuplex_Init</code> 来初始化</li></ul><ul class="notion-list notion-list-disc notion-block-4b0818f479234d8fbd6f50a48c98e67d"><li>单线半双工用的是串口的Tx引脚， 注意Tx引脚要初始化为<b>AF_OD 模式，</b>并且接<b>上拉电阻</b></li></ul><ul class="notion-list notion-list-disc notion-block-6ab81407f9ee49299267643b1ad8d817"><li>一般在初始化的时候，<b>默认为单线半双工的接收状态</b>，只有在使用发送的时候，才使用<code class="notion-inline-code">HAL_HalfDuplex_EnableTransmitter(&amp;uart1.uart);</code>来使能单线半双工的发射模式。并且在发送完成之后，（一般使用发送完成回调）把发射模式重置为默认的接收模式。<code class="notion-inline-code">HAL_HalfDuplex_EnableReceiver(&amp;uart1.uart);</code></li></ul></div></details></div></details><details class="notion-toggle notion-block-8846b6ab52af463ebe8797053171c33e"><summary><h3 class="notion-h notion-h2 notion-h-indent-1 notion-block-8846b6ab52af463ebe8797053171c33e" data-id="8846b6ab52af463ebe8797053171c33e"><span><div id="8846b6ab52af463ebe8797053171c33e" class="notion-header-anchor"></div><span class="notion-h-title">十一、HAL库：多主机通信 地址检测唤醒 定时器超时 DMA不定长接收</span></span></h3></summary><div><details class="notion-toggle notion-block-c60c4571a2db4168b906ec9b13a3acd3"><summary><h4 class="notion-h notion-h3 notion-block-c60c4571a2db4168b906ec9b13a3acd3" data-id="c60c4571a2db4168b906ec9b13a3acd3"><span><div id="c60c4571a2db4168b906ec9b13a3acd3" class="notion-header-anchor"></div><span class="notion-h-title">1.  设备唤醒介绍</span></span></h4></summary><div><details class="notion-toggle notion-block-10efbdae38cb495295bf31f7396399ab"><summary><h4 class="notion-h notion-h3 notion-block-10efbdae38cb495295bf31f7396399ab" data-id="10efbdae38cb495295bf31f7396399ab"><span><div id="10efbdae38cb495295bf31f7396399ab" class="notion-header-anchor"></div><span class="notion-h-title"><b>1.1 唤醒方式：</b></span></span></h4></summary><div><ul class="notion-list notion-list-disc notion-block-86992fb533aa4ba1a550455091bef1b4"><li>三个及以上单片机之间通过串口，相互通信收发数据时。</li></ul><ul class="notion-list notion-list-disc notion-block-653e97a71ff0477ab9b1168ddf5a0123"><li>此时我们需要涉及到主机和从机之分，从机的唤醒有分为：<b>地址</b> or <b>空闲唤醒</b></li></ul></div></details><details class="notion-toggle notion-block-99307c1b35234c88abb26afbc420deac"><summary><h4 class="notion-h notion-h3 notion-block-99307c1b35234c88abb26afbc420deac" data-id="99307c1b35234c88abb26afbc420deac"><span><div id="99307c1b35234c88abb26afbc420deac" class="notion-header-anchor"></div><span class="notion-h-title"><b>1.2 地址唤醒：</b></span></span></h4></summary><div><ul class="notion-list notion-list-disc notion-block-f9b9ed3976d54438ac4ad0af58f7d5ee"><li>每个从机会具备一个硬件的从机地址， 地址会记录在<b>USART_CR2寄存器的ADD</b>，占用了4个二进制位。范围0x00~0x0F</li></ul><ul class="notion-list notion-list-disc notion-block-d3b60d6eba624a0387abf2d9c17a3e08"><li>但是主机在发送时，需要区分地址 还是数据：如果最高位为1，表示地址，为0表示数据。 所以主机发送的数据，首个字节是从机的地址，范围应该是0x80~0x8F， 8表示最高位7为1。     所以在发送数据时，最高位为  0   数据的有效位为 bit0~bit6    7位数据</li></ul></div></details><details class="notion-toggle notion-block-f11e82d310c34c1fbd51f4bcbb2a336c"><summary><h4 class="notion-h notion-h3 notion-block-f11e82d310c34c1fbd51f4bcbb2a336c" data-id="f11e82d310c34c1fbd51f4bcbb2a336c"><span><div id="f11e82d310c34c1fbd51f4bcbb2a336c" class="notion-header-anchor"></div><span class="notion-h-title"><b>1.3 多处理器通信：</b></span></span></h4></summary><div><div class="notion-text notion-block-d2cc8179a71f477d8a450a4545995dee">与I2C类似,主机Tx为PP模式</div><ul class="notion-list notion-list-disc notion-block-e5b59d2e6fa2451689c6eec24505929d"><li>主机的tx，接到各个从设备的Rx引脚。  从机的tx输出逻辑 地与（线与）在一起，</li></ul><ul class="notion-list notion-list-disc notion-block-9a69e547ed6a4f2ca544b3e2fed75466"><li><b>注意：</b></li><ul class="notion-list notion-list-disc notion-block-9a69e547ed6a4f2ca544b3e2fed75466"><li>从机的Tx不能为PP模式，否则两个从机输出1 、0会形成短路。</li><li>从机的Tx‘应该为OD模式，外接上拉电阻。</li><li>并且上<b>拉电阻尽量选择外部上拉电阻</b>，否则选择内部上拉，在波特率比较高的时候，电压上拉速度慢，导致检测为0等情况。</li></ul></ul><ul class="notion-list notion-list-disc notion-block-9990876f11b94c98af2fd62e3be5085b"><li>USART_CR1寄存器的RWU位</li><ul class="notion-list notion-list-disc notion-block-9990876f11b94c98af2fd62e3be5085b"><li>RWU可以被硬件自动控制或在某个条件先由软件写入</li><li>RWU高电平表示从机为静默模式，不会接收数据</li><li>RWU低电平表示从机为正常模式，会接收数据</li><li>从机通过<b>判断地址，</b>来<b>切换到正常模式</b>，</li><li><b>未匹配的地址</b>可以把正常模式的从机<b>返回为静默模式，</b>也可以手动返回为静默模式，</li><li><b>在初始化从机之后 需要手动把RWU变为高电平：静默模式</b></li></ul></ul></div></details></div></details><details class="notion-toggle notion-block-02c788348cea49ffacf9de905c13c18f"><summary><h4 class="notion-h notion-h3 notion-block-02c788348cea49ffacf9de905c13c18f" data-id="02c788348cea49ffacf9de905c13c18f"><span><div id="02c788348cea49ffacf9de905c13c18f" class="notion-header-anchor"></div><span class="notion-h-title"><b>2. 特别注意：</b></span></span></h4></summary><div><ol start="1" class="notion-list notion-list-numbered notion-block-f5b8f1a7e30a4fd58327fe06f16a980a" style="list-style-type:decimal"><li><b>DMA在搬运UART的的数据时，会顺便把RXNE的标志位硬件清除。</b>所以在开启DMA接收时，RXNE在软件上检测不到标志位为1</li></ol><ol start="2" class="notion-list notion-list-numbered notion-block-6e79d07924004eb7923b52cad93da3fb" style="list-style-type:decimal"><li>多处理器有空闲总线唤醒机制，<b>只要用了多处理器的模式，那么空闲中断就不会产生了</b></li><ol class="notion-list notion-list-numbered notion-block-6e79d07924004eb7923b52cad93da3fb" style="list-style-type:lower-alpha"><div class="notion-text notion-block-3d899cfafcb7463c8b68012446db9f27">就不能使用空闲中断来进行数据的不定长接收，可以换一种方式：使用定时器的超时判断，来进行数据的不定长接收。</div></ol></ol><details class="notion-toggle notion-block-42a204fbfbdf4f92b6d04935043a0854"><summary><h4 class="notion-h notion-h3 notion-block-42a204fbfbdf4f92b6d04935043a0854" data-id="42a204fbfbdf4f92b6d04935043a0854"><span><div id="42a204fbfbdf4f92b6d04935043a0854" class="notion-header-anchor"></div><span class="notion-h-title">2.1 使用定时器的超时判断，来进行数据的不定长接收思路详解</span></span></h4></summary><div><div class="notion-text notion-block-f08d0c684f4a40608204060541bf040d">假设波特率为9600 ，那么一秒钟最快能发送960个字节，也就是1ms多点。也就是在一个连续的数据流中，每个字节的传输间隔为1ms。</div><div class="notion-text notion-block-1a5ec1bfd8724354a59fbd79540639c5">现在开一个定时器，定时时间为大于1ms的值，比如 15 ms。</div><div class="notion-text notion-block-f03a176738aa405eb2f4b4d47816e04d">在每次接收一个字节之后，都清空定时器的计数值。 当定时器超时时，就代表当前一次的数据已经传输完毕。</div><div class="notion-text notion-block-bf5a16ab831741d5955bcf3379735c8a"><b>优点：利用空闲中断时，如果数据发生波动，那么会把一个数据分成两次数据。 而定时器不会，定时器时通过时间判断。</b>
初始化定时器 用于超时计时<code class="notion-inline-code">TIM4_TimerInit(300,7200);  </code> 30ms超时时间</div><div class="notion-text notion-block-c35627369597470a8df8b18f0dd82b2f">需要 打开接收中断 <code class="notion-inline-code">__HAL_UART_ENABLE_IT(&amp;uart2.uart,UART_IT_RXNE);</code></div><div class="notion-text notion-block-d112079a65c5408f93ce7d61c5bf9bb6">判断接收标志位<code class="notion-inline-code"> if(__HAL_UART_GET_FLAG(&amp;uart1.uart, UART_FLAG_RXNE)){</code></div><div class="notion-text notion-block-0f677e504eac4c9090369216608c5af5"><b>文件部分</b></div><ul class="notion-list notion-list-disc notion-block-a3f1ef6f1f484747a241c0c88be05f29"><li>需要修改hal_uart.c（虽然不建议，但是只能这样了）</li></ul><ul class="notion-list notion-list-disc notion-block-823d5bf32dc2422ca7859915b0ab67da"><li>关闭了RXNE中断和发生空闲中断，让每次接收字节后都进入自己的函数中<b>stm32f1xx_hal_uart.c</b></li></ul></div></details></div></details><div class="notion-text notion-block-213f1f3cccb84ee6a1956ee1c137f896">uint32_t cr1its     = READ_REG(huart-&gt;Instance-&gt;CR1);</div><div class="notion-text notion-block-6662f5906e3a455583d5ca8323f364ae">uint32_t cr3its     = READ_REG(huart-&gt;Instance-&gt;CR3);</div><div class="notion-text notion-block-f9923e5dfb2541a6b3937de03ffde11a">uint32_t errorflags = 0x00U;</div><div class="notion-text notion-block-48a2dff264934e0f9756ff655e58ee21">uint32_t dmarequest = 0x00U;</div><div class="notion-text notion-block-e179885e5cf7485a81337073c6da473b">/<em> If no error occurs </em>/</div><div class="notion-text notion-block-ae336c544a4f4190b61d57154b6e6402">errorflags = (isrflags &amp; (uint32_t)(USART_SR_PE | USART_SR_FE | USART_SR_ORE | USART_SR_NE));<div class="notion-text-children"><div class="notion-text notion-block-1060eaae5ca04baaaa457a4c7e9fa820">//删除  RXNE中断</div></div></div><div class="notion-text notion-block-7866668a9cd34b7987231d493451c543">//if (errorflags == RESET)</div><div class="notion-text notion-block-c7b390364dbc4d3c9b2812b92ee2d0bd">//{</div><div class="notion-text notion-block-8e4dea4fb5aa415cb0af321e774bef43">//  /<em> UART in mode Receiver -------------------------------------------------</em>/</div><div class="notion-text notion-block-09f399bab42a4880b3e37eb8ba45b8b3">//  if (((isrflags &amp; USART_SR_RXNE) != RESET) &amp;&amp; ((cr1its &amp; USART_CR1_RXNEIE) != RESET))</div><div class="notion-text notion-block-aca9efffbda24758b9ded14456ca2664">//  {</div><div class="notion-text notion-block-9ef426c3d89b4d0f815d546b2fdc7e90">//    UART_Receive_IT(huart);</div><div class="notion-text notion-block-be2edd944bb846ff8c0c450e7f4a6f5b">//    return;</div><div class="notion-text notion-block-0d0f7fb6d180467087e3fff2ea285f38">//  }</div><div class="notion-text notion-block-69541ecf5f0b4f74a1a94dca741d4ba8">//}</div><div class="notion-text notion-block-cbd5347633ae47ec8d81ba0a2df4a719">/<em> If some errors occur </em>/</div><div class="notion-text notion-block-2d1e749b33e54c3a9938be79a6822ee7">if ((errorflags != RESET) &amp;&amp; (((cr3its &amp; USART_CR3_EIE) != RESET) || ((cr1its &amp; (USART_CR1_RXNEIE | USART_CR1_PEIE)) != RESET)))</div><div class="notion-text notion-block-531acba185304c1688de47fa4fb1b0ab">{<div class="notion-text-children"><div class="notion-text notion-block-d962d96a200f4dfe9edc5010cb5f5644">/<em> UART parity error interrupt occurred ----------------------------------</em>/</div><div class="notion-text notion-block-8f559558d445433a88fc9337ca46b23f">if (((isrflags &amp; USART_SR_PE) != RESET) &amp;&amp; ((cr1its &amp; USART_CR1_PEIE) != RESET))</div><div class="notion-text notion-block-c9609fe1046140ffbab5edfcabd6d543">{<div class="notion-text-children"><div class="notion-text notion-block-062eac49af7b494585845052d0b1ed9f">huart-&gt;ErrorCode |= HAL_UART_ERROR_PE;</div></div></div><div class="notion-text notion-block-0f84cc315ef34958ab5da69be94cc669">}</div><div class="notion-text notion-block-3de66512af0846d4af77fee89c72a9d3">/<em> UART noise error interrupt occurred -----------------------------------</em>/</div><div class="notion-text notion-block-b7267c1ec6324c199ae4d988c349692c">if (((isrflags &amp; USART_SR_NE) != RESET) &amp;&amp; ((cr3its &amp; USART_CR3_EIE) != RESET))</div><div class="notion-text notion-block-2e24bd8e8c414900b0adb7fbbca7e32c">{<div class="notion-text-children"><div class="notion-text notion-block-c5ff39f1d8bd4fb098a87fa4cd64e81c">huart-&gt;ErrorCode |= HAL_UART_ERROR_NE;</div></div></div><div class="notion-text notion-block-8921ca3703c34edebccd6076f2666200">}</div><div class="notion-text notion-block-e34b2ef2a1274d52bd6437b4db9ab971">/<em> UART frame error interrupt occurred -----------------------------------</em>/</div><div class="notion-text notion-block-17bcd8c7e855411aabe4c6952c4d4b1e">if (((isrflags &amp; USART_SR_FE) != RESET) &amp;&amp; ((cr3its &amp; USART_CR3_EIE) != RESET))</div><div class="notion-text notion-block-81f307ead28c4a9f85d91b4525314112">{<div class="notion-text-children"><div class="notion-text notion-block-6f8758c97105407798f619ae01a9034a">huart-&gt;ErrorCode |= HAL_UART_ERROR_FE;</div></div></div><div class="notion-text notion-block-39031b10619f4c28a9448aab8052f269">}</div><div class="notion-text notion-block-46fd4f17be504a99bd9691ebabe7037c">/<em> UART Over-Run interrupt occurred --------------------------------------</em>/</div><div class="notion-text notion-block-91144147a9784e209110331e96c4097c">if (((isrflags &amp; USART_SR_ORE) != RESET) &amp;&amp; ((cr3its &amp; USART_CR3_EIE) != RESET))</div><div class="notion-text notion-block-9cbe456b63c5420fbec55720c76a6adc">{<div class="notion-text-children"><div class="notion-text notion-block-a1813ca887b64be99a13b34b8f9b1e85">huart-&gt;ErrorCode |= HAL_UART_ERROR_ORE;</div></div></div><div class="notion-text notion-block-365427db2166473e946168d4912d1c05">}</div><div class="notion-text notion-block-7245aca12f404fd3a1658adf39f04e6f">/<em> Call UART Error Call back function if need be --------------------------</em>/</div><div class="notion-text notion-block-ebdab06075474f5d9ab92baaffb7ceec">if (huart-&gt;ErrorCode != HAL_UART_ERROR_NONE)</div><div class="notion-text notion-block-900aaffee2344f4081609f361243db3d">{<div class="notion-text-children"><div class="notion-text notion-block-b678dae4abc54739bcf55d6c33eaf8e6">/<em> UART in mode Receiver -----------------------------------------------</em>/</div><div class="notion-text notion-block-125101a861e341cf9cfd8d53561f5048">if (((isrflags &amp; USART_SR_RXNE) != RESET) &amp;&amp; ((cr1its &amp; USART_CR1_RXNEIE) != RESET))</div><div class="notion-text notion-block-174d2368c4d14d08b658a4675e82357b">{<div class="notion-text-children"><div class="notion-text notion-block-401f54d2058c4ceca2f41885c39c1d1c">UART_Receive_IT(huart);</div></div></div><div class="notion-text notion-block-cfe06721a8a74d12a16942ad0f57fcbf">}</div><div class="notion-text notion-block-d2f0cc163ae543ef9c377eedae46f6ea">/* If Overrun error occurs, or if any error occurs in DMA mode reception,<div class="notion-text-children"><div class="notion-text notion-block-f64f3d2ba2af426c8ea71f6290d17b1e">consider error as blocking */</div></div></div><div class="notion-text notion-block-daf268bafbee4f9fa7a0df0d1fce4242">dmarequest = HAL_IS_BIT_SET(huart-&gt;Instance-&gt;CR3, USART_CR3_DMAR);</div><div class="notion-text notion-block-6d259ac499564781b5f2c72ffa520af6">if (((huart-&gt;ErrorCode &amp; HAL_UART_ERROR_ORE) != RESET) || dmarequest)</div><div class="notion-text notion-block-64d4f709a5c1402491a0b81f88d79592">{<div class="notion-text-children"><div class="notion-text notion-block-1d95adf71b1a4e06a30ef108b837b2d4">/* Blocking error : transfer is aborted<div class="notion-text-children"><div class="notion-text notion-block-d6428a5158594c42b59dd51f4a3de6c0">Set the UART state ready to be able to start again the process,</div><div class="notion-text notion-block-c925d9d4c1ab4f789b4f9d540db29ff1">Disable Rx Interrupts, and disable Rx DMA request, if ongoing */</div></div></div><div class="notion-text notion-block-da12bd2cb6ca47a499af6499c4e7728f">UART_EndRxTransfer(huart);</div><div class="notion-text notion-block-984b8e7b31d54b30b23f3a6cf4480a84">/<em> Disable the UART DMA Rx request if enabled </em>/</div><div class="notion-text notion-block-1097353ddd3745a5928932660b3b2076">if (HAL_IS_BIT_SET(huart-&gt;Instance-&gt;CR3, USART_CR3_DMAR))</div><div class="notion-text notion-block-f1b979ebab0042128a2012805641ced2">{<div class="notion-text-children"><div class="notion-text notion-block-ed62913f849048ae9a09e4a4a2772dcd">CLEAR_BIT(huart-&gt;Instance-&gt;CR3, USART_CR3_DMAR);</div><div class="notion-text notion-block-f00767993c10433694f5e969a9d461bd">/<em> Abort the UART DMA Rx channel </em>/</div><div class="notion-text notion-block-e07598af0eb54204bd9fd500fd3e2547">if (huart-&gt;hdmarx != NULL)</div><div class="notion-text notion-block-632d70cafbdb475abc186c4a53f2e512">{<div class="notion-text-children"><div class="notion-text notion-block-d34961e8a672455da030627d024d19ad">/* Set the UART DMA Abort callback :<div class="notion-text-children"><div class="notion-text notion-block-ec2f549d8290437da27604e35e2332ec">will lead to call HAL_UART_ErrorCallback() at end of DMA abort procedure */</div></div></div><div class="notion-text notion-block-0f385a3ee1a24ea2818a35c94b301d9f">huart-&gt;hdmarx-&gt;XferAbortCallback = UART_DMAAbortOnError;</div><div class="notion-text notion-block-b2efc883781c45df8670a297e2309d30">if (HAL_DMA_Abort_IT(huart-&gt;hdmarx) != HAL_OK)</div><div class="notion-text notion-block-0c126f257015488e8976481b8e234a9c">{<div class="notion-text-children"><div class="notion-text notion-block-1e28717b73fd480e90f505ac88cbc33f">/<em> Call Directly XferAbortCallback function in case of error </em>/</div><div class="notion-text notion-block-a15a1f9b42bf4822b2750affafac257a">huart-&gt;hdmarx-&gt;XferAbortCallback(huart-&gt;hdmarx);</div></div></div><div class="notion-text notion-block-aabe2914594844718fd6e6b8b0188512">}</div></div></div><div class="notion-text notion-block-515a7e54c6a24bb589582dff5f4fac46">}</div><div class="notion-text notion-block-29bf263ffc16498eb5fdce8c26bbecb6">else</div><div class="notion-text notion-block-94e6565ac2454a6cba134893bc497eab">{<div class="notion-text-children"><div class="notion-text notion-block-427d90aec8c4462ebdee15c4a08cb82c">/<em> Call user error callback </em>/</div><div class="notion-text notion-block-a7c6ca8d6aaa4d89a7db098a8fccc990">#if (USE_HAL_UART_REGISTER_CALLBACKS == 1)</div></div></div></div></div></div></div></div></div></div></div><div class="notion-text notion-block-f95508d576534236a8342d5fbf699b58">/<em>Call registered error callback</em>/</div><div class="notion-text notion-block-4518a8c59b164015825087a196992879">huart-&gt;ErrorCallback(huart);<div class="notion-text-children"><div class="notion-text notion-block-052bbc5498c148a4b243a44707e233ef">#else</div></div></div><div class="notion-text notion-block-abb77390e26d4518a897c258b850ff17">/<em>Call legacy weak error callback</em>/</div><div class="notion-text notion-block-d8cabfb9ba294becba6c45d418d617f2">HAL_UART_ErrorCallback(huart);<div class="notion-text-children"><div class="notion-text notion-block-7de02cee987440a4ae98f8023f5d4481">#endif /<em> USE_HAL_UART_REGISTER_CALLBACKS </em>/</div></div></div><div class="notion-text notion-block-fc35ea2d11874c15bb2b76e865a477eb">}</div><div class="notion-text notion-block-8a3cfd262a3e419c970b3cbf4f59e62a">}</div><div class="notion-text notion-block-f92a405d811544a6b8293fe91d2abe5f">else</div><div class="notion-text notion-block-41bd5ee967d24a9aa30cf56c8159d8dc">{<div class="notion-text-children"><div class="notion-text notion-block-63317614e759421591d236b3b00ffc41">/<em> Call user error callback </em>/<div class="notion-text-children"><div class="notion-text notion-block-07645ec8378d412a8f2a5bdfc4d43a50">#if (USE_HAL_UART_REGISTER_CALLBACKS == 1)</div></div></div></div></div><div class="notion-text notion-block-e4d1cb18ab6d4b99a179813396c3bafe">/<em>Call registered error callback</em>/</div><div class="notion-text notion-block-6e3753839f03443eae7cbdd596c2b179">huart-&gt;ErrorCallback(huart);<div class="notion-text-children"><div class="notion-text notion-block-240c9f9403f141b88326ef2ea9b47eb2">#else</div></div></div><div class="notion-text notion-block-3f5575e1d539436a9ca24b09fc65b3ff">/<em>Call legacy weak error callback</em>/</div><div class="notion-text notion-block-2911e319efd64b3eb507e303739126b1">HAL_UART_ErrorCallback(huart);<div class="notion-text-children"><div class="notion-text notion-block-f16cd2f832854052b19cc3d966e7dd97">#endif /<em> USE_HAL_UART_REGISTER_CALLBACKS </em>/</div></div></div><div class="notion-text notion-block-f13e57a561d0494a8ec6577821a7a765">}</div><div class="notion-text notion-block-aef8958a15fb42139c896d37a1408fb8">}</div><div class="notion-text notion-block-6770e6b7605247cd9c41b189cb333d39">else</div><div class="notion-text notion-block-dfe3cca4275949e8afbc7a8d171aa46c">{<div class="notion-text-children"><div class="notion-text notion-block-33847f43829c4b3b8c98ac212878b23c">/* Non Blocking error : transfer could go on.<div class="notion-text-children"><div class="notion-text notion-block-49bfa68a948649858448cf1531ede9f7">Error is notified to user through user error callback */<div class="notion-text-children"><div class="notion-text notion-block-56f6c058993b41c2b5c3c139568743b9">#if (USE_HAL_UART_REGISTER_CALLBACKS == 1)</div></div></div></div></div></div></div><div class="notion-text notion-block-67ada531a4b84e4788eec4879f4b5eb7">/<em>Call registered error callback</em>/</div><div class="notion-text notion-block-3dcdc2d3465743228120614d2ef99d2d">huart-&gt;ErrorCallback(huart);<div class="notion-text-children"><div class="notion-text notion-block-e7a8375acff94f5b9bc7b40f9a836fc5">#else</div></div></div><div class="notion-text notion-block-95bc51aa42aa4282a8aa8038c70550a2">/<em>Call legacy weak error callback</em>/</div><div class="notion-text notion-block-9b687205e6a1407aaf14451eefd2866e">HAL_UART_ErrorCallback(huart);<div class="notion-text-children"><div class="notion-text notion-block-da5039014b574a859669ac44cfd641b1">#endif /<em> USE_HAL_UART_REGISTER_CALLBACKS </em>/</div></div></div><div class="notion-text notion-block-c909a9c8f7ae4f26a306a7ce30de0315">huart-&gt;ErrorCode = HAL_UART_ERROR_NONE;</div><div class="notion-text notion-block-6f746f3539f944dd98ffa2942a0d39c1">}</div><div class="notion-text notion-block-e7254b7921a143eea77dbd618437eb61">}</div><div class="notion-text notion-block-f91d316b32644310b18c531a937d2929">return;</div><div class="notion-text notion-block-660ec026ee094cf7a936c29c8701f5d1">} /<em> End if some error occurs </em>/</div><div class="notion-text notion-block-fa47bf9a0fdb400bb238942f15a017af">/<em> UART in mode Transmitter ------------------------------------------------</em>/</div><div class="notion-text notion-block-828e98c4b82b49468f8fe3f4894fa03a">//删除  发送缓冲区空的中断</div><div class="notion-text notion-block-7fdf2e6d15d64f2f9cf9b9d2fbb93663">//  if (((isrflags &amp; USART_SR_TXE) != RESET) &amp;&amp; ((cr1its &amp; USART_CR1_TXEIE) != RESET))</div><div class="notion-text notion-block-c76da431fa6047569a19b7f3f069579d">//  {</div><div class="notion-text notion-block-5767ec98c13444d9882cae68f22c3950">//    UART_Transmit_IT(huart);</div><div class="notion-text notion-block-5a94f84ab87f4cb78aae01a099f5f86b">//    return;</div><div class="notion-text notion-block-51bc6fc6932a4949a6c56ac6bb06b928">//  }</div><div class="notion-text notion-block-baed72ce8b894d75b42b073211a4d6dc">/<em> UART in mode Transmitter end --------------------------------------------</em>/</div><div class="notion-text notion-block-e301e7781c1f4736b38370e9837b5aee">if (((isrflags &amp; USART_SR_TC) != RESET) &amp;&amp; ((cr1its &amp; USART_CR1_TCIE) != RESET))</div><div class="notion-text notion-block-98b84351cde24fb2ac47bd9d5b480ee5">{<div class="notion-text-children"><div class="notion-text notion-block-226630062f7541b6b2bcd11207306400">UART_EndTransmit_IT(huart);</div><div class="notion-text notion-block-e1d29ba1432842d4a37287aa8116531f">return;</div></div></div><div class="notion-text notion-block-77ed39ebea1849c1836f4f5b944f3002">}</div><div class="notion-text notion-block-d007bde66ea343e5885e21eb16d91161">/<em> 写自己的中断回调，现在只能进入我们这个了。 </em>/</div><div class="notion-text notion-block-d579dc284aeb49678850ac6ec9ab0028">#include &quot;uart.h&quot;</div><div class="notion-text notion-block-fb8671e8ee804559baa5fc521253686b">#include &quot;timer.h&quot;</div><div class="notion-text notion-block-6b7af53e74fd4423998afce2f2a213bf">else</div><div class="notion-text notion-block-d9e1717efb7e4797b6f73bbf081a22ab">{<div class="notion-text-children"><div class="notion-text notion-block-882efa4e653f49d5a15829a39d652e6d">if(uart2.RxState == 0){ /<em> 首字节 </em>/<div class="notion-text-children"><div class="notion-text notion-block-0a126b8e22924f0f9eb4f76c74c54dab">__HAL_TIM_ENABLE(&amp;htim4);  //打开tim4的计数</div><div class="notion-text notion-block-462396c6ef2d4be79900b5025f9901f7">uart2.RxStat = 1;   //标记接收</div></div></div><div class="notion-text notion-block-7ccd4e87e29a4856b8caf49d3df74f1e">}else{/<em> 后续字节 </em>/<div class="notion-text-children"><div class="notion-text notion-block-95e730f17fe14fa9b682156e931b8a79">__HAL_TIM_SET_COUNTER(&amp;htim4, 0)//清除tim4的计数</div></div></div><div class="notion-text notion-block-a33c8a635e3b40afbc18fd4a104b9b7a">}</div></div></div><div class="notion-text notion-block-473f9dcc8fbb43fabbe25a1e751e368d">}</div><div class="notion-text notion-block-3ee3b250b3e3441f9d68183cd808ab0a">}</div><details class="notion-toggle notion-block-f131d1080f5e4285a63e7b860cc967b8"><summary><h4 class="notion-h notion-h3 notion-block-f131d1080f5e4285a63e7b860cc967b8" data-id="f131d1080f5e4285a63e7b860cc967b8"><span><div id="f131d1080f5e4285a63e7b860cc967b8" class="notion-header-anchor"></div><span class="notion-h-title">2. 要测试功能</span></span></h4></summary><div><div class="notion-text notion-block-1ebb4d42bb384a1499db918112796c7a">主机SW8(PC14)发送：S1_LED(让从机1 LED4翻转状态  UART1</div><div class="notion-text notion-block-cea9510348e34b0388b0b03936ab6f85">主机SW11(PA0)发送：S2_LED(让从机2 LED4翻转状态)</div><div class="notion-text notion-block-7deb0dea405f41bcb3331a0479f6e842">从机1+从机2 SW8(PC14)：LED ON(让主机LED4点亮)   UART2</div><div class="notion-text notion-block-a3072b2dfbea471e81aab140b4b4d643">从机1+从机2 SW11(PA0)：LED OFF(让主机LED4熄灭)   UART3</div><div class="notion-text notion-block-d304c39846a44c3d943571c0c3aeec1f">一般情况下，从机不会主动发送数据，因为这里并没有硬件仲裁机制。 一般都是主机问，从机答</div></div></details><details class="notion-toggle notion-block-6ad69fd68ecd44f29e909ed23b8ca37c"><summary><h4 class="notion-h notion-h3 notion-block-6ad69fd68ecd44f29e909ed23b8ca37c" data-id="6ad69fd68ecd44f29e909ed23b8ca37c"><span><div id="6ad69fd68ecd44f29e909ed23b8ca37c" class="notion-header-anchor"></div><span class="notion-h-title">3. 相关函数</span></span></h4></summary><div><ul class="notion-list notion-list-disc notion-block-76a6482607a44f3fb93f568cfc48fa81"><li>可以使用转义字符，在字符串中插入16进制数 用于指定从机地址<code class="notion-inline-code">((uint8_t*)&quot;\x81S1_LED&quot;, 7);</code>  \为转义字符  x0x81 为插入的16进制数， 字节为1字节</li></ul><ul class="notion-list notion-list-disc notion-block-f755e649f1f1424e951f3354503bf59c"><li>从机初始化函数：<code class="notion-inline-code">HAL_MultiProcessor_Init(&amp;uart2.uart, 0x01,  UART_WAKEUPMETHOD_ADDRESSMARK);</code></li><ul class="notion-list notion-list-disc notion-block-f755e649f1f1424e951f3354503bf59c"><li>第一个参数，串口总控结构体</li><li>第二个参数，设备地址：0x00~0x0F</li><li>第三个参数，唤醒方法：地址唤醒或者空闲唤醒</li></ul></ul></div></details><details class="notion-toggle notion-block-cb4bc06df5724d81a46a9ce8cb91fc61"><summary><h4 class="notion-h notion-h3 notion-block-cb4bc06df5724d81a46a9ce8cb91fc61" data-id="cb4bc06df5724d81a46a9ce8cb91fc61"><span><div id="cb4bc06df5724d81a46a9ce8cb91fc61" class="notion-header-anchor"></div><span class="notion-h-title">4. 主机程序</span></span></h4></summary><div><details class="notion-toggle notion-block-2bd2dd874efa4d5b9897e1859c354fa0"><summary><h4 class="notion-h notion-h3 notion-block-2bd2dd874efa4d5b9897e1859c354fa0" data-id="2bd2dd874efa4d5b9897e1859c354fa0"><span><div id="2bd2dd874efa4d5b9897e1859c354fa0" class="notion-header-anchor"></div><span class="notion-h-title">uart.c</span></span></h4></summary><div><div class="notion-text notion-block-57ad332dca0d422a97447b0aa8315482">#include &quot;stm32f1xx_hal.h&quot;</div><div class="notion-text notion-block-e18f63f298a5412c99e27b3cc8241be4">#include &quot;uart.h&quot;</div><div class="notion-text notion-block-7dbb9c20f52e43309576984f1a84dd33">UCB  uart1;</div><div class="notion-text notion-block-876bcda8a77b4922bcb66058171d2f39">UCB  uart2;</div><div class="notion-text notion-block-da1455889634431e972784109706232b">UCB  uart3;</div><div class="notion-text notion-block-bc6af30670f442fead7f9b1f735f9385">uint8_t U1_RxBuff[U1_RX_SIZE];</div><div class="notion-text notion-block-af492286a3ae4be0820f231350d8dd8e">uint8_t U1_TxBuff[U1_TX_SIZE];</div><div class="notion-text notion-block-1f29838814d74a75a4ba954b5378d420">uint8_t U2_RxBuff[U2_RX_SIZE];</div><div class="notion-text notion-block-c12dc62618c24b3eb0899cdfcd711c55">uint8_t U2_TxBuff[U2_TX_SIZE];</div><div class="notion-text notion-block-7d3c5db95db54c7094c0a2526165cd2b">uint8_t U3_RxBuff[U3_RX_SIZE];</div><div class="notion-text notion-block-d6a41db2b71742a48dcde8f424a25a65">uint8_t U3_TxBuff[U3_TX_SIZE];</div><div class="notion-text notion-block-f9dad3d079ab40aebba85da5c2d49212">void U1_Init(uint32_t bandrate){<div class="notion-text-children"><div class="notion-text notion-block-4707adc3251a41538d83cdca89cd473d">uart1.uart.Instance = USART1;</div><div class="notion-text notion-block-96c9fc85622d4d568cc525c8b9e52489">uart1.uart.Init.BaudRate = bandrate;</div><div class="notion-text notion-block-4a6ef40af1b14cac80e91c2ca7d1c7e4">uart1.uart.Init.WordLength = UART_WORDLENGTH_8B;</div><div class="notion-text notion-block-9d6eaf48dbd44495b79b45c09b0c7f92">uart1.uart.Init.StopBits = UART_STOPBITS_1;</div><div class="notion-text notion-block-4101d48dd8a548fc8278b4770d5cdfdf">uart1.uart.Init.Parity = UART_PARITY_NONE;</div><div class="notion-text notion-block-5ee04967fb584fcdb44bfcad996751db">uart1.uart.Init.Mode = UART_MODE_TX_RX;</div><div class="notion-text notion-block-406963ca24eb406aae65e012b68b857a">uart1.uart.Init.HwFlowCtl = UART_HWCONTROL_NONE;</div><div class="notion-text notion-block-6ff10630cae448369a6cd3fe6c6383c5">HAL_UART_Init(&amp;uart1.uart);</div><div class="notion-text notion-block-693fe12ceb8948af9df42fd875e44202">U1_PtrInit();</div></div></div><div class="notion-text notion-block-9b98dbb2eeba46e6a363ed168ab21c99">}</div><div class="notion-text notion-block-74df0518d24141beaefc727bfe14d19a">void U1_PtrInit(void){<div class="notion-text-children"><div class="notion-text notion-block-9b60062e648747acbc1a2a79e45525f9">uart1.RxInPtr = &amp;uart1.RxLocation[0];</div><div class="notion-text notion-block-81da912af849448bbeb0aeb729691264">uart1.RxOutPtr = &amp;uart1.RxLocation[0];</div><div class="notion-text notion-block-626db062cce14e94ac9c4e4270fdfd2b">uart1.RxEndPtr = &amp;uart1.RxLocation[9];</div><div class="notion-text notion-block-4760cb9e55ec4a0f96ad43c9036cd7c5">uart1.RxCounter = 0;</div><div class="notion-text notion-block-f503e99765204d0f9c04130c32d8859c">uart1.RxInPtr-&gt;start = U1_RxBuff;</div><div class="notion-text notion-block-907714f4ac064e6a92666a57a30f9aba">uart1.TxInPtr = &amp;uart1.TxLocation[0];</div><div class="notion-text notion-block-681b17ea297640dfbd36fe78d53cab5a">uart1.TxOutPtr = &amp;uart1.TxLocation[0];</div><div class="notion-text notion-block-7673db8988a94fd7aba55df23104c730">uart1.TxEndPtr = &amp;uart1.TxLocation[9];</div><div class="notion-text notion-block-627abd47ffe742d9a67df22e3ed677c4">uart1.TxCounter = 0;</div><div class="notion-text notion-block-ac10699f50124ea6b5ce0db319a8d304">uart1.TxInPtr-&gt;start = U1_TxBuff;	</div></div></div></div></details><div class="notion-text notion-block-fa83988ca8a4496ab9fa6bd0289dc229">__HAL_UART_ENABLE_IT(&amp;uart1.uart, UART_IT_IDLE);</div></div></details><div class="notion-text notion-block-f8f0db925f4e43d0a13fff583fb4e9ef">HAL_UART_Receive_DMA(&amp;uart1.uart,uart1.RxInPtr-&gt;start,U1_RX_MAX);</div><div class="notion-text notion-block-b9eef7758c8842e3b1745b6d7576b399">}</div><div class="notion-text notion-block-4e99f82b6d13444592b9cd8c355e3091">void U1_Txdata(uint8_t *data, uint32_t data_len){</div><div class="notion-text notion-block-7e73cbf96007469a9aab85facb65abbb">if((U1_TX_SIZE - uart1.TxCounter )&gt;=data_len){<div class="notion-text-children"><div class="notion-text notion-block-52f2acabc1754dadbafe38f6e890aeef">uart1.TxInPtr-&gt;start = &amp;U1_TxBuff[uart1.TxCounter];</div></div></div><div class="notion-text notion-block-4e688d51b06d46cfadd61f41c970a11e">}else{<div class="notion-text-children"><div class="notion-text notion-block-30dbe243620845a8a8537009328a3118">uart1.TxCounter = 0;</div><div class="notion-text notion-block-5abdde986f5d4fd8a3cd5c729763e098">uart1.TxInPtr-&gt;start = U1_TxBuff;</div></div></div><div class="notion-text notion-block-d6d581f51c654edfba57775e078f10f0">}</div><div class="notion-text notion-block-b815e804d1a045c7850461d9af3e2a15">memcpy(uart1.TxInPtr-&gt;start,data,data_len);</div><div class="notion-text notion-block-8ce627ef57f94b9bb67fe20687f3d5e7">uart1.TxCounter += data_len;</div><div class="notion-text notion-block-26e71b7a5803425183f99c6b80f39bfb">uart1.TxInPtr-&gt;end = &amp;U1_TxBuff[uart1.TxCounter - 1];</div><div class="notion-text notion-block-55a32fb6ccf64b49a3fa0dccabb642d0">uart1.TxInPtr++;</div><div class="notion-text notion-block-3577629084814027bdfc43c11768b33c">if(uart1.TxInPtr == uart1.TxEndPtr){<div class="notion-text-children"><div class="notion-text notion-block-7751149ffa254a8a813f5a0b370e19f1">uart1.TxInPtr = &amp;uart1.TxLocation[0];</div></div></div><div class="notion-text notion-block-37d7974a12c84ce69b2214ccb40b076a">}</div><div class="notion-text notion-block-0798658a309e4751b6a9828f9fda4973">}</div><div class="notion-text notion-block-4c50e24b7f4d426cbf4b960d7c1b4338">void U2_Init(uint32_t bandrate){</div><div class="notion-text notion-block-9fcf759f33154b089ad10fcddb778d97">uart2.uart.Instance = USART2;</div><div class="notion-text notion-block-41c4fc061df14edaa8baaec3a9bf2bf4">uart2.uart.Init.BaudRate = bandrate;</div><div class="notion-text notion-block-aa81d50a39084f579b47890f9a6983e7">uart2.uart.Init.WordLength = UART_WORDLENGTH_8B;</div><div class="notion-text notion-block-cffaf307ae854a9b8a9688a4ebfa10a7">uart2.uart.Init.StopBits = UART_STOPBITS_1;</div><div class="notion-text notion-block-f9c03b18483f4d5cb40ba47f452d0c55">uart2.uart.Init.Parity = UART_PARITY_NONE;</div><div class="notion-text notion-block-38fcd0034457486093f90710e7e31fcf">uart2.uart.Init.Mode = UART_MODE_TX_RX;</div><div class="notion-text notion-block-14c9d2fa4ece4736a075c889490e7331">uart2.uart.Init.HwFlowCtl = UART_HWCONTROL_NONE;</div><div class="notion-text notion-block-421ef80996904d58bed0885df05792e9">HAL_HalfDuplex_Init(&amp;uart2.uart);</div><div class="notion-text notion-block-20d964fa2d4b4254b0a77ead1acbbd0d">HAL_HalfDuplex_EnableReceiver(&amp;uart2.uart);</div><div class="notion-text notion-block-660f8c06abae4f9b9f1ca6aba9bf9787">U2_PtrInit();</div><div class="notion-text notion-block-7c6b303a0870433f9fdd82f25b7a8432">}</div><div class="notion-text notion-block-aab0fbab524942318224145d6ca6f993">void U2_PtrInit(void){</div><div class="notion-text notion-block-581554245fea47b6b7a0cab6abc4fb1c">uart2.RxInPtr = &amp;uart2.RxLocation[0];</div><div class="notion-text notion-block-ef2b4b34e13944d790a94af19af2a57e">uart2.RxOutPtr = &amp;uart2.RxLocation[0];</div><div class="notion-text notion-block-cfc59e047f9b4d359bbc2dd53f585b24">uart2.RxEndPtr = &amp;uart2.RxLocation[9];</div><div class="notion-text notion-block-4a7cfd13051d4468914ba10a2b7473dd">uart2.RxCounter = 0;</div><div class="notion-text notion-block-a1dec29fd5174fd5a938cdb4a1a5190e">uart2.RxInPtr-&gt;start = U2_RxBuff;</div><div class="notion-text notion-block-19f2e0e52a3948148a35630089cefe9c">uart2.TxInPtr = &amp;uart2.TxLocation[0];</div><div class="notion-text notion-block-ccc365a8e59c412499cd48aaa66366b2">uart2.TxOutPtr = &amp;uart2.TxLocation[0];</div><div class="notion-text notion-block-0939b378f58f47ca90b7b0385501878d">uart2.TxEndPtr = &amp;uart2.TxLocation[9];</div><div class="notion-text notion-block-03c71a76d2804dfe9dfa3bc5aa4669d0">uart2.TxCounter = 0;</div><div class="notion-text notion-block-82019f581b934c78a7b7e10c9627625c">uart2.TxInPtr-&gt;start = U2_TxBuff;	</div><div class="notion-text notion-block-a58ce992e9b242069903c6c809df8591">__HAL_UART_ENABLE_IT(&amp;uart2.uart, UART_IT_IDLE);</div><div class="notion-text notion-block-4be590876af44cb99f45c9dbfcffaed3">HAL_UART_Receive_DMA(&amp;uart2.uart,uart2.RxInPtr-&gt;start,U2_RX_MAX);</div><div class="notion-text notion-block-a15b1a26495948fda161120a97a304fb">}</div><div class="notion-text notion-block-23b78dbca5a041608a31376b452dc4f4">void U2_Txdata(uint8_t *data, uint32_t data_len){</div><div class="notion-text notion-block-84afcbfd494f4302bde6c448c9b779d6">if((U2_TX_SIZE - uart2.TxCounter )&gt;=data_len){<div class="notion-text-children"><div class="notion-text notion-block-8f09dd2135034f54a632051e5969ec58">uart2.TxInPtr-&gt;start = &amp;U2_TxBuff[uart2.TxCounter];</div></div></div><div class="notion-text notion-block-168957d4de364166a7a491d7c16463fc">}else{<div class="notion-text-children"><div class="notion-text notion-block-d72eb8cebb2d4c1c83bea5af8ae36d03">uart2.TxCounter = 0;</div><div class="notion-text notion-block-0556ca850bfb46c982b7ce63e2aca007">uart2.TxInPtr-&gt;start = U2_TxBuff;</div></div></div><div class="notion-text notion-block-0690e1779a0248e8a159ab5eb6fc55a7">}</div><div class="notion-text notion-block-849919f758734caba39d1b969d3c37cb">memcpy(uart2.TxInPtr-&gt;start,data,data_len);</div><div class="notion-text notion-block-7c14cb8730de451da7388b98b1c209ac">uart2.TxCounter += data_len;</div><div class="notion-text notion-block-ba25552d19d64d4397342df0d20bbfea">uart2.TxInPtr-&gt;end = &amp;U2_TxBuff[uart2.TxCounter - 1];</div><div class="notion-text notion-block-221d53a1c4964bbb8f0345828b27dfe0">uart2.TxInPtr++;</div><div class="notion-text notion-block-c01b2fbb3af545faa17c83ed2345204b">if(uart2.TxInPtr == uart2.TxEndPtr){<div class="notion-text-children"><div class="notion-text notion-block-c6e32d6c89dd4f7882fd98fbc148f044">uart2.TxInPtr = &amp;uart2.TxLocation[0];</div></div></div><div class="notion-text notion-block-e5b2ca83579347f686ef430155ee086c">}</div><div class="notion-text notion-block-3e6c073410764a4b8b30d5e9a1db5d03">}</div><div class="notion-text notion-block-31ee01349f2f436282d5a4e7dedd4d11">void U3_Init(uint32_t bandrate){</div><div class="notion-text notion-block-7b2d5f2c2d2642cd8392334b3e039f34">uart3.uart.Instance = USART3;</div><div class="notion-text notion-block-e21af653b7304e7db303321ca6d9acd7">uart3.uart.Init.BaudRate = bandrate;</div><div class="notion-text notion-block-a1649e32f79e4358813746284a1203fa">uart3.uart.Init.WordLength = UART_WORDLENGTH_8B;</div><div class="notion-text notion-block-52b1476d6b3644e395b2cdb58511bc55">uart3.uart.Init.StopBits = UART_STOPBITS_1;</div><div class="notion-text notion-block-54f9afadb99948d2bc5195b68058f474">uart3.uart.Init.Parity = UART_PARITY_NONE;</div><div class="notion-text notion-block-79881bafdeb04330ba58c91bd4adc99f">uart3.uart.Init.Mode = UART_MODE_TX_RX;</div><div class="notion-text notion-block-d43acf692aed47f896561a5efda01b6e">uart3.uart.Init.HwFlowCtl = UART_HWCONTROL_NONE;</div><div class="notion-text notion-block-94e0259140da4b8d92932bd1bd0b5989">HAL_HalfDuplex_Init(&amp;uart3.uart);</div><div class="notion-text notion-block-a2e5a98fe5ac4640a94c1cf42d94bfa4">HAL_HalfDuplex_EnableReceiver(&amp;uart3.uart);</div><div class="notion-text notion-block-e75a26222019440d9b133aa5021b8c03">U3_PtrInit();</div><div class="notion-text notion-block-393e1b8b42434ddb9424eedad550b0d3">}</div><div class="notion-text notion-block-1a79dcab62be455cb26eeae128027c3b">void U3_PtrInit(void){</div><div class="notion-text notion-block-8243b257cdc54923a80c81c1101bdc26">uart3.RxInPtr = &amp;uart3.RxLocation[0];</div><div class="notion-text notion-block-8587a25145d2483ea9a11a657fd475d2">uart3.RxOutPtr = &amp;uart3.RxLocation[0];</div><div class="notion-text notion-block-e6ec33211af74f088c478c8fd73e646a">uart3.RxEndPtr = &amp;uart3.RxLocation[9];</div><div class="notion-text notion-block-d9490ba5356640deb25b02420cb9fc42">uart3.RxCounter = 0;</div><div class="notion-text notion-block-52b6bb8931884e47a23c18a4ef4c2e94">uart3.RxInPtr-&gt;start = U3_RxBuff;</div><div class="notion-text notion-block-e0f867e6645548628eaccf90f8a0c3bb">uart3.TxInPtr = &amp;uart3.TxLocation[0];</div><div class="notion-text notion-block-8682f5297967437db6c510f43199cad6">uart3.TxOutPtr = &amp;uart3.TxLocation[0];</div><div class="notion-text notion-block-0b9effd3d4ba44eba0d633c4530bd272">uart3.TxEndPtr = &amp;uart3.TxLocation[9];</div><div class="notion-text notion-block-a963b872c9e941e2b86a95b76b08aef0">uart3.TxCounter = 0;</div><div class="notion-text notion-block-ad4735c15e7442d68fb3601f4745297d">uart3.TxInPtr-&gt;start = U3_TxBuff;	</div><div class="notion-text notion-block-c01fc70ae72446e6b5a16c7e96ec496e">__HAL_UART_ENABLE_IT(&amp;uart3.uart, UART_IT_IDLE);</div><div class="notion-text notion-block-4c1a672cee9043339f78feab9609be28">HAL_UART_Receive_DMA(&amp;uart3.uart,uart3.RxInPtr-&gt;start,U3_RX_MAX);</div><div class="notion-text notion-block-22a23656585642029bb32457e51cd524">}</div><div class="notion-text notion-block-1bc8f2f707954e37a89647d644750287">void U3_Txdata(uint8_t *data, uint32_t data_len){</div><div class="notion-text notion-block-a38e2ca47b9b4331bf918f12ef94ec0e">if((U3_TX_SIZE - uart3.TxCounter )&gt;=data_len){<div class="notion-text-children"><div class="notion-text notion-block-295c59661bbd41228d07a816dbe7cd32">uart3.TxInPtr-&gt;start = &amp;U3_TxBuff[uart3.TxCounter];</div></div></div><div class="notion-text notion-block-77e5d65222744cb9947646f930086d70">}else{<div class="notion-text-children"><div class="notion-text notion-block-ab4aaa2342d64e8fb4801ac82fabaee8">uart3.TxCounter = 0;</div><div class="notion-text notion-block-d808dd12f09543e4b28acfd769842f70">uart3.TxInPtr-&gt;start = U3_TxBuff;</div></div></div><div class="notion-text notion-block-369c7a9161854321b9a593286e95bdf3">}</div><div class="notion-text notion-block-e02322d388bf462382135f40471faf56">memcpy(uart3.TxInPtr-&gt;start,data,data_len);</div><div class="notion-text notion-block-6da5a0cbd51449788568cb446fa05454">uart3.TxCounter += data_len;</div><div class="notion-text notion-block-bc8d1ac2df7f47aab0d553c405dbb1a7">uart3.TxInPtr-&gt;end = &amp;U3_TxBuff[uart3.TxCounter - 1];</div><div class="notion-text notion-block-dca9413f08d94be7a300fed003379249">uart3.TxInPtr++;</div><div class="notion-text notion-block-bde3b494e7ee4429b5e0c07bdb2c4de7">if(uart3.TxInPtr == uart3.TxEndPtr){<div class="notion-text-children"><div class="notion-text notion-block-247e1d42e9204d43b34f1f2ce4876585">uart3.TxInPtr = &amp;uart3.TxLocation[0];</div></div></div><div class="notion-text notion-block-e0d6cfe658b34fccb7d7c969e1938538">}</div><div class="notion-text notion-block-d6e6ccc9e1134fc2b77ac819f5f09bc2">}</div><div class="notion-text notion-block-932ea2a2ad7d44a1a7ec98d59a4ea957">void HAL_UART_MspInit(UART_HandleTypeDef *huart){</div><div class="notion-text notion-block-5fb6831c1bc243e9888b3725033387d8">GPIO_InitTypeDef GPIO_InitType;</div><div class="notion-text notion-block-c4636488a54f481b9aba4e5862a7d29e">if(huart-&gt;Instance == USART1){<div class="notion-text-children"><div class="notion-text notion-block-49f38bd77bd54011bdf8928d622008b4">__HAL_RCC_GPIOA_CLK_ENABLE();</div><div class="notion-text notion-block-8077276e5dc8425a8353485e956cc5d8">__HAL_RCC_USART1_CLK_ENABLE();</div><div class="notion-text notion-block-951311936045478f802e1d745605350c">__HAL_RCC_DMA1_CLK_ENABLE();</div><div class="notion-text notion-block-ca8c6a16789345ba826204112aeecdd9">GPIO_<a class="notion-link" href="http://InitType.Pin" target="_blank" rel="noopener noreferrer">InitType.Pin</a> = GPIO_PIN_9;</div><div class="notion-text notion-block-0ee0410dab1e4ebc871a52db30c57a98">GPIO_InitType.Mode = GPIO_MODE_AF_PP;</div><div class="notion-text notion-block-fe86f9baaa1e4730913b3ffec3093969">GPIO_InitType.Speed = GPIO_SPEED_FREQ_MEDIUM;</div><div class="notion-text notion-block-5db79ba738a14f28a8c7bc41e6ccf326">HAL_GPIO_Init(GPIOA,&amp;GPIO_InitType);</div><div class="notion-text notion-block-19510e44f5d84392a210bca069391df0">GPIO_<a class="notion-link" href="http://InitType.Pin" target="_blank" rel="noopener noreferrer">InitType.Pin</a> = GPIO_PIN_10;</div><div class="notion-text notion-block-80e22704d9534f5aa1c5951bf77bb56d">GPIO_InitType.Mode = GPIO_MODE_AF_INPUT;</div><div class="notion-text notion-block-bbb937cd9c9a4947ae7315efc4241228">GPIO_InitType.Pull = GPIO_PULLUP;</div><div class="notion-text notion-block-9ad6398627dc45ff99bddd7d6e15b37e">HAL_GPIO_Init(GPIOA,&amp;GPIO_InitType);</div><div class="notion-text notion-block-5b5ac336fd864e4593f7e53081a3c872">HAL_NVIC_SetPriority(USART1_IRQn,3,0);</div><div class="notion-text notion-block-27f5f809afe4429f89f1f89ef12c8ba8">HAL_NVIC_EnableIRQ(USART1_IRQn);</div><div class="notion-text notion-block-4147c60aaeac45f28669011e67e827e2">uart1.dmatx.Instance = DMA1_Channel4;</div><div class="notion-text notion-block-c8d72166ff1d4105a763c50f1c61f881">uart1.dmatx.Init.Direction = DMA_MEMORY_TO_PERIPH;</div><div class="notion-text notion-block-0fa3c962fb7f440ebb79048cb724aa5d">uart1.dmatx.Init.PeriphInc = DMA_PINC_DISABLE;</div><div class="notion-text notion-block-5af13f0e7bc14728904b25a94fdcba7b">uart1.dmatx.Init.MemInc = DMA_MINC_ENABLE;</div><div class="notion-text notion-block-5cbcf07543584326b1c91cfde73f0006">uart1.dmatx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;</div><div class="notion-text notion-block-2be8ae884b094e21b8646ca8c8e89fa8">uart1.dmatx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;</div><div class="notion-text notion-block-173fef2576f24a1795bc8844a6c5a349">uart1.dmatx.Init.Mode = DMA_NORMAL;</div><div class="notion-text notion-block-ee159bc08d09494ab5f0a447253fa569">uart1.dmatx.Init.Priority = DMA_PRIORITY_MEDIUM;</div><div class="notion-text notion-block-2b2d6160dffa4f32b2ceedace5c97f4c">__HAL_LINKDMA(huart, hdmatx, uart1.dmatx);</div><div class="notion-text notion-block-c1b2cc6bf53341e5876cf90dabc15b73">HAL_DMA_Init(&amp;uart1.dmatx);</div><div class="notion-text notion-block-a9183198f8a340658963ea0d9e514cb0">HAL_NVIC_SetPriority(DMA1_Channel4_IRQn,3,0);</div><div class="notion-text notion-block-edf3f02b5ddd45e2a766a698339b67e3">HAL_NVIC_EnableIRQ(DMA1_Channel4_IRQn);<div class="notion-text-children"><div class="notion-text notion-block-f55643e7985f4cbd8f850a46f99cfb18">uart1.dmarx.Instance = DMA1_Channel5;</div><div class="notion-text notion-block-1107f35a225940f3848bedbd8c48c8e1">uart1.dmarx.Init.Direction = DMA_PERIPH_TO_MEMORY;</div><div class="notion-text notion-block-162829f757224e608058145f126d5423">uart1.dmarx.Init.PeriphInc = DMA_PINC_DISABLE;</div><div class="notion-text notion-block-9785bbede52144b5b06f23eb2b3cc16f">uart1.dmarx.Init.MemInc = DMA_MINC_ENABLE;</div><div class="notion-text notion-block-c858c17dd5c24a129c2a95bea5f791f0">uart1.dmarx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;</div><div class="notion-text notion-block-b938addde92b46ebb213b40a850434db">uart1.dmarx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;</div><div class="notion-text notion-block-dd93c1ca97254aad8a190c69b16af7f7">uart1.dmarx.Init.Mode = DMA_NORMAL;</div><div class="notion-text notion-block-b1a96df9390548468dd4550ea2ac9bca">uart1.dmarx.Init.Priority = DMA_PRIORITY_MEDIUM;</div><div class="notion-text notion-block-083d4780b2864c5fa72dbb3a69baa13d">__HAL_LINKDMA(huart, hdmarx, uart1.dmarx);</div><div class="notion-text notion-block-349a190c53df42e384600fd52475fb19">HAL_DMA_Init(&amp;uart1.dmarx);</div><div class="notion-text notion-block-31cc377f2a2046a18b5c37e8ad548518">HAL_NVIC_SetPriority(DMA1_Channel5_IRQn,3,0);</div><div class="notion-text notion-block-22799339ee194762b0b10878cf11cd33">HAL_NVIC_EnableIRQ(DMA1_Channel5_IRQn);</div><div class="notion-text notion-block-ff200b1cbe8c4b6e972416dfb76c5047">}else if(huart-&gt;Instance == USART2){<div class="notion-text-children"><div class="notion-text notion-block-92bac8115aa7452b93171ee44faec50d">__HAL_RCC_GPIOA_CLK_ENABLE();</div><div class="notion-text notion-block-53d17855039746c0a22c4cccbdbaf195">__HAL_RCC_USART2_CLK_ENABLE();</div><div class="notion-text notion-block-7be56fcd39064794a34284e2050dd094">__HAL_RCC_DMA1_CLK_ENABLE();</div><div class="notion-text notion-block-ffe5c8056ea9444d9413c7d8f68459f6">GPIO_<a class="notion-link" href="http://InitType.Pin" target="_blank" rel="noopener noreferrer">InitType.Pin</a> = GPIO_PIN_2;</div><div class="notion-text notion-block-515438bfb68843ac982b5045d7d410ae">GPIO_InitType.Mode = GPIO_MODE_AF_OD;</div><div class="notion-text notion-block-a15e23f33d3844609cc46af51ce6ea70">GPIO_InitType.Speed = GPIO_SPEED_FREQ_MEDIUM;</div><div class="notion-text notion-block-079d7d7ca1db48e2943590df45c665df">HAL_GPIO_Init(GPIOA,&amp;GPIO_InitType);</div><div class="notion-text notion-block-9990cd3c40d84a99b10c771b7adbaa02">HAL_NVIC_SetPriority(USART2_IRQn,3,0);</div><div class="notion-text notion-block-b39b5a382005428f8186ca1310be5019">HAL_NVIC_EnableIRQ(USART2_IRQn);</div><div class="notion-text notion-block-e5ae30866ef740f3b1d4b82f22ac23cd">uart2.dmatx.Instance = DMA1_Channel7;</div><div class="notion-text notion-block-f2228441e79b431986a3c7aac26ac366">uart2.dmatx.Init.Direction = DMA_MEMORY_TO_PERIPH;</div><div class="notion-text notion-block-23d64cf8eb044449b1b88012c902bec4">uart2.dmatx.Init.PeriphInc = DMA_PINC_DISABLE;</div><div class="notion-text notion-block-2b20d589b60c49eb9417c5c027050440">uart2.dmatx.Init.MemInc = DMA_MINC_ENABLE;</div><div class="notion-text notion-block-810d219497b94ff3899cd22713694447">uart2.dmatx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;</div><div class="notion-text notion-block-3786265f6003425d9661c2f20c840ecb">uart2.dmatx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;</div><div class="notion-text notion-block-f77e17cfddf74b61b9b008e6624d8086">uart2.dmatx.Init.Mode = DMA_NORMAL;</div><div class="notion-text notion-block-d70e68ec4f8348bcbc7b734b01f8aa3c">uart2.dmatx.Init.Priority = DMA_PRIORITY_MEDIUM;</div><div class="notion-text notion-block-4a28d16a3afb4743bc8b2efca936afe3">__HAL_LINKDMA(huart, hdmatx, uart2.dmatx);</div><div class="notion-text notion-block-62431b95ff314a2298b0211b98a1e38f">HAL_DMA_Init(&amp;uart2.dmatx);</div><div class="notion-text notion-block-6fb02ed3e4dc4eea860cac11cbc7f08d">HAL_NVIC_SetPriority(DMA1_Channel7_IRQn,3,0);</div><div class="notion-text notion-block-e3f184a0fe564a49bf8fd48a77105941">HAL_NVIC_EnableIRQ(DMA1_Channel7_IRQn);</div><div class="notion-text notion-block-4445211ef700474592c7575cf49ea0e8">uart2.dmarx.Instance = DMA1_Channel6;</div><div class="notion-text notion-block-906e2afd8ea54c17a82898e966992120">uart2.dmarx.Init.Direction = DMA_PERIPH_TO_MEMORY;</div><div class="notion-text notion-block-c809bd66ed694bf5acee0cd409a0792e">uart2.dmarx.Init.PeriphInc = DMA_PINC_DISABLE;</div><div class="notion-text notion-block-e85ef830e5744dd2ba5a16b67dcc5aeb">uart2.dmarx.Init.MemInc = DMA_MINC_ENABLE;</div><div class="notion-text notion-block-54bd428e466c47eca2511d7088894727">uart2.dmarx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;</div><div class="notion-text notion-block-f07f897861ca46499f652d601a7a5b09">uart2.dmarx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;</div><div class="notion-text notion-block-6a2b22ac948b4c4b919354160e14d5f8">uart2.dmarx.Init.Mode = DMA_NORMAL;</div><div class="notion-text notion-block-1524a15c4d054882acb889769f391bb1">uart2.dmarx.Init.Priority = DMA_PRIORITY_MEDIUM;</div><div class="notion-text notion-block-f3e45999b2f8432d83e54e174a3aeb44">__HAL_LINKDMA(huart, hdmarx, uart2.dmarx);</div><div class="notion-text notion-block-6257724c0dd849bc9ba0d96092ede33a">HAL_DMA_Init(&amp;uart2.dmarx);</div><div class="notion-text notion-block-414b0092c56e49aebfbc7ad66a827411">HAL_NVIC_SetPriority(DMA1_Channel6_IRQn,3,0);</div><div class="notion-text notion-block-22f5aaf3fb1041159a60ff4940eb83bb">HAL_NVIC_EnableIRQ(DMA1_Channel6_IRQn);</div></div></div><div class="notion-text notion-block-fe144a74c0604ebcb954c0e98a434aca">}else if(huart-&gt;Instance == USART3){<div class="notion-text-children"><div class="notion-text notion-block-c6df4bb2ab324fe8ad700e6aba43de6f">__HAL_RCC_GPIOB_CLK_ENABLE();</div><div class="notion-text notion-block-11eab42d41da44f59d3b5fef5138b31a">__HAL_RCC_USART3_CLK_ENABLE();</div><div class="notion-text notion-block-0cbaff0cf29a4d74860ba1f8f4454088">__HAL_RCC_DMA1_CLK_ENABLE();</div><div class="notion-text notion-block-653bc38adcd443d986e2ccd0cc13dd32">GPIO_<a class="notion-link" href="http://InitType.Pin" target="_blank" rel="noopener noreferrer">InitType.Pin</a> = GPIO_PIN_10;</div><div class="notion-text notion-block-2d6eef602fec4efb8561b174b0f78357">GPIO_InitType.Mode = GPIO_MODE_AF_OD;</div><div class="notion-text notion-block-e2d034d8c7f44715b3ee56dd523f93b7">GPIO_InitType.Speed = GPIO_SPEED_FREQ_MEDIUM;</div><div class="notion-text notion-block-8c5e3afcd3f147c087fe4b471f41e0ed">HAL_GPIO_Init(GPIOB,&amp;GPIO_InitType);</div><div class="notion-text notion-block-21535a9ce3a748e3883cabef1d2adbf5">HAL_NVIC_SetPriority(USART3_IRQn,3,0);</div><div class="notion-text notion-block-8371dd48661240dead0c410203bac3a5">HAL_NVIC_EnableIRQ(USART3_IRQn);</div><div class="notion-text notion-block-0ca74047bd5d4a4599b3adae455a76c5">uart3.dmatx.Instance = DMA1_Channel2;</div><div class="notion-text notion-block-098c9af0839d4198a9783dd8fa387c22">uart3.dmatx.Init.Direction = DMA_MEMORY_TO_PERIPH;</div><div class="notion-text notion-block-a5a6f9968dc949cd9a73e8786043e504">uart3.dmatx.Init.PeriphInc = DMA_PINC_DISABLE;</div><div class="notion-text notion-block-64fe6460144e4fa9880cc1cc897c4835">uart3.dmatx.Init.MemInc = DMA_MINC_ENABLE;</div><div class="notion-text notion-block-3b13398bc3c94f42864d70f8ce393817">uart3.dmatx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;</div><div class="notion-text notion-block-453390bbaaed4d8e8f17967ffb6e035d">uart3.dmatx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;</div><div class="notion-text notion-block-bbc1eac57ad74110a9c29cbe21e17f9c">uart3.dmatx.Init.Mode = DMA_NORMAL;</div><div class="notion-text notion-block-99d4dfd87004467e924040070fc0af84">uart3.dmatx.Init.Priority = DMA_PRIORITY_MEDIUM;</div><div class="notion-text notion-block-b963d48ee2c54f19b9ac59d1d8ec9540">__HAL_LINKDMA(huart, hdmatx, uart3.dmatx);</div><div class="notion-text notion-block-1accea3ab5494d1eb7923fc836970212">HAL_DMA_Init(&amp;uart3.dmatx);</div><div class="notion-text notion-block-85f2226318184c0890f1cbb042531b53">HAL_NVIC_SetPriority(DMA1_Channel2_IRQn,3,0);</div><div class="notion-text notion-block-6cfe86335e504619a3b38e37e13a09a2">HAL_NVIC_EnableIRQ(DMA1_Channel2_IRQn);</div><div class="notion-text notion-block-a6179e1705e8464d8aa0af749a33c21d">uart3.dmarx.Instance = DMA1_Channel3;</div><div class="notion-text notion-block-7ebf3f279d1a4ae1b3855d0601acc04b">uart3.dmarx.Init.Direction = DMA_PERIPH_TO_MEMORY;</div><div class="notion-text notion-block-6d7b39a21cde4778a47b95c2251063e4">uart3.dmarx.Init.PeriphInc = DMA_PINC_DISABLE;</div><div class="notion-text notion-block-cdb3261d49e242d2b512f96db47c6641">uart3.dmarx.Init.MemInc = DMA_MINC_ENABLE;</div><div class="notion-text notion-block-6eab8032cb0f4917b65b1e0e9b217bee">uart3.dmarx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;</div><div class="notion-text notion-block-6e7a9ed0229f431c8ca1a868a9f474f4">uart3.dmarx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;</div><div class="notion-text notion-block-13a715205c2346d0814e2f7251f4107c">uart3.dmarx.Init.Mode = DMA_NORMAL;</div><div class="notion-text notion-block-f5726a70d226401886fd8f3664f2756f">uart3.dmarx.Init.Priority = DMA_PRIORITY_MEDIUM;</div><div class="notion-text notion-block-1d09d5b846f649329791d4b14ffd5a73">__HAL_LINKDMA(huart, hdmarx, uart3.dmarx);</div><div class="notion-text notion-block-bc3a0b36833447a19348728a65ef687c">HAL_DMA_Init(&amp;uart3.dmarx);</div><div class="notion-text notion-block-dab759ddf4a44ee08e5887e860da13e2">HAL_NVIC_SetPriority(DMA1_Channel3_IRQn,3,0);</div><div class="notion-text notion-block-b8e79445ded44eb1ae9b0767fb261bed">HAL_NVIC_EnableIRQ(DMA1_Channel3_IRQn);</div></div></div><div class="notion-text notion-block-24c3cad65e324ebcb520bda332ba544e">}</div></div></div></div></div><div class="notion-text notion-block-f0f1cccc12954f9f82b9f528a859cd4a">}</div><div class="notion-text notion-block-0ebc9b0e027c4fc2bc1021010bab3c0f">void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)</div><div class="notion-text notion-block-ac57e57b416741acb5d5574086bba7cc">{</div><div class="notion-text notion-block-454b2b3ff2964cf49c030c27f0f15023">if(huart-&gt;Instance == USART1){</div><div class="notion-text notion-block-89369ccd3272454ca3fa25b6d742d528">}</div><div class="notion-text notion-block-bed6c5c2f7f6453b9f353d836e205738">}</div><div class="notion-text notion-block-97a81bdb08a549f79e13bfe7a3e0a2a8">void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart)</div><div class="notion-text notion-block-47ffff343b994d4199c67223db0661a3">{</div><div class="notion-text notion-block-863f6cf23ee443d184b7e4fdfa9dcca1">if(huart-&gt;Instance == USART1){</div><div class="notion-text notion-block-38c00bf5301841bf9c56c4f88f9ff6c1">}</div><div class="notion-text notion-block-7e54ff677ffc4bb987607ec5e4166564">}</div><div class="notion-text notion-block-1a7448469ab042708993e253372897d2">void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)</div><div class="notion-text notion-block-0f427f0122f14f64aab6699168ce2375">{	</div><div class="notion-text notion-block-c084f4a321254016a570bcd0b2e75f9b">if(huart-&gt;Instance == USART1){<div class="notion-text-children"><div class="notion-text notion-block-62a6d730a8c44379a214cef7e2a8ec13">uart1.TxState = 0;</div></div></div><div class="notion-text notion-block-3e592637716448e6b00717c70f5d28f8">}else if(huart-&gt;Instance == USART2){<div class="notion-text-children"><div class="notion-text notion-block-03b0f6a700d24ff38b3459b0362b727b">uart2.TxState = 0;</div></div></div><div class="notion-text notion-block-af294e58f5a74265b19dab430db341ce">}else if(huart-&gt;Instance == USART3){<div class="notion-text-children"><div class="notion-text notion-block-8b37016dfda4450988fc23159eadd758">uart3.TxState = 0;</div></div></div><div class="notion-text notion-block-09a6abea8b464853a1745cb0e4bc831e">}</div><div class="notion-text notion-block-24f7e4e0a16a4b349a029e602ad051fc">}</div><div class="notion-text notion-block-aa376532548949d4bbb6fec89bd9df09">void HAL_UART_AbortReceiveCpltCallback(UART_HandleTypeDef *huart)</div><div class="notion-text notion-block-a75444d34ae44addb588c705d71b1c36">{</div><div class="notion-text notion-block-dfb003f62f6d4bea938c296c603b1f71">if(huart-&gt;Instance == USART1){<div class="notion-text-children"><div class="notion-text notion-block-3c0cda79a061418c943d77d74ec31ca4">uart1.RxInPtr-&gt;end = &amp;U1_RxBuff[uart1.RxCounter - 1];</div><div class="notion-text notion-block-6a7415d4a5e8444e87ce031bed6a8a92">uart1.RxInPtr++;</div><div class="notion-text notion-block-71d67288b0fb4c74bc16f8212023f36d">if(uart1.RxInPtr == uart1.RxEndPtr){<div class="notion-text-children"><div class="notion-text notion-block-9eb5c0e2409b4f20973f21c262291635">uart1.RxInPtr = &amp;uart1.RxLocation[0];</div></div></div><div class="notion-text notion-block-b5acac250d9145258fea6be0c2014282">}<div class="notion-text-children"><div class="notion-text notion-block-117320aef9cd4d36ab893c67f3d7f757">if((U1_RX_SIZE - uart1.RxCounter)&lt;U1_RX_MAX){<div class="notion-text-children"><div class="notion-text notion-block-af1453c49a8f4928b080a0779ea843f8">uart1.RxCounter = 0;</div><div class="notion-text notion-block-2bcc922d1fc84a8bb8156079d328ef06">uart1.RxInPtr-&gt;start = U1_RxBuff;</div></div></div><div class="notion-text notion-block-f86228db2f3d4f44af482f3c6cd05fcd">}else{<div class="notion-text-children"><div class="notion-text notion-block-59a49a616ffe434cbaff08837bc2d45c">uart1.RxInPtr-&gt;start = &amp;U1_RxBuff[uart1.RxCounter];</div></div></div><div class="notion-text notion-block-2766fcadc8d44d5a8c07af4f7cf54973">}</div><div class="notion-text notion-block-a8d73a920520495d86f14d1f8615bd72">HAL_UART_Receive_DMA(&amp;uart1.uart,uart1.RxInPtr-&gt;start,U1_RX_MAX);</div><div class="notion-text notion-block-a6956d44cb9944969db5b5ec07a65b2e">}else if(huart-&gt;Instance == USART2){<div class="notion-text-children"><div class="notion-text notion-block-f273ac5d337341bbbbb4dc6dd0610048">uart2.RxInPtr-&gt;end = &amp;U2_RxBuff[uart2.RxCounter - 1];</div><div class="notion-text notion-block-a96c3aa195354493a03faefb4b8a94d0">uart2.RxInPtr++;</div><div class="notion-text notion-block-477566bf1f404a2ba94482c6ee413387">if(uart2.RxInPtr == uart2.RxEndPtr){<div class="notion-text-children"><div class="notion-text notion-block-d325f88e310941d5b38ba135e8a207fa">uart2.RxInPtr = &amp;uart2.RxLocation[0];</div></div></div><div class="notion-text notion-block-76aacc61d2db406ea6e303b2b23575c4">}</div><div class="notion-text notion-block-6f19658e5d0b464895efc8266695aeab">if((U2_RX_SIZE - uart2.RxCounter)&lt;U2_RX_MAX){<div class="notion-text-children"><div class="notion-text notion-block-ed021bc9953641ab8f9f5852435356ae">uart2.RxCounter = 0;</div><div class="notion-text notion-block-bc0a086c2c4e4ec3b101a8dd3c2be477">uart2.RxInPtr-&gt;start = U2_RxBuff;</div></div></div><div class="notion-text notion-block-2aa9e034a41741f4a06d9d3b3a93690f">}else{<div class="notion-text-children"><div class="notion-text notion-block-bd8a1f003c52428583591e2df9b03305">uart2.RxInPtr-&gt;start = &amp;U2_RxBuff[uart2.RxCounter];</div></div></div><div class="notion-text notion-block-0ee4351943da4a1cb16d244c43ba7c6f">}</div><div class="notion-text notion-block-66d306d7a48a4ea19bbffa01cbe691da">HAL_UART_Receive_DMA(&amp;uart2.uart,uart2.RxInPtr-&gt;start,U2_RX_MAX);</div></div></div><div class="notion-text notion-block-a82120ca1c774b3a9a4e6ae67b7dc285">}else if(huart-&gt;Instance == USART3){<div class="notion-text-children"><div class="notion-text notion-block-e7d274eb01f3489896113feae07b03d9">uart3.RxInPtr-&gt;end = &amp;U3_RxBuff[uart3.RxCounter - 1];</div><div class="notion-text notion-block-a5ca79b998214bff97aba45f25d6a4d1">uart3.RxInPtr++;</div><div class="notion-text notion-block-f2565363e86c40269916764c43903974">if(uart3.RxInPtr == uart3.RxEndPtr){<div class="notion-text-children"><div class="notion-text notion-block-4303be20eee0455d8cec5076a3569690">uart3.RxInPtr = &amp;uart3.RxLocation[0];</div></div></div><div class="notion-text notion-block-b0515d3b902948f89cd930cd6220ff17">}</div><div class="notion-text notion-block-692a0eb04e7b47bc8f082db61ed77a67">if((U3_RX_SIZE - uart3.RxCounter)&lt;U3_RX_MAX){<div class="notion-text-children"><div class="notion-text notion-block-621fdae2235f4214a7f5d9dd1784f3d2">uart3.RxCounter = 0;</div><div class="notion-text notion-block-f0fe0e3797624f7585d0d41f65316bf3">uart3.RxInPtr-&gt;start = U3_RxBuff;</div></div></div><div class="notion-text notion-block-2f06e241475f4ffb933b566a8323e239">}else{<div class="notion-text-children"><div class="notion-text notion-block-dbb72ddafe124cdb825e33420b67e63c">uart3.RxInPtr-&gt;start = &amp;U3_RxBuff[uart3.RxCounter];</div></div></div><div class="notion-text notion-block-ce7717f4234f46a6825b3bd4329786a0">}</div><div class="notion-text notion-block-e6c19f055aec43d197e2ffc223ed6c00">HAL_UART_Receive_DMA(&amp;uart3.uart,uart3.RxInPtr-&gt;start,U3_RX_MAX);</div></div></div><div class="notion-text notion-block-f7a38a70a8674c5994cdb7cda4e310e3">}</div></div></div></div></div><div class="notion-text notion-block-c2ba143c5b9645c5a4f35297320d213e">}</div><details class="notion-toggle notion-block-a5fb6c7e886246c7a46d6feeda173875"><summary><h4 class="notion-h notion-h3 notion-block-a5fb6c7e886246c7a46d6feeda173875" data-id="a5fb6c7e886246c7a46d6feeda173875"><span><div id="a5fb6c7e886246c7a46d6feeda173875" class="notion-header-anchor"></div><span class="notion-h-title">uart.h</span></span></h4></summary><div><div class="notion-text notion-block-00d20f2baf664ce1bcdfe062c50c1d61">#ifndef __UART_H</div><div class="notion-text notion-block-9fa17257f27f435abcef89985a2a15df">#define __UART_H</div><div class="notion-text notion-block-591ebc38892744bfa8d9bfed0b71619d">#include &quot;string.h&quot;</div><div class="notion-text notion-block-8a8205a3b4de4644ad6937485816e296">#include &quot;stdint.h&quot;</div><div class="notion-text notion-block-0da005f88ab145f59d15931f31dd306e">#include &quot;stm32f1xx_hal_uart.h&quot;</div><div class="notion-text notion-block-a2cdba285e2446f0a2ec83a5af2f7261">#include &quot;stm32f1xx_hal_dma.h&quot;</div><div class="notion-text notion-block-a6de1a57336f40ea9e24571dd29ede97">#define U1_TX_SIZE 2048</div><div class="notion-text notion-block-849a4cb4d46f414ea94d07e875516c8b">#define U1_RX_SIZE 2048</div><div class="notion-text notion-block-088d5a3448764e7294c1d33767213661">#define U1_RX_MAX  256</div><div class="notion-text notion-block-02b4b62147ba4cce815d83f00b7e3ca5">#define U2_TX_SIZE 2048</div><div class="notion-text notion-block-5efae302dd89408880861bd10f28859c">#define U2_RX_SIZE 2048</div><div class="notion-text notion-block-5a140e05f59942d78920b524cf94979e">#define U2_RX_MAX  256</div><div class="notion-text notion-block-2b0f059ebe514206ad9fd0510e5ca4b5">#define U3_TX_SIZE 2048</div><div class="notion-text notion-block-b9b7224c8df648b1876f5b9fa041d5b2">#define U3_RX_SIZE 2048</div><div class="notion-text notion-block-b900d1a354a94e0182d65a09b1e899cb">#define U3_RX_MAX  256</div><div class="notion-text notion-block-d734d840367642dc92efae6ec87d5711">typedef struct{<div class="notion-text-children"><div class="notion-text notion-block-b9d8fd2dd82b4936b6703dd0e09a55af">uint8_t  *start;</div><div class="notion-text notion-block-9ab17ce85c524be9825d3d760c6dbd78">uint8_t  *end;</div></div></div><div class="notion-text notion-block-3a421fd7e17c413a88714c7fd4571b3c">}LCB;</div><div class="notion-text notion-block-fee667e1255741d3850107a858ebaabe">typedef struct{<div class="notion-text-children"><div class="notion-text notion-block-1c9ba03a24fd4dbb98071e5ef6f42b61">uint32_t  RxCounter;</div><div class="notion-text notion-block-8d7609d3ea0f4ce4b2a93dadc5a7a8c6">uint32_t  TxCounter;</div><div class="notion-text notion-block-3f87a49134464ce7996d2a7787beb4ce">uint32_t  TxState;</div><div class="notion-text notion-block-ee8e2dee9561447187fb317699c870fe">LCB       RxLocation[10];</div><div class="notion-text notion-block-d6a87419bcc74da08cbe8314bbd69fbc">LCB       TxLocation[10];</div><div class="notion-text notion-block-6e814fb2ba774df7b39ca26c9c84b4e8">LCB      *RxInPtr;</div><div class="notion-text notion-block-fd58d1538d8144279e4cbd35f0912af1">LCB      *RxOutPtr;</div><div class="notion-text notion-block-70e8cec1bca44d4586bf67c804878de4">LCB      *RxEndPtr;</div><div class="notion-text notion-block-00923fe6bb2a488e9c2e876bf5ef56de">LCB      *TxInPtr;</div><div class="notion-text notion-block-b76ca45e8d8b45c1ab2408d86732841d">LCB      *TxOutPtr;</div><div class="notion-text notion-block-f0c2d6b2bd6544ad9e70c113afbf9e1d">LCB      *TxEndPtr;</div><div class="notion-text notion-block-29c914d574504841884508188c023b6c">UART_HandleTypeDef uart;</div><div class="notion-text notion-block-8be2eaa50384451481a64313332aa119">DMA_HandleTypeDef dmatx;</div><div class="notion-text notion-block-3e8fd10e709b4fe9b3602722d1fbba5f">DMA_HandleTypeDef dmarx;</div></div></div><div class="notion-text notion-block-d446342ce80f46c7af56f7445181c388">}UCB;</div><div class="notion-text notion-block-040698ea6439462280d8ed2b19f5e057">void U1_Init(uint32_t bandrate);</div><div class="notion-text notion-block-a79419f16cdd46d281c2bb25baa719bd">void U2_Init(uint32_t bandrate);</div><div class="notion-text notion-block-a8217a1d97f043389ae70251021f5550">void U3_Init(uint32_t bandrate);</div><div class="notion-text notion-block-368181bee6324751b22102b7351e01ee">void U1_PtrInit(void);</div><div class="notion-text notion-block-d5d24cb84233448ea2afd6ce4d1d6790">void U2_PtrInit(void);</div><div class="notion-text notion-block-a3121de2150a4cae8c22b1d7033cbe1d">void U3_PtrInit(void);</div><div class="notion-text notion-block-a7d9dd6f54e74ee8b2e909b0d35d54a5">void U1_Txdata(uint8_t *data, uint32_t data_len);</div><div class="notion-text notion-block-d080d5d113f4495c9d208b9d54bc1ce8">void U2_Txdata(uint8_t *data, uint32_t data_len);</div><div class="notion-text notion-block-a58f151adb4d43f8b0f9f45024546311">void U3_Txdata(uint8_t *data, uint32_t data_len);</div><div class="notion-text notion-block-1a8831ef218c478c92bc5cb685ee04c3">extern UCB  uart1;</div><div class="notion-text notion-block-b11f4492323a448a9579a32cbc3be959">extern UCB  uart2;</div><div class="notion-text notion-block-299f368fadc84b598e19539ce85c14c5">extern UCB  uart3;</div><div class="notion-text notion-block-a9bfa2256ce74969ad4e87bce1554079">#endif</div></div></details><details class="notion-toggle notion-block-c5cf3870ad814aa78c9395fd615c1404"><summary><h4 class="notion-h notion-h3 notion-block-c5cf3870ad814aa78c9395fd615c1404" data-id="c5cf3870ad814aa78c9395fd615c1404"><span><div id="c5cf3870ad814aa78c9395fd615c1404" class="notion-header-anchor"></div><span class="notion-h-title">sw.c</span></span></h4></summary><div><div class="notion-text notion-block-8db257235a6c4e2a8d31bf7a648cb2c1">#include &quot;stm32f1xx_hal.h&quot;</div><div class="notion-text notion-block-7a913dfb702740f9a4fee43f8208ddd2">#include &quot;sw.h&quot;</div><div class="notion-text notion-block-e18356347e9542b3b7c6987dbfad9701">#include &quot;uart.h&quot;</div><div class="notion-text notion-block-6aa1e0061c434b2098c80ab3dd84b853">uint8_t sw1_sta,sw2_sta;    //0:没有按下  1：按下了</div><div class="notion-text notion-block-a732bf8716f2490fb329a0ee86633407">void SW_Init(void){<div class="notion-text-children"><div class="notion-text notion-block-29882a779c524a74ae9681385c7420cf">GPIO_InitTypeDef GPIO_InitType;</div><div class="notion-text notion-block-cbcaa010936a4b0bb936d5fea9b5c102">__HAL_RCC_GPIOC_CLK_ENABLE();</div><div class="notion-text notion-block-6a14023db4bb46a7b733c3915688a631">GPIO_<a class="notion-link" href="http://InitType.Pin" target="_blank" rel="noopener noreferrer">InitType.Pin</a> = GPIO_PIN_14;</div><div class="notion-text notion-block-1f6360d26f2b4d92bb833d83e2c388ce">GPIO_InitType.Mode = GPIO_MODE_INPUT;</div><div class="notion-text notion-block-b3576fa43e2d49ffae37b806b4e1e704">GPIO_InitType.Pull = GPIO_PULLDOWN;</div><div class="notion-text notion-block-2f1b1ca87f3b4bbf874b57b9e2c95c2f">HAL_GPIO_Init(GPIOC,&amp;GPIO_InitType);</div><div class="notion-text notion-block-46b4893c207e4f49a49518393fa74367">__HAL_RCC_GPIOA_CLK_ENABLE();</div><div class="notion-text notion-block-f5d8bcef67064fa7a827fb15cb2c793b">GPIO_<a class="notion-link" href="http://InitType.Pin" target="_blank" rel="noopener noreferrer">InitType.Pin</a> = GPIO_PIN_0;</div><div class="notion-text notion-block-899d4e0c5a2140f59823fb581f65b93a">GPIO_InitType.Mode = GPIO_MODE_INPUT;</div><div class="notion-text notion-block-b74441ff24734a8faf38adfe738ec15a">GPIO_InitType.Pull = GPIO_PULLDOWN;</div><div class="notion-text notion-block-6795ef20cab64390be6cd280306733fa">HAL_GPIO_Init(GPIOA,&amp;GPIO_InitType);</div></div></div><div class="notion-text notion-block-689a037096ba4fbd9de8216818ae31f8">}</div><div class="notion-text notion-block-4388ad4c174146a39634afa5ad37a608">void SW_InitEvent(void){</div><div class="notion-text notion-block-39a64a5202c9487da7f939696cebc0d1">GPIO_InitTypeDef GPIO_InitType;</div><div class="notion-text notion-block-91dfd0fddfdf4ef69371051bfd38db7d">//SW1</div><div class="notion-text notion-block-1f53e5ffbfcb44f9891b73930cd8e3e3">__HAL_RCC_GPIOA_CLK_ENABLE();</div><div class="notion-text notion-block-8cdacc2b269049b6bee4037d958bffa2">GPIO_<a class="notion-link" href="http://InitType.Pin" target="_blank" rel="noopener noreferrer">InitType.Pin</a> = GPIO_PIN_2;</div><div class="notion-text notion-block-2bec01e11b1a4323ac7be0c909e852fd">GPIO_InitType.Mode = GPIO_MODE_EVT_RISING_FALLING;</div><div class="notion-text notion-block-fba8b37c1ddd4ad3bcd8ab2e8ceda39b">GPIO_InitType.Pull = GPIO_PULLUP;</div><div class="notion-text notion-block-4723216512f74e2385844df7831a3eb9">HAL_GPIO_Init(GPIOA,&amp;GPIO_InitType);</div><div class="notion-text notion-block-9d8a425e16d7491b873f2c928856e807">}</div><div class="notion-text notion-block-e40df20afad14799b727fe6118302800">void SW_InitEventOut(void){</div><div class="notion-text notion-block-6c3f3caa06fe4ab7be468ca37c115c5e">GPIO_InitTypeDef GPIO_InitType;</div><div class="notion-text notion-block-8ffdb9d04d6941798cb50b11f30c9bfe">//PA3</div><div class="notion-text notion-block-22a0ada0b12d4e628ad223f0e7f9e194">__HAL_RCC_GPIOA_CLK_ENABLE();</div><div class="notion-text notion-block-1eb7835951a345d49bc400c50703216e">__HAL_RCC_AFIO_CLK_ENABLE();</div><div class="notion-text notion-block-bbb1fdbb3069400fa4e2c24ee3569f08">GPIO_<a class="notion-link" href="http://InitType.Pin" target="_blank" rel="noopener noreferrer">InitType.Pin</a> = GPIO_PIN_3;</div><div class="notion-text notion-block-e82d44e0d6564217875a1e0af498983f">GPIO_InitType.Mode = GPIO_MODE_AF_PP;</div><div class="notion-text notion-block-ab8c4601d0fb4fcc9135b96de0731ccc">GPIO_InitType.Speed = GPIO_SPEED_FREQ_HIGH;</div><div class="notion-text notion-block-51627315cc8f4e8b83d20787d60cf5e1">HAL_GPIO_Init(GPIOA,&amp;GPIO_InitType);</div><div class="notion-text notion-block-76d3104dd6524c57840fd2369fe00beb">HAL_GPIOEx_ConfigEventout(AFIO_EVENTOUT_PORT_A,AFIO_EVENTOUT_PIN_3);</div><div class="notion-text notion-block-ee8afc6c82a04a7faa8993699ed2e20d">HAL_GPIOEx_EnableEventout();</div><div class="notion-text notion-block-446badb4f01c430489f77080459eb526">}</div><div class="notion-text notion-block-06b020f2a0fa4a569e69d9a8ab88c546">//mode 0：按下执行  1：抬起执行</div><div class="notion-text notion-block-4c8ccb056324475fb08d8cb5ffa9ab9b">void SW_Init_IT(uint8_t mode){</div><div class="notion-text notion-block-b7c5c894bbaa470e9095d3042f13ee01">GPIO_InitTypeDef GPIO_InitType;</div><div class="notion-text notion-block-0e979e4e716e456bb4b016cef93d3cb6">__HAL_RCC_GPIOC_CLK_ENABLE();</div><div class="notion-text notion-block-d2cfc619d30f40a4a9d5ff1cf74312cf">GPIO_<a class="notion-link" href="http://InitType.Pin" target="_blank" rel="noopener noreferrer">InitType.Pin</a> = GPIO_PIN_14;</div><div class="notion-text notion-block-8182b1a02f2f4879ab46a2921657af9a">if(mode == 0)<div class="notion-text-children"><div class="notion-text notion-block-0bc036061f684eea8f6aa3b1d37508ce">GPIO_InitType.Mode = GPIO_MODE_IT_RISING;</div></div></div><div class="notion-text notion-block-1b0e42efe0824bcaa732e3071a9a4719">else<div class="notion-text-children"><div class="notion-text notion-block-47050af145954befa33326fad860ab71">GPIO_InitType.Mode = GPIO_MODE_IT_FALLING;</div></div></div><div class="notion-text notion-block-eb5d0d9cefd04738a940c20d6efa0eb9">GPIO_InitType.Pull = GPIO_PULLDOWN;</div><div class="notion-text notion-block-47a173607a944dcda36d76b6b067d433">HAL_GPIO_Init(GPIOC,&amp;GPIO_InitType);</div><div class="notion-text notion-block-2c0e40c92b314bcb82ff891e3df33e89">HAL_NVIC_SetPriority(EXTI15_10_IRQn,4,0);</div><div class="notion-text notion-block-89a7eee01f9045459774fc94976a90c1">HAL_NVIC_EnableIRQ(EXTI15_10_IRQn);</div><div class="notion-text notion-block-a6c86cb24b184412ab7ad5c07d0ca183">__HAL_RCC_GPIOA_CLK_ENABLE();</div><div class="notion-text notion-block-2a16a824a2d0495f9abff9ed5d947a31">GPIO_<a class="notion-link" href="http://InitType.Pin" target="_blank" rel="noopener noreferrer">InitType.Pin</a> = GPIO_PIN_0;</div><div class="notion-text notion-block-b293625bf092466ba963cca198ba037a">if(mode == 0)<div class="notion-text-children"><div class="notion-text notion-block-d59377f8aee744968e54129139aaa1f3">GPIO_InitType.Mode = GPIO_MODE_IT_RISING;</div></div></div><div class="notion-text notion-block-31659d536a2f476ca5c91c69710bf0a1">else<div class="notion-text-children"><div class="notion-text notion-block-48b67e9a104e4abeaa02d410ee00f31e">GPIO_InitType.Mode = GPIO_MODE_IT_FALLING;</div></div></div><div class="notion-text notion-block-c154cefb2dfa40f49140afef30782a10">GPIO_InitType.Pull = GPIO_PULLDOWN;</div><div class="notion-text notion-block-a82ac7e89ce541f8b56b59efcd1d0f1e">HAL_GPIO_Init(GPIOA,&amp;GPIO_InitType);</div><div class="notion-text notion-block-796b45576d4e470cac289a3c594c5d9a">HAL_NVIC_SetPriority(EXTI0_IRQn,3,0);</div><div class="notion-text notion-block-3bf019fb250f4d2c917b7ec1a55d186b">HAL_NVIC_EnableIRQ(EXTI0_IRQn);</div><div class="notion-text notion-block-a6b2d2a6f5d14b4eb19e195a677f6201">}</div><div class="notion-text notion-block-0fbcc8a0305c489fb7bae2f35569b794">void SW_Init_IT2(void){</div><div class="notion-text notion-block-20e313daa2254841a599bbd9067bc5ee">GPIO_InitTypeDef GPIO_InitType;</div><div class="notion-text notion-block-4ca140224e7442a59e5e4232bf1c10b0">__HAL_RCC_GPIOC_CLK_ENABLE();</div><div class="notion-text notion-block-3e85f4e34f5846afaf2fe1889c619167">GPIO_<a class="notion-link" href="http://InitType.Pin" target="_blank" rel="noopener noreferrer">InitType.Pin</a> = GPIO_PIN_14;</div><div class="notion-text notion-block-1b00603757f348f58916a035a522bc7f">GPIO_InitType.Mode = GPIO_MODE_IT_RISING_FALLING;</div><div class="notion-text notion-block-49650509ddd14387b1d5ddcae02b5451">GPIO_InitType.Pull = GPIO_PULLDOWN;</div><div class="notion-text notion-block-1839e39837fa4a3c8c35bd625ecb5dca">HAL_GPIO_Init(GPIOC,&amp;GPIO_InitType);</div><div class="notion-text notion-block-d2a12b9ecb6b4e11ba2c7d0da89f1e68">HAL_NVIC_SetPriority(EXTI15_10_IRQn,4,0);<div class="notion-text-children"><div class="notion-text notion-block-e3dc4da9f2034b0ab0b907fca940d8f6">HAL_NVIC_EnableIRQ(EXTI15_10_IRQn);</div><div class="notion-text notion-block-5b95cbccce3f40b68ab29ab918888d2a">__HAL_RCC_GPIOA_CLK_ENABLE();</div><div class="notion-text notion-block-bd2be776fce9470d88bd1776e6f2e5d0">GPIO_<a class="notion-link" href="http://InitType.Pin" target="_blank" rel="noopener noreferrer">InitType.Pin</a> = GPIO_PIN_0;</div><div class="notion-text notion-block-5dfacb758dfc4065afc20591dd8d13d0">GPIO_InitType.Mode = GPIO_MODE_IT_RISING_FALLING;</div><div class="notion-text notion-block-f41136a0bde74056bc5dc923b8320b4c">GPIO_InitType.Pull = GPIO_PULLUP;</div><div class="notion-text notion-block-ea1c0e494c8b4e248694f1c5add7f3de">HAL_GPIO_Init(GPIOA,&amp;GPIO_InitType);</div><div class="notion-text notion-block-b36dc838cad94cb1a43390252aaa18e3">HAL_NVIC_SetPriority(EXTI0_IRQn,3,0);</div><div class="notion-text notion-block-9d9c9ffb37404d23b6f543600c73c8d5">HAL_NVIC_EnableIRQ(EXTI0_IRQn);</div></div></div><div class="notion-text notion-block-e4d62caf687a43809c66486604b8a076">}</div><div class="notion-text notion-block-c920c9d6b746455498e55c9316585da6">//返回值  0：无按键触发  8：SW8触发</div><div class="notion-text notion-block-071212d5ebab4cca907528ec6d106916">//mode 0：按下执行  1：抬起执行</div><div class="notion-text notion-block-a1bc619da3da4cfeaa845fd9c650982a">uint8_t SW_Scan(uint8_t mode){</div><div class="notion-text notion-block-0805962845ae4ecf8c2c31a99cebd46d">uint32_t i;</div><div class="notion-text notion-block-3e098e4446a04ad891dee984d8d6031f">/<em>-------------SW8------------------</em>/</div><div class="notion-text notion-block-dd31b5dd46bb473c9523e615a5645f7b">if((SW1_IN == 1)&amp;&amp;(sw1_sta == 0)){<div class="notion-text-children"><div class="notion-text notion-block-fb0ac76c57354621ba76708a8f4dd1bc">for(i=0;i&lt;0x7FFF;i++){<div class="notion-text-children"><div class="notion-text notion-block-3d2b2d116548439dbd06f17511e0d6b8">if(SW1_IN == 0){<div class="notion-text-children"><div class="notion-text notion-block-47e2ba12ba494311899bc4a3bc501c55">return 0;</div></div></div><div class="notion-text notion-block-da7f3c56b51241c5afa81b3fce72554b">}</div></div></div><div class="notion-text notion-block-93f1cbd16eba42d49a864c99080c8730">}</div><div class="notion-text notion-block-3adaaf10fd744396873e1143ebd9b3ab">sw1_sta = 1;</div><div class="notion-text notion-block-697f3749d2814ffbbca26e839db786cb">if(mode == 0){<div class="notion-text-children"><div class="notion-text notion-block-d848eef50c15481185ee031564d38e0e">return 8;</div></div></div><div class="notion-text notion-block-98029f5b01224fa6bb8de64d22a3e995">}</div></div></div><div class="notion-text notion-block-2d06c941289449fe99bdb4a875d52b8f">}else if((SW1_IN == 0)&amp;&amp;(sw1_sta == 1)){<div class="notion-text-children"><div class="notion-text notion-block-136d3577ce6345698b7e74ca68ff022f">for(i=0;i&lt;0x7FFF;i++){<div class="notion-text-children"><div class="notion-text notion-block-1c8acb3d3ed64880be7112fa24a1eba7">if(SW1_IN == 1){<div class="notion-text-children"><div class="notion-text notion-block-7f01a930e0874f77b2fe8aca2f0ea72a">return 0;</div></div></div><div class="notion-text notion-block-568b91d4e6da478e8e2bb83d9a66235a">}</div></div></div><div class="notion-text notion-block-d165233c98b640bab014895abefabe10">}</div><div class="notion-text notion-block-93b3c1ee9ab443f88da514c0e630e43f">sw1_sta = 0;</div><div class="notion-text notion-block-827a9d58d86a493695d9c37551ccbfcc">if(mode == 1){<div class="notion-text-children"><div class="notion-text notion-block-5ab49d45164a45d58fe2909f3c6ffb78">return 8;</div></div></div><div class="notion-text notion-block-f7116dcd5937486b96a194ac70f4ad59">}</div></div></div><div class="notion-text notion-block-9b53ee861110498e9cabe2c7e54588cb">}</div><div class="notion-text notion-block-e0a1ebcd8ca74e0bb3157c25630b9267">/<em>-------------SW11------------------</em>/</div><div class="notion-text notion-block-d943a688f2c74049806302cf7bc217d1">if((SW2_IN == 0)&amp;&amp;(sw2_sta == 0)){<div class="notion-text-children"><div class="notion-text notion-block-b327210a3f5d47a2bbbfa7764a21a7a0">for(i=0;i&lt;0x7FFF;i++){<div class="notion-text-children"><div class="notion-text notion-block-3c9cfd1e3b6c46ae86329278e771666a">if(SW2_IN == 1){<div class="notion-text-children"><div class="notion-text notion-block-fdf68a459eaa4526b7741c2496516990">return 0;</div></div></div><div class="notion-text notion-block-d410a03a923c4572af5b181cc40f4121">}</div></div></div><div class="notion-text notion-block-45af389aaddd44feb62f2f2701734227">}</div><div class="notion-text notion-block-1db4653e297c414a8933441ce64a20ca">sw2_sta = 1;</div><div class="notion-text notion-block-60b5f0f1f2b047c2b91dd19a576d44e4">if(mode == 0){<div class="notion-text-children"><div class="notion-text notion-block-509e004a0d0344d7a7cb462682c19080">return 11;</div></div></div><div class="notion-text notion-block-5c6e318c037b436fa59fa92811eba79f">}</div></div></div><div class="notion-text notion-block-0de4fe101ea347fc8078e9b2af90a44d">}else if((SW2_IN == 1)&amp;&amp;(sw2_sta == 1)){<div class="notion-text-children"><div class="notion-text notion-block-07004fad00aa489cab4ebf604e35c957">for(i=0;i&lt;0x7FFF;i++){<div class="notion-text-children"><div class="notion-text notion-block-1fc01e4bdc304e8c977dcbe5a5bc9125">if(SW2_IN == 0){<div class="notion-text-children"><div class="notion-text notion-block-92d9b27c4e944975a2ad36d02c5d6d82">return 0;</div></div></div><div class="notion-text notion-block-c2c4c2987d6c4f56a33fc5f963fd8de8">}</div></div></div><div class="notion-text notion-block-58c0e43a8a0147c0b0713afc2c0921dc">}</div><div class="notion-text notion-block-d2fe6c43b8164efab597db7628810d82">sw2_sta = 0;</div><div class="notion-text notion-block-9c2b85876a844adaa78fdfda10e9536b">if(mode == 1){<div class="notion-text-children"><div class="notion-text notion-block-9db424e7fd3449618412467d5b66d358">return 11;</div></div></div><div class="notion-text notion-block-698dc3c17f794119b70390f9409b61c7">}</div></div></div><div class="notion-text notion-block-149be02c88454656b9cb8896fa746bcf">}</div><div class="notion-text notion-block-e056d0b990414410a71f36802a5b68a3">return 0;</div><div class="notion-text notion-block-f7ca0d7564194238a124ecffc3684d10">}</div><div class="notion-text notion-block-2de94bea62014c028f8370cae9214e07">void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)</div><div class="notion-text notion-block-71e77b048ef045588afa52ba7a0fa773">{</div><div class="notion-text notion-block-e83848a8c4c942bc9027adeb53909ba3">uint32_t i;</div><div class="notion-text notion-block-212eb316be724b098338d55c6e5dfb7f">//SW8:PC13  SW11:PA0（抢占优先级高）</div><div class="notion-text notion-block-63eb4675dc534157a38f0c00efcd7b5a">switch(GPIO_Pin){<div class="notion-text-children"><div class="notion-text notion-block-df8635eb4d27400695a0f2a45c5cd6e0">case GPIO_PIN_14:	if(SW1_IN == 1){<div class="notion-text-children"><div class="notion-text notion-block-9c7b5c45c1e64db2b1b187d42c6a8cee">for(i=0;i&lt;0x7FFF;i++){<div class="notion-text-children"><div class="notion-text notion-block-d2eafb392a774735a8d5e759dda2f4fa">if(SW1_IN == 0){<div class="notion-text-children"><div class="notion-text notion-block-1f8624241f4d481dabf769ae647d364a">return;</div></div></div><div class="notion-text notion-block-990f162298cf4a8498ca786b87534fd6">}</div></div></div><div class="notion-text notion-block-c504c7d2543045a6b468123ded7a909c">}</div><div class="notion-text notion-block-63bbcae9e81a4572a697b2f082e13b55">U1_Txdata((uint8_t *)&quot;x81S1_LED&quot;,7);</div><div class="notion-text notion-block-7dc21444bdcf4c66949029540409dce6">//U2_Txdata((uint8_t *)&quot;LED_ON&quot;,6);</div><div class="notion-text notion-block-4910c676e2174510a31f188fc57e7e67">//U3_Txdata((uint8_t *)&quot;LED_ON&quot;,6);</div><div class="notion-text notion-block-bf4556ba0846490fbd8010a7912d26bc">}else if(SW1_IN == 0){<div class="notion-text-children"><div class="notion-text notion-block-9ea891bfd8c846b4b73d254b4cef2ba6">for(i=0;i&lt;0x7FFF;i++){<div class="notion-text-children"><div class="notion-text notion-block-3c091645978743a19906916ac3d72a72">if(SW1_IN == 1){<div class="notion-text-children"><div class="notion-text notion-block-591fa55fc0754080a7a288e72cb2b9ee">return;</div></div></div><div class="notion-text notion-block-e143d301091e44e48d4c3c9492c39fe5">}</div></div></div><div class="notion-text notion-block-fbe2c12d3baa444c8636c285c1447111">}</div><div class="notion-text notion-block-d32ad90a3af3482891ce1261c4a7242a">HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_0);</div></div></div><div class="notion-text notion-block-51ee4acdc1cb4aeab54143f103e34a87">} </div><div class="notion-text notion-block-f6d96f7728374f60839001f77ca197df">break;</div></div></div><div class="notion-text notion-block-e80f2d785b1f4928a46cf7086ca538ba">case GPIO_PIN_0:    if(SW2_IN == 1){<div class="notion-text-children"><div class="notion-text notion-block-0943d03f1eb74f5584594f52d41fe59c">for(i=0;i&lt;0x7FFF;i++){<div class="notion-text-children"><div class="notion-text notion-block-2d1ecacfe5e24930b7175e06601e96e9">if(SW2_IN == 0){<div class="notion-text-children"><div class="notion-text notion-block-8903b46d0a4b4a0d9f9f3a3f72828acc">return;</div></div></div><div class="notion-text notion-block-15f94393c28c41cd9d4ec6656f36f645">}</div></div></div><div class="notion-text notion-block-f2b91e2d53fd43c6a1579dae41d3c552">}</div><div class="notion-text notion-block-5ef93d07d6d24bbca7c68254d45ba871">U1_Txdata((uint8_t *)&quot;x82S2_LED&quot;,7);</div><div class="notion-text notion-block-e415177796a64811926a3b1ecc5ee85b">//U2_Txdata((uint8_t *)&quot;LED_OFF&quot;,7);</div><div class="notion-text notion-block-26539056c1724017b5731a96fe9f1e63">//U3_Txdata((uint8_t *)&quot;LED_OFF&quot;,7);</div><div class="notion-text notion-block-f7daa7826dc247bfbf25fa99a80cddc0">}else if(SW2_IN == 1){<div class="notion-text-children"><div class="notion-text notion-block-9a3c34b7eba94cd59a6b8040e36cba62">for(i=0;i&lt;0x7FFF;i++){<div class="notion-text-children"><div class="notion-text notion-block-42c7997dab5c4d9caf75852175c5cafa">if(SW2_IN == 0){<div class="notion-text-children"><div class="notion-text notion-block-b03d862d7a4e4afc8ae399168120c08c">return;</div></div></div><div class="notion-text notion-block-5f848dfe738e49cb86e48fcc11184155">}</div></div></div><div class="notion-text notion-block-0b1ae0ed7b6344b5ade5dc32ee3bde04">}</div><div class="notion-text notion-block-c91219929c17417d863af944428a5b16">HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_0);</div></div></div><div class="notion-text notion-block-632eb9f973fe44febfec3e8466f8cf44">}</div><div class="notion-text notion-block-c394face395944398c00dea423b44b90">break;</div></div></div></div></div><div class="notion-text notion-block-69ca49e7f8f34ceb992ff58478e08443">}</div><div class="notion-text notion-block-efe3b10f8afd496584a709c9b8e9a8e2">}</div><details class="notion-toggle notion-block-7acbe508d47c448c95ec5c4ccba4b107"><summary><h4 class="notion-h notion-h3 notion-block-7acbe508d47c448c95ec5c4ccba4b107" data-id="7acbe508d47c448c95ec5c4ccba4b107"><span><div id="7acbe508d47c448c95ec5c4ccba4b107" class="notion-header-anchor"></div><span class="notion-h-title">sw.h</span></span></h4></summary><div><div class="notion-text notion-block-68a899abf7b74dcbacb11cac099e11d6">#ifndef __SW_H</div><div class="notion-text notion-block-54be6e35b9c04e83ab248aa4221293ca">#define __SW_H</div><div class="notion-text notion-block-3547bee571a3437091fb7477fba55921">#include &quot;stdint.h&quot;</div><div class="notion-text notion-block-a813678d7a374fd291a5a359549c171c">#define  SW1_IN   HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_14)</div><div class="notion-text notion-block-1df9f1c21dad4559ba26b26b926dcbbf">#define  SW2_IN  HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)</div><div class="notion-text notion-block-37c26f12411d4cf18ddc21bdcb2e45cf">void SW_Init(void);</div><div class="notion-text notion-block-6f5a2d45ec744d138c8a96a32fa75cf2">uint8_t SW_Scan(uint8_t mode);</div><div class="notion-text notion-block-4117699d98354a31a07b0b5f8884f6cf">void SW_Init_IT(uint8_t mode);</div><div class="notion-text notion-block-ea6822ac027b456289802fcb64bf5fcb">void SW_Init_IT2(void);</div><div class="notion-text notion-block-2937bd788f27452cbe2e95a0f5277cba">void SW_InitEvent(void);</div><div class="notion-text notion-block-af39c9f3ed4a461ea1a20f800f8e4225">void SW_InitEventOut(void);</div><div class="notion-text notion-block-365e4cf4cde74598871e40193353bdf1">#endif</div></div></details><details class="notion-toggle notion-block-265a8f0a6fb841e69b463111b255023d"><summary><h4 class="notion-h notion-h3 notion-block-265a8f0a6fb841e69b463111b255023d" data-id="265a8f0a6fb841e69b463111b255023d"><span><div id="265a8f0a6fb841e69b463111b255023d" class="notion-header-anchor"></div><span class="notion-h-title">led.c</span></span></h4></summary><div><div class="notion-text notion-block-c8bf64a996994cd5bd049aa96e62a0f4">#include &quot;stm32f1xx_hal.h&quot;</div><div class="notion-text notion-block-a025a8aa315741cba880c98b7bebecd1">#include &quot;led.h&quot;</div><div class="notion-text notion-block-bf8d02ee5e354ca48b76b0c5d8ea2adf">void LED_Init(void){<div class="notion-text-children"><div class="notion-text notion-block-fdbc346b80ce443ab09f49120337c8e0">GPIO_InitTypeDef GPIO_InitType;</div><div class="notion-text notion-block-875b9b0add534c2190ff9270fb6ce578">__HAL_RCC_GPIOC_CLK_ENABLE();</div><div class="notion-text notion-block-337a890f7dd24f23bddac8aa3e8b900b">GPIO_<a class="notion-link" href="http://InitType.Pin" target="_blank" rel="noopener noreferrer">InitType.Pin</a> = GPIO_PIN_13;</div><div class="notion-text notion-block-56753e87e18c45a397a6673b17525275">GPIO_InitType.Mode = GPIO_MODE_OUTPUT_PP;</div><div class="notion-text notion-block-d8c20f9313a142d9a21c3ed7d316c6ce">GPIO_InitType.Speed = GPIO_SPEED_FREQ_LOW;</div><div class="notion-text notion-block-a4aaa364d7204fa58a3c17ce2ce6b473">HAL_GPIO_Init(GPIOC,&amp;GPIO_InitType);</div><div class="notion-text notion-block-bbeb1af91c42449fbc6ef73059c9852c">HAL_GPIO_WritePin(GPIOC,GPIO_PIN_13,GPIO_PIN_RESET);</div></div></div><div class="notion-text notion-block-4c4bfd6d19a2494d838560b2428bd8ee">}</div><div class="notion-text notion-block-29c8062f78e242c2afce5e7b73ef483e">void LED_ON(void){<div class="notion-text-children"><div class="notion-text notion-block-f5ed3874785a4d2fbe1808ff89d717bf">HAL_GPIO_WritePin(GPIOC,GPIO_PIN_13,GPIO_PIN_SET);</div></div></div><div class="notion-text notion-block-423eba73a07941efbe6d46d581273154">}</div><div class="notion-text notion-block-d608c9a016a24c6ca7af970eb7e13e84">void LED_OFF(void){<div class="notion-text-children"><div class="notion-text notion-block-8dc24c7a5e24493cabdae3b1c59cc039">HAL_GPIO_WritePin(GPIOC,GPIO_PIN_13,GPIO_PIN_RESET);</div></div></div><div class="notion-text notion-block-9a70cea33c6e4e8a8f498380933f6bc9">}</div><div class="notion-text notion-block-62a51ea4ab164702983e787e00ecc96e">void LED_Toggle(void){<div class="notion-text-children"><div class="notion-text notion-block-d443137936084504a628ad2307324d11">HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_13);</div></div></div><div class="notion-text notion-block-a0cf87480eb74dd5b1b980df6d2c0ceb">}</div></div></details><details class="notion-toggle notion-block-b62089fe3c814605b2c59c895fec51e4"><summary><h4 class="notion-h notion-h3 notion-block-b62089fe3c814605b2c59c895fec51e4" data-id="b62089fe3c814605b2c59c895fec51e4"><span><div id="b62089fe3c814605b2c59c895fec51e4" class="notion-header-anchor"></div><span class="notion-h-title">led.h</span></span></h4></summary><div><div class="notion-text notion-block-2c7170bd177343858c57fb1ea9ddf6a3">#ifndef __LED_H</div><div class="notion-text notion-block-edb686cd0e194c04a1aab03aa6152cd5">#define __LED_H</div><div class="notion-text notion-block-01d2c74eaa894a948d909d5c14413c23">void LED_Init(void);</div><div class="notion-text notion-block-b0eec189e8024a4ab4f6e670889f95a2">void LED_ON(void);</div><div class="notion-text notion-block-c2167a2932ad4e35b25a46c426b1771e">void LED_OFF(void);</div><div class="notion-text notion-block-cc867e5022b04102a1bf59f707ccc9a5">void LED_Toggle(void);</div><div class="notion-text notion-block-0659982bdcc94015a128b0d6109a7a0a">#endif</div></div></details></div></details><details class="notion-toggle notion-block-805ed2f9166f4874bd6b1fd00e6a7877"><summary><h4 class="notion-h notion-h3 notion-block-805ed2f9166f4874bd6b1fd00e6a7877" data-id="805ed2f9166f4874bd6b1fd00e6a7877"><span><div id="805ed2f9166f4874bd6b1fd00e6a7877" class="notion-header-anchor"></div><span class="notion-h-title">stm32f1xx_it.c</span></span></h4></summary><div><div class="notion-text notion-block-a30e768ce9b04864b3371b794ee50400">/<em>-------------------------------------------------</em>/</div><div class="notion-text notion-block-227ceb52659e402db3d534a3b90acc95">/<em>                                                 </em>/</div><div class="notion-text notion-block-d05902126aa148ca946971104cd7a172">/<em>          实现各种中断服务函数的源文件           </em>/</div><div class="notion-text notion-block-b4b898ddd7c8421a96b67f279177c5a4">/<em>                                                 </em>/</div><div class="notion-text notion-block-ad31717d2b854a849a2b119aa20f4c94">/<em>-------------------------------------------------</em>/</div><div class="notion-text notion-block-424a2586706a4397b3a0d445880a7ca5">#include &quot;stm32f1xx_hal.h&quot;   </div><div class="notion-text notion-block-fb20315896a64eab8702690d33513ecc">#include &quot;stm32f1xx_it.h&quot;</div><div class="notion-text notion-block-228633e7512f4be08c312dd916b4fc2d">#include &quot;uart.h&quot;</div><div class="notion-text notion-block-e30d838e599546e3ba20c2ee01595654">void EXTI15_10_IRQHandler(void)</div><div class="notion-text notion-block-4bbb77db8f2b4a78ad1e1ab5450a0e9c">{</div><div class="notion-text notion-block-a7991eb97ce2462982142dc9eaaaeeaf">HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_14);</div><div class="notion-text notion-block-7a606753823742bf9c828705b2c75c60">}</div><div class="notion-text notion-block-a2c0f14c77844c85a1a1ed907f10b769">void EXTI0_IRQHandler(void)</div><div class="notion-text notion-block-404446ed57e94ad3a381115eecbbcd59">{</div><div class="notion-text notion-block-a87a5b6ebc6e48cd95ee4ee7886a2c84">HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_0);</div><div class="notion-text notion-block-46d52287a02c4d24b146123401c7222c">}</div><div class="notion-text notion-block-f9cb530c033a4c16baa009b4a16ffd15">void USART1_IRQHandler(void)</div><div class="notion-text notion-block-827724c33c1742cbb3a8697eedc33e4f">{</div><div class="notion-text notion-block-d51421b4eae44b39a1279c173c161dd5">HAL_UART_IRQHandler(&amp;uart1.uart);</div><div class="notion-text notion-block-1be4f8fe556c4e42a5ee8014d0b93fcb">if(__HAL_UART_GET_FLAG(&amp;uart1.uart, UART_FLAG_IDLE)){<div class="notion-text-children"><div class="notion-text notion-block-dd9036b8cdfa4752b4c98a7bb543e5cd">__HAL_UART_CLEAR_IDLEFLAG(&amp;uart1.uart);</div><div class="notion-text notion-block-c5c259a00a9b401eaa8100388a96c0d8">uart1.RxCounter += (U1_RX_MAX - __HAL_DMA_GET_COUNTER(&amp;uart1.dmarx));</div><div class="notion-text notion-block-064af0ab3374430781c06cd92816928b">HAL_UART_AbortReceive_IT(&amp;uart1.uart);</div></div></div><div class="notion-text notion-block-4d164eefe7d0474da6ab813873e55e7a">}</div><div class="notion-text notion-block-1ea72740fe24457291c1708d0b757a95">}</div><div class="notion-text notion-block-8753ad1fed9242a78a1a9e7106ba09cc">void USART2_IRQHandler(void)</div><div class="notion-text notion-block-b06d9f8d280a4ebe820dd3d1bddcc91a">{</div><div class="notion-text notion-block-12733eb002d64d289674c04c12ef5814">HAL_UART_IRQHandler(&amp;uart2.uart);</div><div class="notion-text notion-block-b7dac8d8a4d34a56bd80f584c29d0824">if(__HAL_UART_GET_FLAG(&amp;uart2.uart, UART_FLAG_IDLE)){<div class="notion-text-children"><div class="notion-text notion-block-5dceb65c958e4010960aa96044e621cd">__HAL_UART_CLEAR_IDLEFLAG(&amp;uart2.uart);</div><div class="notion-text notion-block-26931e7daf6a4165a8767f70ce308e4d">uart2.RxCounter += (U2_RX_MAX - __HAL_DMA_GET_COUNTER(&amp;uart2.dmarx));</div><div class="notion-text notion-block-ace46c92f5b742ae9da7584350d829b3">HAL_UART_AbortReceive_IT(&amp;uart2.uart);</div></div></div><div class="notion-text notion-block-bafa62ac11154809854f5f881e455bd9">}</div><div class="notion-text notion-block-0b0747227d2a4e65b9872ff423234107">}</div><div class="notion-text notion-block-b8e738b4e9664b3e938a0e4fca5ec901">void USART3_IRQHandler(void)</div><div class="notion-text notion-block-f579113e643a46509d20f5d2c3b21316">{</div><div class="notion-text notion-block-e3899352ce1740cf9c223359dff2598a">HAL_UART_IRQHandler(&amp;uart3.uart);</div><div class="notion-text notion-block-d578e8e46e33479d8c090f4e90bd90ca">if(__HAL_UART_GET_FLAG(&amp;uart3.uart, UART_FLAG_IDLE)){<div class="notion-text-children"><div class="notion-text notion-block-559a1cc0c68b434fb29db61eba06e9cd">__HAL_UART_CLEAR_IDLEFLAG(&amp;uart3.uart);</div><div class="notion-text notion-block-af33f88bba454fa1b564d89ed2293788">uart3.RxCounter += (U3_RX_MAX - __HAL_DMA_GET_COUNTER(&amp;uart3.dmarx));</div><div class="notion-text notion-block-08898a52fad04713b27b3089126fc1fb">HAL_UART_AbortReceive_IT(&amp;uart3.uart);</div></div></div><div class="notion-text notion-block-4c3442dbdd5c492c92dcde5584f9b4c6">}</div><div class="notion-text notion-block-7622964604654500939f8b62ea8fa080">}</div><div class="notion-text notion-block-3210624e1efe40919cde3677f9f0a9c5">void DMA1_Channel4_IRQHandler(void)</div><div class="notion-text notion-block-3dd680d584594294a4cdf9785d10c1eb">{</div><div class="notion-text notion-block-ad185fbb92604e03ac4a42a521d45cbd">HAL_DMA_IRQHandler(&amp;uart1.dmatx);</div><div class="notion-text notion-block-6e28df01e9e2416cb218f479d1a29dbf">}</div><div class="notion-text notion-block-ab54a87cee624447965396738622f020">void DMA1_Channel5_IRQHandler(void)</div><div class="notion-text notion-block-9fd5e520b6034744aeca96b84ecdfaa5">{</div><div class="notion-text notion-block-48574d4b603e460b84d71b5cee565ef4">HAL_DMA_IRQHandler(&amp;uart1.dmarx);</div><div class="notion-text notion-block-9af94a01028f4cc5b48d6f37d584b0a4">}</div><div class="notion-text notion-block-88ff08aea5884064a5ad2e5089f6b74f">void DMA1_Channel7_IRQHandler(void)</div><div class="notion-text notion-block-e0cc0f76291641a3853db6b63781e7ad">{</div><div class="notion-text notion-block-c0033e87de294f06a4d4b4bdaa5d0678">HAL_DMA_IRQHandler(&amp;uart2.dmatx);</div><div class="notion-text notion-block-fd55b86521ec42dfacce66a053bbcac2">}</div><div class="notion-text notion-block-ee6ecafa622e41d5bcc0e328f60ca49d">void DMA1_Channel6_IRQHandler(void)</div><div class="notion-text notion-block-fcac1eaca8f3438b99398c30efdd7245">{</div><div class="notion-text notion-block-d092af15df8c47d1aeb006181bc8cdc2">HAL_DMA_IRQHandler(&amp;uart2.dmarx);</div><div class="notion-text notion-block-0bf7b417ec134fc5b5b8117ccdba6ff3">}</div><div class="notion-text notion-block-4a7170d3a94a4b659994d28f15fd62e7">void DMA1_Channel2_IRQHandler(void)</div><div class="notion-text notion-block-c946947025524b15b6482685e9720cb1">{</div><div class="notion-text notion-block-0779442bd7b54ec5b20825d59f27faa4">HAL_DMA_IRQHandler(&amp;uart3.dmatx);</div><div class="notion-text notion-block-848f11d11b8e4295aa04f32c29c3d744">}</div><div class="notion-text notion-block-242bc45da146420c9b02ee757a6c7044">void DMA1_Channel3_IRQHandler(void)</div><div class="notion-text notion-block-4415f51b75584464841d74f6dc6fac10">{</div><div class="notion-text notion-block-71c1d203d53b48faaf29e34524331920">HAL_DMA_IRQHandler(&amp;uart3.dmarx);</div><div class="notion-text notion-block-fe531f22acdb4931b3229f3e4b8ff1ea">}</div><div class="notion-text notion-block-26f224efb4d14fb08cae51e643fc638d">/<em>-------------------------------------------------</em>/</div><div class="notion-text notion-block-63beb9bb87ae43fa8946a58a210927b2">/<em>函数名：不可屏蔽中断处理函数                     </em>/</div><div class="notion-text notion-block-cf41d2762c6c4a3abe174e46f20a3773">/<em>参  数：无                                       </em>/</div><div class="notion-text notion-block-c3cd73040a564759938d2d324fec9c00">/<em>返回值：无                                       </em>/</div><div class="notion-text notion-block-09b080a286674a7e94420546b0eecc3e">/<em>-------------------------------------------------</em>/</div><div class="notion-text notion-block-83d4a77e99314bd4b1166d36d126c279">void NMI_Handler(void)</div><div class="notion-text notion-block-21efe1da340345d1b70d81e4aba73fd2">{</div><div class="notion-text notion-block-d9e3d83805b1414089535a57bc4323f2">}</div><div class="notion-text notion-block-06d70905c157447e91cc6c060f285cad">/<em>-------------------------------------------------</em>/</div><div class="notion-text notion-block-e64d6f9499ac4b14a2e1f10de4852f15">/<em>函数名：硬件出错后进入的中断处理函数             </em>/</div><div class="notion-text notion-block-6696d558223649898ca6299bee399f86">/<em>参  数：无                                       </em>/</div><div class="notion-text notion-block-b7797b31cac54abbaeeced4870e2be84">/<em>返回值：无                                       </em>/</div><div class="notion-text notion-block-1bbf2269690b4a65a25ec9ca7f2916aa">/<em>-------------------------------------------------</em>/</div><div class="notion-text notion-block-03d06f718c554ebc8c0185800a51252a">void HardFault_Handler(void)</div><div class="notion-text notion-block-4f9ff8b900124672837907a8cac2263b">{</div><div class="notion-text notion-block-0da5f88ee2604989ae97cded20999061">}</div><div class="notion-text notion-block-6117bf75c3d4461fb79accbee10d4610">/<em>-------------------------------------------------</em>/</div><div class="notion-text notion-block-5e008e2f74a948ccb81ce08f12604f40">/<em>函数名：软中断，SWI 指令调用的处理函数           </em>/</div><div class="notion-text notion-block-2fc2e4f0822f46a7a39e713596a8152a">/<em>参  数：无                                       </em>/</div><div class="notion-text notion-block-03b2612fcb4b45aba6a3cbb8910082f8">/<em>返回值：无                                       </em>/</div><div class="notion-text notion-block-7493497deb5c4cd6a4105729dd1d10c3">/<em>-------------------------------------------------</em>/</div><div class="notion-text notion-block-213b01a9570b4a04843d0a3b1b11b57e">void SVC_Handler(void)</div><div class="notion-text notion-block-b2e69cd2d43744a5923e551337809556">{</div><div class="notion-text notion-block-2018f64874a0436e820c75e038ec8267">}</div><div class="notion-text notion-block-f74143ae791c45258ef00fe3a51f5984">/<em>-------------------------------------------------</em>/</div><div class="notion-text notion-block-99245f576ba1489db2ef8e22bf85742a">/<em>函数名：可挂起的系统服务处理函数                 </em>/</div><div class="notion-text notion-block-10459a63a66d43fdbfaad4026500350e">/<em>参  数：无                                       </em>/</div><div class="notion-text notion-block-6ad5ec8e35094878a3a54d5df7bd6425">/<em>返回值：无                                       </em>/</div><div class="notion-text notion-block-4efe046f04b44e129d5f8af5105e1ba1">/<em>-------------------------------------------------</em>/</div><div class="notion-text notion-block-e39c1c15e471473bb13f061ce4b45b0c">void PendSV_Handler(void)</div><div class="notion-text notion-block-48017893be4e48e68690553dd828be29">{</div><div class="notion-text notion-block-c7f2275029774ab18ea38feeb01272b9">}</div><div class="notion-text notion-block-cdda9438e68c47da9a5aa84f6b60bf72">/<em>-------------------------------------------------</em>/</div><div class="notion-text notion-block-912fa586f91d4246b7ebb7a048e05730">/<em>函数名：SysTic系统嘀嗒定时器处理函数             </em>/</div><div class="notion-text notion-block-2cc183d4f9874d0e9eaafc3410d81de2">/<em>参  数：无                                       </em>/</div><div class="notion-text notion-block-229a1fa258b3499197a7d4a80b231677">/<em>返回值：无                                       </em>/</div><div class="notion-text notion-block-ccc6c89928c245a183e3a8836ea30a95">/<em>-------------------------------------------------</em>/</div><div class="notion-text notion-block-43f4d6f7363a40bead74cd8b225d7f3d">void SysTick_Handler(void)</div><div class="notion-text notion-block-6026e44f35d64688934929e3ba032737">{  </div><div class="notion-text notion-block-f947631191a94cb0a3e84ae43b78b479">HAL_IncTick();	</div><div class="notion-text notion-block-9307eb9681da40d28f3231fc4a99e5a8">}</div></div></details><details class="notion-toggle notion-block-2d37bfb4b692407e84c66243fc8005ba"><summary><h4 class="notion-h notion-h3 notion-block-2d37bfb4b692407e84c66243fc8005ba" data-id="2d37bfb4b692407e84c66243fc8005ba"><span><div id="2d37bfb4b692407e84c66243fc8005ba" class="notion-header-anchor"></div><span class="notion-h-title">main.c</span></span></h4></summary><div><div class="notion-text notion-block-4775a46d962942128cf0684d70b86abd">#include &quot;stm32f1xx_hal.h&quot;</div><div class="notion-text notion-block-3485153aa2d34a789f5dda46772abe9c">#include &quot;rcc.h&quot;</div><div class="notion-text notion-block-b3cd9b60dfea4bffb1f0b352fe51804a">#include &quot;led.h&quot;</div><div class="notion-text notion-block-b2ba1d53b8594aec8d9ee4235889d943">#include &quot;sw.h&quot;</div><div class="notion-text notion-block-b30c3f3599f242d48e5bab33667d08f3">#include &quot;uart.h&quot;</div><div class="notion-text notion-block-52180a27d49041b78928ceae6bbc6668">int main(void){<div class="notion-text-children"><div class="notion-text notion-block-3e7a3f4904484795a8ddcea6b9168765">HAL_Init();</div><div class="notion-text notion-block-7b7d98d265374e589a4f8d7d8cfd1747">RccClock_Init();</div><div class="notion-text notion-block-a2765f307a484561815c6160411667cc">SW_Init_IT(0);</div><div class="notion-text notion-block-457d6e2f578141dab6bd20d06b6133bc">LED_Init();</div><div class="notion-text notion-block-989c438e81de42cfb8accb2072d4813b">U1_Init(921600);</div><div class="notion-text notion-block-1d2fa135c8fe4f94a13cc236c3de104b">U2_Init(921600);</div><div class="notion-text notion-block-6224f9fd33c34619b73a97940a293df4">U3_Init(921600);</div><div class="notion-text notion-block-c5a11a8c366947c6a793f9ad9ff5368e">while(1){<div class="notion-text-children"><div class="notion-text notion-block-8e800902f5df4183a779b10fe5e35fed">//串口1收发</div><div class="notion-text notion-block-600710986704492ebeb625eff0283cec">if(uart1.RxOutPtr != uart1.RxInPtr){<div class="notion-text-children"><div class="notion-text notion-block-ff7ba972534f41309247a4f58d3aad32">if(((uart1.RxOutPtr-&gt;end - uart1.RxOutPtr-&gt;start + 1)==6)&amp;&amp;(memcmp(uart1.RxOutPtr-&gt;start,&quot;LED_ON&quot;,6) == 0)){<div class="notion-text-children"><div class="notion-text notion-block-9b9f03749a9a4eb998282abaada2abc4">LED_ON();</div></div></div><div class="notion-text notion-block-457edc5b36754c03852164b9087053a5">}else if(((uart1.RxOutPtr-&gt;end - uart1.RxOutPtr-&gt;start + 1)==7)&amp;&amp;(memcmp(uart1.RxOutPtr-&gt;start,&quot;LED_OFF&quot;,7) == 0)){<div class="notion-text-children"><div class="notion-text notion-block-2dc696b6381b4fe0b134cbca1b28b687">LED_OFF();</div></div></div></div></div><div class="notion-text notion-block-8e9fa3cd5533475d8265a22386480841">}</div><div class="notion-text notion-block-938528293d8e4994ada9fbaf328754dc">uart1.RxOutPtr++;</div><div class="notion-text notion-block-0d7c7beffe7240fb95fbeea302ac2ea5">if(uart1.RxOutPtr == uart1.RxEndPtr){<div class="notion-text-children"><div class="notion-text notion-block-517761a8cd0d45a7bd4cf1e1e05aa419">uart1.RxOutPtr = &amp;uart1.RxLocation[0];</div></div></div><div class="notion-text notion-block-b2518d6a1d844857bc27c9d5b5c8f31b">}</div></div></div><div class="notion-text notion-block-c5ad5e5d8b194e938a557f9336e8565f">}</div><div class="notion-text notion-block-209c91037e4c4911bb8501daa113c2f7">if((uart1.TxOutPtr != uart1.TxInPtr)&amp;&amp;(uart1.TxState==0)){<div class="notion-text-children"><div class="notion-text notion-block-499364b04c88401da190ac9f3043bcdf">uart1.TxState = 1;</div><div class="notion-text notion-block-e1c83398c62f47f58a39767be49999ea">HAL_UART_Transmit_DMA(&amp;uart1.uart,uart1.TxOutPtr-&gt;start,uart1.TxOutPtr-&gt;end - uart1.TxOutPtr-&gt;start + 1);</div><div class="notion-text notion-block-61a60fa90a3544188c192a3da12a7ec8">uart1.TxOutPtr++;</div><div class="notion-text notion-block-1ad495652eba499f8848bb8925c0fd30">if(uart1.TxOutPtr == uart1.TxEndPtr){<div class="notion-text-children"><div class="notion-text notion-block-b6ad20df728a47c9bf6374e9854d9533">uart1.TxOutPtr = &amp;uart1.TxLocation[0];</div></div></div><div class="notion-text notion-block-2b08c35048014d268df59dc003311783">}</div></div></div><div class="notion-text notion-block-97f6c135622d4e4ea33b871f63a405a8">}</div><div class="notion-text notion-block-73a29560264b41c888e7047337dc4c0f">//串口2收发</div><div class="notion-text notion-block-2482c89e0ed74935a50c97308bcd0e08">if(uart2.RxOutPtr != uart2.RxInPtr){<div class="notion-text-children"><div class="notion-text notion-block-3c0f7dc173844cde94e95a71d2440379">if(((uart2.RxOutPtr-&gt;end - uart2.RxOutPtr-&gt;start + 1)==6)&amp;&amp;(memcmp(uart2.RxOutPtr-&gt;start,&quot;LED_ON&quot;,6) == 0)){<div class="notion-text-children"><div class="notion-text notion-block-d558a7ef1c2948e7887f5a7332528323">HAL_GPIO_WritePin(GPIOB,GPIO_PIN_0,GPIO_PIN_RESET);</div></div></div><div class="notion-text notion-block-879474287d0046eeb4b831a8095711ef">}else if(((uart2.RxOutPtr-&gt;end - uart2.RxOutPtr-&gt;start + 1)==7)&amp;&amp;(memcmp(uart2.RxOutPtr-&gt;start,&quot;LED_OFF&quot;,7) == 0)){<div class="notion-text-children"><div class="notion-text notion-block-f00bb7162c0547ab9631c58acdd867a6">HAL_GPIO_WritePin(GPIOB,GPIO_PIN_0,GPIO_PIN_SET);</div></div></div><div class="notion-text notion-block-ca58e86f963c4a0d9110f0e31e2af498">}</div><div class="notion-text notion-block-49926d29c1b0494e8c7b252d4ec84411">uart2.RxOutPtr++;</div><div class="notion-text notion-block-2f901ea177924f6ea88cbc5dfebb33f5">if(uart2.RxOutPtr == uart2.RxEndPtr){<div class="notion-text-children"><div class="notion-text notion-block-c94bb3104c934cc5aae4ab274be5ad0b">uart2.RxOutPtr = &amp;uart2.RxLocation[0];</div></div></div><div class="notion-text notion-block-08c1864a325c4364b3f1ef8ceb4da87c">}</div></div></div><div class="notion-text notion-block-2b130cbe2ff14916b3f1a204bdda05b2">}</div><div class="notion-text notion-block-0415f6b9b6be478a9e3ccf143bd60d27">if((uart2.TxOutPtr != uart2.TxInPtr)&amp;&amp;(uart2.TxState==0)){<div class="notion-text-children"><div class="notion-text notion-block-d91365224a8e4ed0a253926d8e289c9a">uart2.TxState = 1;</div><div class="notion-text notion-block-e7a4253abb604f83a93d9fa152c7c57a">HAL_HalfDuplex_EnableTransmitter(&amp;uart2.uart);</div><div class="notion-text notion-block-c06d7b83a9cb405292c6f3a44bb29619">HAL_UART_Transmit_DMA(&amp;uart2.uart,uart2.TxOutPtr-&gt;start,uart2.TxOutPtr-&gt;end - uart2.TxOutPtr-&gt;start + 1);</div><div class="notion-text notion-block-4b32f2fb86c74682ae711095d5469f56">uart2.TxOutPtr++;</div><div class="notion-text notion-block-d2795626833f432f81f14f17c2db3394">if(uart2.TxOutPtr == uart2.TxEndPtr){<div class="notion-text-children"><div class="notion-text notion-block-6849fe1e81eb41fbb25b5ad9d1741d6c">uart2.TxOutPtr = &amp;uart2.TxLocation[0];</div></div></div><div class="notion-text notion-block-ace5da299dd640d28aacd3c0f2caf5ac">}</div></div></div><div class="notion-text notion-block-524085660a8f42d2b1b2940ece12d25c">}</div><div class="notion-text notion-block-91b07fbbafa44a709c6616e67bec25e5">//串口3收发</div><div class="notion-text notion-block-710f2677723f488d935ed3c4c97d44af">if(uart3.RxOutPtr != uart3.RxInPtr){<div class="notion-text-children"><div class="notion-text notion-block-28e4b076df4040feb52b333e937eaca6">if(((uart3.RxOutPtr-&gt;end - uart3.RxOutPtr-&gt;start + 1)==6)&amp;&amp;(memcmp(uart3.RxOutPtr-&gt;start,&quot;LED_ON&quot;,6) == 0)){<div class="notion-text-children"><div class="notion-text notion-block-b1efdee6fc6a40e19fd46dae122cf0bb">HAL_GPIO_WritePin(GPIOB,GPIO_PIN_0,GPIO_PIN_RESET);</div></div></div><div class="notion-text notion-block-5a5a4bb9c8174e73a697ce394ab9c879">}else if(((uart3.RxOutPtr-&gt;end - uart3.RxOutPtr-&gt;start + 1)==7)&amp;&amp;(memcmp(uart3.RxOutPtr-&gt;start,&quot;LED_OFF&quot;,7) == 0)){<div class="notion-text-children"><div class="notion-text notion-block-2ad73e2910f44031a7dbcd0d9ce35b0a">HAL_GPIO_WritePin(GPIOB,GPIO_PIN_0,GPIO_PIN_SET);</div></div></div><div class="notion-text notion-block-3785cd10e683427595b8583d91c21181">}</div><div class="notion-text notion-block-32af97608473473287f53ecffe805981">uart3.RxOutPtr++;</div><div class="notion-text notion-block-7bca937971ff40c6873eaf18b2ffef2f">if(uart3.RxOutPtr == uart3.RxEndPtr){<div class="notion-text-children"><div class="notion-text notion-block-f98ac551f4934f3c8b04633a62e0b92a">uart3.RxOutPtr = &amp;uart3.RxLocation[0];</div></div></div><div class="notion-text notion-block-2b091799f4e74fc19e31b138596bdf5e">}</div></div></div><div class="notion-text notion-block-18c650f9ba9e4382af5b76e3b33767c2">}<div class="notion-text-children"><div class="notion-text notion-block-eb98ab5f634a4e5cb8c4c78bec35294a">if((uart3.TxOutPtr != uart3.TxInPtr)&amp;&amp;(uart3.TxState==0)){<div class="notion-text-children"><div class="notion-text notion-block-db2ee18ebde14831b4a43eece9cc198e">uart3.TxState = 1;</div><div class="notion-text notion-block-e5d52817a31f4ab8b43093eb3aae0f49">HAL_HalfDuplex_EnableTransmitter(&amp;uart3.uart);</div><div class="notion-text notion-block-1c64c122ca5243fb9acf6794647d5e35">HAL_UART_Transmit_DMA(&amp;uart3.uart,uart3.TxOutPtr-&gt;start,uart3.TxOutPtr-&gt;end - uart3.TxOutPtr-&gt;start + 1);</div><div class="notion-text notion-block-4f991e72c9434a50839e7e255ef47125">uart3.TxOutPtr++;</div><div class="notion-text notion-block-984c33dc98274732baebbcec3609e07c">if(uart3.TxOutPtr == uart3.TxEndPtr){<div class="notion-text-children"><div class="notion-text notion-block-216c12be6e6f4306918036bcf796be19">uart3.TxOutPtr = &amp;uart3.TxLocation[0];</div></div></div><div class="notion-text notion-block-b0a70e920f79424b811196794ca89143">}</div></div></div><div class="notion-text notion-block-efde7049a9fc456cb578950938621756">}</div><div class="notion-text notion-block-64ad65c7a82c4678aa2c843a6b866815">}</div></div></div></div></div><div class="notion-text notion-block-716ba091abb14d1ba4a3372430203cf2">}</div></div></details><details class="notion-toggle notion-block-961730ec3448426095c7de25e8f37acb"><summary><h4 class="notion-h notion-h3 notion-block-961730ec3448426095c7de25e8f37acb" data-id="961730ec3448426095c7de25e8f37acb"><span><div id="961730ec3448426095c7de25e8f37acb" class="notion-header-anchor"></div><span class="notion-h-title">5. 从机1程序</span></span></h4></summary><div><details class="notion-toggle notion-block-20e33ec11c75427f95d502f25af9f197"><summary><h4 class="notion-h notion-h3 notion-block-20e33ec11c75427f95d502f25af9f197" data-id="20e33ec11c75427f95d502f25af9f197"><span><div id="20e33ec11c75427f95d502f25af9f197" class="notion-header-anchor"></div><span class="notion-h-title">uart.c</span></span></h4></summary><div><div class="notion-text notion-block-2da4d3d152034d0791eff632a89bd106">#include &quot;stm32f1xx_hal.h&quot;</div><div class="notion-text notion-block-f56e5312dd08453482631cb2e5b5435f">#include &quot;uart.h&quot;</div><div class="notion-text notion-block-b5cd11aeba3a4092aefd8156931e7007">UCB  uart1;</div><div class="notion-text notion-block-089dbeb7162f4a8faf1dd00228a3ef7d">UCB  uart2;</div><div class="notion-text notion-block-3dfbca0c7a7d43af97c2ee5f868a0d52">UCB  uart3;</div><div class="notion-text notion-block-431657ade6604de6bec14d221162dc6c">uint8_t U1_RxBuff[U1_RX_SIZE];</div><div class="notion-text notion-block-827ad8820faf4a0187954f3971ea5094">uint8_t U1_TxBuff[U1_TX_SIZE];</div><div class="notion-text notion-block-117a6d699b6944f6b224237fd56cf5c0">uint8_t U2_RxBuff[U2_RX_SIZE];</div><div class="notion-text notion-block-de6aa0856ce046c3a692e2ed6b703ea2">uint8_t U2_TxBuff[U2_TX_SIZE];</div><div class="notion-text notion-block-6ba496dae344420cbb2c28093abbf399">uint8_t U3_RxBuff[U3_RX_SIZE];</div><div class="notion-text notion-block-19268fd107c34536917a64bfd4f6a5de">uint8_t U3_TxBuff[U3_TX_SIZE];</div><div class="notion-text notion-block-e4fcf079aae6450a8ff4b15edbe4db44">void U1_Init(uint32_t bandrate){<div class="notion-text-children"><div class="notion-text notion-block-b837426fb3f0406582b38225e7ca6589">uart1.uart.Instance = USART1;</div><div class="notion-text notion-block-fc1085d83dfd400c9d23c58fd6512ffc">uart1.uart.Init.BaudRate = bandrate;</div><div class="notion-text notion-block-37c0f7b39bc6464eba7e5db318008877">uart1.uart.Init.WordLength = UART_WORDLENGTH_8B;</div><div class="notion-text notion-block-c20752fc0d2745359784fb2f554392d6">uart1.uart.Init.StopBits = UART_STOPBITS_1;</div><div class="notion-text notion-block-83214681d5be4604a81964d71ebf6e60">uart1.uart.Init.Parity = UART_PARITY_NONE;</div><div class="notion-text notion-block-87087aaf4d4f4b7a808b9d1f3dacea4d">uart1.uart.Init.Mode = UART_MODE_TX_RX;</div></div></div></div></details><div class="notion-text notion-block-e70fdcf4b62540ea87b0a68483551e4d">uart1.uart.Init.HwFlowCtl = UART_HWCONTROL_NONE;</div><div class="notion-text notion-block-d7cf5d9e9bd841409e3c9dc572312e28">HAL_UART_Init(&amp;uart1.uart);</div><div class="notion-text notion-block-aea4ae2c605146d683be8837bbbc35ce">U1_PtrInit();</div><div class="notion-text notion-block-4a90d18cc58145959d8a7224228ee2f6">}</div><div class="notion-text notion-block-60149b16550e4c8b907e788c58e7debf">void U1_PtrInit(void){</div><div class="notion-text notion-block-52e55ba0d0f94706a0b80c9d6ac6e743">uart1.RxInPtr = &amp;uart1.RxLocation[0];</div><div class="notion-text notion-block-45a62d23feb148fbbdf0ee301d2e030c">uart1.RxOutPtr = &amp;uart1.RxLocation[0];</div><div class="notion-text notion-block-4fc398263ffc4332a202169a06c5eb76">uart1.RxEndPtr = &amp;uart1.RxLocation[9];</div><div class="notion-text notion-block-f63f0dc238db4b798d81c6ffc21b7eba">uart1.RxCounter = 0;</div><div class="notion-text notion-block-e9b95d0d54e4400a9ba5457b705d86cb">uart1.RxInPtr-&gt;start = U1_RxBuff;</div><div class="notion-text notion-block-a1f9a255ecfa4477abc4ad8fd255c14f">uart1.TxInPtr = &amp;uart1.TxLocation[0];</div><div class="notion-text notion-block-19ea5a7058c34038bd0e84eb5626c866">uart1.TxOutPtr = &amp;uart1.TxLocation[0];</div><div class="notion-text notion-block-f2d78a0029274ca79680204c728d2880">uart1.TxEndPtr = &amp;uart1.TxLocation[9];</div><div class="notion-text notion-block-26bc3b35518f41cbbf3b251500390395">uart1.TxCounter = 0;</div><div class="notion-text notion-block-64b8241e9e514a669f8f0d572e575862">uart1.TxInPtr-&gt;start = U1_TxBuff;</div><div class="notion-text notion-block-364587e0e177459abf1e9d0532aab001">__HAL_UART_ENABLE_IT(&amp;uart1.uart, UART_IT_IDLE);</div><div class="notion-text notion-block-31e25723695e4a8eb7a7b8d717736ffd">HAL_UART_Receive_DMA(&amp;uart1.uart,uart1.RxInPtr-&gt;start,U1_RX_MAX);</div></div></details><div class="notion-text notion-block-c57936a31c1f47009afb9745ccf5b7bc">}</div><div class="notion-text notion-block-727f79bea5504f8c91cdf2115100e992">void U1_Txdata(uint8_t *data, uint32_t data_len){</div><div class="notion-text notion-block-0430a28a16334874afae47a5c7d33566">if((U1_TX_SIZE - uart1.TxCounter )&gt;=data_len){<div class="notion-text-children"><div class="notion-text notion-block-df07a175027546f69eeebb5dc537fc25">uart1.TxInPtr-&gt;start = &amp;U1_TxBuff[uart1.TxCounter];</div></div></div><div class="notion-text notion-block-3c270bb97c38465188283effdca8fadd">}else{<div class="notion-text-children"><div class="notion-text notion-block-76880173a6ba47be8921849b488ff94f">uart1.TxCounter = 0;</div><div class="notion-text notion-block-1fe71bc08d824b25a41c6bc9f8e4687a">uart1.TxInPtr-&gt;start = U1_TxBuff;</div></div></div><div class="notion-text notion-block-ba246294240242cf813df25ab94830ae">}</div><div class="notion-text notion-block-186ed98de8ad46489f611824dd22d78f">memcpy(uart1.TxInPtr-&gt;start,data,data_len);</div><div class="notion-text notion-block-91f8e2dc03b145778d29eb822b7d5c1d">uart1.TxCounter += data_len;</div><div class="notion-text notion-block-16f753453b46474c9f570cac977c4c80">uart1.TxInPtr-&gt;end = &amp;U1_TxBuff[uart1.TxCounter - 1];</div><div class="notion-text notion-block-7d3a55357b61443f87c08eb8988d3098">uart1.TxInPtr++;</div><div class="notion-text notion-block-99b4a22c4073480ba5cd2844e962099d">if(uart1.TxInPtr == uart1.TxEndPtr){<div class="notion-text-children"><div class="notion-text notion-block-fe550fd26389484c9fac596b0bc6dca8">uart1.TxInPtr = &amp;uart1.TxLocation[0];</div></div></div><div class="notion-text notion-block-e3d41cffa0cd489d978666aa47dc718c">}</div><div class="notion-text notion-block-b3b8a686acc94922a6eb3d36f382049b">}</div><div class="notion-text notion-block-e542f2347a1341ee826df272d18f8d0d">void U2_Init(uint32_t bandrate){</div><div class="notion-text notion-block-6e37c02516bd422d88406d547ae1e424">uart2.uart.Instance = USART2;</div><div class="notion-text notion-block-39fd86a60e694d3ea8dd98a4a6fb2cd2">uart2.uart.Init.BaudRate = bandrate;</div><div class="notion-text notion-block-d7ed950935454e7ab795275f4c174244">uart2.uart.Init.WordLength = UART_WORDLENGTH_8B;</div><div class="notion-text notion-block-4e13aa10bd1d4a948d652db2a3207616">uart2.uart.Init.StopBits = UART_STOPBITS_1;</div><div class="notion-text notion-block-1d22773a31d445109179264c4ed4e1d0">uart2.uart.Init.Parity = UART_PARITY_NONE;</div><div class="notion-text notion-block-1df6faab53fe4dba9ce4e43c62d8035d">uart2.uart.Init.Mode = UART_MODE_TX_RX;</div><div class="notion-text notion-block-d492f687e18c47a9aa7ac55fd29bd221">uart2.uart.Init.HwFlowCtl = UART_HWCONTROL_NONE;</div><div class="notion-text notion-block-ee72db3859d34a198fb4449aa55f5832">HAL_MultiProcessor_Init(&amp;uart2.uart, 0x01, UART_WAKEUPMETHOD_ADDRESSMARK);   //多设备初始化</div><div class="notion-text notion-block-569da108c54740908f344fd955130b9c">HAL_MultiProcessor_EnterMuteMode(&amp;uart2.uart);  //手动进入静默模式</div><div class="notion-text notion-block-eb87f9fbdd014719926a8c427a8ed6ea">TIM4_TimerInit(300, 7200);  //定时器超时时间30ms</div><div class="notion-text notion-block-34dba116f9a24f14a5ad86b9b9e7c66f">U2_PtrInit();</div><div class="notion-text notion-block-13e4f00bf7d94ada8ed8c519e3ed22e6">}</div><div class="notion-text notion-block-40ca885988c940c7bc60eb81cb26636c">void U2_PtrInit(void){</div><div class="notion-text notion-block-68ad04b34cc640f8be9ce6a15d165b6a">uart2.RxInPtr = &amp;uart2.RxLocation[0];</div><div class="notion-text notion-block-c808daa9b6764973b69ddc5c9e8b68ba">uart2.RxOutPtr = &amp;uart2.RxLocation[0];</div><div class="notion-text notion-block-dfb5b4f95cff427b8f3b21ee9ac41868">uart2.RxEndPtr = &amp;uart2.RxLocation[9];</div><div class="notion-text notion-block-cab5ff33f56240f59d0a7224445aaf5a">uart2.RxCounter = 0;</div><div class="notion-text notion-block-94806db82e9d44e4bbb3deb3ac308f68">uart2.RxInPtr-&gt;start = U2_RxBuff;</div><div class="notion-text notion-block-4e2e1f3199124648b8e4220827330a6e">uart2.TxInPtr = &amp;uart2.TxLocation[0];</div><div class="notion-text notion-block-17b58837e79f457fab2ddc5c1c787df6">uart2.TxOutPtr = &amp;uart2.TxLocation[0];</div><div class="notion-text notion-block-4cf029a340e7409ba53a2fa71a37e520">uart2.TxEndPtr = &amp;uart2.TxLocation[9];</div><div class="notion-text notion-block-6329dc023ff34fc7bed883787c4c80d3">uart2.TxCounter = 0;</div><div class="notion-text notion-block-a7bdf8dd603c4d68b474c9beaf2c2873">uart2.TxInPtr-&gt;start = U2_TxBuff;	</div><div class="notion-text notion-block-eece3401aeea466598bb152c1697cff2">uart2.RxState = 0;  //初始化接受状态为0</div><div class="notion-text notion-block-4b014c6d8b184d5bbcbbedaf851e5270">__HAL_UART_ENABLE_IT(&amp;uart2.uart, UART_IT_RXNE);    //打开接收中断</div><div class="notion-text notion-block-200c83b729a04df1afe4ad32099683c7">HAL_UART_Receive_DMA(&amp;uart2.uart,uart2.RxInPtr-&gt;start,U2_RX_MAX);</div><div class="notion-text notion-block-3ea5d1dcacc949559cb71cf9cf5c1628">}</div><div class="notion-text notion-block-f4f5b91d945c4ac888e8a6f8036baf14">void U2_Txdata(uint8_t *data, uint32_t data_len){</div><div class="notion-text notion-block-22465d9e3be64734afd42925878ee662">if((U2_TX_SIZE - uart2.TxCounter )&gt;=data_len){<div class="notion-text-children"><div class="notion-text notion-block-688a2748b54849f280a9f9d391fc6a11">uart2.TxInPtr-&gt;start = &amp;U2_TxBuff[uart2.TxCounter];</div></div></div><div class="notion-text notion-block-83442eb0b3f64906b3c54a9c8dca8c80">}else{<div class="notion-text-children"><div class="notion-text notion-block-2639302602764fff8135763721a503bf">uart2.TxCounter = 0;</div><div class="notion-text notion-block-0e7f61545da04f0ba37a9eaa4b6e58a3">uart2.TxInPtr-&gt;start = U2_TxBuff;</div></div></div><div class="notion-text notion-block-e2dab0b47dd44706ade9768ea284b015">}</div><div class="notion-text notion-block-e224138c738d46f8b4b0e41fef15bcd4">memcpy(uart2.TxInPtr-&gt;start,data,data_len);</div><div class="notion-text notion-block-2a0f72e54e2d4cf2a9856b93f6db5687">uart2.TxCounter += data_len;</div><div class="notion-text notion-block-dd6f652370494a14b440a0d695861964">uart2.TxInPtr-&gt;end = &amp;U2_TxBuff[uart2.TxCounter - 1];</div><div class="notion-text notion-block-4ad34756a8b54b54a40db0631fbe8015">uart2.TxInPtr++;</div><div class="notion-text notion-block-8a18449f151d42e785bda57ffe84c018">if(uart2.TxInPtr == uart2.TxEndPtr){<div class="notion-text-children"><div class="notion-text notion-block-2ad9aedf151b4e0890b127c35d54eb25">uart2.TxInPtr = &amp;uart2.TxLocation[0];</div></div></div><div class="notion-text notion-block-e2249083121e4ff4bf96d53e1a53e888">}</div><div class="notion-text notion-block-ff8cf6a619bf4c98a75cda520b623e80">}</div><div class="notion-text notion-block-8d48547e28934bf49baba942785f8ec7">void U3_Init(uint32_t bandrate){</div><div class="notion-text notion-block-75e3f8d674aa48498e4fa74d6710fa52">uart3.uart.Instance = USART3;</div><div class="notion-text notion-block-3f7ccd433c71437990141ff60ddc93ee">uart3.uart.Init.BaudRate = bandrate;</div><div class="notion-text notion-block-ddb41a8d45254da09258fc55297e3ac0">uart3.uart.Init.WordLength = UART_WORDLENGTH_8B;</div><div class="notion-text notion-block-f4ae66b722444d60bff937c3e6248d84">uart3.uart.Init.StopBits = UART_STOPBITS_1;</div><div class="notion-text notion-block-65f6438a6cc847229ca939078b8fb6ab">uart3.uart.Init.Parity = UART_PARITY_NONE;</div><div class="notion-text notion-block-03cc5e7746954dada4b36cca602540d8">uart3.uart.Init.Mode = UART_MODE_TX_RX;</div><div class="notion-text notion-block-0a7af04b8d1a462dbf91aea14edfa0aa">uart3.uart.Init.HwFlowCtl = UART_HWCONTROL_NONE;</div><div class="notion-text notion-block-4889ab5015a34533870ed182439490a0">HAL_HalfDuplex_Init(&amp;uart3.uart);</div><div class="notion-text notion-block-981b10c2ac514f16a73aa5a00211bb83">HAL_HalfDuplex_EnableReceiver(&amp;uart3.uart);</div><div class="notion-text notion-block-63665fe668ed4dccb4fe700e042f65e1">U3_PtrInit();</div><div class="notion-text notion-block-e7d0d28e72174dcd855582c17bca17e8">}</div><div class="notion-text notion-block-6158045fa5a349c0aa6db6ddb4af704c">void U3_PtrInit(void){</div><div class="notion-text notion-block-7301d7e5dea548b1929bede04cf96463">uart3.RxInPtr = &amp;uart3.RxLocation[0];</div><div class="notion-text notion-block-ec93f69787ac45e489057d0f475a3deb">uart3.RxOutPtr = &amp;uart3.RxLocation[0];</div><div class="notion-text notion-block-9750d255a2124b88868b33443e90f055">uart3.RxEndPtr = &amp;uart3.RxLocation[9];</div><div class="notion-text notion-block-2c31d183e5684a6c98078eb765e0ba6c">uart3.RxCounter = 0;</div><div class="notion-text notion-block-050a156614f541a499e8f0018fe1ec28">uart3.RxInPtr-&gt;start = U3_RxBuff;</div><div class="notion-text notion-block-dfebb33373264c80829620dacd41558b">uart3.TxInPtr = &amp;uart3.TxLocation[0];</div><div class="notion-text notion-block-78aaab52462045a2848d98ca1afec19e">uart3.TxOutPtr = &amp;uart3.TxLocation[0];</div><div class="notion-text notion-block-5b7405b0362343b4b549813d4d2c9cd9">uart3.TxEndPtr = &amp;uart3.TxLocation[9];</div><div class="notion-text notion-block-03da1e670714458f83961114ab376777">uart3.TxCounter = 0;</div><div class="notion-text notion-block-6c9b4693026d4397b039f1f96a968286">uart3.TxInPtr-&gt;start = U3_TxBuff;	</div><div class="notion-text notion-block-de947e4efed9495dafdbcfff60e491c9">__HAL_UART_ENABLE_IT(&amp;uart3.uart, UART_IT_IDLE);</div><div class="notion-text notion-block-69336bc4d7204478aafc36f9006a1126">HAL_UART_Receive_DMA(&amp;uart3.uart,uart3.RxInPtr-&gt;start,U3_RX_MAX);</div><div class="notion-text notion-block-cd1308208ea54f50948dc6cbd93255f9">}</div><div class="notion-text notion-block-e527962db0a242ef988080a79105660a">void U3_Txdata(uint8_t *data, uint32_t data_len){</div><div class="notion-text notion-block-09a7f7998e764b63b6b0e4082663ee99">if((U3_TX_SIZE - uart3.TxCounter )&gt;=data_len){<div class="notion-text-children"><div class="notion-text notion-block-7f8bbeafca38421090f12a09a39291f8">uart3.TxInPtr-&gt;start = &amp;U3_TxBuff[uart3.TxCounter];</div></div></div><div class="notion-text notion-block-289110e26d214a3097ad98c63dbc713d">}else{<div class="notion-text-children"><div class="notion-text notion-block-7dbf268aefad4b92ac7e97efd704569e">uart3.TxCounter = 0;</div><div class="notion-text notion-block-58b4ab1c0c624c37b2ba8f6482783723">uart3.TxInPtr-&gt;start = U3_TxBuff;</div></div></div><div class="notion-text notion-block-cd200787ddcb4292a9ee56a102e30eaa">}</div><div class="notion-text notion-block-ad9474fcb2964e6fb0b622aed14fc723">memcpy(uart3.TxInPtr-&gt;start,data,data_len);</div><div class="notion-text notion-block-5007ef0610ce4574b6bd33dbc7079973">uart3.TxCounter += data_len;</div><div class="notion-text notion-block-74e40fff2bb74bcc8f2a0c2e9e4cceef">uart3.TxInPtr-&gt;end = &amp;U3_TxBuff[uart3.TxCounter - 1];</div><div class="notion-text notion-block-dddb5ad7ca36416c8c27f9aa8ce2aed7">uart3.TxInPtr++;</div><div class="notion-text notion-block-9649cc5a7bc84f0dadb5a517e648fc70">if(uart3.TxInPtr == uart3.TxEndPtr){<div class="notion-text-children"><div class="notion-text notion-block-d121ff64b865452a93c2c78e93d564c6">uart3.TxInPtr = &amp;uart3.TxLocation[0];</div></div></div><div class="notion-text notion-block-a3d77b10d2264c9e9c50ec7f5e3d03c3">}</div><div class="notion-text notion-block-0655a5c61a25436e815e7e7f51eebdc5">}</div><div class="notion-text notion-block-4895f9fd6d1f4b0db52520ce0829a384">void HAL_UART_MspInit(UART_HandleTypeDef *huart){</div><div class="notion-text notion-block-44c6c6f223d24fb78f1138b6c889ee11">GPIO_InitTypeDef GPIO_InitType;</div><div class="notion-text notion-block-c945f4234cf24dcabc77e7f62b689ef4">if(huart-&gt;Instance == USART1){<div class="notion-text-children"><div class="notion-text notion-block-39ab9befdf0f41da83dbf2e1dd54d28d">__HAL_RCC_GPIOA_CLK_ENABLE();</div><div class="notion-text notion-block-d5c1571c5bc44fe8aa205c00e2d4d666">__HAL_RCC_USART1_CLK_ENABLE();</div><div class="notion-text notion-block-5a08f0e5d36b4ec8b29edec7f58533d0">__HAL_RCC_DMA1_CLK_ENABLE();</div><div class="notion-text notion-block-354417dd85494611b8ef288d23502fc1">GPIO_<a class="notion-link" href="http://InitType.Pin" target="_blank" rel="noopener noreferrer">InitType.Pin</a> = GPIO_PIN_9;</div><div class="notion-text notion-block-f70ae35e6d4645548ab96a3e1306af2c">GPIO_InitType.Mode = GPIO_MODE_AF_PP;</div><div class="notion-text notion-block-dd35dee433684d0fafd612d406a56f13">GPIO_InitType.Speed = GPIO_SPEED_FREQ_MEDIUM;</div><div class="notion-text notion-block-ad833da5db3a41eca3b477145ab4ff2b">HAL_GPIO_Init(GPIOA,&amp;GPIO_InitType);</div><div class="notion-text notion-block-e1ae803cb91d45eb82e0d20e58c45f05">GPIO_<a class="notion-link" href="http://InitType.Pin" target="_blank" rel="noopener noreferrer">InitType.Pin</a> = GPIO_PIN_10;</div><div class="notion-text notion-block-50565726548e42dea44c05a76a3073e8">GPIO_InitType.Mode = GPIO_MODE_AF_INPUT;</div><div class="notion-text notion-block-3d99e609465d4ad1a1bea451a335340f">GPIO_InitType.Pull = GPIO_PULLUP;<div class="notion-text-children"><div class="notion-text notion-block-a8e609a1d58349a39ce06ef166c5a539">HAL_GPIO_Init(GPIOA,&amp;GPIO_InitType);</div><div class="notion-text notion-block-bbb256505a4e47478ecd03f0b521b885">HAL_NVIC_SetPriority(USART1_IRQn,3,0);</div><div class="notion-text notion-block-69e8ffae7a014c2f9900da7358a59dcb">HAL_NVIC_EnableIRQ(USART1_IRQn);</div><div class="notion-text notion-block-ed1990c6b735487bb8677c56c108143a">uart1.dmatx.Instance = DMA1_Channel4;</div><div class="notion-text notion-block-772be6ed811a4898a2b60eadb3df02b9">uart1.dmatx.Init.Direction = DMA_MEMORY_TO_PERIPH;</div><div class="notion-text notion-block-33edd26ee1e14069b6e54c464c5a70b0">uart1.dmatx.Init.PeriphInc = DMA_PINC_DISABLE;</div><div class="notion-text notion-block-8a358d0f0e754bfbb79ff31da19df3d1">uart1.dmatx.Init.MemInc = DMA_MINC_ENABLE;</div><div class="notion-text notion-block-d2574a67713241ff97c92b7c7e98089d">uart1.dmatx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;</div><div class="notion-text notion-block-1f44ec9fb8514024b9e429d7255ffefa">uart1.dmatx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;</div><div class="notion-text notion-block-c8570d14da7f4b9bb33da884a596f26d">uart1.dmatx.Init.Mode = DMA_NORMAL;</div><div class="notion-text notion-block-95289f63a197462d8717397a5a93372b">uart1.dmatx.Init.Priority = DMA_PRIORITY_MEDIUM;</div><div class="notion-text notion-block-39d7eac036224a318dbb548f99c8e138">__HAL_LINKDMA(huart, hdmatx, uart1.dmatx);</div><div class="notion-text notion-block-14501701c5f549849ab42c5845c1f8ff">HAL_DMA_Init(&amp;uart1.dmatx);</div><div class="notion-text notion-block-22c4ee2092b5472e9ccb94c25b38d173">HAL_NVIC_SetPriority(DMA1_Channel4_IRQn,3,0);</div><div class="notion-text notion-block-8f2acf9d28be45b5a35676471e3e8d95">HAL_NVIC_EnableIRQ(DMA1_Channel4_IRQn);</div><div class="notion-text notion-block-b6297f6543504c6a84953d191c6c713b">uart1.dmarx.Instance = DMA1_Channel5;</div><div class="notion-text notion-block-2ce91d2d2e284bb7addab235c94498a2">uart1.dmarx.Init.Direction = DMA_PERIPH_TO_MEMORY;</div><div class="notion-text notion-block-a4039d1298644c278e6a1c6615071708">uart1.dmarx.Init.PeriphInc = DMA_PINC_DISABLE;</div><div class="notion-text notion-block-a7baa0c8aadb487ba0ab0b1c48476248">uart1.dmarx.Init.MemInc = DMA_MINC_ENABLE;</div><div class="notion-text notion-block-1f4ecc48efe44033a83644446956b7b2">uart1.dmarx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;</div><div class="notion-text notion-block-80696d26ba33447d8d7529b3d3f21d47">uart1.dmarx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;</div><div class="notion-text notion-block-d13e2efe17dd4862a2012929ec1867e2">uart1.dmarx.Init.Mode = DMA_NORMAL;</div><div class="notion-text notion-block-2d3293e3fa1b499fbdc78654b3202e51">uart1.dmarx.Init.Priority = DMA_PRIORITY_MEDIUM;</div><div class="notion-text notion-block-c805d943ed5f4c1f9b1672d8eb338731">__HAL_LINKDMA(huart, hdmarx, uart1.dmarx);</div><div class="notion-text notion-block-41bea6235a694c8c8136a95d52789ad3">HAL_DMA_Init(&amp;uart1.dmarx);</div><div class="notion-text notion-block-b6a1a614a70e44c097a7519193716016">HAL_NVIC_SetPriority(DMA1_Channel5_IRQn,3,0);</div><div class="notion-text notion-block-667210cb80bd42fd80e47aa2962e4f9c">HAL_NVIC_EnableIRQ(DMA1_Channel5_IRQn);</div><div class="notion-text notion-block-1cc1b16e7b00462881fba5aa71516276">}else if(huart-&gt;Instance == USART2){<div class="notion-text-children"><div class="notion-text notion-block-2e5e0581601f4b69b13359533fc9082d">__HAL_RCC_GPIOA_CLK_ENABLE();</div><div class="notion-text notion-block-8ffe35291c28415c8ff0de8114802b27">__HAL_RCC_USART2_CLK_ENABLE();</div><div class="notion-text notion-block-5e75b7216685426db1982272e827cac8">__HAL_RCC_DMA1_CLK_ENABLE();</div><div class="notion-text notion-block-199a75df479c44aeac4a97ed2a7ae59a">GPIO_<a class="notion-link" href="http://InitType.Pin" target="_blank" rel="noopener noreferrer">InitType.Pin</a> = GPIO_PIN_2;</div><div class="notion-text notion-block-8e6e27bc37764bd8b31f7f0ce2570129">GPIO_InitType.Mode = GPIO_MODE_AF_OD;   //OD模式</div><div class="notion-text notion-block-bf69e516eb394dd080b254dffea37189">GPIO_InitType.Speed = GPIO_SPEED_FREQ_MEDIUM;</div><div class="notion-text notion-block-4b0d433d9ce24a07bfb3c1f847a6e678">HAL_GPIO_Init(GPIOA,&amp;GPIO_InitType);</div><div class="notion-text notion-block-6650b9f97f2f4a22a3a7a1f8280bd3cd">GPIO_<a class="notion-link" href="http://InitType.Pin" target="_blank" rel="noopener noreferrer">InitType.Pin</a> = GPIO_PIN_3;</div><div class="notion-text notion-block-3b3deaa22159432c8df9f62f7691f1ce">GPIO_InitType.Mode = GPIO_MODE_AF_INPUT;</div><div class="notion-text notion-block-1eca936ad3634060b3ff81efe5ae645c">GPIO_InitType.Pull = GPIO_NOPULL;</div><div class="notion-text notion-block-6795576284bd4e558f98c2060c794fa4">HAL_GPIO_Init(GPIOA,&amp;GPIO_InitType);</div><div class="notion-text notion-block-42dece57c99a4816b514fd2ab423f8fd">HAL_NVIC_SetPriority(USART2_IRQn,3,0);</div><div class="notion-text notion-block-2d546eda693444d7abe5e6d945d01fee">HAL_NVIC_EnableIRQ(USART2_IRQn);</div><div class="notion-text notion-block-ddada3da459748b09ea4efaed76eb748">uart2.dmatx.Instance = DMA1_Channel7;</div><div class="notion-text notion-block-bac5729bea3d4f97bf05fe09124fd33d">uart2.dmatx.Init.Direction = DMA_MEMORY_TO_PERIPH;</div><div class="notion-text notion-block-3490f7c7d6054dcb94883e468b1d9503">uart2.dmatx.Init.PeriphInc = DMA_PINC_DISABLE;</div><div class="notion-text notion-block-c881e0e8951a4ddfba17cd7ae2fc2288">uart2.dmatx.Init.MemInc = DMA_MINC_ENABLE;</div><div class="notion-text notion-block-21b72b9ed05445dd8581ed023c47be5a">uart2.dmatx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;</div><div class="notion-text notion-block-d44b5a1eab6b4782924b4a957ce0ed04">uart2.dmatx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;</div><div class="notion-text notion-block-bfe93b7f22864793843a12ceae2d6615">uart2.dmatx.Init.Mode = DMA_NORMAL;</div><div class="notion-text notion-block-46e6fb8f5b784a1aa8f3626173175e95">uart2.dmatx.Init.Priority = DMA_PRIORITY_MEDIUM;</div><div class="notion-text notion-block-6dfb588a3dd9413fb17fa84502f81ac6">__HAL_LINKDMA(huart, hdmatx, uart2.dmatx);</div><div class="notion-text notion-block-88046f49d10f456b8c3ba1fae45a5a9b">HAL_DMA_Init(&amp;uart2.dmatx);</div><div class="notion-text notion-block-62c565d445024803a31a60935996f67f">HAL_NVIC_SetPriority(DMA1_Channel7_IRQn,3,0);</div><div class="notion-text notion-block-8453978a8f1a425ab487c041ad54f322">HAL_NVIC_EnableIRQ(DMA1_Channel7_IRQn);</div><div class="notion-text notion-block-e199a4218db14e8f90ea78fe163422bc">uart2.dmarx.Instance = DMA1_Channel6;</div><div class="notion-text notion-block-77fb3b1bbc5547c58237dcf767a1f490">uart2.dmarx.Init.Direction = DMA_PERIPH_TO_MEMORY;</div><div class="notion-text notion-block-5cace1da2a384d98a54f3a3641370ccf">uart2.dmarx.Init.PeriphInc = DMA_PINC_DISABLE;</div><div class="notion-text notion-block-2bd0cd91a06246c9ba617e6763b67a4b">uart2.dmarx.Init.MemInc = DMA_MINC_ENABLE;</div><div class="notion-text notion-block-55e14a5761854e8aadd0cdf5311e7f0e">uart2.dmarx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;</div><div class="notion-text notion-block-c3359532d85141108c556d7f82055fe2">uart2.dmarx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;</div><div class="notion-text notion-block-fd8eb7bd615240c0a3a26bc17f76b27f">uart2.dmarx.Init.Mode = DMA_NORMAL;</div><div class="notion-text notion-block-e4078a9c8ea644f7926ecaa566e9d8d6">uart2.dmarx.Init.Priority = DMA_PRIORITY_MEDIUM;</div><div class="notion-text notion-block-580c07b434014b2bb05df6fd9d3caa39">__HAL_LINKDMA(huart, hdmarx, uart2.dmarx);</div><div class="notion-text notion-block-c26ac002a6ac48d3804ada6e3fadc45e">HAL_DMA_Init(&amp;uart2.dmarx);</div><div class="notion-text notion-block-30a9bb7a03e94fafa1aec8fddf019f86">HAL_NVIC_SetPriority(DMA1_Channel6_IRQn,3,0);</div><div class="notion-text notion-block-83ccdafce3f2473ab60049d8d6281882">HAL_NVIC_EnableIRQ(DMA1_Channel6_IRQn);</div></div></div><div class="notion-text notion-block-b1c55412333d4608996e9436d38636f2">}else if(huart-&gt;Instance == USART3){<div class="notion-text-children"><div class="notion-text notion-block-03d2e44812c242fcb2cf137145feee1b">__HAL_RCC_GPIOB_CLK_ENABLE();</div><div class="notion-text notion-block-28d98655db4e4317af4e0e909e82fdd6">__HAL_RCC_USART3_CLK_ENABLE();</div><div class="notion-text notion-block-419cf88cabc746f6920bb16b00de6398">__HAL_RCC_DMA1_CLK_ENABLE();</div><div class="notion-text notion-block-db54fa21d1b14630a00485719a1ece98">GPIO_<a class="notion-link" href="http://InitType.Pin" target="_blank" rel="noopener noreferrer">InitType.Pin</a> = GPIO_PIN_10;</div><div class="notion-text notion-block-4b3dd2dd425d4ade96198df707e5ae78">GPIO_InitType.Mode = GPIO_MODE_AF_OD;</div><div class="notion-text notion-block-3ac42cc42dcc45b09e30d5228cdb2e3a">GPIO_InitType.Speed = GPIO_SPEED_FREQ_MEDIUM;</div><div class="notion-text notion-block-05414a30a5f64701bea4c8edfa0f06df">HAL_GPIO_Init(GPIOB,&amp;GPIO_InitType);</div><div class="notion-text notion-block-444a7b08170d4d639ba39ff7f8d42e78">HAL_NVIC_SetPriority(USART3_IRQn,3,0);</div><div class="notion-text notion-block-8de63861221f40188a5430c5404c3f23">HAL_NVIC_EnableIRQ(USART3_IRQn);</div><div class="notion-text notion-block-27f28708725349a6b222622715177438">uart3.dmatx.Instance = DMA1_Channel2;</div><div class="notion-text notion-block-c7e035b43c144fe586e3a2d52b175e33">uart3.dmatx.Init.Direction = DMA_MEMORY_TO_PERIPH;</div><div class="notion-text notion-block-270b9acad20240b4af0daebb13b038c8">uart3.dmatx.Init.PeriphInc = DMA_PINC_DISABLE;</div><div class="notion-text notion-block-19b871ccabfb47899aad2bf84f335652">uart3.dmatx.Init.MemInc = DMA_MINC_ENABLE;</div><div class="notion-text notion-block-6288b30a1e02464dadec0a81a7b47334">uart3.dmatx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;</div><div class="notion-text notion-block-31f9cfa0144d44389b55bfd7d6b925bc">uart3.dmatx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;</div><div class="notion-text notion-block-38782fcc32ac4985bb970980791a8961">uart3.dmatx.Init.Mode = DMA_NORMAL;</div><div class="notion-text notion-block-99d9913769ba4c3089de5e5b5646a474">uart3.dmatx.Init.Priority = DMA_PRIORITY_MEDIUM;</div><div class="notion-text notion-block-77d51b455f4b433ab2dc6e240462099e">__HAL_LINKDMA(huart, hdmatx, uart3.dmatx);</div><div class="notion-text notion-block-d60d3fa77d6b47c7b4007449d4683678">HAL_DMA_Init(&amp;uart3.dmatx);</div><div class="notion-text notion-block-1ec0e8cb6a8d4993aab4517983fd872f">HAL_NVIC_SetPriority(DMA1_Channel2_IRQn,3,0);</div><div class="notion-text notion-block-5e0038c8b81144cda38243bbcaa46660">HAL_NVIC_EnableIRQ(DMA1_Channel2_IRQn);</div><div class="notion-text notion-block-62a75ce8a99142bc85275566857b8d33">uart3.dmarx.Instance = DMA1_Channel3;</div><div class="notion-text notion-block-063f047c6bca4a408a292c4ea0d32cd0">uart3.dmarx.Init.Direction = DMA_PERIPH_TO_MEMORY;</div><div class="notion-text notion-block-381c8c290c4c49d0a80b9fb61ddd53c4">uart3.dmarx.Init.PeriphInc = DMA_PINC_DISABLE;</div><div class="notion-text notion-block-320ac589e67e4d6e9e14db30583f7aaa">uart3.dmarx.Init.MemInc = DMA_MINC_ENABLE;</div><div class="notion-text notion-block-4b332775468d4140a39972f4b32eacd7">uart3.dmarx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;</div><div class="notion-text notion-block-60c374e0d04846cc9289385fbcef5815">uart3.dmarx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;</div><div class="notion-text notion-block-1717ccbb6f974526a0cecaa43c83fb4d">uart3.dmarx.Init.Mode = DMA_NORMAL;</div><div class="notion-text notion-block-b82ed43e02e6430ca943ad31d6e15e49">uart3.dmarx.Init.Priority = DMA_PRIORITY_MEDIUM;</div><div class="notion-text notion-block-7f1fc1d427fd4a8e95ae3c45e6dd22f5">__HAL_LINKDMA(huart, hdmarx, uart3.dmarx);</div><div class="notion-text notion-block-780d9e2a85704e39b710586ae7d2314f">HAL_DMA_Init(&amp;uart3.dmarx);</div><div class="notion-text notion-block-42b0ff4b18a34ad9bdf645b2b3729b4d">HAL_NVIC_SetPriority(DMA1_Channel3_IRQn,3,0);</div><div class="notion-text notion-block-99d32850872b4341969c9f0c9ab487f3">HAL_NVIC_EnableIRQ(DMA1_Channel3_IRQn);</div></div></div><div class="notion-text notion-block-7b442cc25e4f4f79812795fc877d5b01">}</div></div></div></div></div><div class="notion-text notion-block-7787d5fa4adb4d428ba3adeae3ef84df">}</div><div class="notion-text notion-block-a544eab09cb94ffb9ee0dc029666ec28">void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)</div><div class="notion-text notion-block-91a945b3d1c447e1b4e74d9cdc5bf5cd">{</div><div class="notion-text notion-block-41a2a1a5b253419a80072ec834e31e8d">if(huart-&gt;Instance == USART1){</div><div class="notion-text notion-block-f0e85458a4774051b4d4ec6c41e8195d">}</div><div class="notion-text notion-block-05af3a792aa147c1ba802faa1e00c979">}</div><div class="notion-text notion-block-225b45e7f23a4b3f9d5f429237f4a783">void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart)</div><div class="notion-text notion-block-929e59303533461ca89aa66bc278be87">{</div><div class="notion-text notion-block-68ea2d07993240ab83e4f7eff18fb0f4">if(huart-&gt;Instance == USART1){</div><div class="notion-text notion-block-517f7cdf93c74fbe8d1873604722d8f9">}</div><div class="notion-text notion-block-791a226f91224726ba008865514b3480">}</div><div class="notion-text notion-block-b0c028ddd30f44e0ac8889b12c9a75e9">void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)</div><div class="notion-text notion-block-f36c34cf5d814cdbb864225fae511115">{	</div><div class="notion-text notion-block-31eca80bd5ff47ada0b7841e61581e98">if(huart-&gt;Instance == USART1){<div class="notion-text-children"><div class="notion-text notion-block-12235b66405b4767b673d3b9ff3ea15d">uart1.TxState = 0;</div></div></div><div class="notion-text notion-block-0949bb6a2f4447c7ae0695e511152ffb">}else if(huart-&gt;Instance == USART2){<div class="notion-text-children"><div class="notion-text notion-block-e03a07d9844e41418935d7c1beba6224">uart2.TxState = 0;</div></div></div><div class="notion-text notion-block-eece0c3fcad947d293057874bbbb9c9f">}else if(huart-&gt;Instance == USART3){<div class="notion-text-children"><div class="notion-text notion-block-9f25c4739e9b4b4e97263e1aabfb2b98">uart3.TxState = 0;</div></div></div><div class="notion-text notion-block-d4e8718e2e8b413eb69ee5f53ea5bc27">}</div><div class="notion-text notion-block-b0aa79a224f24fc5a55e7debd52f838e">}</div><div class="notion-text notion-block-41dd2fd13c3b4609bc13257bd0738023">/<em> 接收终止回调 </em>/</div><div class="notion-text notion-block-9a1cfeb8732e45d9a6d6f1e4dc864eac">void HAL_UART_AbortReceiveCpltCallback(UART_HandleTypeDef *huart)</div><div class="notion-text notion-block-8d66a2e36faa4fb4aac73c0c248b8205">{</div><div class="notion-text notion-block-f469f57af8394307b7d10ec95e9a651e">if(huart-&gt;Instance == USART1){<div class="notion-text-children"><div class="notion-text notion-block-cd502a5f31cd48be95a4ab8df5285bae">uart1.RxInPtr-&gt;end = &amp;U1_RxBuff[uart1.RxCounter - 1];</div><div class="notion-text notion-block-84cd5116614745aba63601780d64b464">uart1.RxInPtr++;</div><div class="notion-text notion-block-06e361461c744b40b6172898b9a2f264">if(uart1.RxInPtr == uart1.RxEndPtr){<div class="notion-text-children"><div class="notion-text notion-block-4090d1b87f6346e0b252b1d9d7496d55">uart1.RxInPtr = &amp;uart1.RxLocation[0];</div></div></div><div class="notion-text notion-block-955f03b60e8a442ca7b77adfe9347203">}<div class="notion-text-children"><div class="notion-text notion-block-19dd2fdfc59a4a259d49f374684975b8">if((U1_RX_SIZE - uart1.RxCounter)&lt;U1_RX_MAX){<div class="notion-text-children"><div class="notion-text notion-block-054177336b6249e4b74f9304b2dd3993">uart1.RxCounter = 0;</div><div class="notion-text notion-block-866c2870742c4579b1a372cb638f8f71">uart1.RxInPtr-&gt;start = U1_RxBuff;</div></div></div><div class="notion-text notion-block-cdcf7c6f1f9c46ecb22e49efff57ec0a">}else{<div class="notion-text-children"><div class="notion-text notion-block-fbb9411edbdf4d07a2d201102674912a">uart1.RxInPtr-&gt;start = &amp;U1_RxBuff[uart1.RxCounter];</div></div></div><div class="notion-text notion-block-005ce7b38b2744869bd4f6993e631e65">}</div><div class="notion-text notion-block-54b210ad5b01424aabfc5b2336e3aa20">HAL_UART_Receive_DMA(&amp;uart1.uart,uart1.RxInPtr-&gt;start,U1_RX_MAX);</div><div class="notion-text notion-block-a7907e40ee5f4074b609ac7d6019de77">}else if(huart-&gt;Instance == USART2){<div class="notion-text-children"><div class="notion-text notion-block-c00a036b36d44de99b826c548fc3c9de">uart2.RxInPtr-&gt;end = &amp;U2_RxBuff[uart2.RxCounter - 1];</div><div class="notion-text notion-block-a26ef74c76c74700922fe01eaaf92487">uart2.RxInPtr++;</div><div class="notion-text notion-block-c6fc9a28c14941ad82ed2397cde7920e">if(uart2.RxInPtr == uart2.RxEndPtr){<div class="notion-text-children"><div class="notion-text notion-block-02ee8a9f1bfb427581946a7e02dc34fd">uart2.RxInPtr = &amp;uart2.RxLocation[0];</div></div></div><div class="notion-text notion-block-60821dc767ae4517905fbbff9cf7b1cc">}</div><div class="notion-text notion-block-09c01128bf364f00af8ac26dd104cba5">if((U2_RX_SIZE - uart2.RxCounter)&lt;U2_RX_MAX){<div class="notion-text-children"><div class="notion-text notion-block-9e7c8ea5c1ec460e9f31ba41947ba7b9">uart2.RxCounter = 0;</div><div class="notion-text notion-block-7cb5796682804785bf73f69d58f09fca">uart2.RxInPtr-&gt;start = U2_RxBuff;</div></div></div><div class="notion-text notion-block-2483a9e47a654382a48fdc1902fdb8bc">}else{<div class="notion-text-children"><div class="notion-text notion-block-d0053abb498043699da68cd7aed11f4e">uart2.RxInPtr-&gt;start = &amp;U2_RxBuff[uart2.RxCounter];</div></div></div><div class="notion-text notion-block-e66032a4fd084069a8d86a0dfd6e09d4">}</div><div class="notion-text notion-block-ae0d8a0b92ea4787967e85e7777d36e7">HAL_MultiProcessor_EnterMuteMode(&amp;uart2.uart);  //手动进入静默模式</div><div class="notion-text notion-block-ea0c0473f53f4f26a76822aa5e66ecf0">__HAL_UART_ENABLE_IT(&amp;uart2.uart, UART_IT_RXNE);    //打开接收中断</div><div class="notion-text notion-block-21b52305cc7f47e886343f15d36c4679">HAL_UART_Receive_DMA(&amp;uart2.uart,uart2.RxInPtr-&gt;start,U2_RX_MAX);</div></div></div><div class="notion-text notion-block-9fe6030721fa480492eb030808660186">}else if(huart-&gt;Instance == USART3){<div class="notion-text-children"><div class="notion-text notion-block-b45a8c3c712b467ea42469705dc2316d">uart3.RxInPtr-&gt;end = &amp;U3_RxBuff[uart3.RxCounter - 1];</div><div class="notion-text notion-block-739319247ad7498c98ca55da28bc1453">uart3.RxInPtr++;</div><div class="notion-text notion-block-abdb9177f2b446dca18f3a8389809ef1">if(uart3.RxInPtr == uart3.RxEndPtr){<div class="notion-text-children"><div class="notion-text notion-block-d6dc31eecbcb49bf87600aa0f8aae85d">uart3.RxInPtr = &amp;uart3.RxLocation[0];</div></div></div><div class="notion-text notion-block-2c277beb238a427e846ed5b591d48e8e">}</div><div class="notion-text notion-block-5f75512053a8444b88fa640166ff8e28">if((U3_RX_SIZE - uart3.RxCounter)&lt;U3_RX_MAX){<div class="notion-text-children"><div class="notion-text notion-block-4daf9f4723794f3689c793172d425423">uart3.RxCounter = 0;</div><div class="notion-text notion-block-a5ec4158cdc642768961243f4e338e28">uart3.RxInPtr-&gt;start = U3_RxBuff;</div></div></div><div class="notion-text notion-block-ccc05c3e32fb45bcb9031937476c8b10">}else{<div class="notion-text-children"><div class="notion-text notion-block-7bfc78aa6c0248d3b025e1c3d2cba93b">uart3.RxInPtr-&gt;start = &amp;U3_RxBuff[uart3.RxCounter];</div></div></div><div class="notion-text notion-block-d9bc4d7f68184711b79d4e50b28d56fb">}</div><div class="notion-text notion-block-ac0f41765ca242238961a8467feebae8">HAL_UART_Receive_DMA(&amp;uart3.uart,uart3.RxInPtr-&gt;start,U3_RX_MAX);</div></div></div><div class="notion-text notion-block-0b32fd59ddb649afb2304326f818223c">}</div></div></div></div></div><div class="notion-text notion-block-fe181168b9f74f2b9bc2210b95ea3024">}<div class="notion-text-children"><details class="notion-toggle notion-block-f2ebb94e4145473c9ad77d15b3f4ff79"><summary><h4 class="notion-h notion-h3 notion-block-f2ebb94e4145473c9ad77d15b3f4ff79" data-id="f2ebb94e4145473c9ad77d15b3f4ff79"><span><div id="f2ebb94e4145473c9ad77d15b3f4ff79" class="notion-header-anchor"></div><span class="notion-h-title">uart.h</span></span></h4></summary><div><div class="notion-text notion-block-68e47f29680a437e856453f81a996c40">/<em>-----------------------------------------------------</em>/</div><div class="notion-text notion-block-ef66f1a64dca4b0abfa93f4c582c44b9">/<em>                     程序结构                        </em>/</div><div class="notion-text notion-block-061f5312a57847c989752614de3b21fe">/<em>-----------------------------------------------------</em>/</div><div class="notion-text notion-block-936755e6cf3f4dbca2387dfe5ccbca66">/<em>USER   ：包含程序的 main 函数，是整个程序的入        </em>/</div><div class="notion-text notion-block-c80795b047ff422e9dc5186dd654e4a8">/<em>HW     ：包含开发板各种功能外设的驱动程序            </em>/</div><div class="notion-text notion-block-4f925fddd5994214b0d0c7d5b3d8aa1d">/<em>LIB    ：官方提供的 HAL 库文件                       </em>/</div><div class="notion-text notion-block-0f330bdf9a354b5cbf055a6979bead8a">/<em>CMSIS  ：CM3 内核相关的启动文件系统文件              </em>/</div><div class="notion-text notion-block-cee0d6d04dfa4c6080bbd0030a160299">/<em>-----------------------------------------------------</em>/</div><div class="notion-text notion-block-d4b6bd4065e24f90956a02725eeb3468">/<em>                                                     </em>/</div><div class="notion-text notion-block-b8c02ab8ef994525ad5a1d0a50ab316a">/<em>                实现定时器功能的头文件               </em>/</div><div class="notion-text notion-block-aa94d7355af94cd88e40d6aea8ad92b6">/<em>                                                     </em>/</div><div class="notion-text notion-block-c30699eaf3624a85ba1b677a98462db7">/<em>-----------------------------------------------------</em>/</div><div class="notion-text notion-block-54e35d6cfc1e4dcd8defe988a936b619">#ifndef _TIMER_H</div><div class="notion-text notion-block-7db0d2292c6b48208953d7d458b133d8">#define _TIMER_H</div><div class="notion-text notion-block-4186f8488aa2439da59050c8aee739cc">#include &quot;stdint.h&quot;  </div><div class="notion-text notion-block-75fa30cd97364c5b80c43b2d905df393">#include &quot;stm32f1xx_hal_tim.h&quot;</div><div class="notion-text notion-block-41784b1092374419b375cb115350cdeb">extern TIM_HandleTypeDef htim4;                   //外部变量声明</div><div class="notion-text notion-block-5632c5af8bf24baab2ebb528d9edd06a">void TIM4_TimerInit(uint16_t, uint16_t);          //函数声明</div><div class="notion-text notion-block-fd355a8b4c834127bbc107d279b0e616">#endif</div></div></details></div></div><details class="notion-toggle notion-block-95e22516e14a4ee889979d6867eb21f9"><summary><h4 class="notion-h notion-h3 notion-block-95e22516e14a4ee889979d6867eb21f9" data-id="95e22516e14a4ee889979d6867eb21f9"><span><div id="95e22516e14a4ee889979d6867eb21f9" class="notion-header-anchor"></div><span class="notion-h-title">sw.c</span></span></h4></summary><div><div class="notion-text notion-block-80104a63f4ea4fb8b53fb94ebab03bac">#include &quot;stm32f1xx_hal.h&quot;</div><div class="notion-text notion-block-1aab6c8ac85e43eb93ed17906ac3a721">#include &quot;sw.h&quot;</div><div class="notion-text notion-block-14eb38abc49c4a0b920672ad636b03f8">#include &quot;uart.h&quot;</div><div class="notion-text notion-block-4157bf6cfa4843209abc59b914108db9">uint8_t sw1_sta,sw2_sta;    //0:没有按下  1：按下了</div><div class="notion-text notion-block-82cceafe55f340d7a662bf50cb09f05a">void SW_Init(void){<div class="notion-text-children"><div class="notion-text notion-block-972d79ad440b475c98fd7e0041e9113f">GPIO_InitTypeDef GPIO_InitType;</div><div class="notion-text notion-block-02f8888a8ed444409b81679f19c37c76">__HAL_RCC_GPIOC_CLK_ENABLE();</div><div class="notion-text notion-block-df595c188cc645c9add52718b8de946f">GPIO_<a class="notion-link" href="http://InitType.Pin" target="_blank" rel="noopener noreferrer">InitType.Pin</a> = GPIO_PIN_14;</div><div class="notion-text notion-block-0e73ecc626fc407fbba1dda01514a3c8">GPIO_InitType.Mode = GPIO_MODE_INPUT;</div><div class="notion-text notion-block-eceeb93e990d4f69b79404f8282786f8">GPIO_InitType.Pull = GPIO_PULLDOWN;</div><div class="notion-text notion-block-ea5961dfc2b145039beaa1b69de5345a">HAL_GPIO_Init(GPIOC,&amp;GPIO_InitType);</div><div class="notion-text notion-block-88da4ba3ab08445cad5071f32f097309">__HAL_RCC_GPIOA_CLK_ENABLE();</div><div class="notion-text notion-block-e5e8ae6993c146e5aa3e20f73254bdc7">GPIO_<a class="notion-link" href="http://InitType.Pin" target="_blank" rel="noopener noreferrer">InitType.Pin</a> = GPIO_PIN_0;</div><div class="notion-text notion-block-7d0b243c5a3149668d8383bc74865975">GPIO_InitType.Mode = GPIO_MODE_INPUT;</div><div class="notion-text notion-block-74c955fd5aee49a4b56ed1d2d4a698d4">GPIO_InitType.Pull = GPIO_PULLDOWN;</div><div class="notion-text notion-block-4be48c0a2b3349c2b280e55ed8c7d42b">HAL_GPIO_Init(GPIOA,&amp;GPIO_InitType);</div></div></div><div class="notion-text notion-block-08407a5f2e5b4c10ae5d8477512df489">}</div><div class="notion-text notion-block-196d8e0b9da54180b6cebb181d4c1041">void SW_InitEvent(void){</div><div class="notion-text notion-block-25f60c2a948b47cb8f2694880bb94334">GPIO_InitTypeDef GPIO_InitType;</div><div class="notion-text notion-block-a6e826d98a3c42d896527974c4a27a33">//SW1</div><div class="notion-text notion-block-25c001b4551844e99909236023fb8e68">__HAL_RCC_GPIOA_CLK_ENABLE();</div><div class="notion-text notion-block-47e53d77990c44048fac7357a300370f">GPIO_<a class="notion-link" href="http://InitType.Pin" target="_blank" rel="noopener noreferrer">InitType.Pin</a> = GPIO_PIN_2;</div><div class="notion-text notion-block-2fefef61834147ef906604d75a04f699">GPIO_InitType.Mode = GPIO_MODE_EVT_RISING_FALLING;</div><div class="notion-text notion-block-b5ad57ffa1ff4770a1d43d41706261fe">GPIO_InitType.Pull = GPIO_PULLUP;</div><div class="notion-text notion-block-bab5d4a83bdc4dc093823d449c2ee9eb">HAL_GPIO_Init(GPIOA,&amp;GPIO_InitType);</div><div class="notion-text notion-block-8c74b83b8a084820a2ec37e7f8efcbe5">}</div><div class="notion-text notion-block-7c214b9ea60e4bf9b57c1bf3b63aa61a">void SW_InitEventOut(void){</div><div class="notion-text notion-block-07a7e5be6e624b419493a98c19cceb6a">GPIO_InitTypeDef GPIO_InitType;</div><div class="notion-text notion-block-d518d987238e4fd6832192985db02dc9">//PA3</div><div class="notion-text notion-block-5abb1517acd140989ed0dd3deb49b2c4">__HAL_RCC_GPIOA_CLK_ENABLE();</div><div class="notion-text notion-block-9e2ae6fb42c8437e8fd5134ae8ae8c04">__HAL_RCC_AFIO_CLK_ENABLE();</div><div class="notion-text notion-block-ddee61ae543045c296b37258a08b2906">GPIO_<a class="notion-link" href="http://InitType.Pin" target="_blank" rel="noopener noreferrer">InitType.Pin</a> = GPIO_PIN_3;</div><div class="notion-text notion-block-641db832cfbf40529eae8628ee5489f6">GPIO_InitType.Mode = GPIO_MODE_AF_PP;</div><div class="notion-text notion-block-304b258dad054ad4931dc75fed73d238">GPIO_InitType.Speed = GPIO_SPEED_FREQ_HIGH;</div><div class="notion-text notion-block-562b3d42b76a45199cf61cc3c5882068">HAL_GPIO_Init(GPIOA,&amp;GPIO_InitType);</div><div class="notion-text notion-block-7abbec5bbb654bb68b5a9f6b5e7a3941">HAL_GPIOEx_ConfigEventout(AFIO_EVENTOUT_PORT_A,AFIO_EVENTOUT_PIN_3);</div><div class="notion-text notion-block-1c51c892963f4704bc7c36ebb4a24d0c">HAL_GPIOEx_EnableEventout();</div><div class="notion-text notion-block-c9065a0cbbdd49ef8a148a27aaf31fc2">}</div><div class="notion-text notion-block-764f28770d114b50ac32ce1b8a4719c3">//mode 0：按下执行  1：抬起执行</div><div class="notion-text notion-block-68713c36d61c4905b0ddad113c094aa2">void SW_Init_IT(uint8_t mode){</div><div class="notion-text notion-block-deec1e974b3b49cfaaa8728751d4bf31">GPIO_InitTypeDef GPIO_InitType;</div><div class="notion-text notion-block-098b2dc90b824c6cb4ec1a39552d5c17">__HAL_RCC_GPIOC_CLK_ENABLE();</div><div class="notion-text notion-block-6177e32ef22140a5acefd742db762942">GPIO_<a class="notion-link" href="http://InitType.Pin" target="_blank" rel="noopener noreferrer">InitType.Pin</a> = GPIO_PIN_14;</div><div class="notion-text notion-block-2aac5a2b1e974394b975c25cd1f3607b">if(mode == 0)<div class="notion-text-children"><div class="notion-text notion-block-360bc1822fa54d6e9ecc6aa827f3db95">GPIO_InitType.Mode = GPIO_MODE_IT_RISING;</div></div></div><div class="notion-text notion-block-4006cc3ed7c34d4dab958236d90193e2">else<div class="notion-text-children"><div class="notion-text notion-block-b8ea81dacc1e4d16822a58d317e212a3">GPIO_InitType.Mode = GPIO_MODE_IT_FALLING;</div></div></div><div class="notion-text notion-block-263094c3615946a6a64ffc57e79a7414">GPIO_InitType.Pull = GPIO_PULLDOWN;</div><div class="notion-text notion-block-c85fe5a29aa642f09015fe0a869a96be">HAL_GPIO_Init(GPIOC,&amp;GPIO_InitType);</div><div class="notion-text notion-block-354a4f17dc3e4dae842b45f1c3871b43">HAL_NVIC_SetPriority(EXTI15_10_IRQn,4,0);</div><div class="notion-text notion-block-dc5b355ac7534005951ca9c7676091f8">HAL_NVIC_EnableIRQ(EXTI15_10_IRQn);</div><div class="notion-text notion-block-cf8559ba4bf04c82832bfae51ae51854">__HAL_RCC_GPIOA_CLK_ENABLE();</div><div class="notion-text notion-block-d36a8725bd57464eaef5460f78531672">GPIO_<a class="notion-link" href="http://InitType.Pin" target="_blank" rel="noopener noreferrer">InitType.Pin</a> = GPIO_PIN_0;</div><div class="notion-text notion-block-9fbd3a780a3348cabc60bb3c113cd479">if(mode == 0)<div class="notion-text-children"><div class="notion-text notion-block-7c6a41362d244c28b34ab778f4f65505">GPIO_InitType.Mode = GPIO_MODE_IT_RISING;</div></div></div><div class="notion-text notion-block-aa11a857fc0d4268bf7f256593d07c00">else<div class="notion-text-children"><div class="notion-text notion-block-7dce9c9983e34188bd01cfd57751c715">GPIO_InitType.Mode = GPIO_MODE_IT_FALLING;</div></div></div><div class="notion-text notion-block-404166ee63314cb6b68850f61b2467d6">GPIO_InitType.Pull = GPIO_PULLDOWN;</div><div class="notion-text notion-block-02a0c774a46642e3b66d27655c37af82">HAL_GPIO_Init(GPIOA,&amp;GPIO_InitType);</div><div class="notion-text notion-block-65672f090ba84fd9a63430bd61a77269">HAL_NVIC_SetPriority(EXTI0_IRQn,3,0);</div><div class="notion-text notion-block-8a08810ffecb4a7195dd12bfe87476f7">HAL_NVIC_EnableIRQ(EXTI0_IRQn);</div><div class="notion-text notion-block-ec2f122358ec4021a9b70b8b12d15d8e">}</div><div class="notion-text notion-block-6e3ce432facd4d01947aa7aee6712d52">void SW_Init_IT2(void){</div><div class="notion-text notion-block-770a41c9de634fc19cb88b0cefbb81b2">GPIO_InitTypeDef GPIO_InitType;</div><div class="notion-text notion-block-c7f73147aced42898ea1397741b97e18">__HAL_RCC_GPIOC_CLK_ENABLE();</div><div class="notion-text notion-block-a162813c600e47c0a8ebab3226f2f2b0">GPIO_<a class="notion-link" href="http://InitType.Pin" target="_blank" rel="noopener noreferrer">InitType.Pin</a> = GPIO_PIN_14;</div><div class="notion-text notion-block-8288d37abcdb4ec2b1e2e3bcee809585">GPIO_InitType.Mode = GPIO_MODE_IT_RISING_FALLING;</div><div class="notion-text notion-block-c570e62abe514d74a2289b7c8bfd17c0">GPIO_InitType.Pull = GPIO_PULLDOWN;</div><div class="notion-text notion-block-33faba04eada4ce5a5e09f16d36b59eb">HAL_GPIO_Init(GPIOC,&amp;GPIO_InitType);</div><div class="notion-text notion-block-b87a9e3e142a4ad1a4b17cae565dd725">HAL_NVIC_SetPriority(EXTI15_10_IRQn,4,0);</div><div class="notion-text notion-block-0bcf8dfad4be4c4eb5dab0c69926e906">HAL_NVIC_EnableIRQ(EXTI15_10_IRQn);</div><div class="notion-text notion-block-9e4a570926444ec28985f873f2e8dd84">__HAL_RCC_GPIOA_CLK_ENABLE();</div><div class="notion-text notion-block-22a2e0a9c16543a5992ed8371b4aa9e3">GPIO_<a class="notion-link" href="http://InitType.Pin" target="_blank" rel="noopener noreferrer">InitType.Pin</a> = GPIO_PIN_0;</div><div class="notion-text notion-block-862c65567a6d4a21b2c4985500975045">GPIO_InitType.Mode = GPIO_MODE_IT_RISING_FALLING;</div><div class="notion-text notion-block-9496b9e5e2cb4ba2935cfa68993414d9">GPIO_InitType.Pull = GPIO_PULLUP;</div><div class="notion-text notion-block-d0fa98a7bc5e4b348aa1e2f15e021588">HAL_GPIO_Init(GPIOA,&amp;GPIO_InitType);</div><div class="notion-text notion-block-7a8f8259dc1b481b9477135f5154c876">HAL_NVIC_SetPriority(EXTI0_IRQn,3,0);</div><div class="notion-text notion-block-e22cafb324df427892cca2ec83759185">HAL_NVIC_EnableIRQ(EXTI0_IRQn);</div><div class="notion-text notion-block-7fdc4f8694944e74a3c41b6e51fdccee">}</div><div class="notion-text notion-block-b5a0b848df06480aa1580a4376c1e3e9">//返回值  0：无按键触发  8：SW8触发</div><div class="notion-text notion-block-b5c9337b732a4ae7a1bb9a17ebcc6cd1">//mode 0：按下执行  1：抬起执行</div><div class="notion-text notion-block-f51d0703ed1649b2817ed81c940c0a03">uint8_t SW_Scan(uint8_t mode){</div><div class="notion-text notion-block-2501ca1842af4caa881cbbb0badeda38">uint32_t i;</div><div class="notion-text notion-block-607811c0e7e9450383c0f4f78b189d25">/<em>-------------SW8------------------</em>/</div><div class="notion-text notion-block-ec8046240c98454f81a27b1dcacafdd1">if((SW1_IN == 1)&amp;&amp;(sw1_sta == 0)){<div class="notion-text-children"><div class="notion-text notion-block-f798e20eb55c4f49ac8ca0290e1a4716">for(i=0;i&lt;0x7FFF;i++){<div class="notion-text-children"><div class="notion-text notion-block-9463040157194a16a96ab3ab268a28fe">if(SW1_IN == 0){<div class="notion-text-children"><div class="notion-text notion-block-dc6bbe67a39344e2babc9fea216903ee">return 0;</div></div></div><div class="notion-text notion-block-8c403de717674cc4ba8be8caa8c2fe3d">}</div></div></div><div class="notion-text notion-block-7a54963590fe49e9834290d6e9c96337">}</div><div class="notion-text notion-block-7b31e57f291440638edba4caf03d3c9f">sw1_sta = 1;</div><div class="notion-text notion-block-d64e17256f114e8f908df8ed56bd4348">if(mode == 0){<div class="notion-text-children"><div class="notion-text notion-block-6cb3bd89815a445ca11b0d3acf5a5d07">return 8;</div></div></div><div class="notion-text notion-block-2b8cab89935a4f20a1a431cf4ed49fd2">}</div></div></div><div class="notion-text notion-block-45831b35ff964af69aa8dfb1dc7b662c">}else if((SW1_IN == 0)&amp;&amp;(sw1_sta == 1)){<div class="notion-text-children"><div class="notion-text notion-block-20672defc1ce4b1f86a4dc211a8ae375">for(i=0;i&lt;0x7FFF;i++){<div class="notion-text-children"><div class="notion-text notion-block-82d723628d8b438c890b0a2bac2615eb">if(SW1_IN == 1){<div class="notion-text-children"><div class="notion-text notion-block-fbcc7c421c4c40f0b3b3e34ec694a3ce">return 0;</div></div></div><div class="notion-text notion-block-07242a19e5614d04b720e7d822ec7c80">}</div></div></div><div class="notion-text notion-block-4aa6abf4ba5f4b4299d50151754f113f">}</div><div class="notion-text notion-block-840c1cc1744049229c1383f30b38d643">sw1_sta = 0;</div><div class="notion-text notion-block-e590adde65ce422a9bcd94053373edce">if(mode == 1){<div class="notion-text-children"><div class="notion-text notion-block-9fb9fe9cca074b2b8c817ea85a2009a0">return 8;</div></div></div><div class="notion-text notion-block-707f3beedcfb45af9454b9fd6fe603fa">}</div></div></div><div class="notion-text notion-block-e8933f89451c4f7086d418aa52b1dc76">}</div><div class="notion-text notion-block-b8f781c70fe44fdd8eddf6ed77c837d4">/<em>-------------SW11------------------</em>/</div><div class="notion-text notion-block-b736bb4f9b054c6aa91de2fe1b54d0ef">if((SW2_IN == 0)&amp;&amp;(sw2_sta == 0)){<div class="notion-text-children"><div class="notion-text notion-block-c4628f3e849449dfa48aff8ce3937a30">for(i=0;i&lt;0x7FFF;i++){<div class="notion-text-children"><div class="notion-text notion-block-8ba1335188924931a5909dcdd9901911">if(SW2_IN == 1){<div class="notion-text-children"><div class="notion-text notion-block-0cf84b7761f34f15936a7075e7f4b9e9">return 0;</div></div></div><div class="notion-text notion-block-2e4fb7ec31e74adaade01d211255707a">}</div></div></div><div class="notion-text notion-block-43aafe1c3f544163b94790742a1d4a67">}</div><div class="notion-text notion-block-23a0ac7d1e134897bcbc2ba1c6c6b353">sw2_sta = 1;</div><div class="notion-text notion-block-0ca4f6b6835c459297d806319e535671">if(mode == 0){<div class="notion-text-children"><div class="notion-text notion-block-96e0868a0d5c4a349dfa255184c50d1b">return 11;</div></div></div><div class="notion-text notion-block-111c887ea7fe413c9acf7f07f4a1fd1f">}<div class="notion-text-children"><div class="notion-text notion-block-bb82615760a1462a8100d8178d02aad8">}else if((SW2_IN == 1)&amp;&amp;(sw2_sta == 1)){<div class="notion-text-children"><div class="notion-text notion-block-f69e134b02ca484885fd4aa76a99e3c6">for(i=0;i&lt;0x7FFF;i++){<div class="notion-text-children"><div class="notion-text notion-block-01bcb0e7d03a413192b2c7e428a993fe">if(SW2_IN == 0){<div class="notion-text-children"><div class="notion-text notion-block-de53191f09154b1eafc7665f9f131772">return 0;</div></div></div><div class="notion-text notion-block-a1d74f4f883b48839258759eac4cc419">}</div></div></div><div class="notion-text notion-block-79788530f580413ea8bbc07c195739d3">}</div><div class="notion-text notion-block-8f4382a6602c499781c03c145f308aa8">sw2_sta = 0;</div><div class="notion-text notion-block-d7cd0136162e46c19fd49e93fd8613ee">if(mode == 1){<div class="notion-text-children"><div class="notion-text notion-block-ca1243571043446597135c0b23125b78">return 11;</div></div></div><div class="notion-text notion-block-0977752e66064445b5a66d87a3cde4f7">}</div></div></div><div class="notion-text notion-block-f953b83c026443bcb92859b30d7cd80c">}</div><div class="notion-text notion-block-88f58f608c474e8eb38c291a54d44e82">return 0;</div></div></div></div></div><div class="notion-text notion-block-5aa842564e27499da4cf5c4d0bcc30e6">}</div><div class="notion-text notion-block-40d8aefc4a754159a39da3030d5724ff">void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)</div><div class="notion-text notion-block-583ec9d45ee84a8a936927f96bc649dc">{</div><div class="notion-text notion-block-07f9885a9c9c4dc790e98aca4e2a42ce">uint32_t i;</div><div class="notion-text notion-block-3acf0ea588a147c68f959c228db6b014">//SW8:PC13  SW11:PA0（抢占优先级高）</div><div class="notion-text notion-block-f6c98743a08a4ab1a992284f7eadc408">switch(GPIO_Pin){<div class="notion-text-children"><div class="notion-text notion-block-2f88ca491584470aba5cd4f8ae98d7b3">case GPIO_PIN_14:	if(SW1_IN == 1){<div class="notion-text-children"><div class="notion-text notion-block-f0e2e7e4cb8140b2936f2733f01354f5">for(i=0;i&lt;0x7FFF;i++){<div class="notion-text-children"><div class="notion-text notion-block-b757f956e5984b328ffbe825e913edf4">if(SW1_IN == 0){<div class="notion-text-children"><div class="notion-text notion-block-5ff2d4694e8d47eda930278085252b32">return;</div></div></div><div class="notion-text notion-block-eeaa9a1a74904e0bba66bb2025f39a12">}</div></div></div><div class="notion-text notion-block-d94237750314451b8a4ed74d6a23b324">}</div><div class="notion-text notion-block-9bc6c37b47e1439b8c2ed9029c1ddc64">//U1_Txdata((uint8_t *)&quot;x81S1_LED&quot;,7);</div><div class="notion-text notion-block-1d101cff3cb64bf3bd73eff238a97133">U2_Txdata((uint8_t *)&quot;LED_ON&quot;,6);</div><div class="notion-text notion-block-46b076f2f3654361bc1668355cee7419">//U3_Txdata((uint8_t *)&quot;LED_ON&quot;,6);</div><div class="notion-text notion-block-b5522172c65b46e784ba16ed91c5b036">}else if(SW1_IN == 0){<div class="notion-text-children"><div class="notion-text notion-block-f1834592774d4aeba91d77af5d50a80f">for(i=0;i&lt;0x7FFF;i++){<div class="notion-text-children"><div class="notion-text notion-block-087c024877344d2f9256309ea60d07ba">if(SW1_IN == 1){<div class="notion-text-children"><div class="notion-text notion-block-185c595335ff488f8c802bc74bb2c7fd">return;</div></div></div><div class="notion-text notion-block-ab6c168c08f748db8dbeeee82e277736">}</div></div></div><div class="notion-text notion-block-5cd0af2c020c4c75a46e4d25e25c77b4">}</div><div class="notion-text notion-block-714778f7bdbe4d7aaae8edd877c21873">HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_0);</div></div></div><div class="notion-text notion-block-1dd20088e09b4af2966d60a77f66c8ea">} </div><div class="notion-text notion-block-162fe9ff48e3470698dac2187a94a353">break;</div></div></div><div class="notion-text notion-block-24f4384f03534ad1a4207217817868c1">case GPIO_PIN_0:    if(SW2_IN == 1){<div class="notion-text-children"><div class="notion-text notion-block-fb54f31be78b44f7b38b6a34448833c2">for(i=0;i&lt;0x7FFF;i++){<div class="notion-text-children"><div class="notion-text notion-block-a7ffdf5c2ace4573b94e6efa2ce846e1">if(SW2_IN == 0){<div class="notion-text-children"><div class="notion-text notion-block-2f27e92c025a4d8eb9fa5935f2b9470a">return;</div></div></div><div class="notion-text notion-block-454c8fb11dff4666b785b2ea1aeac328">}</div></div></div><div class="notion-text notion-block-a0b9170aa79942ac81eb1c0cd2a3afae">}</div><div class="notion-text notion-block-c1b7c34fbec54a39ba872ae98a25274c">//U1_Txdata((uint8_t *)&quot;x82S2_LED&quot;,7);</div><div class="notion-text notion-block-853fd9ec63bf45eba1e15df543605d7c">U2_Txdata((uint8_t *)&quot;LED_OFF&quot;,7);</div><div class="notion-text notion-block-5bdfa2d685b34c2da18af93908df8dde">//U3_Txdata((uint8_t *)&quot;LED_OFF&quot;,7);</div><div class="notion-text notion-block-63ae9c2d0e044fbeb6021c453703233c">}else if(SW2_IN == 1){<div class="notion-text-children"><div class="notion-text notion-block-fdd23a9c631d477a881e3578b74365ae">for(i=0;i&lt;0x7FFF;i++){<div class="notion-text-children"><div class="notion-text notion-block-a0b2a9ce93404927b7a1a58d3852677b">if(SW2_IN == 0){<div class="notion-text-children"><div class="notion-text notion-block-160fea719972456cadef3b08357ad389">return;</div></div></div><div class="notion-text notion-block-dde885e928fb46ccbcb35175c0c8821f">}</div></div></div><div class="notion-text notion-block-cb9bdfa9fcd74c3e9ac1a3e23a13b396">}</div><div class="notion-text notion-block-0374cd18bca347f187a4186737e0f3c6">HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_0);</div></div></div><div class="notion-text notion-block-a9c87693241a4f8bacec911e5790f70e">}</div><div class="notion-text notion-block-0652ac40860a4b7d83f2325ff4634f4d">break;</div></div></div></div></div><div class="notion-text notion-block-41627d62ed874ffd81560f89f02504ad">}</div><div class="notion-text notion-block-e1238fb2b8934b5b98dbf817f680e346">}</div><details class="notion-toggle notion-block-b42ff53e07564756a3cd26bef3034c7c"><summary><h4 class="notion-h notion-h3 notion-block-b42ff53e07564756a3cd26bef3034c7c" data-id="b42ff53e07564756a3cd26bef3034c7c"><span><div id="b42ff53e07564756a3cd26bef3034c7c" class="notion-header-anchor"></div><span class="notion-h-title">sw.h</span></span></h4></summary><div><div class="notion-text notion-block-590689fd45034f878759dede6b06dfff">#ifndef __SW_H</div><div class="notion-text notion-block-1e496e050dc54dc991742972b995cffd">#define __SW_H</div><div class="notion-text notion-block-52342c761e684cb5af70c91433a52e37">#include &quot;stdint.h&quot;</div><div class="notion-text notion-block-1de7fb7c1bc542c5a1d807d02ea27c97">#define  SW1_IN   HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_14)</div><div class="notion-text notion-block-8beeb038fceb445a852573d5a328fda0">#define  SW2_IN  HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)</div><div class="notion-text notion-block-9bd12ce37eda41e49da02a461cf16ab8">void SW_Init(void);</div><div class="notion-text notion-block-590e8ea6748146fcbf3a15731fe56e4b">uint8_t SW_Scan(uint8_t mode);</div><div class="notion-text notion-block-537c56565ffc48348d2c1696ce5eb527">void SW_Init_IT(uint8_t mode);</div><div class="notion-text notion-block-175a0a92404245d38a15027f4634a0dc">void SW_Init_IT2(void);</div><div class="notion-text notion-block-bb5c6e9fd1d04dd1828e2dd53fb0c32a">void SW_InitEvent(void);</div><div class="notion-text notion-block-4d463f44ab194fbab154d61abea88b4c">void SW_InitEventOut(void);</div><div class="notion-text notion-block-55f218862aa64cadbafe232b6065fc23">#endif</div></div></details><details class="notion-toggle notion-block-0bbcd86e621b4353864db63d3c6f9da5"><summary><h4 class="notion-h notion-h3 notion-block-0bbcd86e621b4353864db63d3c6f9da5" data-id="0bbcd86e621b4353864db63d3c6f9da5"><span><div id="0bbcd86e621b4353864db63d3c6f9da5" class="notion-header-anchor"></div><span class="notion-h-title">led.c</span></span></h4></summary><div><div class="notion-text notion-block-bbe1005cbfb54ebd8368fbe2d156fb52">#include &quot;stm32f1xx_hal.h&quot;</div><div class="notion-text notion-block-69801f282cbe4295a731f21e5bbd29c1">#include &quot;led.h&quot;</div><div class="notion-text notion-block-bacfea689fa14b05a7b2867a7296eaec">void LED_Init(void){<div class="notion-text-children"><div class="notion-text notion-block-8f0c55848b4245f2b5ee5c17ee128915">GPIO_InitTypeDef GPIO_InitType;</div><div class="notion-text notion-block-c64cb61ecbc943d494dcc21334d3acc1">__HAL_RCC_GPIOC_CLK_ENABLE();</div><div class="notion-text notion-block-9151796f49434a858e14b4cba08d81e9">GPIO_<a class="notion-link" href="http://InitType.Pin" target="_blank" rel="noopener noreferrer">InitType.Pin</a> = GPIO_PIN_13;</div><div class="notion-text notion-block-3c44a09c3d6d4bfcb261987d2fbf3d8d">GPIO_InitType.Mode = GPIO_MODE_OUTPUT_PP;</div><div class="notion-text notion-block-6e977c9de82e436d8b4e34f79a8014cd">GPIO_InitType.Speed = GPIO_SPEED_FREQ_LOW;</div><div class="notion-text notion-block-b3ca75f59dc349f3bccbe63e7ec7d23e">HAL_GPIO_Init(GPIOC,&amp;GPIO_InitType);</div><div class="notion-text notion-block-87a839a39bf14af08a3d49209f3e5b13">HAL_GPIO_WritePin(GPIOC,GPIO_PIN_13,GPIO_PIN_RESET);</div></div></div><div class="notion-text notion-block-de3903482177430788f420063c9ae823">}</div><div class="notion-text notion-block-bca43a199bb74665ae01934a1cb7abc6">void LED_ON(void){<div class="notion-text-children"><div class="notion-text notion-block-4e4053689b6146eab1da043b121416d4">HAL_GPIO_WritePin(GPIOC,GPIO_PIN_13,GPIO_PIN_SET);</div></div></div><div class="notion-text notion-block-81cbc01470c540f0a382376af5f9223d">}</div><div class="notion-text notion-block-b62e4608e7974e269d39346d13417297">void LED_OFF(void){<div class="notion-text-children"><div class="notion-text notion-block-c383d81ce2374a39933dad30a41fbc5f">HAL_GPIO_WritePin(GPIOC,GPIO_PIN_13,GPIO_PIN_RESET);</div></div></div><div class="notion-text notion-block-342962bb16334a42a8e3bf2a6989c232">}</div><div class="notion-text notion-block-03ebca51c6bb4823b5bb2f8bdf8e4f06">void LED_Toggle(void){<div class="notion-text-children"><div class="notion-text notion-block-e21683a23fc8462a8dbd0c84ee660271">HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_13);</div></div></div><div class="notion-text notion-block-6a24924d1882445eb0586a308ec781db">}</div></div></details><details class="notion-toggle notion-block-a229f80e17b4491fba24c2b7747dd55c"><summary><h4 class="notion-h notion-h3 notion-block-a229f80e17b4491fba24c2b7747dd55c" data-id="a229f80e17b4491fba24c2b7747dd55c"><span><div id="a229f80e17b4491fba24c2b7747dd55c" class="notion-header-anchor"></div><span class="notion-h-title">led.h</span></span></h4></summary><div><div class="notion-text notion-block-3237e3bf20fc4a77a98ba37f3a7f3661">#ifndef __LED_H</div><div class="notion-text notion-block-e1fd3d8f8b7543249c5098e0718fa9f6">#define __LED_H</div><div class="notion-text notion-block-829692b068bd47e5bd1212d055a94f0c">void LED_Init(void);</div><div class="notion-text notion-block-4c697ee79cd744f2bd327a2593c27cdd">void LED_ON(void);</div><div class="notion-text notion-block-5c1c3625e5a24fe38c351e0c9215d27d">void LED_OFF(void);</div><div class="notion-text notion-block-9d2e74b6ec9c4503a7186c48ddca9420">void LED_Toggle(void);</div><div class="notion-text notion-block-25065379d70e4dada5dcbe93f66fe253">#endif</div></div></details></div></details><details class="notion-toggle notion-block-bc7ba44be21a45769ff817ec3e1214f7"><summary><h4 class="notion-h notion-h3 notion-block-bc7ba44be21a45769ff817ec3e1214f7" data-id="bc7ba44be21a45769ff817ec3e1214f7"><span><div id="bc7ba44be21a45769ff817ec3e1214f7" class="notion-header-anchor"></div><span class="notion-h-title">stm32f1xx_it.c</span></span></h4></summary><div><div class="notion-text notion-block-10a8bd9b3ce649f98cf22b50fb24cb20">/<em>-------------------------------------------------</em>/</div><div class="notion-text notion-block-7d834f703a244e3ba06395d81b16cff0">/<em>                                                 </em>/</div><div class="notion-text notion-block-1442ab99b1564825bedf99d6796259de">/<em>          实现各种中断服务函数的源文件           </em>/</div><div class="notion-text notion-block-2a50ebf5f878431c91747f402fb0d8e1">/<em>                                                 </em>/</div><div class="notion-text notion-block-585d5c3af8674d998ae73ece9e31dc4c">/<em>-------------------------------------------------</em>/</div><div class="notion-text notion-block-c78b4fa150084a0b97a20e27f11a0bf5">#include &quot;stm32f1xx_hal.h&quot;   </div><div class="notion-text notion-block-429a2cff3f6f4c2c9a2cb1dd5e51ee62">#include &quot;stm32f1xx_it.h&quot;</div><div class="notion-text notion-block-3358c34d16e346cfbcbad911deced817">#include &quot;uart.h&quot;</div><div class="notion-text notion-block-642a6e050e4547e188b77622c4ea2502">#include &quot;timer.h&quot;</div><div class="notion-text notion-block-d6329bbf352c4785a858a20d66beb7b8">void EXTI15_10_IRQHandler(void)</div><div class="notion-text notion-block-2f67b93c5c594657bc05507d7833f6a4">{</div><div class="notion-text notion-block-7e31e72b827e48758296346ad66b7531">HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_14);</div><div class="notion-text notion-block-741fd132d00442a28185f2ee18a24c20">}</div><div class="notion-text notion-block-b8a8f3a623e04ef8aafc7f7f0da55113">void EXTI0_IRQHandler(void)</div><div class="notion-text notion-block-ebbb296c8af4484d9e44c43e99a67f7b">{</div><div class="notion-text notion-block-7ed36aef25564573815cab613c11a60e">HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_0);</div><div class="notion-text notion-block-ce776f660f77424fbfc25300be760281">}</div><div class="notion-text notion-block-9988995cffd94b36a56a147fe899ccc7">void USART1_IRQHandler(void)</div><div class="notion-text notion-block-7f485b4275a9400d9a08c5e531080f25">{</div><div class="notion-text notion-block-79afc392d4904a03be51411e517de886">HAL_UART_IRQHandler(&amp;uart1.uart);</div><div class="notion-text notion-block-171f382d9afc438fb4c3fc0a54a3c674">if(__HAL_UART_GET_FLAG(&amp;uart1.uart, UART_FLAG_IDLE)){<div class="notion-text-children"><div class="notion-text notion-block-549ce99301444c93b7a3ebda4aa99557">__HAL_UART_CLEAR_IDLEFLAG(&amp;uart1.uart);</div><div class="notion-text notion-block-2c9939ed4123462c8b17ae578ba9824e">uart1.RxCounter += (U1_RX_MAX - __HAL_DMA_GET_COUNTER(&amp;uart1.dmarx));</div><div class="notion-text notion-block-33be25e38d1940af9fb10a8ded3ba756">HAL_UART_AbortReceive_IT(&amp;uart1.uart);</div></div></div><div class="notion-text notion-block-559ca194bb9a4ffb94842bacc199f93b">}</div><div class="notion-text notion-block-f34e36d1697b466384bd34661b0840bb">}</div><div class="notion-text notion-block-5f77dd0402074b4dabc95e52a9f1f17b">int aaa;</div><div class="notion-text notion-block-2322bc8421a147c1bc0f6b02f20373b2">void USART2_IRQHandler(void)</div><div class="notion-text notion-block-c8694bf1640749a4b4e3ef6670a05295">{</div><div class="notion-text notion-block-0870205d77534d90a8a76782249c9cf3">HAL_UART_IRQHandler(&amp;uart2.uart);</div><div class="notion-text notion-block-5d89e4eabd7049ef9b567867a3d15de0">//if(__HAL_UART_GET_FLAG(&amp;uart2.uart, UART_FLAG_IDLE)){</div><div class="notion-text notion-block-a5d308d90cb943bb8b05fc42c2220193">//    __HAL_UART_CLEAR_IDLEFLAG(&amp;uart2.uart);</div><div class="notion-text notion-block-397536fd78884f928ca8271a7253fd3f">//    uart2.RxCounter += (U2_RX_MAX - __HAL_DMA_GET_COUNTER(&amp;uart2.dmarx));</div><div class="notion-text notion-block-8c273d5572274162a33fe173e0afc98b">//    HAL_UART_AbortReceive_IT(&amp;uart2.uart);</div><div class="notion-text notion-block-d771f4a46d04434b922fd931295e9471">//}</div><div class="notion-text notion-block-52395809861c42a1985d3559eac23e02">aaa++;</div><div class="notion-text notion-block-a1295badcd3544a7aa436623c2335959">}</div><div class="notion-text notion-block-2d1ad338d5e94500822ef158836fca2b">void USART3_IRQHandler(void)</div><div class="notion-text notion-block-ea75d42de4884c308b5db3f71a7c3623">{</div><div class="notion-text notion-block-4465bd707986458caa96d2daeda4c527">HAL_UART_IRQHandler(&amp;uart3.uart);</div><div class="notion-text notion-block-9b09b6245d324f0890e2ab0199021e9b">if(__HAL_UART_GET_FLAG(&amp;uart3.uart, UART_FLAG_IDLE)){<div class="notion-text-children"><div class="notion-text notion-block-57333d8e046e46d08a580f644a5366d9">__HAL_UART_CLEAR_IDLEFLAG(&amp;uart3.uart);</div><div class="notion-text notion-block-36cb9d606eef4957a05a7b0a4a6998d4">uart3.RxCounter += (U3_RX_MAX - __HAL_DMA_GET_COUNTER(&amp;uart3.dmarx));</div><div class="notion-text notion-block-79373ecb0f2c47e0a172deb14452e158">HAL_UART_AbortReceive_IT(&amp;uart3.uart);</div></div></div><div class="notion-text notion-block-fb67217b7cdf4f17a1385d8bf08e3be6">}</div><div class="notion-text notion-block-2788023371e943d49cab599dd6aa7a11">}</div><div class="notion-text notion-block-1310464729be45a6bc706a71d6b3801f">void DMA1_Channel4_IRQHandler(void)</div><div class="notion-text notion-block-bcf5b03c1d8d405885ffa082cd3e2145">{</div><div class="notion-text notion-block-a6df1b779d714057ae86c666b4381054">HAL_DMA_IRQHandler(&amp;uart1.dmatx);</div><div class="notion-text notion-block-4b3b2a49ea734abc88aadaf2a7dbca2e">}</div><div class="notion-text notion-block-4a211e2981c44defa3d9f3c687bac0fb">void DMA1_Channel5_IRQHandler(void)</div><div class="notion-text notion-block-315d909b1e344fa8ae40d3d90db355b7">{</div><div class="notion-text notion-block-75c8b5ef07b24268bc3e53f36810abc2">HAL_DMA_IRQHandler(&amp;uart1.dmarx);</div><div class="notion-text notion-block-58c0b80ce57643e6a544653f8ae6ef1f">}</div><div class="notion-text notion-block-3f37a5f308c04ecab0815a9287f0ac40">void DMA1_Channel7_IRQHandler(void)</div><div class="notion-text notion-block-b17c4fc36eac4c818c82008742fbe0fa">{</div><div class="notion-text notion-block-b80e2ec4a8214d098000d4670a9e671b">HAL_DMA_IRQHandler(&amp;uart2.dmatx);</div><div class="notion-text notion-block-8b01561e22134792adf2c54b3f86230e">}</div><div class="notion-text notion-block-461a0ca5d0ea4cdbba3f785f98ca18f2">void DMA1_Channel6_IRQHandler(void)</div><div class="notion-text notion-block-0282db0169b34e69a7bcc01d83707fd2">{</div><div class="notion-text notion-block-bcb7083f0a5142f59ce34ce8f3e4c80e">HAL_DMA_IRQHandler(&amp;uart2.dmarx);</div><div class="notion-text notion-block-d8873ad4a8514d8e9b619b5b3ebba572">}</div><div class="notion-text notion-block-3bfe54eb0ff741749106fb377ce4ec3f">void DMA1_Channel2_IRQHandler(void)</div><div class="notion-text notion-block-bf77d20dcba140ec8fd68c359483cc9e">{</div><div class="notion-text notion-block-2e85df4c1daa4718bf61b312003a5134">HAL_DMA_IRQHandler(&amp;uart3.dmatx);</div><div class="notion-text notion-block-36011593e5d9474884c998237271e9bb">}</div><div class="notion-text notion-block-f28ab8ab16b84b4ab3c88564052fb53e">void DMA1_Channel3_IRQHandler(void)</div><div class="notion-text notion-block-141302ec03dc42b8a55f9c22dd8e1f20">{</div><div class="notion-text notion-block-25998a70a8ff47288984f8a701a78262">HAL_DMA_IRQHandler(&amp;uart3.dmarx);</div><div class="notion-text notion-block-269c7432c12b4119aaae592ba88bbab0">}</div><div class="notion-text notion-block-1652ab0b153d4129965bb1ce0c233d4f">//定时器中断处理函数</div><div class="notion-text notion-block-6017c829a3f7481fa39b2e98f18e0345">void TIM4_IRQHandler(void)</div><div class="notion-text notion-block-f7c9b8907dc141bdb43b43a8fc66cf59">{</div><div class="notion-text notion-block-fe5d3a2e2370494ea216f9d61c57ae7d">HAL_TIM_IRQHandler(&amp;htim4);</div><div class="notion-text notion-block-1dca91682d274916914c0a321792f863">}</div><div class="notion-text notion-block-388589fd3248433c9575606d09bed87b">/<em>-------------------------------------------------</em>/</div><div class="notion-text notion-block-497c6ea8e26742c5b26a92f53c126830">/<em>函数名：不可屏蔽中断处理函数                     </em>/</div><div class="notion-text notion-block-e50a8cc8e8e840cca77f49b9633492a2">/<em>参  数：无                                       </em>/</div><div class="notion-text notion-block-bcb0e28c8c24427a994e27ec669efb82">/<em>返回值：无                                       </em>/</div><div class="notion-text notion-block-fbe5f3bf986246e1b6a259e3f884176b">/<em>-------------------------------------------------</em>/</div><div class="notion-text notion-block-923ed81251a447abae08bd3bf8b5b25f">void NMI_Handler(void)</div><div class="notion-text notion-block-60db4b52c51e424faec054875fccdcb6">{</div><div class="notion-text notion-block-8b086f5a61754c0ea2a3f853dda3c26d">}</div><div class="notion-text notion-block-83c81a6ab47647eb94fb95b4a7947c46">/<em>-------------------------------------------------</em>/</div><div class="notion-text notion-block-15ce43bcdba04142a961b64e97debbda">/<em>函数名：硬件出错后进入的中断处理函数             </em>/</div><div class="notion-text notion-block-82bf1d360a524b129303a3c2ff6d4c56">/<em>参  数：无                                       </em>/</div><div class="notion-text notion-block-d4716818c9e64855a4612b6b978ed328">/<em>返回值：无                                       </em>/</div><div class="notion-text notion-block-64308be95d2a4ec695ea15ba14e075a4">/<em>-------------------------------------------------</em>/</div><div class="notion-text notion-block-fa688c221ae045b48bda415a29e6c716">void HardFault_Handler(void)</div><div class="notion-text notion-block-66e27be060204cc5ae33187d566a6000">{</div><div class="notion-text notion-block-5f574dbe834944258b41f449a0c82ace">}</div><div class="notion-text notion-block-c1099ad8227e4635b159dce628eb7ff2">/<em>-------------------------------------------------</em>/</div><div class="notion-text notion-block-389ac603609c4a2fa8aa638274a86173">/<em>函数名：软中断，SWI 指令调用的处理函数           </em>/</div><div class="notion-text notion-block-4d14990125db449c94b1072643459912">/<em>参  数：无                                       </em>/</div><div class="notion-text notion-block-1b209eb1c4d747ff94e7ae705a0b14a2">/<em>返回值：无                                       </em>/</div><div class="notion-text notion-block-22bd607e68634f95aec850dd234692ac">/<em>-------------------------------------------------</em>/</div><div class="notion-text notion-block-2d9e691f400a42218bbe092e9e6d2b5a">void SVC_Handler(void)</div><div class="notion-text notion-block-737c797684ef4ecaab951c2b2b55efd0">{</div><div class="notion-text notion-block-2a8788fc4af544d8823e8847b3f99bd1">}</div><div class="notion-text notion-block-7384685faaab412e8f55e0bdac28cf74">/<em>-------------------------------------------------</em>/</div><div class="notion-text notion-block-c7ee974ff6e44a899e0f85418f96be17">/<em>函数名：可挂起的系统服务处理函数                 </em>/</div><div class="notion-text notion-block-389f8f198e85446b9f79eaa46c298e5d">/<em>参  数：无                                       </em>/</div><div class="notion-text notion-block-4ad96065ec014b1bbaf29ddea23d873c">/<em>返回值：无                                       </em>/</div><div class="notion-text notion-block-cd200cf4d0db47429a0d8ca32a8197d6">/<em>-------------------------------------------------</em>/</div><div class="notion-text notion-block-e8303e08cacb43c3b5a62c3d054e3ea6">void PendSV_Handler(void)</div><div class="notion-text notion-block-5dda8f72af3b479fb52eb95a5dcf376f">{</div><div class="notion-text notion-block-798e6611fbae48d2899c574b49ec1670">}</div><div class="notion-text notion-block-d50e83cbd4a449beb3c52b12a6435b4f">/<em>-------------------------------------------------</em>/</div><div class="notion-text notion-block-caca8d7ddf0b45be97c05bb1abc9ff34">/<em>函数名：SysTic系统嘀嗒定时器处理函数             </em>/</div><div class="notion-text notion-block-0a238e195431410299d5e9a6aeef1b60">/<em>参  数：无                                       </em>/</div><div class="notion-text notion-block-6d8391d3a764499194f4ae4996621498">/<em>返回值：无                                       </em>/</div><div class="notion-text notion-block-052acc3dd64249a2978d629010a479b7">/<em>-------------------------------------------------</em>/</div><div class="notion-text notion-block-783d1c6bfd1c45beb819aa1fc0a70eb9">void SysTick_Handler(void)</div><div class="notion-text notion-block-e744e6c6e6f84fc193d5608e20c008b9">{  </div><div class="notion-text notion-block-ef780fba84d94f80a45ee2c09e62e06a">HAL_IncTick();	</div><div class="notion-text notion-block-78403e6161e84b97b656e1e19bc4f743">}</div></div></details><details class="notion-toggle notion-block-0eadcde0b7464b8ca9fd17b0df1f8327"><summary><h4 class="notion-h notion-h3 notion-block-0eadcde0b7464b8ca9fd17b0df1f8327" data-id="0eadcde0b7464b8ca9fd17b0df1f8327"><span><div id="0eadcde0b7464b8ca9fd17b0df1f8327" class="notion-header-anchor"></div><span class="notion-h-title">timer.c</span></span></h4></summary><div><div class="notion-text notion-block-acac6936157946a589064a9b6fc0b30e">/<em>-----------------------------------------------------</em>/</div><div class="notion-text notion-block-c3f234b652bb43ab8753506edc4d99d5">/<em>                     程序结构                        </em>/</div><div class="notion-text notion-block-c475f4441aa547a5aeb814555a50359b">/<em>-----------------------------------------------------</em>/</div><div class="notion-text notion-block-68f08cba4a064414bf815bbafc79af51">/<em>USER   ：包含程序的 main 函数，是整个程序的入        </em>/</div><div class="notion-text notion-block-058a7a0079634d04952d872ad5400e1a">/<em>HW     ：包含开发板各种功能外设的驱动程序            </em>/</div><div class="notion-text notion-block-79fafec31bde4108a86696b1b08604eb">/<em>LIB    ：官方提供的 HAL 库文件                       </em>/</div><div class="notion-text notion-block-104883c323ca44fba64539392664d146">/<em>CMSIS  ：CM3 内核相关的启动文件系统文件              </em>/</div><div class="notion-text notion-block-90fee1c8117c43fdb5f3af8a4d35ddaf">/<em>-----------------------------------------------------</em>/</div><div class="notion-text notion-block-ea2a8a205353496988298ebd2178b7dc">/<em>                                                     </em>/</div><div class="notion-text notion-block-be4af67ee360475cba4fcb4517fc5231">/<em>                实现定时器功能的源文件               </em>/</div><div class="notion-text notion-block-16d0adcfef7a4066b0c14aef23d731e3">/<em>                                                     </em>/</div><div class="notion-text notion-block-e5991905d98d47a2b386d2277dd9268d">/<em>-----------------------------------------------------</em>/</div><div class="notion-text notion-block-490bae0db7694d5ba4a5c37f3590887d">#include &quot;stm32f1xx_hal.h&quot;  </div><div class="notion-text notion-block-24da0a3f7c1a4792a191a630ac2d6266">#include &quot;timer.h&quot;            </div><div class="notion-text notion-block-c35a3b984b494748b71cfcd24601cec6">#include &quot;uart.h&quot;  </div><div class="notion-text notion-block-bff9c96529484f34bf31d5cd1252e45e">TIM_HandleTypeDef htim4;    //定时器4总控制结构体</div><div class="notion-text notion-block-96078f37d7ee4efb9e9c42dab3369afe">/<em>-------------------------------------------------</em>/</div><div class="notion-text notion-block-da97dede52b84383930c24f75ad6bdb6">/<em>函数名：定时器4 定时初始化                       </em>/</div><div class="notion-text notion-block-107a5536cd8348bb8fa2b55a870331dd">/<em>参  数：arr：自动重装值                          </em>/</div><div class="notion-text notion-block-597a30bccdf94e7690a73f9eb247f3b0">/<em>参  数：psc：时钟预分频数                        </em>/</div><div class="notion-text notion-block-aa1bf81dc5424e29915a20789a04e5e5">/<em>返回值：无                                       </em>/</div><div class="notion-text notion-block-c550da8da6394450bc55069ad1232d22">/<em>-------------------------------------------------</em>/</div><div class="notion-text notion-block-5e476ebf9da7436686514875033b57dc">void TIM4_TimerInit(uint16_t arr, uint16_t psc)</div><div class="notion-text notion-block-4274fb3317b9403f8eb8131757e407fc">{<div class="notion-text-children"><div class="notion-text notion-block-a2037c9f8571481c9627e4b23ca63e4c">htim4.Instance = TIM4;                                         //设置使用哪个定时器</div><div class="notion-text notion-block-fc74794e80164b9eb772976917fe3914">htim4.Init.Prescaler = psc - 1;                                //设置预分频器的值</div><div class="notion-text notion-block-2b1ec61436444950938a8ce875a1a230">htim4.Init.Period = arr - 1;                                   //设置自动重载值</div><div class="notion-text notion-block-cdcd1ef3c53d4b2f98ad90437c859e0d">htim4.Init.CounterMode = TIM_COUNTERMODE_UP;                   //设置计数模式</div><div class="notion-text notion-block-536e850409b44cfca460df50c46339f9">htim4.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; //自动重载预装载 禁止</div><div class="notion-text notion-block-3dff6b63e921416e9b4d3a095f36c5d0">HAL_TIM_Base_Init(&amp;htim4);                                     //配置，如果失败进入if</div><div class="notion-text notion-block-51538044d5eb4e01b1e3129d88520ede">__HAL_TIM_CLEAR_IT(&amp;htim4, TIM_IT_UPDATE);                     //清除定时器4的中断标志</div><div class="notion-text notion-block-2c871257cb894ef2a841e683920ebd14">__HAL_TIM_ENABLE_IT(&amp;htim4, TIM_IT_UPDATE);                    //打开更新中断</div></div></div><div class="notion-text notion-block-1f6366e7c1844af987b1093d6dc5c105">}</div><div class="notion-text notion-block-438a03193d1e469ab6eedd5ce9e1275a">/<em>-------------------------------------------------</em>/</div><div class="notion-text notion-block-daf6901efebe41a798b315110dc9b8f1">/<em>函数名：定时器底层驱动，开启时钟，设置中断优先级 </em>/</div><div class="notion-text notion-block-909862f0e28846ed846d54eb66c7fc24">/<em>参  数：htim：定时器句柄                         </em>/</div><div class="notion-text notion-block-769b75a745274094bf453b569442e3eb">/<em>返回值：无                                       </em>/</div><div class="notion-text notion-block-236e8fc1daaf412a8c9846258f167e8f">/<em>说  明：此函数会被HAL_TIM_Base_Init()函数调用    </em>/</div><div class="notion-text notion-block-899c631185b44cfd80b40d56d6edd35f">/<em>-------------------------------------------------</em>/</div><div class="notion-text notion-block-6ac7d0188fa74cdbb504c88977b5ca81">void HAL_TIM_Base_MspInit(TIM_HandleTypeDef *htim)</div><div class="notion-text notion-block-e5231f872298400a8f878f8a06d76aad">{<div class="notion-text-children"><div class="notion-text notion-block-519e9020fb0846c0a6b6f52f9774e8b0">if(htim-&gt;Instance==TIM4){	                   //判断是哪个定时器	<div class="notion-text-children"><div class="notion-text notion-block-4511c6c34ba54e878734cc0d3fc0b8c3">__HAL_RCC_TIM4_CLK_ENABLE();               //使能定时器时钟</div><div class="notion-text notion-block-f6826efd40c848e1a30911c1bc3066ed">HAL_NVIC_SetPriority(TIM4_IRQn,4,0);       //设置中断优先级，中断分组在HAL_Init()函数中，被设置为4</div><div class="notion-text notion-block-62e89ae2ce8c4382a051c8f9a02f9920">HAL_NVIC_EnableIRQ(TIM4_IRQn);             //开启定时器中断   </div></div></div><div class="notion-text notion-block-b208bbf83a4c466c97f8971ab8bbc809">}</div></div></div><div class="notion-text notion-block-504d31393bce4f0c99e60f9a32649c7d">}</div><div class="notion-text notion-block-a75b178691174d4c8ef89056505ad1bf">/<em>---------------------------------------------------</em>/</div><div class="notion-text notion-block-6dc3d865465f4fc591adad48d03a3f1a">/<em>函数名：定时器中断回调函数                         </em>/</div><div class="notion-text notion-block-f0c4aa106e6a4c0fbdd6b5e7c637609e">/<em>参  数：htim：定时器句柄                           </em>/</div><div class="notion-text notion-block-b4a2498bf32d47de84b3bb74daebb3ac">/<em>返回值：无                                         </em>/</div><div class="notion-text notion-block-6ecbdbfb9a714ff6ac99d63c01d073ec">/<em>说  明：此函数会被HAL_TIM_IRQHandler()中断函数调用 </em>/</div><div class="notion-text notion-block-9ed0d943fa9941878be876d4222a5cd5">/<em>---------------------------------------------------</em>/</div><div class="notion-text notion-block-e41b46b9dc5f4bdfa982a663f14864b1">//超时回调函数</div><div class="notion-text notion-block-7090542fd0604923b283101179e45c41">void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)</div><div class="notion-text notion-block-e410b5967b8e4b8f81bda540eb43ce40">{<div class="notion-text-children"><div class="notion-text notion-block-642771f20ae44e0da26f0304268540e9">if(htim-&gt;Instance==TIM4){	          //判断是哪个定时器<div class="notion-text-children"><div class="notion-text notion-block-b909bece0816475cb9c9999ff022acb9">__HAL_TIM_DISABLE(htim);          //关闭定时器4的计数</div><div class="notion-text notion-block-9d2e18a1997d46be9b2883f3510cb5f6">__HAL_TIM_SET_COUNTER(htim,0);    //清零定时器4计数器</div><div class="notion-text notion-block-5fc448691f014261a1b48d13367b9e30">uart2.RxState = 0;  //恢复首字节接收标志位</div><div class="notion-text notion-block-3ae8b62aff724d2e888165b6f75247f1">uart2.RxCounter += (U2_RX_MAX - __HAL_DMA_GET_COUNTER(&amp;uart2.dmarx));   //记录剩余未发送</div><div class="notion-text notion-block-43a9f6a32ad34196a2bb90faa2498df9">HAL_UART_AbortReceive_IT(&amp;uart2.uart);  //终止接收</div></div></div><div class="notion-text notion-block-06125db3f50a487a9d991d2ef7f8f08d">}</div></div></div><div class="notion-text notion-block-45c5ca098c0b4b42b140e228de559ca8">}</div></div></details><details class="notion-toggle notion-block-d9cf730a4410471e970b369e4711977d"><summary><h4 class="notion-h notion-h3 notion-block-d9cf730a4410471e970b369e4711977d" data-id="d9cf730a4410471e970b369e4711977d"><span><div id="d9cf730a4410471e970b369e4711977d" class="notion-header-anchor"></div><span class="notion-h-title"><b>s</b>tm32f1xx_hal_uart.c</span></span></h4></summary><div><div class="notion-text notion-block-1ad0d831b67247f6a78e496d72fe252a">void HAL_UART_IRQHandler(UART_HandleTypeDef *huart)</div><div class="notion-text notion-block-8f970a021e6b420cb1beb366c29c1d40">{<div class="notion-text-children"><div class="notion-text notion-block-e5a8b9bb66c844b294c74484ee2540f0">uint32_t isrflags   = READ_REG(huart-&gt;Instance-&gt;SR);</div><div class="notion-text notion-block-5a3a47e368684836ac560f11cdbfd301">uint32_t cr1its     = READ_REG(huart-&gt;Instance-&gt;CR1);</div><div class="notion-text notion-block-9845d54d8b6e4b9eabc87c1e31e56eba">uint32_t cr3its     = READ_REG(huart-&gt;Instance-&gt;CR3);</div><div class="notion-text notion-block-230ba25d573e4cb581d8a050ea7ebd09">uint32_t errorflags = 0x00U;</div><div class="notion-text notion-block-6e46e4a6f30f4529ab71bd11e3de035f">uint32_t dmarequest = 0x00U;</div><div class="notion-text notion-block-8a6d666330b746aeb03c0f40c3b886eb">/<em> If no error occurs </em>/</div><div class="notion-text notion-block-bcd08b9375ee4e90901a5d2d0b8db574">errorflags = (isrflags &amp; (uint32_t)(USART_SR_PE | USART_SR_FE | USART_SR_ORE | USART_SR_NE));<div class="notion-text-children"><div class="notion-text notion-block-eb5fcd74652e4dca9ffd2fd714660920">//删除  RXNE中断</div></div></div><div class="notion-text notion-block-0421c23a28704e60a139e7d979bd3059">//if (errorflags == RESET)</div><div class="notion-text notion-block-e38e42149d2b41468a57f0389089f249">//{</div><div class="notion-text notion-block-e271c2c49fac44608d896af1a9543216">//  /<em> UART in mode Receiver -------------------------------------------------</em>/</div><div class="notion-text notion-block-40200b7c884e4cc2b3518528dbd82795">//  if (((isrflags &amp; USART_SR_RXNE) != RESET) &amp;&amp; ((cr1its &amp; USART_CR1_RXNEIE) != RESET))</div><div class="notion-text notion-block-828f7246a196429f9e37254281235633">//  {</div><div class="notion-text notion-block-4646c3b497b24d1cbdd5cf5397c51d0c">//    UART_Receive_IT(huart);</div><div class="notion-text notion-block-54b5aaa5fdb3457aa5a03f41f359683d">//    return;</div><div class="notion-text notion-block-b6d7db85c49c446e9cb7516545876e76">//  }</div><div class="notion-text notion-block-55926d251e80445c815c5034e67594cb">//}</div><div class="notion-text notion-block-45082b41dcae4380b2e92b6e4c311df9">/<em> If some errors occur </em>/</div><div class="notion-text notion-block-aa48156482cb47f6a428f0ee87782949">if ((errorflags != RESET) &amp;&amp; (((cr3its &amp; USART_CR3_EIE) != RESET) || ((cr1its &amp; (USART_CR1_RXNEIE | USART_CR1_PEIE)) != RESET)))</div><div class="notion-text notion-block-05c85024d071435dac58bb2cc85e2f9f">{<div class="notion-text-children"><div class="notion-text notion-block-73e80aa62feb4dc8a87abe700685b8bb">/<em> UART parity error interrupt occurred ----------------------------------</em>/</div><div class="notion-text notion-block-c499a23148a6486791196fca5be2d26c">if (((isrflags &amp; USART_SR_PE) != RESET) &amp;&amp; ((cr1its &amp; USART_CR1_PEIE) != RESET))</div><div class="notion-text notion-block-14c6af9c8744482aaffc041cd7b68a58">{<div class="notion-text-children"><div class="notion-text notion-block-d4f30a608f99457d93eb341429637390">huart-&gt;ErrorCode |= HAL_UART_ERROR_PE;</div></div></div><div class="notion-text notion-block-bf79579c22d843a2900fc2dcc7f8f461">}</div><div class="notion-text notion-block-1dc43e4f81cc45b3b5c89790bd9c3b13">/<em> UART noise error interrupt occurred -----------------------------------</em>/</div><div class="notion-text notion-block-cd3b3255cd5a490f8d8142f709e4af3c">if (((isrflags &amp; USART_SR_NE) != RESET) &amp;&amp; ((cr3its &amp; USART_CR3_EIE) != RESET))</div></div></div><div class="notion-text notion-block-6391e2fa5bbc4db6b8033d31a693183e">{<div class="notion-text-children"><div class="notion-text notion-block-4b93ea97647940bc894e3692bcc2dc50">huart-&gt;ErrorCode |= HAL_UART_ERROR_NE;</div></div></div><div class="notion-text notion-block-5c54bf7a70ac4db6b6494f7061a43fa2">}</div><div class="notion-text notion-block-37f1999901d94b33ba54ecab7f17e59d">/<em> UART frame error interrupt occurred -----------------------------------</em>/</div><div class="notion-text notion-block-3f37c5f339754f9db9d3ec44705c4f56">if (((isrflags &amp; USART_SR_FE) != RESET) &amp;&amp; ((cr3its &amp; USART_CR3_EIE) != RESET))</div><div class="notion-text notion-block-cd7cf9b250ca4ee48e693583999429d0">{<div class="notion-text-children"><div class="notion-text notion-block-139bab060e9d4f3a8f5b279dba7bd75f">huart-&gt;ErrorCode |= HAL_UART_ERROR_FE;</div></div></div><div class="notion-text notion-block-d908ab2b2cdf44159487e1ee1acdde30">}</div><div class="notion-text notion-block-1e5ae74c43cd4edcbd33abfc34539603">/<em> UART Over-Run interrupt occurred --------------------------------------</em>/</div><div class="notion-text notion-block-b418db3fc7dc4d929c903cef2d72cdb1">if (((isrflags &amp; USART_SR_ORE) != RESET) &amp;&amp; ((cr3its &amp; USART_CR3_EIE) != RESET))</div><div class="notion-text notion-block-347cfd8d2e6448b8becdb90a6fb2763a">{<div class="notion-text-children"><div class="notion-text notion-block-9205f28e834742f18700ce63f6226586">huart-&gt;ErrorCode |= HAL_UART_ERROR_ORE;</div></div></div><div class="notion-text notion-block-163bdff762354f48a5b0ed10c3dcc8ec">}</div><div class="notion-text notion-block-ca9fe5ce7f344a118767967ba9a0e7f2">/<em> Call UART Error Call back function if need be --------------------------</em>/</div><div class="notion-text notion-block-1a9d7b3d83ad4f5d8c19b82a4042f3a5">if (huart-&gt;ErrorCode != HAL_UART_ERROR_NONE)</div><div class="notion-text notion-block-a23f97d677994b5dae92342a7497f5d8">{<div class="notion-text-children"><div class="notion-text notion-block-b29b2c9816714fc294c84f53f64d71fa">/<em> UART in mode Receiver -----------------------------------------------</em>/</div><div class="notion-text notion-block-b4fda3e49aba4681ba1dc5474528baed">if (((isrflags &amp; USART_SR_RXNE) != RESET) &amp;&amp; ((cr1its &amp; USART_CR1_RXNEIE) != RESET))</div><div class="notion-text notion-block-c9b9565789ab4afbbd91dea98275b8e8">{<div class="notion-text-children"><div class="notion-text notion-block-cc5e78edc7d144d3b0671c076ca82ebb">UART_Receive_IT(huart);</div></div></div><div class="notion-text notion-block-c75049d6f8fc474e8416942b55a1beca">}</div><div class="notion-text notion-block-bd0c5813eefa40f19126c04f9b491e29">/* If Overrun error occurs, or if any error occurs in DMA mode reception,<div class="notion-text-children"><div class="notion-text notion-block-a3100c42fb2347c18671e48f281be5ff">consider error as blocking */</div></div></div><div class="notion-text notion-block-aeb11b3c031b4175ab94958f70869b4a">dmarequest = HAL_IS_BIT_SET(huart-&gt;Instance-&gt;CR3, USART_CR3_DMAR);</div><div class="notion-text notion-block-d57e01dbde174146ae0cbacdb55dc57f">if (((huart-&gt;ErrorCode &amp; HAL_UART_ERROR_ORE) != RESET) || dmarequest)</div><div class="notion-text notion-block-495ada4027d94e058dbd99385ee581c2">{<div class="notion-text-children"><div class="notion-text notion-block-874d145295a04adf8dddfefdd5dbdb63">/* Blocking error : transfer is aborted<div class="notion-text-children"><div class="notion-text notion-block-b3dc485ead7d42328eed154371076e76">Set the UART state ready to be able to start again the process,</div><div class="notion-text notion-block-50eace300fd04de5b3153ebb41e98444">Disable Rx Interrupts, and disable Rx DMA request, if ongoing */</div></div></div><div class="notion-text notion-block-3c5b6d8eedfa4d02845cb5b3423490a4">UART_EndRxTransfer(huart);</div><div class="notion-text notion-block-59c5ead26acf48a585d97b3f4f11a37f">/<em> Disable the UART DMA Rx request if enabled </em>/</div><div class="notion-text notion-block-e59d297958534c4d886913b068e623a0">if (HAL_IS_BIT_SET(huart-&gt;Instance-&gt;CR3, USART_CR3_DMAR))</div><div class="notion-text notion-block-c814fb7cd6e0455bbb29cc2176d8ef1b">{<div class="notion-text-children"><div class="notion-text notion-block-9875c85021f84023a6388abb6e4d4497">CLEAR_BIT(huart-&gt;Instance-&gt;CR3, USART_CR3_DMAR);</div><div class="notion-text notion-block-3af9348814dc4fd0a5c7d78d822878f8">/<em> Abort the UART DMA Rx channel </em>/</div><div class="notion-text notion-block-5b1868fb47aa444c9e05e2b2f4471095">if (huart-&gt;hdmarx != NULL)</div><div class="notion-text notion-block-bec392c7192c4563b01f8587c7ec9c2a">{<div class="notion-text-children"><div class="notion-text notion-block-75c4f07f44444cfa95b7f5dac740afc3">/* Set the UART DMA Abort callback :<div class="notion-text-children"><div class="notion-text notion-block-e1c6da5dd4ca4cb5b8486cb25ce03a3d">will lead to call HAL_UART_ErrorCallback() at end of DMA abort procedure */</div></div></div><div class="notion-text notion-block-245a9ef1e1c449c58d6d8fb7fbc6da9a">huart-&gt;hdmarx-&gt;XferAbortCallback = UART_DMAAbortOnError;</div><div class="notion-text notion-block-0efb434da2c74bb7bb9eae5e12c84372">if (HAL_DMA_Abort_IT(huart-&gt;hdmarx) != HAL_OK)</div><div class="notion-text notion-block-403c70d47f5b4efba603669ff1b937ba">{<div class="notion-text-children"><div class="notion-text notion-block-9b661e16e7cb4083bbd628e573d0ab77">/<em> Call Directly XferAbortCallback function in case of error </em>/</div><div class="notion-text notion-block-ebcb2c9e282543708f59aba3ef94a201">huart-&gt;hdmarx-&gt;XferAbortCallback(huart-&gt;hdmarx);</div></div></div><div class="notion-text notion-block-4ee07958175b4483b7521c48af41b181">}</div></div></div><div class="notion-text notion-block-34ea5de2def84e078cccdf2e721b1799">}</div><div class="notion-text notion-block-5df9495d2710441aa6b9bbba96c1c599">else</div><div class="notion-text notion-block-6a98283e32474651bb9c5ea05e79ac5b">{<div class="notion-text-children"><div class="notion-text notion-block-cc7ca3e6273f463fa307cf34b3f87ba6">/<em> Call user error callback </em>/</div></div></div></div></div></div></div></div></div></div></div></div></details><div class="notion-text notion-block-df09e1051ecf4baabc475da8ebb3fb6c">#if (USE_HAL_UART_REGISTER_CALLBACKS == 1)<div class="notion-text-children"><div class="notion-text notion-block-32b1eff77dec4b5dac6f33f14b98829f">/<em>Call registered error callback</em>/</div><div class="notion-text notion-block-abe30c76490a4251a9585c90ab4dc6de">huart-&gt;ErrorCallback(huart);</div></div></div><div class="notion-text notion-block-fd2123695eba40518ab55c40dd7107e7">#else<div class="notion-text-children"><div class="notion-text notion-block-ee57bf499f0249fa8deb4716c1a94d6e">/<em>Call legacy weak error callback</em>/</div><div class="notion-text notion-block-37072668aceb4eb7b99448c6b96fd055">HAL_UART_ErrorCallback(huart);</div></div></div><div class="notion-text notion-block-2275bc714af54467a15f4a9366227a20">#endif /<em> USE_HAL_UART_REGISTER_CALLBACKS </em>/<div class="notion-text-children"><div class="notion-text notion-block-8e8e0da65b9e46218ee96178b731208a">}</div><div class="notion-text notion-block-e0a5a12c2ac746d7a5eef4501f6aa36e">}</div><div class="notion-text notion-block-b6fc42cbc0a34e379454e9e8aeafe010">else</div><div class="notion-text notion-block-532b446edcf54396b5af55fa76fe6263">{<div class="notion-text-children"><div class="notion-text notion-block-f7baaa46e1f14d28be9160ebfa47ff2d">/<em> Call user error callback </em>/</div></div></div></div></div><div class="notion-text notion-block-a69048e46625409b80ef256935b8fd5f">#if (USE_HAL_UART_REGISTER_CALLBACKS == 1)<div class="notion-text-children"><div class="notion-text notion-block-a24c13b8f230476d9a73b327c95be71e">/<em>Call registered error callback</em>/</div><div class="notion-text notion-block-f0180fc6514842faa1ca11a55ebd812b">huart-&gt;ErrorCallback(huart);</div></div></div><div class="notion-text notion-block-3761e0ff34e6493583799584b3ee9a41">#else<div class="notion-text-children"><div class="notion-text notion-block-cabeb5e24a334639840fabde83de6b06">/<em>Call legacy weak error callback</em>/</div><div class="notion-text notion-block-b4397772c7c84586ac2fa73f1e9dfc5f">HAL_UART_ErrorCallback(huart);</div></div></div><div class="notion-text notion-block-3cf01363499e47299b1b3a1c3b32d3fa">#endif /<em> USE_HAL_UART_REGISTER_CALLBACKS </em>/<div class="notion-text-children"><div class="notion-text notion-block-4b51e0bc125e4e80adcb11ea548f223c">}</div><div class="notion-text notion-block-883da8050976496ca86f31a5b03f2602">}</div><div class="notion-text notion-block-35a60e652e7641d88a73a6e8b50fc9fd">else</div><div class="notion-text notion-block-a4ae6c30823e466781fb861a7aaa7218">{<div class="notion-text-children"><div class="notion-text notion-block-c9453407a4c7427e8c146c01380a78a6">/* Non Blocking error : transfer could go on.<div class="notion-text-children"><div class="notion-text notion-block-fbed31e82e0441ffa0c328815d38d8d4">Error is notified to user through user error callback */</div></div></div></div></div></div></div><div class="notion-text notion-block-dfc67beffea84d1fa84c7b90843b56a0">#if (USE_HAL_UART_REGISTER_CALLBACKS == 1)<div class="notion-text-children"><div class="notion-text notion-block-c033e6e3a043410d99ec1cc80d701f2e">/<em>Call registered error callback</em>/</div><div class="notion-text notion-block-005fae4cacda462d9f196ec16c30c289">huart-&gt;ErrorCallback(huart);</div></div></div><div class="notion-text notion-block-f47faa6d09f14cde90da0529e68122a2">#else<div class="notion-text-children"><div class="notion-text notion-block-ac98b6535a444c708849ca9431ac2dde">/<em>Call legacy weak error callback</em>/</div><div class="notion-text notion-block-32b183795af04061adc477a126444f74">HAL_UART_ErrorCallback(huart);</div></div></div><div class="notion-text notion-block-a2ced1cc8f774be89dc9fd31e5918ea3">#endif /<em> USE_HAL_UART_REGISTER_CALLBACKS </em>/<div class="notion-text-children"><div class="notion-text notion-block-0f7b4bb1093f4933947d7e5e5a83e60c">huart-&gt;ErrorCode = HAL_UART_ERROR_NONE;</div><div class="notion-text notion-block-f2fb9675e2c9430bb7370d9961ded92d">}</div><div class="notion-text notion-block-12bbb879b8774dc59370d36ef88ffbb2">}</div><div class="notion-text notion-block-a15f18db633348d7abd0ca5071b570f1">return;</div><div class="notion-text notion-block-c3ecb17b09d44e01b9cdeaaa38e49bd0">} /<em> End if some error occurs </em>/</div><div class="notion-text notion-block-cb84d6d73c8c4860bc76afc30b93cbc7">/<em> UART in mode Transmitter ------------------------------------------------</em>/</div><div class="notion-text notion-block-6a743d0f171641cebf9ba847fe271a5e">//删除  发送缓冲区空的中断</div></div></div><div class="notion-text notion-block-65058c588cc54ea491db67e65e210608">//  if (((isrflags &amp; USART_SR_TXE) != RESET) &amp;&amp; ((cr1its &amp; USART_CR1_TXEIE) != RESET))</div><div class="notion-text notion-block-b49f17d51cdd43e0a066dc67b691a34b">//  {</div><div class="notion-text notion-block-1f4afb0431ad49d28e8edbc07f7c1f39">//    UART_Transmit_IT(huart);</div><div class="notion-text notion-block-1a382b217a2d4614828e82802116be6f">//    return;</div><div class="notion-text notion-block-1e1f37b539b74cda92738c0ed548961e">//  }<div class="notion-text-children"><div class="notion-text notion-block-e951475df63443be9188669b283d758f">/<em> UART in mode Transmitter end --------------------------------------------</em>/</div><div class="notion-text notion-block-c49d702a267f4f2da95e927e3fe4e7e5">if (((isrflags &amp; USART_SR_TC) != RESET) &amp;&amp; ((cr1its &amp; USART_CR1_TCIE) != RESET))</div><div class="notion-text notion-block-76aa88df819948ce95601f73a6e911ae">{<div class="notion-text-children"><div class="notion-text notion-block-9f1a9799802a4b6cbccec6accc25b55b">UART_EndTransmit_IT(huart);</div><div class="notion-text notion-block-51d4cb6c0cd048c5a6c21acf39897cb9">return;</div></div></div><div class="notion-text notion-block-3eda6a7b6eef460cb07826f267addddc">}</div><div class="notion-text notion-block-b88d1bd00e1849889c451bf43ae18b0c">/<em> 写自己的中断回调，现在只能进入我们这个了。 </em>/</div><div class="notion-text notion-block-69a192e01ff7429e87a8fdbc666e23e3">#include &quot;uart.h&quot;</div><div class="notion-text notion-block-0c8256888bb34bb0ab9d0e2bce3d8c86">#include &quot;timer.h&quot;</div><div class="notion-text notion-block-0f721528b56344b88bc88c66fe44ece6">else</div><div class="notion-text notion-block-3b52bc7b692e4aad9687a9abb1a1d8d3">{<div class="notion-text-children"><div class="notion-text notion-block-45c8b9d2d0624aed825ebda9c81ad7d4">if(uart2.RxState == 0){ /<em> 首字节 </em>/<div class="notion-text-children"><div class="notion-text notion-block-d641919403954c259b8d2d15d1565fcd">__HAL_TIM_ENABLE(&amp;htim4);  //打开tim4的计数</div><div class="notion-text notion-block-62711692948b4035b267bc67df907d03">uart2.RxStat = 1;   //标记接收</div></div></div><div class="notion-text notion-block-51a5c00e981440f990de7d7d80f45b33">}else{/<em> 后续字节 </em>/<div class="notion-text-children"><div class="notion-text notion-block-d2249c2822b2475985c731df0ffa1fca">__HAL_TIM_SET_COUNTER(&amp;htim4, 0)//清除tim4的计数</div></div></div><div class="notion-text notion-block-a69df02090b14fbd958f31077de375db">}</div></div></div><div class="notion-text notion-block-c5056120bdf54217ac30a10d4b80d186">}</div></div></div><div class="notion-text notion-block-b426120a01fa4db39af6e0d89c7453de">}</div><details class="notion-toggle notion-block-b04a6ff06ae4427cacb974f1ff3c9c30"><summary><h4 class="notion-h notion-h3 notion-block-b04a6ff06ae4427cacb974f1ff3c9c30" data-id="b04a6ff06ae4427cacb974f1ff3c9c30"><span><div id="b04a6ff06ae4427cacb974f1ff3c9c30" class="notion-header-anchor"></div><span class="notion-h-title">main.c</span></span></h4></summary><div><div class="notion-text notion-block-7c15cb5360a34eb09ea3083808edcefd">#include &quot;stm32f1xx_hal.h&quot;</div><div class="notion-text notion-block-8afa4de1efb241e18860dc7d017343ca">#include &quot;rcc.h&quot;</div><div class="notion-text notion-block-5c5886d8934648dcaa81f0f67f292636">#include &quot;led.h&quot;</div><div class="notion-text notion-block-fbb92cbd425545d98e70ab48332d6c82">#include &quot;sw.h&quot;</div><div class="notion-text notion-block-1b0572907b8f48799c21b0db09533548">#include &quot;uart.h&quot;</div><div class="notion-text notion-block-22ecec58c131492d83a7098cdd71dc0d">int main(void){<div class="notion-text-children"><div class="notion-text notion-block-c7957c5e6e1b421f87e6695ef5375cfc">HAL_Init();</div><div class="notion-text notion-block-b92e1a84307a4557ad884f1bdd5be55a">RccClock_Init();</div><div class="notion-text notion-block-3617a0dc98f0489bb483129594d58ca1">SW_Init_IT(0);</div><div class="notion-text notion-block-58b06ac45eba428389d9ef305a35ac80">LED_Init();</div><div class="notion-text notion-block-916b1e17c6e4452991f75d1495ad542e">U1_Init(9600);</div></div></div><div class="notion-text notion-block-90490de816dc4da4879824a8bd49582a">U2_Init(9600);</div><div class="notion-text notion-block-3b0a7f736ddf484aba619c9e18e0478b">U3_Init(9600);</div><div class="notion-text notion-block-98478ca69a7147d7a24b8b373c824cc0">while(1){<div class="notion-text-children"><div class="notion-text notion-block-a6c1a9dd0c6d404cbac86ef758361df9">//串口1收发</div><div class="notion-text notion-block-dabf259d52e34cf38ee770c095d1707b">if(uart1.RxOutPtr != uart1.RxInPtr){<div class="notion-text-children"><div class="notion-text notion-block-22a8a64790d2425ba74d3b71778e1cd9">if(((uart1.RxOutPtr-&gt;end - uart1.RxOutPtr-&gt;start + 1)==6)&amp;&amp;(memcmp(uart1.RxOutPtr-&gt;start,&quot;LED_ON&quot;,6) == 0)){<div class="notion-text-children"><div class="notion-text notion-block-ddcf141687b64639862c10e729b4f0df">LED_ON();</div></div></div><div class="notion-text notion-block-14f7c97f5328406b807571d87e378751">}else if(((uart1.RxOutPtr-&gt;end - uart1.RxOutPtr-&gt;start + 1)==7)&amp;&amp;(memcmp(uart1.RxOutPtr-&gt;start,&quot;LED_OFF&quot;,7) == 0)){<div class="notion-text-children"><div class="notion-text notion-block-97baef1269dd432b9c115cde76b04a29">LED_OFF();</div></div></div><div class="notion-text notion-block-995ba76808184b27bb784408c1397995">}</div><div class="notion-text notion-block-ecddcfbaad98470fa476f56eb1066ce8">uart1.RxOutPtr++;</div><div class="notion-text notion-block-72da0550619543aa97fe980824a6aec4">if(uart1.RxOutPtr == uart1.RxEndPtr){<div class="notion-text-children"><div class="notion-text notion-block-36e5098ebe154d17b575e6f87a57b4b3">uart1.RxOutPtr = &amp;uart1.RxLocation[0];</div></div></div><div class="notion-text notion-block-93ae4a555fe34f41b574bd3dd4b452f3">}</div></div></div><div class="notion-text notion-block-95f1da598fce4b2e927d40a042e2d918">}</div><div class="notion-text notion-block-3f9922ab83e74b5db7486db666c301f4">if((uart1.TxOutPtr != uart1.TxInPtr)&amp;&amp;(uart1.TxState==0)){<div class="notion-text-children"><div class="notion-text notion-block-517a945151b645f2981384106b4f99f3">uart1.TxState = 1;</div><div class="notion-text notion-block-097091f3c54e4e38b8d15eee87b346d9">HAL_UART_Transmit_DMA(&amp;uart1.uart,uart1.TxOutPtr-&gt;start,uart1.TxOutPtr-&gt;end - uart1.TxOutPtr-&gt;start + 1);</div><div class="notion-text notion-block-3defdc7a67ab4dbcb34b3f569b78971d">uart1.TxOutPtr++;</div><div class="notion-text notion-block-bf648eb04af940a18300cf087fc7ac69">if(uart1.TxOutPtr == uart1.TxEndPtr){<div class="notion-text-children"><div class="notion-text notion-block-99ed24e6f6cd4882a1f56885378e869a">uart1.TxOutPtr = &amp;uart1.TxLocation[0];</div></div></div><div class="notion-text notion-block-19194a8292c148048a6a357eda544e16">}</div></div></div><div class="notion-text notion-block-858009612c73488bb77480a60184464d">}</div><div class="notion-text notion-block-f976f6e583fe4f24ae2c2a699db47d0d">//串口2收发</div><div class="notion-text notion-block-427f0fe948964247859de859462de6ee">if(uart2.RxOutPtr != uart2.RxInPtr){<div class="notion-text-children"><div class="notion-text notion-block-a32cd9190ade45b39b2a588a263c9a6a">if(((uart2.RxOutPtr-&gt;end - uart2.RxOutPtr-&gt;start + 1)==7)&amp;&amp;(memcmp(uart2.RxOutPtr-&gt;start,&quot;x81S1_LED&quot;,7) == 0)){<div class="notion-text-children"><div class="notion-text notion-block-a12ae9fd759c4d0e9f7b21c273402c52">LED_Toggle();</div></div></div><div class="notion-text notion-block-3eff3fc49cc142f1b871a04f1599b717">}</div><div class="notion-text notion-block-1094d66dda284d0c8a9fdfd4d287f2c3">uart2.RxOutPtr++;</div><div class="notion-text notion-block-44545b1862b14440bb9c0e13f5c5f809">if(uart2.RxOutPtr == uart2.RxEndPtr){<div class="notion-text-children"><div class="notion-text notion-block-244ce8bb06ef4fd2a24b803330a09f18">uart2.RxOutPtr = &amp;uart2.RxLocation[0];</div></div></div><div class="notion-text notion-block-684eb22998a34d1c9b556f1ff03943c5">}</div></div></div><div class="notion-text notion-block-f01ed64a3c494174b5b0df5aef23560f">}</div><div class="notion-text notion-block-33dd49d8df3a408faa1f3d575317396f">if((uart2.TxOutPtr != uart2.TxInPtr)&amp;&amp;(uart2.TxState==0)){<div class="notion-text-children"><div class="notion-text notion-block-a4fd688b228f44908a0b31b665547a6f">uart2.TxState = 1;</div><div class="notion-text notion-block-a662a6f6761042e1abb12d76ea37b5a7">HAL_UART_Transmit_DMA(&amp;uart2.uart,uart2.TxOutPtr-&gt;start,uart2.TxOutPtr-&gt;end - uart2.TxOutPtr-&gt;start + 1);</div><div class="notion-text notion-block-eaeafc0e130d419caa65a0bf7f98f728">uart2.TxOutPtr++;</div><div class="notion-text notion-block-50ca80a0c2dc4c718b8a400ca4231c94">if(uart2.TxOutPtr == uart2.TxEndPtr){<div class="notion-text-children"><div class="notion-text notion-block-32f5f970de644780aa2ed80b0d786f7e">uart2.TxOutPtr = &amp;uart2.TxLocation[0];</div></div></div><div class="notion-text notion-block-7fcea40597234cfdb126fd3daa21df81">}</div></div></div><div class="notion-text notion-block-87702909ce2d469fa570f5ada3f6e4f8">}</div><div class="notion-text notion-block-542fbb3e82d248d597d148d28d97da84">//串口3收发</div><div class="notion-text notion-block-4fdc3515e594483c98e74a14ff4169e3">if(uart3.RxOutPtr != uart3.RxInPtr){<div class="notion-text-children"><div class="notion-text notion-block-352a8d759a3a45d1900fbac3c9dbca63">if(((uart3.RxOutPtr-&gt;end - uart3.RxOutPtr-&gt;start + 1)==6)&amp;&amp;(memcmp(uart3.RxOutPtr-&gt;start,&quot;LED_ON&quot;,6) == 0)){<div class="notion-text-children"><div class="notion-text notion-block-94a0a5cdd3684f3d920d53467223fc8f">HAL_GPIO_WritePin(GPIOB,GPIO_PIN_0,GPIO_PIN_RESET);</div></div></div><div class="notion-text notion-block-47c62515d36b4ca1b1aca2c109bad7c8">}else if(((uart3.RxOutPtr-&gt;end - uart3.RxOutPtr-&gt;start + 1)==7)&amp;&amp;(memcmp(uart3.RxOutPtr-&gt;start,&quot;LED_OFF&quot;,7) == 0)){<div class="notion-text-children"><div class="notion-text notion-block-02c662b00fe64cfe9833be70c55d8d5f">HAL_GPIO_WritePin(GPIOB,GPIO_PIN_0,GPIO_PIN_SET);</div></div></div><div class="notion-text notion-block-75d1616fe11341dfa87d77bad0cfbd1a">}<div class="notion-text-children"><div class="notion-text notion-block-6ced386293cb47df8a5ac9e8cb35a992">uart3.RxOutPtr++;</div><div class="notion-text notion-block-900b3f874b724f968b627d3f86c8a45c">if(uart3.RxOutPtr == uart3.RxEndPtr){<div class="notion-text-children"><div class="notion-text notion-block-b616096155434dc7a103c32428095c0e">uart3.RxOutPtr = &amp;uart3.RxLocation[0];</div></div></div><div class="notion-text notion-block-e2c2036fd5044ab0b7a3c0d5dd84118a">}</div><div class="notion-text notion-block-7ecab8447d264f92bfc7ce84cfc8846f">}</div><div class="notion-text notion-block-167a59b3fff748f1b8c9a365adfc5e4b">if((uart3.TxOutPtr != uart3.TxInPtr)&amp;&amp;(uart3.TxState==0)){<div class="notion-text-children"><div class="notion-text notion-block-9d9481bacfec49aa8e4ecf9b1d75edd0">uart3.TxState = 1;</div><div class="notion-text notion-block-684509e3128b49e68bf38e06ebbfcdaf">HAL_HalfDuplex_EnableTransmitter(&amp;uart3.uart);</div><div class="notion-text notion-block-97697b00d2954eeda463b838588ddffa">HAL_UART_Transmit_DMA(&amp;uart3.uart,uart3.TxOutPtr-&gt;start,uart3.TxOutPtr-&gt;end - uart3.TxOutPtr-&gt;start + 1);</div><div class="notion-text notion-block-bb4b50ae953947ca9da737b1051fa08a">uart3.TxOutPtr++;</div><div class="notion-text notion-block-788a06c3c8694b3684c9ebda4a5988c9">if(uart3.TxOutPtr == uart3.TxEndPtr){<div class="notion-text-children"><div class="notion-text notion-block-20c0d42a9f4a4d1297298e241400431e">uart3.TxOutPtr = &amp;uart3.TxLocation[0];</div></div></div><div class="notion-text notion-block-94877995385946d7a7d3d9910845f47e">}</div></div></div><div class="notion-text notion-block-f6daaf6b2541446ab19546937209b358">}</div><div class="notion-text notion-block-f124abbaf2df4de4a936fface7c3ef3a">}</div></div></div></div></div></div></div><div class="notion-text notion-block-6d8d39a8293f4dd8833ad55d3e26af27">}</div></div></details><details class="notion-toggle notion-block-c28cf45586604326a08973b84eb22f51"><summary><h4 class="notion-h notion-h3 notion-block-c28cf45586604326a08973b84eb22f51" data-id="c28cf45586604326a08973b84eb22f51"><span><div id="c28cf45586604326a08973b84eb22f51" class="notion-header-anchor"></div><span class="notion-h-title">6. 从机2程序</span></span></h4></summary><div><details class="notion-toggle notion-block-ffd035fcb68647d5987a3590ad8f86ba"><summary><h4 class="notion-h notion-h3 notion-block-ffd035fcb68647d5987a3590ad8f86ba" data-id="ffd035fcb68647d5987a3590ad8f86ba"><span><div id="ffd035fcb68647d5987a3590ad8f86ba" class="notion-header-anchor"></div><span class="notion-h-title">uart.c</span></span></h4></summary><div><div class="notion-text notion-block-11bd15f53fd14e7eb3f1da6d3e56af8a">#include &quot;stm32f1xx_hal.h&quot;</div><div class="notion-text notion-block-9cc70be27a5e484bbbff16531820fd7d">#include &quot;uart.h&quot;</div><div class="notion-text notion-block-9bc96ee49a444be1a416b2fd53321401">UCB  uart1;</div><div class="notion-text notion-block-9db8588191004e0393d4ae1a14a32103">UCB  uart2;</div><div class="notion-text notion-block-2d3837037b164f1b813b7764aa9f53f3">UCB  uart3;</div><div class="notion-text notion-block-cf554f14977b42a68498de04df65dfb5">uint8_t U1_RxBuff[U1_RX_SIZE];</div><div class="notion-text notion-block-6c8a9d2f4d774921a42b13621ee39c14">uint8_t U1_TxBuff[U1_TX_SIZE];</div><div class="notion-text notion-block-3795685bc9e44de8bcf3878e853220bc">uint8_t U2_RxBuff[U2_RX_SIZE];</div><div class="notion-text notion-block-112187eb5f074222af812dafb2a85c3c">uint8_t U2_TxBuff[U2_TX_SIZE];</div><div class="notion-text notion-block-509f5f2f1af7430ba752448d8222d43f">uint8_t U3_RxBuff[U3_RX_SIZE];</div><div class="notion-text notion-block-34a5c8b2ea34450ab053c5e1df6b8835">uint8_t U3_TxBuff[U3_TX_SIZE];</div><div class="notion-text notion-block-7e08d5998ef24401a1d73300a5b8bd9a">void U1_Init(uint32_t bandrate){<div class="notion-text-children"><div class="notion-text notion-block-e6fc92134c9e40e78242ef41f1fffdc6">uart1.uart.Instance = USART1;</div><div class="notion-text notion-block-272ae462341d4a26946a37a231ece4c9">uart1.uart.Init.BaudRate = bandrate;</div><div class="notion-text notion-block-6bdec4356b1548ca92acfb174c2a7641">uart1.uart.Init.WordLength = UART_WORDLENGTH_8B;</div><div class="notion-text notion-block-de4b595e61344f70aca00242da6bc121">uart1.uart.Init.StopBits = UART_STOPBITS_1;</div><div class="notion-text notion-block-e113a686fc2e4f389fdadbd24f0aaaa7">uart1.uart.Init.Parity = UART_PARITY_NONE;</div><div class="notion-text notion-block-4f7263dc3b6145489e77476b34d8ec73">uart1.uart.Init.Mode = UART_MODE_TX_RX;</div></div></div></div></details><div class="notion-text notion-block-de790fc34ed34c8f9370eb30e80b2066">uart1.uart.Init.HwFlowCtl = UART_HWCONTROL_NONE;</div><div class="notion-text notion-block-2f416ec45b3e44c39711329d323f330b">HAL_UART_Init(&amp;uart1.uart);</div><div class="notion-text notion-block-a8e7307921b84cb092958f3b354097c0">U1_PtrInit();</div><div class="notion-text notion-block-4ffabf1272cc47789c1e7b5eb0f9f7cb">}</div><div class="notion-text notion-block-5e2147b4ed334ecb8f984cac25385d21">void U1_PtrInit(void){</div><div class="notion-text notion-block-22dcedd1ed544487a3959719d6c4d3da">uart1.RxInPtr = &amp;uart1.RxLocation[0];</div><div class="notion-text notion-block-30dbb0db50294182951b5b9b2ae46787">uart1.RxOutPtr = &amp;uart1.RxLocation[0];</div><div class="notion-text notion-block-d39985f06a9b4d6db5dfa23cb52f4153">uart1.RxEndPtr = &amp;uart1.RxLocation[9];</div><div class="notion-text notion-block-b3c5363f8ed3403da9dcbbd8928912b2">uart1.RxCounter = 0;</div><div class="notion-text notion-block-892032e34ff74f2d8ac1384918919352">uart1.RxInPtr-&gt;start = U1_RxBuff;</div><div class="notion-text notion-block-74117ed8ea1d499aae52c2af909d3b04">uart1.TxInPtr = &amp;uart1.TxLocation[0];</div><div class="notion-text notion-block-28ff0182a31a483bb4db7f59b387ff0a">uart1.TxOutPtr = &amp;uart1.TxLocation[0];</div><div class="notion-text notion-block-7c808100810146ab8f96863bec1b5cd4">uart1.TxEndPtr = &amp;uart1.TxLocation[9];</div><div class="notion-text notion-block-e1046af26b1449489cb548e3b06c306c">uart1.TxCounter = 0;</div><div class="notion-text notion-block-53a21a8fab634be9ad27bfb8107f9462">uart1.TxInPtr-&gt;start = U1_TxBuff;</div><div class="notion-text notion-block-2f2a662e7adb4c2eb951d24dd72c6e50">__HAL_UART_ENABLE_IT(&amp;uart1.uart, UART_IT_IDLE);</div><div class="notion-text notion-block-87f6ea38fb7a4df39b11e20b0915f6e9">HAL_UART_Receive_DMA(&amp;uart1.uart,uart1.RxInPtr-&gt;start,U1_RX_MAX);</div></div></details><div class="notion-text notion-block-b674c46a0af94d62b2cb3f542cae2c86">}</div><div class="notion-text notion-block-006ca1c3856942b2a011cc5bfc1b7d7a">void U1_Txdata(uint8_t *data, uint32_t data_len){</div><div class="notion-text notion-block-579951e377f046ccbcd5b14f4abc688f">if((U1_TX_SIZE - uart1.TxCounter )&gt;=data_len){<div class="notion-text-children"><div class="notion-text notion-block-a9c603e012a74f599941b035aa5b60ff">uart1.TxInPtr-&gt;start = &amp;U1_TxBuff[uart1.TxCounter];</div></div></div><div class="notion-text notion-block-3e8f066e913e4d30b725b5c1ae64266f">}else{<div class="notion-text-children"><div class="notion-text notion-block-7e227040931a4e1b84070d12abfd7f8c">uart1.TxCounter = 0;</div><div class="notion-text notion-block-9c33860986b549df8ed7e0c453a57c8c">uart1.TxInPtr-&gt;start = U1_TxBuff;</div></div></div><div class="notion-text notion-block-383832e834ca4bd9b1778a9f2953bb45">}</div><div class="notion-text notion-block-2d9c047fca274eb1abfaec38d0e7550b">memcpy(uart1.TxInPtr-&gt;start,data,data_len);</div><div class="notion-text notion-block-558b016f938f45a5a586d452093c8b87">uart1.TxCounter += data_len;</div><div class="notion-text notion-block-558defc6e2b7479a96140fd558d1fa9b">uart1.TxInPtr-&gt;end = &amp;U1_TxBuff[uart1.TxCounter - 1];</div><div class="notion-text notion-block-49cb8780717646e3937876e443c19c00">uart1.TxInPtr++;</div><div class="notion-text notion-block-adc9dab9bb2741f297ab8d8d6144d1ec">if(uart1.TxInPtr == uart1.TxEndPtr){<div class="notion-text-children"><div class="notion-text notion-block-3bb4d4d09e634e91a277064e11cb83d0">uart1.TxInPtr = &amp;uart1.TxLocation[0];</div></div></div><div class="notion-text notion-block-9e505e10c9bc4d4b9128d8c3f13ea1e7">}</div><div class="notion-text notion-block-2d430bf707844c5ca124fc1a931eb095">}</div><div class="notion-text notion-block-83c0888e24a34a5ba3869179935b6517">void U2_Init(uint32_t bandrate){</div><div class="notion-text notion-block-ecd82127f8504340bcfa59a8013db875">uart2.uart.Instance = USART2;</div><div class="notion-text notion-block-008448550242472a86c512891ea3b3bb">uart2.uart.Init.BaudRate = bandrate;</div><div class="notion-text notion-block-c6e6ae3b1fb84beeadf02812a4f17817">uart2.uart.Init.WordLength = UART_WORDLENGTH_8B;</div><div class="notion-text notion-block-8f395cf2602340c0a9461c0f72c0119d">uart2.uart.Init.StopBits = UART_STOPBITS_1;</div><div class="notion-text notion-block-18a0721bda0c4062bee9ce775e2093e7">uart2.uart.Init.Parity = UART_PARITY_NONE;</div><div class="notion-text notion-block-4dc25dbe8d1948ffb52ccaa3b1e5b5d7">uart2.uart.Init.Mode = UART_MODE_TX_RX;</div><div class="notion-text notion-block-5b15c42731b44ca88e45c2da07606461">uart2.uart.Init.HwFlowCtl = UART_HWCONTROL_NONE;</div><div class="notion-text notion-block-97c060b4e36843c8b7fd407613f0a267">HAL_MultiProcessor_Init(&amp;uart2.uart, 0x01, UART_WAKEUPMETHOD_ADDRESSMARK);   //多设备初始化</div><div class="notion-text notion-block-27206b5e81b1445796c59f00d0362ed0">HAL_MultiProcessor_EnterMuteMode(&amp;uart2.uart);  //手动进入静默模式</div><div class="notion-text notion-block-5e8d554b0c1e4167a0c1a3c888898727">TIM4_TimerInit(300, 7200);  //定时器超时时间30ms</div><div class="notion-text notion-block-93ea41762c714008a095fee0d96afb4d">U2_PtrInit();</div><div class="notion-text notion-block-2fe60071154541f2be757aaad283dab5">}</div><div class="notion-text notion-block-c746ca5fa3be48a990da415bbf97f698">void U2_PtrInit(void){</div><div class="notion-text notion-block-154238c05de049b2b8f94859ebbb7ad7">uart2.RxInPtr = &amp;uart2.RxLocation[0];</div><div class="notion-text notion-block-442dc0f587f64f558af0da601729b231">uart2.RxOutPtr = &amp;uart2.RxLocation[0];</div><div class="notion-text notion-block-1d061bb7c44d4193a2bd8c7e8524481d">uart2.RxEndPtr = &amp;uart2.RxLocation[9];</div><div class="notion-text notion-block-3152b99821704436b8898a619e270ef7">uart2.RxCounter = 0;</div><div class="notion-text notion-block-4701f49887ac47a6817ee1bcde5d00fb">uart2.RxInPtr-&gt;start = U2_RxBuff;</div><div class="notion-text notion-block-6819f72034ca48a29633b829ca092e0e">uart2.TxInPtr = &amp;uart2.TxLocation[0];</div><div class="notion-text notion-block-239e9d26ad92461ba37fa63ca6207133">uart2.TxOutPtr = &amp;uart2.TxLocation[0];</div><div class="notion-text notion-block-40a83b81ea1f41779b2bdad5187bba68">uart2.TxEndPtr = &amp;uart2.TxLocation[9];</div><div class="notion-text notion-block-81920895e832462b9f34b2fb6dc0127c">uart2.TxCounter = 0;</div><div class="notion-text notion-block-9d4f72b25a9d4d61b8238b9ef0a45f8e">uart2.TxInPtr-&gt;start = U2_TxBuff;	</div><div class="notion-text notion-block-0b0b53564c4442c6bb3c1319b075a496">uart2.RxState = 0;  //初始化接受状态为0</div><div class="notion-text notion-block-a882e52c830a4137b61824b9019e4fba">__HAL_UART_ENABLE_IT(&amp;uart2.uart, UART_IT_RXNE);    //打开接收中断</div><div class="notion-text notion-block-abfeac740d044131baa9aa212933fb32">HAL_UART_Receive_DMA(&amp;uart2.uart,uart2.RxInPtr-&gt;start,U2_RX_MAX);</div><div class="notion-text notion-block-9685aadbed244cf48637ce29b5f055df">}</div><div class="notion-text notion-block-7a4e7ba78020412785c5da45d54847b6">void U2_Txdata(uint8_t *data, uint32_t data_len){</div><div class="notion-text notion-block-472a6b0cd8bf44af82e7974a33735fe1">if((U2_TX_SIZE - uart2.TxCounter )&gt;=data_len){<div class="notion-text-children"><div class="notion-text notion-block-79e00cea3014416587d8b9577b656a00">uart2.TxInPtr-&gt;start = &amp;U2_TxBuff[uart2.TxCounter];</div></div></div><div class="notion-text notion-block-0d1bc34b44664dd992520db8fbe3716b">}else{<div class="notion-text-children"><div class="notion-text notion-block-b298f35fc9804a1ba1788f5eab991842">uart2.TxCounter = 0;</div><div class="notion-text notion-block-ef3e020a9b19471fb9aa03872aa80f62">uart2.TxInPtr-&gt;start = U2_TxBuff;</div></div></div><div class="notion-text notion-block-2ef5ddbb4887445d857f03ca1b49329a">}</div><div class="notion-text notion-block-39b5c87d66c8446caa69eec50a70e03b">memcpy(uart2.TxInPtr-&gt;start,data,data_len);</div><div class="notion-text notion-block-ba0de95c2f994480ab2403f64a3c8518">uart2.TxCounter += data_len;</div><div class="notion-text notion-block-f447225a5aab4cbe85734e68b2980ecf">uart2.TxInPtr-&gt;end = &amp;U2_TxBuff[uart2.TxCounter - 1];</div><div class="notion-text notion-block-0234a3f9b6d84b5da7d8d8cddf98ac0f">uart2.TxInPtr++;</div><div class="notion-text notion-block-21b3501cae774706b693ac67dd80dbc0">if(uart2.TxInPtr == uart2.TxEndPtr){<div class="notion-text-children"><div class="notion-text notion-block-d4de80d3067447c88560df4386c492dc">uart2.TxInPtr = &amp;uart2.TxLocation[0];</div></div></div><div class="notion-text notion-block-6d10b75101834ed8ae2a7bc7ce03812d">}</div><div class="notion-text notion-block-490f5aa37bf84f0a8521e2a8f408eb2c">}</div><div class="notion-text notion-block-68bcc8d43bed48acb7e50b698169edad">void U3_Init(uint32_t bandrate){</div><div class="notion-text notion-block-cc81888fccba47a8acb9351a0b03c752">uart3.uart.Instance = USART3;</div><div class="notion-text notion-block-85a33fea9b4049b1839db3432d5449b7">uart3.uart.Init.BaudRate = bandrate;</div><div class="notion-text notion-block-ef39d2bbd9814591ab3e203308f00428">uart3.uart.Init.WordLength = UART_WORDLENGTH_8B;</div><div class="notion-text notion-block-2b03ff74a7bf48538152bbf0bad840f1">uart3.uart.Init.StopBits = UART_STOPBITS_1;</div><div class="notion-text notion-block-f333bd0f89b04b9d9eaee47e29895e70">uart3.uart.Init.Parity = UART_PARITY_NONE;</div><div class="notion-text notion-block-66020023aecb4f4eac2895f23525eb57">uart3.uart.Init.Mode = UART_MODE_TX_RX;</div><div class="notion-text notion-block-ffc8923dfe1b47c390b4462603f0fb55">uart3.uart.Init.HwFlowCtl = UART_HWCONTROL_NONE;</div><div class="notion-text notion-block-fce0ee54a2224603a89e33ae26452344">HAL_MultiProcessor_Init(&amp;uart3.uart, 0x02, UART_WAKEUPMETHOD_ADDRESSMARK);   //多设备初始化</div><div class="notion-text notion-block-326074593d054f888cabf410f8f75bb4">HAL_MultiProcessor_EnterMuteMode(&amp;uart3.uart);  //手动进入静默模式</div><div class="notion-text notion-block-3babc1e9995142dba7af38d0db8a74d0">TIM4_TimerInit(300, 7200);  //定时器超时时间30ms</div><div class="notion-text notion-block-223fb18b4c1644eb9ef86cf37d2e4d53">U3_PtrInit();</div><div class="notion-text notion-block-3e9ff804a1c24f86947573b0ff35c4fa">}</div><div class="notion-text notion-block-2ecbb4b29b37470fbf022056a1988812">void U3_PtrInit(void){</div><div class="notion-text notion-block-df75e15afa5b412b90df3f832de93b44">uart3.RxInPtr = &amp;uart3.RxLocation[0];</div><div class="notion-text notion-block-880c903a0be347308a3efc9417148eda">uart3.RxOutPtr = &amp;uart3.RxLocation[0];</div><div class="notion-text notion-block-c790aaac853c4f548e6181de52a1a624">uart3.RxEndPtr = &amp;uart3.RxLocation[9];</div><div class="notion-text notion-block-121868170bdd4b018a0854f3f3b959a5">uart3.RxCounter = 0;</div><div class="notion-text notion-block-0a1209b6f84e4318ae09ae1b4e7be14a">uart3.RxInPtr-&gt;start = U3_RxBuff;</div><div class="notion-text notion-block-7cf6a4f720d24d1aaa12bfdf1af3a1a2">uart3.TxInPtr = &amp;uart3.TxLocation[0];</div><div class="notion-text notion-block-3832a922fe7f4fc2a82abb6dc7eac96f">uart3.TxOutPtr = &amp;uart3.TxLocation[0];</div><div class="notion-text notion-block-1a6ec1ddaf434985b4af88f14545becd">uart3.TxEndPtr = &amp;uart3.TxLocation[9];</div><div class="notion-text notion-block-a54397c7171a435bbc1811e9c8f8bf87">uart3.TxCounter = 0;</div><div class="notion-text notion-block-a589cdba9b1046d79a7e156ec27f70ed">uart3.TxInPtr-&gt;start = U3_TxBuff;</div><div class="notion-text notion-block-b1f1cef3751d4cb2aad96bcaa70743fa">uart3.RxState = 0;  //初始化接受状态为0</div><div class="notion-text notion-block-85ec71c512a2497bb856ac6ebfc7b204">__HAL_UART_ENABLE_IT(&amp;uart3.uart, UART_IT_RXNE);    //打开接收中断</div><div class="notion-text notion-block-9ffdcd038a9b472da13ec339a4d5df00">HAL_UART_Receive_DMA(&amp;uart3.uart,uart3.RxInPtr-&gt;start,U3_RX_MAX);</div><div class="notion-text notion-block-e8699fbdfc0546f3a36d6801c13ed113">}</div><div class="notion-text notion-block-a4448ba0a47a45d99f560e281b6c69b1">void U3_Txdata(uint8_t *data, uint32_t data_len){</div><div class="notion-text notion-block-4fb9bbecd45443ceaa7463f6a95d2eb0">if((U3_TX_SIZE - uart3.TxCounter )&gt;=data_len){<div class="notion-text-children"><div class="notion-text notion-block-7e7ffc6617d7414f9390130e4f742a15">uart3.TxInPtr-&gt;start = &amp;U3_TxBuff[uart3.TxCounter];</div></div></div><div class="notion-text notion-block-88b3313bc10f41f28c8362d94e283e6d">}else{<div class="notion-text-children"><div class="notion-text notion-block-58ba886d26474f0d9b7fdaae3d5ad67a">uart3.TxCounter = 0;</div><div class="notion-text notion-block-a4e7d5ef5f544c2aaf255da2b4725119">uart3.TxInPtr-&gt;start = U3_TxBuff;</div></div></div><div class="notion-text notion-block-61ab79f289d549a5b7164d9b6b1a4c0c">}</div><div class="notion-text notion-block-27b5cfe3a515404d9796bd2fe968a02f">memcpy(uart3.TxInPtr-&gt;start,data,data_len);</div><div class="notion-text notion-block-2f720192935242be81adf133a3eaca32">uart3.TxCounter += data_len;</div><div class="notion-text notion-block-d2180521f10e4e3f9c763790bf06c197">uart3.TxInPtr-&gt;end = &amp;U3_TxBuff[uart3.TxCounter - 1];</div><div class="notion-text notion-block-ee3e336e12874ec4a20893ec0e5588d9">uart3.TxInPtr++;</div><div class="notion-text notion-block-a5028b3e389c471483b499a0d849a58c">if(uart3.TxInPtr == uart3.TxEndPtr){<div class="notion-text-children"><div class="notion-text notion-block-54f86383a0a44f5bb96ef0fe9d3861c0">uart3.TxInPtr = &amp;uart3.TxLocation[0];</div></div></div><div class="notion-text notion-block-2793965421ed4e9c8223facd96a84fee">}</div><div class="notion-text notion-block-172e089d3829486a8d34b764536f14d9">}</div><div class="notion-text notion-block-629a77ceb0d341e1b115666d598c7377">void HAL_UART_MspInit(UART_HandleTypeDef *huart){</div><div class="notion-text notion-block-974199e3687747f69ae0b66599ab22a4">GPIO_InitTypeDef GPIO_InitType;</div><div class="notion-text notion-block-5a89de94f0994c97b579aec49dd36d62">if(huart-&gt;Instance == USART1){<div class="notion-text-children"><div class="notion-text notion-block-dcb098f66c6a4b4780b546f2f641dff3">__HAL_RCC_GPIOA_CLK_ENABLE();</div><div class="notion-text notion-block-b857b627e7684483bc2c69db464258d5">__HAL_RCC_USART1_CLK_ENABLE();</div><div class="notion-text notion-block-4f0d30c534324d26b719d646460634e1">__HAL_RCC_DMA1_CLK_ENABLE();<div class="notion-text-children"><div class="notion-text notion-block-559d4ec8a00b44c9985bdf9e5c088420">GPIO_<a class="notion-link" href="http://InitType.Pin" target="_blank" rel="noopener noreferrer">InitType.Pin</a> = GPIO_PIN_9;</div><div class="notion-text notion-block-d316d83e714644858069b1c7f130971c">GPIO_InitType.Mode = GPIO_MODE_AF_PP;</div><div class="notion-text notion-block-c87caa5a06f14705afec933f625a3d33">GPIO_InitType.Speed = GPIO_SPEED_FREQ_MEDIUM;</div><div class="notion-text notion-block-1ae574c1226a4526879de3b747dcfc36">HAL_GPIO_Init(GPIOA,&amp;GPIO_InitType);</div><div class="notion-text notion-block-16829941271b49ecaf64b66839109f10">GPIO_<a class="notion-link" href="http://InitType.Pin" target="_blank" rel="noopener noreferrer">InitType.Pin</a> = GPIO_PIN_10;</div><div class="notion-text notion-block-1147c1cf49ae4f768c25293a269542e6">GPIO_InitType.Mode = GPIO_MODE_AF_INPUT;</div><div class="notion-text notion-block-a6dd188e635d45a2aba0ffcf0ae89da3">GPIO_InitType.Pull = GPIO_PULLUP;</div><div class="notion-text notion-block-1c7ebc656bcf4f7f9af1567b0142076d">HAL_GPIO_Init(GPIOA,&amp;GPIO_InitType);</div><div class="notion-text notion-block-10595f5588ee4e5a8c99a848bbeef7ed">HAL_NVIC_SetPriority(USART1_IRQn,3,0);</div><div class="notion-text notion-block-d40de1bf6bb94ce9afe3a45ec704e5f8">HAL_NVIC_EnableIRQ(USART1_IRQn);</div><div class="notion-text notion-block-c22de37e4ba046f7a2c1e423fa37adf6">uart1.dmatx.Instance = DMA1_Channel4;</div><div class="notion-text notion-block-78fedcc1ad7f4762bf15442cd62746b9">uart1.dmatx.Init.Direction = DMA_MEMORY_TO_PERIPH;</div><div class="notion-text notion-block-27582b6f346d4cb89af402a0585424cb">uart1.dmatx.Init.PeriphInc = DMA_PINC_DISABLE;</div><div class="notion-text notion-block-262bdc4aa4cb4729ab727b4b6f770d48">uart1.dmatx.Init.MemInc = DMA_MINC_ENABLE;</div><div class="notion-text notion-block-3878abf315a042b3857be10e5fe2e59e">uart1.dmatx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;</div><div class="notion-text notion-block-fa69adefd31e4d6cadc9b049bb2c9193">uart1.dmatx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;</div><div class="notion-text notion-block-455deba58d464506a542ae172f395684">uart1.dmatx.Init.Mode = DMA_NORMAL;</div><div class="notion-text notion-block-84cc068a73a94e8584706f0097cb16f4">uart1.dmatx.Init.Priority = DMA_PRIORITY_MEDIUM;</div><div class="notion-text notion-block-9d87a77457f644b990f000072d1c64de">__HAL_LINKDMA(huart, hdmatx, uart1.dmatx);</div><div class="notion-text notion-block-1f28a2156152485b8a5805273c64618b">HAL_DMA_Init(&amp;uart1.dmatx);</div><div class="notion-text notion-block-4517270c4e6c4017b03a9cbc3ca5ff6b">HAL_NVIC_SetPriority(DMA1_Channel4_IRQn,3,0);</div><div class="notion-text notion-block-6b47979f81c741f4b50d723d95cf9630">HAL_NVIC_EnableIRQ(DMA1_Channel4_IRQn);</div><div class="notion-text notion-block-2924a4e948e643a4a9f8e751e0326d25">uart1.dmarx.Instance = DMA1_Channel5;</div><div class="notion-text notion-block-30be2f3245264115b0d219d80c3e971b">uart1.dmarx.Init.Direction = DMA_PERIPH_TO_MEMORY;</div><div class="notion-text notion-block-c0ac33c9dffc42aeb767c23814331fc9">uart1.dmarx.Init.PeriphInc = DMA_PINC_DISABLE;</div><div class="notion-text notion-block-0a6cd564da5d4eb9a81347c7224ac270">uart1.dmarx.Init.MemInc = DMA_MINC_ENABLE;</div><div class="notion-text notion-block-b219830c06fe425196713559bba513f4">uart1.dmarx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;</div><div class="notion-text notion-block-b900d971224744feb01a0d073966fb97">uart1.dmarx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;</div><div class="notion-text notion-block-9bded521c0b94da8b3bd759dcbd66828">uart1.dmarx.Init.Mode = DMA_NORMAL;</div><div class="notion-text notion-block-6a9be716444245c28dff945159e68d15">uart1.dmarx.Init.Priority = DMA_PRIORITY_MEDIUM;</div><div class="notion-text notion-block-8648be143c1646f2bc4911e0cef41b9c">__HAL_LINKDMA(huart, hdmarx, uart1.dmarx);</div><div class="notion-text notion-block-0db627f6c1184948bd7890d562adbe2b">HAL_DMA_Init(&amp;uart1.dmarx);</div><div class="notion-text notion-block-782c0078b8c2462da1853effe640ca35">HAL_NVIC_SetPriority(DMA1_Channel5_IRQn,3,0);</div><div class="notion-text notion-block-08e5fc3b1fdd4917b6cdf5f3332870ca">HAL_NVIC_EnableIRQ(DMA1_Channel5_IRQn);</div><div class="notion-text notion-block-bd79e72be5fa4122ab34553ae85c97b8">}else if(huart-&gt;Instance == USART2){<div class="notion-text-children"><div class="notion-text notion-block-54843e7d47e54907892c85fa1233b86a">__HAL_RCC_GPIOA_CLK_ENABLE();</div><div class="notion-text notion-block-02e103bc90354bc0865e91f4dc90cf8c">__HAL_RCC_USART2_CLK_ENABLE();</div><div class="notion-text notion-block-d84455b0ef1442e885a77d9abbd094b8">__HAL_RCC_DMA1_CLK_ENABLE();</div><div class="notion-text notion-block-b964176181c0474fa2b745f4e5ccba1b">GPIO_<a class="notion-link" href="http://InitType.Pin" target="_blank" rel="noopener noreferrer">InitType.Pin</a> = GPIO_PIN_2;</div><div class="notion-text notion-block-f721f8000b9c4f1095f2a952310c642d">GPIO_InitType.Mode = GPIO_MODE_AF_OD;   //OD模式</div><div class="notion-text notion-block-f4d02b2fbe714463acd9155c101c8c9c">GPIO_InitType.Speed = GPIO_SPEED_FREQ_MEDIUM;</div><div class="notion-text notion-block-1c8dec12cef54f40a3bedb2abe3b4002">HAL_GPIO_Init(GPIOA,&amp;GPIO_InitType);</div><div class="notion-text notion-block-3a0bcf06864e42b3add0596171ccb8ee">GPIO_<a class="notion-link" href="http://InitType.Pin" target="_blank" rel="noopener noreferrer">InitType.Pin</a> = GPIO_PIN_3;</div><div class="notion-text notion-block-c5ee28e394ce4231b20dc95ea429d015">GPIO_InitType.Mode = GPIO_MODE_AF_INPUT;</div><div class="notion-text notion-block-e0aa31de4738464789d539243f121e92">GPIO_InitType.Pull = GPIO_NOPULL;</div><div class="notion-text notion-block-1d3f62b7767547ddba734129628c9c1d">HAL_GPIO_Init(GPIOA,&amp;GPIO_InitType);</div><div class="notion-text notion-block-d8853dcb87754989bbeb4259ed289752">HAL_NVIC_SetPriority(USART2_IRQn,3,0);</div><div class="notion-text notion-block-da0178349f5341169a35c5b37e08afa9">HAL_NVIC_EnableIRQ(USART2_IRQn);</div><div class="notion-text notion-block-2cd0d09a71db4171bb923872a90e53c9">uart2.dmatx.Instance = DMA1_Channel7;</div><div class="notion-text notion-block-66a876842ee746e3b93107fc38d86893">uart2.dmatx.Init.Direction = DMA_MEMORY_TO_PERIPH;</div><div class="notion-text notion-block-ea4c7534777f4e5bb225093477f6478d">uart2.dmatx.Init.PeriphInc = DMA_PINC_DISABLE;</div><div class="notion-text notion-block-800bb2e7c0d44688a4f0e90a67f2fe16">uart2.dmatx.Init.MemInc = DMA_MINC_ENABLE;</div><div class="notion-text notion-block-56d0e2786afb46699d138a30fde8b8f4">uart2.dmatx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;</div><div class="notion-text notion-block-cdec6eb3e6bb45dcaf356081880f98b3">uart2.dmatx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;</div><div class="notion-text notion-block-a5e3e6a1b84a4108b411b1d9e78ef39f">uart2.dmatx.Init.Mode = DMA_NORMAL;</div><div class="notion-text notion-block-2d976a26579b455c9e523d8b10add7db">uart2.dmatx.Init.Priority = DMA_PRIORITY_MEDIUM;</div><div class="notion-text notion-block-f86faaccd8574b598f31eb37a24d059a">__HAL_LINKDMA(huart, hdmatx, uart2.dmatx);</div><div class="notion-text notion-block-e0c0f2babb1b49938b1cda0c625a577a">HAL_DMA_Init(&amp;uart2.dmatx);</div><div class="notion-text notion-block-f7fd73ac78d6424bac8350a2efedfeba">HAL_NVIC_SetPriority(DMA1_Channel7_IRQn,3,0);</div><div class="notion-text notion-block-9a69f5f0d9d947d79662040028409630">HAL_NVIC_EnableIRQ(DMA1_Channel7_IRQn);</div><div class="notion-text notion-block-8991409f3fbe48df94a3012da255b68f">uart2.dmarx.Instance = DMA1_Channel6;</div><div class="notion-text notion-block-fb71987e64e54dd39248a20925467ba3">uart2.dmarx.Init.Direction = DMA_PERIPH_TO_MEMORY;</div><div class="notion-text notion-block-81691a41fd8c4f61a85fe2c7200e7c5c">uart2.dmarx.Init.PeriphInc = DMA_PINC_DISABLE;</div><div class="notion-text notion-block-557e89d2b9f9403da4ff7d940bc28870">uart2.dmarx.Init.MemInc = DMA_MINC_ENABLE;</div><div class="notion-text notion-block-39668f43284f421daab1b169ecabe0e5">uart2.dmarx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;</div><div class="notion-text notion-block-234e535418034d3ba00a04eb0c42a937">uart2.dmarx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;</div><div class="notion-text notion-block-c6e89a00649045b7a388ae6c9a6012e2">uart2.dmarx.Init.Mode = DMA_NORMAL;</div><div class="notion-text notion-block-59ca6a4cd4b34d58a539ea03ea194f68">uart2.dmarx.Init.Priority = DMA_PRIORITY_MEDIUM;</div><div class="notion-text notion-block-f4e112d382fc48a9983d955123b89a52">__HAL_LINKDMA(huart, hdmarx, uart2.dmarx);</div><div class="notion-text notion-block-8546a8af1c824329877376c07111a753">HAL_DMA_Init(&amp;uart2.dmarx);</div><div class="notion-text notion-block-3b99fa80f7cf4a569cd4c9f12b64007f">HAL_NVIC_SetPriority(DMA1_Channel6_IRQn,3,0);</div><div class="notion-text notion-block-32d135af250b4090a7e7c9578fffecd5">HAL_NVIC_EnableIRQ(DMA1_Channel6_IRQn);</div></div></div><div class="notion-text notion-block-f1bd5a936c2c478fbdba84142b7af2dc">}else if(huart-&gt;Instance == USART3){<div class="notion-text-children"><div class="notion-text notion-block-81d71500aa634df29439e4727e677b64">__HAL_RCC_GPIOB_CLK_ENABLE();</div><div class="notion-text notion-block-9d25b9da17c04a69a18d4bb15b03d91c">__HAL_RCC_USART3_CLK_ENABLE();</div><div class="notion-text notion-block-b9ee12ff789b4ec0ae80e39a2c8d546c">__HAL_RCC_DMA1_CLK_ENABLE();</div><div class="notion-text notion-block-fcd255d568a84fc6a9760c2cccc2a164">GPIO_<a class="notion-link" href="http://InitType.Pin" target="_blank" rel="noopener noreferrer">InitType.Pin</a> = GPIO_PIN_10;    </div><div class="notion-text notion-block-d62b12c9afca4fecaf2bf71df019aa78">GPIO_InitType.Mode = GPIO_MODE_AF_OD;    //OD模式</div><div class="notion-text notion-block-815202753ce049409f482176c4aa994d">GPIO_InitType.Speed = GPIO_SPEED_FREQ_MEDIUM;</div><div class="notion-text notion-block-e4b1f477ae8549d3af928a107fff8028">HAL_GPIO_Init(GPIOB,&amp;GPIO_InitType);</div><div class="notion-text notion-block-104d7944e84e4c87b45dde036755eb7c">GPIO_<a class="notion-link" href="http://InitType.Pin" target="_blank" rel="noopener noreferrer">InitType.Pin</a> = GPIO_PIN_11;</div><div class="notion-text notion-block-6284e9285f3d455c922e549028e910d1">GPIO_InitType.Mode = GPIO_MODE_AF_INPUT;</div><div class="notion-text notion-block-5994423bc2cf421da8da2c558c982361">GPIO_InitType.Pull = GPIO_NOPULL;</div><div class="notion-text notion-block-d49451661bf942c6abe16eddcfd8b3ea">HAL_GPIO_Init(GPIOB,&amp;GPIO_InitType);</div><div class="notion-text notion-block-51a3e5db81b94df29acd357b2cb53b8b">HAL_NVIC_SetPriority(USART3_IRQn,3,0);</div><div class="notion-text notion-block-abf45da1fd08493f901c29d86adcdfe9">HAL_NVIC_EnableIRQ(USART3_IRQn);</div><div class="notion-text notion-block-bc1bcf81d2ba45f89c675cfc663bb5fa">uart3.dmatx.Instance = DMA1_Channel2;</div><div class="notion-text notion-block-d4feb9b8ecd842ad81ed060d25d6477b">uart3.dmatx.Init.Direction = DMA_MEMORY_TO_PERIPH;</div><div class="notion-text notion-block-dd27f8bff2144a7b837ddede931ef6b3">uart3.dmatx.Init.PeriphInc = DMA_PINC_DISABLE;</div><div class="notion-text notion-block-c245f640cd9f492a860f7ce73dbab833">uart3.dmatx.Init.MemInc = DMA_MINC_ENABLE;</div><div class="notion-text notion-block-504ad193d83144aaa6aef9814ca94a76">uart3.dmatx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;</div><div class="notion-text notion-block-7474cdb48fc24c9c8e4fc8ca80b71606">uart3.dmatx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;</div><div class="notion-text notion-block-f2701e1fd02047dbb69ac9e27a5ba1e6">uart3.dmatx.Init.Mode = DMA_NORMAL;</div><div class="notion-text notion-block-f41d067e2f5d4953a70dbb602174de2e">uart3.dmatx.Init.Priority = DMA_PRIORITY_MEDIUM;</div><div class="notion-text notion-block-bc544fd571714782afabb819a069bb48">__HAL_LINKDMA(huart, hdmatx, uart3.dmatx);</div><div class="notion-text notion-block-5e97de88e02d41f587a534be50f6edea">HAL_DMA_Init(&amp;uart3.dmatx);</div><div class="notion-text notion-block-a042ccf87e734540b1aab3366073a8e1">HAL_NVIC_SetPriority(DMA1_Channel2_IRQn,3,0);</div><div class="notion-text notion-block-b49adc3394864b2b9077931368be43f5">HAL_NVIC_EnableIRQ(DMA1_Channel2_IRQn);</div><div class="notion-text notion-block-c2c45818493f48fa82133d47f06a4a0e">uart3.dmarx.Instance = DMA1_Channel3;</div><div class="notion-text notion-block-d79ee62b79ad451eb6bc0e6673fb707c">uart3.dmarx.Init.Direction = DMA_PERIPH_TO_MEMORY;</div><div class="notion-text notion-block-61304790a7d246bcb0052b76760f434b">uart3.dmarx.Init.PeriphInc = DMA_PINC_DISABLE;</div><div class="notion-text notion-block-e7190582788b4d038005cde659fa0644">uart3.dmarx.Init.MemInc = DMA_MINC_ENABLE;</div><div class="notion-text notion-block-833dcc45fc7b4b049938e903a33aac5a">uart3.dmarx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;</div><div class="notion-text notion-block-0973bcb41c2f48e7acdf813aa6ef8181">uart3.dmarx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;</div><div class="notion-text notion-block-8e8e9d3c8dc74c69a2f126c0661945a2">uart3.dmarx.Init.Mode = DMA_NORMAL;</div><div class="notion-text notion-block-20a598494966455e898388906f16e5e0">uart3.dmarx.Init.Priority = DMA_PRIORITY_MEDIUM;</div><div class="notion-text notion-block-57f9cc0d1b554a13b73eca3b1b7396c5">__HAL_LINKDMA(huart, hdmarx, uart3.dmarx);</div><div class="notion-text notion-block-bb8b1215aa1d4749acf318ae0e5a9655">HAL_DMA_Init(&amp;uart3.dmarx);</div><div class="notion-text notion-block-f1de257946b143c98ddd7283fd33b581">HAL_NVIC_SetPriority(DMA1_Channel3_IRQn,3,0);</div><div class="notion-text notion-block-29483784f9b54287a57e07fd0b70163c">HAL_NVIC_EnableIRQ(DMA1_Channel3_IRQn);</div></div></div><div class="notion-text notion-block-d3ad31cf444d4c14842bc59d566bf8a5">}</div></div></div></div></div><div class="notion-text notion-block-4216ba3191de420bb534e46e0d11d952">}</div><div class="notion-text notion-block-6d7c72f491e948bfa2b1bf3d75ec7cbb">void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)</div><div class="notion-text notion-block-7fa1c594b107401d912ba11b5abe08a8">{</div><div class="notion-text notion-block-c82a9be143dc455f882dc7dfbc885e3d">if(huart-&gt;Instance == USART1){</div><div class="notion-text notion-block-d6d19274013f46b389a55198654c257d">}</div><div class="notion-text notion-block-2c9661cf208940bab7c17a1a6e7b605c">}</div><div class="notion-text notion-block-24925880f1344648acd66bc8a669ed00">void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart)</div><div class="notion-text notion-block-41a897b17b454263b25ccc880902953b">{</div><div class="notion-text notion-block-b977ec4753ea42cfb00490c590638ee1">if(huart-&gt;Instance == USART1){</div><div class="notion-text notion-block-42159d6d2ef24f38940140c2f96366a9">}</div><div class="notion-text notion-block-f71c659b743c45c0ac1fa85938730a0a">}</div><div class="notion-text notion-block-ed590530041947a49ba47f09d7cfe25e">void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)</div><div class="notion-text notion-block-9a021d5133fc47e4a10ed2a63a15191e">{</div><div class="notion-text notion-block-17d329e1d0ce4293954e9925859f7512">if(huart-&gt;Instance == USART1){<div class="notion-text-children"><div class="notion-text notion-block-3f0ec3d6fc06491e8bc18178a66c767c">uart1.TxState = 0;</div></div></div><div class="notion-text notion-block-2558dcb814c1440c9f96738b7f08f01b">}else if(huart-&gt;Instance == USART2){<div class="notion-text-children"><div class="notion-text notion-block-54e92a83cbfc473ea4bbecccfc107613">uart2.TxState = 0;</div></div></div><div class="notion-text notion-block-6751077b51c84475b9883b7e3ff505b9">}else if(huart-&gt;Instance == USART3){<div class="notion-text-children"><div class="notion-text notion-block-cebb9565207e4e5188fe7ffbdff73190">uart3.TxState = 0;</div></div></div><div class="notion-text notion-block-95c6367a1e0b4f7097b630e49c9d3e80">}</div><div class="notion-text notion-block-e9635a3f7876420c9127179d50853716">}</div><div class="notion-text notion-block-ab57ed6db8f34f419df736d1c9e3eb85">/<em> 接收终止回调 </em>/</div><div class="notion-text notion-block-cc6495e74fdf4aa5aa1b4b4e03985468">void HAL_UART_AbortReceiveCpltCallback(UART_HandleTypeDef *huart)</div><div class="notion-text notion-block-722d68861bf74c318d338f103c96a686">{</div><div class="notion-text notion-block-cd8085b1736947baba83b9a068c783a4">if(huart-&gt;Instance == USART1){<div class="notion-text-children"><div class="notion-text notion-block-e0beb6c181b845308dfa3c40adcf2d6c">uart1.RxInPtr-&gt;end = &amp;U1_RxBuff[uart1.RxCounter - 1];</div><div class="notion-text notion-block-6f8098919170435a81a734accdbaf3be">uart1.RxInPtr++;</div><div class="notion-text notion-block-9c3e4d56dad245e19ba879f0ef6f0c8b">if(uart1.RxInPtr == uart1.RxEndPtr){<div class="notion-text-children"><div class="notion-text notion-block-e9c13f088d7c4422bffa0d5efdc0c8a8">uart1.RxInPtr = &amp;uart1.RxLocation[0];</div></div></div><div class="notion-text notion-block-d5b9031732f644f59eb6498c8e042998">}</div><div class="notion-text notion-block-ec90378c8c0a414490f67bd0fa753e80">if((U1_RX_SIZE - uart1.RxCounter)&lt;U1_RX_MAX){<div class="notion-text-children"><div class="notion-text notion-block-627683c95d86405f94dbc19e291ad851">uart1.RxCounter = 0;</div><div class="notion-text notion-block-312b0598234249ce8eefbcc60c2fc5f4">uart1.RxInPtr-&gt;start = U1_RxBuff;</div></div></div><div class="notion-text notion-block-e76791a0fee340efbf57eb09386da228">}else{<div class="notion-text-children"><div class="notion-text notion-block-c6e8247e488a466b8da1bb180161d713">uart1.RxInPtr-&gt;start = &amp;U1_RxBuff[uart1.RxCounter];</div></div></div><div class="notion-text notion-block-8298292c648c4412995f80d8d0544727">}</div><div class="notion-text notion-block-a365909d1343473bb973f1996b113bda">HAL_UART_Receive_DMA(&amp;uart1.uart,uart1.RxInPtr-&gt;start,U1_RX_MAX);</div></div></div><div class="notion-text notion-block-7fdd264c03b947cc99f1994c002e0fa9">}else if(huart-&gt;Instance == USART2){<div class="notion-text-children"><div class="notion-text notion-block-12176c2c5b824a5d9f0cb22dd15768af">uart2.RxInPtr-&gt;end = &amp;U2_RxBuff[uart2.RxCounter - 1];</div><div class="notion-text notion-block-15292c5c3dcd4a2b8bde50b34998ae3b">uart2.RxInPtr++;</div><div class="notion-text notion-block-1d2c1bba395442af81d42f1320cba7be">if(uart2.RxInPtr == uart2.RxEndPtr){<div class="notion-text-children"><div class="notion-text notion-block-37c5c39cde614ab9b9400e006c096964">uart2.RxInPtr = &amp;uart2.RxLocation[0];</div></div></div><div class="notion-text notion-block-f9d7c2bc039f4733b4f40aa77400e203">}</div><div class="notion-text notion-block-0a62c86b0f214571b497f8ccf9cbc7bb">if((U2_RX_SIZE - uart2.RxCounter)&lt;U2_RX_MAX){<div class="notion-text-children"><div class="notion-text notion-block-3b261fdc5f054ddb8423da5ee709481e">uart2.RxCounter = 0;</div><div class="notion-text notion-block-c6f6353087f840678b2ec7193a8f9717">uart2.RxInPtr-&gt;start = U2_RxBuff;</div></div></div><div class="notion-text notion-block-0b355273f150436ea028d4838e1ddb1e">}else{<div class="notion-text-children"><div class="notion-text notion-block-cd77c6da1bee4284ba85be56158f0ad4">uart2.RxInPtr-&gt;start = &amp;U2_RxBuff[uart2.RxCounter];</div></div></div><div class="notion-text notion-block-edbf0c76c2194029a55583ad2c5363ba">}</div><div class="notion-text notion-block-561ec80355ba46f5bd3651060f314562">HAL_MultiProcessor_EnterMuteMode(&amp;uart2.uart);  //手动进入静默模式</div><div class="notion-text notion-block-ca059b037a1843cc988a3ac0dcffe745">__HAL_UART_ENABLE_IT(&amp;uart2.uart, UART_IT_RXNE);    //打开接收中断</div><div class="notion-text notion-block-403e959715f5443690f5a058aef6a6a8">HAL_UART_Receive_DMA(&amp;uart2.uart,uart2.RxInPtr-&gt;start,U2_RX_MAX);</div></div></div><div class="notion-text notion-block-29f9a232bbac48f28c60c188899336d9">}else if(huart-&gt;Instance == USART3){<div class="notion-text-children"><div class="notion-text notion-block-116b5f0cf12d4a26baddfff394cad4bf">uart3.RxInPtr-&gt;end = &amp;U3_RxBuff[uart3.RxCounter - 1];</div><div class="notion-text notion-block-7dc27c607b0b4a19a920d30a9d3eed15">uart3.RxInPtr++;</div><div class="notion-text notion-block-b13cb37dbe6d4b3da64b9059bdae8962">if(uart3.RxInPtr == uart3.RxEndPtr){<div class="notion-text-children"><div class="notion-text notion-block-8692325a2ac44369b2aba3cc75140efa">uart3.RxInPtr = &amp;uart3.RxLocation[0];</div></div></div><div class="notion-text notion-block-fb916078dc5b4c39b91d62111d1566cf">}</div><div class="notion-text notion-block-c5848b35ab574aa3954dba2d4f5d04f1">if((U3_RX_SIZE - uart3.RxCounter)&lt;U3_RX_MAX){<div class="notion-text-children"><div class="notion-text notion-block-e2e259f44af347328dcea09d2449811b">uart3.RxCounter = 0;</div><div class="notion-text notion-block-01d9cfa89ecc456baae1a2db1c679ccf">uart3.RxInPtr-&gt;start = U3_RxBuff;</div></div></div><div class="notion-text notion-block-76d859fd2ca041eca9e39744c2ac1381">}else{<div class="notion-text-children"><div class="notion-text notion-block-022392d30c2441b49e3f2b17170c79e7">uart3.RxInPtr-&gt;start = &amp;U3_RxBuff[uart3.RxCounter];</div></div></div><div class="notion-text notion-block-c56495b9271e4daf87aec855bd3bb165">}</div><div class="notion-text notion-block-479cc1a836c3483ca4bea97697f2f27e">HAL_MultiProcessor_EnterMuteMode(&amp;uart3.uart);  //手动进入静默模式</div><div class="notion-text notion-block-6455bf42128d496eb5abc907ef14ff59">__HAL_UART_ENABLE_IT(&amp;uart3.uart, UART_IT_RXNE);    //打开接收中断</div><div class="notion-text notion-block-6e432a908e7f4342b1fb3743079d198f">HAL_UART_Receive_DMA(&amp;uart3.uart,uart3.RxInPtr-&gt;start,U3_RX_MAX);</div></div></div><div class="notion-text notion-block-8f63e27282c14604921dad73be828cb5">}</div><div class="notion-text notion-block-7f935c1d95df4ad7ac66ce164c59aad5">}<div class="notion-text-children"><details class="notion-toggle notion-block-9b38f92143884f5a83cc51ac6b77d6d2"><summary><h4 class="notion-h notion-h3 notion-block-9b38f92143884f5a83cc51ac6b77d6d2" data-id="9b38f92143884f5a83cc51ac6b77d6d2"><span><div id="9b38f92143884f5a83cc51ac6b77d6d2" class="notion-header-anchor"></div><span class="notion-h-title">uart.h</span></span></h4></summary><div><div class="notion-text notion-block-81f1bc3662304be0af2d2062790bfd29">/<em>-----------------------------------------------------</em>/</div><div class="notion-text notion-block-f566e564f0ab4237a538a7f9ba728b02">/<em>                     程序结构                        </em>/</div><div class="notion-text notion-block-cdeea378009949218ca3f5ef37cbf9ff">/<em>-----------------------------------------------------</em>/</div><div class="notion-text notion-block-d163eefebcdc4663acbc7b3edf266214">/<em>USER   ：包含程序的 main 函数，是整个程序的入        </em>/</div><div class="notion-text notion-block-b0a229afd03f4ebfb6b0fa28659fc77a">/<em>HW     ：包含开发板各种功能外设的驱动程序            </em>/</div><div class="notion-text notion-block-3395adb3e0244129b9c3971e87d16535">/<em>LIB    ：官方提供的 HAL 库文件                       </em>/</div><div class="notion-text notion-block-4ae536f91e65441bbff082f003e37252">/<em>CMSIS  ：CM3 内核相关的启动文件系统文件              </em>/</div><div class="notion-text notion-block-989046cc7b4b4a8d80923248a55b90f1">/<em>-----------------------------------------------------</em>/</div><div class="notion-text notion-block-bda8d77f8195466eafd6174b98123e42">/<em>                                                     </em>/</div><div class="notion-text notion-block-965f454845a546c58ff4753bb66ae6e8">/<em>                实现定时器功能的头文件               </em>/</div><div class="notion-text notion-block-ae12ccb4786242158b95c28f8e646c23">/<em>                                                     </em>/</div><div class="notion-text notion-block-89d9af3877b140fdb73ae88c983a2759">/<em>-----------------------------------------------------</em>/</div><div class="notion-text notion-block-aa7cf9cea8b0499fa4ab0aa78c196efc">#ifndef _TIMER_H</div><div class="notion-text notion-block-31c69e035dc24344a7ff214a6c57686d">#define _TIMER_H</div><div class="notion-text notion-block-dabfb8b88af24976b0adcc8235e09d15">#include &quot;stdint.h&quot;  </div><div class="notion-text notion-block-abd26cb4ee1d4202ad261419d92d82a2">#include &quot;stm32f1xx_hal_tim.h&quot;</div><div class="notion-text notion-block-e23dfc0243854003b66b3f2665f62654">extern TIM_HandleTypeDef htim4;                   //外部变量声明</div><div class="notion-text notion-block-4911d68b9fb545a68b00b41dddb37eec">void TIM4_TimerInit(uint16_t, uint16_t);          //函数声明</div><div class="notion-text notion-block-8d719752c88046d6b4affee81dcd206b">#endif</div></div></details></div></div><details class="notion-toggle notion-block-55a9932e6955425ea4ceb2ae73b090f2"><summary><h4 class="notion-h notion-h3 notion-block-55a9932e6955425ea4ceb2ae73b090f2" data-id="55a9932e6955425ea4ceb2ae73b090f2"><span><div id="55a9932e6955425ea4ceb2ae73b090f2" class="notion-header-anchor"></div><span class="notion-h-title">sw.c</span></span></h4></summary><div><div class="notion-text notion-block-96c378e2a4e34c87927df8c52360a9b2">#include &quot;stm32f1xx_hal.h&quot;</div><div class="notion-text notion-block-fa54e559da304fcfa5d5e992700cdcf6">#include &quot;sw.h&quot;</div><div class="notion-text notion-block-cc285680052c4a7dbcf69bdc417defaa">#include &quot;uart.h&quot;</div><div class="notion-text notion-block-3a355e34467b45fd9d3ee101cfbec31b">uint8_t sw1_sta,sw2_sta;    //0:没有按下  1：按下了</div><div class="notion-text notion-block-6ee4aa2b29014362a374db3bcde26377">void SW_Init(void){<div class="notion-text-children"><div class="notion-text notion-block-8aa8104df99246ec950c83f77e9e2057">GPIO_InitTypeDef GPIO_InitType;</div><div class="notion-text notion-block-d50988fcea4a4138966708bd5f863da9">__HAL_RCC_GPIOC_CLK_ENABLE();</div><div class="notion-text notion-block-31708a6c522649f1b3a475fb62d746e2">GPIO_<a class="notion-link" href="http://InitType.Pin" target="_blank" rel="noopener noreferrer">InitType.Pin</a> = GPIO_PIN_14;</div><div class="notion-text notion-block-6a8aa31d513a45e3a4822b934c4a4f93">GPIO_InitType.Mode = GPIO_MODE_INPUT;</div><div class="notion-text notion-block-e3ef557eecaf46e48f48c5ef8aba42b9">GPIO_InitType.Pull = GPIO_PULLDOWN;</div><div class="notion-text notion-block-5e167f6192d4491494d1bd35db115a65">HAL_GPIO_Init(GPIOC,&amp;GPIO_InitType);</div><div class="notion-text notion-block-a5b0615466ea421a8e913fc10833a00d">__HAL_RCC_GPIOA_CLK_ENABLE();</div><div class="notion-text notion-block-2bfe0b1bdd9d455b800069c74b3d1381">GPIO_<a class="notion-link" href="http://InitType.Pin" target="_blank" rel="noopener noreferrer">InitType.Pin</a> = GPIO_PIN_0;</div><div class="notion-text notion-block-08d12d10b50e47139a737a2d59eb0026">GPIO_InitType.Mode = GPIO_MODE_INPUT;</div><div class="notion-text notion-block-376ebc59613541ce850809643603c07f">GPIO_InitType.Pull = GPIO_PULLDOWN;</div><div class="notion-text notion-block-af3bbaff98924451bdbfbb75db07d562">HAL_GPIO_Init(GPIOA,&amp;GPIO_InitType);</div></div></div><div class="notion-text notion-block-45fadf7f6eb745e78e83d97a407ab841">}</div><div class="notion-text notion-block-87e1396d6c484a91b7d4d65a8a1f96f7">void SW_InitEvent(void){</div><div class="notion-text notion-block-738d981fabdf400dae9fb1a962d75c96">GPIO_InitTypeDef GPIO_InitType;</div><div class="notion-text notion-block-8ea804f0591b4c5888554d2029a3d965">//SW1</div><div class="notion-text notion-block-07c3133676aa498dacc3f2d422cc99b4">__HAL_RCC_GPIOA_CLK_ENABLE();</div><div class="notion-text notion-block-a2b6cb253ff84e51a875c38f3ff1b72c">GPIO_<a class="notion-link" href="http://InitType.Pin" target="_blank" rel="noopener noreferrer">InitType.Pin</a> = GPIO_PIN_2;</div><div class="notion-text notion-block-24602abd72bc41439e76a6b4cf693c5d">GPIO_InitType.Mode = GPIO_MODE_EVT_RISING_FALLING;</div><div class="notion-text notion-block-ec798375eafe4527813efd5d69904b21">GPIO_InitType.Pull = GPIO_PULLUP;</div><div class="notion-text notion-block-8e727be7bdf74f6ba309a98039b6556f">HAL_GPIO_Init(GPIOA,&amp;GPIO_InitType);</div><div class="notion-text notion-block-6c7223ee4b7a4785895142e7146b2de7">}</div><div class="notion-text notion-block-504f51efe3f74fceb88e9f5be9a16746">void SW_InitEventOut(void){</div><div class="notion-text notion-block-986686a633494600a017455ae50f9bdf">GPIO_InitTypeDef GPIO_InitType;</div><div class="notion-text notion-block-f2f9c4df51dc4e39be365c927c4b78ad">//PA3</div><div class="notion-text notion-block-245fa38eeb624151ab3acf38c5cc0f13">__HAL_RCC_GPIOA_CLK_ENABLE();</div><div class="notion-text notion-block-aefb72f85560491ca74c32bb69ebf5b3">__HAL_RCC_AFIO_CLK_ENABLE();</div><div class="notion-text notion-block-7ee09279a93044219b3d19c0006173af">GPIO_<a class="notion-link" href="http://InitType.Pin" target="_blank" rel="noopener noreferrer">InitType.Pin</a> = GPIO_PIN_3;</div><div class="notion-text notion-block-546fdad2f2824b4eb0788288c0a335c6">GPIO_InitType.Mode = GPIO_MODE_AF_PP;</div><div class="notion-text notion-block-e4690815f56046de918a5e77b831e63e">GPIO_InitType.Speed = GPIO_SPEED_FREQ_HIGH;</div><div class="notion-text notion-block-879aa779f4584b488f66d7ed069e1651">HAL_GPIO_Init(GPIOA,&amp;GPIO_InitType);</div><div class="notion-text notion-block-9d6d635a997542369a8838d4230c0c5d">HAL_GPIOEx_ConfigEventout(AFIO_EVENTOUT_PORT_A,AFIO_EVENTOUT_PIN_3);</div><div class="notion-text notion-block-82606e24ca394c35af32c231e6a4210c">HAL_GPIOEx_EnableEventout();</div><div class="notion-text notion-block-0d4a30e92c02489c8b418fd4f779530d">}</div><div class="notion-text notion-block-2cb12b230e7041c7afc7eeea93b14c92">//mode 0：按下执行  1：抬起执行</div><div class="notion-text notion-block-44f074fa274946319cbac986634364f9">void SW_Init_IT(uint8_t mode){</div><div class="notion-text notion-block-6550fa48bf11428ca13149fecbe7a251">GPIO_InitTypeDef GPIO_InitType;</div><div class="notion-text notion-block-c987100168ce4562ad140555c10b10fe">__HAL_RCC_GPIOC_CLK_ENABLE();</div><div class="notion-text notion-block-eccf8cd9ffcf43d7b987bf2f8d5bd615">GPIO_<a class="notion-link" href="http://InitType.Pin" target="_blank" rel="noopener noreferrer">InitType.Pin</a> = GPIO_PIN_14;</div><div class="notion-text notion-block-3c539eca1bce4fba89c184c610318b70">if(mode == 0)<div class="notion-text-children"><div class="notion-text notion-block-88d9fabef89d45cc928d654fe5f396c3">GPIO_InitType.Mode = GPIO_MODE_IT_RISING;</div></div></div><div class="notion-text notion-block-3f3680c6a56a4a6d89864b8010847d1f">else<div class="notion-text-children"><div class="notion-text notion-block-3b2e80f311f0461b8fc75add26a2a54b">GPIO_InitType.Mode = GPIO_MODE_IT_FALLING;</div></div></div><div class="notion-text notion-block-505045529c4040e9ac80fd570042596a">GPIO_InitType.Pull = GPIO_PULLDOWN;</div><div class="notion-text notion-block-12ba800f785f439e8e28caf4b5a74034">HAL_GPIO_Init(GPIOC,&amp;GPIO_InitType);</div><div class="notion-text notion-block-e2e32df56c154a3e90b7e8462f3d4b5e">HAL_NVIC_SetPriority(EXTI15_10_IRQn,4,0);</div><div class="notion-text notion-block-1824713cbd4a431e92b1f516b7440539">HAL_NVIC_EnableIRQ(EXTI15_10_IRQn);</div><div class="notion-text notion-block-165dc09ee97c4f56a36e62b740cec430">__HAL_RCC_GPIOA_CLK_ENABLE();</div><div class="notion-text notion-block-9ce1551c49474f2e8952a719f849b544">GPIO_<a class="notion-link" href="http://InitType.Pin" target="_blank" rel="noopener noreferrer">InitType.Pin</a> = GPIO_PIN_0;</div><div class="notion-text notion-block-44798e1b9b734348a8e779ed51a80a68">if(mode == 0)<div class="notion-text-children"><div class="notion-text notion-block-cb828a63875545679fd5faab9a96ae03">GPIO_InitType.Mode = GPIO_MODE_IT_RISING;</div></div></div><div class="notion-text notion-block-fd9d2c21b3e345e5a0b765cf3bd0f6ab">else<div class="notion-text-children"><div class="notion-text notion-block-3ae587424eac45ec86f913ad28490a70">GPIO_InitType.Mode = GPIO_MODE_IT_FALLING;</div></div></div><div class="notion-text notion-block-58d3eb7d052140318d5016b6682765f5">GPIO_InitType.Pull = GPIO_PULLDOWN;</div><div class="notion-text notion-block-1d8fdd94da6b43879f4783a52c9d6db2">HAL_GPIO_Init(GPIOA,&amp;GPIO_InitType);</div><div class="notion-text notion-block-173c4b88f50f4dcdbf7fa3ec8e534ead">HAL_NVIC_SetPriority(EXTI0_IRQn,3,0);</div><div class="notion-text notion-block-09be69970fbb41828037ba392fce1c67">HAL_NVIC_EnableIRQ(EXTI0_IRQn);</div><div class="notion-text notion-block-d810d2774a3f445780726bc7d56b7aa7">}</div><div class="notion-text notion-block-19cc29b9fdab451eb5d483e7fdb90c8a">void SW_Init_IT2(void){</div><div class="notion-text notion-block-692122d0380d46dbb5a440f1aa8f1aac">GPIO_InitTypeDef GPIO_InitType;</div><div class="notion-text notion-block-c0b79b4e3c0a465bb35df99f28f0630e">__HAL_RCC_GPIOC_CLK_ENABLE();</div><div class="notion-text notion-block-129fffb0ccd94b2f8ef6bb85a22560bf">GPIO_<a class="notion-link" href="http://InitType.Pin" target="_blank" rel="noopener noreferrer">InitType.Pin</a> = GPIO_PIN_14;</div><div class="notion-text notion-block-17b38b8196494a5883ce1a7dfdca4c5d">GPIO_InitType.Mode = GPIO_MODE_IT_RISING_FALLING;</div><div class="notion-text notion-block-5aecb99f240449b184743786e95b391f">GPIO_InitType.Pull = GPIO_PULLDOWN;</div><div class="notion-text notion-block-048147ff0c59413686bf4948ed0c2b09">HAL_GPIO_Init(GPIOC,&amp;GPIO_InitType);</div><div class="notion-text notion-block-56c55322f7454b04bb8522e2af34c0ed">HAL_NVIC_SetPriority(EXTI15_10_IRQn,4,0);</div><div class="notion-text notion-block-849eb68aedc64131b6239c3ccd1156a2">HAL_NVIC_EnableIRQ(EXTI15_10_IRQn);</div><div class="notion-text notion-block-c2f0c9282bce4c258f599e1613c44512">__HAL_RCC_GPIOA_CLK_ENABLE();</div><div class="notion-text notion-block-3e325e7a9c3e43f2bc23d3f317543317">GPIO_<a class="notion-link" href="http://InitType.Pin" target="_blank" rel="noopener noreferrer">InitType.Pin</a> = GPIO_PIN_0;</div><div class="notion-text notion-block-594c7591d0fe4ecbb1e0a3ac1840840b">GPIO_InitType.Mode = GPIO_MODE_IT_RISING_FALLING;</div><div class="notion-text notion-block-6ac7b9f07fa146dc8167f15944848df1">GPIO_InitType.Pull = GPIO_PULLUP;</div><div class="notion-text notion-block-cb52280ee91b4c98a0dc643f7fad00b8">HAL_GPIO_Init(GPIOA,&amp;GPIO_InitType);</div><div class="notion-text notion-block-276f4bca4ea7448aa4efffcc85aa4d23">HAL_NVIC_SetPriority(EXTI0_IRQn,3,0);</div><div class="notion-text notion-block-9b3d6016074a49a7a8f3ed87a2b183db">HAL_NVIC_EnableIRQ(EXTI0_IRQn);</div><div class="notion-text notion-block-8b77996abc824a2eae7c6d3df493517f">}</div><div class="notion-text notion-block-0fe4b5974da4441580c63133f64a9080">//返回值  0：无按键触发  8：SW8触发</div><div class="notion-text notion-block-630c9ce0f6cd4d6bb02fb6bda56875dd">//mode 0：按下执行  1：抬起执行</div><div class="notion-text notion-block-55061d94cd4a4c0085fd705579aa654b">uint8_t SW_Scan(uint8_t mode){</div><div class="notion-text notion-block-9b584bf2fe2e4ebb8fdcbfeb7214028f">uint32_t i;</div><div class="notion-text notion-block-95418273d7db468292383d6120008413">/<em>-------------SW8------------------</em>/</div><div class="notion-text notion-block-e8edba6d9f4348c49567582dd1f9a256">if((SW1_IN == 1)&amp;&amp;(sw1_sta == 0)){<div class="notion-text-children"><div class="notion-text notion-block-e89b6b5ba7e043078c3d73a8c487eeea">for(i=0;i&lt;0x7FFF;i++){<div class="notion-text-children"><div class="notion-text notion-block-f9ae0d51d465410cbb6e8bf37eac40c2">if(SW1_IN == 0){<div class="notion-text-children"><div class="notion-text notion-block-14e6f685b79b486fac741d75389d2640">return 0;</div></div></div><div class="notion-text notion-block-296f469c84654bdeb8d742f03e35f7f6">}</div><div class="notion-text notion-block-a7d667d99a9542baa61acff3ad667cab">}</div><div class="notion-text notion-block-116ec70ba7c648b3910e684d9c309568">sw1_sta = 1;</div><div class="notion-text notion-block-a198b96e53844962bc93b73a03699f25">if(mode == 0){<div class="notion-text-children"><div class="notion-text notion-block-50221f85f9784182a0b6b91f440c8bfc">return 8;</div></div></div><div class="notion-text notion-block-2a9fbf070cff4e4696ae190ccf671968">}</div><div class="notion-text notion-block-fa2442bc220b4cc4af7e2bf91aa575e8">}else if((SW1_IN == 0)&amp;&amp;(sw1_sta == 1)){<div class="notion-text-children"><div class="notion-text notion-block-31da252d6bf9480184e2613a0a6efa46">for(i=0;i&lt;0x7FFF;i++){<div class="notion-text-children"><div class="notion-text notion-block-02b9e382afa54783a720149ce1fb4f54">if(SW1_IN == 1){<div class="notion-text-children"><div class="notion-text notion-block-0f5cd138fdca4e5881158725b47ede53">return 0;</div></div></div><div class="notion-text notion-block-395828d5357448379511c5f24ad35e8d">}</div></div></div><div class="notion-text notion-block-af39d58321a745c1bbb330dcad755fe9">}</div><div class="notion-text notion-block-8e3516e00dc24f7ebec956132101ffbf">sw1_sta = 0;</div><div class="notion-text notion-block-ff8b6801fbb3435ca9abbf6afd75dd3c">if(mode == 1){<div class="notion-text-children"><div class="notion-text notion-block-1bca943ff48247dc937e07fc47663ed9">return 8;</div></div></div><div class="notion-text notion-block-7f7ab935c4714390be3271187cbd24ce">}</div></div></div><div class="notion-text notion-block-195accb498dc4fadadf42a970788a3db">}</div><div class="notion-text notion-block-745b2b60789f4733b3d1f00000f880c1">/<em>-------------SW11------------------</em>/</div><div class="notion-text notion-block-8820f83599eb462a9eab24f89b9c74d8">if((SW2_IN == 0)&amp;&amp;(sw2_sta == 0)){<div class="notion-text-children"><div class="notion-text notion-block-c1340e3f2d8245a79a5a38131f0b1c09">for(i=0;i&lt;0x7FFF;i++){<div class="notion-text-children"><div class="notion-text notion-block-3f6efd0e45b0414896b04c5e5cc95693">if(SW2_IN == 1){<div class="notion-text-children"><div class="notion-text notion-block-e168bccddd02414385c53768e872e77c">return 0;</div></div></div><div class="notion-text notion-block-b3d32554e2c54c75a1f33551efa236f0">}</div></div></div><div class="notion-text notion-block-9f919fef69c94f09b2b426aa3f1b84e8">}</div><div class="notion-text notion-block-cd2283d2874a40749718fa95ef355471">sw2_sta = 1;</div><div class="notion-text notion-block-723d76a3e3af4f76adbba87c1d644d48">if(mode == 0){<div class="notion-text-children"><div class="notion-text notion-block-88d612e23fb84df0bf858634ef720d79">return 11;</div></div></div><div class="notion-text notion-block-6b78c531656341a4aaf8b66fedb4944a">}</div></div></div><div class="notion-text notion-block-4eed930a6bd842c1aa08abbf52aee6ba">}else if((SW2_IN == 1)&amp;&amp;(sw2_sta == 1)){<div class="notion-text-children"><div class="notion-text notion-block-42dd63b649314c048f77fdf00b7fd27b">for(i=0;i&lt;0x7FFF;i++){<div class="notion-text-children"><div class="notion-text notion-block-220a5d7c0e2d43e384379bd5278dd5b7">if(SW2_IN == 0){<div class="notion-text-children"><div class="notion-text notion-block-06af669e770f44b699afdaef725383b5">return 0;</div></div></div><div class="notion-text notion-block-d2b422e9a6ac4ad3bfadf5283b8f6f71">}</div></div></div><div class="notion-text notion-block-8e4453f1ab734598875a636cc3c3cbcb">}</div><div class="notion-text notion-block-e0a62b84edef491bbe4bd77db8c51005">sw2_sta = 0;</div><div class="notion-text notion-block-4bacbaef1a98451ca55f687d766e6e93">if(mode == 1){<div class="notion-text-children"><div class="notion-text notion-block-1f9a215541a94655a14bf7ed1257dcca">return 11;</div></div></div><div class="notion-text notion-block-30474d39c637498f9d1b0b021e456cda">}</div></div></div><div class="notion-text notion-block-6b5439a1a924472d90aa19d5ed83cd90">}</div><div class="notion-text notion-block-97d4a73574834bde872efd5a801afd82">return 0;</div></div></div></div></div><div class="notion-text notion-block-276a7808a21f4bd6a79c1b3290514bb2">}</div><div class="notion-text notion-block-b4e025fa836d4f82aed47a87d94540ce">void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)</div><div class="notion-text notion-block-12625f6056ee46a081d02c42688328de">{</div><div class="notion-text notion-block-5837e53863254e95b70f6f004c04fd5f">uint32_t i;</div><div class="notion-text notion-block-c6e46a5c0a2643b985f406306b2cb5af">//SW8:PC13  SW11:PA0（抢占优先级高）</div><div class="notion-text notion-block-09cecb7a8bac43159d2dc68d3500ac9e">switch(GPIO_Pin){<div class="notion-text-children"><div class="notion-text notion-block-898fa37cb5e34c67ae8d8569cdaedf25">case GPIO_PIN_14:	if(SW1_IN == 1){<div class="notion-text-children"><div class="notion-text notion-block-c351d7f1a315411a8b1a5687ae30fe22">for(i=0;i&lt;0x7FFF;i++){<div class="notion-text-children"><div class="notion-text notion-block-a4f6ab6761634dbf980103f2cb2ed6d9">if(SW1_IN == 0){<div class="notion-text-children"><div class="notion-text notion-block-ebc9cfbb0f0f42c3a64c87f13ec61009">return;</div></div></div><div class="notion-text notion-block-8687ed47f5d44aa293e30543f6227fc4">}</div></div></div><div class="notion-text notion-block-91d134d3dd4e41f6a146bd5644945bc0">}</div><div class="notion-text notion-block-6ec92328a6d1480c8471ea4ef86849f0">//U1_Txdata((uint8_t *)&quot;x81S1_LED&quot;,7);</div><div class="notion-text notion-block-8d0bda5ad4a74df990b1b280d566d435">//U2_Txdata((uint8_t *)&quot;LED_ON&quot;,6);</div><div class="notion-text notion-block-80fbaf978bbc4cf89292f72ae7a377a0">U3_Txdata((uint8_t *)&quot;LED_ON&quot;,6);</div><div class="notion-text notion-block-af9fbfdbf0604eaa85e77829d2ffcbd9">}else if(SW1_IN == 0){<div class="notion-text-children"><div class="notion-text notion-block-b58644e0907640f7b3344b61affddfbd">for(i=0;i&lt;0x7FFF;i++){<div class="notion-text-children"><div class="notion-text notion-block-df60bdf341c64c2f80f1bd66077d72ac">if(SW1_IN == 1){<div class="notion-text-children"><div class="notion-text notion-block-b71d23d6941449349e013b18e30771af">return;</div></div></div><div class="notion-text notion-block-6b6d3763b4ed4ed1aedd652cb8abe210">}</div></div></div><div class="notion-text notion-block-2f14264afff64c6db12d0aa7b72e6313">}</div><div class="notion-text notion-block-95ae730f3974446ab3ab2ab8376df735">HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_0);</div></div></div><div class="notion-text notion-block-0ca1db85ad314d77be37c316dee8ceac">} </div><div class="notion-text notion-block-86fff2eae6cd4036a8d39bf71e5491ce">break;</div></div></div><div class="notion-text notion-block-bb814abef6b541bebcdefd56e1aa540c">case GPIO_PIN_0:    if(SW2_IN == 1){<div class="notion-text-children"><div class="notion-text notion-block-b00948095ee7425cb7d530af1a880f8a">for(i=0;i&lt;0x7FFF;i++){<div class="notion-text-children"><div class="notion-text notion-block-689bef1d721649ddbd49ca3fe88f0064">if(SW2_IN == 0){<div class="notion-text-children"><div class="notion-text notion-block-d902622239274eeca8767aa083f82957">return;</div></div></div><div class="notion-text notion-block-fbb1861902664a1c8162711bbcb7f9fc">}</div></div></div><div class="notion-text notion-block-293ac55b8b814a2db2909a89547f9f30">}</div><div class="notion-text notion-block-cf16cdfba0f449539e7daafe49ecf865">//U1_Txdata((uint8_t *)&quot;x82S2_LED&quot;,7);</div><div class="notion-text notion-block-08b53c0e634e48d2a72ae55b31fd591b">//U2_Txdata((uint8_t *)&quot;LED_OFF&quot;,7);</div><div class="notion-text notion-block-c57b6f981539490fb1947ca170d52ca2">U3_Txdata((uint8_t *)&quot;LED_OFF&quot;,7);</div><div class="notion-text notion-block-6b501d2fbd1d47afbf5033caa8f645a9">}else if(SW2_IN == 1){<div class="notion-text-children"><div class="notion-text notion-block-74d589595d264f2ebf3aab7a839726d8">for(i=0;i&lt;0x7FFF;i++){<div class="notion-text-children"><div class="notion-text notion-block-572cff5caae54b85bbf20db928923f77">if(SW2_IN == 0){<div class="notion-text-children"><div class="notion-text notion-block-9fe1fef846044f909149585dc439dd8a">return;</div></div></div><div class="notion-text notion-block-3012ba51dba1463a8a42f215d4a126b0">}</div></div></div><div class="notion-text notion-block-322b3738aa5849dd9d45d59db38634af">}</div><div class="notion-text notion-block-94d7e83b533d4a9a906d12a03c6e9f71">HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_0);</div></div></div><div class="notion-text notion-block-9132a62a4f6a4b0e902abe1677a77859">}</div><div class="notion-text notion-block-dab945992bd7417380234e51f0e8ac3b">break;</div></div></div></div></div><div class="notion-text notion-block-6654b19f4aa3469684eb61223929c3da">}</div><div class="notion-text notion-block-59fd754f3ff64c53ab642f3046dc755a">}</div><details class="notion-toggle notion-block-3663bee8b1544c55932b05f19f11774c"><summary><h4 class="notion-h notion-h3 notion-block-3663bee8b1544c55932b05f19f11774c" data-id="3663bee8b1544c55932b05f19f11774c"><span><div id="3663bee8b1544c55932b05f19f11774c" class="notion-header-anchor"></div><span class="notion-h-title">sw.h</span></span></h4></summary><div><div class="notion-text notion-block-cb0ab4d6492b466193d53753c74221c6">#ifndef __SW_H</div><div class="notion-text notion-block-408eadcf30dc455fb6272d6ec3e43e99">#define __SW_H</div><div class="notion-text notion-block-b5f58f8202414e119cb23a49a5948297">#include &quot;stdint.h&quot;</div><div class="notion-text notion-block-734e05c1e03e4a60b44b738cb695b763">#define  SW1_IN   HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_14)</div><div class="notion-text notion-block-58373ba50fca44cd8b46f0e2ba9a6a22">#define  SW2_IN  HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)</div><div class="notion-text notion-block-31d868db4f4243c7afdb6ea8373e72b8">void SW_Init(void);</div><div class="notion-text notion-block-5ab6d46317a64bd785c0215b2daeb832">uint8_t SW_Scan(uint8_t mode);</div><div class="notion-text notion-block-101b44d03e9e43109fd67bfcb8517617">void SW_Init_IT(uint8_t mode);</div><div class="notion-text notion-block-5e9293b3135e474dae0d7759ec5b91af">void SW_Init_IT2(void);</div><div class="notion-text notion-block-1747b9b911df4a0c8829cb62bc2490c3">void SW_InitEvent(void);</div><div class="notion-text notion-block-3120c6f5549b4b978462dd8c0e61ab02">void SW_InitEventOut(void);</div><div class="notion-text notion-block-523f4d60eac849a0846d373ef6220b4f">#endif</div></div></details><details class="notion-toggle notion-block-1b1d8d32e11449b8b2b94b4ddb7ccce5"><summary><h4 class="notion-h notion-h3 notion-block-1b1d8d32e11449b8b2b94b4ddb7ccce5" data-id="1b1d8d32e11449b8b2b94b4ddb7ccce5"><span><div id="1b1d8d32e11449b8b2b94b4ddb7ccce5" class="notion-header-anchor"></div><span class="notion-h-title">led.c</span></span></h4></summary><div><div class="notion-text notion-block-fa63741b7bcb44739ea94568250dface">#include &quot;stm32f1xx_hal.h&quot;</div><div class="notion-text notion-block-c8b458a7ab7a4dd9a971ed2dd091c935">#include &quot;led.h&quot;</div><div class="notion-text notion-block-f65f3cd0cecb4a4b91474beb0e4083f2">void LED_Init(void){<div class="notion-text-children"><div class="notion-text notion-block-608ba58dc74e4e719950637e3b184a58">GPIO_InitTypeDef GPIO_InitType;</div><div class="notion-text notion-block-cfc55d3b91db4b9792c621d39d5f2872">__HAL_RCC_GPIOC_CLK_ENABLE();</div><div class="notion-text notion-block-8ef36a3432fe4c128e3d4374c9783252">GPIO_<a class="notion-link" href="http://InitType.Pin" target="_blank" rel="noopener noreferrer">InitType.Pin</a> = GPIO_PIN_13;</div><div class="notion-text notion-block-ad2aa2c581ed43458fdfb5e98661eb3c">GPIO_InitType.Mode = GPIO_MODE_OUTPUT_PP;</div><div class="notion-text notion-block-0751fbf38b794c058040a89d32e7951b">GPIO_InitType.Speed = GPIO_SPEED_FREQ_LOW;</div><div class="notion-text notion-block-0ee50f3a8a5c4f84b81d53e603271046">HAL_GPIO_Init(GPIOC,&amp;GPIO_InitType);</div><div class="notion-text notion-block-bd819c389db94927b0f94772f276c4ab">HAL_GPIO_WritePin(GPIOC,GPIO_PIN_13,GPIO_PIN_RESET);</div></div></div><div class="notion-text notion-block-683187333d2c432f856301504aef5fe2">}</div><div class="notion-text notion-block-22b65c9eb37f4e28a732fdbeddd920d4">void LED_ON(void){<div class="notion-text-children"><div class="notion-text notion-block-4eb72f5e7e064656a8b89fdd70b6b1f1">HAL_GPIO_WritePin(GPIOC,GPIO_PIN_13,GPIO_PIN_SET);</div></div></div><div class="notion-text notion-block-64ea5e87d20f4c4ea81d73e1a02db6ad">}</div><div class="notion-text notion-block-2d68bda2cb404b5484a497fae357340f">void LED_OFF(void){<div class="notion-text-children"><div class="notion-text notion-block-d738a49a15704254b044ce51f29a6c1a">HAL_GPIO_WritePin(GPIOC,GPIO_PIN_13,GPIO_PIN_RESET);</div></div></div><div class="notion-text notion-block-89f0a3c332e14bf8adce965dda604595">}</div><div class="notion-text notion-block-1ed0e7bae43642fbbb9a77e03eecc09e">void LED_Toggle(void){<div class="notion-text-children"><div class="notion-text notion-block-6939cf5a85f5415c8ac840a0bb85f88a">HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_13);</div></div></div><div class="notion-text notion-block-c950f6b6994047d99f536c76d2493cf6">}</div></div></details><details class="notion-toggle notion-block-b8cb662e9b694f388c0c41de49bfc361"><summary><h4 class="notion-h notion-h3 notion-block-b8cb662e9b694f388c0c41de49bfc361" data-id="b8cb662e9b694f388c0c41de49bfc361"><span><div id="b8cb662e9b694f388c0c41de49bfc361" class="notion-header-anchor"></div><span class="notion-h-title">led.h</span></span></h4></summary><div><div class="notion-text notion-block-bca95e78e16543808a793dcced4b1b8b">#ifndef __LED_H</div><div class="notion-text notion-block-8fb5b57730524559bcbff81bb067b4ac">#define __LED_H</div><div class="notion-text notion-block-92a6eadc86f5404896397a87e60ceab6">void LED_Init(void);</div><div class="notion-text notion-block-9aeba05dca8f40e99808f19e0e5f5118">void LED_ON(void);</div><div class="notion-text notion-block-56902175f34c44c380844ef422ad9a4e">void LED_OFF(void);</div><div class="notion-text notion-block-cebcaa4ad9ef49618f8ec32957bb7185">void LED_Toggle(void);</div><div class="notion-text notion-block-25b4b9e6f6794077b76c100ca393dd81">#endif</div></div></details></div></details><details class="notion-toggle notion-block-0fb4b2d873ff4fd8956407a7694663dc"><summary><h4 class="notion-h notion-h3 notion-block-0fb4b2d873ff4fd8956407a7694663dc" data-id="0fb4b2d873ff4fd8956407a7694663dc"><span><div id="0fb4b2d873ff4fd8956407a7694663dc" class="notion-header-anchor"></div><span class="notion-h-title">stm32f1xx_it.c</span></span></h4></summary><div><div class="notion-text notion-block-d97e87c71e5049ea9231c2177b82b8d0">/<em>-------------------------------------------------</em>/</div><div class="notion-text notion-block-71a05a1cb78f45bdb3bc4d166d4bd647">/<em>            超子说物联网STM32系列开发板          </em>/</div><div class="notion-text notion-block-16ce44b0417e4238a7d05c36ae812685">/<em>-------------------------------------------------</em>/</div><div class="notion-text notion-block-4af1965cb8d94d3b9b60ed4471874c83">/<em>                                                 </em>/</div><div class="notion-text notion-block-a8f8d7d78fcb47f3a10a263cb8aa1ef3">/<em>          实现各种中断服务函数的源文件           </em>/</div><div class="notion-text notion-block-e9dabb3b2b5347d8afbda72f9c46d81b">/<em>                                                 </em>/</div><div class="notion-text notion-block-578013467ffe40dbac34808666f619f0">/<em>-------------------------------------------------</em>/</div><div class="notion-text notion-block-965e3c21536e4f77a8f81b92397a3c1b">#include &quot;stm32f1xx_hal.h&quot;   </div><div class="notion-text notion-block-e3551ebbf0b94354ba8403f7bb8e0322">#include &quot;stm32f1xx_it.h&quot;</div><div class="notion-text notion-block-60a2b36c928d4794805888f5c09dc3ea">#include &quot;uart.h&quot;</div><div class="notion-text notion-block-f2109599afa8458dae8e8505e884a819">#include &quot;timer.h&quot;</div><div class="notion-text notion-block-edb990e0ae6a472aab5756a516a77c24">void EXTI15_10_IRQHandler(void)</div><div class="notion-text notion-block-cddf5c2e0a1b437190c5f293c9b8b8d8">{</div><div class="notion-text notion-block-6b69bcf842af4b92badecee4331c3ac2">HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_14);</div><div class="notion-text notion-block-da844dff91a34abf9e12673195d782d1">}</div><div class="notion-text notion-block-5aa09e74f7c34de98f566c409294aab8">void EXTI0_IRQHandler(void)</div><div class="notion-text notion-block-865edbb956004b84a4a92952560a4aac">{</div><div class="notion-text notion-block-1e8d2fe7795a4b13b6a89bb51cd9909a">HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_0);</div><div class="notion-text notion-block-121642fa74c14867a54217353f01b426">}</div><div class="notion-text notion-block-0223bfbaf77d4cecab833b6177c3c9fe">void USART1_IRQHandler(void)</div><div class="notion-text notion-block-628a49523f09452e9344a81d6cb5f550">{</div><div class="notion-text notion-block-c2dbaea72edd4cef8bc4c822b1b5df36">HAL_UART_IRQHandler(&amp;uart1.uart);</div><div class="notion-text notion-block-479c1c04bbc248e0b95d27b7c614ab92">if(__HAL_UART_GET_FLAG(&amp;uart1.uart, UART_FLAG_IDLE)){<div class="notion-text-children"><div class="notion-text notion-block-c234d3bc24f0432a9a5642ea08a6d8b6">__HAL_UART_CLEAR_IDLEFLAG(&amp;uart1.uart);</div><div class="notion-text notion-block-f4f558292265449fb954fbc6e395a43a">uart1.RxCounter += (U1_RX_MAX - __HAL_DMA_GET_COUNTER(&amp;uart1.dmarx));</div><div class="notion-text notion-block-0f2c68c511304185ad9ecf433a3f054a">HAL_UART_AbortReceive_IT(&amp;uart1.uart);</div></div></div><div class="notion-text notion-block-8ff0398f75c04d179f14ae176d7b4f8f">}</div><div class="notion-text notion-block-a7e292324bff4c9aaf8f53a485d71cb8">}</div><div class="notion-text notion-block-f2379482c78e48b194b77119ead1b573">void USART2_IRQHandler(void)</div><div class="notion-text notion-block-22204d62497a4cd0806b060ae692bd8e">{</div><div class="notion-text notion-block-9ff54983a43d4271a5f159c8d7e067c6">HAL_UART_IRQHandler(&amp;uart2.uart);</div><div class="notion-text notion-block-abe10503af9d4577b0caf977a5c0b2af">//if(__HAL_UART_GET_FLAG(&amp;uart2.uart, UART_FLAG_IDLE)){</div><div class="notion-text notion-block-a9ac13ffe2c24cc7815975692ce2f85a">//    __HAL_UART_CLEAR_IDLEFLAG(&amp;uart2.uart);</div><div class="notion-text notion-block-fcc82da42a7a4377b0a7b083ae968d0f">//    uart2.RxCounter += (U2_RX_MAX - __HAL_DMA_GET_COUNTER(&amp;uart2.dmarx));</div><div class="notion-text notion-block-205d9771950a4a6888046bdfd217bbe4">//    HAL_UART_AbortReceive_IT(&amp;uart2.uart);</div><div class="notion-text notion-block-1058456d00bf44aeb359cc268f721f6c">//}</div><div class="notion-text notion-block-2671376ed6ba4210afa04e031d51d0e3">}</div><div class="notion-text notion-block-2e08988ef4cf4576838c2ec2a785f253">void USART3_IRQHandler(void)</div><div class="notion-text notion-block-405f8feff49f414bb0000ea6a2fdc130">{</div><div class="notion-text notion-block-05b00aa3a11e4d8eb8572f1000653e62">HAL_UART_IRQHandler(&amp;uart3.uart);</div><div class="notion-text notion-block-adc2ae6482844ab38546f8ef93183142">//if(__HAL_UART_GET_FLAG(&amp;uart3.uart, UART_FLAG_IDLE)){</div><div class="notion-text notion-block-c2bb853d865444ee8e895cb743056501">//    __HAL_UART_CLEAR_IDLEFLAG(&amp;uart3.uart);</div><div class="notion-text notion-block-a36d4d206b4743cd836406cdd27e1432">//    uart3.RxCounter += (U3_RX_MAX - __HAL_DMA_GET_COUNTER(&amp;uart3.dmarx));</div><div class="notion-text notion-block-f6d3df1d44d44123a0c84469518b1579">//    HAL_UART_AbortReceive_IT(&amp;uart3.uart);</div><div class="notion-text notion-block-b71754277df049b29d989d7be6990524">//}</div><div class="notion-text notion-block-b143d4630b904164a570b9a0d0ff0e0d">}</div><div class="notion-text notion-block-6016a808aff5486b85699b420c4e40f0">void DMA1_Channel4_IRQHandler(void)</div><div class="notion-text notion-block-cb161c01713b4ddf9cceb87e81ccd91e">{</div><div class="notion-text notion-block-e1407b3a651c4c10b61113cadf46800c">HAL_DMA_IRQHandler(&amp;uart1.dmatx);</div><div class="notion-text notion-block-b854a6c98bae4ba9876321e2050a713d">}</div><div class="notion-text notion-block-ff54c18765504c4aaa8c66382684f122">void DMA1_Channel5_IRQHandler(void)</div><div class="notion-text notion-block-98d966cfbd2249248cb43ec624f01e24">{</div><div class="notion-text notion-block-145736b4039d4eed967cc01511259f84">HAL_DMA_IRQHandler(&amp;uart1.dmarx);</div><div class="notion-text notion-block-16e67ee9bc554b3886bd625d651878b9">}</div><div class="notion-text notion-block-c0b2020f29e046339ae142cc95670390">void DMA1_Channel7_IRQHandler(void)</div><div class="notion-text notion-block-5e92a0179d6c47db84612d102ed9ec39">{</div><div class="notion-text notion-block-b06ff8be6f274e69bdb82421e89e0cb4">HAL_DMA_IRQHandler(&amp;uart2.dmatx);</div><div class="notion-text notion-block-522f850b54814eb885ad51a60c19f761">}</div><div class="notion-text notion-block-900005f4514a4ad28adc2bf2a96fbae1">void DMA1_Channel6_IRQHandler(void)</div><div class="notion-text notion-block-e1e05e33323645d6a08491fdefdf890a">{</div><div class="notion-text notion-block-a368c51af1264363b5fb6cf93bf3586e">HAL_DMA_IRQHandler(&amp;uart2.dmarx);</div><div class="notion-text notion-block-59f6415a44a4426babbda2916dcf87a6">}</div><div class="notion-text notion-block-18599012bc384212a6eedc3dea1315d2">void DMA1_Channel2_IRQHandler(void)</div><div class="notion-text notion-block-c28c1e515bd14289b9a7618a02082046">{</div><div class="notion-text notion-block-aa03f3ab3c89472d90e6f4965e0291eb">HAL_DMA_IRQHandler(&amp;uart3.dmatx);</div><div class="notion-text notion-block-9169a7d36be54d8b9aadea78d0b071e3">}</div><div class="notion-text notion-block-4b03429114b34ab1bf3a5e9534a8a06b">void DMA1_Channel3_IRQHandler(void)</div><div class="notion-text notion-block-616afa50c40f4e2989f41f755b2849d0">{</div><div class="notion-text notion-block-d0cf293c0c5643f797becb1691dd1126">HAL_DMA_IRQHandler(&amp;uart3.dmarx);</div><div class="notion-text notion-block-2972eb0a3247409eb66cb903595070c7">}</div><div class="notion-text notion-block-354160ece6844f60ab28dc43b4ba5cf2">//定时器中断处理函数</div><div class="notion-text notion-block-846ef6719e5349cbaf1d766948d70d85">void TIM4_IRQHandler(void)</div><div class="notion-text notion-block-5539ee86fc92432698eef81d62b6cfe0">{</div><div class="notion-text notion-block-1f0e76e868654e5b90769e347e6c454b">HAL_TIM_IRQHandler(&amp;htim4);</div><div class="notion-text notion-block-364656bcdc5145d181e8bd2ce8f6424b">}</div><div class="notion-text notion-block-a8c08d75a6e143118e98645bd42afd6f">/<em>-------------------------------------------------</em>/</div><div class="notion-text notion-block-eb8538a9dbd646d9973cca48c7edc08c">/<em>函数名：不可屏蔽中断处理函数                     </em>/</div><div class="notion-text notion-block-0d86ffc46a07419ea44454258a44897d">/<em>参  数：无                                       </em>/</div><div class="notion-text notion-block-3c9bf1bf416c42dc923c4c1d2f6b5cb2">/<em>返回值：无                                       </em>/</div><div class="notion-text notion-block-ccf9a23ed8f644eba9038b418b5e5000">/<em>-------------------------------------------------</em>/</div><div class="notion-text notion-block-7d150590cc4d4360af1f486c999d7a62">void NMI_Handler(void)</div><div class="notion-text notion-block-d1219102d58d4da4a9fe78a59fa78d5d">{</div><div class="notion-text notion-block-9496cf9e9a2e49f79bdab58f018b5d2c">}</div><div class="notion-text notion-block-b08b6ef8b1264315bb39923926b0e262">/<em>-------------------------------------------------</em>/</div><div class="notion-text notion-block-1eb565c836194865933e6e48f19ea95a">/<em>函数名：硬件出错后进入的中断处理函数             </em>/</div><div class="notion-text notion-block-31e9920728414a1e8381149627ac7157">/<em>参  数：无                                       </em>/</div><div class="notion-text notion-block-5d2978293f5644d9a3201a437009fec9">/<em>返回值：无                                       </em>/</div><div class="notion-text notion-block-f374fc6f21a14acc981e3dd63084f1e7">/<em>-------------------------------------------------</em>/</div><div class="notion-text notion-block-2dd0c53df11147e3b3e031ce3bbc9452">void HardFault_Handler(void)</div><div class="notion-text notion-block-44445884e7114cd39f6065c011a55f9c">{</div><div class="notion-text notion-block-c6966905a07642328b72b9d05f745039">}</div><div class="notion-text notion-block-e267d2497ccb49d2be34e4f776828e65">/<em>-------------------------------------------------</em>/</div><div class="notion-text notion-block-f3cd303e9d904010a839ec8bf36991ee">/<em>函数名：软中断，SWI 指令调用的处理函数           </em>/</div><div class="notion-text notion-block-07b2a6945e34437eb1a23bb53fed1adb">/<em>参  数：无                                       </em>/</div><div class="notion-text notion-block-168b0a344c514626be01f59ade9b272b">/<em>返回值：无                                       </em>/</div><div class="notion-text notion-block-01284bc0fe6940bd9b0de481aeaa78ab">/<em>-------------------------------------------------</em>/</div><div class="notion-text notion-block-4456b1cdbac847da8a570c35e8333055">void SVC_Handler(void)</div><div class="notion-text notion-block-a10c7616f1d04f9bac343729038f484d">{</div><div class="notion-text notion-block-9849be0863d247bf8f0d30892cfdf2d1">}</div><div class="notion-text notion-block-4115b3c7ae5d4a23ba928689ed5b8faf">/<em>-------------------------------------------------</em>/</div><div class="notion-text notion-block-8c0d397f734d4575a8078284fe0b8908">/<em>函数名：可挂起的系统服务处理函数                 </em>/</div><div class="notion-text notion-block-ce021e4789ba444599c0ea7113dce1c7">/<em>参  数：无                                       </em>/</div><div class="notion-text notion-block-40e6418777d8440bada2ab33383c39c9">/<em>返回值：无                                       </em>/</div><div class="notion-text notion-block-4778d81e3a6b414faff2e2193d2103b3">/<em>-------------------------------------------------</em>/</div><div class="notion-text notion-block-2ed550c9332b42ba9508960ec196857e">void PendSV_Handler(void)</div><div class="notion-text notion-block-fd7ab7fcc1b74d44a082c126ff456142">{</div><div class="notion-text notion-block-69de6597ed3342afb304f6218ac7fe22">}</div><div class="notion-text notion-block-257906d4cbdd4236aed0ddfe108f2920">/<em>-------------------------------------------------</em>/</div><div class="notion-text notion-block-8344499b93944aba85d290cc3714ab75">/<em>函数名：SysTic系统嘀嗒定时器处理函数             </em>/</div><div class="notion-text notion-block-22c9b373aa1042ee98eda7d67af0ae68">/<em>参  数：无                                       </em>/</div><div class="notion-text notion-block-a9cce02b350448949d2b7cca0fa11361">/<em>返回值：无                                       </em>/</div><div class="notion-text notion-block-eba4bf86819a4867b09121591878d98f">/<em>-------------------------------------------------</em>/</div><div class="notion-text notion-block-47d2e98e281b4a36b8e18c0be92f59aa">void SysTick_Handler(void)</div><div class="notion-text notion-block-0c3a0bd3672642fd8eea3d8618264a42">{  </div><div class="notion-text notion-block-76176f86888d445a911252b9eda3bb57">HAL_IncTick();	</div><div class="notion-text notion-block-95871c7504eb489fb76ebddbbccd85e5">}</div></div></details><details class="notion-toggle notion-block-89c5a255f81d4ec59c55f9a18e9f179b"><summary><h4 class="notion-h notion-h3 notion-block-89c5a255f81d4ec59c55f9a18e9f179b" data-id="89c5a255f81d4ec59c55f9a18e9f179b"><span><div id="89c5a255f81d4ec59c55f9a18e9f179b" class="notion-header-anchor"></div><span class="notion-h-title">timer.c</span></span></h4></summary><div><div class="notion-text notion-block-4a04c200678841a682b3dcedaec7dec1">/<em>-----------------------------------------------------</em>/</div><div class="notion-text notion-block-f63600671d96451b82cee7ab622db6ad">/<em>                     程序结构                        </em>/</div><div class="notion-text notion-block-661aea55275d4b1e9ee569ffe97a0fa8">/<em>-----------------------------------------------------</em>/</div><div class="notion-text notion-block-23f5e660db3a4a77b3d1afb1e2c3c3ab">/<em>USER   ：包含程序的 main 函数，是整个程序的入        </em>/</div><div class="notion-text notion-block-edf405a1c58040b8880c678b64d65897">/<em>HW     ：包含开发板各种功能外设的驱动程序            </em>/</div><div class="notion-text notion-block-a8492fe6d14940119eaed65b881262b3">/<em>LIB    ：官方提供的 HAL 库文件                       </em>/</div><div class="notion-text notion-block-ff7805c0724d4547bd328224b73fe305">/<em>CMSIS  ：CM3 内核相关的启动文件系统文件              </em>/</div><div class="notion-text notion-block-9ea919b4406340989db20a02e32ab7ef">/<em>-----------------------------------------------------</em>/</div><div class="notion-text notion-block-5d16e507ff384ed3941e8bb42bce8a41">/<em>                                                     </em>/</div><div class="notion-text notion-block-10959f4fc61d4a08bc9789bf27e8f698">/<em>                实现定时器功能的源文件               </em>/</div><div class="notion-text notion-block-35832d3024c84521bd65e4b007f6eb64">/<em>                                                     </em>/</div><div class="notion-text notion-block-c6c558d7f41b4e2882af48086f7ac28c">/<em>-----------------------------------------------------</em>/</div><div class="notion-text notion-block-bc74eed69e10464baa7216eb1ea624f7">#include &quot;stm32f1xx_hal.h&quot;  </div><div class="notion-text notion-block-5c7f8454a1fb4486b6fca529606483cb">#include &quot;timer.h&quot;            </div><div class="notion-text notion-block-77fa96e14c684d08815ab4cf0c9da155">#include &quot;uart.h&quot;  </div><div class="notion-text notion-block-0e4df7a4431a4cf8985d64aeadbb4fdf">TIM_HandleTypeDef htim4;    //定时器4总控制结构体</div><div class="notion-text notion-block-a0f34abe61fa4be09ed65e85781e6ce4">/<em>-------------------------------------------------</em>/</div><div class="notion-text notion-block-64f262e4961a40269610419a590c7548">/<em>函数名：定时器4 定时初始化                       </em>/</div><div class="notion-text notion-block-c4e936655be2405aaf38058c4e081b4e">/<em>参  数：arr：自动重装值                          </em>/</div><div class="notion-text notion-block-65357353ea72424aaccd5e0c5ae25f4a">/<em>参  数：psc：时钟预分频数                        </em>/</div><div class="notion-text notion-block-3ae36ec8317b4503b20d62b3c34bb37a">/<em>返回值：无                                       </em>/</div><div class="notion-text notion-block-84c52476db2940c596e40cb81255449a">/<em>-------------------------------------------------</em>/</div><div class="notion-text notion-block-276980d29ed240219d6f7ec20135a83f">void TIM4_TimerInit(uint16_t arr, uint16_t psc)</div><div class="notion-text notion-block-419fdd9be07d42b08832b59fe4091159">{</div><div class="notion-text notion-block-c6be4da09adc49238af379cfea886fc7">htim4.Instance = TIM4;                                         //设置使用哪个定时器</div><div class="notion-text notion-block-95f19164b037453c83773ba6c6d52ef6">htim4.Init.Prescaler = psc - 1;                                //设置预分频器的值</div><div class="notion-text notion-block-998abec479b941a5b2f48ea030e1e600">htim4.Init.Period = arr - 1;                                   //设置自动重载值</div><div class="notion-text notion-block-23c833453d7742f18209e38e4143c2fc">htim4.Init.CounterMode = TIM_COUNTERMODE_UP;                   //设置计数模式</div><div class="notion-text notion-block-69ca6a16667640ae90b268bcdeff9d60">htim4.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; //自动重载预装载 禁止</div><div class="notion-text notion-block-bacde06bab744d1288142b4347cfcc9a">HAL_TIM_Base_Init(&amp;htim4);                                     //配置，如果失败进入if</div><div class="notion-text notion-block-c9107cc69f864c0180b71f18a369cb38">__HAL_TIM_CLEAR_IT(&amp;htim4, TIM_IT_UPDATE);                     //清除定时器4的中断标志</div><div class="notion-text notion-block-f40f34161d7146a9819b44ec8ee234c3">__HAL_TIM_ENABLE_IT(&amp;htim4, TIM_IT_UPDATE);                    //打开更新中断</div><div class="notion-text notion-block-33b37c9329c4478dadf0416420c4d1ca">}</div><div class="notion-text notion-block-01d74b08bb0244e4a6155ba40e150b7a">/<em>-------------------------------------------------</em>/</div><div class="notion-text notion-block-58d66c7625814650a8622d13a9815d7f">/<em>函数名：定时器底层驱动，开启时钟，设置中断优先级 </em>/</div><div class="notion-text notion-block-cc9bce0773e24e54b3e531d8055281bb">/<em>参  数：htim：定时器句柄                         </em>/</div><div class="notion-text notion-block-559ef7abf0d74d1d95d67c07fc59cf35">/<em>返回值：无                                       </em>/</div><div class="notion-text notion-block-07fbe23bd22342d2b99dae5ca0bb5608">/<em>说  明：此函数会被HAL_TIM_Base_Init()函数调用    </em>/</div><div class="notion-text notion-block-6b61ecc8adb74992ba0316fd68c3125f">/<em>-------------------------------------------------</em>/</div><div class="notion-text notion-block-f1f6b6f7643d4ecd99c1a8f88cf0955e">void HAL_TIM_Base_MspInit(TIM_HandleTypeDef *htim)</div><div class="notion-text notion-block-4ab02eb9d7e64ca09bf77435fe016bfb">{</div><div class="notion-text notion-block-f5631eda2b854315b70df402381f1a6d">if(htim-&gt;Instance==TIM4){	                   //判断是哪个定时器	<div class="notion-text-children"><div class="notion-text notion-block-55abe0de84cf4758a5eef5e26eb2c85a">__HAL_RCC_TIM4_CLK_ENABLE();               //使能定时器时钟</div><div class="notion-text notion-block-2f8425ac1afe480398a5fc827baf06a0">HAL_NVIC_SetPriority(TIM4_IRQn,4,0);       //设置中断优先级，中断分组在HAL_Init()函数中，被设置为4</div><div class="notion-text notion-block-69a4f188f15049508084799a717248b8">HAL_NVIC_EnableIRQ(TIM4_IRQn);             //开启定时器中断   </div></div></div><div class="notion-text notion-block-5c3dabdc1e4c46379defc1c4c2d9b747">}</div><div class="notion-text notion-block-be42e3eb9db1409fb63f988ffe13689f">}</div><div class="notion-text notion-block-2cd215a9c83f4ecb8297cd8a00bff79d">/<em>---------------------------------------------------</em>/</div><div class="notion-text notion-block-7cb86d5a3fc5488ea018c676abc3600c">/<em>函数名：定时器中断回调函数                         </em>/</div><div class="notion-text notion-block-85f989d560ac4ae4ad927e2b1f13bd0d">/<em>参  数：htim：定时器句柄                           </em>/</div><div class="notion-text notion-block-e2a44b69426c4329b525b4428be0c8bb">/<em>返回值：无                                         </em>/</div><div class="notion-text notion-block-90e45794d1bb446eafb6f0225b5ee897">/<em>说  明：此函数会被HAL_TIM_IRQHandler()中断函数调用 </em>/</div><div class="notion-text notion-block-fa500051082e438e92209fdf108c1728">/<em>---------------------------------------------------</em>/</div><div class="notion-text notion-block-23f8d58bef5d4ff6987abc40c3ac1138">//超时回调函数</div><div class="notion-text notion-block-aa6c42f70dd74c19b6abfae23aa89365">void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)</div><div class="notion-text notion-block-bac5e34f8e0243fb98feee87e7b50a5a">{</div><div class="notion-text notion-block-5b158a9b7b29440b8204415f5a1a6a21">if(htim-&gt;Instance==TIM4){	          //判断是哪个定时器<div class="notion-text-children"><div class="notion-text notion-block-6762d88affca49378d7fc80dc3e6cb6e">__HAL_TIM_DISABLE(htim);          //关闭定时器4的计数</div><div class="notion-text notion-block-6ebd53c50f0f41f48b61ee725c174bd7">__HAL_TIM_SET_COUNTER(htim,0);    //清零定时器4计数器</div><div class="notion-text notion-block-f185726e249145d385c47fa4189c50ab">uart3.RxState = 0;  //恢复首字节接收标志位</div><div class="notion-text notion-block-dc76415f57154e2caa117b5154c0053c">uart3.RxCounter += (U3_RX_MAX - __HAL_DMA_GET_COUNTER(&amp;uart3.dmarx));   //记录剩余未发送</div><div class="notion-text notion-block-09dd29a1f4834406911b000a9306a444">HAL_UART_AbortReceive_IT(&amp;uart3.uart);  //终止接收</div></div></div><div class="notion-text notion-block-1aa9422cf3f848dfa1e46b96fc71da93">}</div><div class="notion-text notion-block-b194afbca6e44a23aba636936c90eb00">}</div></div></details><details class="notion-toggle notion-block-c331dbe591c24bb4bc74dd57cc760b9c"><summary><h4 class="notion-h notion-h3 notion-block-c331dbe591c24bb4bc74dd57cc760b9c" data-id="c331dbe591c24bb4bc74dd57cc760b9c"><span><div id="c331dbe591c24bb4bc74dd57cc760b9c" class="notion-header-anchor"></div><span class="notion-h-title"><b>s</b>tm32f1xx_hal_uart.c</span></span></h4></summary><div><div class="notion-text notion-block-7f12f00c81fb4b75a3c318597712bd7e">void HAL_UART_IRQHandler(UART_HandleTypeDef *huart)</div><div class="notion-text notion-block-3c4ee874328b4ce99aacf1f5b00f2885">{<div class="notion-text-children"><div class="notion-text notion-block-a1841be2d60a451492241ff360d46cc6">uint32_t isrflags   = READ_REG(huart-&gt;Instance-&gt;SR);</div><div class="notion-text notion-block-7238e17a4a5740e881fd461047755712">uint32_t cr1its     = READ_REG(huart-&gt;Instance-&gt;CR1);</div><div class="notion-text notion-block-8ecbb27852ed46c2bdf31fb6842c9753">uint32_t cr3its     = READ_REG(huart-&gt;Instance-&gt;CR3);</div><div class="notion-text notion-block-b26717b29fa44b1a869d51fabbd84083">uint32_t errorflags = 0x00U;</div><div class="notion-text notion-block-263832fa5f22414caede7e6f37e979e7">uint32_t dmarequest = 0x00U;</div><div class="notion-text notion-block-14630be605c84c5594190bc0fedc85d2">/<em> If no error occurs </em>/</div><div class="notion-text notion-block-897146432cff4df1af8f7768ced20974">errorflags = (isrflags &amp; (uint32_t)(USART_SR_PE | USART_SR_FE | USART_SR_ORE | USART_SR_NE));<div class="notion-text-children"><div class="notion-text notion-block-6b38423031a4441fb2d836d795dcbad6">//删除  RXNE中断</div></div></div><div class="notion-text notion-block-462529a00cd64aa6a2022d9acbfdbd74">//if (errorflags == RESET)</div><div class="notion-text notion-block-7d813d3705b5490a851530017497d500">//{</div><div class="notion-text notion-block-f98e161f5d5b4cc28fdd1018be37157b">//  /<em> UART in mode Receiver -------------------------------------------------</em>/</div><div class="notion-text notion-block-85b9b05a97a24681af9546db72c46c43">//  if (((isrflags &amp; USART_SR_RXNE) != RESET) &amp;&amp; ((cr1its &amp; USART_CR1_RXNEIE) != RESET))</div><div class="notion-text notion-block-4f005731fd484f2db6c07cba8f8bfd6c">//  {</div><div class="notion-text notion-block-707d90f8d69d4c50a6933e0d16c255f9">//    UART_Receive_IT(huart);</div><div class="notion-text notion-block-d1b0674b04d6451fa8bc7e8e05e19532">//    return;</div><div class="notion-text notion-block-c6cb7d88adbb49d5b74a63a8bbd97b88">//  }</div><div class="notion-text notion-block-6b324aa711484fc4b26710c11e947051">//}</div><div class="notion-text notion-block-355d676dc22f4d6896feaac8f9caacaa">/<em> If some errors occur </em>/</div><div class="notion-text notion-block-c2abb4df102547b29005c54274663648">if ((errorflags != RESET) &amp;&amp; (((cr3its &amp; USART_CR3_EIE) != RESET) || ((cr1its &amp; (USART_CR1_RXNEIE | USART_CR1_PEIE)) != RESET)))</div><div class="notion-text notion-block-0c5382c86b4943c185088bf723098998">{<div class="notion-text-children"><div class="notion-text notion-block-80693ccf585147039bd7267b7624abd9">/<em> UART parity error interrupt occurred ----------------------------------</em>/</div><div class="notion-text notion-block-b96ff390acbd41e2bbf032f01bbb10f6">if (((isrflags &amp; USART_SR_PE) != RESET) &amp;&amp; ((cr1its &amp; USART_CR1_PEIE) != RESET))</div><div class="notion-text notion-block-3b8e83be78d543dab361e10dd2dfc307">{<div class="notion-text-children"><div class="notion-text notion-block-41897961533a44f1af63d5d9cca4edba">huart-&gt;ErrorCode |= HAL_UART_ERROR_PE;</div></div></div><div class="notion-text notion-block-046cf86beb1e4e92b511ba6701765e22">}</div><div class="notion-text notion-block-677c89ba94aa442ea7d2c06b7288e0dd">/<em> UART noise error interrupt occurred -----------------------------------</em>/<div class="notion-text-children"><div class="notion-text notion-block-95c1929907034b6686dc7652632b4699">if (((isrflags &amp; USART_SR_NE) != RESET) &amp;&amp; ((cr3its &amp; USART_CR3_EIE) != RESET))</div></div></div><div class="notion-text notion-block-b40c438eef14495f8f7bd2efab875559">{<div class="notion-text-children"><div class="notion-text notion-block-e79226732fd1451ea06618da26ef76fd">huart-&gt;ErrorCode |= HAL_UART_ERROR_NE;</div></div></div><div class="notion-text notion-block-8642de8e81734b1b9fb0051e239aa4ad">}</div><div class="notion-text notion-block-cdb9b9fe16f84c208c4fbcb10727df99">/<em> UART frame error interrupt occurred -----------------------------------</em>/</div><div class="notion-text notion-block-6d6e860d50a44627aa8936c394263aae">if (((isrflags &amp; USART_SR_FE) != RESET) &amp;&amp; ((cr3its &amp; USART_CR3_EIE) != RESET))</div><div class="notion-text notion-block-55deb99bd1194db189064a045bc39f7e">{<div class="notion-text-children"><div class="notion-text notion-block-885251852bbb451cadc33c84f16ffb38">huart-&gt;ErrorCode |= HAL_UART_ERROR_FE;</div></div></div><div class="notion-text notion-block-ae3a1793a1e74cda9f2b9c1826c67f29">}</div><div class="notion-text notion-block-67464eeed2c144c9b6d85d06a46c72ab">/<em> UART Over-Run interrupt occurred --------------------------------------</em>/</div><div class="notion-text notion-block-b52edc160c7e4e6f847df06fe518ad2f">if (((isrflags &amp; USART_SR_ORE) != RESET) &amp;&amp; ((cr3its &amp; USART_CR3_EIE) != RESET))</div><div class="notion-text notion-block-6d013039d3e042eb8ba491d38564ea75">{<div class="notion-text-children"><div class="notion-text notion-block-b4ba029696894b18a0338adae96025d5">huart-&gt;ErrorCode |= HAL_UART_ERROR_ORE;</div></div></div><div class="notion-text notion-block-2151e4f786084ea593b772e1c98e2d0a">}</div><div class="notion-text notion-block-e1a1dc75b9a642b2bc211776675f7ced">/<em> Call UART Error Call back function if need be --------------------------</em>/</div><div class="notion-text notion-block-9752a5971e2442f8ade277d77d8c3b6d">if (huart-&gt;ErrorCode != HAL_UART_ERROR_NONE)</div><div class="notion-text notion-block-448301ab05504c67b9fc3def03bcd2ec">{<div class="notion-text-children"><div class="notion-text notion-block-8153b8cb362e43c39de60444975b1159">/<em> UART in mode Receiver -----------------------------------------------</em>/</div><div class="notion-text notion-block-0afb15fa05d54aa99ed004e8de889bd6">if (((isrflags &amp; USART_SR_RXNE) != RESET) &amp;&amp; ((cr1its &amp; USART_CR1_RXNEIE) != RESET))</div><div class="notion-text notion-block-75b59ad42ec14828985c88c5a559a147">{<div class="notion-text-children"><div class="notion-text notion-block-be1a03fa33a34ede86e41360e20a8376">UART_Receive_IT(huart);</div></div></div><div class="notion-text notion-block-ba79d481e2e3414b9033b1814be193f8">}</div><div class="notion-text notion-block-74b77ff82e0a4a048a5298896c8f6d3d">/* If Overrun error occurs, or if any error occurs in DMA mode reception,<div class="notion-text-children"><div class="notion-text notion-block-dd65efad27794512977927570740e332">consider error as blocking */</div></div></div><div class="notion-text notion-block-12928e2bd72f41e59c66dabcf0949e65">dmarequest = HAL_IS_BIT_SET(huart-&gt;Instance-&gt;CR3, USART_CR3_DMAR);</div><div class="notion-text notion-block-3ee5a62374b74d47854dc01d408be6e2">if (((huart-&gt;ErrorCode &amp; HAL_UART_ERROR_ORE) != RESET) || dmarequest)</div><div class="notion-text notion-block-c85b3fe77fd94408a189a8b8dc5cf3ab">{<div class="notion-text-children"><div class="notion-text notion-block-593975ba588c418498d9d1db1d140f75">/* Blocking error : transfer is aborted<div class="notion-text-children"><div class="notion-text notion-block-44eeca9978144015ba05fc0cc6556626">Set the UART state ready to be able to start again the process,</div><div class="notion-text notion-block-84c1c7ec49454105ba6587d353ade0bd">Disable Rx Interrupts, and disable Rx DMA request, if ongoing */</div></div></div><div class="notion-text notion-block-25b79b22486046dbbd2e1d42964a8dad">UART_EndRxTransfer(huart);</div><div class="notion-text notion-block-d3a47ab25144498095997271183b087a">/<em> Disable the UART DMA Rx request if enabled </em>/</div><div class="notion-text notion-block-d5272cb332984f3fa7dde5f1ebdbf048">if (HAL_IS_BIT_SET(huart-&gt;Instance-&gt;CR3, USART_CR3_DMAR))</div><div class="notion-text notion-block-c9de4101a93f4f30a837df13348a4fa2">{<div class="notion-text-children"><div class="notion-text notion-block-2eeb14d876474b578089f84b9b93786c">CLEAR_BIT(huart-&gt;Instance-&gt;CR3, USART_CR3_DMAR);</div><div class="notion-text notion-block-edabfde9ce484a388be133e4ef26679d">/<em> Abort the UART DMA Rx channel </em>/</div><div class="notion-text notion-block-63aae118569042d6b20ebde16f610529">if (huart-&gt;hdmarx != NULL)</div><div class="notion-text notion-block-06edcf42fb3c41bb9410ff1bdd8c0baf">{<div class="notion-text-children"><div class="notion-text notion-block-af1600b8a55143969283e65839abdf79">/* Set the UART DMA Abort callback :<div class="notion-text-children"><div class="notion-text notion-block-3de09c8692de4e818668229251817c40">will lead to call HAL_UART_ErrorCallback() at end of DMA abort procedure */</div></div></div><div class="notion-text notion-block-267b05b5901a4c0aaad74263397b1c8e">huart-&gt;hdmarx-&gt;XferAbortCallback = UART_DMAAbortOnError;</div><div class="notion-text notion-block-5b68950a04a840dbbb986f7b21e2e086">if (HAL_DMA_Abort_IT(huart-&gt;hdmarx) != HAL_OK)</div><div class="notion-text notion-block-e141095f13bb4750a0333006f7c04f11">{<div class="notion-text-children"><div class="notion-text notion-block-2572a3022d614e32876724b10fef31fb">/<em> Call Directly XferAbortCallback function in case of error </em>/</div><div class="notion-text notion-block-d0dc222758664a12b321ccdc10c544c2">huart-&gt;hdmarx-&gt;XferAbortCallback(huart-&gt;hdmarx);</div></div></div><div class="notion-text notion-block-e6e534211e834de3b57c5d4be16cc0b6">}</div></div></div><div class="notion-text notion-block-995aaa4f8c594222b66c02f92f408924">}</div><div class="notion-text notion-block-3176ad4c03cf4ccda8161095ae76f81e">else</div><div class="notion-text notion-block-3256ada30a844cfa93ced1112d0a1422">{<div class="notion-text-children"><div class="notion-text notion-block-17a42c4412ef44348294b5bc6809e8e5">/<em> Call user error callback </em>/</div></div></div></div></div></div></div></div></div></div></div></div></div><div class="notion-text notion-block-bb9006d4f0dd44ce9389b23339d322a8">#if (USE_HAL_UART_REGISTER_CALLBACKS == 1)</div><div class="notion-text notion-block-3703c4233d64409c9ca2fdf143c663b7">/<em>Call registered error callback</em>/</div><div class="notion-text notion-block-d10e8244f32c45f9959125ca8bea0f44">huart-&gt;ErrorCallback(huart);</div><div class="notion-text notion-block-dc8ee540b42d42e2ac9732ed9537a5d1">#else</div><div class="notion-text notion-block-4f5cc81bce304be58363f973992bedba">/<em>Call legacy weak error callback</em>/</div><div class="notion-text notion-block-99f5b6b9cfa74b54a1ab738d41ca5377">HAL_UART_ErrorCallback(huart);</div><div class="notion-text notion-block-ffc257fda57042749deec3a93f1651da">#endif /<em> USE_HAL_UART_REGISTER_CALLBACKS </em>/</div><div class="notion-text notion-block-c57e0262a6f64a8f8305f10b224e7172">}</div><div class="notion-text notion-block-c858fd1549b24c6bb055c62e5040ff47">}</div><div class="notion-text notion-block-755f340d39f94f0188c421703813d393">else</div><div class="notion-text notion-block-b248bf462bac4332a47f3996a95f61f8">{<div class="notion-text-children"><div class="notion-text notion-block-694e615e163d4e67b96ceaf3183e54ab">/<em> Call user error callback </em>/</div></div></div><div class="notion-text notion-block-b15f904d71264673b78b5ac8ba6f0245">#if (USE_HAL_UART_REGISTER_CALLBACKS == 1)</div><div class="notion-text notion-block-3198026aa21e4c73b4ee8ca6fdc98a0a">/<em>Call registered error callback</em>/</div><div class="notion-text notion-block-36ab789d43be45d9b4efc2d2c026b0d2">huart-&gt;ErrorCallback(huart);</div><div class="notion-text notion-block-75649205c0424a00bc463addccc93e41">#else</div><div class="notion-text notion-block-867740b88793450082f1f91e1f921ed4">/<em>Call legacy weak error callback</em>/</div><div class="notion-text notion-block-6f0f4e6deb254b4cba172af20451d887">HAL_UART_ErrorCallback(huart);</div><div class="notion-text notion-block-4f249d971e1f49b78c8525b531c6e261">#endif /<em> USE_HAL_UART_REGISTER_CALLBACKS </em>/</div><div class="notion-text notion-block-679bcda405114a3a8ebe5a940ddb3dfc">}</div><div class="notion-text notion-block-5273c30ada064d6cb04319328432065c">}</div><div class="notion-text notion-block-3f22dfe7734a41cbb44eeb8377cabbd1">else</div><div class="notion-text notion-block-b75a61c5830d42f8877e9b9386fc2ad8">{<div class="notion-text-children"><div class="notion-text notion-block-4f35a28ebec94d4ebfc3987e7143e39a">/* Non Blocking error : transfer could go on.<div class="notion-text-children"><div class="notion-text notion-block-bc05ea29c72142018b9656f15f0fcf0b">Error is notified to user through user error callback */</div></div></div></div></div><div class="notion-text notion-block-6e7252e1a2194410a87f6d44a970152f">#if (USE_HAL_UART_REGISTER_CALLBACKS == 1)</div><div class="notion-text notion-block-c63d92fd53464c7db173ac55bd65d75f">/<em>Call registered error callback</em>/</div><div class="notion-text notion-block-2831916029ca44e4a9b3a73f6fd5a713">huart-&gt;ErrorCallback(huart);</div><div class="notion-text notion-block-6fa7d94b45b2432393d235fe16995fcf">#else</div><div class="notion-text notion-block-8225feb89cfb49cfbfce5928bf4e7705">/<em>Call legacy weak error callback</em>/</div><div class="notion-text notion-block-2fd8cb2a914445baa03c6e48a1e2c4ac">HAL_UART_ErrorCallback(huart);</div><div class="notion-text notion-block-102db9f5dfd4420c880815b6bf235a80">#endif /<em> USE_HAL_UART_REGISTER_CALLBACKS </em>/</div><div class="notion-text notion-block-08c0da436fb04b6ba1abdd962446b56a">huart-&gt;ErrorCode = HAL_UART_ERROR_NONE;</div><div class="notion-text notion-block-2ea1531630b14cc3acfb4918b2eeb944">}</div><div class="notion-text notion-block-d643ad477fc34ba088cf3587ee212c1c">}</div><div class="notion-text notion-block-2ef816d7b6a547f9a034df172f05d692">return;</div><div class="notion-text notion-block-3c60939cda2e4ecdad0cc6393452e075">} /<em> End if some error occurs </em>/</div><div class="notion-text notion-block-19f56d5a7b7f4ea6997042fff637e40f">/<em> UART in mode Transmitter ------------------------------------------------</em>/</div><div class="notion-text notion-block-70ee8cb9095a45dba8ca8c6fa4ddfcb3">//删除  发送缓冲区空的中断</div><div class="notion-text notion-block-1febcbd8278347d49818a66c30afd243">//  if (((isrflags &amp; USART_SR_TXE) != RESET) &amp;&amp; ((cr1its &amp; USART_CR1_TXEIE) != RESET))</div><div class="notion-text notion-block-dcff0716a0534de3918f233fa7646c93">//  {</div><div class="notion-text notion-block-f79ec291b064455798c7571ea9457949">//    UART_Transmit_IT(huart);</div><div class="notion-text notion-block-ccd0a2276a5f4625bba1869ca68ef73c">//    return;</div><div class="notion-text notion-block-e87a4d12b25b40d7858bc268955a9469">//  }</div><div class="notion-text notion-block-f8e3b5cb7dc04bf68fc876de93bfd33a">/<em> UART in mode Transmitter end --------------------------------------------</em>/</div><div class="notion-text notion-block-93935420bf3d4929a0791674f8f12a39">if (((isrflags &amp; USART_SR_TC) != RESET) &amp;&amp; ((cr1its &amp; USART_CR1_TCIE) != RESET))</div><div class="notion-text notion-block-ccff223be28b4d88892e9b5c4fb781f7">{<div class="notion-text-children"><div class="notion-text notion-block-efb6dfa695994096b9aca28a3483524f">UART_EndTransmit_IT(huart);</div><div class="notion-text notion-block-d4832c15ca934ea2bc92929fbaec9484">return;</div></div></div><div class="notion-text notion-block-2c0fecbba75a469284af490c57f28e58">}</div><div class="notion-text notion-block-2645ba95b39c41fd98c78d3d9c0145c6">/<em> 写自己的中断回调，现在只能进入我们这个了。 </em>/</div><div class="notion-text notion-block-b6cef723ff6f452493c5f6cd1b8c52c3">#include &quot;uart.h&quot;</div><div class="notion-text notion-block-895a35655b254741975a5fa8666e24c8">#include &quot;timer.h&quot;</div><div class="notion-text notion-block-e968cc35d0274d76b93b9dca547b6174">else</div><div class="notion-text notion-block-a49778d0de9844d08ed65fb15cb79ae1">{<div class="notion-text-children"><div class="notion-text notion-block-1ae9089e6faa4b5aa4dd10c8b5332336">if(uart3.RxState == 0){ /<em> 首字节 </em>/<div class="notion-text-children"><div class="notion-text notion-block-5dd6498a4eeb43b2a1bc3e7ef9610dc9">__HAL_TIM_ENABLE(&amp;htim4);  //打开tim4的计数</div><div class="notion-text notion-block-c2ddb6bb4f5a4f26bb2dd6c66e2d110d">uart3.RxStat = 1;   //标记接收</div></div></div><div class="notion-text notion-block-322a2e843a694f24987e3811005d19a0">}else{/<em> 后续字节 </em>/<div class="notion-text-children"><div class="notion-text notion-block-120d9a12920b4fdd98981fee01a34737">__HAL_TIM_SET_COUNTER(&amp;htim4, 0)//清除tim4的计数</div></div></div><div class="notion-text notion-block-fadd53f7f44a4517b412f93ddb77255d">}</div></div></div><div class="notion-text notion-block-26f92784d3be4668a3702e46c38262b3">}</div><div class="notion-text notion-block-49e5f8f3abed43e2b5cc8eaba71d7443">}</div></div></details><details class="notion-toggle notion-block-0cab100d371241559ddc2edcadfd920f"><summary><h4 class="notion-h notion-h3 notion-block-0cab100d371241559ddc2edcadfd920f" data-id="0cab100d371241559ddc2edcadfd920f"><span><div id="0cab100d371241559ddc2edcadfd920f" class="notion-header-anchor"></div><span class="notion-h-title">main.c</span></span></h4></summary><div><div class="notion-text notion-block-6eb2a576f85344f499e558a86d090830">#include &quot;stm32f1xx_hal.h&quot;</div><div class="notion-text notion-block-42bb565fdbca4c1d8efb7ec8869bf3c7">#include &quot;rcc.h&quot;</div><div class="notion-text notion-block-bae72b650b6a42afb5a64764e6a2009f">#include &quot;led.h&quot;</div><div class="notion-text notion-block-d6e8c79e859c4d89a3b474f19180b117">#include &quot;sw.h&quot;</div><div class="notion-text notion-block-a5d7d5f0739c46e28b9aaef381479b95">#include &quot;uart.h&quot;</div><div class="notion-text notion-block-2767ef9b2dc64d18b92abd568f286ba1">int main(void){<div class="notion-text-children"><div class="notion-text notion-block-825c7d916f764b48bc47faa252d3308c">HAL_Init();</div><div class="notion-text notion-block-a068ad3d06ef4b38b0e268865ae94978">RccClock_Init();</div><div class="notion-text notion-block-37e7c9b9c8b343d093ba612186aa7133">SW_Init_IT(0);</div><div class="notion-text notion-block-2e3adb6eade74109a06b89e4352f6584">LED_Init();</div><div class="notion-text notion-block-72705e8f7a3045db9cc1038c80025fff">U1_Init(921600);</div><div class="notion-text notion-block-a22ac83c5ecc46f9a01d89f2383bcff2">U2_Init(921600);</div><div class="notion-text notion-block-26771f5c2ee644d1b91c7e727e9d78d8">U3_Init(921600);</div><div class="notion-text notion-block-7764a3aeceff4f3f8bb156752d72b8fc">while(1){<div class="notion-text-children"><div class="notion-text notion-block-5ab6cfe4028045a99f85acbc60287a2e">//串口1收发</div><div class="notion-text notion-block-66588bed66f24b90b5e7cb97542e9f4e">if(uart1.RxOutPtr != uart1.RxInPtr){<div class="notion-text-children"><div class="notion-text notion-block-61d893f862454a0283541766bc4563ec">if(((uart1.RxOutPtr-&gt;end - uart1.RxOutPtr-&gt;start + 1)==6)&amp;&amp;(memcmp(uart1.RxOutPtr-&gt;start,&quot;LED_ON&quot;,6) == 0)){<div class="notion-text-children"><div class="notion-text notion-block-6dc685c5135b47f4bcf38778db97d49d">LED_ON();</div></div></div><div class="notion-text notion-block-36e98c95fae84e6ea927431f6c276c1c">}else if(((uart1.RxOutPtr-&gt;end - uart1.RxOutPtr-&gt;start + 1)==7)&amp;&amp;(memcmp(uart1.RxOutPtr-&gt;start,&quot;LED_OFF&quot;,7) == 0)){<div class="notion-text-children"><div class="notion-text notion-block-f83dc64073394b55ad471337b5cc3455">LED_OFF();</div></div></div><div class="notion-text notion-block-088d57e5c1ec4adb811ddd495883b4a0">}</div><div class="notion-text notion-block-8fb5d586400f4f99babacae2f202cdc9">uart1.RxOutPtr++;</div><div class="notion-text notion-block-c885297a3c7847b7b0858d272783b657">if(uart1.RxOutPtr == uart1.RxEndPtr){<div class="notion-text-children"><div class="notion-text notion-block-f5f2b66885c74134922ab69373f5d376">uart1.RxOutPtr = &amp;uart1.RxLocation[0];</div></div></div><div class="notion-text notion-block-11d1e91b06bc4c5db9aff28fbce64ea1">}</div></div></div><div class="notion-text notion-block-9b0adc9c050249c6ad341bdad4ae2e99">}</div><div class="notion-text notion-block-59cdbee1f0d54428b85409524b464f6d">if((uart1.TxOutPtr != uart1.TxInPtr)&amp;&amp;(uart1.TxState==0)){<div class="notion-text-children"><div class="notion-text notion-block-d7a7674a5e5440b8ad72d1419ab09605">uart1.TxState = 1;</div><div class="notion-text notion-block-3ac798e7a95c4c119a9dc411026f83ba">HAL_UART_Transmit_DMA(&amp;uart1.uart,uart1.TxOutPtr-&gt;start,uart1.TxOutPtr-&gt;end - uart1.TxOutPtr-&gt;start + 1);</div><div class="notion-text notion-block-dbb6c403b43e48ef962f8842d77740a0">uart1.TxOutPtr++;</div><div class="notion-text notion-block-ebb4f4a123ab4986ab297106ac20c84f">if(uart1.TxOutPtr == uart1.TxEndPtr){<div class="notion-text-children"><div class="notion-text notion-block-75a419e0ab834d59b4b188dbd504ae6c">uart1.TxOutPtr = &amp;uart1.TxLocation[0];</div></div></div><div class="notion-text notion-block-9f9eb87c059a43b292216b7a2b107746">}</div></div></div><div class="notion-text notion-block-bc560c97d102448392919461f1e31be5">}</div><div class="notion-text notion-block-639aa1b78cb845c6ba661432d303e6e2">//串口2收发</div><div class="notion-text notion-block-db3b7756b37f441a9bf07466d5f96b94">if(uart2.RxOutPtr != uart2.RxInPtr){<div class="notion-text-children"><div class="notion-text notion-block-b6cf338cc961482385966b90464e60f3">if(((uart2.RxOutPtr-&gt;end - uart2.RxOutPtr-&gt;start + 1)==7)&amp;&amp;(memcmp(uart2.RxOutPtr-&gt;start,&quot;x81S1_LED&quot;,7) == 0)){<div class="notion-text-children"><div class="notion-text notion-block-6db47f1c94484574995605307b209ebc">LED_Toggle();</div></div></div><div class="notion-text notion-block-e973400102cb435a81f438b39bcb62c7">}</div><div class="notion-text notion-block-af333ca2094a4819a725111664de090d">uart2.RxOutPtr++;</div><div class="notion-text notion-block-2ead74df34844de7af04c5a32967f7e3">if(uart2.RxOutPtr == uart2.RxEndPtr){<div class="notion-text-children"><div class="notion-text notion-block-a456c329c98d4ca6957270d84b31118d">uart2.RxOutPtr = &amp;uart2.RxLocation[0];</div></div></div><div class="notion-text notion-block-7c470b63483b402cafb69e8ef3be4d0a">}</div></div></div><div class="notion-text notion-block-c6175709bb3c40aab323f3fc779c46f9">}</div><div class="notion-text notion-block-9ccfb0f8c6fe4b91ac4e559be4cfa2f1">if((uart2.TxOutPtr != uart2.TxInPtr)&amp;&amp;(uart2.TxState==0)){<div class="notion-text-children"><div class="notion-text notion-block-854733981fe24b4fb222b20c45c4720c">uart2.TxState = 1;<div class="notion-text-children"><div class="notion-text notion-block-1b67c7b91e9c4a6ea6e16f3fee00b69b">HAL_UART_Transmit_DMA(&amp;uart2.uart,uart2.TxOutPtr-&gt;start,uart2.TxOutPtr-&gt;end - uart2.TxOutPtr-&gt;start + 1);</div><div class="notion-text notion-block-6d645994977942ccb975f9f95c9a1d16">uart2.TxOutPtr++;</div><div class="notion-text notion-block-e0d89d1fa3f84973adf0c819e98e94a9">if(uart2.TxOutPtr == uart2.TxEndPtr){<div class="notion-text-children"><div class="notion-text notion-block-509097167ba646edbf558929b5a8db0f">uart2.TxOutPtr = &amp;uart2.TxLocation[0];</div></div></div><div class="notion-text notion-block-52d2f519f2804c448a6ca84365293d48">}</div><div class="notion-text notion-block-3f71963363d044c191b244e7c0a17e47">}</div><div class="notion-text notion-block-9d5eca6d1ed34b109d15854bfd3d4849">//串口3收发</div><div class="notion-text notion-block-436b994c0c414a0fa646e242a715b8ee">if(uart3.RxOutPtr != uart3.RxInPtr){<div class="notion-text-children"><div class="notion-text notion-block-80c95b6d758e47c89946509a84aca172">if(((uart3.RxOutPtr-&gt;end - uart3.RxOutPtr-&gt;start + 1)==7)&amp;&amp;(memcmp(uart3.RxOutPtr-&gt;start,&quot;x82S2_LED&quot;,7) == 0)){<div class="notion-text-children"><div class="notion-text notion-block-e9d4c47e86a24f138f5d8b065e9c6ffe">LED_Toggle();</div></div></div><div class="notion-text notion-block-d50bdaddad7147d0b231772cbdd40ea4">}</div><div class="notion-text notion-block-5d0397f139be43cc8d6217aee6f05a99">uart3.RxOutPtr++;</div><div class="notion-text notion-block-865ad4dab0d042a582eab70a1b1be1d2">if(uart3.RxOutPtr == uart3.RxEndPtr){<div class="notion-text-children"><div class="notion-text notion-block-48b5cdfec7cf435b812853ae34d1cbcd">uart3.RxOutPtr = &amp;uart3.RxLocation[0];</div></div></div><div class="notion-text notion-block-e19dbf4f775c4199abeaa37be0e0cd7f">}</div></div></div><div class="notion-text notion-block-6d5d29e17f3145d09933d6bc153a4795">}</div><div class="notion-text notion-block-b43e8152b3ba463d9a61b36fbacbd782">if((uart3.TxOutPtr != uart3.TxInPtr)&amp;&amp;(uart3.TxState==0)){<div class="notion-text-children"><div class="notion-text notion-block-15d387689412404eb8387cc5046533d2">uart3.TxState = 1;</div><div class="notion-text notion-block-7a6fdaa7b57241a9925526228743e554">HAL_UART_Transmit_DMA(&amp;uart3.uart,uart3.TxOutPtr-&gt;start,uart3.TxOutPtr-&gt;end - uart3.TxOutPtr-&gt;start + 1);</div><div class="notion-text notion-block-f29bc919ab0446a088aa0cfd765aab22">uart3.TxOutPtr++;</div><div class="notion-text notion-block-a5bc0794dc4f40e7837b846120a90224">if(uart3.TxOutPtr == uart3.TxEndPtr){<div class="notion-text-children"><div class="notion-text notion-block-179a9cb76c734e7bae5d165c9715c502">uart3.TxOutPtr = &amp;uart3.TxLocation[0];</div></div></div><div class="notion-text notion-block-dbf2429d567c4ce4a2513a7095baf20e">}</div></div></div><div class="notion-text notion-block-54c46a1e0637427094069e80a6c081aa">}</div><div class="notion-text notion-block-73a4368d08f540e6acd45079e396a2e7">}</div></div></div></div></div></div></div></div></div><div class="notion-text notion-block-70ed7041fcca4a41b4fb43ad97de1112">}</div></div></details></div></details><details class="notion-toggle notion-block-c4caf4dcf6a74f84b54dbd9549eb4f49"><summary><h3 class="notion-h notion-h2 notion-h-indent-1 notion-block-c4caf4dcf6a74f84b54dbd9549eb4f49" data-id="c4caf4dcf6a74f84b54dbd9549eb4f49"><span><div id="c4caf4dcf6a74f84b54dbd9549eb4f49" class="notion-header-anchor"></div><span class="notion-h-title">十二、HAL库：多主机通信  空闲检测唤醒 定时器超时 DMA不定长接收</span></span></h3></summary><div><details class="notion-toggle notion-block-253ab7e5e92343be88807468ee076695"><summary><h4 class="notion-h notion-h3 notion-block-253ab7e5e92343be88807468ee076695" data-id="253ab7e5e92343be88807468ee076695"><span><div id="253ab7e5e92343be88807468ee076695" class="notion-header-anchor"></div><span class="notion-h-title">1. 空闲总线检测</span></span></h4></summary><div><div class="notion-text notion-block-6189e29dc8e941f0aa82bea3589c6327">空闲唤醒没有硬件从机地址，需要自己在程序中加入从机地址，并进行管理</div><div class="notion-text notion-block-a3a5245ae7a645b58633afe994387545">RWU被写入1时，USART进入静默模式。当检测到 一空闲帧时，它被唤醒。然后RWU被硬件清零，</div><div class="notion-blank notion-block-38ce1697e54f42db9c428a7ed7b2676e"> </div><div class="notion-text notion-block-d099acd21cc641628c0797eb41a14743">所以，在空闲总线唤醒模式下<code class="notion-inline-code">HAL_MultiProcessor_Init</code> 多设备初始化的第二个参数（从机地址）时无效的</div></div></details><details class="notion-toggle notion-block-998a10b0fe5e4839ab78521bc25caea5"><summary><h4 class="notion-h notion-h3 notion-block-998a10b0fe5e4839ab78521bc25caea5" data-id="998a10b0fe5e4839ab78521bc25caea5"><span><div id="998a10b0fe5e4839ab78521bc25caea5" class="notion-header-anchor"></div><span class="notion-h-title">2. 思路：</span></span></h4></summary><div><div class="notion-text notion-block-2325c70ca3294799a0f49dc893e399b6">因为空闲总线检测没有从机没有硬件地址，那么思路可以为下：</div><ol start="1" class="notion-list notion-list-numbered notion-block-e29fcda045cf419e8e00b8e6f3e4e894" style="list-style-type:decimal"><li>从机默认为正常模式，如果地址匹配，那么继续执行后续操作。</li></ol><ol start="2" class="notion-list notion-list-numbered notion-block-a0c1978a028546969edc148fa62147b5" style="list-style-type:decimal"><li>如果地址未匹配，那么在应用程序中，调用子函数，将这个从机的RWU变为高电平。静默模式。不对后续的数据进行接收</li></ol><ol start="3" class="notion-list notion-list-numbered notion-block-f945fb7f62414b66a7d11f80d4ad4391" style="list-style-type:decimal"><li>当这一段数据接收完毕，空闲帧出现时，就会重新把从机的RWU拉低为低电平。变为正常模式</li></ol><ol start="4" class="notion-list notion-list-numbered notion-block-1662d3c800cb408f8433ef34d6d236b2" style="list-style-type:decimal"><li>总结理解：大部分时间为正常模式，当判断地址之后，如果不是自己的地址就进入静默模式，不接收。当这一段数据完毕之后，空闲帧出现，硬件自动拉低RWU。变会正常模式</li></ol></div></details><details class="notion-toggle notion-block-0ad563b738d94ff7a29b4ea7f1a5ef1c"><summary><h4 class="notion-h notion-h3 notion-block-0ad563b738d94ff7a29b4ea7f1a5ef1c" data-id="0ad563b738d94ff7a29b4ea7f1a5ef1c"><span><div id="0ad563b738d94ff7a29b4ea7f1a5ef1c" class="notion-header-anchor"></div><span class="notion-h-title">3. 程序</span></span></h4></summary><div><div class="notion-text notion-block-28c905f3a20c4565b430674f63294896">相较上一节：”HAL库：多主机通信 地址检测唤醒 定时器超时 DMA不定长接收“</div><div class="notion-text notion-block-195b751dd4124621a546d11bde8e9b44"><b>主机部分：</b></div><ul class="notion-list notion-list-disc notion-block-0546bb2a954c45c19968e1225df7973a"><li>仅改变了发送数据，由 0x81 变为0x01   .因为此时不是地址检测唤醒，不需要告诉从机这段字节为地址（bit7 为 1）</li></ul><div class="notion-text notion-block-5bde612511894b50afe5aa9056b7f891"><b>从机部分：</b></div><ul class="notion-list notion-list-disc notion-block-e6ae42abb9ae4a1f9a0e8e994f7126df"><li>修改主程序判断接收数据的地址由0x81-&gt; 0x01</li></ul><ul class="notion-list notion-list-disc notion-block-2f6668ab8a774e57a46fbbf0e9b8c480"><li>仅在初始化时，改变了下<code class="notion-inline-code">HAL_MultiProcessor_Init</code> 的第三个参数（唤醒方式）为<code class="notion-inline-code">UART_WAKEUPMETHOD_IDLELINE</code>    （第二个参数为无效参数）
初始化时和接收完成后不需要进入静默模式，（因为空闲帧会立刻把RWU置位为0，进入正常模式）</li></ul><ul class="notion-list notion-list-disc notion-block-b8f9b1ae3c8c4dd384cc3cb3712aac4c"><li>在stm32f1xx_hal_uart.c中，添加判断地址并进入或不进入静默模式的程序。</li></ul></div></details><div class="notion-text notion-block-8414c7d43fbd4c718491a315c62af7f8">/<em> 写自己的中断回调，现在只能进入我们这个了。 </em>/<div class="notion-text-children"><div class="notion-text notion-block-70b21eba140a4d28a53c980b3c14b382">if(uart2.RxState == 0){ /<em> 首字节 </em>/<div class="notion-text-children"><div class="notion-text notion-block-a3a91e2bdf554c4f8c0592ffc984e98c">__HAL_TIM_ENABLE(&amp;htim4);  //打开tim4的计数</div><div class="notion-text notion-block-fa1a8c8b5ee245b782a51b04d4790969">uart2.RxState = 1;   //标记接收</div><div class="notion-text notion-block-9899366e340746c3ba9030ab30cb6926">/<em> 判断地址 </em>/</div><div class="notion-text notion-block-1403706b3b6640b6b7e8f0642adb4082">if(*uart2.RxInPtr-&gt;start != 0x01){//判断第一个字节是不是自己的地址<div class="notion-text-children"><div class="notion-text notion-block-105d00e7ac0643be8a84d386b448e6da">HAL_MultiProcessor_EnterMuteMode(&amp;uart1.uart);  //进入静默模式</div></div></div><div class="notion-text notion-block-7cb3ed0bb52a4e02ad133c5890ad0ad7">}</div></div></div><div class="notion-text notion-block-a30bbd484c8f48bca319c6cafcc78199">}else{/<em> 后续字节 </em>/<div class="notion-text-children"><div class="notion-text notion-block-2431404c5ec645449fa5c170d9f53d95">__HAL_TIM_SET_COUNTER(&amp;htim4, 0);//清除tim4的计数 </div></div></div><div class="notion-text notion-block-ccb8e1eb26184ee7a87a2b386c6fa12f">}</div></div></div><div class="notion-blank notion-block-ac092fee9a624a589b819b6c63052f07"> </div></div></details><details class="notion-toggle notion-block-3523b922ffa54c42b8ec2dc92841006f"><summary><h3 class="notion-h notion-h2 notion-h-indent-1 notion-block-3523b922ffa54c42b8ec2dc92841006f" data-id="3523b922ffa54c42b8ec2dc92841006f"><span><div id="3523b922ffa54c42b8ec2dc92841006f" class="notion-header-anchor"></div><span class="notion-h-title">十三、串口1 2 3 Printf 格式化输出</span></span></h3></summary><div><div class="notion-text notion-block-99f4a81847f14264b568fefa5fbd36f3">void U3_Printf(char* format, ...){</div><div class="notion-text notion-block-3b4b019da0264d0ba0761e80fcab544f">uint8_t tempbuff[256];</div><div class="notion-text notion-block-4563475db17f471897e41fd960fbc50c">va_list ap;</div><div class="notion-text notion-block-346d4d213fd141a0b45a1cdad3270f46">va_start(ap, format);</div><div class="notion-text notion-block-a1e5a409aed0434c8a6376052094c03f">vsprintf((char*)tempbuff, format, ap);</div><div class="notion-text notion-block-ce2f6a27e32843e79fb19c3929f09a75">va_end(ap);</div><div class="notion-text notion-block-a9eaa6137cee4d4f95d4ed9b1f15a1cc">uint16_t i;</div><div class="notion-text notion-block-bb267e12db08440db9a24cfec15dd9e7">for(i = 0; i &lt; strlen((char*)tempbuff); i++){<div class="notion-text-children"><div class="notion-text notion-block-3d74980000594535b0b694bec110c444">while(!__HAL_UART_GET_FLAG(&amp;uart3.uart, UART_FLAG_TXE));    //发送寄存器空，才开始发送</div><div class="notion-text notion-block-f827b2e55470453397e8b80dfc3556dd">uart3.uart.Instance-&gt;DR = tempbuff[i];          //把数据依次放入DR 寄存器，发送出去</div></div></div><div class="notion-text notion-block-e4ecc36f5816452cbe08bd285945ffe7">}<div class="notion-text-children"><div class="notion-text notion-block-d5b5431e0ec24674a5c6777a42497e9d">while(!__HAL_UART_GET_FLAG(&amp;uart3.uart, UART_FLAG_TC));    //发送完成，退出printf</div></div></div><div class="notion-text notion-block-35e25b7279a04d41ade6905725c0ff0a">}</div><div class="notion-text notion-block-ff06fe79f904497ca89b62caca9d2a7d"><b>代码解析：</b></div><ol start="1" class="notion-list notion-list-numbered notion-block-75ebd7de4d6743bc9d4b636f2fb8cea0" style="list-style-type:decimal"><li>这个函数有一个参数<code class="notion-inline-code">format</code>，它是一个指向字符的指针，代表格式化字符串
在 C 语言中，函数参数中的 “...” 表示可变参数列表，也称为<b>可变参数。</b></li></ol><ol start="2" class="notion-list notion-list-numbered notion-block-55b8d2d0c02b4b7cb402114003bba8da" style="list-style-type:decimal"><li>首先定义了一个大小为 256 的无符号 8 位整数数组 <code class="notion-inline-code">tempbuff</code>，用于存储格式化后的字符串。</li></ol><ol start="3" class="notion-list notion-list-numbered notion-block-1821a8aca6bc4356b1d77214498d6eb5" style="list-style-type:decimal"><li>使用<b>可变参数列表</b>的机制。</li><ol class="notion-list notion-list-numbered notion-block-1821a8aca6bc4356b1d77214498d6eb5" style="list-style-type:lower-alpha"><ul class="notion-list notion-list-disc notion-block-8a1acfa629374c8aa868f07007b447ca"><li><code class="notion-inline-code">va_list ap;</code> 定义一个可变参数列表指针。</li></ul><ul class="notion-list notion-list-disc notion-block-778e1438389a48f792976ca85f78a323"><li><code class="notion-inline-code">va_start(ap, format);</code> 初始化可变参数列表指针，使其指向第一个可变参数，这里 <code class="notion-inline-code">format</code> 是格式化字符串，后面的参数可以是任意类型和数量。</li></ul><ul class="notion-list notion-list-disc notion-block-ef4de6b9b8724914a773c7e56a627038"><li><code class="notion-inline-code">vsprintf((char*)tempbuff, format, ap);</code> 使用可变参数列表将格式化后的字符串存储到 <code class="notion-inline-code">tempbuff</code> 数组中。</li></ul><ul class="notion-list notion-list-disc notion-block-af948e5cae0a4be6a11f8d9e0c22dfa2"><li><code class="notion-inline-code">va_end(ap);</code> 标记可变参数列表结束。</li></ul></ol></ol><ol start="4" class="notion-list notion-list-numbered notion-block-4f9739edc8b64bd18198ad062a17bec3" style="list-style-type:decimal"><li>然后通过一个循环逐个字符地将 <code class="notion-inline-code">tempbuff</code> 中的内容发送到 UART3。</li><ol class="notion-list notion-list-numbered notion-block-4f9739edc8b64bd18198ad062a17bec3" style="list-style-type:lower-alpha"><ul class="notion-list notion-list-disc notion-block-69aec1de58474879acce608b2536d7d2"><li>在循环中，使用 <code class="notion-inline-code">while(!__HAL_UART_GET_FLAG(&amp;uart3.uart, UART_FLAG_TXE));</code> 等待发送寄存器为空，即可以发送下一个字符。</li></ul><ul class="notion-list notion-list-disc notion-block-a0c7bb6126664e84b7e69837bd9d76ea"><li>当发送寄存器为空时，将 <code class="notion-inline-code">tempbuff</code> 中的字符逐个放入 UART3 的数据寄存器 <code class="notion-inline-code">uart3.uart.Instance-&gt;DR</code> 进行发送。</li></ul></ol></ol><ol start="5" class="notion-list notion-list-numbered notion-block-8c94fff689cf4c959b449c4ef139c96a" style="list-style-type:decimal"><li>最后，使用 <code class="notion-inline-code">while(!__HAL_UART_GET_FLAG(&amp;uart3.uart, UART_FLAG_TC));</code> 等待发送完成标志位，确保所有数据都已发送完毕后退出函数。</li></ol><details class="notion-toggle notion-block-21238f4fad4e458eb01c3fc8d36278af"><summary><h3 class="notion-h notion-h2 notion-block-21238f4fad4e458eb01c3fc8d36278af" data-id="21238f4fad4e458eb01c3fc8d36278af"><span><div id="21238f4fad4e458eb01c3fc8d36278af" class="notion-header-anchor"></div><span class="notion-h-title">十四、通信双方，参数不匹配时会出现哪些错误</span></span></h3></summary><div><div class="notion-text notion-block-fded1e24ac654f30bcc6dd623e43ef1a">这里用到了错误回调函数<code class="notion-inline-code">HAL_UART_ErrorCallback</code></div><div class="notion-text notion-block-8941feeb92ad43d5a1a0baa532b9d2ab">我们利用两个实验板，测试通信参数不匹配时，产生哪些错误</div><div class="notion-text notion-block-2eab2da660384d06b58dd8eb629cd73a">利用串口2 相互通信</div><div class="notion-text notion-block-3fa979386bf4447990f52e7ce73f5dde">利用串口1 printf输出提示信息</div><ul class="notion-list notion-list-disc notion-block-73017e8a690d4e85b0ee3fb8575cf8b1"><li>波特率不匹配：噪声错误，不是每次每次都会发生，会伴随无效数据</li></ul><ul class="notion-list notion-list-disc notion-block-1e73292c2c9f4ad1beeba69e7ce5c889"><li>数据字长不匹配时：一个8位 一个9位 帧错误</li></ul><ul class="notion-list notion-list-disc notion-block-846e73c48ae742db98635cfde0f2e31a"><li>校验不匹配时：PE 校验错误</li></ul><div class="notion-text notion-block-20af5761ee8f47ff81de98d7fc3c0918"><b>一旦错误产生，会终止当前的数据传输。</b></div></div></details></div></details><details class="notion-toggle notion-block-12145d8fec3a4a8a9e45e6d6ec068911"><summary><h2 class="notion-h notion-h1 notion-h-indent-0 notion-block-12145d8fec3a4a8a9e45e6d6ec068911" data-id="12145d8fec3a4a8a9e45e6d6ec068911"><span><div id="12145d8fec3a4a8a9e45e6d6ec068911" class="notion-header-anchor"></div><span class="notion-h-title">定时器[外部模式]篇</span></span></h2></summary><div><details class="notion-toggle notion-block-922313d6d475497e995953d981638685"><summary><h3 class="notion-h notion-h2 notion-block-922313d6d475497e995953d981638685" data-id="922313d6d475497e995953d981638685"><span><div id="922313d6d475497e995953d981638685" class="notion-header-anchor"></div><span class="notion-h-title">一、资源介绍：STM32F103C8T6定时器资源介绍</span></span></h3></summary><div><details class="notion-toggle notion-block-062ae8dbf5d5443da71ec831284e9a69"><summary><h4 class="notion-h notion-h3 notion-block-062ae8dbf5d5443da71ec831284e9a69" data-id="062ae8dbf5d5443da71ec831284e9a69"><span><div id="062ae8dbf5d5443da71ec831284e9a69" class="notion-header-anchor"></div><span class="notion-h-title"><b>高级定时器（TIM1）</b></span></span></h4></summary><div><ul class="notion-list notion-list-disc notion-block-2b9d2f5dc6704b0390589315df55355a"><li>时基单元包含：</li><ul class="notion-list notion-list-disc notion-block-2b9d2f5dc6704b0390589315df55355a"><li>计数器寄存器（TIMx_CNT）</li><li>预分频器寄存器（TIMx_PSC）</li><li>自动装载寄存器（TIMx_ARR）</li><li>重复次数寄存器（TIMx_RCR）</li></ul></ul></div></details><details class="notion-toggle notion-block-135397154dd14ee382812e3288957237"><summary><h4 class="notion-h notion-h3 notion-block-135397154dd14ee382812e3288957237" data-id="135397154dd14ee382812e3288957237"><span><div id="135397154dd14ee382812e3288957237" class="notion-header-anchor"></div><span class="notion-h-title"><b>通用定时器（TIM2、TIM3、TIM4）</b></span></span></h4></summary><div><ul class="notion-list notion-list-disc notion-block-3ad69cfa303245a3bee6a61477263d21"><li>时基单元包含：</li><ul class="notion-list notion-list-disc notion-block-3ad69cfa303245a3bee6a61477263d21"><li>计数器寄存器（TIMx_CNT）</li><li>预分频器寄存器（TIMx_PSC）</li><li>自动装载寄存器（TIMx_ARR）</li></ul></ul></div></details><details class="notion-toggle notion-block-4f0e588813e8493e901801b3002661f5"><summary><h4 class="notion-h notion-h3 notion-block-4f0e588813e8493e901801b3002661f5" data-id="4f0e588813e8493e901801b3002661f5"><span><div id="4f0e588813e8493e901801b3002661f5" class="notion-header-anchor"></div><span class="notion-h-title"><b>定时器1 外部通道</b>：</span></span></h4></summary><div><ul class="notion-list notion-list-disc notion-block-51b6bf6870cc4c14b9cc9447fcf6953e"><li>通道 1：PA8，DMA1_Channel2</li></ul><ul class="notion-list notion-list-disc notion-block-d8dfc65be70548a0887f833f0af1e01f"><li>通道 2：PA9，DMA1_Channel3</li></ul><ul class="notion-list notion-list-disc notion-block-190aa448b1af451e9ce3295459404079"><li>通道 ETR：PA12</li></ul></div></details><details class="notion-toggle notion-block-d4c1a38a27a3428c9dbde0b6756a1261"><summary><h4 class="notion-h notion-h3 notion-block-d4c1a38a27a3428c9dbde0b6756a1261" data-id="d4c1a38a27a3428c9dbde0b6756a1261"><span><div id="d4c1a38a27a3428c9dbde0b6756a1261" class="notion-header-anchor"></div><span class="notion-h-title"><b>定时器2 外部通道</b>：</span></span></h4></summary><div><ul class="notion-list notion-list-disc notion-block-bccbb02cadce444d87f4711c892c15d5"><li>通道 1：PA0（重映射 PA15），DMA1_Channel5（如果重映射，需要内部上拉）</li></ul><ul class="notion-list notion-list-disc notion-block-011d54b7e6824c2792339210c0a354e9"><li>通道 2：PA1（重映射 PB3），DMA1_Channel7</li></ul><ul class="notion-list notion-list-disc notion-block-6bdca6fe6d1442e182509f4cbeb4b74b"><li>通道 ETR：PA0（重映射 PA15）</li></ul></div></details><details class="notion-toggle notion-block-abb2831a34ad4f2093c2ea59cd85e445"><summary><h4 class="notion-h notion-h3 notion-block-abb2831a34ad4f2093c2ea59cd85e445" data-id="abb2831a34ad4f2093c2ea59cd85e445"><span><div id="abb2831a34ad4f2093c2ea59cd85e445" class="notion-header-anchor"></div><span class="notion-h-title"><b>定时器3 外部通道</b>：</span></span></h4></summary><div><ul class="notion-list notion-list-disc notion-block-8d077a895be947a598abbd2782cb2123"><li>通道 1：PA6（重映射 PB4），DMA1_Channel6（如果重映射，需要内部上拉）</li></ul><ul class="notion-list notion-list-disc notion-block-c0ec94032160475d84c6eabb7dec1420"><li>通道 2：PA7（重映射 PB5）</li></ul><ul class="notion-list notion-list-disc notion-block-61518e606195455fa26a2fbbefc63ebb"><li>通道 ETR：无</li></ul></div></details><details class="notion-toggle notion-block-d4ba26c025454e4ab158e6bb0233c9f4"><summary><h4 class="notion-h notion-h3 notion-block-d4ba26c025454e4ab158e6bb0233c9f4" data-id="d4ba26c025454e4ab158e6bb0233c9f4"><span><div id="d4ba26c025454e4ab158e6bb0233c9f4" class="notion-header-anchor"></div><span class="notion-h-title"><b>定时器4 外部通道</b>：</span></span></h4></summary><div><ul class="notion-list notion-list-disc notion-block-1c751017572e4ac3b2d141a03892070f"><li>通道 1：PB6，DMA1_Channel1</li></ul><ul class="notion-list notion-list-disc notion-block-3f92020ff26f43418521e4b61479bf45"><li>通道 2：PB7，DMA1_Channel4</li></ul><ul class="notion-list notion-list-disc notion-block-80bf4e7ec2ca45a7b161eb3721039780"><li>通道 ETR：无</li></ul></div></details><details class="notion-toggle notion-block-d2bcbc2f425541eda14a7f5607a95277"><summary><h4 class="notion-h notion-h3 notion-block-d2bcbc2f425541eda14a7f5607a95277" data-id="d2bcbc2f425541eda14a7f5607a95277"><span><div id="d2bcbc2f425541eda14a7f5607a95277" class="notion-header-anchor"></div><span class="notion-h-title">来自江协的定时器基本结构图</span></span></h4></summary><div><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-3beae249742d4311ad94b3e8e2ef76fa"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:100%;max-width:100%;flex-direction:column"><img style="object-fit:cover" src="https://cdn.jsdmirror.com/gh/LZJ-I/picx-images-hosting@main/images/%E5%B5%8C%E5%85%A5%E5%BC%8F%E8%BD%AF%E4%BB%B6%E5%BC%80%E5%8F%91/Post-stm32-hal/34979a47-c6fe-4236-98f8-2b242674c6c4-image.webp?spaceId=3a565fcb-f425-4846-b72a-d32a98183896&amp;t=3beae249-742d-4311-ad94-b3e8e2ef76fa" alt="notion image" loading="lazy" decoding="async"/></div></figure></div></details></div></details><details class="notion-toggle notion-block-0f8679e6c4d24dcf9bb12a4944206629"><summary><h3 class="notion-h notion-h2 notion-block-0f8679e6c4d24dcf9bb12a4944206629" data-id="0f8679e6c4d24dcf9bb12a4944206629"><span><div id="0f8679e6c4d24dcf9bb12a4944206629" class="notion-header-anchor"></div><span class="notion-h-title">二、HAL库：TIM1 外部时钟模式1 轮询方式 按键计数</span></span></h3></summary><div><details class="notion-toggle notion-block-4ceba7954d874ecf9ea261a2d802ebcf"><summary><h4 class="notion-h notion-h3 notion-block-4ceba7954d874ecf9ea261a2d802ebcf" data-id="4ceba7954d874ecf9ea261a2d802ebcf"><span><div id="4ceba7954d874ecf9ea261a2d802ebcf" class="notion-header-anchor"></div><span class="notion-h-title">1. 功能说明</span></span></h4></summary><div><ul class="notion-list notion-list-disc notion-block-252f8ca044ab45a8a7f65cc76230132b"><li>按下按键，定时器计数</li></ul></div></details><details class="notion-toggle notion-block-ca118dd0bd154d649f652e71eeccb380"><summary><h4 class="notion-h notion-h3 notion-block-ca118dd0bd154d649f652e71eeccb380" data-id="ca118dd0bd154d649f652e71eeccb380"><span><div id="ca118dd0bd154d649f652e71eeccb380" class="notion-header-anchor"></div><span class="notion-h-title">2. 注意事项*</span></span></h4></summary><div><ol start="1" class="notion-list notion-list-numbered notion-block-e17bccf50a294a3d8a5c60d9f6f1cfeb" style="list-style-type:decimal"><li>引脚冲突问题</li><ol class="notion-list notion-list-numbered notion-block-e17bccf50a294a3d8a5c60d9f6f1cfeb" style="list-style-type:lower-alpha"><div class="notion-text notion-block-9cc5fd372cfd47c6a62a2a5470a712d9">外部时钟模式1，定时器1：</div><div class="notion-text notion-block-4873a59065c04b5793ad06b25c79b1b8">通道1  PA8     DMA1_Channel2</div><div class="notion-text notion-block-82071364e2d84458b33363c4e5aed4ef">通道2  PA9    DMA1_Channel3</div><div class="notion-text notion-block-a91817015c5c4d9ba5705cd45919ce1d"><b>而串口1的Tx也为PA9</b></div><div class="notion-text notion-block-9801c7c3f1f54845a50c386594658f70"><b>所以要善用重映射功能（会重映射到PB6），避免引脚冲突</b></div><div class="notion-text notion-block-7c4a3523858a4be3833aacb7e42de868"><b>并且在切换不同的通道的时候，注意GPIO口的初始化与上下拉配置</b></div></ol></ol><ol start="2" class="notion-list notion-list-numbered notion-block-3c18e658fe23465fbfeb808ac3fa5125" style="list-style-type:decimal"><li>E<b>D双边沿检测，不过滤波器</b></li></ol><ol start="3" class="notion-list notion-list-numbered notion-block-29e0739644a54155bde31e99489023f6" style="list-style-type:decimal"><li>外部时钟模式1  通往TRGI， TRGI会产生一个<b>触发事件   会置位TIF为1，</b>也就是HAL库的<code class="notion-inline-code"><b>TIM_FLAG_TRIGGER</b></code><b>标志位会置1，我们可以通过判断标志位来进行判断单次的触发事件。</b></li><ol class="notion-list notion-list-numbered notion-block-29e0739644a54155bde31e99489023f6" style="list-style-type:lower-alpha"><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-93e65e77fddc438cb5eee6efea3f914f"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:100%;max-width:100%;flex-direction:column"><img style="object-fit:cover" src="https://cdn.jsdmirror.com/gh/LZJ-I/picx-images-hosting@main/images/%E5%B5%8C%E5%85%A5%E5%BC%8F%E8%BD%AF%E4%BB%B6%E5%BC%80%E5%8F%91/Post-stm32-hal/5f8fcbb2-280d-437c-ac6c-6188eddaa851-image.webp?spaceId=3a565fcb-f425-4846-b72a-d32a98183896&amp;t=93e65e77-fddc-438c-b5ee-e6efea3f914f" alt="notion image" loading="lazy" decoding="async"/></div></figure><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-edd7f64662ea47ebaaa4cdbdb1317214"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:100%;max-width:100%;flex-direction:column"><img style="object-fit:cover" src="https://cdn.jsdmirror.com/gh/LZJ-I/picx-images-hosting@main/images/%E5%B5%8C%E5%85%A5%E5%BC%8F%E8%BD%AF%E4%BB%B6%E5%BC%80%E5%8F%91/Post-stm32-hal/9a80c951-ed29-45ce-ad82-c9482f6fde7e-image.webp?spaceId=3a565fcb-f425-4846-b72a-d32a98183896&amp;t=edd7f646-62ea-47eb-aaa4-cdbdb1317214" alt="notion image" loading="lazy" decoding="async"/></div></figure></ol></ol></div></details></div></details><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-92211e2d28064c64aab1120bf31bb948"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:100%;max-width:100%;flex-direction:column"><img style="object-fit:cover" src="https://cdn.jsdmirror.com/gh/LZJ-I/picx-images-hosting@main/images/%E5%B5%8C%E5%85%A5%E5%BC%8F%E8%BD%AF%E4%BB%B6%E5%BC%80%E5%8F%91/Post-stm32-hal/ea7df47f-eec7-4167-92ed-59661321f1e2-image.webp?spaceId=3a565fcb-f425-4846-b72a-d32a98183896&amp;t=92211e2d-2806-4c64-aab1-120bf31bb948" alt="notion image" loading="lazy" decoding="async"/></div></figure><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-d92d2fcbb1da477e948a760dfb419e5b"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:100%;max-width:100%;flex-direction:column"><img style="object-fit:cover" src="https://cdn.jsdmirror.com/gh/LZJ-I/picx-images-hosting@main/images/%E5%B5%8C%E5%85%A5%E5%BC%8F%E8%BD%AF%E4%BB%B6%E5%BC%80%E5%8F%91/Post-stm32-hal/8cc7e826-e82a-41e3-a16a-3a2870b421e5-image.webp?spaceId=3a565fcb-f425-4846-b72a-d32a98183896&amp;t=d92d2fcb-b1da-477e-948a-760dfb419e5b" alt="notion image" loading="lazy" decoding="async"/></div></figure><ol start="1" class="notion-list notion-list-numbered notion-block-f40453b5eb2d45b9920e20c3c59c58a0" style="list-style-type:decimal"><li>通道1 、2 上的滤波器解释</li><ol class="notion-list notion-list-numbered notion-block-f40453b5eb2d45b9920e20c3c59c58a0" style="list-style-type:lower-alpha"><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-bcce2c7395a142c680da3386b897277c"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:100%;max-width:100%;flex-direction:column"><img style="object-fit:cover" src="https://cdn.jsdmirror.com/gh/LZJ-I/picx-images-hosting@main/images/%E5%B5%8C%E5%85%A5%E5%BC%8F%E8%BD%AF%E4%BB%B6%E5%BC%80%E5%8F%91/Post-stm32-hal/52711141-8210-481b-8e2e-c88dc4359ac0-image.webp?spaceId=3a565fcb-f425-4846-b72a-d32a98183896&amp;t=bcce2c73-95a1-42c6-80da-3386b897277c" alt="notion image" loading="lazy" decoding="async"/></div></figure></ol></ol><details class="notion-toggle notion-block-c4b44d0b583547b9b3bb929e31374afb"><summary><h4 class="notion-h notion-h3 notion-block-c4b44d0b583547b9b3bb929e31374afb" data-id="c4b44d0b583547b9b3bb929e31374afb"><span><div id="c4b44d0b583547b9b3bb929e31374afb" class="notion-header-anchor"></div><span class="notion-h-title">3. 相关函数</span></span></h4></summary><div><ul class="notion-list notion-list-disc notion-block-fd7af0f47b3344f19004aa98507908b7"><li>重映射串口1</li><ul class="notion-list notion-list-disc notion-block-fd7af0f47b3344f19004aa98507908b7"><li><code class="notion-inline-code">__HAL_RCC_AFIO_CLK_ENABLE();</code></li><li><code class="notion-inline-code">__HAL_AFIO_REMAP_USART1_ENABLE();</code></li></ul></ul><ul class="notion-list notion-list-disc notion-block-b72faa59e3824c24bf54b0e0dd14d172"><li><code class="notion-inline-code">TIM_ClockConfigTypeDef</code> 时钟配置总控结构体</li></ul><ul class="notion-list notion-list-disc notion-block-150a2df9a37a4099b659c640cd48bb78"><li>基础的定时器配置初始化（定时器1通道 2举例）</li></ul><ul class="notion-list notion-list-disc notion-block-0ff875368c6145cc81c2b0d281484d41"><li>初始化硬件配置回调函数</li></ul></div></details><div class="notion-blank notion-block-90bf4a9f4b5f4fc2ad81c75c3edc926e"> </div><details class="notion-toggle notion-block-f3cb960049ba4e7b829ae13deaf92939"><summary><h4 class="notion-h notion-h3 notion-block-f3cb960049ba4e7b829ae13deaf92939" data-id="f3cb960049ba4e7b829ae13deaf92939"><span><div id="f3cb960049ba4e7b829ae13deaf92939" class="notion-header-anchor"></div><span class="notion-h-title">4. 程序</span></span></h4></summary><div><details class="notion-toggle notion-block-0a43d5212a294d81b82471e39fa894f5"><summary><h4 class="notion-h notion-h3 notion-block-0a43d5212a294d81b82471e39fa894f5" data-id="0a43d5212a294d81b82471e39fa894f5"><span><div id="0a43d5212a294d81b82471e39fa894f5" class="notion-header-anchor"></div><span class="notion-h-title">time.c</span></span></h4></summary><div></div></details></div></details><div class="notion-text notion-block-03ca16282f644f518244abcc0436cbdb">__HAL_TIM_ENABLE_IT(&amp;tim4, TIM1_UP_IRQn);</div><div class="notion-text notion-block-4cc3183bcf244df2898ce5a1f274a085">HAL_TIM_Base_Start_DMA(&amp;tim4, (uint32_t*)tim4_dmaBuff, 4);</div><div class="notion-text notion-block-a6ffe34da58742d4af527546ea2680b9">}</div><div class="notion-text notion-block-de0b85d75476429e9049338f5ee58863">//定时器 硬件初始化回调函数</div><div class="notion-text notion-block-110cbe65c1f743bc89c811b88ff9cb71">void HAL_TIM_Base_MspInit(TIM_HandleTypeDef *htim)</div><div class="notion-text notion-block-739d3d97ea0048c2bd7c5137ac358711">{</div><div class="notion-text notion-block-c6790a1a67b042db9f91af1038ae72e8">if(htim-&gt;Instance == TIM1){<div class="notion-text-children"><div class="notion-text notion-block-7604ac7df5e74ceabddafa0e73c91021">__HAL_RCC_TIM1_CLK_ENABLE();                //使能时钟</div><div class="notion-text notion-block-9cbd27f96e564b5c9f73e3151a6bf836">__HAL_RCC_GPIOA_CLK_ENABLE();</div><div class="notion-text notion-block-bddd3b5105fd409ab61156f543c57eaf">GPIO_InitTypeDef GPIO_InitType;</div><div class="notion-text notion-block-cea7d545c9374101a133137f019a7aab">GPIO_<a class="notion-link" href="http://InitType.Pin" target="_blank" rel="noopener noreferrer">InitType.Pin</a> = GPIO_PIN_9;</div><div class="notion-text notion-block-79ca7eab181440b5859af9ccb77e42e7">GPIO_InitType.Mode = GPIO_MODE_AF_INPUT;</div><div class="notion-text notion-block-f87b58dbe41d48419c15abf7aed4c01b">GPIO_InitType.Pull = GPIO_PULLUP;           //上拉</div><div class="notion-text notion-block-1b1660482bd84f02a58b460be6e138cc">GPIO_InitType.Speed = GPIO_SPEED_FREQ_MEDIUM;</div><div class="notion-text notion-block-a8aaa4ff898c4877b23203c74ec874b2">HAL_GPIO_Init(GPIOA,&amp;GPIO_InitType);</div></div></div><div class="notion-text notion-block-4687c60247e947f0a6e9d12a7f40a313">//        __HAL_RCC_DMA1_CLK_ENABLE();</div><div class="notion-text notion-block-bd061e018f49408580ef2442f7f36e5a">//        </div><div class="notion-text notion-block-ab91076320a64ea6acb2b122e385e3f3">//        HAL_NVIC_SetPriority(TIM1_UP_IRQn, 3, 0);   //配置、打开 更新中断</div><div class="notion-text notion-block-64e640970b2b415a83b211b9f8f3a765">//        HAL_NVIC_EnableIRQ(TIM1_UP_IRQn);</div><div class="notion-text notion-block-c49a127cab784061a694c6318b98afc4">//        </div><div class="notion-text notion-block-3374d19168974efaa2d7ce5c71802379">//        /<em> DMA配置 </em>/</div><div class="notion-text notion-block-c5a081bb29a541c083c34c94612bc47a">//        tim1_dmaup.Instance = DMA1_Channel5;    </div><div class="notion-text notion-block-7581df4fa53741fa8516dbe656173261">//        tim1_dmaup.Init.Direction = DMA_MEMORY_TO_PERIPH;   //存储区到外设</div><div class="notion-text notion-block-b16f2014b6b74cbb81ff81057ac0aae6">//        tim1_dmaup.Init.MemInc = DMA_MINC_ENABLE;           //存储区递增</div><div class="notion-text notion-block-7a28c5cea5a946c392cf17a1e6e10658">//        tim1_dmaup.Init.PeriphInc = DMA_PINC_DISABLE;       //外设不递增</div><div class="notion-text notion-block-9eea24d3fba044a1a47b89e2c8df8021">//        tim1_dmaup.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD;     //半字 2字节</div><div class="notion-text notion-block-4fc11b0324204871a37e42d3ec9eae12">//        tim1_dmaup.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD;</div><div class="notion-text notion-block-5bb179f82bfa445395ff5f13a15d71eb">//        tim1_dmaup.Init.Mode = DMA_CIRCULAR;  //循环模式</div><div class="notion-text notion-block-01e8702fd6f14adf92ad58485a054e1a">//        tim1_dmaup.Init.Priority = DMA_PRIORITY_MEDIUM; </div><div class="notion-text notion-block-3f2e907e23f94cf1b8d25b9f7ecb4746">//        __HAL_LINKDMA(&amp;tim1, hdma[TIM_DMA_ID_UPDATE], tim1_dmaup);</div><div class="notion-text notion-block-9d929d934c474ecf83795cb0a8e7bdaf">//        HAL_DMA_Init(&amp;tim1_dmaup);</div><div class="notion-text notion-block-a0f6463035ba4f6fa8d0b0257704562d">//        </div><div class="notion-text notion-block-af060eae415a47ddaaadeddf5bf1e004">//        HAL_NVIC_SetPriority(DMA1_Channel5_IRQn, 3, 0);   //配置、打开 通道5的中断</div><div class="notion-text notion-block-c001b54c4fb84607884695c2857bba3a">//        HAL_NVIC_EnableIRQ(DMA1_Channel5_IRQn);</div><div class="notion-text notion-block-2defaf86f7f447ec98da7662ed272655">//        </div><div class="notion-text notion-block-771647d701554220ac6eff04c73480f9">}else if(htim-&gt;Instance == TIM2){<div class="notion-text-children"><div class="notion-text notion-block-f7f45ca7e2df4628aef46716f2563549">__HAL_RCC_TIM2_CLK_ENABLE();</div><div class="notion-text notion-block-eab61888a7a44aafb84cabd480dbfab8">__HAL_RCC_DMA1_CLK_ENABLE();</div><div class="notion-text notion-block-30face8bffaa4874877d45d66354931d">HAL_NVIC_SetPriority(TIM2_IRQn, 3, 0);</div><div class="notion-text notion-block-218e1729cf4445fb93f77c350e56b5cf">HAL_NVIC_EnableIRQ(TIM2_IRQn);</div><div class="notion-text notion-block-dc16dbc13c614dbc98befa2c3754ab86">/<em> DMA配置 </em>/</div><div class="notion-text notion-block-f80110d717f14e188fa05720f6b4257a">tim2_dmaup.Instance = DMA1_Channel2;    </div><div class="notion-text notion-block-8836e8e72a324399bc2e8a91722198ad">tim2_dmaup.Init.Direction = DMA_MEMORY_TO_PERIPH;</div><div class="notion-text notion-block-6638c8de23094d6fb09e6b25c6e0afba">tim2_dmaup.Init.MemInc = DMA_MINC_ENABLE;</div><div class="notion-text notion-block-3f64aa12e3044fa287e1ddda0592b02e">tim2_dmaup.Init.PeriphInc = DMA_PINC_DISABLE;</div><div class="notion-text notion-block-7c22ba9f6dcf43bca785923d0ba46e07">tim2_dmaup.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD;</div><div class="notion-text notion-block-0a1f771dac7b4e0f8f17a97a028dd611">tim2_dmaup.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD;</div><div class="notion-text notion-block-ec0efe880cb84314a2f91f7773a85ede">tim2_dmaup.Init.Mode = DMA_CIRCULAR;  //循环模式</div><div class="notion-text notion-block-cfa9693ef36b4154a842098045e0fdc1">tim2_dmaup.Init.Priority = DMA_PRIORITY_MEDIUM; </div><div class="notion-text notion-block-1861660ac12542bc8b186393349706f9">__HAL_LINKDMA(&amp;tim2, hdma[TIM_DMA_ID_UPDATE], tim2_dmaup);</div><div class="notion-text notion-block-26964426cad64623864b06caddb5cb58">HAL_DMA_Init(&amp;tim2_dmaup);</div><div class="notion-text notion-block-eded58eb973747248f9f78e344b6657f">HAL_NVIC_SetPriority(DMA1_Channel2_IRQn, 3, 0);   //配置、打开 通道5的中断</div><div class="notion-text notion-block-60ec8b84bc4a44a78c567758cd383ac5">HAL_NVIC_EnableIRQ(DMA1_Channel2_IRQn);</div></div></div><div class="notion-text notion-block-8d343a785b794f3b97b47c223e0e2979">}else if(htim-&gt;Instance == TIM3){<div class="notion-text-children"><div class="notion-text notion-block-1856b861459040fea5318d9361a29f85">__HAL_RCC_TIM3_CLK_ENABLE();</div><div class="notion-text notion-block-9839bd7c642a439794af7ae29bfbee20">__HAL_RCC_DMA1_CLK_ENABLE();</div><div class="notion-text notion-block-109ba2ed4be24a37b812a4e066cf7ce7">HAL_NVIC_SetPriority(TIM3_IRQn, 3, 0);</div><div class="notion-text notion-block-949b978d415742188aa29a6998658cfe">HAL_NVIC_EnableIRQ(TIM3_IRQn);</div><div class="notion-text notion-block-e0793ff24e8544b486ea24e09ceae4fa">/<em> DMA配置 </em>/</div><div class="notion-text notion-block-4b38e76488444f12a234c4a6ed827733">tim3_dmaup.Instance = DMA1_Channel3;    </div><div class="notion-text notion-block-8eaa3fa24e494ee1a50a78e8932812f2">tim3_dmaup.Init.Direction = DMA_MEMORY_TO_PERIPH;</div><div class="notion-text notion-block-c600b47111ba4d6fbd6db95b25accb84">tim3_dmaup.Init.MemInc = DMA_MINC_ENABLE;</div><div class="notion-text notion-block-b5e01e1c2b9845afb1423fb12c477e20">tim3_dmaup.Init.PeriphInc = DMA_PINC_DISABLE;</div><div class="notion-text notion-block-6f78482c56a5422c8733674a54ecf79b">tim3_dmaup.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD;</div><div class="notion-text notion-block-3775dac8409c4c02a69aabb0704dfa1e">tim3_dmaup.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD;</div><div class="notion-text notion-block-d92e433b279f45c8913b23725865a76c">tim3_dmaup.Init.Mode = DMA_CIRCULAR;  //循环模式</div><div class="notion-text notion-block-a4a326451cde449cb5ee544b85753135">tim3_dmaup.Init.Priority = DMA_PRIORITY_MEDIUM; </div><div class="notion-text notion-block-7b37c2fadede404cb6270cccfb024d95">__HAL_LINKDMA(&amp;tim3, hdma[TIM_DMA_ID_UPDATE], tim3_dmaup);</div><div class="notion-text notion-block-29d0a8703d66469a9a58ce76450cfa39">HAL_DMA_Init(&amp;tim3_dmaup);</div><div class="notion-text notion-block-a3bb2d50a1db43c88eb67c0b7059b355">HAL_NVIC_SetPriority(DMA1_Channel3_IRQn, 3, 0);   //配置、打开 通道5的中断</div><div class="notion-text notion-block-4d46a973fb3c43f1b04791b7e49cb3ef">HAL_NVIC_EnableIRQ(DMA1_Channel3_IRQn);</div></div></div><div class="notion-text notion-block-64f86110e2e84cf2a2e2b006efbdbb43">}else if(htim-&gt;Instance == TIM4){<div class="notion-text-children"><div class="notion-text notion-block-eeecc499fc904129a17b44b66ec8ddf1">__HAL_RCC_TIM4_CLK_ENABLE();</div><div class="notion-text notion-block-72819c6421c0443b92576cec797c130c">__HAL_RCC_DMA1_CLK_ENABLE();</div><div class="notion-text notion-block-0f0f5b5a8a914c468bdc21c51902d436">HAL_NVIC_SetPriority(TIM4_IRQn, 3, 0);</div><div class="notion-text notion-block-e70603e4a5964d26bdee66959d9de2e6">HAL_NVIC_EnableIRQ(TIM4_IRQn);</div><div class="notion-text notion-block-0074db728e5d45668f8d2a945985848f">/<em> DMA配置 </em>/</div><div class="notion-text notion-block-d27e64ea134d433c995ba5240689e1b9">tim4_dmaup.Instance = DMA1_Channel7;    </div><div class="notion-text notion-block-10fca66e7ad44b94b261e7b5343f1ed2">tim4_dmaup.Init.Direction = DMA_MEMORY_TO_PERIPH;</div><div class="notion-text notion-block-23b288991e0749afb141b28b5f94e4e9">tim4_dmaup.Init.MemInc = DMA_MINC_ENABLE;</div><div class="notion-text notion-block-293d68d63d284b78b68624bd33973e92">tim4_dmaup.Init.PeriphInc = DMA_PINC_DISABLE;</div><div class="notion-text notion-block-5567f1c1027341dfbe5417e63f1719e5">tim4_dmaup.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD;</div><div class="notion-text notion-block-7dbaa631ea3f4c7ea63383dd82782c28">tim4_dmaup.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD;</div><div class="notion-text notion-block-37e72fae03cb4d5884be4bb51d345952">tim4_dmaup.Init.Mode = DMA_CIRCULAR;  //循环模式</div><div class="notion-text notion-block-790d9326f8364ab49b51d8d757c885f5">tim4_dmaup.Init.Priority = DMA_PRIORITY_MEDIUM; </div><div class="notion-text notion-block-b0dc62fe9b394f76bdf10780016606dc">__HAL_LINKDMA(&amp;tim4, hdma[TIM_DMA_ID_UPDATE], tim4_dmaup);</div><div class="notion-text notion-block-03c8ffae03e24e3097883a9220c303c3">HAL_DMA_Init(&amp;tim4_dmaup);</div><div class="notion-text notion-block-e1c13cf64a99421dad858854388cf6a1">HAL_NVIC_SetPriority(DMA1_Channel7_IRQn, 3, 0);   //配置、打开 通道5的中断</div><div class="notion-text notion-block-09c4f3dc59e94d2c8bd258264f83fda2">HAL_NVIC_EnableIRQ(DMA1_Channel7_IRQn);</div></div></div><div class="notion-text notion-block-de6a8cb9817d4e64ae07b59bfb23e86e">}</div><div class="notion-text notion-block-089117568a0a4dc59252203e9ef7fa3b">}</div><div class="notion-text notion-block-59235db6b153405285772d917804ace4">//定时器 硬件 De 回调函数</div><div class="notion-text notion-block-2276f9c4f9b64c88a66d0141223d942b">void HAL_TIM_Base_MspDeInit(TIM_HandleTypeDef *htim)</div><div class="notion-text notion-block-2f995fbe5a374beb9a1be662904d2752">{</div><div class="notion-text notion-block-1af0f9a1e1484f46bdd4c0f2b79894d4">if(htim-&gt;Instance == TIM1){<div class="notion-text-children"><div class="notion-text notion-block-0d8a193fe30a41c289d6e44e37f2189a">__HAL_RCC_TIM1_CLK_DISABLE();</div></div></div><div class="notion-text notion-block-aaa41f2a9dc54fd7adbe65405df1736f">}else if(htim-&gt;Instance == TIM2){<div class="notion-text-children"><div class="notion-text notion-block-4e51c276ecb14b11ae66e3c55e38faf6">__HAL_RCC_TIM2_CLK_DISABLE();</div></div></div><div class="notion-text notion-block-9669d921d731445f8b716e7aebe81a3a">}else if(htim-&gt;Instance == TIM3){<div class="notion-text-children"><div class="notion-text notion-block-9564184a7d9b48f085daeb29aedbef0a">__HAL_RCC_TIM3_CLK_DISABLE();</div></div></div><div class="notion-text notion-block-66f3c60e9b1b4b8d8ab4e4eaffde4eca">}else if(htim-&gt;Instance == TIM4){<div class="notion-text-children"><div class="notion-text notion-block-ffa51b7a0e6a49aaa5b9f80e22b25b32">__HAL_RCC_TIM4_CLK_DISABLE();</div></div></div><div class="notion-text notion-block-997749288a404be491ffe4e22360e52f">}    </div><div class="notion-text notion-block-d6b3755b809c4fb38afda6600dad3b3f">}</div><div class="notion-text notion-block-68aaa87eecfa4be9bcf90c0965a79517">//更新中断  回调函数(同时也是DMA完成的回调函数)</div><div class="notion-text notion-block-832e78762544461c9dfa2b5de954fbe4">uint16_t time1 = 1;</div><div class="notion-text notion-block-865401dc21b548e89bc5e0ff98f77aaf">uint16_t time2 = 1; </div><div class="notion-text notion-block-e06d95c819054213bffc2283bc3a0da5">uint16_t time3 = 1;</div><div class="notion-text notion-block-daf961e930dd4faeb8f2dd6574f035f9">uint16_t time4 = 1;</div><div class="notion-text notion-block-1a78d6b66bfe4f90aa5560b32eae5c46">void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)</div><div class="notion-text notion-block-d1cb5d4fe39c48069dd8136f98a78f56">{    </div><div class="notion-text notion-block-cf973dd225fa4816943a9b14c6f79f35">if(htim-&gt;Instance == TIM1){<div class="notion-text-children"><div class="notion-text notion-block-7ea84a2f74d34358b5f2c65dedf07253">/<em> 判断TIM是否为Ready状态，如果是 则是DMA完成中断进入的回调函数 </em>/</div><div class="notion-text notion-block-d9237d32fd5f426facbefa6cd8e3e224">if(htim-&gt;State  == HAL_DMA_STATE_READY){<div class="notion-text-children"><div class="notion-text notion-block-cc32fdaa3b8241eb84a657e34c3fbd40">U1_Printf(&quot;DMA1 完成中断rn&quot;);</div><div class="notion-text notion-block-f85f1ac8907e4b6fb3efbc673787df5e">htim-&gt;State = HAL_TIM_STATE_BUSY;           //设置定时器 BUSY状态</div></div></div><div class="notion-text notion-block-6ef3ff1f9edb4bd4ac23a04ea80f777c">}else{<div class="notion-text-children"><div class="notion-text notion-block-9aba07ea0f9d4c55822ef1f6f5c34435">U1_Printf(&quot;定时器 1 定时时间:%drn&quot;,time1++);</div></div></div><div class="notion-text notion-block-9f05a3618ff04bbab523a26234e43300">}</div></div></div><div class="notion-text notion-block-a98a6b4989a54f728e4a1b685cf8d7d4">}else if(htim-&gt;Instance == TIM2){<div class="notion-text-children"><div class="notion-text notion-block-8d525efc90af4e41a981f9db26b6ede1">if(htim-&gt;State  == HAL_DMA_STATE_READY){<div class="notion-text-children"><div class="notion-text notion-block-5c98e01eba524ab99799c4c7d6d398fc">U1_Printf(&quot;DMA2 完成中断rn&quot;);</div><div class="notion-text notion-block-dd20e161b71e4773b18c4f8597dd3f0f">htim-&gt;State = HAL_TIM_STATE_BUSY;           //设置定时器 BUSY状态</div></div></div><div class="notion-text notion-block-b8e416cb87274c9aa16044725e448372">}else{<div class="notion-text-children"><div class="notion-text notion-block-d4554ae48bf349f8a4b31b40d194d8a8">U1_Printf(&quot;定时器 2 定时时间:%drn&quot;,time2++);</div></div></div><div class="notion-text notion-block-bb3e0f6b94944b3d965e9037f90f8408">}</div></div></div><div class="notion-text notion-block-974cbaa4dc1543deaa7121b9d12e0553">}else if(htim-&gt;Instance == TIM3){<div class="notion-text-children"><div class="notion-text notion-block-319b45a00306461586a81c7d19bf7a6a">if(htim-&gt;State  == HAL_DMA_STATE_READY){<div class="notion-text-children"><div class="notion-text notion-block-9ae8584a8310413fa914e7f6e19dfa04">U1_Printf(&quot;DMA3 完成中断rn&quot;);</div><div class="notion-text notion-block-8ff2437ee4e741c6aa47792d6dc5fafc">htim-&gt;State = HAL_TIM_STATE_BUSY;           //设置定时器 BUSY状态</div></div></div><div class="notion-text notion-block-4d00a76865db4c108706a4eb72edafd1">}else{<div class="notion-text-children"><div class="notion-text notion-block-bc9e6793177544cbaed12102b2616479">U1_Printf(&quot;定时器 3 定时时间:%drn&quot;,time3++);</div></div></div><div class="notion-text notion-block-987ff5303b8d40f4a1ef4e2477377ddf">}</div></div></div><div class="notion-text notion-block-7b6b2d6c34144d1c99bb725170591860">}else if(htim-&gt;Instance == TIM4){<div class="notion-text-children"><div class="notion-text notion-block-b35596a86a294f6bb791d2009a619bdd">if(htim-&gt;State  == HAL_DMA_STATE_READY){<div class="notion-text-children"><div class="notion-text notion-block-1367c70001d04cc494ee38f8a4d357f5">U1_Printf(&quot;DMA4 完成中断rn&quot;);</div><div class="notion-text notion-block-5c855b4cec1f4ca9a0d089e37d5eb3b1">htim-&gt;State = HAL_TIM_STATE_BUSY;           //设置定时器 BUSY状态</div><div class="notion-text notion-block-80f08a5967634ba49a4d7c5f49c724f5">}else{<div class="notion-text-children"><div class="notion-text notion-block-f8a79ce728f44011ad301c04f01f456f">U1_Printf(&quot;定时器 4 定时时间:%drn&quot;,time4++);</div></div></div><div class="notion-text notion-block-a8f9e2789df4461baec3a8ccce312dcd">}</div><div class="notion-text notion-block-80da825a7cbb40e2beee6bd304faf374">}</div></div></div></div></div><div class="notion-text notion-block-771a85b782ff4e16ac1c9bf35dfb1a35">}</div><div class="notion-text notion-block-654796dcb7e24e12bea84fc5d445beee">//DMA 半完成回调函数</div><div class="notion-text notion-block-3c8b92ba52f3454186f909ffe8c561bd">void HAL_TIM_PeriodElapsedHalfCpltCallback(TIM_HandleTypeDef *htim)</div><div class="notion-text notion-block-e00b542bd6fd462691b14c91cec59e00">{</div><div class="notion-text notion-block-bbf176cb738e43558b216920fbbfda24">if(htim-&gt;Instance == TIM1){<div class="notion-text-children"><div class="notion-text notion-block-88606f8ca7b24b5abf6a83b31bcaf523">U1_Printf(&quot;定时器 1 DMA半完成中断rn&quot;);</div><div class="notion-text notion-block-c8e7e728ab42424bb7059425ee0a3f1b">htim-&gt;State = HAL_TIM_STATE_BUSY;           //设置定时器 BUSY状态</div></div></div><div class="notion-text notion-block-e6cbb5dc98cc44e3a55c9b9779379b42">}else if(htim-&gt;Instance == TIM2){<div class="notion-text-children"><div class="notion-text notion-block-fef079373e234dc1901d3bca4ece62d9">U1_Printf(&quot;定时器 2 DMA半完成中断rn&quot;);</div><div class="notion-text notion-block-e37d470ba5a44254867ca114740c5424">htim-&gt;State = HAL_TIM_STATE_BUSY;           //设置定时器 BUSY状态</div></div></div><div class="notion-text notion-block-3f6c1d04cf1f467296dcec669afd8aa0">}else if(htim-&gt;Instance == TIM3){<div class="notion-text-children"><div class="notion-text notion-block-0886662995894210a9a1b4efbf3aed4d">U1_Printf(&quot;定时器 3 DMA半完成中断rn&quot;);</div><div class="notion-text notion-block-66741bac61004c9b9b80171ca3f66e2d">htim-&gt;State = HAL_TIM_STATE_BUSY;           //设置定时器 BUSY状态</div></div></div><div class="notion-text notion-block-e9c49a3625bd400db76a60705fbe3f57">}else if(htim-&gt;Instance == TIM4){<div class="notion-text-children"><div class="notion-text notion-block-94792240b5dd4f04b507a36b06b018d0">U1_Printf(&quot;定时器 4 DMA半完成中断rn&quot;);</div><div class="notion-text notion-block-e2d5c8095940418a8f439eafcb9b2b85">htim-&gt;State = HAL_TIM_STATE_BUSY;           //设置定时器 BUSY状态</div></div></div><div class="notion-text notion-block-99eeb226a88140fea06610d9c6734f0b">}</div><div class="notion-text notion-block-b24df6f9cbc4421089124c3bdd66f012">}<div class="notion-text-children"><details class="notion-toggle notion-block-07b1c477638846b5adacc55aea19a934"><summary><h4 class="notion-h notion-h3 notion-block-07b1c477638846b5adacc55aea19a934" data-id="07b1c477638846b5adacc55aea19a934"><span><div id="07b1c477638846b5adacc55aea19a934" class="notion-header-anchor"></div><span class="notion-h-title">time.h</span></span></h4></summary><div><div class="notion-text notion-block-3bd0f1589bba4dd29077642fa0fd962f">#ifndef __TIME_H</div><div class="notion-text notion-block-476d9572def74c22a8f18c00091025db">#define __TIME_H</div><div class="notion-text notion-block-b50eee3dd059432b908b64d1c7de7aac">#include &quot;uart.h&quot;</div><div class="notion-text notion-block-46d6a5093ca74647b294183c4293762f">/<em> 对外声明总控结构体 </em>/</div><div class="notion-text notion-block-46529845349f4970b43684c853366b6e">extern TIM_HandleTypeDef tim1;</div><div class="notion-text notion-block-dcfb6df15ae842d2a7fce45d62a9cb42">extern TIM_HandleTypeDef tim2;</div><div class="notion-text notion-block-5fb89e7192d94dd28ad0c3c3c6a1e362">extern TIM_HandleTypeDef tim3;</div><div class="notion-text notion-block-3bde386eaad346f792f58e57c8e1c018">extern TIM_HandleTypeDef tim4;</div><div class="notion-text notion-block-4b9934dac7dd42afa504fa4587bc467b">extern DMA_HandleTypeDef tim1_dmaup;</div><div class="notion-text notion-block-36bb6bebfc7146b6a2f1054f99fa0456">extern DMA_HandleTypeDef tim2_dmaup;</div><div class="notion-text notion-block-4612bdf7024d4ea2a3dfac1bb1983b63">extern DMA_HandleTypeDef tim3_dmaup;</div><div class="notion-text notion-block-a076c78445764c0ea4a826472d00e74e">extern DMA_HandleTypeDef tim4_dmaup;</div><div class="notion-text notion-block-2a4c2c9de39948e19b7b96ade28c650b">/<em> 初始化函数 </em>/</div><div class="notion-text notion-block-daaf0ccffd014c538b20d221be5bd1a8">void Timer1_Init(uint16_t arr, uint16_t psc, uint8_t rep);</div><div class="notion-text notion-block-4e5d44b7c85443d3867158a88a493c94">void Timer2_Init(uint16_t arr, uint16_t psc);</div><div class="notion-text notion-block-e2f045fffea7414da83af17513e7646b">void Timer3_Init(uint16_t arr, uint16_t psc);</div><div class="notion-text notion-block-5ae56a4fa55c48559473bf0d0f6c6640">void Timer4_Init(uint16_t arr, uint16_t psc);</div><div class="notion-text notion-block-517c5b870a434e0fb1225f6183d78d73">#endif</div><details class="notion-toggle notion-block-608a0000fbe2496aac1d50fcd034af80"><summary><h4 class="notion-h notion-h3 notion-block-608a0000fbe2496aac1d50fcd034af80" data-id="608a0000fbe2496aac1d50fcd034af80"><span><div id="608a0000fbe2496aac1d50fcd034af80" class="notion-header-anchor"></div><span class="notion-h-title">main.c</span></span></h4></summary><div><div class="notion-text notion-block-698180739ebc4ffd8b3f1275d2986447">while(1){<div class="notion-text-children"><div class="notion-text notion-block-cbaf4e3ffd634877b666e9936ec30016">/<em> 获取更新标志位 </em>/</div><div class="notion-text notion-block-9f1c965e0b6e4892998a068fcfda47f9">if(__HAL_TIM_GET_FLAG(&amp;tim1, TIM_FLAG_UPDATE)){<div class="notion-text-children"><div class="notion-text notion-block-4fa8ae089f814903bd73eec3c5d29cd7">__HAL_TIM_CLEAR_FLAG(&amp;tim1, TIM_FLAG_UPDATE);   ///清除标志位</div><div class="notion-text notion-block-4092b69a8eb546258277d8e685e5ef21">U1_Printf(&quot;定时器 1 更新事件rn&quot;);</div></div></div><div class="notion-text notion-block-dc808880056d44b9acdefac097c25f83">}</div><div class="notion-text notion-block-71a86958dd614a5189785ee9d5b7b222">if(__HAL_TIM_GET_FLAG(&amp;tim1, TIM_FLAG_TRIGGER)){<div class="notion-text-children"><div class="notion-text notion-block-dcaff61d6f384b9b89045afa2d96b12c">__HAL_TIM_CLEAR_FLAG(&amp;tim1, TIM_FLAG_TRIGGER);   ///清除标志位</div><div class="notion-text notion-block-d58a84a280414a2bb97a281d363dd9ac">U1_Printf(&quot;定时器 1 触发事件:%drn&quot;, __HAL_TIM_GET_COUNTER(&amp;tim1));  //输出当前计数值</div></div></div><div class="notion-text notion-block-123a0607b3024b1dba4f472545b7c908">}</div><div class="notion-text notion-block-42ec2a81e0134b65bd661f82724c1a26">}</div></div></div></div></details></div></details></div></div></div></details><details class="notion-toggle notion-block-6e34ef3678874fb082c6dbb266386ccb"><summary><h3 class="notion-h notion-h2 notion-h-indent-1 notion-block-6e34ef3678874fb082c6dbb266386ccb" data-id="6e34ef3678874fb082c6dbb266386ccb"><span><div id="6e34ef3678874fb082c6dbb266386ccb" class="notion-header-anchor"></div><span class="notion-h-title">三、HAL库：TIM1 外部模式1 ETR通道 轮询方式 按键计数</span></span></h3></summary><div><details class="notion-toggle notion-block-374933aa62044a42b3885a29faeb3c2b"><summary><h4 class="notion-h notion-h3 notion-block-374933aa62044a42b3885a29faeb3c2b" data-id="374933aa62044a42b3885a29faeb3c2b"><span><div id="374933aa62044a42b3885a29faeb3c2b" class="notion-header-anchor"></div><span class="notion-h-title">1. 注意事项*</span></span></h4></summary><div><ol start="1" class="notion-list notion-list-numbered notion-block-6d31ffc824284f2ab309e86b0fd55b7c" style="list-style-type:decimal"><li>ETR的通道有专门的预分频器，需要按需配置预分频器<code class="notion-inline-code">TIM_CLOCKPRESCALER_DIV1/2/4/8</code></li><ol class="notion-list notion-list-numbered notion-block-6d31ffc824284f2ab309e86b0fd55b7c" style="list-style-type:lower-alpha"><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-05b28081b8b141d28fe6ce125f396309"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:100%;max-width:100%;flex-direction:column"><img style="object-fit:cover" src="https://cdn.jsdmirror.com/gh/LZJ-I/picx-images-hosting@main/images/%E5%B5%8C%E5%85%A5%E5%BC%8F%E8%BD%AF%E4%BB%B6%E5%BC%80%E5%8F%91/Post-stm32-hal/7785269f-ba32-4b87-a18f-9630686f8f7b-image.webp?spaceId=3a565fcb-f425-4846-b72a-d32a98183896&amp;t=05b28081-b8b1-41d2-8fe6-ce125f396309" alt="notion image" loading="lazy" decoding="async"/></div></figure></ol></ol><ol start="2" class="notion-list notion-list-numbered notion-block-8198be0263224181ad594897f8693c4e" style="list-style-type:decimal"><li><b>特别注意：</b>当设置ETR的预分频器为2、4、8分频时，<b>如果</b>ETR的有效电平（取决于是否ETR反向）与IO的引脚默认电平<b>不匹配</b>，那么复位后首次按下会直接产生一次触发事件，后续正常。</li><ol class="notion-list notion-list-numbered notion-block-8198be0263224181ad594897f8693c4e" style="list-style-type:lower-alpha"><ul class="notion-list notion-list-disc notion-block-e679a9555960487ab5007f89ec2d6dc9"><li><b>解决办法：</b>匹配IO与ETR的有效电平 （例如IO下拉，ETR有效电平为低电平，也就是ETR反转。那么就能匹配默认电平与ETR，就不会出现上述错误）</li></ul></ol></ol><ol start="3" class="notion-list notion-list-numbered notion-block-a8825ebbc57948d6a98ce0b03b1c0d23" style="list-style-type:decimal"><li>特别注意：如果通道的 分频因子 加大（同时加大分频因子），会使得检测变慢，也就是频率和带宽就变低了，变得更严格。<b>会导致复位之后立刻产生一次触发事件。</b></li><ol class="notion-list notion-list-numbered notion-block-a8825ebbc57948d6a98ce0b03b1c0d23" style="list-style-type:lower-alpha"><ul class="notion-list notion-list-disc notion-block-af046b95bcbd4cc68cca57948158e702"><li><b>解决办法：</b>在启动定时器<b>之前，</b></li><ul class="notion-list notion-list-disc notion-block-af046b95bcbd4cc68cca57948158e702"><div class="notion-text notion-block-3966208c46704783be6649326e86cbea"><b>先进行一段时间的延时操作，再清除TIm的Counter和TRIG触发事件标志位</b></div><div class="notion-text notion-block-209dca8d027849ceb3bc8c76a1fd22d0">这样就能保证在启动时不会有任何触发事件产生（添加延时的原因是因为程序运行太快了，得等段时间反映。）</div></ul></ul></ol></ol></div></details><details class="notion-toggle notion-block-7119ee212b0d46c8951c0d6514f60ca2"><summary><h4 class="notion-h notion-h3 notion-block-7119ee212b0d46c8951c0d6514f60ca2" data-id="7119ee212b0d46c8951c0d6514f60ca2"><span><div id="7119ee212b0d46c8951c0d6514f60ca2" class="notion-header-anchor"></div><span class="notion-h-title">2. 相关函数</span></span></h4></summary><div><ul class="notion-list notion-list-disc notion-block-6600a532969e46f1be102a62872dadb6"><li><code class="notion-inline-code">TIM_ClockConfigTypeDef</code> 时钟配置总控结构体</li></ul><ul class="notion-list notion-list-disc notion-block-9dde96019a1348e59b9b51b133a9ee4f"><li>基础的定时器配置初始化（定时器1通道 2举例）</li></ul></div></details><div class="notion-text notion-block-7f657f25350549e39f273bcf3db406dd">//定时器 1</div><div class="notion-text notion-block-2c8bb6a774e64f3fba2accedd74329b3">void Timer1_Init(uint16_t arr, uint16_t psc, uint8_t rep)</div><div class="notion-text notion-block-e92d60b5dd0c4dcba61ed86823c59593">{</div><div class="notion-text notion-block-1f7c46bc21c2419392409246295262ea">tim1.Instance = TIM1;                                        // 实例</div><div class="notion-text notion-block-d719cc328c0a496980760ea123de3a42">tim1.Init.Period = arr;                                      // 重装载值</div><div class="notion-text notion-block-654dec7ba7e3407fb0f892a3ae9df941">tim1.Init.Prescaler = psc;                                   // 分频系数</div><div class="notion-text notion-block-dffd695d0d1449079fa7cfb5a4aec042">tim1.Init.CounterMode = TIM_COUNTERMODE_UP;                  // 计数模式</div><div class="notion-text notion-block-a9b2c44d7db7448f8f885b49de399360">tim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;            // 分频因子</div><div class="notion-text notion-block-1673c61a0ed34fb48b318ffaa721f4e0">tim1.Init.RepetitionCounter = rep;                           // 重复计数值</div><div class="notion-text notion-block-7efed58beb3f47d09aac69169c1378cb">tim1.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;// 自动重装载值 预装载使能位（影子寄存器）</div><div class="notion-text notion-block-c5d732b5f4ab455da44a244985f32200">HAL_TIM_Base_Init(&amp;tim1);                       //初始化定时器</div><div class="notion-text notion-block-517ca78be2184af0bcdfd9433a0bcd79">__HAL_TIM_CLEAR_FLAG(&amp;tim1, TIM_FLAG_UPDATE);   //手动 清除 定时器 更新事件</div><div class="notion-text notion-block-d2bc5827f7684ba9a08142d360a54350">/<em> 外部模式1 ETR通道  </em>/</div><div class="notion-text notion-block-ef465e64a7aa429cb7d486cc37653e0f">tim1_clock.ClockSource = TIM_CLOCKSOURCE_ETRMODE1; //通道1 ETR</div><div class="notion-text notion-block-51f06e0a7d5243e9911c0f1ae56beee1">tim1_clock.ClockPolarity = TIM_CLOCKPOLARITY_INVERTED;    //ETR反向 （低电平或下降沿有效）  为了匹配IO和ETR，防止复位后按一下就产生触发事件</div><div class="notion-text notion-block-7d9a64ffa81e4294a3775d92880d41ca">//tim1_clock.ClockPolarity = TIM_CLOCKPOLARITY_NOINVERTED;    //ETR不反向 （高电平或上升沿有效）</div><div class="notion-text notion-block-cafd81a34aac4b39a00695eebf99ff7c">tim1_clock.ClockPrescaler = TIM_CLOCKPRESCALER_DIV4;      //ETR的预分频器配置</div><div class="notion-text notion-block-ff6063efb3924bd89c47c41f9858705b">tim1_clock.ClockFilter = 0x03;                          //滤波（注意是外部时钟的波）</div><div class="notion-text notion-block-ca28b51c196b4750ad90602469ac7a9c">HAL_TIM_ConfigClockSource(&amp;tim1, &amp;tim1_clock);  //初始化定时器时钟配置</div><div class="notion-text notion-block-d33451328055408b9bf9c535ff6782dd">/<em> 防止加大分频因子或滤波强度而导致的 复位后产生触发事件 </em>/</div><div class="notion-text notion-block-a39e3f206e4e401983062b3aac016bdc">HAL_Delay(50);</div><div class="notion-text notion-block-ee2052285bff420183026404c8df4865">__HAL_TIM_CLEAR_FLAG(&amp;tim1, TIM_FLAG_TRIGGER);   ///清除触发事件标志位</div><div class="notion-text notion-block-abee7c53095d4be7a0ba096d4f88fc9f">__HAL_TIM_SET_COUNTER(&amp;tim1, 0);                 // 清除计数值</div><div class="notion-text notion-block-866650ac2bfc45da8cd9a56c324bf64a">HAL_TIM_Base_Start(&amp;tim1);   //打开定时器（轮询方式）</div><div class="notion-text notion-block-786782afe4ab4f2da0b1bfee2f7d1eef">}</div><ul class="notion-list notion-list-disc notion-block-50a9a0d8ad564bc799eb8411be6731c7"><li>初始化硬件配置回调函数</li></ul><details class="notion-toggle notion-block-44216487c6a74d67a5a74baf10531f7b"><summary><h4 class="notion-h notion-h3 notion-block-44216487c6a74d67a5a74baf10531f7b" data-id="44216487c6a74d67a5a74baf10531f7b"><span><div id="44216487c6a74d67a5a74baf10531f7b" class="notion-header-anchor"></div><span class="notion-h-title">3. 程序</span></span></h4></summary><div><details class="notion-toggle notion-block-1176668df3cb43c2a3e9fb9ffeb8529a"><summary><h4 class="notion-h notion-h3 notion-block-1176668df3cb43c2a3e9fb9ffeb8529a" data-id="1176668df3cb43c2a3e9fb9ffeb8529a"><span><div id="1176668df3cb43c2a3e9fb9ffeb8529a" class="notion-header-anchor"></div><span class="notion-h-title">time.c</span></span></h4></summary><div><div class="notion-text notion-block-9be81f71ed944eeea70dc012abd022be">#include &quot;stm32f1xx_hal.h&quot;</div><div class="notion-text notion-block-68178759531e4c6f9991f537a3999648">#include &quot;time.h&quot;</div><div class="notion-text notion-block-1baeff0c8abf4e089cdce5a3d11108a2">TIM_HandleTypeDef tim1; //（高级）定时器1总控结构体</div><div class="notion-text notion-block-d394844e34be4f8c8d4e5a0e7e67f741">TIM_HandleTypeDef tim2; </div><div class="notion-text notion-block-ccfbe5eebc2a402d8a77fb2670850e5a">TIM_HandleTypeDef tim3; </div><div class="notion-text notion-block-a44592d649a94727acd74a257bfc163c">TIM_HandleTypeDef tim4; </div><div class="notion-text notion-block-5edf960a2bd5453ea46aa10fc6e0581b">DMA_HandleTypeDef tim1_dmaup;</div><div class="notion-text notion-block-e44cc86aff0f41bb98fa83523e58aadc">DMA_HandleTypeDef tim2_dmaup;</div><div class="notion-text notion-block-2bc8284bb472454986b9ac7b6b394b86">DMA_HandleTypeDef tim3_dmaup;</div><div class="notion-text notion-block-ec739bd9388149dc9ce1f17d191ec923">DMA_HandleTypeDef tim4_dmaup;</div><div class="notion-text notion-block-70da09663d3b466ba31745d10ea4bd68">TIM_ClockConfigTypeDef tim1_clock;  //时钟配置结构体</div></div></details><div class="notion-text notion-block-8d97347296344e5f8031bebb12592b4f">uint16_t tim1_dmaBuff[4] = {20000, 30000, 40000, 50000};</div><div class="notion-text notion-block-d2f38d9c899a471fa0908f76be95a0a4">uint16_t tim2_dmaBuff[4] = {20000, 30000, 40000, 50000};</div><div class="notion-text notion-block-9c994c26d2ab4a6a8043d0aa4388b60d">uint16_t tim3_dmaBuff[4] = {20000, 30000, 40000, 50000};</div><div class="notion-text notion-block-b91d2bf5a4a243d5925d1d84c09c8643">uint16_t tim4_dmaBuff[4] = {20000, 30000, 40000, 50000};</div><div class="notion-text notion-block-1cfde0e513184ef7ae58c9cbbca693ac">//定时器 1</div><div class="notion-text notion-block-0a50672085e241f1a03862c0b3a10e93">void Timer1_Init(uint16_t arr, uint16_t psc, uint8_t rep)</div><div class="notion-text notion-block-2128800e62724ea789f960d364941b5d">{</div><div class="notion-text notion-block-d99ef15ed61a4e2f8e206173834440b6">tim1.Instance = TIM1;                                        // 实例</div><div class="notion-text notion-block-4e1791c1019a456ab94f3293a83b2be2">tim1.Init.Period = arr;                                      // 重装载值</div><div class="notion-text notion-block-ef0e0b9cf5eb4920b9be950cefcc9a3a">tim1.Init.Prescaler = psc;                                   // 分频系数</div><div class="notion-text notion-block-a456ac9180fc4359968278cb4528356e">tim1.Init.CounterMode = TIM_COUNTERMODE_UP;                  // 计数模式</div><div class="notion-text notion-block-5d7a7875cb6b4103b1e2aa49bfd3570d">tim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;            // 分频因子</div><div class="notion-text notion-block-afe16049808a4440994067c1f94f0832">tim1.Init.RepetitionCounter = rep;                           // 重复计数值<div class="notion-text-children"><div class="notion-text notion-block-c5bbca34ce1341c496c6b1d031126647">tim1.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;// 自动重装载值 预装载使能位（影子寄存器）</div></div></div><div class="notion-text notion-block-a1105a775cde410382271e05b026d809">HAL_TIM_Base_Init(&amp;tim1);                       //初始化定时器</div><div class="notion-text notion-block-1819773aba5346aa9f191c087bb781d5">__HAL_TIM_CLEAR_FLAG(&amp;tim1, TIM_FLAG_UPDATE);   //手动 清除 定时器 更新事件</div><div class="notion-text notion-block-3837169b6a1e43c09545ff84bdaa7252">/<em> 外部模式1 ETR通道  </em>/</div><div class="notion-text notion-block-786547ad18f0470084ad8602a679ccc5">tim1_clock.ClockSource = TIM_CLOCKSOURCE_ETRMODE1; //通道1 ETR</div><div class="notion-text notion-block-92ab2cae8c294961a3e784b9ed34c4ce">tim1_clock.ClockPolarity = TIM_CLOCKPOLARITY_INVERTED;    //ETR反向 （低电平或下降沿有效）  为了匹配IO和ETR，防止复位后按一下就产生触发事件</div><div class="notion-text notion-block-8057a631987a4d7fbc786b7343ebd34f">//tim1_clock.ClockPolarity = TIM_CLOCKPOLARITY_NOINVERTED;    //ETR不反向 （高电平或上升沿有效）</div><div class="notion-text notion-block-b8fc40c80aa5448ea5e7237598e9451a">tim1_clock.ClockPrescaler = TIM_CLOCKPRESCALER_DIV4;      //ETR的预分频器配置</div><div class="notion-text notion-block-445b2d7c4c8c426592551284ee7443c1">tim1_clock.ClockFilter = 0x03;                          //滤波（注意是外部时钟的波）</div><div class="notion-text notion-block-9b1249bf8d7a4d449398d3e124746f4e">HAL_TIM_ConfigClockSource(&amp;tim1, &amp;tim1_clock);  //初始化定时器时钟配置</div><div class="notion-text notion-block-22c8bf86bb66421598d89b01d4f79ad8">/<em> 防止加大分频因子或滤波强度而导致的 复位后产生触发事件 </em>/</div><div class="notion-text notion-block-af117d5e7cdb481f9a31c73d8ffd83fb">HAL_Delay(50);</div><div class="notion-text notion-block-57cfc6ea560740938186ab34da2fc6ef">__HAL_TIM_CLEAR_FLAG(&amp;tim1, TIM_FLAG_TRIGGER);   ///清除触发事件标志位</div><div class="notion-text notion-block-5f5c006f21cd4787b4041b0b817a3a7a">__HAL_TIM_SET_COUNTER(&amp;tim1, 0);                 // 清除计数值</div><div class="notion-text notion-block-bf57f139cb2b40c682d6d2cd0efa6424">HAL_TIM_Base_Start(&amp;tim1);   //打开定时器（轮询方式）</div></div></details><div class="notion-text notion-block-0ccc2b15246c48708e3cd3f6b76151ae">}</div><div class="notion-text notion-block-deafecda8d8749caba58eae588a3cb7a">//定时器 2</div><div class="notion-text notion-block-1940decfaa3448adb35f71bcc0c08ccf">void Timer2_Init(uint16_t arr, uint16_t psc)</div><div class="notion-text notion-block-253b7810600e4b03a3a7dc461b46dbd8">{</div><div class="notion-text notion-block-c4a52203ddd24dceb851cdacbf005b67">tim2.Instance = TIM2;</div><div class="notion-text notion-block-d6e3d7b9448849238d44aaedb64ef6de">tim2.Init.Period = arr; </div><div class="notion-text notion-block-a756b46d9a8e490b94ce01171bb63635">tim2.Init.Prescaler = psc;</div><div class="notion-text notion-block-99ca980a731c4f43976a4a51a8219b45">tim2.Init.CounterMode = TIM_COUNTERMODE_UP;</div><div class="notion-text notion-block-2014ed1581cd42db9b31b21e99f96c99">tim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;</div><div class="notion-text notion-block-fe67732bc0e14f7c9fe5b8a71d33e97b">tim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;</div><div class="notion-text notion-block-2f5b23b543e64204a1929412c6ed2c53">HAL_TIM_Base_Init(&amp;tim2);</div><div class="notion-text notion-block-535cdcab83014fdf80b5bc8a3ed64b20">__HAL_TIM_CLEAR_FLAG(&amp;tim2, TIM_FLAG_UPDATE);</div><div class="notion-text notion-block-c3199fa903184ec5a85a2817f8a3feb8">__HAL_TIM_ENABLE_IT(&amp;tim2, TIM1_UP_IRQn);</div><div class="notion-text notion-block-9ebcf4500bec4a06aba209567d296703">HAL_TIM_Base_Start_DMA(&amp;tim2, (uint32_t*)tim2_dmaBuff, 4);</div><div class="notion-text notion-block-2019ef2d3ed14bfab08ecdaad6933e74">}</div><div class="notion-text notion-block-8a45fc006a0843a6a58128e3e4ce45e2">//定时器 3</div><div class="notion-text notion-block-c96f9a7f55f04456830c16ab36a9a324">void Timer3_Init(uint16_t arr, uint16_t psc)</div><div class="notion-text notion-block-8ab9146091c24812b782edcf502c3379">{</div><div class="notion-text notion-block-fb5b733726584d4192d24e42d6eceb94">tim3.Instance = TIM3;</div><div class="notion-text notion-block-a15d79cbd3144b83b5c058fab9424fdf">tim3.Init.Period = arr;</div><div class="notion-text notion-block-67bff34162e94549935178fe90fce432">tim3.Init.Prescaler = psc;</div><div class="notion-text notion-block-677df68ca3d140eaa3b2ed8bae609b32">tim3.Init.CounterMode = TIM_COUNTERMODE_UP;</div><div class="notion-text notion-block-45ab3829707841ca968f930e39c2fd44">tim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;</div><div class="notion-text notion-block-d8ead4e9c4c74bf9b993c4e4b2e6ab9f">tim3.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;</div><div class="notion-text notion-block-447324948cba45288d0b630c76a13c7f">HAL_TIM_Base_Init(&amp;tim3); </div><div class="notion-text notion-block-03ce8580758d49f2972a7d3de31b41ca">__HAL_TIM_CLEAR_FLAG(&amp;tim3, TIM_FLAG_UPDATE);</div><div class="notion-text notion-block-c360c963db7a45ffa0577c6787dd3cfa">__HAL_TIM_ENABLE_IT(&amp;tim3, TIM1_UP_IRQn);</div><div class="notion-text notion-block-b87f9594bf884756a37829c3c20e3b4d">HAL_TIM_Base_Start_DMA(&amp;tim3, (uint32_t*)tim3_dmaBuff, 4);</div><div class="notion-text notion-block-d1308f7b9e8d4cd29b1d9d3d84f7850c">}</div><div class="notion-text notion-block-2c98184bdd09484385ce9fd55702e7fd">//定时器 4</div><div class="notion-text notion-block-6addf3e6205c40ea8171c29d44bebb7d">void Timer4_Init(uint16_t arr, uint16_t psc)</div><div class="notion-text notion-block-e82a47e0b5ea4e539b57b85cb8b59a12">{</div><div class="notion-text notion-block-393bfbecf8fc4e03b886bf6b8cf250af">tim4.Instance = TIM4;</div><div class="notion-text notion-block-e61592a67ffb464ab59a383baef41cca">tim4.Init.Period = arr;</div><div class="notion-text notion-block-e10834b41ecc48eb94a463ccb6089adb">tim4.Init.Prescaler = psc;</div><div class="notion-text notion-block-7854e4726ce945b2800cb98e0d01f5f2">tim4.Init.CounterMode = TIM_COUNTERMODE_UP;</div><div class="notion-text notion-block-543edf72f7904718a31cec716d2012bb">tim4.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;</div><div class="notion-text notion-block-df56f0962025481cbb834cde849b8b87">tim4.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;</div><div class="notion-text notion-block-e5d05a642b5f4fe6a3903e5182834039">HAL_TIM_Base_Init(&amp;tim4);</div><div class="notion-text notion-block-050d353306ca4846842e32b7eae2bff0">__HAL_TIM_CLEAR_FLAG(&amp;tim4, TIM_FLAG_UPDATE);</div><div class="notion-text notion-block-30b000bee03d4d3da65e0470766cc3a0">__HAL_TIM_ENABLE_IT(&amp;tim4, TIM1_UP_IRQn);</div><div class="notion-text notion-block-3f01e971f8e545ff8b2cdeda9b57fbcf">HAL_TIM_Base_Start_DMA(&amp;tim4, (uint32_t*)tim4_dmaBuff, 4);</div><div class="notion-text notion-block-81e7231f59c848c39ef179f7449007a6">}</div><div class="notion-text notion-block-bc70bf7b5f6646649fd70b56bc1af859">//定时器 硬件初始化回调函数</div><div class="notion-text notion-block-088cdc20898d4e41a84b012ceb768547">void HAL_TIM_Base_MspInit(TIM_HandleTypeDef *htim)</div><div class="notion-text notion-block-0c427691176c471291f1a14441093b7b">{</div><div class="notion-text notion-block-f0b2aae105ae43d39b85bd70b0aaed44">if(htim-&gt;Instance == TIM1){<div class="notion-text-children"><div class="notion-text notion-block-80b55c3e4da8470d916ee45e94fe073e">__HAL_RCC_TIM1_CLK_ENABLE();                //使能时钟</div><div class="notion-text notion-block-f2dd712d5bf84dd9893f80e647e8fcd0">__HAL_RCC_GPIOA_CLK_ENABLE();</div><div class="notion-text notion-block-f955c23ae53f4fdab316b678b926740a">GPIO_InitTypeDef GPIO_InitType;</div><div class="notion-text notion-block-292ef2f8fea04617bbd7705031539257">GPIO_<a class="notion-link" href="http://InitType.Pin" target="_blank" rel="noopener noreferrer">InitType.Pin</a> = GPIO_PIN_12;</div><div class="notion-text notion-block-ea6d017126d347898d9a69685654246f">GPIO_InitType.Mode = GPIO_MODE_AF_INPUT;</div><div class="notion-text notion-block-6a1c902b710d460a80f3b2e813afe20d">GPIO_InitType.Pull = GPIO_PULLUP;           //低电平按下，上拉</div><div class="notion-text notion-block-033ff16304f4458eb92223d88fba1a3a">GPIO_InitType.Speed = GPIO_SPEED_FREQ_MEDIUM;</div><div class="notion-text notion-block-daba9a1e2425415a9b6a8cb39e3150d4">HAL_GPIO_Init(GPIOA,&amp;GPIO_InitType);</div></div></div><div class="notion-text notion-block-15142e8d430b4abc83639dc297ec412b">//        __HAL_RCC_DMA1_CLK_ENABLE();</div><div class="notion-text notion-block-7c58d4b9d3a048bebe8d6ecfaad3b3e6">//        </div><div class="notion-text notion-block-4ef333ff375441ccb5fd9541d0a762d9">//        HAL_NVIC_SetPriority(TIM1_UP_IRQn, 3, 0);   //配置、打开 更新中断</div><div class="notion-text notion-block-2a61ea483e7f4b12be7545990f5c9a0a">//        HAL_NVIC_EnableIRQ(TIM1_UP_IRQn);</div><div class="notion-text notion-block-4f22723a6b49481e9fbf58c38e100d55">//        </div><div class="notion-text notion-block-ce0a9090c66e417ab506d6f63358bd82">//        /<em> DMA配置 </em>/</div><div class="notion-text notion-block-46485dcb02c14c0f905841833482ea17">//        tim1_dmaup.Instance = DMA1_Channel5;    </div><div class="notion-text notion-block-3b36889c63a44d80baf82847dfe72a6d">//        tim1_dmaup.Init.Direction = DMA_MEMORY_TO_PERIPH;   //存储区到外设</div><div class="notion-text notion-block-6ca7b22b14c6487f84195eebc87e3a1f">//        tim1_dmaup.Init.MemInc = DMA_MINC_ENABLE;           //存储区递增</div><div class="notion-text notion-block-d1cad10af1484420b4e19c0e712de0a8">//        tim1_dmaup.Init.PeriphInc = DMA_PINC_DISABLE;       //外设不递增</div><div class="notion-text notion-block-ee00b2383a9f4a5e97ac90e98d3b28e2">//        tim1_dmaup.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD;     //半字 2字节</div><div class="notion-text notion-block-c48a4d6ae7f740a68676b14c2246ec86">//        tim1_dmaup.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD;</div><div class="notion-text notion-block-1979253cdd104674926735038d3e36e9">//        tim1_dmaup.Init.Mode = DMA_CIRCULAR;  //循环模式</div><div class="notion-text notion-block-11350687cb264d68b555705ee4518c80">//        tim1_dmaup.Init.Priority = DMA_PRIORITY_MEDIUM; </div><div class="notion-text notion-block-31a0ffcda5574fc6baacc65940dbfa48">//        __HAL_LINKDMA(&amp;tim1, hdma[TIM_DMA_ID_UPDATE], tim1_dmaup);</div><div class="notion-text notion-block-c5f9ff05523941e293f84c6867a12115">//        HAL_DMA_Init(&amp;tim1_dmaup);</div><div class="notion-text notion-block-121b0ebe40164b2d9b7bdfaa3d39c479">//        </div><div class="notion-text notion-block-72a869f4b77c46a6bbb6de2ffc0a64bb">//        HAL_NVIC_SetPriority(DMA1_Channel5_IRQn, 3, 0);   //配置、打开 通道5的中断</div><div class="notion-text notion-block-90c9d4639bdb4b0d958986275076e7aa">//        HAL_NVIC_EnableIRQ(DMA1_Channel5_IRQn);</div><div class="notion-text notion-block-0c62b714a46a429e88e5d3c69fe5046a">//        </div><div class="notion-text notion-block-a1e1e01af5f443a38ce5619567d7d177">}else if(htim-&gt;Instance == TIM2){<div class="notion-text-children"><div class="notion-text notion-block-90f9fb2d1ee849dfa6de9e07f7a3f0c9">__HAL_RCC_TIM2_CLK_ENABLE();</div><div class="notion-text notion-block-67afe94e2a894ac99afe46e7bab8913a">__HAL_RCC_DMA1_CLK_ENABLE();</div><div class="notion-text notion-block-fdbbe1baace84199bf44cca09c785bfb">HAL_NVIC_SetPriority(TIM2_IRQn, 3, 0);</div><div class="notion-text notion-block-cebe85d95e3a41d3b43c1eb989f085e7">HAL_NVIC_EnableIRQ(TIM2_IRQn);</div><div class="notion-text notion-block-a14f4f8440bb4be8b254b365383e74f4">/<em> DMA配置 </em>/</div><div class="notion-text notion-block-887399e9f0da4d7aaf30678d91490ad9">tim2_dmaup.Instance = DMA1_Channel2;    </div><div class="notion-text notion-block-55b5a9d509754aee974834d2477755cf">tim2_dmaup.Init.Direction = DMA_MEMORY_TO_PERIPH;</div><div class="notion-text notion-block-5201271ad1ca4943bbf56a3256c6c41e">tim2_dmaup.Init.MemInc = DMA_MINC_ENABLE;</div><div class="notion-text notion-block-a7143720a5ba4af8a66a45414357bb16">tim2_dmaup.Init.PeriphInc = DMA_PINC_DISABLE;</div><div class="notion-text notion-block-c37b86b819054f60b001c83f399c6007">tim2_dmaup.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD;</div><div class="notion-text notion-block-d07210dce5ef491592d9ae5c72c126b4">tim2_dmaup.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD;</div><div class="notion-text notion-block-0ce9d5e733b04a6285a0845499e04ece">tim2_dmaup.Init.Mode = DMA_CIRCULAR;  //循环模式</div><div class="notion-text notion-block-b1b56d613eac4b15affa82becdea9a20">tim2_dmaup.Init.Priority = DMA_PRIORITY_MEDIUM; </div><div class="notion-text notion-block-eeef3eaad2d14ba884531e33c6fc09f5">__HAL_LINKDMA(&amp;tim2, hdma[TIM_DMA_ID_UPDATE], tim2_dmaup);</div><div class="notion-text notion-block-2cb68107088c4c3fa361eac25105e6b4">HAL_DMA_Init(&amp;tim2_dmaup);</div><div class="notion-text notion-block-771a9e32a7f748609761f475aa9e3577">HAL_NVIC_SetPriority(DMA1_Channel2_IRQn, 3, 0);   //配置、打开 通道5的中断</div><div class="notion-text notion-block-1061e4ed09c8407c80f5d7c44e981b5f">HAL_NVIC_EnableIRQ(DMA1_Channel2_IRQn);</div></div></div><div class="notion-text notion-block-2efd02f69933428b948e93fa0fa562c7">}else if(htim-&gt;Instance == TIM3){<div class="notion-text-children"><div class="notion-text notion-block-6c3b803c76bc4f578bac5337f18fc27f">__HAL_RCC_TIM3_CLK_ENABLE();</div><div class="notion-text notion-block-a6c7c6c7398e48b9b8ec043e80190cd5">__HAL_RCC_DMA1_CLK_ENABLE();</div><div class="notion-text notion-block-67f5f7caeaaa4704a1d7fb4d4061e022">HAL_NVIC_SetPriority(TIM3_IRQn, 3, 0);</div><div class="notion-text notion-block-af864a9ec7274897912640d684456148">HAL_NVIC_EnableIRQ(TIM3_IRQn);</div><div class="notion-text notion-block-55f9b759f1e0442cafd6b334ce747678">/<em> DMA配置 </em>/</div><div class="notion-text notion-block-15c1a36a42ec486ea5e949062bc8966d">tim3_dmaup.Instance = DMA1_Channel3;    </div><div class="notion-text notion-block-c1bfbe4f212f4df38d5ee4eb9a720eaf">tim3_dmaup.Init.Direction = DMA_MEMORY_TO_PERIPH;</div><div class="notion-text notion-block-e3b3da7ec391496f86decce124b1692c">tim3_dmaup.Init.MemInc = DMA_MINC_ENABLE;</div><div class="notion-text notion-block-5731f39986404b96bec273bd9e662ac9">tim3_dmaup.Init.PeriphInc = DMA_PINC_DISABLE;</div><div class="notion-text notion-block-ae2b70e27147498fa5bd9849334a455b">tim3_dmaup.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD;</div><div class="notion-text notion-block-d80d50aa273c4498af0076f8a6b5a846">tim3_dmaup.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD;</div><div class="notion-text notion-block-e5ade1225b41432aa554a79e93bf93ad">tim3_dmaup.Init.Mode = DMA_CIRCULAR;  //循环模式</div><div class="notion-text notion-block-93155c02d4b44c4c897b7c71bf5d237f">tim3_dmaup.Init.Priority = DMA_PRIORITY_MEDIUM; </div><div class="notion-text notion-block-d108afa7ab2f4d1baf7d0259a135e80c">__HAL_LINKDMA(&amp;tim3, hdma[TIM_DMA_ID_UPDATE], tim3_dmaup);</div><div class="notion-text notion-block-86cb1170a88746faa6894c725eeb12ad">HAL_DMA_Init(&amp;tim3_dmaup);</div><div class="notion-text notion-block-0456262a12cb41289d45d1365a6eeaca">HAL_NVIC_SetPriority(DMA1_Channel3_IRQn, 3, 0);   //配置、打开 通道5的中断</div><div class="notion-text notion-block-bf50e181e1c44c90b2819868e1b138d3">HAL_NVIC_EnableIRQ(DMA1_Channel3_IRQn);</div></div></div><div class="notion-text notion-block-c0041b9cbbda468ca0d5e34dd3bee7f0">}else if(htim-&gt;Instance == TIM4){<div class="notion-text-children"><div class="notion-text notion-block-200407b2969e4619b7ff03ddd322b72f">__HAL_RCC_TIM4_CLK_ENABLE();</div><div class="notion-text notion-block-3acc376baea14bc7ad29a83dde049cf9">__HAL_RCC_DMA1_CLK_ENABLE();</div><div class="notion-text notion-block-206cee9c94bc4f0a932279d19adf71e2">HAL_NVIC_SetPriority(TIM4_IRQn, 3, 0);<div class="notion-text-children"><div class="notion-text notion-block-b7d01fd8559c4257a6ea468244622baf">HAL_NVIC_EnableIRQ(TIM4_IRQn);</div><div class="notion-text notion-block-659fc29c7efd4ef8928cde5517a4c393">/<em> DMA配置 </em>/</div><div class="notion-text notion-block-03152b95c87447cd9c7322d44519628b">tim4_dmaup.Instance = DMA1_Channel7;    </div><div class="notion-text notion-block-3300ec87f5ce4f858a15701fb0670930">tim4_dmaup.Init.Direction = DMA_MEMORY_TO_PERIPH;</div><div class="notion-text notion-block-9a94d40079b94a5cbf8503f554ad0346">tim4_dmaup.Init.MemInc = DMA_MINC_ENABLE;</div><div class="notion-text notion-block-4919fe7d6b5e404f8f60f7c70ca950f0">tim4_dmaup.Init.PeriphInc = DMA_PINC_DISABLE;</div><div class="notion-text notion-block-90ec377048284053b3fdda60a6f244cc">tim4_dmaup.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD;</div><div class="notion-text notion-block-fb6ae95726cd4e1a83c2f674880def26">tim4_dmaup.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD;</div><div class="notion-text notion-block-9ddab744d9e744cda7e3fe4c40d811c9">tim4_dmaup.Init.Mode = DMA_CIRCULAR;  //循环模式</div><div class="notion-text notion-block-1e6b0b1fbcb84f65bd7a1fd8a08aa97a">tim4_dmaup.Init.Priority = DMA_PRIORITY_MEDIUM; </div><div class="notion-text notion-block-a24cb673fcbe4446aa70772e4e9ef852">__HAL_LINKDMA(&amp;tim4, hdma[TIM_DMA_ID_UPDATE], tim4_dmaup);</div><div class="notion-text notion-block-bebebbde401a4b65bdf9358c76933faf">HAL_DMA_Init(&amp;tim4_dmaup);</div><div class="notion-text notion-block-e5a9c869712946648ba33db79a739fed">HAL_NVIC_SetPriority(DMA1_Channel7_IRQn, 3, 0);   //配置、打开 通道5的中断</div><div class="notion-text notion-block-2546a2a6163e450bbe196fb12066593a">HAL_NVIC_EnableIRQ(DMA1_Channel7_IRQn);</div><div class="notion-text notion-block-af0d2f38ac1e49d49ff6c6a547011490">}</div></div></div></div></div><div class="notion-text notion-block-ac3d5c428973478aa82936d9ddc04504">}</div><div class="notion-text notion-block-e43161fe2b4344a3827fc7a3ab364079">//定时器 硬件 De 回调函数</div><div class="notion-text notion-block-61735bbc6fad4641863a3415e0a2431a">void HAL_TIM_Base_MspDeInit(TIM_HandleTypeDef *htim)</div><div class="notion-text notion-block-bdb81bf5a7c14958a9e3102a2b88567d">{</div><div class="notion-text notion-block-f9de2ee87f5b4bf586d0fb1a52902afa">if(htim-&gt;Instance == TIM1){<div class="notion-text-children"><div class="notion-text notion-block-5d386fac0a244e5f80008b436a554f05">__HAL_RCC_TIM1_CLK_DISABLE();</div></div></div><div class="notion-text notion-block-883ddb85a4a14bc680074d866044c4d5">}else if(htim-&gt;Instance == TIM2){<div class="notion-text-children"><div class="notion-text notion-block-db3506279b034dceb6c4def0e68956e7">__HAL_RCC_TIM2_CLK_DISABLE();</div></div></div><div class="notion-text notion-block-7e9bfb15bc824d32b5dd158477520380">}else if(htim-&gt;Instance == TIM3){<div class="notion-text-children"><div class="notion-text notion-block-507c1ad3c1b1490abec715bb5c7a0c4b">__HAL_RCC_TIM3_CLK_DISABLE();</div></div></div><div class="notion-text notion-block-e53a3f71825043b184dd531316716a50">}else if(htim-&gt;Instance == TIM4){<div class="notion-text-children"><div class="notion-text notion-block-979742cd2f014b2080e5340001579504">__HAL_RCC_TIM4_CLK_DISABLE();</div></div></div><div class="notion-text notion-block-7bd726887b7f411d84742e5aeee8c01e">}    </div><div class="notion-text notion-block-9b2cb4215ac544e1a2e1f59c3a4550d6">}</div><div class="notion-text notion-block-4ac245af2f334f68821270d3a0de03fe">//更新中断  回调函数(同时也是DMA完成的回调函数)</div><div class="notion-text notion-block-ebb1ab4ca00548c8bd040f0c0ef67266">uint16_t time1 = 1;</div><div class="notion-text notion-block-27b29c11d11a49f3b91613baa319d080">uint16_t time2 = 1; </div><div class="notion-text notion-block-f5b39d134e51463ab75ffabf662dd914">uint16_t time3 = 1;</div><div class="notion-text notion-block-f91d2761a41548a8a1079e134a550156">uint16_t time4 = 1;</div><div class="notion-text notion-block-e8cb2234ecde4c218d592607d7f2e114">void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)</div><div class="notion-text notion-block-87963b1e185342f3b3ef838cd4a2da6e">{    </div><div class="notion-text notion-block-3ea0759d588749209961753b8b70a66d">if(htim-&gt;Instance == TIM1){<div class="notion-text-children"><div class="notion-text notion-block-d50f36db9d8b4ef58f7edcb1b7465d08">/<em> 判断TIM是否为Ready状态，如果是 则是DMA完成中断进入的回调函数 </em>/</div><div class="notion-text notion-block-fcfa6602b73d4a7bbd5db55378336ffc">if(htim-&gt;State  == HAL_DMA_STATE_READY){<div class="notion-text-children"><div class="notion-text notion-block-f6af54d5fdf44c499142bc4ad9154458">U1_Printf(&quot;DMA1 完成中断rn&quot;);</div><div class="notion-text notion-block-ec5e620a76b54258bd72b091c45735b5">htim-&gt;State = HAL_TIM_STATE_BUSY;           //设置定时器 BUSY状态</div></div></div><div class="notion-text notion-block-070e398f6c4d4874aa26cb005ccd2208">}else{<div class="notion-text-children"><div class="notion-text notion-block-22a0554ffa834027a4e823e4f3757b29">U1_Printf(&quot;定时器 1 定时时间:%drn&quot;,time1++);</div></div></div><div class="notion-text notion-block-9da7b922b7c7447481a27492da9b5a88">}</div></div></div><div class="notion-text notion-block-6b05d49d94ad4a03a1861321f6e250a0">}else if(htim-&gt;Instance == TIM2){<div class="notion-text-children"><div class="notion-text notion-block-bea9abbf97da44b4a6205184f8527108">if(htim-&gt;State  == HAL_DMA_STATE_READY){<div class="notion-text-children"><div class="notion-text notion-block-61bc1d2b167747b7805e0169ff61ee0c">U1_Printf(&quot;DMA2 完成中断rn&quot;);</div><div class="notion-text notion-block-e03f104cf3ff445586e1e59554c06e31">htim-&gt;State = HAL_TIM_STATE_BUSY;           //设置定时器 BUSY状态</div></div></div><div class="notion-text notion-block-ab103a67675f448eabdbe248a92e3d43">}else{<div class="notion-text-children"><div class="notion-text notion-block-757157416ef04b01920418bf36ed0b52">U1_Printf(&quot;定时器 2 定时时间:%drn&quot;,time2++);</div></div></div><div class="notion-text notion-block-fc3c84840390460482cb21513c74b21d">}</div></div></div><div class="notion-text notion-block-9bf1479e9a314d0a8eee6c272f2aeefe">}else if(htim-&gt;Instance == TIM3){<div class="notion-text-children"><div class="notion-text notion-block-c8118c44fda14244b1e91ad67e01eef4">if(htim-&gt;State  == HAL_DMA_STATE_READY){<div class="notion-text-children"><div class="notion-text notion-block-808200e1976f43bc94dd25d99dc4e326">U1_Printf(&quot;DMA3 完成中断rn&quot;);</div><div class="notion-text notion-block-6ea34d40bc3b4b1c877d5d377829ef86">htim-&gt;State = HAL_TIM_STATE_BUSY;           //设置定时器 BUSY状态</div></div></div><div class="notion-text notion-block-82014d55acd24c5aaa53fe038d035d93">}else{<div class="notion-text-children"><div class="notion-text notion-block-9ee0180e39e948949abfeb51792a4c33">U1_Printf(&quot;定时器 3 定时时间:%drn&quot;,time3++);</div></div></div><div class="notion-text notion-block-00191c1940e34868b00d8772845868ae">}</div></div></div><div class="notion-text notion-block-3a3ca576ab374ed0a02bc8673aad8a3f">}else if(htim-&gt;Instance == TIM4){<div class="notion-text-children"><div class="notion-text notion-block-061b4c49c4d8401ab9d83005dcdce6d1">if(htim-&gt;State  == HAL_DMA_STATE_READY){<div class="notion-text-children"><div class="notion-text notion-block-9bb926239f4a4d89959b2c4efaacfd0c">U1_Printf(&quot;DMA4 完成中断rn&quot;);</div><div class="notion-text notion-block-0c1c5d00da10483e970d62e08aac4d1d">htim-&gt;State = HAL_TIM_STATE_BUSY;           //设置定时器 BUSY状态</div></div></div><div class="notion-text notion-block-bd6930e08e2445d7adb456f4b015aa2e">}else{<div class="notion-text-children"><div class="notion-text notion-block-2683b047dc6641208557c1e99987bfec">U1_Printf(&quot;定时器 4 定时时间:%drn&quot;,time4++);</div></div></div><div class="notion-text notion-block-9122d8a2897e432386ce78639018f1f3">}</div></div></div><div class="notion-text notion-block-c479f7bf572a49c69702eca228e760e5">}</div><div class="notion-text notion-block-dd123ac2926b46bda5b946241a2bceb2">}</div><div class="notion-text notion-block-8899513b9e9c4ba5bbf403c524985c37">//DMA 半完成回调函数</div><div class="notion-text notion-block-cfba210e9d204d21b3be2fb65b5ebf0c">void HAL_TIM_PeriodElapsedHalfCpltCallback(TIM_HandleTypeDef *htim)</div><div class="notion-text notion-block-5cc82ce342aa46c2a422adbb88f04c54">{</div><div class="notion-text notion-block-3499f5e77ab7423ab7e9581b50b36fff">if(htim-&gt;Instance == TIM1){<div class="notion-text-children"><div class="notion-text notion-block-d254d808e5af4420aa843c56c684541b">U1_Printf(&quot;定时器 1 DMA半完成中断rn&quot;);</div><div class="notion-text notion-block-cdcfce33a3c74d3bb9e447ecbd0de73a">htim-&gt;State = HAL_TIM_STATE_BUSY;           //设置定时器 BUSY状态</div></div></div><div class="notion-text notion-block-5039c71ebd72428a85c2366c667ef8fd">}else if(htim-&gt;Instance == TIM2){<div class="notion-text-children"><div class="notion-text notion-block-ea285508afe9498a96a90756bcd8982c">U1_Printf(&quot;定时器 2 DMA半完成中断rn&quot;);</div><div class="notion-text notion-block-d53f45e42a8745b09fd9821549f57cc0">htim-&gt;State = HAL_TIM_STATE_BUSY;           //设置定时器 BUSY状态</div></div></div><div class="notion-text notion-block-bf4ab38d8ad942d4beadc7367645e13c">}else if(htim-&gt;Instance == TIM3){<div class="notion-text-children"><div class="notion-text notion-block-47ad01c105e141c7a07eeeb8fb00d478">U1_Printf(&quot;定时器 3 DMA半完成中断rn&quot;);</div><div class="notion-text notion-block-19aa7237e08745ae9b72f1c43a52deaf">htim-&gt;State = HAL_TIM_STATE_BUSY;           //设置定时器 BUSY状态</div></div></div><div class="notion-text notion-block-277ddb3c429040f4b7df1911f1edfc5c">}else if(htim-&gt;Instance == TIM4){<div class="notion-text-children"><div class="notion-text notion-block-c2eb8bbb30b341bf9fad7ecaf42c07fd">U1_Printf(&quot;定时器 4 DMA半完成中断rn&quot;);</div><div class="notion-text notion-block-9ec65960cb0346ee9876156ebefac75f">htim-&gt;State = HAL_TIM_STATE_BUSY;           //设置定时器 BUSY状态</div></div></div><div class="notion-text notion-block-33cc4674d8ec4fa0bc336989ae1af573">}</div><div class="notion-text notion-block-cd284e45911b4f4cbed32ce243a95f7d">}<div class="notion-text-children"><details class="notion-toggle notion-block-d1b46752f5ee47a38933c1bd9dce5268"><summary><h4 class="notion-h notion-h3 notion-block-d1b46752f5ee47a38933c1bd9dce5268" data-id="d1b46752f5ee47a38933c1bd9dce5268"><span><div id="d1b46752f5ee47a38933c1bd9dce5268" class="notion-header-anchor"></div><span class="notion-h-title">time.h</span></span></h4></summary><div><div class="notion-text notion-block-c76d827f72d647fc9ac7f6623d72784f">#ifndef __TIME_H</div><div class="notion-text notion-block-7949ae88bc6b4c06921515796e7f75e8">#define __TIME_H</div><div class="notion-text notion-block-92925737f0b147358665dbde9fe9833d">#include &quot;uart.h&quot;</div><div class="notion-text notion-block-28b76d5d8ad445b395c7040f6414bf43">/<em> 对外声明总控结构体 </em>/</div><div class="notion-text notion-block-de972d2a652a426e83dba2cb11843b9b">extern TIM_HandleTypeDef tim1;</div><div class="notion-text notion-block-0875fc99652442a7b96ef1385e0ef8b8">extern TIM_HandleTypeDef tim2;</div><div class="notion-text notion-block-ee38137286504e72a759251e8e6d9997">extern TIM_HandleTypeDef tim3;</div><div class="notion-text notion-block-8a8c881e0818443293cd45faf975cb2a">extern TIM_HandleTypeDef tim4;</div><div class="notion-text notion-block-153b97159dcc4feeac36b533562b1b94">extern DMA_HandleTypeDef tim1_dmaup;</div><div class="notion-text notion-block-8ac1671b9cff45ccbb1ad8fa962943bd">extern DMA_HandleTypeDef tim2_dmaup;</div><div class="notion-text notion-block-f7f212e18ec74a56bd00e605c2030f50">extern DMA_HandleTypeDef tim3_dmaup;</div><div class="notion-text notion-block-ece962dd490844388134711c9a526cb3">extern DMA_HandleTypeDef tim4_dmaup;</div><div class="notion-text notion-block-f1fee9cb976449a68dd308df20bc7640">/<em> 初始化函数 </em>/</div><div class="notion-text notion-block-25c7d8ffec754c778f8d7db6d5a268d3">void Timer1_Init(uint16_t arr, uint16_t psc, uint8_t rep);</div><div class="notion-text notion-block-c44ac665de164e57ac27eb4c657569e0">void Timer2_Init(uint16_t arr, uint16_t psc);</div><div class="notion-text notion-block-fc00bcbb5d4942feb8595def7a3bd021">void Timer3_Init(uint16_t arr, uint16_t psc);</div><div class="notion-text notion-block-aba2538a2c3042909b5a0cf82d05535a">void Timer4_Init(uint16_t arr, uint16_t psc);</div><div class="notion-text notion-block-974a439711f646299052d0f66d4993d8">#endif</div><details class="notion-toggle notion-block-3fe2418dc0b545a2aad9d2eb3562bf16"><summary><h4 class="notion-h notion-h3 notion-block-3fe2418dc0b545a2aad9d2eb3562bf16" data-id="3fe2418dc0b545a2aad9d2eb3562bf16"><span><div id="3fe2418dc0b545a2aad9d2eb3562bf16" class="notion-header-anchor"></div><span class="notion-h-title">main.c</span></span></h4></summary><div><div class="notion-text notion-block-4448ac3946084cad90af712ce4601ada">while(1){<div class="notion-text-children"><div class="notion-text notion-block-00742917544a46e58838ad1fb13bf2fa">/<em> 获取更新标志位 </em>/</div><div class="notion-text notion-block-2f7172728a4e4a79887c785903a496dc">if(__HAL_TIM_GET_FLAG(&amp;tim1, TIM_FLAG_UPDATE)){<div class="notion-text-children"><div class="notion-text notion-block-ba7630f493f34c3d8d2c157173a807de">__HAL_TIM_CLEAR_FLAG(&amp;tim1, TIM_FLAG_UPDATE);   ///清除标志位</div><div class="notion-text notion-block-43aa05444fe54d078e02d2a897d7381c">U1_Printf(&quot;定时器 1 更新事件rn&quot;);</div></div></div><div class="notion-text notion-block-2a94de2ab1ac4b8e89238cf48b4d3ee1">}</div><div class="notion-text notion-block-aba00f3f13904b26a600cdb118463cad">if(__HAL_TIM_GET_FLAG(&amp;tim1, TIM_FLAG_TRIGGER)){<div class="notion-text-children"><div class="notion-text notion-block-67277b844fb34fc7b4679985cfaa70cf">__HAL_TIM_CLEAR_FLAG(&amp;tim1, TIM_FLAG_TRIGGER);   ///清除标志位</div><div class="notion-text notion-block-45623fad1a0446c589580a5ff3230662">U1_Printf(&quot;定时器 1 触发事件:%drn&quot;, __HAL_TIM_GET_COUNTER(&amp;tim1));  //输出当前计数值</div></div></div><div class="notion-text notion-block-403a5c04452b4c2ebddf229553561771">}</div><div class="notion-text notion-block-78d510b37c7243b79256e70fd9475df2">}</div></div></div></div></details></div></details></div></div></div></details><details class="notion-toggle notion-block-c381a2711d0449f4a08876bac0a22e88"><summary><h3 class="notion-h notion-h2 notion-h-indent-1 notion-block-c381a2711d0449f4a08876bac0a22e88" data-id="c381a2711d0449f4a08876bac0a22e88"><span><div id="c381a2711d0449f4a08876bac0a22e88" class="notion-header-anchor"></div><span class="notion-h-title">四、HAL库：TIM234 外部模式1 通道1 2 轮询方式  重映射通道 边沿检测 按键计数</span></span></h3></summary><div><details class="notion-toggle notion-block-31044176205e42a0952a90ecb4c33419"><summary><h4 class="notion-h notion-h3 notion-block-31044176205e42a0952a90ecb4c33419" data-id="31044176205e42a0952a90ecb4c33419"><span><div id="31044176205e42a0952a90ecb4c33419" class="notion-header-anchor"></div><span class="notion-h-title">1. 注意事项*</span></span></h4></summary><div><ol start="1" class="notion-list notion-list-numbered notion-block-f5a5eeab6dd54e5a8623b39a58d942a8" style="list-style-type:decimal"><li>引脚冲突问题</li><ol class="notion-list notion-list-numbered notion-block-f5a5eeab6dd54e5a8623b39a58d942a8" style="list-style-type:lower-alpha"><div class="notion-text notion-block-d42d50624143420dab83b417c73d05cb"><b>要善用重映射功能，避免引脚冲突</b></div><div class="notion-text notion-block-792697ee1ae442abb33440e7f1ee2d39">并且在切换不同的通道的时候，注意GPIO口的初始化与上下拉配置</div></ol></ol><ol start="2" class="notion-list notion-list-numbered notion-block-32f03e94e4044b8b9d2858bbfda883b0" style="list-style-type:decimal"><li>还是引脚冲突问题</li><ol class="notion-list notion-list-numbered notion-block-32f03e94e4044b8b9d2858bbfda883b0" style="list-style-type:lower-alpha"><div class="notion-text notion-block-0684aa66423a42e3bd7f46e8693d4419">单片机在默认状态佳，SW+JTAG仿真都是开启状态的。</div><div class="notion-text notion-block-9be66f9a6417471a81567350fdabfda1">当定时器2 的通道1 重映射会映射到 PA15，会与JTAG的引脚冲突。注意一下需要</div></ol></ol><ol start="3" class="notion-list notion-list-numbered notion-block-d0f0bf63cdd54f1ca48410e8b3761560" style="list-style-type:decimal"><li>如果映射TIM2时， 一旦设计仿真接口切换为普通接口，需要在初始化时保持一致</li><ol class="notion-list notion-list-numbered notion-block-d0f0bf63cdd54f1ca48410e8b3761560" style="list-style-type:lower-alpha"><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-aaab50dac76147daa28829c3851f9e7c"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:100%;max-width:100%;flex-direction:column"><img style="object-fit:cover" src="https://cdn.jsdmirror.com/gh/LZJ-I/picx-images-hosting@main/images/%E5%B5%8C%E5%85%A5%E5%BC%8F%E8%BD%AF%E4%BB%B6%E5%BC%80%E5%8F%91/Post-stm32-hal/97d7002a-64c7-4125-b1e4-fbd37b5f6049-image.webp?spaceId=3a565fcb-f425-4846-b72a-d32a98183896&amp;t=aaab50da-c761-47da-a288-29c3851f9e7c" alt="notion image" loading="lazy" decoding="async"/></div></figure></ol></ol></div></details><details class="notion-toggle notion-block-b757006bdf39490e8aeee9a51e81cb93"><summary><h4 class="notion-h notion-h3 notion-block-b757006bdf39490e8aeee9a51e81cb93" data-id="b757006bdf39490e8aeee9a51e81cb93"><span><div id="b757006bdf39490e8aeee9a51e81cb93" class="notion-header-anchor"></div><span class="notion-h-title">2. 程序</span></span></h4></summary><div><details class="notion-toggle notion-block-5633de311aa74766b4bf24dc7bca866c"><summary><h4 class="notion-h notion-h3 notion-block-5633de311aa74766b4bf24dc7bca866c" data-id="5633de311aa74766b4bf24dc7bca866c"><span><div id="5633de311aa74766b4bf24dc7bca866c" class="notion-header-anchor"></div><span class="notion-h-title">time.c</span></span></h4></summary><div><div class="notion-text notion-block-d8098820dc484e2b897e5c878e7db4ab">#include &quot;stm32f1xx_hal.h&quot;</div><div class="notion-text notion-block-c295a1ba879a4002b4c562aad28dd336">#include &quot;time.h&quot;</div><div class="notion-text notion-block-9b9736d96b344fd2a019d295f8287e5c">TIM_HandleTypeDef tim1; //定时器结构体</div><div class="notion-text notion-block-9eb241a371b44dd7972e976ea746a075">TIM_HandleTypeDef tim2; </div><div class="notion-text notion-block-7cd1792c8ae641758b476253b2c5c03f">TIM_HandleTypeDef tim3; </div><div class="notion-text notion-block-1b4ce4bce48b4ea78ca94c9286c3447b">TIM_HandleTypeDef tim4; </div><div class="notion-text notion-block-a8ddfa40b28f4eb0be2e147415a601d3">DMA_HandleTypeDef tim1_dmaup;   //DMA通道配置结构体</div><div class="notion-text notion-block-fe54541360734c41a380589ca2431618">DMA_HandleTypeDef tim2_dmaup;</div><div class="notion-text notion-block-581a5206174a43be92af361aef405e71">DMA_HandleTypeDef tim3_dmaup;</div><div class="notion-text notion-block-8d40fe3b08ac49ac9093175611db8207">DMA_HandleTypeDef tim4_dmaup;</div><div class="notion-text notion-block-cd9c4282f1654002bd1649fba7a646f5">TIM_ClockConfigTypeDef tim1_clock;  //时钟配置结构体</div><div class="notion-text notion-block-66ad4e1dcba1431f8c5a42cc440825a5">TIM_ClockConfigTypeDef tim2_clock;</div><div class="notion-text notion-block-af4bd7b2f5364fcfb285e295cc2490b0">TIM_ClockConfigTypeDef tim3_clock;</div><div class="notion-text notion-block-5483a998e5de45b392549481d44a2625">TIM_ClockConfigTypeDef tim4_clock;</div><div class="notion-text notion-block-1c9c44fcf743451194f4b313f8649886">uint16_t tim1_dmaBuff[4] = {20000, 30000, 40000, 50000};</div><div class="notion-text notion-block-63728630240a42c9af4d51c2a77c3266">uint16_t tim2_dmaBuff[4] = {20000, 30000, 40000, 50000};</div><div class="notion-text notion-block-7dd6e0e3702c4d68871b6de3ae6fd681">uint16_t tim3_dmaBuff[4] = {20000, 30000, 40000, 50000};</div><div class="notion-text notion-block-dbbd03c54cd940978eff113e3032ec6f">uint16_t tim4_dmaBuff[4] = {20000, 30000, 40000, 50000};</div><div class="notion-text notion-block-34aeaf25f6254d71833aedfa31e4fe76">//定时器 1</div><div class="notion-text notion-block-c749e6757fda4222b1964bd18033147b">void Timer1_Init(uint16_t arr, uint16_t psc, uint8_t rep)</div><div class="notion-text notion-block-ce7a6faf396549259986a5c7c8852d5e">{<div class="notion-text-children"><div class="notion-text notion-block-0b5b62aa94454cb296e368594afc968c">tim1.Instance = TIM1;                                        // 实例</div><div class="notion-text notion-block-c16dd363caad448fbf7ad77de3f75bd2">tim1.Init.Period = arr;                                      // 重装载值</div><div class="notion-text notion-block-49b5f0d4537e4a4fa285dd71456bd6f4">tim1.Init.Prescaler = psc;                                   // 分频系数</div><div class="notion-text notion-block-fa0cc6cfcc304ff88484b9f94a7ec494">tim1.Init.CounterMode = TIM_COUNTERMODE_UP;                  // 计数模式</div><div class="notion-text notion-block-e58207c1c3f2413c8361738f4a743854">tim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;            // 分频因子</div></div></div></div></details><div class="notion-text notion-block-837370e86dd3413eb71b873beb5111ca">tim1.Init.RepetitionCounter = rep;                           // 重复计数值</div><div class="notion-text notion-block-e995fd67394c4e95860090de964e98fb">tim1.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;// 自动重装载值 预装载使能位（影子寄存器）</div><div class="notion-text notion-block-04903c47e127404cb69aa172a9990fb9">HAL_TIM_Base_Init(&amp;tim1);                       //初始化定时器</div><div class="notion-text notion-block-be7b6a4e39d84cbb8c640bab182154c1">__HAL_TIM_CLEAR_FLAG(&amp;tim1, TIM_FLAG_UPDATE);   //手动 清除 定时器 更新事件</div><div class="notion-text notion-block-6a7d5ee69b2c4dd1967c6ee6c10049ef">/<em> 外部模式1 ETR通道  </em>/</div><div class="notion-text notion-block-2b5b174be2834563b8a168babbb03914">tim1_clock.ClockSource = TIM_CLOCKSOURCE_ETRMODE1; //通道1 ETR</div><div class="notion-text notion-block-d02bac66f55543b68b292f95de651d08">tim1_clock.ClockPolarity = TIM_CLOCKPOLARITY_INVERTED;      //ETR反向 （低电平或下降沿有效）</div><div class="notion-text notion-block-404abe3589aa40b3b9c0af5d7eee1414">//tim1_clock.ClockPolarity = TIM_CLOCKPOLARITY_NOINVERTED;    //ETR不反向 （高电平或上升沿有效）</div><div class="notion-text notion-block-e62d0b9ec5694f91a00b9c7c68917104">tim1_clock.ClockPrescaler = TIM_CLOCKPRESCALER_DIV1;      //ETR的预分频器配置</div><div class="notion-text notion-block-adbc602f364a448cb59df2be6a7aec54">tim1_clock.ClockFilter = 0x03;                          //滤波（注意是外部时钟的波）</div><div class="notion-text notion-block-d07a9f9a5e0e4aada8960da847958e11">HAL_TIM_ConfigClockSource(&amp;tim1, &amp;tim1_clock);  //初始化定时器时钟配置</div><div class="notion-text notion-block-a175926039e246edaae1202af56c7279">HAL_TIM_Base_Start(&amp;tim1);   //打开定时器（轮询方式）</div></div></details><div class="notion-text notion-block-0c98ed839898400b95415dd8d7d3695a">}</div><div class="notion-text notion-block-ae4e81bcce8549738beff00733a25c50">//定时器 2</div><div class="notion-text notion-block-60b384427a3d4f10aa6b51ffc5c75826">void Timer2_Init(uint16_t arr, uint16_t psc)</div><div class="notion-text notion-block-a8f7a5a349b54f2c8a4f24e6c102b0e0">{</div><div class="notion-text notion-block-05c9fc3cd58846c8b0bee66271f89397">tim2.Instance = TIM2;</div><div class="notion-text notion-block-f850cd15eda64a0dbb063c7935911baf">tim2.Init.Period = arr; </div><div class="notion-text notion-block-4b0cc91a7e0148dd919a2b35795caa98">tim2.Init.Prescaler = psc;</div><div class="notion-text notion-block-4405d6c6b91f4c6c86d445e63dfe815e">tim2.Init.CounterMode = TIM_COUNTERMODE_UP;</div><div class="notion-text notion-block-345c138d5bdc4b36badaecb82c71cac9">tim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;</div><div class="notion-text notion-block-c1496424222f4217aba1ec95d3603e50">tim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;</div><div class="notion-text notion-block-c159b9e75247437181a2514b03030c92">HAL_TIM_Base_Init(&amp;tim2);</div><div class="notion-text notion-block-64b53b6d57a547cd89c8eb03160579f8">__HAL_TIM_CLEAR_FLAG(&amp;tim2, TIM_FLAG_UPDATE);</div><div class="notion-text notion-block-b58fb9e024f54df9a5ac987d64d25196">/<em> 外部模式1 通道1 双边沿检测  重映射</em>/</div><div class="notion-text notion-block-f86243e6451b4a27ab73ce0a607fa12d">tim2_clock.ClockSource = TIM_CLOCKSOURCE_TI1ED; //通道1 边沿检测</div><div class="notion-text notion-block-5b367eab7f1f48c58bdd84781c23680f">HAL_TIM_ConfigClockSource(&amp;tim2, &amp;tim2_clock);  //初始化定时器时钟配置</div><div class="notion-text notion-block-0bffc1dcc4f343f5af695e48c834d646">HAL_TIM_Base_Start(&amp;tim2);   //打开定时器（轮询方式）</div><div class="notion-text notion-block-44f8e42d905147539dcd16d6915aa034">}</div><div class="notion-text notion-block-7eedeabda66e4d6e816b4c96f7782e94">//定时器 3</div><div class="notion-text notion-block-b4208357779745e7aa7d057a521b0687">void Timer3_Init(uint16_t arr, uint16_t psc)</div><div class="notion-text notion-block-29d24e8cc63741ce873f2b60126a9e66">{</div><div class="notion-text notion-block-66fc97af633247bface998a2bf476939">tim3.Instance = TIM3;</div><div class="notion-text notion-block-cf71e482346e47d48957be42812a7bf6">tim3.Init.Period = arr;</div><div class="notion-text notion-block-b170c211d3594724b54ee0016f81f65f">tim3.Init.Prescaler = psc;</div><div class="notion-text notion-block-b67adcc9c7884bb992978fff0590fc40">tim3.Init.CounterMode = TIM_COUNTERMODE_CENTERALIGNED1; //中央对齐模式</div><div class="notion-text notion-block-aa9e1d1369ba4824bdacfabcd8cc9fe5">tim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;</div><div class="notion-text notion-block-aceee00d30964902a8fff1de4d8695f9">tim3.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;</div><div class="notion-text notion-block-e768b53de69c49aebe07120b0b627f8d">HAL_TIM_Base_Init(&amp;tim3); </div><div class="notion-text notion-block-f36f2246aa2d415190f16da66111f021">__HAL_TIM_CLEAR_FLAG(&amp;tim3, TIM_FLAG_UPDATE);</div><div class="notion-text notion-block-a6d28e881565456d9480f1ed2556b463">/<em> 外部模式1 通道1 </em>/</div><div class="notion-text notion-block-62018a9f2f22401095ab87113b25310c">tim3_clock.ClockSource = TIM_CLOCKSOURCE_TI1;             // 通道1</div><div class="notion-text notion-block-bfd38b19dc69440e8a4e324d60effb10">tim3_clock.ClockPolarity = TIM_CLOCKPOLARITY_RISING;      // 上升沿</div><div class="notion-text notion-block-a6c5b4a66dcc49dfb604228f37d11eda">tim3_clock.ClockFilter = 0x03;                            // 滤波</div><div class="notion-text notion-block-764ce220fe8349e5b7b02319e3d73ffb">HAL_TIM_ConfigClockSource(&amp;tim3, &amp;tim3_clock);  //初始化定时器时钟配置</div><div class="notion-text notion-block-34b8548cac2341408a95466e6424c1c4">HAL_TIM_Base_Start(&amp;tim3);   //打开定时器（轮询方式）</div><div class="notion-text notion-block-1e9ee7e21d76483db34a11e00e13aba7">}</div><div class="notion-text notion-block-9b5d825600724b7cadb118953ac12cdf">//定时器 4</div><div class="notion-text notion-block-e32614441feb4a80ab350b6c3361a7be">void Timer4_Init(uint16_t arr, uint16_t psc)</div><div class="notion-text notion-block-70e2d8d44a93443d8d05597e2e1a6da0">{</div><div class="notion-text notion-block-bf98a1001ba647bdb818f233d0638704">tim4.Instance = TIM4;</div><div class="notion-text notion-block-cb1a7ca46e1a4a5fba2483474f9cdec7">tim4.Init.Period = arr;</div><div class="notion-text notion-block-a84c624e241c41a68cfecd3e82fd1532">tim4.Init.Prescaler = psc;</div><div class="notion-text notion-block-f616d51a221d4854b1011201adada28f">tim4.Init.CounterMode = TIM_COUNTERMODE_UP;</div><div class="notion-text notion-block-7515e533faa046d9b66ea95e846f0f96">tim4.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;</div><div class="notion-text notion-block-d0446821fbdb40c8a9ce840195f02953">tim4.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;</div><div class="notion-text notion-block-cc3cdfaa99fa493689ce5a7dde0a0e02">HAL_TIM_Base_Init(&amp;tim4); </div><div class="notion-text notion-block-98349847af5640c0a638790ec0b5789c">__HAL_TIM_CLEAR_FLAG(&amp;tim4, TIM_FLAG_UPDATE);</div><div class="notion-text notion-block-ab987d2f4a12400881c71e1d9a4e56c2">/<em> 外部模式1 通道2 </em>/</div><div class="notion-text notion-block-76fa6c5e47b648dd9ec26051eda4972a">tim4_clock.ClockSource = TIM_CLOCKSOURCE_TI2;             // 通道2</div><div class="notion-text notion-block-2777f2edc1494981a8e245b8c85f6715">tim4_clock.ClockPolarity = TIM_CLOCKPOLARITY_FALLING;     // 下降沿</div><div class="notion-text notion-block-4cb2690739a14f139f7c130562af2ce6">tim4_clock.ClockFilter = 0x03;                            // 滤波</div><div class="notion-text notion-block-28f1a658317a4b25a4b3dec2b857ec16">HAL_TIM_ConfigClockSource(&amp;tim4, &amp;tim4_clock);  //初始化定时器时钟配置</div><div class="notion-text notion-block-246e4155d1444bdda35c6d02f5c74958">HAL_TIM_Base_Start(&amp;tim4);   //打开定时器（轮询方式）</div><div class="notion-text notion-block-d63e62dd5a404590a179705b3c339bf6">}</div><div class="notion-text notion-block-dde47f347bb84bd1b7c355d5e4b57c50">//定时器 硬件初始化回调函数</div><div class="notion-text notion-block-ae06b498c8a24ff1ae1999cc15663cbd">void HAL_TIM_Base_MspInit(TIM_HandleTypeDef *htim)</div><div class="notion-text notion-block-927bf767c5894865a997fd4514610118">{</div><div class="notion-text notion-block-85546a6b1beb4f0fb2c27d33cbe1961d">GPIO_InitTypeDef GPIO_InitType;</div><div class="notion-text notion-block-13cff43e441246888d6b01de2d33d2ab">if(htim-&gt;Instance == TIM1){<div class="notion-text-children"><div class="notion-text notion-block-085d6339022d49c2ba2741438661c6a7">__HAL_RCC_TIM1_CLK_ENABLE();                //使能时钟</div><div class="notion-text notion-block-be65aab0d3474840a4dc13c9f9fb67ac">/<em> 定时器1 外部模式1 ETR通道IO </em>/</div><div class="notion-text notion-block-80f41eae7b94496a921c699a026f4410">__HAL_RCC_GPIOA_CLK_ENABLE();</div><div class="notion-text notion-block-926c7f7c6350418581f3ec65e065505e">GPIO_<a class="notion-link" href="http://InitType.Pin" target="_blank" rel="noopener noreferrer">InitType.Pin</a> = GPIO_PIN_12;</div><div class="notion-text notion-block-5e0b4fd1daf54f95858ac3ac694447ea">GPIO_InitType.Mode = GPIO_MODE_AF_INPUT;</div><div class="notion-text notion-block-0766627281744916aada4ead836f94ee">GPIO_InitType.Pull = GPIO_PULLUP;           //低电平按下，上拉</div><div class="notion-text notion-block-8afba06871c446b3a73529d279c05e16">HAL_GPIO_Init(GPIOA,&amp;GPIO_InitType);</div></div></div><div class="notion-text notion-block-233172482beb446dacab0c6827c84d66">//        __HAL_RCC_DMA1_CLK_ENABLE();</div><div class="notion-text notion-block-6bd261e7eefb447ba42bd2192f543a0d">//        </div><div class="notion-text notion-block-20d36bf3be5142db91870f8c17c8545e">//        HAL_NVIC_SetPriority(TIM1_UP_IRQn, 3, 0);   //配置、打开 更新中断</div><div class="notion-text notion-block-db00c4747be84802b2c09ba763160287">//        HAL_NVIC_EnableIRQ(TIM1_UP_IRQn);</div><div class="notion-text notion-block-884ec2b3f2b249ebbb13ab3b3987fc78">//        </div><div class="notion-text notion-block-fb7ccb101ca6495a8c31a2f0dd9ce94b">//        /<em> DMA配置 </em>/</div><div class="notion-text notion-block-1b3d484f17e041e9aa760b9b9d38a1dc">//        tim1_dmaup.Instance = DMA1_Channel5;    </div><div class="notion-text notion-block-ecfcf28311174768837f29124ed6db61">//        tim1_dmaup.Init.Direction = DMA_MEMORY_TO_PERIPH;   //存储区到外设</div><div class="notion-text notion-block-a29e37f57eee49c3a342c5b6a9d9d7aa">//        tim1_dmaup.Init.MemInc = DMA_MINC_ENABLE;           //存储区递增</div><div class="notion-text notion-block-e2cea457824e43eaad1b2560818eb42d">//        tim1_dmaup.Init.PeriphInc = DMA_PINC_DISABLE;       //外设不递增</div><div class="notion-text notion-block-7475bea89d054436bfde37fe8d27b8c7">//        tim1_dmaup.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD;     //半字 2字节</div><div class="notion-text notion-block-790bb18d295d497883fbd072c843ba1e">//        tim1_dmaup.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD;</div><div class="notion-text notion-block-240c1a840887449f83aa6e480dcc096e">//        tim1_dmaup.Init.Mode = DMA_CIRCULAR;  //循环模式</div><div class="notion-text notion-block-0dca25b1ac01464c93b9d04136708dfc">//        tim1_dmaup.Init.Priority = DMA_PRIORITY_MEDIUM;  </div><div class="notion-text notion-block-329242f1dc114df8a303f8b0cd28a408">//        __HAL_LINKDMA(&amp;tim1, hdma[TIM_DMA_ID_UPDATE], tim1_dmaup);</div><div class="notion-text notion-block-2e1991dd507940dcb4345354b72d55a2">//        HAL_DMA_Init(&amp;tim1_dmaup);</div><div class="notion-text notion-block-dd07606a77c24fc888e2284ca4303710">//        </div><div class="notion-text notion-block-af4c40f8ec4b4a6f9439c732d9e74b2a">//        HAL_NVIC_SetPriority(DMA1_Channel5_IRQn, 3, 0);   //配置、打开 通道5的中断</div><div class="notion-text notion-block-99b683fd72cc447ca9a415162165fba2">//        HAL_NVIC_EnableIRQ(DMA1_Channel5_IRQn);</div><div class="notion-text notion-block-058d8ce08cf3454888aa255348d7868a">//        </div><div class="notion-text notion-block-fa71aa5001944a5ca94bafbc18d61ffe">}else if(htim-&gt;Instance == TIM2){<div class="notion-text-children"><div class="notion-text notion-block-5c042c8b48174d009ed4b2f42768c2e7">__HAL_RCC_TIM2_CLK_ENABLE();</div><div class="notion-text notion-block-d20a70a2dea147228ca2edea012377cd">__HAL_RCC_GPIOA_CLK_ENABLE();</div><div class="notion-text notion-block-d0bb2d7d55f64229be98355e16de304c">__HAL_RCC_AFIO_CLK_ENABLE();</div><div class="notion-text notion-block-954e970b4d844fccb5b4a85e1e897cc9">__HAL_AFIO_REMAP_TIM2_ENABLE();</div><div class="notion-text notion-block-0d0d53b4fdcc4fd1bc2fdcf456d30af7">//__HAL_AFIO_REMAP_TIM2_PARTIAL_1(); //(同样的功能)</div><div class="notion-text notion-block-d34636c547f745d1a59f27ae72757aa4">__HAL_AFIO_REMAP_SWJ_NOJTAG();</div><div class="notion-text notion-block-6805084db43a42cabe749485d9bdaf89">/<em> 定时器2 外部模式1 通道1 重映射</em>/</div><div class="notion-text notion-block-14e4f0afa5694b2d91f7411d61a1b005">//GPIO_<a class="notion-link" href="http://InitType.Pin" target="_blank" rel="noopener noreferrer">InitType.Pin</a> = GPIO_PIN_0;</div><div class="notion-text notion-block-b35d29628bcc4661992750d8f3e24761">GPIO_<a class="notion-link" href="http://InitType.Pin" target="_blank" rel="noopener noreferrer">InitType.Pin</a> = GPIO_PIN_15;</div><div class="notion-text notion-block-37a7998840ad4dacb60951dc6eeb3f56">GPIO_InitType.Mode = GPIO_MODE_AF_INPUT;</div><div class="notion-text notion-block-edd82c7331fb4a529bfa509fef354806">GPIO_InitType.Pull = GPIO_PULLUP;           //低电平按下，上拉</div><div class="notion-text notion-block-d6afdef3636540268d2ccf289c32c05a">HAL_GPIO_Init(GPIOA,&amp;GPIO_InitType);</div></div></div><div class="notion-text notion-block-a844cb6bb5914946a1ce0bbb8fabc5b8">//        __HAL_RCC_DMA1_CLK_ENABLE();</div><div class="notion-text notion-block-3d1a40dcb1d444ca8168a5fda9f02011">//        HAL_NVIC_SetPriority(TIM2_IRQn, 3, 0);</div><div class="notion-text notion-block-81b5a29bda674ab4b869c0aea5e34fc2">//        HAL_NVIC_EnableIRQ(TIM2_IRQn);</div><div class="notion-text notion-block-2d950fc66c9449c59886f94c8603d688">//        </div><div class="notion-text notion-block-e5db16c86a6249e7af4f036b6ffca994">//        /<em> DMA配置 </em>/</div><div class="notion-text notion-block-00f6039682e64d979347ef49a995f16c">//        tim2_dmaup.Instance = DMA1_Channel2;    </div><div class="notion-text notion-block-c5ff6aa3b3b249b9961a4ab04831d05d">//        tim2_dmaup.Init.Direction = DMA_MEMORY_TO_PERIPH;</div><div class="notion-text notion-block-e135ddcf26be481a90848227fb053446">//        tim2_dmaup.Init.MemInc = DMA_MINC_ENABLE;</div><div class="notion-text notion-block-c082cbb01dee491a9a7ca6d7d7859be0">//        tim2_dmaup.Init.PeriphInc = DMA_PINC_DISABLE;</div><div class="notion-text notion-block-bcf309cd1668489597830bd61257bdbf">//        tim2_dmaup.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD;</div><div class="notion-text notion-block-683522d2d6e9461da677eef75483a73a">//        tim2_dmaup.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD;</div><div class="notion-text notion-block-dcef8a6369124d44ab22783331815470">//        tim2_dmaup.Init.Mode = DMA_CIRCULAR;  //循环模式</div><div class="notion-text notion-block-94af4026dad84667b64d5bd47b4884f5">//        tim2_dmaup.Init.Priority = DMA_PRIORITY_MEDIUM; </div><div class="notion-text notion-block-371c4321ea2a4bd0a5ce0562b36e1c6d">//        __HAL_LINKDMA(&amp;tim2, hdma[TIM_DMA_ID_UPDATE], tim2_dmaup);</div><div class="notion-text notion-block-3b5885de74f9459485bc9adbe3f08456">//        HAL_DMA_Init(&amp;tim2_dmaup);</div><div class="notion-text notion-block-d237286ca9cc4775b52b19fb01221342">//        </div><div class="notion-text notion-block-2dd49a9f500c416ead4b53cd0afd1ac3">//        HAL_NVIC_SetPriority(DMA1_Channel2_IRQn, 3, 0);   //配置、打开 通道5的中断</div><div class="notion-text notion-block-223364a62b9d4163af64978be70b4f9f">//        HAL_NVIC_EnableIRQ(DMA1_Channel2_IRQn);</div><div class="notion-text notion-block-20f685ad15ea453abfa864541c75372f">}else if(htim-&gt;Instance == TIM3){<div class="notion-text-children"><div class="notion-text notion-block-ac7465e4d0a34999b38aaf40ef3951b8">__HAL_RCC_TIM3_CLK_ENABLE();</div><div class="notion-text notion-block-020a093e019749919eba10fe6e5462e5">//__HAL_RCC_GPIOA_CLK_ENABLE();</div><div class="notion-text notion-block-f26952e40c10446a845f3481fe0b2f03">__HAL_RCC_GPIOB_CLK_ENABLE();</div><div class="notion-text notion-block-6f956e8315a846988f0a0f2f002f333e">__HAL_RCC_AFIO_CLK_ENABLE();</div><div class="notion-text notion-block-97313ddf0ad64bc195f538be4b5a075b">__HAL_AFIO_REMAP_TIM3_PARTIAL();    //部分映射</div><div class="notion-text notion-block-5b0a8c56696741e4b74eda3d0cb022b6">__HAL_AFIO_REMAP_SWJ_NONJTRST();    //完全SW+JATG 但没有NJTRST</div><div class="notion-text notion-block-1d539b65c796404096c53bc5cebb3652">/<em> 定时器3 外部模式1 通道1 重映射</em>/</div><div class="notion-text notion-block-6015d686800f47ae8e5afa421bcd6b8f">//GPIO_<a class="notion-link" href="http://InitType.Pin" target="_blank" rel="noopener noreferrer">InitType.Pin</a> = GPIO_PIN_6;</div><div class="notion-text notion-block-d904375da44b4af0a5c3a8abc9be875c">GPIO_<a class="notion-link" href="http://InitType.Pin" target="_blank" rel="noopener noreferrer">InitType.Pin</a> = GPIO_PIN_4;</div><div class="notion-text notion-block-b43dd234ec94444eac92e3f209ba38c7">GPIO_InitType.Mode = GPIO_MODE_AF_INPUT;</div><div class="notion-text notion-block-75accb8de4014c64930d76a1cbda037e">GPIO_InitType.Pull = GPIO_PULLUP;           //低电平按下，上拉</div><div class="notion-text notion-block-8cd17482cedd489bb5c705baad847517">HAL_GPIO_Init(GPIOB,&amp;GPIO_InitType);</div></div></div><div class="notion-text notion-block-f635350c289341ac9eef6d3220d18ad0">//        __HAL_RCC_DMA1_CLK_ENABLE();</div><div class="notion-text notion-block-7a4a020e98f24b5c9afac5464c34011a">//        HAL_NVIC_SetPriority(TIM3_IRQn, 3, 0);</div><div class="notion-text notion-block-f2647aba567b4595a588d7b88b825b69">//        HAL_NVIC_EnableIRQ(TIM3_IRQn);</div><div class="notion-text notion-block-381b70f4923343628adbb49830a8abc4">//        </div><div class="notion-text notion-block-a11a05ad51c14057bc3a7415840d65f5">//        /<em> DMA配置 </em>/</div><div class="notion-text notion-block-53d6a76897fa4c46b509e42591187d58">//        tim3_dmaup.Instance = DMA1_Channel3;    </div><div class="notion-text notion-block-4fff0e3bee4241f99b60abe2716fdaa1">//        tim3_dmaup.Init.Direction = DMA_MEMORY_TO_PERIPH;</div><div class="notion-text notion-block-67dbb1165bb242d59720c8fa7fc5d4dc">//        tim3_dmaup.Init.MemInc = DMA_MINC_ENABLE;</div><div class="notion-text notion-block-52e18f6dd41a476c86e75ddbd9c91b0c">//        tim3_dmaup.Init.PeriphInc = DMA_PINC_DISABLE;</div><div class="notion-text notion-block-3cb2fe7183844bf28fc25f56ee7c93e9">//        tim3_dmaup.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD;</div><div class="notion-text notion-block-729579b6657745fb8972e0a340942deb">//        tim3_dmaup.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD;</div><div class="notion-text notion-block-a02811b0ff324424827d076462a7022f">//        tim3_dmaup.Init.Mode = DMA_CIRCULAR;  //循环模式</div><div class="notion-text notion-block-41b1222702c244ad883e2995fe4c699b">//        tim3_dmaup.Init.Priority = DMA_PRIORITY_MEDIUM; </div><div class="notion-text notion-block-8fc37e96ce894e9987daa8d38e36af7f">//        __HAL_LINKDMA(&amp;tim3, hdma[TIM_DMA_ID_UPDATE], tim3_dmaup);</div><div class="notion-text notion-block-28e988cff0ca41109e1644f54adad802">//        HAL_DMA_Init(&amp;tim3_dmaup);</div><div class="notion-text notion-block-8069e01cc2a341b3beb5f5d137b96fb3">//        </div><div class="notion-text notion-block-6abc8ad92c824052bd6be43dbac75143">//        HAL_NVIC_SetPriority(DMA1_Channel3_IRQn, 3, 0);   //配置、打开 通道5的中断</div><div class="notion-text notion-block-5a5bab475d99415988e30b3fd44b47fa">//        HAL_NVIC_EnableIRQ(DMA1_Channel3_IRQn);</div><div class="notion-text notion-block-177b1acce8f541c7acb06de7668f17ed">}else if(htim-&gt;Instance == TIM4){<div class="notion-text-children"><div class="notion-text notion-block-890bf60baa9344488e3e543e648402d4">__HAL_RCC_TIM4_CLK_ENABLE();</div><div class="notion-text notion-block-07724e8a321d4034808f7bb783f6ecbc">/<em> 定时器4 外部模式1 通道2 </em>/</div><div class="notion-text notion-block-61e2e280905046598fba807b41d99e35">__HAL_RCC_GPIOB_CLK_ENABLE();</div><div class="notion-text notion-block-308543086a1e454d8814da110ee358c7">GPIO_<a class="notion-link" href="http://InitType.Pin" target="_blank" rel="noopener noreferrer">InitType.Pin</a> = GPIO_PIN_7;</div><div class="notion-text notion-block-af9f8fed676847e899739327f66bf152">GPIO_InitType.Mode = GPIO_MODE_AF_INPUT;</div><div class="notion-text notion-block-417211625186453c86c9929a321d815a">GPIO_InitType.Pull = GPIO_PULLUP;           //低电平按下，上拉</div><div class="notion-text notion-block-d2a15b0bf8ee41cd93041c63eb27778b">HAL_GPIO_Init(GPIOB, &amp;GPIO_InitType);</div></div></div><div class="notion-text notion-block-6c9b268f8c8244928dc9acbad04732db">//        __HAL_RCC_DMA1_CLK_ENABLE();</div><div class="notion-text notion-block-f2e2f7434747477a95d5bcecdb046aac">//        HAL_NVIC_SetPriority(TIM4_IRQn, 3, 0);</div><div class="notion-text notion-block-842dd8acafce4230983db6c94cd35f61">//        HAL_NVIC_EnableIRQ(TIM4_IRQn);</div><div class="notion-text notion-block-dd22478f5a6e49e39a084a4dc01b13c6">//        </div><div class="notion-text notion-block-ae6ec8eb1d56463f9e521ba7244327fd">//        /<em> DMA配置 </em>/</div><div class="notion-text notion-block-d42d7697a74c40a2a41940598b36e972">//        tim4_dmaup.Instance = DMA1_Channel7;    </div><div class="notion-text notion-block-bb49b6ec040e4062bbbad4a35d09835c">//        tim4_dmaup.Init.Direction = DMA_MEMORY_TO_PERIPH;</div><div class="notion-text notion-block-e314429015c34d00bbe722df8135a7f0">//        tim4_dmaup.Init.MemInc = DMA_MINC_ENABLE;</div><div class="notion-text notion-block-5237ad0523a8469c81af237549f7b00d">//        tim4_dmaup.Init.PeriphInc = DMA_PINC_DISABLE;</div><div class="notion-text notion-block-58611ba2a8984eb893345b3bf04c2b4a">//        tim4_dmaup.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD;</div><div class="notion-text notion-block-a4a447d98ee34800b4e5eeabd61f4776">//        tim4_dmaup.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD;</div><div class="notion-text notion-block-823bceedbeca4a2796145ed7b0bbd0f5">//        tim4_dmaup.Init.Mode = DMA_CIRCULAR;  //循环模式</div><div class="notion-text notion-block-efbdc628a34d423aa83fd06b8a68bde7">//        tim4_dmaup.Init.Priority = DMA_PRIORITY_MEDIUM; </div><div class="notion-text notion-block-a8edb7791b8e463fbe3b7544761049cd">//        __HAL_LINKDMA(&amp;tim4, hdma[TIM_DMA_ID_UPDATE], tim4_dmaup);</div><div class="notion-text notion-block-7bfef91f837648699d27c1e69009642c">//        HAL_DMA_Init(&amp;tim4_dmaup);</div><div class="notion-text notion-block-0071b3276cff438ea384423930e8c61e">//        </div><div class="notion-text notion-block-89e9e3d1440549a0971d4f2db7b117f0">//        HAL_NVIC_SetPriority(DMA1_Channel7_IRQn, 3, 0);   //配置、打开 通道5的中断</div><div class="notion-text notion-block-8198f58d5028483dbf3bb7afcf862e7f">//        HAL_NVIC_EnableIRQ(DMA1_Channel7_IRQn);</div><div class="notion-text notion-block-15355b7e64254d3496602342af58d3ab">}</div><div class="notion-text notion-block-a868ccb39a7e418586fb227a3f2e2c3c">}</div><div class="notion-text notion-block-13d1269edf9c41bc892244c3359abb26">//定时器 硬件 De 回调函数</div><div class="notion-text notion-block-7066e3d08978418396a6d3a01e5723ff">void HAL_TIM_Base_MspDeInit(TIM_HandleTypeDef *htim)</div><div class="notion-text notion-block-6dcfe84c03e741f2a50ef38837f5a6fb">{</div><div class="notion-text notion-block-370ebb1f8ca743e0b695212f29894c0e">if(htim-&gt;Instance == TIM1){<div class="notion-text-children"><div class="notion-text notion-block-27e79d32c8ed4709bbc025990db81797">__HAL_RCC_TIM1_CLK_DISABLE();</div></div></div><div class="notion-text notion-block-2d9cfe55da27478c9867ab0491cd6aaa">}else if(htim-&gt;Instance == TIM2){<div class="notion-text-children"><div class="notion-text notion-block-6052aa24c2bf466b836ea2434dd52bc4">__HAL_RCC_TIM2_CLK_DISABLE();</div></div></div><div class="notion-text notion-block-f2e31aeec84e495eb3253864871fc9b9">}else if(htim-&gt;Instance == TIM3){<div class="notion-text-children"><div class="notion-text notion-block-b4e6dadc28a34d5781902573897909a1">__HAL_RCC_TIM3_CLK_DISABLE();</div></div></div><div class="notion-text notion-block-e794118a5d934755a743447c22ae4efe">}else if(htim-&gt;Instance == TIM4){<div class="notion-text-children"><div class="notion-text notion-block-954dd75a445745bfb6319daed99df785">__HAL_RCC_TIM4_CLK_DISABLE();</div></div></div><div class="notion-text notion-block-9edcc718a2334ddcbbfe844076c26fec">}    </div><div class="notion-text notion-block-8b6b44b95db6467e8a069b91a8389fc4">}</div><div class="notion-text notion-block-f9ddcbb82dd14956a5665b1572f9188f">//更新中断  回调函数(同时也是DMA完成的回调函数)</div><div class="notion-text notion-block-3e855437a7314ec19f1e0ef510e42621">uint16_t time1 = 1;</div><div class="notion-text notion-block-f404b9d57ebe49fd9e3412d780d0433b">uint16_t time2 = 1; </div><div class="notion-text notion-block-c91e412de1dd4effb91264333c5ec14e">uint16_t time3 = 1;</div><div class="notion-text notion-block-ae990b28b0bc4aab9b703b98ddb8165d">uint16_t time4 = 1;</div><div class="notion-text notion-block-82a66e5894264589a8696b30f7d5fecc">void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)</div><div class="notion-text notion-block-6c92faeeee734777a6d869710666f2a5">{    </div><div class="notion-text notion-block-0bff749354294882b6dab6e861c7dd57">if(htim-&gt;Instance == TIM1){<div class="notion-text-children"><div class="notion-text notion-block-b7597342f79749a4a0a81b05c5a1f1c0">/<em> 判断TIM是否为Ready状态，如果是 则是DMA完成中断进入的回调函数 </em>/</div><div class="notion-text notion-block-4e5082dde7fe4cfd8c6292c3ab947a72">if(htim-&gt;State  == HAL_DMA_STATE_READY){<div class="notion-text-children"><div class="notion-text notion-block-98239acf27b644a28985631b149217e7">U1_Printf(&quot;DMA1 完成中断rn&quot;);</div><div class="notion-text notion-block-89c5933ee1af481ba81545e28e6f9b45">htim-&gt;State = HAL_TIM_STATE_BUSY;           //设置定时器 BUSY状态</div></div></div><div class="notion-text notion-block-e94b99924339422c875b819e652b6f50">}else{<div class="notion-text-children"><div class="notion-text notion-block-5c69c8904c1a4477bc8cb8c7cff823f9">U1_Printf(&quot;定时器 1 定时时间:%drn&quot;,time1++);</div></div></div><div class="notion-text notion-block-cdb6d1ea51534af7922c237cdcbc79c9">}</div></div></div><div class="notion-text notion-block-9ec6a843692d44798744206378b182f7">}else if(htim-&gt;Instance == TIM2){<div class="notion-text-children"><div class="notion-text notion-block-0fe286ce03764e0d8d8c1b6d4929ed75">if(htim-&gt;State  == HAL_DMA_STATE_READY){<div class="notion-text-children"><div class="notion-text notion-block-1d237f54c9f3496aa5a14784364383e3">U1_Printf(&quot;DMA2 完成中断rn&quot;);</div><div class="notion-text notion-block-6e617724dc1447a28e18a2cfb64f662f">htim-&gt;State = HAL_TIM_STATE_BUSY;           //设置定时器 BUSY状态</div></div></div><div class="notion-text notion-block-dc0a6824c7d847cba0aa73d94db3b1e0">}else{<div class="notion-text-children"><div class="notion-text notion-block-e6676151486c43d29a3e36a3ebebb8a5">U1_Printf(&quot;定时器 2 定时时间:%drn&quot;,time2++);</div></div></div><div class="notion-text notion-block-7dbb05e1670d448ab89b6bf7d502fb63">}</div></div></div><div class="notion-text notion-block-da5887ffef4c42f69ab9dc0e3c0f783e">}else if(htim-&gt;Instance == TIM3){<div class="notion-text-children"><div class="notion-text notion-block-ffd6847d093241f897f51b1fdf946518">if(htim-&gt;State  == HAL_DMA_STATE_READY){<div class="notion-text-children"><div class="notion-text notion-block-30c00159d3fc40b29b14beaa279a2286">U1_Printf(&quot;DMA3 完成中断rn&quot;);</div><div class="notion-text notion-block-608f01b3babf4aeb93f9755549911aaa">htim-&gt;State = HAL_TIM_STATE_BUSY;           //设置定时器 BUSY状态</div></div></div><div class="notion-text notion-block-fa68c8d379ca4b4cbbc243fa001333d5">}else{<div class="notion-text-children"><div class="notion-text notion-block-e6cd4428f0494eb9bd441dda55014346">U1_Printf(&quot;定时器 3 定时时间:%drn&quot;,time3++);</div></div></div><div class="notion-text notion-block-63c009a6d8014695a752cab0f281c123">}</div></div></div><div class="notion-text notion-block-d1b43473233b4886a02bcb3bc3574862">}else if(htim-&gt;Instance == TIM4){<div class="notion-text-children"><div class="notion-text notion-block-a5d570f718894b7cb6cae4cf0591ae82">if(htim-&gt;State  == HAL_DMA_STATE_READY){<div class="notion-text-children"><div class="notion-text notion-block-8bd25bd69681492b9c3e06ab13d35841">U1_Printf(&quot;DMA4 完成中断rn&quot;);</div><div class="notion-text notion-block-931cdc680f8c43f1ab9ddb68f4d7920c">htim-&gt;State = HAL_TIM_STATE_BUSY;           //设置定时器 BUSY状态</div></div></div><div class="notion-text notion-block-4514aa6ba8cf41b1b5e7b9da0d8efd58">}else{<div class="notion-text-children"><div class="notion-text notion-block-281fef41452648f585d3f904cc30006a">U1_Printf(&quot;定时器 4 定时时间:%drn&quot;,time4++);</div></div></div><div class="notion-text notion-block-e4ff401db2254f17a33f2588c5209fb4">}</div></div></div><div class="notion-text notion-block-555f043dc519420a92f94ca1686359e4">}</div><div class="notion-text notion-block-fce129f2f05b48498785747818d7a204">}</div><div class="notion-text notion-block-999b84d642494a47b65aaef61f55ccc7">//DMA 半完成回调函数</div><div class="notion-text notion-block-59c699741a6a49ffa969364d1ef85fed">void HAL_TIM_PeriodElapsedHalfCpltCallback(TIM_HandleTypeDef *htim)</div><div class="notion-text notion-block-33c5172b00df44c9af1afc69fa7553aa">{</div><div class="notion-text notion-block-7e5b67209d37484588d324b658b95959">if(htim-&gt;Instance == TIM1){<div class="notion-text-children"><div class="notion-text notion-block-baeafbb6f03e483099e4675746af2285">U1_Printf(&quot;定时器 1 DMA半完成中断rn&quot;);</div><div class="notion-text notion-block-8e5ebb411e42434f948d480e8c03b139">htim-&gt;State = HAL_TIM_STATE_BUSY;           //设置定时器 BUSY状态</div></div></div><div class="notion-text notion-block-6842ae4459e04c48a42fcebb567f1779">}else if(htim-&gt;Instance == TIM2){<div class="notion-text-children"><div class="notion-text notion-block-dff1d05ba0ac4a429ce391063f3801f9">U1_Printf(&quot;定时器 2 DMA半完成中断rn&quot;);</div><div class="notion-text notion-block-3f4f9a80da5544b0b273d59e4bd9cdd6">htim-&gt;State = HAL_TIM_STATE_BUSY;           //设置定时器 BUSY状态</div></div></div><div class="notion-text notion-block-5a7908c1799d4a4fb108c1af087c9b1c">}else if(htim-&gt;Instance == TIM3){<div class="notion-text-children"><div class="notion-text notion-block-a58801ca7f3d453a859673bf9e38cec1">U1_Printf(&quot;定时器 3 DMA半完成中断rn&quot;);</div><div class="notion-text notion-block-8e1a467fd8b44c5fbd1eae71b82e1f31">htim-&gt;State = HAL_TIM_STATE_BUSY;           //设置定时器 BUSY状态</div></div></div><div class="notion-text notion-block-079b80d42be24e1d9ae9df2cdc92cf33">}else if(htim-&gt;Instance == TIM4){<div class="notion-text-children"><div class="notion-text notion-block-886d418b00544b518bb13fcb93ff43a7">U1_Printf(&quot;定时器 4 DMA半完成中断rn&quot;);</div><div class="notion-text notion-block-a286c7b6c75142dab92d9e31f569d5c7">htim-&gt;State = HAL_TIM_STATE_BUSY;           //设置定时器 BUSY状态</div></div></div><div class="notion-text notion-block-f0df280a5a61418e9136788e76392f06">}</div><div class="notion-text notion-block-75e8658eb98247329f6d80beadf38ed4">}</div><details class="notion-toggle notion-block-9476c0209cb840e7bdb01977f14099cc"><summary><h4 class="notion-h notion-h3 notion-block-9476c0209cb840e7bdb01977f14099cc" data-id="9476c0209cb840e7bdb01977f14099cc"><span><div id="9476c0209cb840e7bdb01977f14099cc" class="notion-header-anchor"></div><span class="notion-h-title">time.h</span></span></h4></summary><div><div class="notion-text notion-block-92558b2bbf504b7eaa155f0846365320">#ifndef __TIME_H</div><div class="notion-text notion-block-d9f78f5ca2474efcbd52e77402c501f4">#define __TIME_H</div><div class="notion-text notion-block-88895a534889406f9eb4fd8933a83eb5">#include &quot;uart.h&quot;</div><div class="notion-text notion-block-920a5955ff244c268cf530394eafdb54">/<em> 对外声明总控结构体 </em>/</div><div class="notion-text notion-block-b3c08fde2212425095095c1573af3b7d">extern TIM_HandleTypeDef tim1;</div><div class="notion-text notion-block-0598510b5bf44aedbc100921287ffd97">extern TIM_HandleTypeDef tim2;</div><div class="notion-text notion-block-a7789b8a6e7a4734a43e5e7e752de3d0">extern TIM_HandleTypeDef tim3;</div><div class="notion-text notion-block-e3f02c3149d846a7a6d0c8e5076566dd">extern TIM_HandleTypeDef tim4;</div><div class="notion-text notion-block-0148a8e114d44c898b4b7eacfedd3e47">extern DMA_HandleTypeDef tim1_dmaup;</div><div class="notion-text notion-block-7daf88ff9b864d06899a12d0879315d9">extern DMA_HandleTypeDef tim2_dmaup;</div><div class="notion-text notion-block-564721363f484061b949cd510a2c4fca">extern DMA_HandleTypeDef tim3_dmaup;</div><div class="notion-text notion-block-bc3be37460b343ce928c6eeaae4526bf">extern DMA_HandleTypeDef tim4_dmaup;</div><div class="notion-text notion-block-e157b2d4498f4b4a82e17008e12b0794">/<em> 初始化函数 </em>/</div><div class="notion-text notion-block-5d778f3369d943c298ebf3dd6956a3f4">void Timer1_Init(uint16_t arr, uint16_t psc, uint8_t rep);</div><div class="notion-text notion-block-6b00b81a0bfd47eca75d46d5225f4d0e">void Timer2_Init(uint16_t arr, uint16_t psc);</div><div class="notion-text notion-block-f12ecdce6ab247e88cb5ecb0ca723689">void Timer3_Init(uint16_t arr, uint16_t psc);</div><div class="notion-text notion-block-42c187f782bb4138b07c2ce13f176ee9">void Timer4_Init(uint16_t arr, uint16_t psc);</div><div class="notion-text notion-block-9c98619eadd54bc58ed97160527fd677">#endif</div></div></details><details class="notion-toggle notion-block-71e1e10a72bd4d5b9035496017b8f1df"><summary><h4 class="notion-h notion-h3 notion-block-71e1e10a72bd4d5b9035496017b8f1df" data-id="71e1e10a72bd4d5b9035496017b8f1df"><span><div id="71e1e10a72bd4d5b9035496017b8f1df" class="notion-header-anchor"></div><span class="notion-h-title">main.c</span></span></h4></summary><div><div class="notion-text notion-block-cb5166798f3e4975914e209b15c36ba9">#include &quot;stm32f1xx_hal.h&quot;</div><div class="notion-text notion-block-8518ead3832c4eccada807cc535da47b">#include &quot;rcc.h&quot;</div><div class="notion-text notion-block-46737a1916a247fcb7ab53ffb5dd490f">#include &quot;led.h&quot;</div><div class="notion-text notion-block-969b565378b34cef8022af739a690222">#include &quot;sw.h&quot;</div><div class="notion-text notion-block-e668fcc4c2144cfface3f75ac0aa6f0f">#include &quot;uart.h&quot;</div><div class="notion-text notion-block-d13d640c1e354525ac69de4903a894cf">#include &quot;time.h&quot;</div><div class="notion-text notion-block-c099ab209ec94176b57c2df9f736ab97">int main(void){<div class="notion-text-children"><div class="notion-text notion-block-456dc40a18684788bae7415ccaaf65a7">HAL_Init();</div><div class="notion-text notion-block-3597575f80894d5ba4b2a9fad5685b41">RccClock_Init();</div><div class="notion-text notion-block-0a0e4c1b59bc41a29c731df3d8f4c763">U1_Init(921600);</div><div class="notion-text notion-block-53f4329864dc42729b8fc7fb38c7d227">Timer1_Init(5 - 1, 0, 1 - 1);         //5次有效边沿</div><div class="notion-text notion-block-5e8ee86e36e74517bbcb27203cda8896">Timer2_Init(5 - 1, 0);   // 5次</div><div class="notion-text notion-block-ccb4fa7641f34d9fa34862d53a076d26">Timer3_Init(5 - 1, 0);   // 5次</div><div class="notion-text notion-block-a1df9da9d6294ae0862eb3f178a05f05">Timer4_Init(5 - 1, 0);   // 5次</div></div></div><div class="notion-text notion-block-476c6c5673324ffe95369b9efc4c8ff0">//    uint16_t time1 = 0;</div><div class="notion-text notion-block-7c22a42571ff4656be5ff6607ec79740">//    uint16_t time2 = 0;</div><div class="notion-text notion-block-5a6fa5d7b03e419f8d20da460d0e8db8">//    uint16_t time3 = 0;</div><div class="notion-text notion-block-889ddb600679485686036b6ebaa2766d">//    uint16_t time4 = 0;<div class="notion-text-children"><div class="notion-text notion-block-e0eed781ba294007b5dcea756a4848eb">while(1){<div class="notion-text-children"><div class="notion-text notion-block-f8f56b62958e49c28be41cda4663aef4">/<em> 获取更新标志位 </em>/</div><div class="notion-text notion-block-9b48198d7f574d34815a73a4f40bde6b">/<em> TIM1 </em>/</div><div class="notion-text notion-block-744eee278cf24f98a64884faa0f2445d">if(__HAL_TIM_GET_FLAG(&amp;tim1, TIM_FLAG_UPDATE)){<div class="notion-text-children"><div class="notion-text notion-block-55654f9cbcb147f5ac480097be040286">__HAL_TIM_CLEAR_FLAG(&amp;tim1, TIM_FLAG_UPDATE);   ///清除标志位</div><div class="notion-text notion-block-4d59af5b9b0247aab5091e217fb4ed4f">U1_Printf(&quot;定时器 1 更新事件rn&quot;);</div></div></div><div class="notion-text notion-block-7ce8428da4604df1be7e4c015b47cee7">}</div><div class="notion-text notion-block-b0e57999f3d7403a8c77319a47a56684">if(__HAL_TIM_GET_FLAG(&amp;tim1, TIM_FLAG_TRIGGER)){<div class="notion-text-children"><div class="notion-text notion-block-a0d9c5d0f2664eea84bd414fc4501e59">__HAL_TIM_CLEAR_FLAG(&amp;tim1, TIM_FLAG_TRIGGER);   ///清除标志位</div><div class="notion-text notion-block-73fc7568e14945b3bf36f9a2427e34a1">U1_Printf(&quot;定时器 1 触发事件:%drn&quot;, __HAL_TIM_GET_COUNTER(&amp;tim1));  //输出当前计数值</div></div></div><div class="notion-text notion-block-4056c427d5da4c7288cc435f7bfc019b">}</div><div class="notion-text notion-block-8f4412d758524acab38865bb5cbdcd90">/<em> TIM2 </em>/</div><div class="notion-text notion-block-fce24ce5b95449fdb7cb4cfc5920a6d7">if(__HAL_TIM_GET_FLAG(&amp;tim2, TIM_FLAG_UPDATE)){<div class="notion-text-children"><div class="notion-text notion-block-bce6ac5a5367419686743836fe3f859f">__HAL_TIM_CLEAR_FLAG(&amp;tim2, TIM_FLAG_UPDATE);</div><div class="notion-text notion-block-c7f7971185f7435bbce27093243d4f1c">U1_Printf(&quot;定时器 2 更新事件rn&quot;);</div></div></div><div class="notion-text notion-block-7b6ba99991244c7695dfc2681bc8abc9">}</div><div class="notion-text notion-block-a0f4888a3fed469bb0f50b4e941caf01">if(__HAL_TIM_GET_FLAG(&amp;tim2, TIM_FLAG_TRIGGER)){<div class="notion-text-children"><div class="notion-text notion-block-204174338bcc4198a14c7e4e2a4197eb">__HAL_TIM_CLEAR_FLAG(&amp;tim2, TIM_FLAG_TRIGGER);</div><div class="notion-text notion-block-e06ace24473e41dc97d7582cd5e34ceb">U1_Printf(&quot;定时器 2 触发事件:%drn&quot;, __HAL_TIM_GET_COUNTER(&amp;tim2));</div></div></div><div class="notion-text notion-block-0f132923415f46e99349afbc35e2674c">}</div><div class="notion-text notion-block-8232932765e9467ab0bc7e09e445dab6">/<em> TIM3 </em>/</div><div class="notion-text notion-block-3e0ee8008aef4720b489f74b0f7e89d8">if(__HAL_TIM_GET_FLAG(&amp;tim3, TIM_FLAG_UPDATE)){<div class="notion-text-children"><div class="notion-text notion-block-52bb81d1dbe94c5281e1c8caa40f8f26">__HAL_TIM_CLEAR_FLAG(&amp;tim3, TIM_FLAG_UPDATE);</div><div class="notion-text notion-block-1bb4259be45e4cd69baa2152c831ae7d">U1_Printf(&quot;定时器 3 更新事件rn&quot;);</div></div></div><div class="notion-text notion-block-4276fd3b17c5480eb66bf1301ce966dd">}</div><div class="notion-text notion-block-d340c5fc96fc49cda2c0bbbf99e60c48">if(__HAL_TIM_GET_FLAG(&amp;tim3, TIM_FLAG_TRIGGER)){<div class="notion-text-children"><div class="notion-text notion-block-7702008ba63f4f968b4eda2a18b3113c">__HAL_TIM_CLEAR_FLAG(&amp;tim3, TIM_FLAG_TRIGGER);</div><div class="notion-text notion-block-a97dd42a761c4740be5948b21276af49">U1_Printf(&quot;定时器 3 触发事件:%drn&quot;, __HAL_TIM_GET_COUNTER(&amp;tim3));</div></div></div><div class="notion-text notion-block-58a063f1889b45b99de61d49cdd6e3c1">}</div><div class="notion-text notion-block-592f8b8acf7349878c088750a3566ee0">/<em> TIM4 </em>/</div><div class="notion-text notion-block-3011cb394444407a95217987861ed7bf">if(__HAL_TIM_GET_FLAG(&amp;tim4, TIM_FLAG_UPDATE)){<div class="notion-text-children"><div class="notion-text notion-block-53f4433e149d4414952ea74bffec389f">__HAL_TIM_CLEAR_FLAG(&amp;tim4, TIM_FLAG_UPDATE);</div><div class="notion-text notion-block-ab4913d1519f4c6e8799603a69d94c33">U1_Printf(&quot;定时器 4 更新事件rn&quot;);</div></div></div><div class="notion-text notion-block-7bcd6db2a72c4c33a84b0c3f921e4ea7">}</div><div class="notion-text notion-block-7faa0d0d30d24a2a838201cbdd40e602">if(__HAL_TIM_GET_FLAG(&amp;tim4, TIM_FLAG_TRIGGER)){<div class="notion-text-children"><div class="notion-text notion-block-42848f0f2bb74ddf8ef245537932566d">__HAL_TIM_CLEAR_FLAG(&amp;tim4, TIM_FLAG_TRIGGER);</div><div class="notion-text notion-block-d934e8af93bb4e2c8a769614ecb02890">U1_Printf(&quot;定时器 4 触发事件:%drn&quot;, __HAL_TIM_GET_COUNTER(&amp;tim4));</div></div></div><div class="notion-text notion-block-ee95a8eb9e8c4a109bdb2f80409b158e">}</div></div></div></div></div><div class="notion-text notion-block-96c0b9060f4b49f882b1f250ffa06f1f">//        </div><div class="notion-text notion-block-5795e8135c1b4255927c951807f448c2">//        if(__HAL_TIM_GET_FLAG(&amp;tim2, TIM_FLAG_UPDATE)){</div><div class="notion-text notion-block-7898f13e71f24765a57c8847ab270f87">//            __HAL_TIM_CLEAR_FLAG(&amp;tim2, TIM_FLAG_UPDATE);</div><div class="notion-text notion-block-4337d8c30eb6469ca0b9ce43a51f10ec">//            U1_Printf(&quot;定时器 2 定时时间:%drn&quot;,time2++);</div><div class="notion-text notion-block-6b118e0702e84bfbb04e1c92bf9a4005">//        }</div><div class="notion-text notion-block-0616525d7c2140a194e2898131d58111">//        </div><div class="notion-text notion-block-7f25ca1619be4471a80ebf3079ac7d47">//        if(__HAL_TIM_GET_FLAG(&amp;tim3, TIM_FLAG_UPDATE)){</div><div class="notion-text notion-block-99247c36e4ce4bfd895ec04ab0f5898d">//            __HAL_TIM_CLEAR_FLAG(&amp;tim3, TIM_FLAG_UPDATE);</div><div class="notion-text notion-block-36a8ac77730a42c393ed7225b5e9f3d3">//            U1_Printf(&quot;定时器 3 定时时间:%drn&quot;,time3++);</div><div class="notion-text notion-block-b8056b1031e648efaebc5d6e0972b4d7">//        }</div><div class="notion-text notion-block-175428060081427d9d3a0fd37a14f6b3">//        </div><div class="notion-text notion-block-18615039e5974e4eb10afda666826f85">//        if(__HAL_TIM_GET_FLAG(&amp;tim4, TIM_FLAG_UPDATE)){</div><div class="notion-text notion-block-7440b8e342c14cdd81e256a55c4ef913">//            __HAL_TIM_CLEAR_FLAG(&amp;tim4, TIM_FLAG_UPDATE);</div><div class="notion-text notion-block-b382e08aa15f4d1f8d4fd18aed6b3dda">//            U1_Printf(&quot;定时器 4 定时时间:%drn&quot;,time4++);</div><div class="notion-text notion-block-80da4302e64040a49ac4c0a6bddf2557">//        }<div class="notion-text-children"><div class="notion-text notion-block-2c78455d95df4548842e05bcdc7908bf">}</div></div></div><div class="notion-text notion-block-33ee14618a3148df8b82fb748787a757">}</div></div></details></div></details><details class="notion-toggle notion-block-5986862ca7d44b528c4c7ff17eb51c14"><summary><h3 class="notion-h notion-h2 notion-h-indent-1 notion-block-5986862ca7d44b528c4c7ff17eb51c14" data-id="5986862ca7d44b528c4c7ff17eb51c14"><span><div id="5986862ca7d44b528c4c7ff17eb51c14" class="notion-header-anchor"></div><span class="notion-h-title">五、HAL库：TIM1234 外部模式1 中断方式 按键计数</span></span></h3></summary><div><details class="notion-toggle notion-block-fdc3f6e0cb1c424ab5ce29625578663b"><summary><h4 class="notion-h notion-h3 notion-block-fdc3f6e0cb1c424ab5ce29625578663b" data-id="fdc3f6e0cb1c424ab5ce29625578663b"><span><div id="fdc3f6e0cb1c424ab5ce29625578663b" class="notion-header-anchor"></div><span class="notion-h-title">1. 注意事项*</span></span></h4></summary><div><ol start="1" class="notion-list notion-list-numbered notion-block-0e42865a161d43768896e2d7fff9bc1f" style="list-style-type:decimal"><li>HAL库只会打开Up中断，触发中断需要手动打开</li></ol><ol start="2" class="notion-list notion-list-numbered notion-block-1e8e0ec3fc474988afa2bd16869b648f" style="list-style-type:decimal"><li>注意定时器与别的外设 引脚冲突</li></ol></div></details><details class="notion-toggle notion-block-501cbd18a89b4c4894477c3994bb1130"><summary><h4 class="notion-h notion-h3 notion-block-501cbd18a89b4c4894477c3994bb1130" data-id="501cbd18a89b4c4894477c3994bb1130"><span><div id="501cbd18a89b4c4894477c3994bb1130" class="notion-header-anchor"></div><span class="notion-h-title">2. 相关函数</span></span></h4></summary><div><ul class="notion-list notion-list-disc notion-block-00c0e7fe3bc247c6a4e37095e392a707"><li><code class="notion-inline-code">__HAL_TIM_ENABLE_IT(&amp;tim3, TIM_IT_TRIGGER); </code>  手动打开触发中断</li></ul><ul class="notion-list notion-list-disc notion-block-ad341ea210b849fd9f637a2b064a065c"><li><code class="notion-inline-code">HAL_TIM_Base_Start_IT(&amp;tim4); </code>  打开定时器（中断方式）</li></ul></div></details><details class="notion-toggle notion-block-88c5eb820c214ae5814176f8cb57a6a5"><summary><h4 class="notion-h notion-h3 notion-block-88c5eb820c214ae5814176f8cb57a6a5" data-id="88c5eb820c214ae5814176f8cb57a6a5"><span><div id="88c5eb820c214ae5814176f8cb57a6a5" class="notion-header-anchor"></div><span class="notion-h-title">3. 程序</span></span></h4></summary><div><details class="notion-toggle notion-block-4600532b0fc741fc82112e97baac3435"><summary><h4 class="notion-h notion-h3 notion-block-4600532b0fc741fc82112e97baac3435" data-id="4600532b0fc741fc82112e97baac3435"><span><div id="4600532b0fc741fc82112e97baac3435" class="notion-header-anchor"></div><span class="notion-h-title">time.c</span></span></h4></summary><div><div class="notion-text notion-block-97d6fb5cfd304195a09f7ccfe06273e4">#include &quot;stm32f1xx_hal.h&quot;</div><div class="notion-text notion-block-8f3e18f25d7e49a1bf928b25f7096983">#include &quot;time.h&quot;</div><div class="notion-text notion-block-d882efcd711044ba8bf8e07418816956">TIM_HandleTypeDef tim1; //定时器结构体</div><div class="notion-text notion-block-4f7f434b0bea432696458800064d05c4">TIM_HandleTypeDef tim2; </div><div class="notion-text notion-block-5d3fd94949114b6c95ec1f0022e067cb">TIM_HandleTypeDef tim3; </div><div class="notion-text notion-block-fb443d0ee99c495e8e5c66fbdb6511c0">TIM_HandleTypeDef tim4; </div><div class="notion-text notion-block-cfcf2c5f4d6b4741819644af070f9d27">DMA_HandleTypeDef tim1_dmaup;   //DMA通道配置结构体</div><div class="notion-text notion-block-9d0d3af76353465ca10c5c3cbfe9be7a">DMA_HandleTypeDef tim2_dmaup;</div><div class="notion-text notion-block-22ad564c5855450d97ea65a35fa6856c">DMA_HandleTypeDef tim3_dmaup;</div><div class="notion-text notion-block-16a0cb1779bf46e3b65b738ff870f767">DMA_HandleTypeDef tim4_dmaup;</div><div class="notion-text notion-block-0b82ddd3771344d8b3601fb822cda73c">TIM_ClockConfigTypeDef tim1_clock;  //时钟配置结构体</div><div class="notion-text notion-block-33c0883e1afc49c8b44e2b07c03e93b6">TIM_ClockConfigTypeDef tim2_clock;</div><div class="notion-text notion-block-b600c00a63d84763ab2c9dab825ba133">TIM_ClockConfigTypeDef tim3_clock;</div><div class="notion-text notion-block-5a001510af5948e99ae5cc37dffd2963">TIM_ClockConfigTypeDef tim4_clock;</div><div class="notion-text notion-block-96233f5b58464bb3a94d839b742015d1">uint16_t tim1_dmaBuff[4] = {20000, 30000, 40000, 50000};</div><div class="notion-text notion-block-0e1a7765890942b5b942631222ae2217">uint16_t tim2_dmaBuff[4] = {20000, 30000, 40000, 50000};</div><div class="notion-text notion-block-5f21f574db4d4e388aee9a43cea90d8f">uint16_t tim3_dmaBuff[4] = {20000, 30000, 40000, 50000};</div><div class="notion-text notion-block-4bf51d7ad0a546eeaf58cba03620568d">uint16_t tim4_dmaBuff[4] = {20000, 30000, 40000, 50000};</div><div class="notion-text notion-block-2d6ead7d6c594548bde4e24484596f32">//定时器 1</div><div class="notion-text notion-block-7f2fdf1ee40243d4be5cc467011a353c">void Timer1_Init(uint16_t arr, uint16_t psc, uint8_t rep)</div><div class="notion-text notion-block-31f372a58da745b98b77c7050c9adc10">{<div class="notion-text-children"><div class="notion-text notion-block-ac3a4eeedb3f4874936f1a2d8c0451c3">tim1.Instance = TIM1;                                        // 实例</div><div class="notion-text notion-block-d157dc99f7c04f189437db6aef929d02">tim1.Init.Period = arr;                                      // 重装载值</div><div class="notion-text notion-block-b65d706e413b4cd5aeacaff96132a591">tim1.Init.Prescaler = psc;                                   // 分频系数</div><div class="notion-text notion-block-31ff621df0d14afe9438b819bc85054c">tim1.Init.CounterMode = TIM_COUNTERMODE_UP;                  // 计数模式</div><div class="notion-text notion-block-0d80bb1b925240979d78f352da6028cc">tim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;            // 分频因子</div></div></div></div></details></div></details><div class="notion-text notion-block-e6f1457822c54104af787e5331bfb646">tim1.Init.RepetitionCounter = rep;                           // 重复计数值</div><div class="notion-text notion-block-1df8bdacf1d444709d1e2f22ca97632f">tim1.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;// 自动重装载值 预装载使能位（影子寄存器）</div><div class="notion-text notion-block-a3600cd94f2c4289b30d751129e2911d">HAL_TIM_Base_Init(&amp;tim1);                       //初始化定时器</div><div class="notion-text notion-block-c3565f497d144580ba672dad6c8bb468">__HAL_TIM_CLEAR_FLAG(&amp;tim1, TIM_FLAG_UPDATE);   //手动 清除 定时器 更新事件</div><div class="notion-text notion-block-6ca9a2ef014a40e4a2228e01d2fd9ed9">/<em> 外部模式1 ETR通道  </em>/  //PA12 下降沿 按下计数 上拉</div><div class="notion-text notion-block-d49279dfd739401e9c4b969a72776d95">tim1_clock.ClockSource = TIM_CLOCKSOURCE_ETRMODE1; //通道1 ETR</div><div class="notion-text notion-block-d760166982354c23b93815e27975a95b">tim1_clock.ClockPolarity = TIM_CLOCKPOLARITY_INVERTED;      //ETR反向 （低电平或下降沿有效）</div><div class="notion-text notion-block-b4efb7ce2f6a4c768c612d33c1f2a575">//tim1_clock.ClockPolarity = TIM_CLOCKPOLARITY_NOINVERTED;    //ETR不反向 （高电平或上升沿有效）</div><div class="notion-text notion-block-5d4351046019486ca9f6c06843c66872">tim1_clock.ClockPrescaler = TIM_CLOCKPRESCALER_DIV1;      //ETR的预分频器配置</div><div class="notion-text notion-block-fde2437d0ca4416fac47587f25a9f3b6">tim1_clock.ClockFilter = 0x03;                          //滤波（注意是外部时钟的波）</div><div class="notion-text notion-block-a28dcd97af8d42e59531e9fddde9fd00">HAL_TIM_ConfigClockSource(&amp;tim1, &amp;tim1_clock);  //初始化定时器时钟配置</div><div class="notion-text notion-block-cd1f70c9391a4ffdbcfbca122bd103ac">__HAL_TIM_ENABLE_IT(&amp;tim1, TIM_IT_TRIGGER); //手动打开触发中断</div><div class="notion-text notion-block-e8ab4eb7b37845d699328fc27c69a13d">HAL_TIM_Base_Start_IT(&amp;tim1);   //打开定时器（中断方式）</div><div class="notion-text notion-block-62a622172a6042b295740f7f446e0e7d">}</div><div class="notion-text notion-block-127a6e84771a43a2bf3b9620e0208780">//定时器 2</div><div class="notion-text notion-block-91c1f87de7324138b766c8989fa55ada">void Timer2_Init(uint16_t arr, uint16_t psc)</div><div class="notion-text notion-block-f103c97572344817abc673e55390d206">{</div><div class="notion-text notion-block-1f55efd9526f42fcac05c04fdc571c05">tim2.Instance = TIM2;</div><div class="notion-text notion-block-05144ea74bff46598d6b7e8658545f78">tim2.Init.Period = arr; </div><div class="notion-text notion-block-0f0050e7f1214ea2893c0c8175a08e29">tim2.Init.Prescaler = psc;</div><div class="notion-text notion-block-8813791a1a5c42afbb29695162225d83">tim2.Init.CounterMode = TIM_COUNTERMODE_UP;</div><div class="notion-text notion-block-ee9c38c3aff44027a84b2a396aafe061">tim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;</div><div class="notion-text notion-block-656fa95e31e34d7d810fd6ff2b7b26b3">tim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;</div><div class="notion-text notion-block-a2ac16ff45b047fe9f1ee21accf90473">HAL_TIM_Base_Init(&amp;tim2);</div><div class="notion-text notion-block-a60dd50ec3ff4a0fb0462e6c1b8b4625">__HAL_TIM_CLEAR_FLAG(&amp;tim2, TIM_FLAG_UPDATE);</div><div class="notion-text notion-block-f103c1815d204f34918db9c12fa93ee2">/<em> 外部模式1 通道1 双边沿检测  重映射</em>/   //PA15 双边边沿 上拉</div><div class="notion-text notion-block-44ceff4c9d614337931fce822bd21f0f">tim2_clock.ClockSource = TIM_CLOCKSOURCE_TI1ED; //通道1 边沿检测</div><div class="notion-text notion-block-eee6edda54334902bd59f9a35fb59cc2">HAL_TIM_ConfigClockSource(&amp;tim2, &amp;tim2_clock);  //初始化定时器时钟配置</div><div class="notion-text notion-block-69f7f1a94e1a4829887178d656dd3786">__HAL_TIM_ENABLE_IT(&amp;tim2, TIM_IT_TRIGGER); //手动打开触发中断</div><div class="notion-text notion-block-c62167c57fa646228b53983152c964f7">HAL_TIM_Base_Start_IT(&amp;tim2);   //打开定时器（中断方式）</div><div class="notion-text notion-block-8d929849c9384c94beced7ecfb8f4c9c">}</div><div class="notion-text notion-block-1b80dcb9d5444e0bbc6a51397b2c877b">//定时器 3</div><div class="notion-text notion-block-70f16f1434db421c8e2c2e366eb5957b">void Timer3_Init(uint16_t arr, uint16_t psc)</div><div class="notion-text notion-block-66a2430af5c442f6b866eed2268b0e11">{</div><div class="notion-text notion-block-ee79d6b0963b4110b4e8040c50fad5de">tim3.Instance = TIM3;</div><div class="notion-text notion-block-2dc38242fdc64012897e8314e0fb2e2e">tim3.Init.Period = arr;</div><div class="notion-text notion-block-db1b15b695134d83a50cc81837c71a81">tim3.Init.Prescaler = psc;</div><div class="notion-text notion-block-664dde8a4d0245a79dc70cd3812944b1">tim3.Init.CounterMode = TIM_COUNTERMODE_CENTERALIGNED1; //中央对齐模式</div><div class="notion-text notion-block-1857f5188acd46a898d0e2de17d077cf">tim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;<div class="notion-text-children"><div class="notion-text notion-block-4a589c189c16466c9afe9bb5c216c44f">tim3.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;</div><div class="notion-text notion-block-75fcedfef8f84d88bcc861ceb6f6067d">HAL_TIM_Base_Init(&amp;tim3); </div><div class="notion-text notion-block-52c696ee2761469893e7d871dd52834a">__HAL_TIM_CLEAR_FLAG(&amp;tim3, TIM_FLAG_UPDATE);</div><div class="notion-text notion-block-893ede93a4f44dbfbb0958759c4f32cc">/<em> 外部模式1 通道1 </em>/ //PB4 上升沿 上拉 抬起计数</div><div class="notion-text notion-block-a20d4428fdcb4d93869ec0fdba0c5dae">tim3_clock.ClockSource = TIM_CLOCKSOURCE_TI1;             // 通道1</div><div class="notion-text notion-block-9f6e081cc5384481814b89a7387808af">tim3_clock.ClockPolarity = TIM_CLOCKPOLARITY_RISING;      // 上升沿</div><div class="notion-text notion-block-0921bc816fb945028f22b7514d53fc97">tim3_clock.ClockFilter = 0x03;                            // 滤波</div><div class="notion-text notion-block-2684d1582902495b9f21810f37b480db">HAL_TIM_ConfigClockSource(&amp;tim3, &amp;tim3_clock);  //初始化定时器时钟配置</div><div class="notion-text notion-block-ab893816c6f7433885adce2839f4bf5c">__HAL_TIM_ENABLE_IT(&amp;tim3, TIM_IT_TRIGGER); //手动打开触发中断</div><div class="notion-text notion-block-c19ebe3fd7464d8d83bb9d67899562e6">HAL_TIM_Base_Start_IT(&amp;tim3);   //打开定时器（中断方式）</div></div></div><div class="notion-text notion-block-d225e3944e264e838bdbf904aa34ada3">}</div><div class="notion-text notion-block-2f20d0936a9c47c9a0c4fc225622df25">//定时器 4</div><div class="notion-text notion-block-e70dd4aaf242463999f91985b449b44d">void Timer4_Init(uint16_t arr, uint16_t psc)</div><div class="notion-text notion-block-16fb585c088941389ed1f8275de4c4f5">{</div><div class="notion-text notion-block-c13cf5444ccd4691acd2b577e7c08619">tim4.Instance = TIM4;</div><div class="notion-text notion-block-1b483f150b5c4aa6aa8d220c9a258daf">tim4.Init.Period = arr;</div><div class="notion-text notion-block-5295c89f9fda4c93a47d1a23dcd1da6e">tim4.Init.Prescaler = psc;</div><div class="notion-text notion-block-a0ca0418441c41b1b14944772308e250">tim4.Init.CounterMode = TIM_COUNTERMODE_UP;</div><div class="notion-text notion-block-8f694267d2a4459fa98e3fcd3db9f93d">tim4.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;</div><div class="notion-text notion-block-c9b1e30748c94c29b20cf92d34b6ab96">tim4.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;</div><div class="notion-text notion-block-f065592a55df42dbbb766b49ee7c72f0">HAL_TIM_Base_Init(&amp;tim4); </div><div class="notion-text notion-block-c03ccf5f54e44141b375f565b26e0f97">__HAL_TIM_CLEAR_FLAG(&amp;tim4, TIM_FLAG_UPDATE);</div><div class="notion-text notion-block-9c207090f82f468d805bb4a80a237c70">/<em> 外部模式1 通道2 </em>/ //PB7 下降沿 上拉 按下计数</div><div class="notion-text notion-block-f5b38a9d30214c429ca2a0da95329712">tim4_clock.ClockSource = TIM_CLOCKSOURCE_TI2;             // 通道2</div><div class="notion-text notion-block-e7230215d5c147c68a6f7d7c1b953af7">tim4_clock.ClockPolarity = TIM_CLOCKPOLARITY_FALLING;     // 下降沿</div><div class="notion-text notion-block-e4471c1cca2341a69ca70562f70fbc22">tim4_clock.ClockFilter = 0x03;                            // 滤波</div><div class="notion-text notion-block-aa0a5c6a5622429b861d82c4a5f02112">HAL_TIM_ConfigClockSource(&amp;tim4, &amp;tim4_clock);  //初始化定时器时钟配置</div><div class="notion-text notion-block-f8b758086c5a4361b55a5ef226a80d66">__HAL_TIM_ENABLE_IT(&amp;tim4, TIM_IT_TRIGGER); //手动打开触发中断</div><div class="notion-text notion-block-36a4ff21bec243ea9a6f310722b5c0a6">HAL_TIM_Base_Start_IT(&amp;tim4);   //打开定时器（中断方式）</div><div class="notion-text notion-block-ede19fa4ca944261ad2f13960d695641">}</div><div class="notion-text notion-block-66045a56db8b4b378e7aa4553aca61bd">//定时器 硬件初始化回调函数</div><div class="notion-text notion-block-b7cd1edd9ef6478b98ae57b626399c60">void HAL_TIM_Base_MspInit(TIM_HandleTypeDef *htim)</div><div class="notion-text notion-block-72050e7515cf47df98269237c42a05a4">{</div><div class="notion-text notion-block-188dbb9ceb84495fbf9901422ef55106">GPIO_InitTypeDef GPIO_InitType;</div><div class="notion-text notion-block-52cfadfd89614099a0f6927844703503">if(htim-&gt;Instance == TIM1){<div class="notion-text-children"><div class="notion-text notion-block-e59422ff587c46988743c9a7786f5c09">__HAL_RCC_TIM1_CLK_ENABLE();                //使能时钟</div><div class="notion-text notion-block-51f2bc969af14f26b4c051bbd71e3c06">/<em> 定时器1 外部模式1 ETR通道IO </em>/</div><div class="notion-text notion-block-37782591fecf4c5f9ec3795a30ca34d1">__HAL_RCC_GPIOA_CLK_ENABLE();</div><div class="notion-text notion-block-dce2fb2133f541cca98e1fb0532e1da3">GPIO_<a class="notion-link" href="http://InitType.Pin" target="_blank" rel="noopener noreferrer">InitType.Pin</a> = GPIO_PIN_12;</div><div class="notion-text notion-block-29effcfaae9a41289e063cebe4a6c3c5">GPIO_InitType.Mode = GPIO_MODE_AF_INPUT;</div><div class="notion-text notion-block-aeb1ebb319b94c73a4cfe58e7950d52b">GPIO_InitType.Pull = GPIO_PULLUP;           //低电平按下，上拉</div><div class="notion-text notion-block-9fe4f8a0b0a74e87ab9feb0965bac9c8">HAL_GPIO_Init(GPIOA,&amp;GPIO_InitType);</div></div></div><div class="notion-text notion-block-209297ff5e41489483bf7c5c71756340">//        __HAL_RCC_DMA1_CLK_ENABLE();</div><div class="notion-text notion-block-221b2801064f4fbc88bb1ffd56a667f8">//        </div><div class="notion-text notion-block-6210772a7a5e48bdb8379ccedd0f53ce">HAL_NVIC_SetPriority(TIM1_UP_IRQn, 3, 0);   //配置、打开 更新中断</div><div class="notion-text notion-block-f12c9df594084b87a287a4516b31c322">HAL_NVIC_EnableIRQ(TIM1_UP_IRQn);</div><div class="notion-text notion-block-2b5297ecdb63416bafbb38d34f2008e9">HAL_NVIC_SetPriority(TIM1_TRG_COM_IRQn, 3, 0);   //配置、打开 触发中断</div><div class="notion-text notion-block-e5e777908489439daff7da9bd5447e2d">HAL_NVIC_EnableIRQ(TIM1_TRG_COM_IRQn);</div><div class="notion-text notion-block-161a46b6016740f5b8c2e6e3d93563b2">//        </div><div class="notion-text notion-block-dc4f92ce7d9143b79f1ce780605e1db3">//        /<em> DMA配置 </em>/</div><div class="notion-text notion-block-e99204a8f1bb4931b811a1743cee6b21">//        tim1_dmaup.Instance = DMA1_Channel5;    </div><div class="notion-text notion-block-29e4936a854e4e21b00d46d9df435b3e">//        tim1_dmaup.Init.Direction = DMA_MEMORY_TO_PERIPH;   //存储区到外设</div><div class="notion-text notion-block-c804a2cec6644859915bce97337da466">//        tim1_dmaup.Init.MemInc = DMA_MINC_ENABLE;           //存储区递增</div><div class="notion-text notion-block-c7681bc1514e4f57bef5f5232f4de4fa">//        tim1_dmaup.Init.PeriphInc = DMA_PINC_DISABLE;       //外设不递增</div><div class="notion-text notion-block-2aa90b668e594dbf82793c5c9943399b">//        tim1_dmaup.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD;     //半字 2字节</div><div class="notion-text notion-block-8d7daffa203349168795fd2a0ce11c12">//        tim1_dmaup.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD;</div><div class="notion-text notion-block-8ce9e4d8333d4092ad1fa57d1059b1bd">//        tim1_dmaup.Init.Mode = DMA_CIRCULAR;  //循环模式</div><div class="notion-text notion-block-3762c41bf5334754a64b88c5e0b207a9">//        tim1_dmaup.Init.Priority = DMA_PRIORITY_MEDIUM;  </div><div class="notion-text notion-block-34699044d3c04f1ea41952a2121f4a95">//        __HAL_LINKDMA(&amp;tim1, hdma[TIM_DMA_ID_UPDATE], tim1_dmaup);</div><div class="notion-text notion-block-1a11b08f61694d6b95a1000fc9fa2bf3">//        HAL_DMA_Init(&amp;tim1_dmaup);</div><div class="notion-text notion-block-b97b2514f0e1473bbe3f644e04741649">//        </div><div class="notion-text notion-block-54a1d08972a64a25a59bdf2a2cabaf27">//        HAL_NVIC_SetPriority(DMA1_Channel5_IRQn, 3, 0);   //配置、打开 通道5的中断</div><div class="notion-text notion-block-d80fdafb183e4c8da57d481b05f17bef">//        HAL_NVIC_EnableIRQ(DMA1_Channel5_IRQn);</div><div class="notion-text notion-block-7609f9bc37754a1285e246b440550afc">//        </div><div class="notion-text notion-block-22d4212c09254786b5ae00eb06caf34e">}else if(htim-&gt;Instance == TIM2){<div class="notion-text-children"><div class="notion-text notion-block-bbb782eca2cd42dcaf88e6c01f50fec7">__HAL_RCC_TIM2_CLK_ENABLE();</div><div class="notion-text notion-block-a26a1877451846938528e4707a9ac6fa">__HAL_RCC_GPIOA_CLK_ENABLE();</div><div class="notion-text notion-block-9774683cb5db4551a5727b5f24e34561">__HAL_RCC_AFIO_CLK_ENABLE();</div><div class="notion-text notion-block-65481d2186954c2abce33a31d41f5bf8">__HAL_AFIO_REMAP_TIM2_ENABLE();</div><div class="notion-text notion-block-01fcee4e8d1d467598f50af059208bbb">//__HAL_AFIO_REMAP_TIM2_PARTIAL_1(); //(同样的功能)</div><div class="notion-text notion-block-337206424ac54060b81a523854f9101d">__HAL_AFIO_REMAP_SWJ_NOJTAG();</div><div class="notion-text notion-block-1923d9d7a1aa4f65a10b98d248a55eb9">/<em> 定时器2 外部模式1 通道1 重映射</em>/</div><div class="notion-text notion-block-f70b3c571d064962b1c0b5dc1c289e08">//GPIO_<a class="notion-link" href="http://InitType.Pin" target="_blank" rel="noopener noreferrer">InitType.Pin</a> = GPIO_PIN_0;</div><div class="notion-text notion-block-e47d3eac1dc04661ac2fa2237464c753">GPIO_<a class="notion-link" href="http://InitType.Pin" target="_blank" rel="noopener noreferrer">InitType.Pin</a> = GPIO_PIN_15;</div><div class="notion-text notion-block-5d8c4ed9ad10457ba7ced85ac9d984d9">GPIO_InitType.Mode = GPIO_MODE_AF_INPUT;</div><div class="notion-text notion-block-4ad56a597c644278866e5db2b05610e2">GPIO_InitType.Pull = GPIO_PULLUP;           //低电平按下，上拉</div><div class="notion-text notion-block-093efd6111574596afb29f9ef59ea711">HAL_GPIO_Init(GPIOA,&amp;GPIO_InitType);</div></div></div><div class="notion-text notion-block-2b23cdad79664905b74d00121f24261c">//        __HAL_RCC_DMA1_CLK_ENABLE();</div><div class="notion-text notion-block-b0cbad8ebf684b1db0911272d28b5420">HAL_NVIC_SetPriority(TIM2_IRQn, 3, 0);</div><div class="notion-text notion-block-915eb5a9f08a4de28982726c2b32c206">HAL_NVIC_EnableIRQ(TIM2_IRQn);</div><div class="notion-text notion-block-201c0353929047bf9db7b86e52c8fc0d">//        </div><div class="notion-text notion-block-193a2e897f554ab8a9ef55ae596ca806">//        /<em> DMA配置 </em>/</div><div class="notion-text notion-block-43d30ceb107b4b9488df5b918dc71df3">//        tim2_dmaup.Instance = DMA1_Channel2;    </div><div class="notion-text notion-block-97f14795a29e4d03822d06c34cfd219d">//        tim2_dmaup.Init.Direction = DMA_MEMORY_TO_PERIPH;</div><div class="notion-text notion-block-ee95ce5faaf647f6ad45d2a3b680033d">//        tim2_dmaup.Init.MemInc = DMA_MINC_ENABLE;</div><div class="notion-text notion-block-9b603ef7933745ac91b78365f73cb456">//        tim2_dmaup.Init.PeriphInc = DMA_PINC_DISABLE;</div><div class="notion-text notion-block-4f9653f2ce0947d3a15cd9269f92c385">//        tim2_dmaup.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD;</div><div class="notion-text notion-block-32e8f3bd07db436da16f4d0c0f4e0b86">//        tim2_dmaup.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD;</div><div class="notion-text notion-block-80300a3186224bb69e15741cc4b17caa">//        tim2_dmaup.Init.Mode = DMA_CIRCULAR;  //循环模式</div><div class="notion-text notion-block-84a32566500e47829c9813d16ed80bb9">//        tim2_dmaup.Init.Priority = DMA_PRIORITY_MEDIUM; </div><div class="notion-text notion-block-716769a512004ad588ce2f5e411b2ddd">//        __HAL_LINKDMA(&amp;tim2, hdma[TIM_DMA_ID_UPDATE], tim2_dmaup);</div><div class="notion-text notion-block-b105460622e348329a6cf40308cdca01">//        HAL_DMA_Init(&amp;tim2_dmaup);</div><div class="notion-text notion-block-cdc146b3e8984d23a4f4d0e9f04fa2ef">//        </div><div class="notion-text notion-block-90724334052e46e0a5a259f749bb6ad0">//        HAL_NVIC_SetPriority(DMA1_Channel2_IRQn, 3, 0);   //配置、打开 通道5的中断</div><div class="notion-text notion-block-5d76d682f1d3492e914b0a28458ce982">//        HAL_NVIC_EnableIRQ(DMA1_Channel2_IRQn);</div><div class="notion-text notion-block-c664b05ae85a4007ae849439438822e8">}else if(htim-&gt;Instance == TIM3){<div class="notion-text-children"><div class="notion-text notion-block-b15ebc573beb4e15898e755701fc1ceb">__HAL_RCC_TIM3_CLK_ENABLE();</div><div class="notion-text notion-block-376e5dea046d47849e9ee41682f719f2">//__HAL_RCC_GPIOA_CLK_ENABLE();</div><div class="notion-text notion-block-287266b5618a410ea9e8521752673255">__HAL_RCC_GPIOB_CLK_ENABLE();</div><div class="notion-text notion-block-37983fe0690742d7ab31ff4747c05beb">__HAL_RCC_AFIO_CLK_ENABLE();</div><div class="notion-text notion-block-58b90958fd43417a8de719ad377e9154">__HAL_AFIO_REMAP_TIM3_PARTIAL();    //部分映射</div><div class="notion-text notion-block-e1841def0b22449bace453f267c7eff8">__HAL_AFIO_REMAP_SWJ_NONJTRST();    //完全SW+JATG 但没有NJTRST</div><div class="notion-text notion-block-606cdfbd63ab4c79b13ce607ae368f1d">/<em> 定时器3 外部模式1 通道1 重映射</em>/</div><div class="notion-text notion-block-3ca233da7cb54b08bea3e8b9cf75f552">//GPIO_<a class="notion-link" href="http://InitType.Pin" target="_blank" rel="noopener noreferrer">InitType.Pin</a> = GPIO_PIN_6;</div><div class="notion-text notion-block-20b3e04385514744873c4eea761af640">GPIO_<a class="notion-link" href="http://InitType.Pin" target="_blank" rel="noopener noreferrer">InitType.Pin</a> = GPIO_PIN_4;</div><div class="notion-text notion-block-b8bbbd8f18734009a66950fd7aab5a8f">GPIO_InitType.Mode = GPIO_MODE_AF_INPUT;</div><div class="notion-text notion-block-e6148ee091ba475183bc65dcf8d23f21">GPIO_InitType.Pull = GPIO_PULLUP;           //低电平按下，上拉</div><div class="notion-text notion-block-3a5044cc4b954bac9e47582ee6c41c25">HAL_GPIO_Init(GPIOB,&amp;GPIO_InitType);</div></div></div><div class="notion-text notion-block-34c7f7ba744b47d798b2171b7681d4dc">//        __HAL_RCC_DMA1_CLK_ENABLE();</div><div class="notion-text notion-block-232af6bf35c04b9580f8c04b66fbc45a">HAL_NVIC_SetPriority(TIM3_IRQn, 3, 0);</div><div class="notion-text notion-block-7ffffcea9f844b7fb71c3d32175fe57c">HAL_NVIC_EnableIRQ(TIM3_IRQn);</div><div class="notion-text notion-block-ce6c947642e94cea890c58e609e1f6ea">//        </div><div class="notion-text notion-block-a1dc36f62f2a463a9a5e42818eb70e03">//        /<em> DMA配置 </em>/</div><div class="notion-text notion-block-7ff7f66d23504ebdab708c3b2044a318">//        tim3_dmaup.Instance = DMA1_Channel3;    </div><div class="notion-text notion-block-a39958b3d8ad42e897ba89726a2f647b">//        tim3_dmaup.Init.Direction = DMA_MEMORY_TO_PERIPH;</div><div class="notion-text notion-block-4b54efe25ac94953ae1e389f324728fb">//        tim3_dmaup.Init.MemInc = DMA_MINC_ENABLE;</div><div class="notion-text notion-block-692868e45e324493acf0db5e9ac82270">//        tim3_dmaup.Init.PeriphInc = DMA_PINC_DISABLE;</div><div class="notion-text notion-block-41f903b94bb64f1ea46c65cd7b349f8a">//        tim3_dmaup.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD;</div><div class="notion-text notion-block-77c8186899dd4ab19857c2b95c364748">//        tim3_dmaup.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD;</div><div class="notion-text notion-block-aeefe81ff3b645fda4b4ce654a12126e">//        tim3_dmaup.Init.Mode = DMA_CIRCULAR;  //循环模式</div><div class="notion-text notion-block-04acd50464984063b6a2ae4f64c81069">//        tim3_dmaup.Init.Priority = DMA_PRIORITY_MEDIUM; </div><div class="notion-text notion-block-483eafc87f3c493ba45726468b07e370">//        __HAL_LINKDMA(&amp;tim3, hdma[TIM_DMA_ID_UPDATE], tim3_dmaup);</div><div class="notion-text notion-block-8647f4c351de485eb6386bf5d1926b13">//        HAL_DMA_Init(&amp;tim3_dmaup);</div><div class="notion-text notion-block-319c7f674c484ea98397548b879a9fe8">//        </div><div class="notion-text notion-block-4064064a247d408f98ad858c47e49642">//        HAL_NVIC_SetPriority(DMA1_Channel3_IRQn, 3, 0);   //配置、打开 通道5的中断</div><div class="notion-text notion-block-87c55b2a00684206ad98750a702afb57">//        HAL_NVIC_EnableIRQ(DMA1_Channel3_IRQn);</div><div class="notion-text notion-block-b2b267d9eda6405bb2ac6e20282aa242">}else if(htim-&gt;Instance == TIM4){<div class="notion-text-children"><div class="notion-text notion-block-69f2408a740a4b9781e4dcbb9b1ead68">__HAL_RCC_TIM4_CLK_ENABLE();</div><div class="notion-text notion-block-5eeaab8be5254a05b7c7e263613910eb">/<em> 定时器4 外部模式1 通道2 </em>/</div><div class="notion-text notion-block-e3a3b38968094f4f938a632302edd880">__HAL_RCC_GPIOB_CLK_ENABLE();</div><div class="notion-text notion-block-2e855fd9d55a43829213da293ad671a0">GPIO_<a class="notion-link" href="http://InitType.Pin" target="_blank" rel="noopener noreferrer">InitType.Pin</a> = GPIO_PIN_7;</div><div class="notion-text notion-block-2aab6fe476334167a91708147eb4dea2">GPIO_InitType.Mode = GPIO_MODE_AF_INPUT;</div><div class="notion-text notion-block-68fdf348510c4580b3401d6c90e8e861">GPIO_InitType.Pull = GPIO_PULLUP;           //低电平按下，上拉</div><div class="notion-text notion-block-40c9b47228794ce1ae00a8c0242c79b4">HAL_GPIO_Init(GPIOB, &amp;GPIO_InitType);</div></div></div><div class="notion-text notion-block-cc6d719933db484581844810f2a99318">//        __HAL_RCC_DMA1_CLK_ENABLE();</div><div class="notion-text notion-block-340cfca9cef840bd9e8202370186e2d2">HAL_NVIC_SetPriority(TIM4_IRQn, 3, 0);</div><div class="notion-text notion-block-8258cc0678934a8ab36bac23e47cf368">HAL_NVIC_EnableIRQ(TIM4_IRQn);</div><div class="notion-text notion-block-9ae6f7b0d4304f16a78f555c51aedc94">//        </div><div class="notion-text notion-block-7ce8151e8ba0429392f2c1607d500a6a">//        /<em> DMA配置 </em>/</div><div class="notion-text notion-block-b490efbfad844f7cb102932d4329b010">//        tim4_dmaup.Instance = DMA1_Channel7;    </div><div class="notion-text notion-block-773e1ab82b5e4c859b000c5fa8931a69">//        tim4_dmaup.Init.Direction = DMA_MEMORY_TO_PERIPH;</div><div class="notion-text notion-block-26ea897b034a43c0bf5e53f14c1bfd5b">//        tim4_dmaup.Init.MemInc = DMA_MINC_ENABLE;</div><div class="notion-text notion-block-60e12bed899140a3853ae1466e661174">//        tim4_dmaup.Init.PeriphInc = DMA_PINC_DISABLE;</div><div class="notion-text notion-block-e3b5d08cc2cb4698bce51eb2caae306d">//        tim4_dmaup.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD;</div><div class="notion-text notion-block-06956714b65b46ddad28af70599ffc67">//        tim4_dmaup.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD;</div><div class="notion-text notion-block-b42b6855a80c4be2a8c70fefbc7824d6">//        tim4_dmaup.Init.Mode = DMA_CIRCULAR;  //循环模式</div><div class="notion-text notion-block-dc58b1b493bc48a79575604b5912b800">//        tim4_dmaup.Init.Priority = DMA_PRIORITY_MEDIUM; </div><div class="notion-text notion-block-8ff7682e61514043a4b13cbc52a99982">//        __HAL_LINKDMA(&amp;tim4, hdma[TIM_DMA_ID_UPDATE], tim4_dmaup);</div><div class="notion-text notion-block-b29d158a0bde41fa8e8828c393651ecc">//        HAL_DMA_Init(&amp;tim4_dmaup);</div><div class="notion-text notion-block-924b244b3e7e45c38d18ec50b9c809e4">//        </div><div class="notion-text notion-block-5d6fefd97b154e5d90614586954b9449">//        HAL_NVIC_SetPriority(DMA1_Channel7_IRQn, 3, 0);   //配置、打开 通道5的中断</div><div class="notion-text notion-block-3c4e238cbb78477b814940f9709555a4">//        HAL_NVIC_EnableIRQ(DMA1_Channel7_IRQn);</div><div class="notion-text notion-block-c7c5fd95e43f415f8d1cd7d0fda0679c">}</div><div class="notion-text notion-block-d23449aa773e46c392025f959143c243">}</div><div class="notion-text notion-block-34e69b14ca9f4cde9e35f29998977c53">//定时器 硬件 De 回调函数</div><div class="notion-text notion-block-37b23d9484e74e928143dbd5fd8b44b5">void HAL_TIM_Base_MspDeInit(TIM_HandleTypeDef *htim)</div><div class="notion-text notion-block-51a3e968bf2c4112847076f015da0cb0">{</div><div class="notion-text notion-block-64e593b5d6ee443e97dad8116d1ff9ff">if(htim-&gt;Instance == TIM1){<div class="notion-text-children"><div class="notion-text notion-block-88020a851b4a4462ba836ac83520317c">__HAL_RCC_TIM1_CLK_DISABLE();</div></div></div><div class="notion-text notion-block-e93c5d98f8874b2aa7e6194cb7a80a4c">}else if(htim-&gt;Instance == TIM2){<div class="notion-text-children"><div class="notion-text notion-block-40c3079834e64b3896a4dbf2d1d04602">__HAL_RCC_TIM2_CLK_DISABLE();</div></div></div><div class="notion-text notion-block-0ed8339f698e49aeb33c7a8081439029">}else if(htim-&gt;Instance == TIM3){<div class="notion-text-children"><div class="notion-text notion-block-1dfaf34be83f4ab0850e93bda720bef7">__HAL_RCC_TIM3_CLK_DISABLE();</div></div></div><div class="notion-text notion-block-e2e3c8d7636a465fa6082638b8328df5">}else if(htim-&gt;Instance == TIM4){<div class="notion-text-children"><div class="notion-text notion-block-c85ef72b5471408fa1cc9227bb1ff663">__HAL_RCC_TIM4_CLK_DISABLE();</div></div></div><div class="notion-text notion-block-a9ab8e9da72c4159bfdc6f4a9cc53b2e">}    </div><div class="notion-text notion-block-74a434bf6f17455e98dc691463643bd9">}</div><div class="notion-text notion-block-5cd8f411392e4835b84710ea0de2e01f">//更新中断  回调函数(同时也是DMA完成的回调函数)</div><div class="notion-text notion-block-f1feee48d299463899d9806f656f8656">uint16_t time1 = 1;</div><div class="notion-text notion-block-442c21c8c0c04b45b0080b3a6e494f29">uint16_t time2 = 1; </div><div class="notion-text notion-block-c36a6408330446e18fbe72654a435149">uint16_t time3 = 1;</div><div class="notion-text notion-block-9da70d590eea453a9fc3db9db3198a65">uint16_t time4 = 1;</div><div class="notion-text notion-block-15567717cfdc484cbabf56b1a197eb68">void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)</div><div class="notion-text notion-block-9878482f28b2431695c36bd47d738bb7">{    </div><div class="notion-text notion-block-bae805dfb7ac491a846d58f52311ff47">if(htim-&gt;Instance == TIM1){</div><div class="notion-text notion-block-415a939f9b49431ab2d15ba8548c8b11">//        /<em> 判断TIM是否为Ready状态，如果是 则是DMA完成中断进入的回调函数 </em>/</div><div class="notion-text notion-block-4648fcfc7fdc4320b6ba404a7b7c24fe">//        if(htim-&gt;State  == HAL_DMA_STATE_READY){</div><div class="notion-text notion-block-0f4581ff91e24a5eb40a58aac2720eea">//            U1_Printf(&quot;DMA1 完成中断rn&quot;);</div><div class="notion-text notion-block-7a9aff2d7507492dbc70e000580b37c5">//            htim-&gt;State = HAL_TIM_STATE_BUSY;           //设置定时器 BUSY状态</div><div class="notion-text notion-block-991ec942159e462c93fa989d1511bbcb">//        }else{</div><div class="notion-text notion-block-891f54d678ae4651ad4fabd938e9b504">//            U1_Printf(&quot;定时器 1 定时时间:%drn&quot;,time1++);</div><div class="notion-text notion-block-8a9ff98628bb4aabbce600bc2a9619cb">//        }</div><div class="notion-text notion-block-0b5f745aaab7406c9b5635b567710ca8">U1_Printf(&quot;定时器 1 更新事件rn&quot;);</div><div class="notion-text notion-block-ff9862b9ab94425c8a281bb837407cf0">}else if(htim-&gt;Instance == TIM2){</div><div class="notion-text notion-block-b3a6da2500e6442fa9c8014b60169c22">//        if(htim-&gt;State  == HAL_DMA_STATE_READY){</div><div class="notion-text notion-block-fff4d6f7b45845fb959fae60efecf09e">//            U1_Printf(&quot;DMA2 完成中断rn&quot;);</div><div class="notion-text notion-block-0e17f784290c45ab89195eb47b74add8">//            htim-&gt;State = HAL_TIM_STATE_BUSY;           //设置定时器 BUSY状态</div><div class="notion-text notion-block-c5113a65fa53484fb38d0462d6c06f30">//        }else{</div><div class="notion-text notion-block-72a104ff030f49e9bd6d108cd557669a">//            U1_Printf(&quot;定时器 2 定时时间:%drn&quot;,time2++);</div><div class="notion-text notion-block-55bebb7e1529451695178574c6d9bb9f">//        }</div><div class="notion-text notion-block-3059206f621e46bd9ed61be1a5def10f">U1_Printf(&quot;定时器 2 更新事件rn&quot;);</div><div class="notion-text notion-block-6318d409a1984c18bd2377b04748387f">}else if(htim-&gt;Instance == TIM3){</div><div class="notion-text notion-block-3f86465a00244076a60fe5dcaf1c505d">//         if(htim-&gt;State  == HAL_DMA_STATE_READY){</div><div class="notion-text notion-block-7a7efcba2738405aa8d560264f5a4914">//            U1_Printf(&quot;DMA3 完成中断rn&quot;);</div><div class="notion-text notion-block-256faf29022649b49cf0a78ede5a7ced">//            htim-&gt;State = HAL_TIM_STATE_BUSY;           //设置定时器 BUSY状态</div><div class="notion-text notion-block-caf56c8818e940e3abe6a38acf26eeb0">//        }else{</div><div class="notion-text notion-block-e2f0d10123844b3d81d78ff43724d8ec">//            U1_Printf(&quot;定时器 3 定时时间:%drn&quot;,time3++);</div><div class="notion-text notion-block-46a09e603dbe49dc874dfc41c6fb28b7">//        }</div><div class="notion-text notion-block-88e594648e3e4faf900f974bce37f837">U1_Printf(&quot;定时器 3 更新事件rn&quot;);</div><div class="notion-text notion-block-3e91df5075114cebb7a445ab7bbc99f2">}else if(htim-&gt;Instance == TIM4){</div><div class="notion-text notion-block-1cd948d82e0b41ad8721c6cb3f872cbc">//         if(htim-&gt;State  == HAL_DMA_STATE_READY){</div><div class="notion-text notion-block-9d9b92ea34e540cbb4efde688ca260fc">//            U1_Printf(&quot;DMA4 完成中断rn&quot;);</div><div class="notion-text notion-block-3ff01974ee03481caa3d7b1fad908bb4">//            htim-&gt;State = HAL_TIM_STATE_BUSY;           //设置定时器 BUSY状态</div><div class="notion-text notion-block-3d09b5c7165e497eb899110f8d4345e0">//        }else{</div><div class="notion-text notion-block-249033f1b12d4fdd8874bfa88f318626">//            U1_Printf(&quot;定时器 4 定时时间:%drn&quot;,time4++);</div><div class="notion-text notion-block-db2cb643dabd4a90a6537bf5915d05d2">//        }</div><div class="notion-text notion-block-e4cad95a37aa48ceaf9330a46b50fcf4">U1_Printf(&quot;定时器 4 更新事件rn&quot;);</div><div class="notion-text notion-block-344847971f4944d68dadfa683b3aa114">}</div><div class="notion-text notion-block-53423656840c45afbd3b050b08554de7">}</div><div class="notion-text notion-block-0b0c02d5be7c4dda86f46afc58677a87">//触发中断 回调函数</div><div class="notion-text notion-block-73531dc99abc45af8500052cd51d1897">void HAL_TIM_TriggerCallback(TIM_HandleTypeDef *htim)</div><div class="notion-text notion-block-bfaff7a0bf924c1eb74939a6681d43a9">{</div><div class="notion-text notion-block-ef9c1e0304f245179fc509e84fdb874e">if(htim-&gt;Instance == TIM1){<div class="notion-text-children"><div class="notion-text notion-block-744a99a0dffd454787c62362d7eb96a6">U1_Printf(&quot;定时器 1 触发事件:%drn&quot;, __HAL_TIM_GET_COUNTER(htim));  //输出当前计数值</div></div></div><div class="notion-text notion-block-51b9e8fd152c450e9c68a638695cd0a9">}else if(htim-&gt;Instance == TIM2){<div class="notion-text-children"><div class="notion-text notion-block-e7e6b9b1c63245a28d4e637f5a9bf1a2">U1_Printf(&quot;定时器 2 触发事件:%drn&quot;, __HAL_TIM_GET_COUNTER(htim));  //输出当前计数值</div></div></div><div class="notion-text notion-block-796fb7b1150f484491d02e04c9541eb0">}else if(htim-&gt;Instance == TIM3){<div class="notion-text-children"><div class="notion-text notion-block-e99e43da316f4e1b94ee3cd91c0b032d">U1_Printf(&quot;定时器 3 触发事件:%drn&quot;, __HAL_TIM_GET_COUNTER(htim));  //输出当前计数值</div></div></div><div class="notion-text notion-block-7657953dc4144332986001fe1f565d8b">}else if(htim-&gt;Instance == TIM4){<div class="notion-text-children"><div class="notion-text notion-block-7c4881c948a44ef2bde2e60bfc6d09c7">U1_Printf(&quot;定时器 4 触发事件:%drn&quot;, __HAL_TIM_GET_COUNTER(htim));  //输出当前计数值</div></div></div><div class="notion-text notion-block-f7bcd51858e643b7a45467717af37a46">}</div><div class="notion-text notion-block-ef80a8c5211c401987e34a7c9b966817">}</div><div class="notion-text notion-block-60d8d58484c04e69ab42f3b7bcb597f5">//DMA 半完成回调函数</div><div class="notion-text notion-block-c982b44d31dd45a88e68f2c1a981c686">void HAL_TIM_PeriodElapsedHalfCpltCallback(TIM_HandleTypeDef *htim)</div><div class="notion-text notion-block-7b43b539b9ad4c40a31cb03786d0f2df">{</div><div class="notion-text notion-block-21925c81e66548c39711b9c4c3ef24e5">if(htim-&gt;Instance == TIM1){<div class="notion-text-children"><div class="notion-text notion-block-fdc048e3c15948b0ac1bf4c35147aa57">U1_Printf(&quot;定时器 1 DMA半完成中断rn&quot;);</div><div class="notion-text notion-block-89559088a8f34cf096b8978428e365a8">htim-&gt;State = HAL_TIM_STATE_BUSY;           //设置定时器 BUSY状态</div></div></div><div class="notion-text notion-block-23b69c078afb4b17a18b7afb69a9d8ac">}else if(htim-&gt;Instance == TIM2){<div class="notion-text-children"><div class="notion-text notion-block-e330c2f09fb6457ea3f9cdbbf1ead677">U1_Printf(&quot;定时器 2 DMA半完成中断rn&quot;);</div><div class="notion-text notion-block-8610b5f7f7c24db9a28f543ef8da687d">htim-&gt;State = HAL_TIM_STATE_BUSY;           //设置定时器 BUSY状态</div></div></div><div class="notion-text notion-block-8f7b72618c7e46bab9210f2274927f92">}else if(htim-&gt;Instance == TIM3){<div class="notion-text-children"><div class="notion-text notion-block-3eabb89992574f8384abb443c88a3082">U1_Printf(&quot;定时器 3 DMA半完成中断rn&quot;);</div><div class="notion-text notion-block-b26862239e964675b0aa2071ae7757ab">htim-&gt;State = HAL_TIM_STATE_BUSY;           //设置定时器 BUSY状态</div></div></div><div class="notion-text notion-block-9dd33415130c470dbccf67392881468c">}else if(htim-&gt;Instance == TIM4){<div class="notion-text-children"><div class="notion-text notion-block-8ce59b6fd5534318828c945481b423ad">U1_Printf(&quot;定时器 4 DMA半完成中断rn&quot;);</div><div class="notion-text notion-block-35b92aafe4514539bee83b2170edd955">htim-&gt;State = HAL_TIM_STATE_BUSY;           //设置定时器 BUSY状态</div></div></div><div class="notion-text notion-block-bd64af15891c438d805ce0efad3ce62f">}</div><div class="notion-text notion-block-4476baae22c748a0b3b8b383bfc7edba">}<div class="notion-text-children"><details class="notion-toggle notion-block-6c66b7066abd47b5bccb19821f49067d"><summary><h4 class="notion-h notion-h3 notion-block-6c66b7066abd47b5bccb19821f49067d" data-id="6c66b7066abd47b5bccb19821f49067d"><span><div id="6c66b7066abd47b5bccb19821f49067d" class="notion-header-anchor"></div><span class="notion-h-title">time.h</span></span></h4></summary><div><div class="notion-text notion-block-8a735d5ea5ed44b6866621701366c5a5">#ifndef __TIME_H</div><div class="notion-text notion-block-7b7e13cebecb4209a0386a6f7e12a022">#define __TIME_H</div><div class="notion-text notion-block-76d1acac841549b79b0958e3f381f483">#include &quot;uart.h&quot;</div><div class="notion-text notion-block-71bae7ade44d48d888c2bf05f2f69e76">/<em> 对外声明总控结构体 </em>/</div><div class="notion-text notion-block-c431b38810f540ecbb7862abca88ea40">extern TIM_HandleTypeDef tim1;</div><div class="notion-text notion-block-77d999a6c54948f292df20228f158677">extern TIM_HandleTypeDef tim2;</div><div class="notion-text notion-block-30b5175f2f6f491d9dd63a0ab00bf977">extern TIM_HandleTypeDef tim3;</div><div class="notion-text notion-block-4b5b1813fd614805836301707db32533">extern TIM_HandleTypeDef tim4;</div><div class="notion-text notion-block-44a6addb0d0a4052b301ddce20c78794">extern DMA_HandleTypeDef tim1_dmaup;</div><div class="notion-text notion-block-96e161b096cd4c70825f61137fc14cc4">extern DMA_HandleTypeDef tim2_dmaup;</div><div class="notion-text notion-block-28ace1e2c9114c6aa0ad5e282dc3798c">extern DMA_HandleTypeDef tim3_dmaup;</div><div class="notion-text notion-block-65011871bd2f46e08f3f5415e831bf77">extern DMA_HandleTypeDef tim4_dmaup;</div><div class="notion-text notion-block-cdc939f2b51d48afba2182c654a525d5">/<em> 初始化函数 </em>/</div><div class="notion-text notion-block-1c62e97acab447d3a2c4881d8835ae49">void Timer1_Init(uint16_t arr, uint16_t psc, uint8_t rep);</div><div class="notion-text notion-block-88abcaac7bca4c9e8629586f73493d97">void Timer2_Init(uint16_t arr, uint16_t psc);</div><div class="notion-text notion-block-fd46a093916a41058c208112421e260d">void Timer3_Init(uint16_t arr, uint16_t psc);</div><div class="notion-text notion-block-662630a8fdb04371a11325093021fdc3">void Timer4_Init(uint16_t arr, uint16_t psc);</div><div class="notion-text notion-block-666aff9748644d2984191decd60c9bb5">#endif</div><details class="notion-toggle notion-block-d7a3a0da1cee47ab8812e3a5b01efa16"><summary><h4 class="notion-h notion-h3 notion-block-d7a3a0da1cee47ab8812e3a5b01efa16" data-id="d7a3a0da1cee47ab8812e3a5b01efa16"><span><div id="d7a3a0da1cee47ab8812e3a5b01efa16" class="notion-header-anchor"></div><span class="notion-h-title">main.c</span></span></h4></summary><div><div class="notion-text notion-block-7fe73ae92a2e4ff0aa5819f55c926aa9">#include &quot;stm32f1xx_hal.h&quot;</div><div class="notion-text notion-block-ab96623586524f88884297ff2415b417">#include &quot;rcc.h&quot;</div><div class="notion-text notion-block-7ae0c02fe0e7427eb7e4dd8c537fa008">#include &quot;led.h&quot;</div><div class="notion-text notion-block-90621bdcbda742f9add1a538ca5e200a">#include &quot;sw.h&quot;</div><div class="notion-text notion-block-3cab5daddb144ef5a1dbb1ad1878efd1">#include &quot;uart.h&quot;</div><div class="notion-text notion-block-fa17cec911b74f2e954835aded58c728">#include &quot;time.h&quot;</div><div class="notion-text notion-block-acd26d887634466480f7300ec5789aec">int main(void){<div class="notion-text-children"><div class="notion-text notion-block-9e294f10f5554d318386e024adbbf2c6">HAL_Init();</div><div class="notion-text notion-block-2da8a68a2cf54855a8f54facfd925e3f">RccClock_Init();</div><div class="notion-text notion-block-3f6377ae08a8468097bc01db69bacaf6">U1_Init(921600);</div><div class="notion-text notion-block-8f21c94783c84cdf843e6305eceb056b">Timer1_Init(5 - 1, 0, 1 - 1);         //5次有效边沿</div><div class="notion-text notion-block-52e0fb80e6104b178738f9a4cb1e29e8">Timer2_Init(5 - 1, 0);   // 5次</div><div class="notion-text notion-block-27759eb663ee4f6fb60d46c3a798a742">Timer3_Init(5 - 1, 0);   // 5次</div><div class="notion-text notion-block-79b17c2f498746079f2daf2faf935fff">Timer4_Init(5 - 1, 0);   // 5次</div><div class="notion-text notion-block-31d21cb9aaa245cf9acfe8fb11d45721">U1_Printf(&quot;初始化完成rn&quot;);</div><div class="notion-text notion-block-9a47f99cfd0e4d8dbdd1acf761ad10b3">while(1){</div><div class="notion-text notion-block-2f13ebb8d2b547258bc01971ae944a74">}</div></div></div><div class="notion-text notion-block-1acce2129790446f89858f3fc2ee6f70">}</div></div></details></div></details></div></div><details class="notion-toggle notion-block-242b079e581440259a93ddd163879e7b"><summary><h4 class="notion-h notion-h3 notion-block-242b079e581440259a93ddd163879e7b" data-id="242b079e581440259a93ddd163879e7b"><span><div id="242b079e581440259a93ddd163879e7b" class="notion-header-anchor"></div><span class="notion-h-title">stm32f1xx_it.c</span></span></h4></summary><div><div class="notion-text notion-block-27a9bdf700c54b11b57b7debd9bf3ead">/<em>-------------------------------------------------</em>/</div><div class="notion-text notion-block-ce66b56a569f4d06bc790685d89a07de">/<em>                                                 </em>/</div><div class="notion-text notion-block-de4242544e504d3ba8f5f0c52634e485">/<em>          实现各种中断服务函数的源文件           </em>/</div><div class="notion-text notion-block-aaf1dffb97044a7eb725ddef39e0fad1">/<em>                                                 </em>/</div><div class="notion-text notion-block-432b0efaa1064067819192fa2aaa6918">/<em>-------------------------------------------------</em>/</div><div class="notion-text notion-block-312b3deafbd348e6b60fa933cda0fa79">#include &quot;stm32f1xx_hal.h&quot;   </div><div class="notion-text notion-block-30ab74329b9f44f18260d41776c6afe0">#include &quot;stm32f1xx_it.h&quot;</div><div class="notion-text notion-block-e16e87dede25431a8013c9148a528a54">#include &quot;uart.h&quot;</div><div class="notion-text notion-block-58f45e1f48744548a89afcfbb1b136c2">#include &quot;time.h&quot;</div><div class="notion-text notion-block-69e0db59ff5a41e59059400230b295b3">void EXTI15_10_IRQHandler(void)</div><div class="notion-text notion-block-fb70eeb7728449d9bcecaeaf53e2353a">{<div class="notion-text-children"><div class="notion-text notion-block-db5edd61bbe147a4b5bc1d8516ea38e6">HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_14);</div></div></div><div class="notion-text notion-block-93a9c5af74c246978b39b01c081d4b3c">}</div><div class="notion-text notion-block-ec87f4ff61a14d7d9301c8ce334181f0">void EXTI0_IRQHandler(void)</div><div class="notion-text notion-block-9887a81e9b414435a3cbee7019011b6e">{<div class="notion-text-children"><div class="notion-text notion-block-1aec20a33221424aa32f3a3262c3c5c0">HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_0);</div></div></div><div class="notion-text notion-block-cd481770c92d472abeccc4ca705f3a3d">}</div><div class="notion-text notion-block-17e8a49643c2497f90e82bc29b19063c">void USART1_IRQHandler(void)</div><div class="notion-text notion-block-03516f4a3c5f4accb14cbaf462e446fc">{<div class="notion-text-children"><div class="notion-text notion-block-0ce73a49aa8b4fa093440a15930fbe96">HAL_UART_IRQHandler(&amp;uart1.uart);</div><div class="notion-text notion-block-2782ff91bfd5455688b90b36cad041b7">if(__HAL_UART_GET_FLAG(&amp;uart1.uart, UART_FLAG_IDLE)){<div class="notion-text-children"><div class="notion-text notion-block-e619dd69da1c4840863f943c32b3773c">__HAL_UART_CLEAR_IDLEFLAG(&amp;uart1.uart);</div><div class="notion-text notion-block-e0974e204e824390ab8705b4a91fc897">uart1.RxCounter += (U1_RX_MAX - __HAL_DMA_GET_COUNTER(&amp;uart1.dmarx));</div><div class="notion-text notion-block-77004a6c575f46f3a94ee933dc406195">HAL_UART_AbortReceive_IT(&amp;uart1.uart);</div></div></div><div class="notion-text notion-block-676755b420d24846b229b2b481362dbc">}</div></div></div><div class="notion-text notion-block-fdf1fe04e2744f53a08b1007554961f5">}</div><div class="notion-text notion-block-3405c423fb484fdd8979ec0828c85f92">void USART2_IRQHandler(void)</div><div class="notion-text notion-block-35513ba78fab47fb9325f594c02d879f">{<div class="notion-text-children"><div class="notion-text notion-block-e8aee28ec896499f80baacdc43d38ece">HAL_UART_IRQHandler(&amp;uart2.uart);</div><div class="notion-text notion-block-2c7b0eab68de44deac07d53ae501b11d">if(__HAL_UART_GET_FLAG(&amp;uart2.uart, UART_FLAG_IDLE)){<div class="notion-text-children"><div class="notion-text notion-block-ae2073f1df39490193af460148b944b9">__HAL_UART_CLEAR_IDLEFLAG(&amp;uart2.uart);</div><div class="notion-text notion-block-359d6819055748be97e2b572e04bbf25">uart2.RxCounter += (U2_RX_MAX - __HAL_DMA_GET_COUNTER(&amp;uart2.dmarx));</div><div class="notion-text notion-block-4ec776643de24feeb338329da7a78ee1">HAL_UART_AbortReceive_IT(&amp;uart2.uart);</div></div></div><div class="notion-text notion-block-8c5895cafeaa482da40ee947c7e7a2c7">}</div></div></div><div class="notion-text notion-block-8fb5bfa3f8824b89b917439d17dc0e19">}</div><div class="notion-text notion-block-3a269e6e9cd84abdbbded8271ba5e532">void USART3_IRQHandler(void)</div><div class="notion-text notion-block-e6bb669ce5bd4851b34db8456f40d411">{<div class="notion-text-children"><div class="notion-text notion-block-8fc7e8bf87aa45969d5e3cbf206833e9">HAL_UART_IRQHandler(&amp;uart3.uart);</div><div class="notion-text notion-block-e2dcf114259e4849899ee8afb0c4f7b6">if(__HAL_UART_GET_FLAG(&amp;uart3.uart, UART_FLAG_IDLE)){<div class="notion-text-children"><div class="notion-text notion-block-10396983037e493d8364d1ec4c31fe6d">__HAL_UART_CLEAR_IDLEFLAG(&amp;uart3.uart);</div><div class="notion-text notion-block-5610b5db4e0844a69cd640579349ab2d">uart3.RxCounter += (U3_RX_MAX - __HAL_DMA_GET_COUNTER(&amp;uart3.dmarx));</div><div class="notion-text notion-block-0897f2dbc42640ae92f54839283478f2">HAL_UART_AbortReceive_IT(&amp;uart3.uart);</div></div></div><div class="notion-text notion-block-dce467e91479446ba6fba95245ac144c">}</div></div></div><div class="notion-text notion-block-d6d38bc7ca674ef3b231b6b4c99377eb">}</div><div class="notion-text notion-block-821670a491194521829dfa771b3e8aba">void DMA1_Channel4_IRQHandler(void)</div><div class="notion-text notion-block-f251e9002f104a23ae83622327a91ac1">{<div class="notion-text-children"><div class="notion-text notion-block-2c9d908a12eb405c848e7b470dcb41cf">HAL_DMA_IRQHandler(&amp;uart1.dmatx);</div></div></div><div class="notion-text notion-block-b6f37fb08522454a8886070571013e23">}</div><div class="notion-text notion-block-9f81949683094c0f82bb8fdff899ba3a">//void DMA1_Channel5_IRQHandler(void)</div><div class="notion-text notion-block-65a34242605d47138b7ed46050c20125">//{</div><div class="notion-text notion-block-db27f95fae6d4b1d819ae3c4213a37e4">//    HAL_DMA_IRQHandler(&amp;uart1.dmarx);</div><div class="notion-text notion-block-598fc95057a14d90adad60e5efc77acf">//}</div><div class="notion-text notion-block-7dcbf0722a0f435798b5e772b12ecc0e">//void DMA1_Channel7_IRQHandler(void)</div><div class="notion-text notion-block-2d2bc9496ec7470691497b206e026910">//{</div><div class="notion-text notion-block-a336ef91156644708b850ffe50032c83">//    HAL_DMA_IRQHandler(&amp;uart2.dmatx);</div><div class="notion-text notion-block-8e9809e60ec44d699fe4777a5747da5a">//}</div><div class="notion-text notion-block-e5a293e5ca9345c09e930904d5695525">void DMA1_Channel6_IRQHandler(void)</div><div class="notion-text notion-block-528bb0bbfbb64741a1a29287e94e9a9f">{<div class="notion-text-children"><div class="notion-text notion-block-8e81e708438d4da796572a95a9e2a6be">HAL_DMA_IRQHandler(&amp;uart2.dmarx);</div></div></div><div class="notion-text notion-block-d937ed93930348a3ad176a9e8af537fc">}</div><div class="notion-text notion-block-48c37846042e4d4bbee233507dfa1370">//void DMA1_Channel2_IRQHandler(void)</div><div class="notion-text notion-block-8300528763fa4f4895687436502ebe8d">//{</div><div class="notion-text notion-block-b6292d5b7d204bf68182ce9d8e0f8b83">//    HAL_DMA_IRQHandler(&amp;uart3.dmatx);</div><div class="notion-text notion-block-131651c40abe4b4495859c87af570a14">//}</div><div class="notion-text notion-block-90f98326abb34bc3a528d1fdb40e61cb">//void DMA1_Channel3_IRQHandler(void)</div><div class="notion-text notion-block-4594d94205334d8a91d7d2909ec8bb80">//{</div><div class="notion-text notion-block-05645d0751b744ffb98032ff909bd2ea">//    HAL_DMA_IRQHandler(&amp;uart3.dmarx);</div><div class="notion-text notion-block-b3808e985fa94b28bd87f9c383b6cb2e">//}</div><div class="notion-text notion-block-10187e5146ed408e9d2ea8546207ac43">void DMA1_Channel5_IRQHandler(void)</div><div class="notion-text notion-block-6f8d4476de964ea08dacbd5e1945d7a2">{<div class="notion-text-children"><div class="notion-text notion-block-836b6ceed0014f16b14b837e241983f7">HAL_DMA_IRQHandler(&amp;tim1_dmaup);</div></div></div><div class="notion-text notion-block-2bba107d7069459a810a544d045ac472">}</div><div class="notion-text notion-block-3f20de92b1e14e54bba9e5f7da5c3c9c">void DMA1_Channel2_IRQHandler(void)</div><div class="notion-text notion-block-68f7c91e45dd4a1d93c81f3153121e09">{</div><div class="notion-text notion-block-87954984f6f54de9874ea66c2339bbe6">HAL_DMA_IRQHandler(&amp;tim2_dmaup);</div><div class="notion-text notion-block-81572fb93cbc4bbbbdd09e46f2462249">}</div><div class="notion-text notion-block-c2745cd9c84e4fc1b792d56a2db1b96d">void DMA1_Channel3_IRQHandler(void)</div><div class="notion-text notion-block-052ce13236de45ce9255de19c41b329f">{</div><div class="notion-text notion-block-03f63bad2ee04fafad145ba9954eb377">HAL_DMA_IRQHandler(&amp;tim3_dmaup);</div><div class="notion-text notion-block-7829c64d072f4caf9c6361cf46e0d16f">}</div><div class="notion-text notion-block-b4ca5bf7f4ba4bccb4af9216a5a362c6">void DMA1_Channel7_IRQHandler(void)</div><div class="notion-text notion-block-d4ccdb5b4846416fbbd33d7ca01ce455">{</div><div class="notion-text notion-block-0c711bdb21d94f2880decedd77d11484">HAL_DMA_IRQHandler(&amp;tim4_dmaup);</div><div class="notion-text notion-block-8d6e3ffc87754363bff772f2cdbfb5a7">}</div><div class="notion-text notion-block-47752c8f67304f90abc478d21d201e28">void TIM1_UP_IRQHandler(void)</div><div class="notion-text notion-block-e288a16b81704e2dbbd37409197160b8">{</div><div class="notion-text notion-block-5ca3108396774f748cc63f25040fdd83">HAL_TIM_IRQHandler(&amp;tim1);</div><div class="notion-text notion-block-aecbc066dd7047f9bd2abfa9ac5e0915">}</div><div class="notion-text notion-block-27e93e0b0f9741ae86d250b05d62f4c2">void TIM1_TRG_COM_IRQHandler(void)</div><div class="notion-text notion-block-cf314ab157534448996334fb74987b85">{</div><div class="notion-text notion-block-2633b6ce3d9740b3831aaf1f6081cec4">HAL_TIM_IRQHandler(&amp;tim1);</div><div class="notion-text notion-block-99dcf312880d46298a98248f3b4f16af">}</div><div class="notion-text notion-block-c022bdee0b9c454584b58f0003488298">void TIM2_IRQHandler(void)</div><div class="notion-text notion-block-c25cd90c9fde4be78dfe49b2242f9f4e">{</div><div class="notion-text notion-block-628ca6172b2f46bda69a2bfaf6c5874f">HAL_TIM_IRQHandler(&amp;tim2);</div><div class="notion-text notion-block-32d93f1c7ffb4936b384d4cb7ab3f1ac">}</div><div class="notion-text notion-block-f38a2bdb8fea4614896612fbe98d8197">void TIM3_IRQHandler(void)</div><div class="notion-text notion-block-e14e792fb9df452cbba047a401428c18">{</div><div class="notion-text notion-block-31ab79b2bd4c4fd6928d0c6c4dd1a7f0">HAL_TIM_IRQHandler(&amp;tim3);</div><div class="notion-text notion-block-7d89fb4c625543e9ae1e2ad3b6b2a223">}</div><div class="notion-text notion-block-181ca011b0e14529bc70856bc362972a">void TIM4_IRQHandler(void)</div><div class="notion-text notion-block-7600f5f63a7740afae070f06477fd716">{</div><div class="notion-text notion-block-38dc2daed95e448d93583d1490b82f39">HAL_TIM_IRQHandler(&amp;tim4);</div><div class="notion-text notion-block-a6370a789bb543389427f86fbfdc81ce">}</div><div class="notion-text notion-block-f29adc41e4974e7cbb00b9044a9cfaf2">/<em>-------------------------------------------------</em>/</div><div class="notion-text notion-block-7d4fd6b052e644b282a920c2becb3c9c">/<em>函数名：不可屏蔽中断处理函数                     </em>/</div><div class="notion-text notion-block-77912c4d54e64049b6dfbdcdec7ef09c">/<em>参  数：无                                       </em>/</div><div class="notion-text notion-block-7d42e16c98e14d7f905e753165cf7784">/<em>返回值：无                                       </em>/</div><div class="notion-text notion-block-4b20592c64b34c99902959afcc56d51a">/<em>-------------------------------------------------</em>/</div><div class="notion-text notion-block-44386fa6b9b448ea8cceccdbcb05b9af">void NMI_Handler(void)</div><div class="notion-text notion-block-5742508d3f66491fb255da13c9982e4e">{</div><div class="notion-text notion-block-f21a6df6351446e99f80214d50791926">}</div><div class="notion-text notion-block-376f97670448417e8bc5fcc24ffae840">/<em>-------------------------------------------------</em>/</div><div class="notion-text notion-block-8053476de5b34eabb6c81fae75b65b7b">/<em>函数名：硬件出错后进入的中断处理函数             </em>/</div><div class="notion-text notion-block-b19212c2413e4e529a7887ffddb44dfa">/<em>参  数：无                                       </em>/</div><div class="notion-text notion-block-1fb3d9a2f4104b6690c627db6d4eeb37">/<em>返回值：无                                       </em>/</div><div class="notion-text notion-block-5351bbf905f7440e98e8f5413f09f197">/<em>-------------------------------------------------</em>/</div><div class="notion-text notion-block-1ee1966cf5c04e60a65a1e28dbbd28b5">void HardFault_Handler(void)</div><div class="notion-text notion-block-7859e3ec59bc4f618564734818cc11eb">{</div><div class="notion-text notion-block-2be9da04157b410f813728cc34f81039">}</div></div></details><div class="notion-text notion-block-ac9810a6b64a49039f6790bf5da12e73">/<em>-------------------------------------------------</em>/</div><div class="notion-text notion-block-269fa22af032454f93ee1b068f214b50">/<em>函数名：软中断，SWI 指令调用的处理函数           </em>/</div><div class="notion-text notion-block-c335cd06c14546cab547ad664e94b149">/<em>参  数：无                                       </em>/</div><div class="notion-text notion-block-2233d310e3b649c5926af183b096018b">/<em>返回值：无                                       </em>/</div><div class="notion-text notion-block-eb1c159264b24c21ab95a339f7320786">/<em>-------------------------------------------------</em>/</div><div class="notion-text notion-block-53b441b5eb504dcead14b2fc6b4f5a3a">void SVC_Handler(void)</div><div class="notion-text notion-block-fc7d474a5d964874895d914ecca7fb8c">{</div><div class="notion-text notion-block-16298099677f4268be700dd081b88e50">}</div><div class="notion-text notion-block-83ecedc0322e4a34800063596e224166">/<em>-------------------------------------------------</em>/</div><div class="notion-text notion-block-cf720a639fd54d5899d9054c5eda1b9f">/<em>函数名：可挂起的系统服务处理函数                 </em>/</div><div class="notion-text notion-block-cc0f8e953e7a4b0a8263203fa89a1ffc">/<em>参  数：无                                       </em>/</div><div class="notion-text notion-block-55266fdb3ef74ec593f1a31cd3ab4458">/<em>返回值：无                                       </em>/</div><div class="notion-text notion-block-f9c0a22c4ce94d729842f057e1ee25cc">/<em>-------------------------------------------------</em>/</div><div class="notion-text notion-block-6d58d8bf72f14a5fa55bf99eea0353d0">void PendSV_Handler(void)</div><div class="notion-text notion-block-035161293d314f98b4a784b8d6d0d2f3">{</div><div class="notion-text notion-block-69f2651befa746f9bbf1dae362bd3414">}</div><div class="notion-text notion-block-924df27e806440548711734d0b9d9a55">/<em>-------------------------------------------------</em>/</div><div class="notion-text notion-block-0267ee42f53f4ca5a51556b0c55f540d">/<em>函数名：SysTic系统嘀嗒定时器处理函数             </em>/</div><div class="notion-text notion-block-f6a6794cd4b84c14817a6641ce99f11d">/<em>参  数：无                                       </em>/</div><div class="notion-text notion-block-961569488da4431a86ff8683a7b35443">/<em>返回值：无                                       </em>/</div><div class="notion-text notion-block-c718d6542cc74f98b0408ed7ade37c5a">/<em>-------------------------------------------------</em>/</div><div class="notion-text notion-block-45be5e9d0c79487dae8d078f34c50063">void SysTick_Handler(void)</div><div class="notion-text notion-block-34517926117243e099c2a66fd1f85ea8">{  <div class="notion-text-children"><div class="notion-text notion-block-d87f64e98e8e4c00a9c07a318faa16f5">HAL_IncTick();	</div></div></div><div class="notion-text notion-block-a3bf2a099a734a9eb4a219ecb8aaf839">}</div></div></details><details class="notion-toggle notion-block-6af1749d3b3d4310a763f4e450a32451"><summary><h3 class="notion-h notion-h2 notion-h-indent-1 notion-block-6af1749d3b3d4310a763f4e450a32451" data-id="6af1749d3b3d4310a763f4e450a32451"><span><div id="6af1749d3b3d4310a763f4e450a32451" class="notion-header-anchor"></div><span class="notion-h-title">六、HAL库：TIM1234 外部模式1 DMA单次/循环模式 中断方式 按键计数</span></span></h3></summary><div><details class="notion-toggle notion-block-1bcd352219764238b189e8d303fbc5fe"><summary><h4 class="notion-h notion-h3 notion-block-1bcd352219764238b189e8d303fbc5fe" data-id="1bcd352219764238b189e8d303fbc5fe"><span><div id="1bcd352219764238b189e8d303fbc5fe" class="notion-header-anchor"></div><span class="notion-h-title">1. 注意事项*</span></span></h4></summary><div><ol start="1" class="notion-list notion-list-numbered notion-block-2c99807ad09f4ab7af104cba3572d780" style="list-style-type:decimal"><li>DMA方式，HAL库不会开启任何中断，需要自己开启更新和触发中断</li></ol><ol start="2" class="notion-list notion-list-numbered notion-block-4204d616ddde4ba58155346654dcdfe9" style="list-style-type:decimal"><li>注意定时器与别的外设 引脚冲突</li></ol><ol start="3" class="notion-list notion-list-numbered notion-block-47a05ba5bf2f4197919c4189084f2b3b" style="list-style-type:decimal"><li>普通的更新中断与DMA完成中断共用一个回调函数</li></ol></div></details><details class="notion-toggle notion-block-19dd034af02b4442bf41d7ce8399b2a5"><summary><h4 class="notion-h notion-h3 notion-block-19dd034af02b4442bf41d7ce8399b2a5" data-id="19dd034af02b4442bf41d7ce8399b2a5"><span><div id="19dd034af02b4442bf41d7ce8399b2a5" class="notion-header-anchor"></div><span class="notion-h-title">2. 简单介绍</span></span></h4></summary><div><div class="notion-text notion-block-41c497b9596f4765aede618590ee270a">DMA方式，会在每次更新时，传递新的值到ARR重载值，我们初始
化的时候设置ARR为5，然后启动DMA 4次传输分别传输6,7,8,9。</div><div class="notion-text notion-block-682028acd55c45b7b73e238dd0db4b5b">对于单次DMA向上计数，第一次5+1个有效边沿，第二次6+1个有效
边沿，第三次7+1个有效边沿，第四次8+1个有效边沿，第五次9+1
个有效边沿，之后一直都是9+1个有效边沿。</div><div class="notion-text notion-block-86ac90e73fae417fb3e5d330320e9e74">对于循环DMA向上计数，第一次5+1个有效边沿，第二次6+1个有效
边沿，第三次7+1个有效边沿，第四次8+1个有效边沿，第五次9+1
个有效边沿，第六次6+1个有效边沿，第七次7+1个有效边沿，第八
次8+1个有效边沿，第九次9+1个有效边沿，第十次6+1个有效边
沿.......往复循环</div></div></details><details class="notion-toggle notion-block-ecadcbc607ca4713860268dfbaa24ab1"><summary><h4 class="notion-h notion-h3 notion-block-ecadcbc607ca4713860268dfbaa24ab1" data-id="ecadcbc607ca4713860268dfbaa24ab1"><span><div id="ecadcbc607ca4713860268dfbaa24ab1" class="notion-header-anchor"></div><span class="notion-h-title">2. 相关函数</span></span></h4></summary><div><ul class="notion-list notion-list-disc notion-block-2ef05e160f5a4da98c09f02b0d2c6bcf"><li><code class="notion-inline-code">__HAL_TIM_ENABLE_IT(&amp;tim3, TIM_IT_TRIGGER); </code>  手动打开中断</li></ul><ul class="notion-list notion-list-disc notion-block-0c58113e8a47497999fe64aa46633d9c"><li><code class="notion-inline-code">HAL_TIM_Base_Start_DMA(&amp;tim4); </code>  打开定时器（DMA方式）</li></ul></div></details><details class="notion-toggle notion-block-87b61dd0a3d5488b803e435c96394199"><summary><h4 class="notion-h notion-h3 notion-block-87b61dd0a3d5488b803e435c96394199" data-id="87b61dd0a3d5488b803e435c96394199"><span><div id="87b61dd0a3d5488b803e435c96394199" class="notion-header-anchor"></div><span class="notion-h-title">3. 程序</span></span></h4></summary><div><details class="notion-toggle notion-block-2242060427b1498282f5081bffcdd72c"><summary><h4 class="notion-h notion-h3 notion-block-2242060427b1498282f5081bffcdd72c" data-id="2242060427b1498282f5081bffcdd72c"><span><div id="2242060427b1498282f5081bffcdd72c" class="notion-header-anchor"></div><span class="notion-h-title">time.c</span></span></h4></summary><div><div class="notion-text notion-block-bd34adaa1a24490f96f76f2a957edd7b">#include &quot;stm32f1xx_hal.h&quot;</div><div class="notion-text notion-block-ca8c513a372648bf96bd58a75f788c6c">#include &quot;time.h&quot;</div><div class="notion-text notion-block-11a7936212fc40e296abefd2605c2103">TIM_HandleTypeDef tim1; //定时器结构体</div><div class="notion-text notion-block-86fd244e7ac848cf8f4e1354cd0e05bd">TIM_HandleTypeDef tim2; </div><div class="notion-text notion-block-386c6b8a3df4464abea0678de53e5f92">TIM_HandleTypeDef tim3; </div><div class="notion-text notion-block-51c75958ca8345cdb5cc865c91dbe9d6">TIM_HandleTypeDef tim4; </div><div class="notion-text notion-block-e3434f1cd5d244479b1ffa6fba9dee45">DMA_HandleTypeDef tim1_dmaup;   //DMA通道配置结构体</div><div class="notion-text notion-block-c2dc00fa087a44f6b58649ba234a0917">DMA_HandleTypeDef tim2_dmaup;</div><div class="notion-text notion-block-9ac9389a62ca434194eb8df46636cbf0">DMA_HandleTypeDef tim3_dmaup;</div><div class="notion-text notion-block-468c82df18b14980ba9e9c3b99ad78aa">DMA_HandleTypeDef tim4_dmaup;</div><div class="notion-text notion-block-59b4731a6de0452cbdc82a616a1cd95c">TIM_ClockConfigTypeDef tim1_clock;  //时钟配置结构体</div><div class="notion-text notion-block-1137bd2e644b4354bf776bab2ad36ea2">TIM_ClockConfigTypeDef tim2_clock;</div><div class="notion-text notion-block-b7fa7813a7de479e9f020f8f06dc2782">TIM_ClockConfigTypeDef tim3_clock;</div><div class="notion-text notion-block-5480dad7ffb24412af66a306daa45fe3">TIM_ClockConfigTypeDef tim4_clock;</div><div class="notion-text notion-block-5ef382e0173849ab87aea9e53e9e80e6">uint16_t tim1_dmaBuff[4] = {6, 7, 8, 9};</div></div></details></div></details><div class="notion-text notion-block-ac4a12fa90b6453dbc9cb3b3892bb0bf">uint16_t tim2_dmaBuff[4] = {6, 7, 8, 9};</div><div class="notion-text notion-block-5b74822675134d909034ad019fcae7d6">uint16_t tim3_dmaBuff[4] = {6, 7, 8, 9};</div><div class="notion-text notion-block-9bd8825e1f0e4ca893f5d2e0fc389303">uint16_t tim4_dmaBuff[4] = {6, 7, 8, 9};</div><div class="notion-text notion-block-0f0f5bea00c34c41950f884974c190b0">//定时器 1</div><div class="notion-text notion-block-0fd68caf7e3a4724b947c2c38d0fa280">void Timer1_Init(uint16_t arr, uint16_t psc, uint8_t rep)</div><div class="notion-text notion-block-ccbc2e5a9ab046f8bbc18acd44436372">{</div><div class="notion-text notion-block-22424380ebab45fabe54429953b8a308">tim1.Instance = TIM1;                                        // 实例</div><div class="notion-text notion-block-91ff0873746a49579280a06e0c50ed86">tim1.Init.Period = arr;                                      // 重装载值</div><div class="notion-text notion-block-450a68ca076c42d3bc59c7490557b686">tim1.Init.Prescaler = psc;                                   // 分频系数</div><div class="notion-text notion-block-f89ba370193f4a6897e5e35a421c6bda">tim1.Init.CounterMode = TIM_COUNTERMODE_UP;                  // 计数模式</div><div class="notion-text notion-block-6c87e9a4f73c44b6afb18286ef07ebd9">tim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;            // 分频因子</div><div class="notion-text notion-block-06f1625a64f6430eae6ed86b2ebc9f16">tim1.Init.RepetitionCounter = rep;                           // 重复计数值</div><div class="notion-text notion-block-1799e58cb3dd45209f5c922fe1ab61ca">tim1.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;// 自动重装载值 预装载使能位（影子寄存器）</div><div class="notion-text notion-block-f4025b1344b84cdea713310b24581d3c">HAL_TIM_Base_Init(&amp;tim1);                       //初始化定时器</div><div class="notion-text notion-block-ac845200623c45e19528e4d7eb85d9ed">__HAL_TIM_CLEAR_FLAG(&amp;tim1, TIM_FLAG_UPDATE);   //手动 清除 定时器 更新事件</div><div class="notion-text notion-block-0a68bda848e646dd900f3c1c717e17aa">/<em> 外部模式1 ETR通道  </em>/  //PA12 下降沿 按下计数 上拉</div><div class="notion-text notion-block-5d4b3287ee6f4cb1abb3d07672403a9a">tim1_clock.ClockSource = TIM_CLOCKSOURCE_ETRMODE1; //通道1 ETR<div class="notion-text-children"><div class="notion-text notion-block-32929493134a453d8d9d4b812440f065">tim1_clock.ClockPolarity = TIM_CLOCKPOLARITY_INVERTED;      //ETR反向 （低电平或下降沿有效）</div><div class="notion-text notion-block-8741e45017ac4b1da9c6083b0dcfb76f">//tim1_clock.ClockPolarity = TIM_CLOCKPOLARITY_NOINVERTED;    //ETR不反向 （高电平或上升沿有效）</div><div class="notion-text notion-block-8362911edf894f47b60384e5242a457e">tim1_clock.ClockPrescaler = TIM_CLOCKPRESCALER_DIV1;      //ETR的预分频器配置</div><div class="notion-text notion-block-ee9faf574a224684950fbb3b60fb3dcd">tim1_clock.ClockFilter = 0x03;                          //滤波（注意是外部时钟的波）</div><div class="notion-text notion-block-77a92c504556442d8ac1c6dcb7c140ec">HAL_TIM_ConfigClockSource(&amp;tim1, &amp;tim1_clock);  //初始化定时器时钟配置</div><div class="notion-text notion-block-dbf0f241bbf14b50bf162f2d5e32da51">__HAL_TIM_ENABLE_IT(&amp;tim1, TIM_IT_TRIGGER | TIM_IT_UPDATE); //手动打开触发中断、更新中断</div><div class="notion-text notion-block-fe3cd3ec2ae14976b3a0181bfa58ca89">HAL_TIM_Base_Start_DMA(&amp;tim1, (uint32_t* )tim1_dmaBuff, 4);   //打开定时器（DMA方式）</div></div></div><div class="notion-text notion-block-3aabbf34352e4203a9b8336b053235fa">}</div><div class="notion-text notion-block-ebf87c479aaa41759e7fbd9fa043d2e5">//定时器 2</div><div class="notion-text notion-block-281ed96058924495b7f826c7c484e909">void Timer2_Init(uint16_t arr, uint16_t psc)</div><div class="notion-text notion-block-322a8269473d45c399a2523483e5375e">{</div><div class="notion-text notion-block-f15501069430476ba42be4926f19afcf">tim2.Instance = TIM2;</div><div class="notion-text notion-block-4732bd7619c24dd19b8468fb82593520">tim2.Init.Period = arr; </div><div class="notion-text notion-block-e440430a0e044edfbb69358451dd5374">tim2.Init.Prescaler = psc;</div><div class="notion-text notion-block-2bb63c46228442a8ab45a90711e29a29">tim2.Init.CounterMode = TIM_COUNTERMODE_UP;</div><div class="notion-text notion-block-77a1b1d2411d4df48b423435a3ac2cef">tim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;</div><div class="notion-text notion-block-b51107b158bc4e1985c265f96a0d3605">tim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;</div><div class="notion-text notion-block-c6ebbefffcb44f0588817fa1d820c9c4">HAL_TIM_Base_Init(&amp;tim2);</div><div class="notion-text notion-block-5cb673d2676345a2af2e97a87b84fbd0">__HAL_TIM_CLEAR_FLAG(&amp;tim2, TIM_FLAG_UPDATE);</div><div class="notion-text notion-block-046e3e49b6174768b28cc57d9af9106e">/<em> 外部模式1 通道1 双边沿检测  重映射</em>/   //PA15 双边边沿 上拉</div><div class="notion-text notion-block-d88b7cb26b074f8c8ff0a3c2e1c7145b">tim2_clock.ClockSource = TIM_CLOCKSOURCE_TI1ED; //通道1 边沿检测</div><div class="notion-text notion-block-41296c19be0642d99efc6d92984f23f1">HAL_TIM_ConfigClockSource(&amp;tim2, &amp;tim2_clock);  //初始化定时器时钟配置</div><div class="notion-text notion-block-3db63746ec6f46dc8ff5ed284317cd33">__HAL_TIM_ENABLE_IT(&amp;tim2, TIM_IT_TRIGGER | TIM_IT_UPDATE); //手动打开触发中断、更新中断<div class="notion-text-children"><div class="notion-text notion-block-c8a07a226887417ea3cf78b9b972f6ee">HAL_TIM_Base_Start_DMA(&amp;tim2, (uint32_t* )tim2_dmaBuff, 4);   //打开定时器（DMA方式）</div></div></div><div class="notion-text notion-block-83bacf28ed124404a8d4773fde8c35c4">}</div><div class="notion-text notion-block-7f890e5c4a854e5b91934a6adbbf048f">//定时器 3</div><div class="notion-text notion-block-519223b9f57441c099633bb986da3ab7">void Timer3_Init(uint16_t arr, uint16_t psc)</div><div class="notion-text notion-block-aad26e4a28cd41809e57975284a82d7d">{</div><div class="notion-text notion-block-63cae1d457fd4152ae1c9239abf925e7">tim3.Instance = TIM3;</div><div class="notion-text notion-block-d5698257e0dc42eb8a003318ed8f890c">tim3.Init.Period = arr;</div><div class="notion-text notion-block-6c4466865eb74e1b973a262a01a36cb4">tim3.Init.Prescaler = psc;</div><div class="notion-text notion-block-d2c3b05566cd4699a86a59f00250d3ea">tim3.Init.CounterMode = TIM_COUNTERMODE_CENTERALIGNED1; //中央对齐模式</div><div class="notion-text notion-block-fc468b6802e74985830abe9576896690">tim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;</div><div class="notion-text notion-block-657fedb7658c47ad8af9b16c8a913292">tim3.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;</div><div class="notion-text notion-block-c808f390499146d9b8ed8a5c36294d84">HAL_TIM_Base_Init(&amp;tim3); </div><div class="notion-text notion-block-000773128d84436680787d96fd2ea5d2">__HAL_TIM_CLEAR_FLAG(&amp;tim3, TIM_FLAG_UPDATE);</div><div class="notion-text notion-block-6bb895e7590142fcbcd631b88a77ef99">/<em> 外部模式1 通道1 </em>/ //PB4 上升沿 上拉 抬起计数</div><div class="notion-text notion-block-176f74de68314a1babed1120c136bea3">tim3_clock.ClockSource = TIM_CLOCKSOURCE_TI1;             // 通道1</div><div class="notion-text notion-block-fe37cf37a6eb49f19cac8108c13a562e">tim3_clock.ClockPolarity = TIM_CLOCKPOLARITY_RISING;      // 上升沿</div><div class="notion-text notion-block-19ce6644bbf84b739d92d122bb0362fc">tim3_clock.ClockFilter = 0x03;                            // 滤波</div><div class="notion-text notion-block-d9cabfcb85ea4a7486f386a5e07963ee">HAL_TIM_ConfigClockSource(&amp;tim3, &amp;tim3_clock);  //初始化定时器时钟配置</div><div class="notion-text notion-block-fc10d3dd67c246498dd2c702fcd51ecd">__HAL_TIM_ENABLE_IT(&amp;tim3, TIM_IT_TRIGGER | TIM_IT_UPDATE); //手动打开触发中断、更新中断<div class="notion-text-children"><div class="notion-text notion-block-11849c221bbc430492cdb008d0af8253">HAL_TIM_Base_Start_DMA(&amp;tim3, (uint32_t* )tim3_dmaBuff, 4);   //打开定时器（DMA方式）</div></div></div><div class="notion-text notion-block-26258351791c4364a69fa0cd92238887">}</div><div class="notion-text notion-block-4e9a38875dbc4c81aed463df6c7daa2b">//定时器 4</div><div class="notion-text notion-block-2053cc7e0d444f1288ba59a1c7c0ad25">void Timer4_Init(uint16_t arr, uint16_t psc)</div><div class="notion-text notion-block-72fe7acb63584860bd5f4906716bce1d">{</div><div class="notion-text notion-block-dfe562c24e8f4baab84892967fa79113">tim4.Instance = TIM4;</div><div class="notion-text notion-block-aca43237840743d289a3846f06df1a91">tim4.Init.Period = arr;</div><div class="notion-text notion-block-ebbe2c418ede45238bf097d0c94b4be3">tim4.Init.Prescaler = psc;</div><div class="notion-text notion-block-361e54189e2b4963b43e71f204ff778c">tim4.Init.CounterMode = TIM_COUNTERMODE_UP;</div><div class="notion-text notion-block-4e7817eda1fb4df98cfb1fc4075783d8">tim4.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;</div><div class="notion-text notion-block-ad86c7cfd8b447a29ad5f0a9a73e4825">tim4.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;</div><div class="notion-text notion-block-74cf3145a0604e15aa7e17b0d5ecb12a">HAL_TIM_Base_Init(&amp;tim4); </div><div class="notion-text notion-block-f56f0d35e692441cab83730aee4e8e4c">__HAL_TIM_CLEAR_FLAG(&amp;tim4, TIM_FLAG_UPDATE);</div><div class="notion-text notion-block-2dadb060f8254eb5ac8439f440998d0c">/<em> 外部模式1 通道2 </em>/ //PB7 下降沿 上拉 按下计数</div><div class="notion-text notion-block-ce7eb4f199884a30854bcce49fceb688">tim4_clock.ClockSource = TIM_CLOCKSOURCE_TI2;             // 通道2</div><div class="notion-text notion-block-368f3541ced44bcca369de004240f882">tim4_clock.ClockPolarity = TIM_CLOCKPOLARITY_FALLING;     // 下降沿</div><div class="notion-text notion-block-8f9aeb4185f5489da3f8f5cf36840e6b">tim4_clock.ClockFilter = 0x03;                            // 滤波</div><div class="notion-text notion-block-a0ffa9b58e464f1f81efc6b4cfaedec4">HAL_TIM_ConfigClockSource(&amp;tim4, &amp;tim4_clock);  //初始化定时器时钟配置</div><div class="notion-text notion-block-b1f2477ffcab47be88b92ce46533e410">__HAL_TIM_ENABLE_IT(&amp;tim4, TIM_IT_TRIGGER | TIM_IT_UPDATE); //手动打开触发中断、更新中断<div class="notion-text-children"><div class="notion-text notion-block-5129aac1c5064b87a7a4b1c79938a6a7">HAL_TIM_Base_Start_DMA(&amp;tim4, (uint32_t* )tim4_dmaBuff, 4);   //打开定时器（DMA方式）</div></div></div><div class="notion-text notion-block-8a4644f93f294b37a5baec467d4dab4e">}</div><div class="notion-text notion-block-e2aabc233eae4735940708a55e0f1c8a">//定时器 硬件初始化回调函数</div><div class="notion-text notion-block-a65fec1c9f874442ac7249a9ef145caa">void HAL_TIM_Base_MspInit(TIM_HandleTypeDef *htim)</div><div class="notion-text notion-block-f020d2c753554610ac4a884473176aea">{</div><div class="notion-text notion-block-fa52f20bd3d046e398d6e82780cf2ea6">GPIO_InitTypeDef GPIO_InitType;</div><div class="notion-text notion-block-495f0e1fc58e45d2889beef761bcfd21">if(htim-&gt;Instance == TIM1){<div class="notion-text-children"><div class="notion-text notion-block-9f5e3943cd3a4125ba87f3a30cc38625">__HAL_RCC_TIM1_CLK_ENABLE();                //使能时钟</div><div class="notion-text notion-block-ea1df6cc781f4a8ab53967a790a2b445">/<em> 定时器1 外部模式1 ETR通道IO </em>/</div><div class="notion-text notion-block-1aa1bbb37e78451c8fb648f7d4d164f1">__HAL_RCC_GPIOA_CLK_ENABLE();</div><div class="notion-text notion-block-2562fd174a2445d8a635a14201ce749b">GPIO_<a class="notion-link" href="http://InitType.Pin" target="_blank" rel="noopener noreferrer">InitType.Pin</a> = GPIO_PIN_12;</div><div class="notion-text notion-block-45d3b74f71894e569ae8b560aee00789">GPIO_InitType.Mode = GPIO_MODE_AF_INPUT;</div><div class="notion-text notion-block-a3ffe4c0d4c04ad58d4656423010b3d0">GPIO_InitType.Pull = GPIO_PULLUP;           //低电平按下，上拉</div><div class="notion-text notion-block-e3f6039c505a464bbedb38341e0c1fb4">HAL_GPIO_Init(GPIOA,&amp;GPIO_InitType);</div><div class="notion-text notion-block-52c0ae13858d475e82a212d0e8798635">HAL_NVIC_SetPriority(TIM1_UP_IRQn, 3, 0);   //配置、打开 更新中断</div><div class="notion-text notion-block-8fc4dbd85c3e42e288ff85f6c7ca11b1">HAL_NVIC_EnableIRQ(TIM1_UP_IRQn);</div><div class="notion-text notion-block-723b39e0c2d9428daa5c7f223a1d7b48">HAL_NVIC_SetPriority(TIM1_TRG_COM_IRQn, 3, 0);   //配置、打开 触发中断</div><div class="notion-text notion-block-d12a754d566c4ecd9981d8e50ac6a0d4">HAL_NVIC_EnableIRQ(TIM1_TRG_COM_IRQn);</div><div class="notion-text notion-block-457ab35eb5cc4872affad208dc8340df">/<em> DMA配置 </em>/</div><div class="notion-text notion-block-3fe0f12b73c5404da77fa534844296ea">__HAL_RCC_DMA1_CLK_ENABLE();</div><div class="notion-text notion-block-75e19214dd1547a99874fa91d12cee7b">tim1_dmaup.Instance = DMA1_Channel5;    </div><div class="notion-text notion-block-e0cbaa197d14432db13b4aec6ee2e4c8">tim1_dmaup.Init.Direction = DMA_MEMORY_TO_PERIPH;   //存储区到外设</div><div class="notion-text notion-block-f18ad50f612a4c61b1a73da962ae5e6c">tim1_dmaup.Init.MemInc = DMA_MINC_ENABLE;           //存储区递增</div><div class="notion-text notion-block-1f2b21f9eb0f485b8c58788c330378f4">tim1_dmaup.Init.PeriphInc = DMA_PINC_DISABLE;       //外设不递增</div><div class="notion-text notion-block-e49d5a937ca3408c83029ff8adbc7832">tim1_dmaup.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD;     //半字 2字节</div><div class="notion-text notion-block-3ca59b7c8bf2442299a1cc77f8d5497c">tim1_dmaup.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD;</div><div class="notion-text notion-block-6a0b08979b804e87ad669c8dfbeb8113">tim1_dmaup.Init.Mode = DMA_NORMAL;      //单次模式</div><div class="notion-text notion-block-27db649774bd465cb320567176ab2208">//tim2_dmaup.Init.Mode = DMA_CIRCULAR;    //循环模式</div><div class="notion-text notion-block-edea6689b788444490bc5e8b1f520542">tim1_dmaup.Init.Priority = DMA_PRIORITY_MEDIUM;  </div><div class="notion-text notion-block-b1568d4a33b240b98cc71945f612d0f7">__HAL_LINKDMA(&amp;tim1, hdma[TIM_DMA_ID_UPDATE], tim1_dmaup);</div><div class="notion-text notion-block-b72f31f321124734b0e671446e53a06f">HAL_DMA_Init(&amp;tim1_dmaup);</div><div class="notion-text notion-block-02b99ed75df64fa684a1555e60a38ea1">HAL_NVIC_SetPriority(DMA1_Channel5_IRQn, 3, 0);   //配置、打开 通道5的中断</div><div class="notion-text notion-block-71928f08d09e47718b93badb0b349456">HAL_NVIC_EnableIRQ(DMA1_Channel5_IRQn);</div></div></div><div class="notion-text notion-block-ce8fe5f93eb24319a2acc044483a48f4">}else if(htim-&gt;Instance == TIM2){<div class="notion-text-children"><div class="notion-text notion-block-c4cec044825f4466946c9f19810a2148">__HAL_RCC_TIM2_CLK_ENABLE();</div><div class="notion-text notion-block-1dd35739ef024c1da8d508c783b722ff">__HAL_RCC_GPIOA_CLK_ENABLE();</div><div class="notion-text notion-block-5b34a2840fc14a73aee59d951df33df0">__HAL_RCC_AFIO_CLK_ENABLE();</div><div class="notion-text notion-block-2ff723fd74f14aa9a2440b1b122b876f">__HAL_AFIO_REMAP_TIM2_ENABLE();</div><div class="notion-text notion-block-bed256cd7bfc4a55abad10a775d73b0c">//__HAL_AFIO_REMAP_TIM2_PARTIAL_1(); //(同样的功能)</div><div class="notion-text notion-block-06ad1afeb58347f38afb5db3f10fc555">__HAL_AFIO_REMAP_SWJ_NOJTAG();</div><div class="notion-text notion-block-fd1ecd18171c4080819832ce071388c6">/<em> 定时器2 外部模式1 通道1 重映射</em>/</div><div class="notion-text notion-block-ba3fbf56ab4c4ec4ad8b5c6bc1450c49">//GPIO_<a class="notion-link" href="http://InitType.Pin" target="_blank" rel="noopener noreferrer">InitType.Pin</a> = GPIO_PIN_0;</div><div class="notion-text notion-block-a48b9d3d3389407db5c27c38a0b3ca0b">GPIO_<a class="notion-link" href="http://InitType.Pin" target="_blank" rel="noopener noreferrer">InitType.Pin</a> = GPIO_PIN_15;</div><div class="notion-text notion-block-d3b776b177db46209fba23be16b1b55d">GPIO_InitType.Mode = GPIO_MODE_AF_INPUT;</div><div class="notion-text notion-block-e83516b2f5574864a54f959f83963f6b">GPIO_InitType.Pull = GPIO_PULLUP;           //低电平按下，上拉</div><div class="notion-text notion-block-78e6e68968c34402acfcb27ebc8aa5e1">HAL_GPIO_Init(GPIOA,&amp;GPIO_InitType);</div><div class="notion-text notion-block-24a7c0768bb241659eb71c4e8865b229">HAL_NVIC_SetPriority(TIM2_IRQn, 3, 0);</div><div class="notion-text notion-block-e2857e634c354471aa7c51f30068db87">HAL_NVIC_EnableIRQ(TIM2_IRQn);</div><div class="notion-text notion-block-c29a1010669b41728311c730137f0b5c">/<em> DMA配置 </em>/</div><div class="notion-text notion-block-180f8691b53746dda7efd23f88852afc">__HAL_RCC_DMA1_CLK_ENABLE();</div><div class="notion-text notion-block-abaca854647342579ca763b1d5b7cd35">tim2_dmaup.Instance = DMA1_Channel2;    </div><div class="notion-text notion-block-064920b80c384fc5a1bb568711e5e216">tim2_dmaup.Init.Direction = DMA_MEMORY_TO_PERIPH;</div><div class="notion-text notion-block-f3c0076d7ca6420f9d737284e98957dd">tim2_dmaup.Init.MemInc = DMA_MINC_ENABLE;</div><div class="notion-text notion-block-f486cf0100584d15bbc3116db9705c03">tim2_dmaup.Init.PeriphInc = DMA_PINC_DISABLE;</div><div class="notion-text notion-block-c1ab88a94ee1489aadf4d8c8793b86e3">tim2_dmaup.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD;</div><div class="notion-text notion-block-c02cde56bf254ab0950b2cf7e0254365">tim2_dmaup.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD;</div><div class="notion-text notion-block-db7e1df05b2c49539f45982e27c79cf2">tim1_dmaup.Init.Mode = DMA_NORMAL;      //单次模式</div><div class="notion-text notion-block-62edafc97bc841d1a26197df61be0b2f">//tim2_dmaup.Init.Mode = DMA_CIRCULAR;    //循环模式</div><div class="notion-text notion-block-f937f63d3f40489aa226e6bbf7482926">tim2_dmaup.Init.Priority = DMA_PRIORITY_MEDIUM; </div><div class="notion-text notion-block-df619fe65feb4df8aa70aeeafaecaeda">__HAL_LINKDMA(&amp;tim2, hdma[TIM_DMA_ID_UPDATE], tim2_dmaup);</div><div class="notion-text notion-block-e177e3aabb5e4f8e81ea9dad5b16ac05">HAL_DMA_Init(&amp;tim2_dmaup);<div class="notion-text-children"><div class="notion-text notion-block-fc2c38d9dad14ce2895adf4ef991ee14">HAL_NVIC_SetPriority(DMA1_Channel2_IRQn, 3, 0);   //配置、打开 通道5的中断</div><div class="notion-text notion-block-c83b2a2abfa744efa9d317ff87a5a770">HAL_NVIC_EnableIRQ(DMA1_Channel2_IRQn);</div><div class="notion-text notion-block-eabdf4d9aaf04ba1b76ba02c749e24cb">}else if(htim-&gt;Instance == TIM3){<div class="notion-text-children"><div class="notion-text notion-block-71d62812fe6547bc9a332807fc30c155">__HAL_RCC_TIM3_CLK_ENABLE();</div><div class="notion-text notion-block-f09288cb482845289d56f70fd7f33d5c">//__HAL_RCC_GPIOA_CLK_ENABLE();</div><div class="notion-text notion-block-482710113ece4136846947dbf3b9000f">__HAL_RCC_GPIOB_CLK_ENABLE();</div><div class="notion-text notion-block-d1fa30af14ee47b48a5991099b7f4f36">__HAL_RCC_AFIO_CLK_ENABLE();</div><div class="notion-text notion-block-561d4a34a0f24024815ad14c916aa7a6">__HAL_AFIO_REMAP_TIM3_PARTIAL();    //部分映射</div><div class="notion-text notion-block-dd0c6b9c47394f0ab2f0b0fd123d4ce3">__HAL_AFIO_REMAP_SWJ_NONJTRST();    //完全SW+JATG 但没有NJTRST</div><div class="notion-text notion-block-c0ffd88729534cafb2e722ff6d4110ad">/<em> 定时器3 外部模式1 通道1 重映射</em>/</div><div class="notion-text notion-block-79cb1793506249108ae667437405213e">//GPIO_<a class="notion-link" href="http://InitType.Pin" target="_blank" rel="noopener noreferrer">InitType.Pin</a> = GPIO_PIN_6;</div><div class="notion-text notion-block-da50f4c5730441f0b1ed72ac5faf2a37">GPIO_<a class="notion-link" href="http://InitType.Pin" target="_blank" rel="noopener noreferrer">InitType.Pin</a> = GPIO_PIN_4;</div><div class="notion-text notion-block-9412a0e03f4c4ec69e1c434a61351661">GPIO_InitType.Mode = GPIO_MODE_AF_INPUT;</div><div class="notion-text notion-block-f8a1c87dc11a4786b80ca64f6de1dc94">GPIO_InitType.Pull = GPIO_PULLUP;           //低电平按下，上拉</div><div class="notion-text notion-block-acdf5bf8aecf42719954d5514a59760b">HAL_GPIO_Init(GPIOB,&amp;GPIO_InitType);</div><div class="notion-text notion-block-61c28f2c7ea9462db294d9801369ac22">HAL_NVIC_SetPriority(TIM3_IRQn, 3, 0);</div><div class="notion-text notion-block-9f4ec96904d34ed390d424d43596cef4">HAL_NVIC_EnableIRQ(TIM3_IRQn);</div><div class="notion-text notion-block-0d8583ddd07741219e1dc8cf01432810">/<em> DMA配置 </em>/</div><div class="notion-text notion-block-270ca3ec19ff439a9d96ef040cfffa25">__HAL_RCC_DMA1_CLK_ENABLE();</div><div class="notion-text notion-block-6beca4e506a14b30af51e58a131e038b">tim3_dmaup.Instance = DMA1_Channel3;    </div><div class="notion-text notion-block-8b9315ae42be44c9935cc1c5d5f4653d">tim3_dmaup.Init.Direction = DMA_MEMORY_TO_PERIPH;</div><div class="notion-text notion-block-fae49d8ddc5044fda4c6d5a80c080616">tim3_dmaup.Init.MemInc = DMA_MINC_ENABLE;</div><div class="notion-text notion-block-c99b38da9d3c4947adefe787a48249c0">tim3_dmaup.Init.PeriphInc = DMA_PINC_DISABLE;</div><div class="notion-text notion-block-b7840c1f720e4b73b6cb2602bb193ed5">tim3_dmaup.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD;</div><div class="notion-text notion-block-826321ff17e340d2ac724e13afdd6aea">tim3_dmaup.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD;</div><div class="notion-text notion-block-0d60f4bc121441ebbf8f72bd353352dc">tim1_dmaup.Init.Mode = DMA_NORMAL;      //单次模式</div><div class="notion-text notion-block-1283f983991a4a00bcabd2f85affe468">//tim2_dmaup.Init.Mode = DMA_CIRCULAR;    //循环模式</div><div class="notion-text notion-block-3b6c30d539ee4137a2736e9d3f27b899">tim3_dmaup.Init.Priority = DMA_PRIORITY_MEDIUM; </div><div class="notion-text notion-block-afe7e687df234cfea30456b458b88d1e">__HAL_LINKDMA(&amp;tim3, hdma[TIM_DMA_ID_UPDATE], tim3_dmaup);</div><div class="notion-text notion-block-01770f0498344bc38ba176844f09c8d7">HAL_DMA_Init(&amp;tim3_dmaup);</div><div class="notion-text notion-block-4112f5b78b03452f94426f0bddccb799">HAL_NVIC_SetPriority(DMA1_Channel3_IRQn, 3, 0);   //配置、打开 通道5的中断</div><div class="notion-text notion-block-a27fe9ee419b431f9f8bd2dfb7e4d290">HAL_NVIC_EnableIRQ(DMA1_Channel3_IRQn);</div></div></div><div class="notion-text notion-block-52fb4dc116a04bbca2410b71497280c2">}else if(htim-&gt;Instance == TIM4){<div class="notion-text-children"><div class="notion-text notion-block-c54d17afee4f4d32889e3512eb7d0ba3">__HAL_RCC_TIM4_CLK_ENABLE();</div><div class="notion-text notion-block-cb1b9968a47a4e80aadf3dc089b8c8ac">/<em> 定时器4 外部模式1 通道2 </em>/</div><div class="notion-text notion-block-44cc76a7b9594edfa8ae206b5be4b1e7">__HAL_RCC_GPIOB_CLK_ENABLE();</div><div class="notion-text notion-block-764bc17153624cf4a1a03e3cea3d5e95">GPIO_<a class="notion-link" href="http://InitType.Pin" target="_blank" rel="noopener noreferrer">InitType.Pin</a> = GPIO_PIN_7;</div><div class="notion-text notion-block-f3666d560ba74277bc5beb6a8f0880ca">GPIO_InitType.Mode = GPIO_MODE_AF_INPUT;</div><div class="notion-text notion-block-87d5d10824e943b98a0b4ad1c7ed5320">GPIO_InitType.Pull = GPIO_PULLUP;           //低电平按下，上拉</div><div class="notion-text notion-block-3ddb4077d12a4dd186b8b5fd30da11a8">HAL_GPIO_Init(GPIOB, &amp;GPIO_InitType);</div><div class="notion-text notion-block-7522d5e89f68431eacb1852a99e35557">HAL_NVIC_SetPriority(TIM4_IRQn, 3, 0);</div><div class="notion-text notion-block-2b68d3fed3da491596f7450b066977eb">HAL_NVIC_EnableIRQ(TIM4_IRQn);</div><div class="notion-text notion-block-b67f0a3cd7324a62bb4ed7a47f494bd6">/<em> DMA配置 </em>/</div><div class="notion-text notion-block-bb7ac9fc155849428a78e6b8eb3d7fad">__HAL_RCC_DMA1_CLK_ENABLE();</div><div class="notion-text notion-block-d268800363c64f8da003ea4b44343e14">tim4_dmaup.Instance = DMA1_Channel7;    </div><div class="notion-text notion-block-e0abe3c07da545ec86782bc479860952">tim4_dmaup.Init.Direction = DMA_MEMORY_TO_PERIPH;</div><div class="notion-text notion-block-a14333f3286f44d2b2b4768bc05eb673">tim4_dmaup.Init.MemInc = DMA_MINC_ENABLE;</div><div class="notion-text notion-block-69a518c19fe04ead81afcc915776acfa">tim4_dmaup.Init.PeriphInc = DMA_PINC_DISABLE;</div><div class="notion-text notion-block-6db6362a23ba4bd8a4cf7e9580b1ce34">tim4_dmaup.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD;</div><div class="notion-text notion-block-77532707d5bf4eb7a6792bee3dfa9a57">tim4_dmaup.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD;</div><div class="notion-text notion-block-4829089456aa459b84642d43605990f9">tim1_dmaup.Init.Mode = DMA_NORMAL;      //单次模式</div><div class="notion-text notion-block-39d01783568649f9aa6cedbbaf2c6ece">//tim2_dmaup.Init.Mode = DMA_CIRCULAR;    //循环模式</div><div class="notion-text notion-block-04a749f6b594400795349f54569a61f3">tim4_dmaup.Init.Priority = DMA_PRIORITY_MEDIUM; </div><div class="notion-text notion-block-53ee710bba9b4d2f9f8634b939daa394">__HAL_LINKDMA(&amp;tim4, hdma[TIM_DMA_ID_UPDATE], tim4_dmaup);</div><div class="notion-text notion-block-47fa8cdbac6e476183d47986c1301345">HAL_DMA_Init(&amp;tim4_dmaup);</div><div class="notion-text notion-block-d93185b0b8e5451d9f5399cdebe97174">HAL_NVIC_SetPriority(DMA1_Channel7_IRQn, 3, 0);   //配置、打开 通道5的中断</div><div class="notion-text notion-block-625f5b0fc7c84914ba01c67ffe5cdb97">HAL_NVIC_EnableIRQ(DMA1_Channel7_IRQn);</div></div></div><div class="notion-text notion-block-c1001b6b36a941f0b3a2c6029626cb26">}</div></div></div></div></div><div class="notion-text notion-block-e97b84c39e9c4795a6ef8f45018ef796">}</div><div class="notion-text notion-block-73c6e0f316e743fdb1ded614f888cfcf">//定时器 硬件 De 回调函数</div><div class="notion-text notion-block-861e19fb36ed40b486f05fd737204ea8">void HAL_TIM_Base_MspDeInit(TIM_HandleTypeDef *htim)</div><div class="notion-text notion-block-b7f22b28fc8049e796c53c99f06a4b5b">{</div><div class="notion-text notion-block-ee01beddffc54aa296383a789c0323cb">if(htim-&gt;Instance == TIM1){<div class="notion-text-children"><div class="notion-text notion-block-d4c4385a351446f8b9ff38145d50c7a7">__HAL_RCC_TIM1_CLK_DISABLE();</div></div></div><div class="notion-text notion-block-8d7ef8664d354b7b9be8e582c6342297">}else if(htim-&gt;Instance == TIM2){<div class="notion-text-children"><div class="notion-text notion-block-5931497ed82e4648b4b925ba55c90ad2">__HAL_RCC_TIM2_CLK_DISABLE();</div></div></div><div class="notion-text notion-block-23cd1ecaf16347b1b3b0ef9277f9eb9a">}else if(htim-&gt;Instance == TIM3){<div class="notion-text-children"><div class="notion-text notion-block-e146e90a66b94eb990e2048da62708a5">__HAL_RCC_TIM3_CLK_DISABLE();</div></div></div><div class="notion-text notion-block-325e496e316943fe861b3be0cd518558">}else if(htim-&gt;Instance == TIM4){<div class="notion-text-children"><div class="notion-text notion-block-f76cccaa21f040fda739decaa2ba084b">__HAL_RCC_TIM4_CLK_DISABLE();</div></div></div><div class="notion-text notion-block-4e019e632d734432ac495d864db1deb1">}    </div><div class="notion-text notion-block-efd18ed8d4584de1a5e8bff7c821c135">}</div><div class="notion-text notion-block-3a29720e9bc0476a841f60dd84b85352">//更新中断  回调函数(同时也是DMA完成的回调函数)</div><div class="notion-text notion-block-d1e7f33040174211be17c437a3d270ce">uint16_t time1 = 1; </div><div class="notion-text notion-block-9a1b177abd2a45529ad44838681af457">uint16_t time2 = 1; </div><div class="notion-text notion-block-dd845132377e4e4099e886de5a5515df">uint16_t time3 = 1;</div><div class="notion-text notion-block-2ac95feea8f541f595165967266c4884">uint16_t time4 = 1;</div><div class="notion-text notion-block-32ffc601385649a5915d6159caeef00c">void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)</div><div class="notion-text notion-block-3a5b00bc4ffe4173b7b1830197618e67">{    </div><div class="notion-text notion-block-923c0156fad640c59f6ce72d69b8c6c7">if(htim-&gt;Instance == TIM1){<div class="notion-text-children"><div class="notion-text notion-block-ab1d0dbf1a8842cb8b95f9f6dc38fa19">/<em> 判断DMA的状态是否为Ready状态，如果是 则是DMA完成中断进入的回调函数 </em>/</div><div class="notion-text notion-block-fd4b2b47e19341d9a26cb5d5fb0ea1fd">if(htim-&gt;hdma[TIM_DMA_ID_UPDATE]-&gt;State  == HAL_DMA_STATE_READY){<div class="notion-text-children"><div class="notion-text notion-block-d8b45cf0134a4da38d8860175afcfad9">U1_Printf(&quot;DMA1 完成中断rn&quot;);</div><div class="notion-text notion-block-302a173f73a44fda8522c9abf38c8cd4">HAL_DMA_DeInit(htim-&gt;hdma[TIM_DMA_ID_UPDATE]);           //关闭DMA</div></div></div><div class="notion-text notion-block-958ae63df0224f06bac83416fd14ca2d">}else{<div class="notion-text-children"><div class="notion-text notion-block-51f034cc46c7424aa831b1336264e28b">U1_Printf(&quot;定时器 1 更新事件rn&quot;);</div></div></div><div class="notion-text notion-block-a32e4198c7d54696a6f364237fb1e332">}</div></div></div><div class="notion-text notion-block-491a9694a3014e57b4578cb691cc309d">}else if(htim-&gt;Instance == TIM2){<div class="notion-text-children"><div class="notion-text notion-block-96fc900cbfac4bfc954b6e2edb825833">if(htim-&gt;hdma[TIM_DMA_ID_UPDATE]-&gt;State  == HAL_DMA_STATE_READY){<div class="notion-text-children"><div class="notion-text notion-block-23bce1e1ebb841ce9d24ca1ca9117a3b">U1_Printf(&quot;DMA2 完成中断rn&quot;);</div><div class="notion-text notion-block-67516cb073174c3aa3b54e136ba0e73a">HAL_DMA_DeInit(htim-&gt;hdma[TIM_DMA_ID_UPDATE]);           //关闭DMA</div></div></div><div class="notion-text notion-block-58e3b6be642c4f6383c253c283a2ee6e">}else{<div class="notion-text-children"><div class="notion-text notion-block-11ad597fbef943009ea0c07b80d87aef">U1_Printf(&quot;定时器 2 更新事件rn&quot;);</div></div></div><div class="notion-text notion-block-1cb4229053304caa9971eedb68426049">}</div></div></div><div class="notion-text notion-block-c2eb90d0c60840a8aa3a3423ca85b288">}else if(htim-&gt;Instance == TIM3){<div class="notion-text-children"><div class="notion-text notion-block-4f8035ba6d434ceeab00ca1489ab0ac3">if(htim-&gt;hdma[TIM_DMA_ID_UPDATE]-&gt;State  == HAL_DMA_STATE_READY){<div class="notion-text-children"><div class="notion-text notion-block-c5fa2244ac024cc291f469f88775043f">U1_Printf(&quot;DMA3 完成中断rn&quot;);</div><div class="notion-text notion-block-d46b22f2a6144f808e8b517cf65986a7">HAL_DMA_DeInit(htim-&gt;hdma[TIM_DMA_ID_UPDATE]);           //关闭DMA</div></div></div><div class="notion-text notion-block-8722fe9ca3704136994ff04a6bfb4ef0">}else{<div class="notion-text-children"><div class="notion-text notion-block-6a9355b1d80241c0ad8d334e6f2e0ed9">U1_Printf(&quot;定时器 3 更新事件rn&quot;);</div></div></div><div class="notion-text notion-block-5c2bc8158818455c90c93872eb2ca4fd">}</div></div></div><div class="notion-text notion-block-2ed9d2336c154e13a7eae94ab493d99e">}else if(htim-&gt;Instance == TIM4){<div class="notion-text-children"><div class="notion-text notion-block-cefafe9b40da4b7587be7bbc0c828a5d">if(htim-&gt;hdma[TIM_DMA_ID_UPDATE]-&gt;State  == HAL_DMA_STATE_READY){<div class="notion-text-children"><div class="notion-text notion-block-e3d13a454e4846f78669c4fd93960105">U1_Printf(&quot;DMA4 完成中断rn&quot;);</div><div class="notion-text notion-block-1fe6d8548d7449aea1c13f6410cdb777">HAL_DMA_DeInit(htim-&gt;hdma[TIM_DMA_ID_UPDATE]);           //关闭DMA</div></div></div><div class="notion-text notion-block-c54796cac3c44aaea5ba096f14e255f3">}else{<div class="notion-text-children"><div class="notion-text notion-block-6eddf8fac206437892ef5c790ec21abf">U1_Printf(&quot;定时器 4 更新事件rn&quot;);</div></div></div><div class="notion-text notion-block-bb9b95cf0f014f6cb47c4afc7fe3fdda">}</div></div></div><div class="notion-text notion-block-984470648fb94d67a56d6c21a61b46e6">}</div><div class="notion-text notion-block-fbac44e1d3de4beb965f4dedb838d055">}</div><div class="notion-text notion-block-62e5d7de591f420c9fd35a23f5b295e8">//触发中断 回调函数</div><div class="notion-text notion-block-0fffea2f30f741c393105b9621295d8b">void HAL_TIM_TriggerCallback(TIM_HandleTypeDef *htim)</div><div class="notion-text notion-block-148478b7e12e477487a3a112df651057">{</div><div class="notion-text notion-block-6a67484d8bb84f07b7a52bd22767e97a">if(htim-&gt;Instance == TIM1){<div class="notion-text-children"><div class="notion-text notion-block-5621a28db94f4f7bba9dfca18442114d">U1_Printf(&quot;定时器 1 触发事件:%drn&quot;, __HAL_TIM_GET_COUNTER(htim));  //输出当前计数值</div></div></div><div class="notion-text notion-block-ce4c40dce2b1414abbc07f8b7f464941">}else if(htim-&gt;Instance == TIM2){<div class="notion-text-children"><div class="notion-text notion-block-8ba0f19a3af54cf1942e77f876fa713e">U1_Printf(&quot;定时器 2 触发事件:%drn&quot;, __HAL_TIM_GET_COUNTER(htim));  //输出当前计数值</div></div></div><div class="notion-text notion-block-f18ebd663ac54f8f860e8b489e78cff2">}else if(htim-&gt;Instance == TIM3){<div class="notion-text-children"><div class="notion-text notion-block-51f0834b312f497b8efd494866e9792a">U1_Printf(&quot;定时器 3 触发事件:%drn&quot;, __HAL_TIM_GET_COUNTER(htim));  //输出当前计数值</div></div></div><div class="notion-text notion-block-5d2cedc3c7814b03b7e30a22d2992fcc">}else if(htim-&gt;Instance == TIM4){<div class="notion-text-children"><div class="notion-text notion-block-8302de74a3c8462384010fa9ee64dcf0">U1_Printf(&quot;定时器 4 触发事件:%drn&quot;, __HAL_TIM_GET_COUNTER(htim));  //输出当前计数值</div></div></div><div class="notion-text notion-block-f924d484521745f5a4f844b9488ab41b">}</div><div class="notion-text notion-block-ed62e996044c449d9a10f1034bc46bad">}</div><div class="notion-text notion-block-d5f27d8e8d47464abe176dd8e04f81af">//DMA 半完成回调函数</div><div class="notion-text notion-block-43c7303bcbb04f6ba5eab6ae49921980">void HAL_TIM_PeriodElapsedHalfCpltCallback(TIM_HandleTypeDef *htim)</div><div class="notion-text notion-block-99c3806fb82a45229fcbf78bd31ddcde">{</div><div class="notion-text notion-block-da4e5b2af86144a9a1091197ce5da726">if(htim-&gt;Instance == TIM1){<div class="notion-text-children"><div class="notion-text notion-block-47258e0f7cd5414083327ade3ff43c69">U1_Printf(&quot;定时器 1 DMA半完成中断rn&quot;);</div></div></div><div class="notion-text notion-block-69b800b7912143119f366e5c6a5dd28b">}else if(htim-&gt;Instance == TIM2){<div class="notion-text-children"><div class="notion-text notion-block-2cb93f485e3a4fe081df6f3d0a8ee366">U1_Printf(&quot;定时器 2 DMA半完成中断rn&quot;);</div></div></div><div class="notion-text notion-block-c1af375995a34bd18c59f4385646c850">}else if(htim-&gt;Instance == TIM3){<div class="notion-text-children"><div class="notion-text notion-block-f8cebb577c2d433daef2c6ece19a0c32">U1_Printf(&quot;定时器 3 DMA半完成中断rn&quot;);</div></div></div><div class="notion-text notion-block-67cbd712777b47e1b467843c092b89ca">}else if(htim-&gt;Instance == TIM4){<div class="notion-text-children"><div class="notion-text notion-block-5c06991d4d344513be96f23fb9263f09">U1_Printf(&quot;定时器 4 DMA半完成中断rn&quot;);</div></div></div><div class="notion-text notion-block-ee25116a95b844cbaa5dafc562075023">}</div><div class="notion-text notion-block-0500c98f21cc4ce5a79f79472c73315c">}<div class="notion-text-children"><details class="notion-toggle notion-block-f60e24f893b249028b331fc8026bfd01"><summary><h4 class="notion-h notion-h3 notion-block-f60e24f893b249028b331fc8026bfd01" data-id="f60e24f893b249028b331fc8026bfd01"><span><div id="f60e24f893b249028b331fc8026bfd01" class="notion-header-anchor"></div><span class="notion-h-title">time.h</span></span></h4></summary><div><div class="notion-text notion-block-dfdd9084f6cf4163b17f5c058a5f0a67">#ifndef __TIME_H</div><div class="notion-text notion-block-612fb2f54f1f490381f67b0c81fe8f54">#define __TIME_H</div><div class="notion-text notion-block-fc00ab4171914a1a9e45076984d72e27">#include &quot;uart.h&quot;</div><div class="notion-text notion-block-6fd371b025424e0096215f32cb41cdbb">/<em> 对外声明总控结构体 </em>/</div><div class="notion-text notion-block-23b9cd06bef94b1695d116dcb5a4ce4c">extern TIM_HandleTypeDef tim1;</div><div class="notion-text notion-block-f59c27c9b6f540dba90ef6266bf52429">extern TIM_HandleTypeDef tim2;</div><div class="notion-text notion-block-bbb221937fee4fa7b9d645bc4b4f8894">extern TIM_HandleTypeDef tim3;</div><div class="notion-text notion-block-36cf82364db047699bdc76d52f20b1f2">extern TIM_HandleTypeDef tim4;</div><div class="notion-text notion-block-0c8b0e86402149309920df8d6265b3a9">extern DMA_HandleTypeDef tim1_dmaup;</div><div class="notion-text notion-block-45a78bcb93564325b53b5c7ef950a8d5">extern DMA_HandleTypeDef tim2_dmaup;</div><div class="notion-text notion-block-cd4b6bed42b347b38809f78122d63e04">extern DMA_HandleTypeDef tim3_dmaup;</div><div class="notion-text notion-block-a81d32429e274d369799145343cd2c2a">extern DMA_HandleTypeDef tim4_dmaup;</div><div class="notion-text notion-block-5b03fad90d8e4004ad79be22321459ec">/<em> 初始化函数 </em>/</div><div class="notion-text notion-block-2e9a049bd1214cf18ed8e38dbe28966c">void Timer1_Init(uint16_t arr, uint16_t psc, uint8_t rep);</div><div class="notion-text notion-block-4e79747d6c4747169c2a6618062953f0">void Timer2_Init(uint16_t arr, uint16_t psc);</div><div class="notion-text notion-block-e71bea78e85f4199b68cc6d5a1c91ae3">void Timer3_Init(uint16_t arr, uint16_t psc);</div><div class="notion-text notion-block-f7cc7013f81c4e5fa38f8155e5621eda">void Timer4_Init(uint16_t arr, uint16_t psc);</div><div class="notion-text notion-block-0d4771f8cdce4c16ace08c6922f9cd0c">#endif</div><details class="notion-toggle notion-block-3a840e0abdeb43bf8e167e185cede95d"><summary><h4 class="notion-h notion-h3 notion-block-3a840e0abdeb43bf8e167e185cede95d" data-id="3a840e0abdeb43bf8e167e185cede95d"><span><div id="3a840e0abdeb43bf8e167e185cede95d" class="notion-header-anchor"></div><span class="notion-h-title">main.c</span></span></h4></summary><div><div class="notion-text notion-block-5dfcf71259494b8c9afe737eb9a81762">#include &quot;stm32f1xx_hal.h&quot;</div><div class="notion-text notion-block-997745bf45054a28bf45ee1c538f146e">#include &quot;rcc.h&quot;</div><div class="notion-text notion-block-fe7a08b63c924637b2763a7e1833d8ed">#include &quot;led.h&quot;</div><div class="notion-text notion-block-4f3348b415c44f99b70df2991ad47602">#include &quot;sw.h&quot;</div><div class="notion-text notion-block-38fe7aef168646b7aa86364fb483725b">#include &quot;uart.h&quot;</div><div class="notion-text notion-block-f59068a88cbe47f78c521bbfd40b6fe6">#include &quot;time.h&quot;</div><div class="notion-text notion-block-1e64407bac0f411eb3e491057d10fc90">int main(void){<div class="notion-text-children"><div class="notion-text notion-block-2b49a0eb20b64ee39b10789b75a030a4">HAL_Init();</div><div class="notion-text notion-block-7e5d6ebe13eb4f3dbba77aa301a9373e">RccClock_Init();</div><div class="notion-text notion-block-2fd5c2c09b9e467fb1adf54d3cf21a5c">U1_Init(921600);</div><div class="notion-text notion-block-a26e8ee7c31a4f0388ec879d7f3dcbe6">Timer1_Init(5 - 1, 0, 1 - 1);         //5次有效边沿</div><div class="notion-text notion-block-c3e11d22ab504e3881ab1a6fff62a822">Timer2_Init(5 - 1, 0);   // 5次</div><div class="notion-text notion-block-64248baac00e4bb09e30d02a68ce95aa">Timer3_Init(5 - 1, 0);   // 5次</div><div class="notion-text notion-block-9bb58b72c3bf4116a5eed95554c01db6">Timer4_Init(5 - 1, 0);   // 5次</div><div class="notion-text notion-block-01e7fea6307b49de96dd4ec593734ba7">U1_Printf(&quot;初始化完成rn&quot;);</div><div class="notion-text notion-block-150195ae32534d7e9934ddbb381df6db">while(1){</div><div class="notion-text notion-block-82839f673c6b4b49a44cc2483c5e2004">}</div></div></div><div class="notion-text notion-block-830310f0eaa643cca1f299b336ed6590">}</div></div></details></div></details></div></div><details class="notion-toggle notion-block-d1bec4e72b09490197e6fc612995a0d8"><summary><h4 class="notion-h notion-h3 notion-block-d1bec4e72b09490197e6fc612995a0d8" data-id="d1bec4e72b09490197e6fc612995a0d8"><span><div id="d1bec4e72b09490197e6fc612995a0d8" class="notion-header-anchor"></div><span class="notion-h-title">stm32f1xx_it.c</span></span></h4></summary><div><div class="notion-text notion-block-5c4a63fd937d43f0b2660355f86ae3fc">/<em>-------------------------------------------------</em>/</div><div class="notion-text notion-block-9bbee1dba6bc438fb716faddc9a13f3d">/<em>                                                 </em>/</div><div class="notion-text notion-block-5893dd9eb1ff491c8e2a7f32741fb9fb">/<em>          实现各种中断服务函数的源文件           </em>/</div><div class="notion-text notion-block-c9f76f45729d47fb89feef6873e0956d">/<em>                                                 </em>/</div><div class="notion-text notion-block-9f50189f8ed84a27812d51d9432ddd1a">/<em>-------------------------------------------------</em>/</div><div class="notion-text notion-block-192452f9f8f649b99245d5e8958da4bf">#include &quot;stm32f1xx_hal.h&quot;   </div><div class="notion-text notion-block-3660a92f6be34c8cabc696b0335f59bd">#include &quot;stm32f1xx_it.h&quot;</div><div class="notion-text notion-block-dda83cfb79624792bcf31c1a405b5d66">#include &quot;uart.h&quot;</div><div class="notion-text notion-block-34ed8bf0fcbb4f5d94940199a8aab46c">#include &quot;time.h&quot;</div><div class="notion-text notion-block-8f53df9967214394965a456628d815a8">void EXTI15_10_IRQHandler(void)</div><div class="notion-text notion-block-9813897e947141e588ce75aaebe9561a">{</div><div class="notion-text notion-block-84e54a40250b497a85222bdb7129293c">HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_14);</div><div class="notion-text notion-block-ab7fa4b3b813454c8117bdce8630a7a7">}</div><div class="notion-text notion-block-798e4b621ce545cbb05b6987ba400c8e">void EXTI0_IRQHandler(void)</div><div class="notion-text notion-block-d455db0de6814867a26a3e8c06bbbe16">{</div><div class="notion-text notion-block-d7e2aef2951c49c9aece201311f570ee">HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_0);</div><div class="notion-text notion-block-8eb32a94fb57410b82a1372b5d19b804">}</div><div class="notion-text notion-block-2509cd0ce88942d0b23306edf993f8c2">void USART1_IRQHandler(void)</div><div class="notion-text notion-block-17202463dab74174a536a117e9862a7d">{</div><div class="notion-text notion-block-351e36312c664f128fdfe023c2c066cf">HAL_UART_IRQHandler(&amp;uart1.uart);</div><div class="notion-text notion-block-2cac29b4af1a4936976c2e55a226c8fb">if(__HAL_UART_GET_FLAG(&amp;uart1.uart, UART_FLAG_IDLE)){<div class="notion-text-children"><div class="notion-text notion-block-929fd6023bc144099f4cafc575d9cfee">__HAL_UART_CLEAR_IDLEFLAG(&amp;uart1.uart);</div><div class="notion-text notion-block-d7ca5aa74550402c891ad4dcef604d0b">uart1.RxCounter += (U1_RX_MAX - __HAL_DMA_GET_COUNTER(&amp;uart1.dmarx));</div><div class="notion-text notion-block-f50344389360416fbd89a10759152c9d">HAL_UART_AbortReceive_IT(&amp;uart1.uart);</div></div></div><div class="notion-text notion-block-99cc4f8ef9bf40fcb05c17a8d3d77abc">}</div><div class="notion-text notion-block-4b6b460f54284c208a534e83ca522976">}</div><div class="notion-text notion-block-5dbe4e7881b74ef5b97765d90b6f31f4">void USART2_IRQHandler(void)</div><div class="notion-text notion-block-2a9d95cccbeb4e5e9352c7fbaf27dd44">{</div><div class="notion-text notion-block-6fc40e5d0b5c44109027ac8fb874a046">HAL_UART_IRQHandler(&amp;uart2.uart);</div><div class="notion-text notion-block-cbdf8e6d9a884b5d846fd7d503f590b7">if(__HAL_UART_GET_FLAG(&amp;uart2.uart, UART_FLAG_IDLE)){<div class="notion-text-children"><div class="notion-text notion-block-664952bbe1bf4d26a1e9e9a8b1400ba7">__HAL_UART_CLEAR_IDLEFLAG(&amp;uart2.uart);</div><div class="notion-text notion-block-524be3cd038b43e2bf5274cc3198edce">uart2.RxCounter += (U2_RX_MAX - __HAL_DMA_GET_COUNTER(&amp;uart2.dmarx));</div><div class="notion-text notion-block-c7a728c42d2c407696c3e14ae880a3db">HAL_UART_AbortReceive_IT(&amp;uart2.uart);</div></div></div><div class="notion-text notion-block-6ef3f6f8abe3423291fcb013ca76ecce">}</div><div class="notion-text notion-block-9c37979cee1541d19660ddeaf9d174f0">}</div><div class="notion-text notion-block-33b6ee3b4bab4c028d8bf81046e9c943">void USART3_IRQHandler(void)</div><div class="notion-text notion-block-f8d7a375f0e447fab9b424e6518a9ce8">{</div><div class="notion-text notion-block-d0a02310da8c4ec5a47ac5d443484167">HAL_UART_IRQHandler(&amp;uart3.uart);</div><div class="notion-text notion-block-27191f37db2c417bb97882bf977e54e6">if(__HAL_UART_GET_FLAG(&amp;uart3.uart, UART_FLAG_IDLE)){<div class="notion-text-children"><div class="notion-text notion-block-ec2078d1efc54fbcb81522404d280c52">__HAL_UART_CLEAR_IDLEFLAG(&amp;uart3.uart);</div><div class="notion-text notion-block-b7a4498dc912422e9fdf38994859361c">uart3.RxCounter += (U3_RX_MAX - __HAL_DMA_GET_COUNTER(&amp;uart3.dmarx));</div><div class="notion-text notion-block-b540650729ff47b581334249ca23dbe1">HAL_UART_AbortReceive_IT(&amp;uart3.uart);</div></div></div><div class="notion-text notion-block-f2281c3b74964f7ab9feb5a42b37d592">}</div><div class="notion-text notion-block-39c0edc4ecf848c19b8e82913c5098a3">}</div><div class="notion-text notion-block-864a9835d05044bbb7c0cf583b8be42c">void DMA1_Channel4_IRQHandler(void)</div><div class="notion-text notion-block-b09157ea630140119cb0466376789c6c">{</div><div class="notion-text notion-block-d055e464d7e2453e99b8c40715581ef2">HAL_DMA_IRQHandler(&amp;uart1.dmatx);</div><div class="notion-text notion-block-d09ce8e48ed74d73a3b53e876f2c991c">}</div><div class="notion-text notion-block-ebcc26352c6740779d7559c858111f6b">//void DMA1_Channel5_IRQHandler(void)</div><div class="notion-text notion-block-d3377059bcfe4e9cb1f95317dfd7d442">//{</div><div class="notion-text notion-block-78635ad7031347e8bd29b30540c374f5">//    HAL_DMA_IRQHandler(&amp;uart1.dmarx);</div><div class="notion-text notion-block-2eda83c59fc34457a9c0dd43681396af">//}</div><div class="notion-text notion-block-0150518604c047c996e5e8ea994bb991">//void DMA1_Channel7_IRQHandler(void)</div><div class="notion-text notion-block-c65e5e5158ee4ddd84c5f811f47688c6">//{</div><div class="notion-text notion-block-ac44423e9f814611a10d75202df80997">//    HAL_DMA_IRQHandler(&amp;uart2.dmatx);</div><div class="notion-text notion-block-c10eec3664894937b29ca25361fdfdec">//}</div><div class="notion-text notion-block-29db05c9fd414d1c8e6e8e9464d95675">void DMA1_Channel6_IRQHandler(void)</div><div class="notion-text notion-block-891ddc620fea462a890be9cb4d81a9ac">{</div><div class="notion-text notion-block-1d3f58de12d446669797e100df473be0">HAL_DMA_IRQHandler(&amp;uart2.dmarx);</div><div class="notion-text notion-block-440a7745da3b482096ab26b05f325827">}</div><div class="notion-text notion-block-d6c49891c0b34c468e0e072976bf5061">//void DMA1_Channel2_IRQHandler(void)</div><div class="notion-text notion-block-06af32c116e04b89947ffdbffa2c8d0e">//{</div><div class="notion-text notion-block-d3c8b17812fc49c7b955ee94f6b11c61">//    HAL_DMA_IRQHandler(&amp;uart3.dmatx);</div><div class="notion-text notion-block-d6306e28b6484c9c84e927a606ce1a12">//}</div><div class="notion-text notion-block-c66a4fe375e549af86e440612e1e1058">//void DMA1_Channel3_IRQHandler(void)</div><div class="notion-text notion-block-0c9ac330b2c44014b949934a83ee14a1">//{</div><div class="notion-text notion-block-6db69f016a02486888eed7418786f93f">//    HAL_DMA_IRQHandler(&amp;uart3.dmarx);</div><div class="notion-text notion-block-eba1b55e0a1a4ce8a5ac23a908f0fa42">//}</div><div class="notion-text notion-block-f9aa0f4c490343fea772a198c24b18b2">void TIM1_UP_IRQHandler(void)</div><div class="notion-text notion-block-3ff316af0a7c4c7599fcd998bb744d6b">{</div><div class="notion-text notion-block-e8cd6a96b9a94048968a52195f959b1f">HAL_TIM_IRQHandler(&amp;tim1);</div><div class="notion-text notion-block-4a3015d9098c445382f2a9c84f6ae089">}</div><div class="notion-text notion-block-448af0deef374c4b8e118548c4413d9a">void TIM1_TRG_COM_IRQHandler(void)</div><div class="notion-text notion-block-9be709e311364413881862bc0b5ae539">{</div><div class="notion-text notion-block-e9966de7e9a24c458fe1ea4f3172c45e">HAL_TIM_IRQHandler(&amp;tim1);</div><div class="notion-text notion-block-d43d946923634b258ab37669d9b68457">}</div><div class="notion-text notion-block-66649cd8bec346d49174f21ca905a178">void DMA1_Channel5_IRQHandler(void)</div><div class="notion-text notion-block-6cbdb71af46d4f299836c2e6f256fc3d">{</div><div class="notion-text notion-block-078539533ed2402d933e170f6ecaf764">HAL_DMA_IRQHandler(&amp;tim1_dmaup);</div><div class="notion-text notion-block-3c71b197b9b94ac2922f5af1babd2a9c">}</div><div class="notion-text notion-block-53d782c41e4c4b3dbc2719f11e14f8c3">void TIM2_IRQHandler(void)</div><div class="notion-text notion-block-c930cb8fdc7341dbb96145ebe5b23f60">{</div><div class="notion-text notion-block-775cd1d2706e478987062db7fa98c932">HAL_TIM_IRQHandler(&amp;tim2);</div><div class="notion-text notion-block-73613e0850c34fb7a9a2238af7651115">}</div><div class="notion-text notion-block-6c688bc9ec704a2ea4f5698657056053">void DMA1_Channel2_IRQHandler(void)</div><div class="notion-text notion-block-8f29f5f5adfd4293893e31b3272be8a3">{</div><div class="notion-text notion-block-8044e8f0531648108a523eb900352a55">HAL_DMA_IRQHandler(&amp;tim2_dmaup);</div><div class="notion-text notion-block-4c9b6262e92246648eaa224d53bb0903">}</div><div class="notion-text notion-block-20f1679d507d4425956e4acfeede7c4b">void TIM3_IRQHandler(void)</div><div class="notion-text notion-block-6e12c94786ae40f2b3a870827d6dd0d9">{</div><div class="notion-text notion-block-da82030ffc824ecc9c53d73211d8a2da">HAL_TIM_IRQHandler(&amp;tim3);</div><div class="notion-text notion-block-46e2069000c54d6582175c4ddfa515ce">}</div><div class="notion-text notion-block-3d1a0ff84c714799944fb08d4265472e">void DMA1_Channel3_IRQHandler(void)</div><div class="notion-text notion-block-d62c3170e8dd451c9a171006805444c6">{</div><div class="notion-text notion-block-3d49379390ba46a38cb040a6c9c2bfa7">HAL_DMA_IRQHandler(&amp;tim3_dmaup);</div><div class="notion-text notion-block-1013a4a767c54b8880584c8e308b875d">}</div><div class="notion-text notion-block-3da51de6362a467da4ba8055972bf778">void TIM4_IRQHandler(void)</div><div class="notion-text notion-block-6b85e5450c1a4d0f87db4903d49e25a5">{</div><div class="notion-text notion-block-9994c30709a249f595fc0d560adcf39f">HAL_TIM_IRQHandler(&amp;tim4);</div><div class="notion-text notion-block-4d10e527c2894e029e161f4073292dfc">}</div><div class="notion-text notion-block-95d655242b5b41688c4c18ee2defdb2a">void DMA1_Channel7_IRQHandler(void)</div><div class="notion-text notion-block-dc19ea01fef4417db2dc26775983038f">{</div><div class="notion-text notion-block-aad8d6e59ee547e5b00a41c59a4c344a">HAL_DMA_IRQHandler(&amp;tim4_dmaup);</div><div class="notion-text notion-block-effa48b8f6374ef39ac093040cb80317">}</div><div class="notion-text notion-block-c76f3726e5e64b179c082f1a6caa1207">/<em>-------------------------------------------------</em>/</div><div class="notion-text notion-block-1e896614e51b4218a5a067ee282e9eaf">/<em>函数名：不可屏蔽中断处理函数                     </em>/</div><div class="notion-text notion-block-ae96c04ff7634738b0cde435a92a1a5c">/<em>参  数：无                                       </em>/</div><div class="notion-text notion-block-fc22f5b7cc66492aaf5477bdc63ef451">/<em>返回值：无                                       </em>/</div><div class="notion-text notion-block-9b8a9f3b27e94ad98010705048e0bfd5">/<em>-------------------------------------------------</em>/</div><div class="notion-text notion-block-8de85d36890544fdb4ea26f5f6836301">void NMI_Handler(void)</div><div class="notion-text notion-block-e4aed5d6475a4e72ae02568b0fe6c2d6">{</div><div class="notion-text notion-block-dd0c03a6fc2f4739b347bafc327c850e">}</div><div class="notion-text notion-block-49e40414f4a840ae9d7a3c7030047463">/<em>-------------------------------------------------</em>/</div><div class="notion-text notion-block-d71745e99a3a4f94b37a5654ac85a89f">/<em>函数名：硬件出错后进入的中断处理函数             </em>/</div><div class="notion-text notion-block-1fd8e1da01d74f31a52e215c36b3c746">/<em>参  数：无                                       </em>/</div><div class="notion-text notion-block-6c7bf7dd8aeb4f9582639991acf95535">/<em>返回值：无                                       </em>/</div><div class="notion-text notion-block-85ddf10ae0b447b9b839d40083d62c8b">/<em>-------------------------------------------------</em>/</div><div class="notion-text notion-block-10b446db4e314669b94a2530ee41f809">void HardFault_Handler(void)</div><div class="notion-text notion-block-ca061a3a6d37461e8a715794004699f2">{</div><div class="notion-text notion-block-664ea04e035c4d1cba09a1810f86aed2">}</div><div class="notion-text notion-block-81da20a66db349d99f7456ce36a636f5">/<em>-------------------------------------------------</em>/</div><div class="notion-text notion-block-1e5506c5f27b4f2b8d845792f5f1e0e3">/<em>函数名：软中断，SWI 指令调用的处理函数           </em>/</div><div class="notion-text notion-block-7212c4a794f347da8fb0b639c6f97247">/<em>参  数：无                                       </em>/</div><div class="notion-text notion-block-d3b11b32f2854348a7816b55fc9a0d02">/<em>返回值：无                                       </em>/</div><div class="notion-text notion-block-204309eb9edf406987c8869bd38b20ac">/<em>-------------------------------------------------</em>/</div><div class="notion-text notion-block-f498059f627c4186ba70a39cc6281d95">void SVC_Handler(void)</div><div class="notion-text notion-block-0d1b90f5cce047ce806b72876c8db1aa">{</div><div class="notion-text notion-block-1b0863227e604d5f9980baf36df6bcf0">}</div><div class="notion-text notion-block-043a10872479495bbd3c0dd7939e5c58">/<em>-------------------------------------------------</em>/</div><div class="notion-text notion-block-9a357d9598654346bdb8e7a86f7aee29">/<em>函数名：可挂起的系统服务处理函数                 </em>/</div><div class="notion-text notion-block-a4f05dda55b7461abdae265e9787758c">/<em>参  数：无                                       </em>/</div><div class="notion-text notion-block-1a4ab931346347a99def915b9be2660f">/<em>返回值：无                                       </em>/</div><div class="notion-text notion-block-1d892754cfc04571b4ec232a33e20ddc">/<em>-------------------------------------------------</em>/</div><div class="notion-text notion-block-8bb04aee35ed4187b1beb4bdc157b8eb">void PendSV_Handler(void)</div><div class="notion-text notion-block-d3b26c5e16674995a1c11b3674fa83bd">{</div><div class="notion-text notion-block-f3bc0a596b03455391d93610473c005c">}</div><div class="notion-text notion-block-cedf2c4e4f9b4bd4b684f6f6fc16c8a6">/<em>-------------------------------------------------</em>/</div><div class="notion-text notion-block-cd27829a14f346c9865068f1666ddd08">/<em>函数名：SysTic系统嘀嗒定时器处理函数             </em>/</div><div class="notion-text notion-block-f53caab34f2243898472a7f91d04b5aa">/<em>参  数：无                                       </em>/</div><div class="notion-text notion-block-44b84cd306e24f1abe2397dfb39e1034">/<em>返回值：无                                       </em>/</div><div class="notion-text notion-block-ec5286b063bc4ba9975426d9fff8bfe3">/<em>-------------------------------------------------</em>/</div><div class="notion-text notion-block-e748da64aacf4c78b56a950064b451ca">void SysTick_Handler(void)</div><div class="notion-text notion-block-c73a7399eda247bf8513abe01b697e90">{  </div><div class="notion-text notion-block-66b905eabbb644e0990494d823deed14">HAL_IncTick();	</div><div class="notion-text notion-block-a99c60e099224926b47a79b5145092b6">}</div></div></details><details class="notion-toggle notion-block-fb634f3b1e53407db984c67184036274"><summary><h3 class="notion-h notion-h2 notion-block-fb634f3b1e53407db984c67184036274" data-id="fb634f3b1e53407db984c67184036274"><span><div id="fb634f3b1e53407db984c67184036274" class="notion-header-anchor"></div><span class="notion-h-title">七、HAL库：TIM12 外部模式2 循环 中断  DMA方式  按键计数</span></span></h3></summary><div><div class="notion-text notion-block-0aca5526005248828f5d1c50cfafe5b2">具体方式与外模1类似，但是需要注意一下  两  点：</div><ol start="1" class="notion-list notion-list-numbered notion-block-b05b655167ec4e7ba780c55cd67674a7" style="list-style-type:decimal"><li><b><span class="notion-inline-underscore"> 外部模式2并没有触发中断</span></b></li><ol class="notion-list notion-list-numbered notion-block-b05b655167ec4e7ba780c55cd67674a7" style="list-style-type:lower-alpha"><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-cb9f6abecf2d4fbab26aaeda928dfb41"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:100%;max-width:100%;flex-direction:column"><img style="object-fit:cover" src="https://cdn.jsdmirror.com/gh/LZJ-I/picx-images-hosting@main/images/%E5%B5%8C%E5%85%A5%E5%BC%8F%E8%BD%AF%E4%BB%B6%E5%BC%80%E5%8F%91/Post-stm32-hal/7e1fc817-6bfc-493e-b980-378a2faa67b6-image.webp?spaceId=3a565fcb-f425-4846-b72a-d32a98183896&amp;t=cb9f6abe-cf2d-4fba-b26a-aeda928dfb41" alt="notion image" loading="lazy" decoding="async"/></div></figure><div class="notion-text notion-block-30b29b6d76f941db9afc9028c1e9b4ec">可以看到外部模式1 有TIF触发事件的产生</div><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-d366213456b748a3bdb6700233e77007"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:100%;max-width:100%;flex-direction:column"><img style="object-fit:cover" src="https://cdn.jsdmirror.com/gh/LZJ-I/picx-images-hosting@main/images/%E5%B5%8C%E5%85%A5%E5%BC%8F%E8%BD%AF%E4%BB%B6%E5%BC%80%E5%8F%91/Post-stm32-hal/2b374f6e-bb35-4111-b57d-5316a5a02489-image.webp?spaceId=3a565fcb-f425-4846-b72a-d32a98183896&amp;t=d3662134-56b7-48a3-bdb6-700233e77007" alt="notion image" loading="lazy" decoding="async"/></div></figure><div class="notion-text notion-block-18f067809de149ad8e1672b018a00e20">但是外部模式2并没有</div><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-c7a2ced5728f4644bfd69d2fdf2e7f1a"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:100%;max-width:100%;flex-direction:column"><img style="object-fit:cover" src="https://cdn.jsdmirror.com/gh/LZJ-I/picx-images-hosting@main/images/%E5%B5%8C%E5%85%A5%E5%BC%8F%E8%BD%AF%E4%BB%B6%E5%BC%80%E5%8F%91/Post-stm32-hal/cb0ae044-7bfd-4d5d-8e94-354e59423208-image.webp?spaceId=3a565fcb-f425-4846-b72a-d32a98183896&amp;t=c7a2ced5-728f-4644-bfd6-9d2fdf2e7f1a" alt="notion image" loading="lazy" decoding="async"/></div></figure></ol></ol><ol start="2" class="notion-list notion-list-numbered notion-block-23425abade2f4f4389cd7f6f940dfad1" style="list-style-type:decimal"><li><b><span class="notion-inline-underscore">外部模式2仅支持ETR通道</span></b></li><ol class="notion-list notion-list-numbered notion-block-23425abade2f4f4389cd7f6f940dfad1" style="list-style-type:lower-alpha"><ul class="notion-list notion-list-disc notion-block-4246fc5d365b4cbf97f2675e012818ae"><li>STMF103C8T6只有TIM 1  2 有ERT通道</li></ul></ol></ol></div></details></div></details><details class="notion-toggle notion-block-bed8a6b792284b49b1e2f5ad7af7c4b4"><summary><h2 class="notion-h notion-h1 notion-h-indent-0 notion-block-bed8a6b792284b49b1e2f5ad7af7c4b4" data-id="bed8a6b792284b49b1e2f5ad7af7c4b4"><span><div id="bed8a6b792284b49b1e2f5ad7af7c4b4" class="notion-header-anchor"></div><span class="notion-h-title">定时器[基础定时]篇</span></span></h2></summary><div><details class="notion-toggle notion-block-e2b12a7f231749b18ec09ea823dd11b8"><summary><h3 class="notion-h notion-h2 notion-block-e2b12a7f231749b18ec09ea823dd11b8" data-id="e2b12a7f231749b18ec09ea823dd11b8"><span><div id="e2b12a7f231749b18ec09ea823dd11b8" class="notion-header-anchor"></div><span class="notion-h-title">一、资源介绍：STM32F103C8T6定时器资源介绍</span></span></h3></summary><div></div></details><details class="notion-toggle notion-block-aa0febc117b24ab38134d69a76155659"><summary><h4 class="notion-h notion-h3 notion-block-aa0febc117b24ab38134d69a76155659" data-id="aa0febc117b24ab38134d69a76155659"><span><div id="aa0febc117b24ab38134d69a76155659" class="notion-header-anchor"></div><span class="notion-h-title"><b>高级定时器（TIM1）</b></span></span></h4></summary><div><ul class="notion-list notion-list-disc notion-block-90d0d7a8578b426e8d8910e2d66332e0"><li>时基单元包含：</li><ul class="notion-list notion-list-disc notion-block-90d0d7a8578b426e8d8910e2d66332e0"><li>计数器寄存器（TIMx_CNT）</li><li>预分频器寄存器（TIMx_PSC）</li><li>自动装载寄存器（TIMx_ARR）</li><li>重复次数寄存器（TIMx_RCR）</li></ul></ul></div></details><details class="notion-toggle notion-block-59c20ee3085e4abeae9d22cf42683e6c"><summary><h4 class="notion-h notion-h3 notion-block-59c20ee3085e4abeae9d22cf42683e6c" data-id="59c20ee3085e4abeae9d22cf42683e6c"><span><div id="59c20ee3085e4abeae9d22cf42683e6c" class="notion-header-anchor"></div><span class="notion-h-title"><b>通用定时器（TIM2、TIM3、TIM4）</b></span></span></h4></summary><div><ul class="notion-list notion-list-disc notion-block-043d1226a78848b8bee4a086ef6d97eb"><li>时基单元包含：</li><ul class="notion-list notion-list-disc notion-block-043d1226a78848b8bee4a086ef6d97eb"><li>计数器寄存器（TIMx_CNT）</li><li>预分频器寄存器（TIMx_PSC）</li><li>自动装载寄存器（TIMx_ARR）</li></ul></ul></div></details><details class="notion-toggle notion-block-d76b4637537b4e319982b2431cbc961a"><summary><h4 class="notion-h notion-h3 notion-block-d76b4637537b4e319982b2431cbc961a" data-id="d76b4637537b4e319982b2431cbc961a"><span><div id="d76b4637537b4e319982b2431cbc961a" class="notion-header-anchor"></div><span class="notion-h-title"><b>定时器 1 通道</b></span></span></h4></summary><div><ul class="notion-list notion-list-disc notion-block-38fa2262076c48159d405d636bb83902"><li><b>通道 1：</b>PA8、  DMA1_Channel2</li></ul><ul class="notion-list notion-list-disc notion-block-984e6af019dc4718acce5bebca621737"><li><b>通道 2：</b>PA9、 DMA1_Channel3</li></ul><ul class="notion-list notion-list-disc notion-block-c115d7b9d0834fffb53d85008d104a92"><li><b>通道 3：</b>PA10、 DMA1_Channel6</li></ul><ul class="notion-list notion-list-disc notion-block-d08bc30c6aa54dec9a68eaa295b9c5c2"><li><b>通道 4：</b>PA11、 DMA1_Channel4</li></ul><ul class="notion-list notion-list-disc notion-block-699552d5fddf4602a09fdac2b9190bc6"><li><b>通道 ETR：</b>PA12</li></ul><hr class="notion-hr notion-block-1fd24a34afd04a009e108e31697edbc7"/><ul class="notion-list notion-list-disc notion-block-4c6e7256786a40ef9a0f8ea9eab578b9"><li><b>刹车：            </b>PB12、PA6（重映射）</li></ul><ul class="notion-list notion-list-disc notion-block-93944e3f9f9e49f0b46424f4e1c92739"><li>通道 1 互补：PB13、PA7（重映射）</li></ul><ul class="notion-list notion-list-disc notion-block-2672434f16b746209c12cf87fde38e7f"><li>通道 2 互补：PB14、PB0（重映射）</li></ul><ul class="notion-list notion-list-disc notion-block-e4abe7a649a5464e8290fbafa320adc6"><li>通道 3 互补：PB15、PB1（重映射）</li></ul></div></details><details class="notion-toggle notion-block-a6c1b56c66e4410aba1d17cddb138889"><summary><h4 class="notion-h notion-h3 notion-block-a6c1b56c66e4410aba1d17cddb138889" data-id="a6c1b56c66e4410aba1d17cddb138889"><span><div id="a6c1b56c66e4410aba1d17cddb138889" class="notion-header-anchor"></div><span class="notion-h-title"><b>定时器 2 通道</b></span></span></h4></summary><div><ul class="notion-list notion-list-disc notion-block-d9f443b7935345b4875a2ba506aaa139"><li>通道 1：PA0（重映射 PA15）、PA1（重映射 PB3）</li></ul><ul class="notion-list notion-list-disc notion-block-efea0e5e20094e1780c77b9ecdfbdda0"><li>通道 2：PA2（重映射 PB10）</li></ul><ul class="notion-list notion-list-disc notion-block-5eb40b23ed1b48c5a25f0b03f904e4ee"><li>通道 3：DMA1_Channel5、DMA1_Channel7、DMA1_Channel1、DMA1_Channel7</li></ul><ul class="notion-list notion-list-disc notion-block-3b36635b25f1426784cccebef06f97a0"><li>通道 4：PA3（重映射 PB11）</li></ul><ul class="notion-list notion-list-disc notion-block-cb44f70981a24d36ac47e392e95a670c"><li>通道 ETR：PA0（重映射 PA15）</li></ul></div></details><details class="notion-toggle notion-block-627dbf21bb3848ec85133cf8565092bc"><summary><h4 class="notion-h notion-h3 notion-block-627dbf21bb3848ec85133cf8565092bc" data-id="627dbf21bb3848ec85133cf8565092bc"><span><div id="627dbf21bb3848ec85133cf8565092bc" class="notion-header-anchor"></div><span class="notion-h-title"><b>定时器 3 通道</b></span></span></h4></summary><div><ul class="notion-list notion-list-disc notion-block-2915ce7eb98d43dd8e5386e1ba1cd8a4"><li>通道 1：PA6（重映射 PB4）、DMA1_Channel6、DMA1_Channel2、DMA1_Channel3</li></ul><ul class="notion-list notion-list-disc notion-block-a23d0c24e1cf47a3885b70d342c1dd7c"><li>通道 2：PA7（重映射 PB5）</li></ul><ul class="notion-list notion-list-disc notion-block-d35316e06f994ac698e15799caa6d685"><li>通道 3：PB0</li></ul><ul class="notion-list notion-list-disc notion-block-dfaad3856a8646c4921e3971ce93fd9a"><li>通道 4：PB1</li></ul><ul class="notion-list notion-list-disc notion-block-5422f87c2adc45dfa03229128ed406a4"><li>通道 ETR：无</li></ul></div></details><details class="notion-toggle notion-block-7b18962adc474786a9a73b66f41b48cc"><summary><h4 class="notion-h notion-h3 notion-block-7b18962adc474786a9a73b66f41b48cc" data-id="7b18962adc474786a9a73b66f41b48cc"><span><div id="7b18962adc474786a9a73b66f41b48cc" class="notion-header-anchor"></div><span class="notion-h-title">定时器 4 通道</span></span></h4></summary><div><ul class="notion-list notion-list-disc notion-block-6a5b88d64f784c849323281e21cbc75e"><li>通道1：PB6    DMA1 Channel1</li></ul><ul class="notion-list notion-list-disc notion-block-fd17108e870748b09c7725d2194bd5bf"><li>通道2：PB7   DMA1 Channel4</li></ul><ul class="notion-list notion-list-disc notion-block-153f397314834e93bc85ec391bbc3177"><li>通道3：PB8    DMA1 Channel5</li></ul><ul class="notion-list notion-list-disc notion-block-3e44813212b740fb9d62df76f03e550b"><li>通道4：PB9</li></ul><ul class="notion-list notion-list-disc notion-block-8a11c4f5a21e433caa3f59287805c648"><li>通道ETR：无</li></ul></div></details><details class="notion-toggle notion-block-76b4a1dbc9394bbf8d4ed9784cba5b0d"><summary><h3 class="notion-h notion-h2 notion-block-76b4a1dbc9394bbf8d4ed9784cba5b0d" data-id="76b4a1dbc9394bbf8d4ed9784cba5b0d"><span><div id="76b4a1dbc9394bbf8d4ed9784cba5b0d" class="notion-header-anchor"></div><span class="notion-h-title">二、HAL库：TIM1234轮询方式 基础定时</span></span></h3></summary><div><details class="notion-toggle notion-block-b72db2879ca0483282038c5eac1a9dbd"><summary><h4 class="notion-h notion-h3 notion-block-b72db2879ca0483282038c5eac1a9dbd" data-id="b72db2879ca0483282038c5eac1a9dbd"><span><div id="b72db2879ca0483282038c5eac1a9dbd" class="notion-header-anchor"></div><span class="notion-h-title">1. 相关函数</span></span></h4></summary><div><ul class="notion-list notion-list-disc notion-block-c1a262f2ab7741f88fd3bfaf83690a66"><li><code class="notion-inline-code">TIM_HandleTypeDef</code> 定时器总控结构体</li></ul><ul class="notion-list notion-list-disc notion-block-6371b266a403446f9086d98658e036ae"><li><code class="notion-inline-code">HAL_TIM_Base_Init(&amp;tim3);</code>   轮询 初始化定时器</li></ul><ul class="notion-list notion-list-disc notion-block-0056d675be9a4171997272841854150c"><li><code class="notion-inline-code">__HAL_TIM_CLEAR_FLAG(&amp;tim3, TIM_FLAG_UPDATE);</code>  清除更新标志位</li></ul><ul class="notion-list notion-list-disc notion-block-ee526e797481483d8cb58089e0d80a1e"><li><code class="notion-inline-code">HAL_TIM_Base_Start(&amp;tim3);</code>  开启定时器</li></ul><ul class="notion-list notion-list-disc notion-block-ada5ab9fd5bf48a580a85d78777f6f73"><li><code class="notion-inline-code">void HAL_TIM_Base_MspDeInit(TIM_HandleTypeDef *htim)</code> 定时器DeInit回调函数</li></ul><ul class="notion-list notion-list-disc notion-block-eeb77066f18e4b3ab3d7790d3e0222f9"><li>基础的初始化</li></ul><ul class="notion-list notion-list-disc notion-block-6dbba3647c324de5af11a2aa21180ff7"><li><code class="notion-inline-code">void HAL_TIM_Base_MspInit(TIM_HandleTypeDef *htim)</code>  定时器Init回调函数</li></ul><ul class="notion-list notion-list-disc notion-block-5d81d04fd52246eaad572f6763df1e3c"><li>基础的初始化</li></ul></div></details><div class="notion-text notion-block-1fd1260dad644187814c076dadcabcd7">void Timer1_Init(uint16_t arr, uint16_t psc, uint8_t rep)</div><div class="notion-text notion-block-82fffd1f30b34fcd8830e97e957dc826">{</div><div class="notion-text notion-block-ca3f395f350347958718ce8e225c21fd">tim1.Instance = TIM1;                                        // 实例</div><div class="notion-text notion-block-5ffcd2c7d72c427d9e74cdca9048bef5">tim1.Init.Period = arr;                                      // 重装载值</div><div class="notion-text notion-block-570fa86e0b464bb7bb98a506b6f3af6d">tim1.Init.Prescaler = psc;                                   // 分频系数</div><div class="notion-text notion-block-1f7e08eee5ea43278d4fc111dc3adce5">tim1.Init.CounterMode = TIM_COUNTERMODE_UP;                  // 计数模式</div><div class="notion-text notion-block-33c37a22be8c44bb8bf0961984b3c235">tim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;            // 分频因子</div><div class="notion-text notion-block-6e9a4e6b7ffb44078a4a9210ec880377">tim1.Init.RepetitionCounter = rep;                           // 重复计数值</div><div class="notion-text notion-block-534d16cb4ad2400c9d56c8d888eb402e">tim1.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;// 自动重装载值 预装载使能位（影子寄存器）</div><div class="notion-text notion-block-296db8fc8e2f47b39febddbc6cd2e02e">HAL_TIM_Base_Init(&amp;tim1);                       //初始化定时器</div><div class="notion-text notion-block-7606f96d9fb649c0871e7c95ab8ae9de">__HAL_TIM_CLEAR_FLAG(&amp;tim1, TIM_FLAG_UPDATE);   //手动清除更新事件</div><div class="notion-text notion-block-56739986d4db44ab874868c42c89e497">HAL_TIM_Base_Start(&amp;tim1);                      //打开定时器（轮询方式）</div><div class="notion-text notion-block-d2ef928120e44fad950dc1a34adf1807">}</div></div></details><div class="notion-text notion-block-8d1f38d925454d84940727dcff337303">if(__HAL_TIM_GET_FLAG(&amp;tim1, TIM_FLAG_UPDATE)){</div><div class="notion-text notion-block-f4981a024e014fcabadda076ff9e98a7">__HAL_TIM_CLEAR_FLAG(&amp;tim1, TIM_FLAG_UPDATE);   ///清除标志位</div><div class="notion-text notion-block-1d125e18afd9459e9f221ad9fe5fe496">U1_Printf(&quot;定时器 1 定时时间:%drn&quot;,time1++);</div><div class="notion-text notion-block-4a161dac6e054f99ba171625330ce57f">}</div><div class="notion-blank notion-block-66b14279bbca4e2983535f104c5f1214"> </div><details class="notion-toggle notion-block-2f94058dc6324c25962781b2c586f010"><summary><h4 class="notion-h notion-h3 notion-block-2f94058dc6324c25962781b2c586f010" data-id="2f94058dc6324c25962781b2c586f010"><span><div id="2f94058dc6324c25962781b2c586f010" class="notion-header-anchor"></div><span class="notion-h-title">2. 程序</span></span></h4></summary><div><details class="notion-toggle notion-block-70094f57dbad40afba2469459abe4c24"><summary><h4 class="notion-h notion-h3 notion-block-70094f57dbad40afba2469459abe4c24" data-id="70094f57dbad40afba2469459abe4c24"><span><div id="70094f57dbad40afba2469459abe4c24" class="notion-header-anchor"></div><span class="notion-h-title">time.c</span></span></h4></summary><div><div class="notion-text notion-block-022b6016e221427bba2eb8c7434a6d84">#include &quot;stm32f1xx_hal.h&quot;</div><div class="notion-text notion-block-2bf34bf1de37404198e9c3eb0a8ba781">#include &quot;time.h&quot;</div><div class="notion-text notion-block-81129f555894468586cb4ca61151c348">TIM_HandleTypeDef tim1; //（高级）定时器1总控结构体</div><div class="notion-text notion-block-ce779a2cdb894b4fb9def9e4e61c1d69">TIM_HandleTypeDef tim2; </div><div class="notion-text notion-block-19d9d30ee4584a99a1e81fad07cead91">TIM_HandleTypeDef tim3; </div><div class="notion-text notion-block-b5f815dd753241b5b203960719a4cc2d">TIM_HandleTypeDef tim4; </div><div class="notion-text notion-block-5109971873ad47bf98714cf6c9d17aef">//定时器 1</div></div></details><div class="notion-text notion-block-a6aea5fb69bb4acb9e6fb2862b743bd3">void Timer1_Init(uint16_t arr, uint16_t psc, uint8_t rep)</div><div class="notion-text notion-block-0aabe2069a0e442c8c6b810176203439">{</div><div class="notion-text notion-block-765dfe693e7140a495e13bab87677a20">tim1.Instance = TIM1;                                        // 实例</div><div class="notion-text notion-block-7d634c20598b44ba81fd2e6e7642e226">tim1.Init.Period = arr;                                      // 重装载值</div><div class="notion-text notion-block-a6ea6d8509404b589e56b8f2a459ba98">tim1.Init.Prescaler = psc;                                   // 分频系数</div><div class="notion-text notion-block-4bb09941a8d84350939320f3c794cf12">tim1.Init.CounterMode = TIM_COUNTERMODE_UP;                  // 计数模式</div><div class="notion-text notion-block-2a7b216236364d779c88799e7db2e47e">tim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;            // 分频因子</div><div class="notion-text notion-block-f102a0c9b2094a78b5f7aaa9da2a82ff">tim1.Init.RepetitionCounter = rep;                           // 重复计数值</div><div class="notion-text notion-block-e8009d1be1234c8fa9458c62a79a8cfc">tim1.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;// 自动重装载值 预装载使能位（影子寄存器）</div><div class="notion-text notion-block-3180620e525e45dbbb99eebcd1b784f1">HAL_TIM_Base_Init(&amp;tim1);                       //初始化定时器</div><div class="notion-text notion-block-54517d0638a64b93935065c1649c68c9">__HAL_TIM_CLEAR_FLAG(&amp;tim1, TIM_FLAG_UPDATE);   //手动清除更新事件</div><div class="notion-text notion-block-8840eea641cd41b4a2b56beaa4cfd3ae">HAL_TIM_Base_Start(&amp;tim1);                      //打开定时器（轮询方式）</div><div class="notion-text notion-block-ce0f1f2e61d44ac6b06ca10b19995ee8">}</div><div class="notion-text notion-block-8096faadcafa44af881c105f62f69dd0">//定时器 2</div><div class="notion-text notion-block-cebf02e9ede74945a4bb56daba97bf5c">void Timer2_Init(uint16_t arr, uint16_t psc)</div><div class="notion-text notion-block-2a6da44df8d44158b2fff280c9940f16">{</div><div class="notion-text notion-block-7f96f646e2eb42c7a13e4e9e3ba02fbb">tim2.Instance = TIM2;</div><div class="notion-text notion-block-368f51b6098c470a9c02af345881b862">tim2.Init.Period = arr; </div><div class="notion-text notion-block-a2040dda209543879f98e815c00dd849">tim2.Init.Prescaler = psc;</div><div class="notion-text notion-block-8dcb3cddcd3a42029393b2ae7f7f08b4">tim2.Init.CounterMode = TIM_COUNTERMODE_UP;</div><div class="notion-text notion-block-4dd101a751d04467b99dd34bcfb1d4c1">tim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;</div></div></details><div class="notion-text notion-block-77df66275a1946d9947cda3063c2fe40">tim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;</div><div class="notion-text notion-block-6ae08c2cbe4845b88f19b5eac6096f9c">HAL_TIM_Base_Init(&amp;tim2);   //初始化定时器</div><div class="notion-text notion-block-e779faeac7fc488ebaa4e7c94352c1f4">__HAL_TIM_CLEAR_FLAG(&amp;tim2, TIM_FLAG_UPDATE);</div><div class="notion-text notion-block-94847e2ae65742b3b0a8fa94445a26ab">HAL_TIM_Base_Start(&amp;tim2);  //打开定时器（轮询方式）</div><div class="notion-text notion-block-5bb1fff5ff654214ab762d569e4de5dc">}</div><div class="notion-text notion-block-cb67c2342ec340658c4048a328517174">//定时器 3</div><div class="notion-text notion-block-a5a92dfdb8a445eeafc7b130c21305c7">void Timer3_Init(uint16_t arr, uint16_t psc)</div><div class="notion-text notion-block-a00aaa7d477740979396a5d76116913b">{</div><div class="notion-text notion-block-4fea8b3896674ff2997bbd8868a51371">tim3.Instance = TIM3;</div><div class="notion-text notion-block-3f4e953b03fa4fd989b13137c755688c">tim3.Init.Period = arr;</div><div class="notion-text notion-block-3e311ddb5b3a48858d4d272c9139f1ca">tim3.Init.Prescaler = psc;</div><div class="notion-text notion-block-672b93934be94858be3a27867f4a5154">tim3.Init.CounterMode = TIM_COUNTERMODE_UP;</div><div class="notion-text notion-block-41a2d9bf5ae545a8a2f1fcd6779854b1">tim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;</div><div class="notion-text notion-block-5a44c8a212ae4569a0bc28c7a96b1335">tim3.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;</div><div class="notion-text notion-block-f5acd12d7ea6459fbcfe834f79644d07">HAL_TIM_Base_Init(&amp;tim3); </div><div class="notion-text notion-block-d97a4334f0ad482fb13b7f3b30755cae">__HAL_TIM_CLEAR_FLAG(&amp;tim3, TIM_FLAG_UPDATE);</div><div class="notion-text notion-block-ff3940b8ad5e4175bb5b7bf0f16efc94">HAL_TIM_Base_Start(&amp;tim3);</div><div class="notion-text notion-block-7a754e2e2b434bd5a73f82cedab19f94">}</div><div class="notion-text notion-block-7d3669c17bf4452590613d6f62c85ec4">//定时器 4</div><div class="notion-text notion-block-f6943ddfc3e24a9b83fdcda6b197cb04">void Timer4_Init(uint16_t arr, uint16_t psc)</div><div class="notion-text notion-block-c2281663eabd4e11aad51f218ca8a55f">{</div><div class="notion-text notion-block-c3c43526279049b293056364aa0f1baf">tim4.Instance = TIM4;</div><div class="notion-text notion-block-742eea2f60bf41cfa635a857ebeb0ac1">tim4.Init.Period = arr;</div><div class="notion-text notion-block-32d4bcfb84f949efa7e11b71dfa7fb35">tim4.Init.Prescaler = psc;</div><div class="notion-text notion-block-663af832bec1480994a274dfa341c83b">tim4.Init.CounterMode = TIM_COUNTERMODE_UP;</div><div class="notion-text notion-block-3d0b037f71e147b58496840bcb02f126">tim4.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;</div><div class="notion-text notion-block-c99215342f1e474f8a878663ae9a104b">tim4.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;</div><div class="notion-text notion-block-8ff97b328e1f4793b4547ed85537f70f">HAL_TIM_Base_Init(&amp;tim4);</div><div class="notion-text notion-block-b3e110daf6fc47849cd33279ba01cea0">__HAL_TIM_CLEAR_FLAG(&amp;tim4, TIM_FLAG_UPDATE);</div><div class="notion-text notion-block-ef939b80830842519576309c3d64bfeb">HAL_TIM_Base_Start(&amp;tim4);</div><div class="notion-text notion-block-7160c7c2139b449b9959a7d7f162ed5f">}</div><div class="notion-text notion-block-02cf7a6409d3488aad6236bf707fb644">//定时器 硬件初始化回调函数</div><div class="notion-text notion-block-2e0022bfccfa4e5eadd37b013e93f682">void HAL_TIM_Base_MspInit(TIM_HandleTypeDef *htim)</div><div class="notion-text notion-block-aa12339be35d43a8804679b26b47e51b">{</div><div class="notion-text notion-block-b78d59204069421aad5c75948aed69bf">if(htim-&gt;Instance == TIM1){<div class="notion-text-children"><div class="notion-text notion-block-9557e8667bfd4b409e4bfadc2334cdf2">__HAL_RCC_TIM1_CLK_ENABLE();</div></div></div><div class="notion-text notion-block-82191e8fb74a4dfa9d426bf41a716287">}else if(htim-&gt;Instance == TIM2){<div class="notion-text-children"><div class="notion-text notion-block-4092a374d6914ef191de89c89e787038">__HAL_RCC_TIM2_CLK_ENABLE();</div></div></div><div class="notion-text notion-block-1dcbee12d59a46459e6334d9dc535786">}else if(htim-&gt;Instance == TIM3){<div class="notion-text-children"><div class="notion-text notion-block-3bf27cfd89f14d84872ae005e0977f27">__HAL_RCC_TIM3_CLK_ENABLE();</div></div></div><div class="notion-text notion-block-15ff34b53ddc49c08f550f15084cf4bd">}else if(htim-&gt;Instance == TIM4){<div class="notion-text-children"><div class="notion-text notion-block-d638608845fb4b42be9eebfecf118052">__HAL_RCC_TIM4_CLK_ENABLE();</div></div></div><div class="notion-text notion-block-cdf317f6f1934a3199381b0be5ff9813">}</div><div class="notion-text notion-block-b71a895500f145d2a06d71115f1a2c7e">}</div><div class="notion-text notion-block-bb1ec56c208b46ffa085d90f5eb6c7bc">//定时器 De回调函数</div><div class="notion-text notion-block-f0cbbf9fc4ce4032829fe155a8f1115b">void HAL_TIM_Base_MspDeInit(TIM_HandleTypeDef *htim)</div><div class="notion-text notion-block-c5cf31e64a1c446287c612bc64017fed">{</div><div class="notion-text notion-block-876a8bd623e2413590c28223e3f66412">if(htim-&gt;Instance == TIM1){<div class="notion-text-children"><div class="notion-text notion-block-de772d067a5449f9997d74247c30a583">__HAL_RCC_TIM1_CLK_DISABLE();</div></div></div><div class="notion-text notion-block-5df47933cd0145c4936dacae4a404868">}else if(htim-&gt;Instance == TIM2){<div class="notion-text-children"><div class="notion-text notion-block-8715ccf510df403fa8dff36f21839b9b">__HAL_RCC_TIM1_CLK_DISABLE();</div></div></div><div class="notion-text notion-block-9079fcc4312a4ac48e37153a1269499f">}else if(htim-&gt;Instance == TIM3){<div class="notion-text-children"><div class="notion-text notion-block-19f7dff314534778b82d2de7aa476f97">__HAL_RCC_TIM1_CLK_DISABLE();</div></div></div><div class="notion-text notion-block-03396966a6134209b809845b83b19af0">}else if(htim-&gt;Instance == TIM4){<div class="notion-text-children"><div class="notion-text notion-block-8625fa23c0084355898b3388b3af0f6a">__HAL_RCC_TIM1_CLK_DISABLE();</div></div></div><div class="notion-text notion-block-c84a1be0755946878189b4b0159e1964">}</div><div class="notion-text notion-block-d6cebfcac19f410f9d3965cea46ce454">}<div class="notion-text-children"><details class="notion-toggle notion-block-51a91ec33a44457a86e7e6da748d2a32"><summary><h4 class="notion-h notion-h3 notion-block-51a91ec33a44457a86e7e6da748d2a32" data-id="51a91ec33a44457a86e7e6da748d2a32"><span><div id="51a91ec33a44457a86e7e6da748d2a32" class="notion-header-anchor"></div><span class="notion-h-title">time.h</span></span></h4></summary><div><div class="notion-text notion-block-17f3014ef37a454396e2f5ffeedb960c">#ifndef __TIME_H</div><div class="notion-text notion-block-7fc0ee88fc634f589950b9bf53e7159b">#define __TIME_H</div><div class="notion-text notion-block-74ec6a0e75a740b5819af21a8251bc97">/<em> 对外声明总控结构体 </em>/</div><div class="notion-text notion-block-a0f514cd206b41c8ba19f4ef391f0bd6">extern TIM_HandleTypeDef tim1;</div><div class="notion-text notion-block-a3b1c70d3cd548fbac63dda56dd52f46">extern TIM_HandleTypeDef tim2;</div><div class="notion-text notion-block-af2e98f8591e45ef85d7ae117f9d8e10">extern TIM_HandleTypeDef tim3;</div><div class="notion-text notion-block-19120eef883148bd827e1f6d5d46455d">extern TIM_HandleTypeDef tim4;</div><div class="notion-text notion-block-f5a8926816164f7bb213e096e13cae2e">/<em> 初始化函数 </em>/<div class="notion-text-children"></div></div></div></details><details class="notion-toggle notion-block-ab8c8b35095544e8957e3d6f75805324"><summary><h4 class="notion-h notion-h3 notion-block-ab8c8b35095544e8957e3d6f75805324" data-id="ab8c8b35095544e8957e3d6f75805324"><span><div id="ab8c8b35095544e8957e3d6f75805324" class="notion-header-anchor"></div><span class="notion-h-title">main.c</span></span></h4></summary><div><div class="notion-text notion-block-d38a068744654de085be5fb72134579e">#include &quot;stm32f1xx_hal.h&quot;</div><div class="notion-text notion-block-4d9f74e6bd1e4dd19cea24bcc8dbbc6e">#include &quot;rcc.h&quot;</div><div class="notion-text notion-block-f29e9bb13a7843d3b1bff109470340dd">#include &quot;led.h&quot;</div><div class="notion-text notion-block-3512139086994c9abe3ab32e0e935c93">#include &quot;sw.h&quot;</div><div class="notion-text notion-block-07d5c21969cc4f78a2fe8b306e094012">#include &quot;uart.h&quot;</div><div class="notion-text notion-block-212ee0b05014424c94226b4617dd564b">#include &quot;time.h&quot;</div><div class="notion-text notion-block-e3681b58a36d499585737db8c1a1c4f3">int main(void){<div class="notion-text-children"><div class="notion-text notion-block-083405d87fae432aba4e93bfddda9c16">HAL_Init();</div><div class="notion-text notion-block-40bdce93fabf4933843af4dbe0a1cc6c">RccClock_Init();</div><div class="notion-text notion-block-cebd7a7d5c1c4911b0e197fb9d8c41ac">U1_Init(921600);</div><div class="notion-text notion-block-3f459095262c49fcb4021c5d6d2f3135">Timer1_Init(20000 - 1, 3600 - 1, 4 - 1);   // 72000000/3600/20000 = 1   *   4  =  4s</div><div class="notion-text notion-block-3286da3e949142bca717c474d49a095b">Timer2_Init(30000 - 1, 7200 - 1);   // 3s</div><div class="notion-text notion-block-ccc51181ef434bb28a8aa0383f6354c3">Timer3_Init(20000 - 1, 7200 - 1);   // 2s</div><div class="notion-text notion-block-c6f4f7429c834b49baf3df0087c18037">Timer4_Init(10000 - 1, 7200 - 1);   // 1s</div><div class="notion-text notion-block-6e07af246c634271b7c91ff891342998">uint16_t time1 = 1;</div><div class="notion-text notion-block-5f5d71aae14b4e2380ae8c99cb2b3351">uint16_t time2 = 1;</div><div class="notion-text notion-block-15bc989b6c70471582f5fd88d50349fc">uint16_t time3 = 1;</div><div class="notion-text notion-block-df7b5981cde945398fa37a3778eeaa12">uint16_t time4 = 1;</div><div class="notion-text notion-block-508a6ebc221b416591e4306e9605575c">while(1){<div class="notion-text-children"><div class="notion-text notion-block-463a394a63014880a1b56c4c57c86dfd">/<em> 获取更新标志位 </em>/</div><div class="notion-text notion-block-49aed75283284930ad97766d71e6946b">if(__HAL_TIM_GET_FLAG(&amp;tim1, TIM_FLAG_UPDATE)){<div class="notion-text-children"><div class="notion-text notion-block-dd2fc94fd68b4d4b9924167a20c67fa9">__HAL_TIM_CLEAR_FLAG(&amp;tim1, TIM_FLAG_UPDATE);   ///清除标志位</div><div class="notion-text notion-block-2160b530dd9440069d9df103fcf0cb99">U1_Printf(&quot;定时器 1 定时时间:%drn&quot;,time1++);</div><div class="notion-text notion-block-105ecff5287c408b9cbf8fb2063c7cf7">if(time1 &gt; 5){<div class="notion-text-children"><div class="notion-text notion-block-fad665f0a7314ac48afc3509275ca761">U1_Printf(&quot;定时器 1 关闭rn&quot;); </div><div class="notion-text notion-block-94c9c87edaf64d119259c11a4396dfd6">HAL_TIM_Base_Stop(&amp;tim1);       //停止定时器</div><div class="notion-text notion-block-cef60aea91ca4789a433496c55a26336">HAL_TIM_Base_DeInit(&amp;tim1);     //释放</div></div></div><div class="notion-text notion-block-2d3105f928754734b1c76d89cf0fc17b">}</div></div></div><div class="notion-text notion-block-728d24f0564b476ab9df303ef932dd32">}</div><div class="notion-text notion-block-5d6a47bc6d2e49f8814cc8badc829a80">if(__HAL_TIM_GET_FLAG(&amp;tim2, TIM_FLAG_UPDATE)){<div class="notion-text-children"><div class="notion-text notion-block-703ec621bdc9407a9804f16513f4b6da">__HAL_TIM_CLEAR_FLAG(&amp;tim2, TIM_FLAG_UPDATE);</div><div class="notion-text notion-block-aeebdf8b08384c759462451c7b2d2098">U1_Printf(&quot;定时器 2 定时时间:%drn&quot;,time2++);</div></div></div><div class="notion-text notion-block-10935c2eda7d4baea4150e0a1ab01e11">}</div><div class="notion-text notion-block-6ee74550826b441788294cf73e5696bf">if(__HAL_TIM_GET_FLAG(&amp;tim3, TIM_FLAG_UPDATE)){<div class="notion-text-children"><div class="notion-text notion-block-4dc1383cbc5a4fa09865419b1ec292f2">__HAL_TIM_CLEAR_FLAG(&amp;tim3, TIM_FLAG_UPDATE);</div><div class="notion-text notion-block-de59c36790554a5c83affb437c560064">U1_Printf(&quot;定时器 3 定时时间:%drn&quot;,time3++);</div></div></div><div class="notion-text notion-block-99a98a7ca594429b88c03c3f3baa879f">}</div><div class="notion-text notion-block-0a274002021a49508ace220d98619cd5">if(__HAL_TIM_GET_FLAG(&amp;tim4, TIM_FLAG_UPDATE)){<div class="notion-text-children"><div class="notion-text notion-block-6041621dd0534d00b22dd0cdbfbc3b24">__HAL_TIM_CLEAR_FLAG(&amp;tim4, TIM_FLAG_UPDATE);</div><div class="notion-text notion-block-b8e6006c6df94bea84559d89a3259138">U1_Printf(&quot;定时器 4 定时时间:%drn&quot;,time4++);</div></div></div><div class="notion-text notion-block-6e0ea513a9c64c8f82d85462fd527c89">}</div></div></div><div class="notion-text notion-block-ec972d629f2a4828965e3fdfea16a7d8">}</div></div></div><div class="notion-text notion-block-bf17a3415c954c66bf31b297159be800">}</div></div></details></div></div></div></details><details class="notion-toggle notion-block-3ccaf19968bd44168d72a3a5bfa87cdb"><summary><h3 class="notion-h notion-h2 notion-h-indent-1 notion-block-3ccaf19968bd44168d72a3a5bfa87cdb" data-id="3ccaf19968bd44168d72a3a5bfa87cdb"><span><div id="3ccaf19968bd44168d72a3a5bfa87cdb" class="notion-header-anchor"></div><span class="notion-h-title">三、解释：定时器初始化后 立刻产生的更新事件 是哪里来的</span></span></h3></summary><div><details class="notion-toggle notion-block-55f474e17beb40209181e0a2c3f0f0b3"><summary><h4 class="notion-h notion-h3 notion-block-55f474e17beb40209181e0a2c3f0f0b3" data-id="55f474e17beb40209181e0a2c3f0f0b3"><span><div id="55f474e17beb40209181e0a2c3f0f0b3" class="notion-header-anchor"></div><span class="notion-h-title"><b>哪里来的更新事件：</b></span></span></h4></summary><div><div class="notion-text notion-block-45aaabff07da4ab78e14f9947bf80e0a">来源于<code class="notion-inline-code">HAL_TIM_Base_Init(&amp;tim1);  </code>初始化定时器基础配置函数中 <code class="notion-inline-code">TIM_Base_SetConfig</code> 函数中的最后一行：<code class="notion-inline-code"> TIMx-&gt;EGR = TIM_EGR_UG;</code>  这里HAL库人为的 更新了一下EGR寄存器的Ug位，也就是事件产生寄存器为1。</div></div></details><details class="notion-toggle notion-block-c28b6819e8f94dfd8aa86a8e1a4045d6"><summary><h4 class="notion-h notion-h3 notion-block-c28b6819e8f94dfd8aa86a8e1a4045d6" data-id="c28b6819e8f94dfd8aa86a8e1a4045d6"><span><div id="c28b6819e8f94dfd8aa86a8e1a4045d6" class="notion-header-anchor"></div><span class="notion-h-title"><b>为什么要在初始化的时候更新一下事件：</b></span></span></h4></summary><div><div class="notion-text notion-block-3f2336755e5b454c83d8e11999eebb08">原因是因为 定时器中的  PSC 和重复计数器Rep（这个是高级定时器才有）</div><div class="notion-text notion-block-80965c678076478c8b57583d107ce206"><b>只有在一次更新事件之后才会彻底写入（影子寄存器） </b></div><div class="notion-text notion-block-b362c19f8dc944be84c9ed2e8b70e02f">ARR虽然也有影子寄存器。但是他不管是在关闭还是开启的状态下，只要设置就能直接转正（写入）。</div></div></details><details class="notion-toggle notion-block-85110ec434ed419db614b382ca0922c9"><summary><h4 class="notion-h notion-h3 notion-block-85110ec434ed419db614b382ca0922c9" data-id="85110ec434ed419db614b382ca0922c9"><span><div id="85110ec434ed419db614b382ca0922c9" class="notion-header-anchor"></div><span class="notion-h-title">如何避免复位后直接产生更新事件?</span></span></h4></summary><div><div class="notion-text notion-block-39f7cec63d334a8abe6542fa36bee98f">在Start之前，手动清除UIF位</div></div></details></div></details><details class="notion-toggle notion-block-5e9343e1bb15458e954b0fd6b549d9e9"><summary><h3 class="notion-h notion-h2 notion-h-indent-1 notion-block-5e9343e1bb15458e954b0fd6b549d9e9" data-id="5e9343e1bb15458e954b0fd6b549d9e9"><span><div id="5e9343e1bb15458e954b0fd6b549d9e9" class="notion-header-anchor"></div><span class="notion-h-title">四、HAL库：TIM1234中断方式 基础定时</span></span></h3></summary><div><div class="notion-text notion-block-332a36ba7676441c9b45de0cd2a36875">在轮询基础上，配置和开启了中断。</div><div class="notion-text notion-block-11d19e4be8ff41c3a28b4baf09097265">这里需要大概知道 需要定义 定时器的<b>更新回调函数</b></div><div class="notion-text notion-block-70bb7a08558c49bf9da6843f73b7174b"><code class="notion-inline-code">void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)</code></div><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-d286d9d5015c4222bb82edca33799420"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:100%;max-width:100%;flex-direction:column"><img style="object-fit:cover" src="https://cdn.jsdmirror.com/gh/LZJ-I/picx-images-hosting@main/images/%E5%B5%8C%E5%85%A5%E5%BC%8F%E8%BD%AF%E4%BB%B6%E5%BC%80%E5%8F%91/Post-stm32-hal/b9c17138-1371-40fe-a018-ccc41977117b-image.webp?spaceId=3a565fcb-f425-4846-b72a-d32a98183896&amp;t=d286d9d5-015c-4222-bb82-edca33799420" alt="notion image" loading="lazy" decoding="async"/></div></figure><div class="notion-text notion-block-73cd7b2302be4a4089d9775d0dc38467">注意开启定时器使用挂it方式的就ok ..</div><div class="notion-text notion-block-2bb589d9288b4f0eaa63f66b6e1cf8e9">然后在对应的中断函数中处理就ok</div><details class="notion-toggle notion-block-776558746e254871b0d7b6a16557926d"><summary><h4 class="notion-h notion-h3 notion-block-776558746e254871b0d7b6a16557926d" data-id="776558746e254871b0d7b6a16557926d"><span><div id="776558746e254871b0d7b6a16557926d" class="notion-header-anchor"></div><span class="notion-h-title">程序</span></span></h4></summary><div><div class="notion-text notion-block-aaf04adcc5164396bcd301101c27707d">time.c</div></div></details></div></details><details class="notion-toggle notion-block-45ebebf14f79403e8519f7ff1484dd55"><summary><h3 class="notion-h notion-h2 notion-h-indent-1 notion-block-45ebebf14f79403e8519f7ff1484dd55" data-id="45ebebf14f79403e8519f7ff1484dd55"><span><div id="45ebebf14f79403e8519f7ff1484dd55" class="notion-header-anchor"></div><span class="notion-h-title">五、HAL库：TIM1234 DMA单次方式 改变定时时间</span></span></h3></summary><div><details class="notion-toggle notion-block-8896bd02538c48ac985dd6fcc2c8966c"><summary><h4 class="notion-h notion-h3 notion-block-8896bd02538c48ac985dd6fcc2c8966c" data-id="8896bd02538c48ac985dd6fcc2c8966c"><span><div id="8896bd02538c48ac985dd6fcc2c8966c" class="notion-header-anchor"></div><span class="notion-h-title">1. 如何做到改变定时时间</span></span></h4></summary><div><div class="notion-text notion-block-f229862142bc43b4a0cf10b157183d84">更新DMA事件可以改变ARR重载值，从而改变基础定时时间</div></div></details><details class="notion-toggle notion-block-38d1bd8963e749f79cc3c37ac7d7535d"><summary><h4 class="notion-h notion-h3 notion-block-38d1bd8963e749f79cc3c37ac7d7535d" data-id="38d1bd8963e749f79cc3c37ac7d7535d"><span><div id="38d1bd8963e749f79cc3c37ac7d7535d" class="notion-header-anchor"></div><span class="notion-h-title">2. 实验现象</span></span></h4></summary><div><div class="notion-text notion-block-d46dd88e23844a3d9418b54315200441">DMA单次方式，<b>传输4次数据，改变定时时间：第一次定时1s，第二次定时2s，第三次定时3s，第四次定时4s第五次定时5s，然后以后一直都是5s</b></div></div></details><details class="notion-toggle notion-block-e254dec72d894652a14e34a593ecada0"><summary><h4 class="notion-h notion-h3 notion-block-e254dec72d894652a14e34a593ecada0" data-id="e254dec72d894652a14e34a593ecada0"><span><div id="e254dec72d894652a14e34a593ecada0" class="notion-header-anchor"></div><span class="notion-h-title">3. 注意</span></span></h4></summary><div><ol start="1" class="notion-list notion-list-numbered notion-block-fa0c1d18d5e34d17b066b3a4efcb4788" style="list-style-type:decimal"><li><b>DMA有半完成回调 和 完成回调</b></li><ol class="notion-list notion-list-numbered notion-block-fa0c1d18d5e34d17b066b3a4efcb4788" style="list-style-type:lower-alpha"><ul class="notion-list notion-list-disc notion-block-75b69ce6d1ca4f98b1ef3a3832614da2"><li><b>其中完成回调，和定时器更新回调的函数是一个函数</b></li></ul><ul class="notion-list notion-list-disc notion-block-b93ebd86b05f49ed8c2cdd21d0d23ef2"><li><b>所以，如果要使用更新中断和DMA完成中断，则需要判断一下。</b></li><ul class="notion-list notion-list-disc notion-block-b93ebd86b05f49ed8c2cdd21d0d23ef2"><li><b>方法：通过判断DMA的状态，如果为Busy，则说明是更新中断进入的  定时器更新回调函数</b></li></ul></ul></ol></ol><ol start="2" class="notion-list notion-list-numbered notion-block-56d1f6c1ceba476e9944d11698139310" style="list-style-type:decimal"><li><b>DMA方式的定时器并不会开启更新中断，所以要手动打开更新中断</b></li></ol><ol start="3" class="notion-list notion-list-numbered notion-block-d789f3c9cd184c0e90928e9e0f2f5ecf" style="list-style-type:decimal"><li>DMA使用数 要注意通道的重复使用。避免重复。</li></ol><ol start="4" class="notion-list notion-list-numbered notion-block-cd556b59977c4b458d67b0fcb48ef97c" style="list-style-type:decimal"><li>LinkDMA时，第二个参数的  外设句柄内的一个DMA句柄指针（可以理解为通道绑定），可以在这里直接看到他的所有成员。在用时，可以这样用</li><ol class="notion-list notion-list-numbered notion-block-cd556b59977c4b458d67b0fcb48ef97c" style="list-style-type:lower-alpha"><ul class="notion-list notion-list-disc notion-block-1b311946a6d14a2d8fc30029b4ff70b8"><li><code class="notion-inline-code">__HAL_LINKDMA(&amp;tim1, </code><code class="notion-inline-code"><b>hdma[TIM_DMA_ID_UPDATE]</b></code><code class="notion-inline-code">, &amp;tim1_dmaup);</code></li></ul><ul class="notion-list notion-list-disc notion-block-e7898ef4b5e1406dac4794f0b1972f11"><li>/<em> 判断DMA是否为Ready状态，如果是则是DMA完成中断进入的回调函数 </em>/
<code class="notion-inline-code">if(htim-&gt;hdma[TIM_DMA_ID_UPDATE]-&gt;State  == HAL_DMA_STATE_READY){</code></li></ul><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-40acb0dd8492410e8563765c55acb116"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:100%;max-width:100%;flex-direction:column"><img style="object-fit:cover" src="https://cdn.jsdmirror.com/gh/LZJ-I/picx-images-hosting@main/images/%E5%B5%8C%E5%85%A5%E5%BC%8F%E8%BD%AF%E4%BB%B6%E5%BC%80%E5%8F%91/Post-stm32-hal/fdca19c6-02f6-4e1f-8bb5-6d38f069b404-image.webp?spaceId=3a565fcb-f425-4846-b72a-d32a98183896&amp;t=40acb0dd-8492-410e-8563-765c55acb116" alt="notion image" loading="lazy" decoding="async"/></div></figure><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-45c7935cc91d4d4cb217fdc2e2118e16"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:100%;max-width:100%;flex-direction:column"><img style="object-fit:cover" src="https://cdn.jsdmirror.com/gh/LZJ-I/picx-images-hosting@main/images/%E5%B5%8C%E5%85%A5%E5%BC%8F%E8%BD%AF%E4%BB%B6%E5%BC%80%E5%8F%91/Post-stm32-hal/d9f7977d-0328-486c-9bc0-1c407100cddd-image.webp?spaceId=3a565fcb-f425-4846-b72a-d32a98183896&amp;t=45c7935c-c91d-4d4c-b217-fdc2e2118e16" alt="notion image" loading="lazy" decoding="async"/></div></figure></ol></ol><ol start="5" class="notion-list notion-list-numbered notion-block-82b02acaa9c44bbcb9518c4fb31cafb8" style="list-style-type:decimal"><li>DMA在Link TIM和DMA的某通道之后，可以直接在TIM中找到通道的配置总控结构体</li></ol></div></details><details class="notion-toggle notion-block-7ab7f2d7ff654263b98343cc1e49b7ce"><summary><h4 class="notion-h notion-h3 notion-block-7ab7f2d7ff654263b98343cc1e49b7ce" data-id="7ab7f2d7ff654263b98343cc1e49b7ce"><span><div id="7ab7f2d7ff654263b98343cc1e49b7ce" class="notion-header-anchor"></div><span class="notion-h-title">4. 相关函数</span></span></h4></summary><div><ul class="notion-list notion-list-disc notion-block-b29e5ab31a1b407bbfd4a3dd343ccdc2"><li><code class="notion-inline-code">TIM_HandleTypeDef</code> 定时器总控结构体</li></ul><ul class="notion-list notion-list-disc notion-block-2c784a1be252457cb4ba7dd8ae57dbf9"><li><code class="notion-inline-code">DMA_HandleTypeDef</code> DMA总控结构体</li></ul><ul class="notion-list notion-list-disc notion-block-9cb0f4f2a3324049b265e98ce8bc082e"><li><code class="notion-inline-code">__HAL_TIM_CLEAR_FLAG</code><b> </b>清除标志位</li></ul><ul class="notion-list notion-list-disc notion-block-a69256a9f7154a41950a54c90a610ab1"><li><code class="notion-inline-code">__HAL_TIM_ENABLE_IT</code> 使能中断</li></ul><ul class="notion-list notion-list-disc notion-block-e6a2d14c48f349159138cc782bd0eea2"><li><code class="notion-inline-code">HAL_TIM_Base_Start_DMA</code> DMA方式启动定时器</li></ul><ul class="notion-list notion-list-disc notion-block-9200468a9c5a4fc8b4c1e9696886c880"><li><code class="notion-inline-code">__HAL_LINKDMA</code> DMA LINK</li></ul></div></details><details class="notion-toggle notion-block-7f8f2aa41ace47ebaa51d3cd3efc4c39"><summary><h4 class="notion-h notion-h3 notion-block-7f8f2aa41ace47ebaa51d3cd3efc4c39" data-id="7f8f2aa41ace47ebaa51d3cd3efc4c39"><span><div id="7f8f2aa41ace47ebaa51d3cd3efc4c39" class="notion-header-anchor"></div><span class="notion-h-title">4. 程序</span></span></h4></summary><div><details class="notion-toggle notion-block-2e28d74ef02543738dcbee5acf98fbb6"><summary><h4 class="notion-h notion-h3 notion-block-2e28d74ef02543738dcbee5acf98fbb6" data-id="2e28d74ef02543738dcbee5acf98fbb6"><span><div id="2e28d74ef02543738dcbee5acf98fbb6" class="notion-header-anchor"></div><span class="notion-h-title">time.c</span></span></h4></summary><div><div class="notion-text notion-block-13eeea91cc0f4d59a8bd9225a582c868">#include &quot;stm32f1xx_hal.h&quot;</div><div class="notion-text notion-block-b854b05629dd4efa854d8d63ce1f17ae">#include &quot;time.h&quot;</div><div class="notion-text notion-block-065f5b152bd64fcc9d4ac1c680c03088">TIM_HandleTypeDef tim1; //（高级）定时器1总控结构体</div></div></details></div></details><div class="notion-text notion-block-0655f5c14dd54527981a4c93edb2a2e8">TIM_HandleTypeDef tim2; </div><div class="notion-text notion-block-db8b0fc319d8462aa7d108fa79fc8009">TIM_HandleTypeDef tim3; </div><div class="notion-text notion-block-6edcb6a1beab4f828e3056b48c4d134d">TIM_HandleTypeDef tim4; </div><div class="notion-text notion-block-21faeb7a9b344be89cd4a88d9db730b2">DMA_HandleTypeDef tim1_dmaup;</div><div class="notion-text notion-block-4dae68cf04274513a25d22058f5e9e15">DMA_HandleTypeDef tim2_dmaup;</div><div class="notion-text notion-block-303304204e504857b9f60edb48a4a188">DMA_HandleTypeDef tim3_dmaup;</div><div class="notion-text notion-block-00ee2b69ea5f45ababf85fc504b94f12">DMA_HandleTypeDef tim4_dmaup;</div><div class="notion-text notion-block-285ba5ab65304d679cb98db3ef0b890e">uint16_t tim1_dmaBuff[4] = {20000, 30000, 40000, 50000};</div><div class="notion-text notion-block-d7c7ce88af36444ebc0718534a849eec">uint16_t tim2_dmaBuff[4] = {20000, 30000, 40000, 50000};</div><div class="notion-text notion-block-1aaa6c40bcdd42cca34d0e073f5c7745">uint16_t tim3_dmaBuff[4] = {20000, 30000, 40000, 50000};</div><div class="notion-text notion-block-79348e2381c74d19a7caed80c66d50b4">uint16_t tim4_dmaBuff[4] = {20000, 30000, 40000, 50000};</div><div class="notion-text notion-block-fc2783067ed34e32910946f62ed0c8de">//定时器 1</div><div class="notion-text notion-block-2f62b0880c9b4af9a503ebb86cd230e8">void Timer1_Init(uint16_t arr, uint16_t psc, uint8_t rep)</div><div class="notion-text notion-block-0f2a18b463bf43ff9b7a6b180c902e19">{</div><div class="notion-text notion-block-3a94db9919c6474fa1482f4a92e5b689">tim1.Instance = TIM1;                                        // 实例</div><div class="notion-text notion-block-34a40c93c51440e8b9e97db8722bc662">tim1.Init.Period = arr;                                      // 重装载值</div><div class="notion-text notion-block-08e8837bb7784fdf9ebca6485c450ae9">tim1.Init.Prescaler = psc;                                   // 分频系数</div><div class="notion-text notion-block-59ff32c185894c9aa20fc6c684dca030">tim1.Init.CounterMode = TIM_COUNTERMODE_UP;                  // 计数模式</div><div class="notion-text notion-block-22b4fb75d0214fe8ac7bd755529f78d6">tim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;            // 分频因子</div><div class="notion-text notion-block-532ba6ca5a9144318a2a66c563b570f2">tim1.Init.RepetitionCounter = rep;                           // 重复计数值</div><div class="notion-text notion-block-3a003e5ba8914b9191bd976b08fce3c0">tim1.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;// 自动重装载值 预装载使能位（影子寄存器）</div><div class="notion-text notion-block-c6d550b4978e4edf940984ef7955c498">HAL_TIM_Base_Init(&amp;tim1);                       //初始化定时器</div><div class="notion-text notion-block-f7abdbd0bd58482f8338bdeedd4146b2">__HAL_TIM_CLEAR_FLAG(&amp;tim1, TIM_FLAG_UPDATE);   //手动 清除 定时器 更新事件</div><div class="notion-text notion-block-a4de91ae08314634904f66a5bb07bc78">__HAL_TIM_ENABLE_IT(&amp;tim1, TIM1_UP_IRQn);       //手动 使能 定时器 更新中断</div><div class="notion-text notion-block-50d506ffc7e84bae92c8c52f6dae00a9">HAL_TIM_Base_Start_DMA(&amp;tim1, (uint32_t*)tim1_dmaBuff, 4);   //打开定时器（DMA方式）</div><div class="notion-text notion-block-90cca89238a24571a17525cf6029829e">}</div><div class="notion-text notion-block-21a3961032e943408da54f326402aed2">//定时器 2</div><div class="notion-text notion-block-42a43cebe83a4b899b72d3ff8bf00c84">void Timer2_Init(uint16_t arr, uint16_t psc)</div><div class="notion-text notion-block-34315daf5bbb419da5d9104f3d3b7e2d">{</div><div class="notion-text notion-block-457308a49bde4570a331d7eb6df91b45">tim2.Instance = TIM2;</div><div class="notion-text notion-block-5802a7074bdd4b6eac8652b685a21d9e">tim2.Init.Period = arr; </div><div class="notion-text notion-block-294e7bf6c9934d558f75b4be8a7e7505">tim2.Init.Prescaler = psc;</div><div class="notion-text notion-block-e2f5123767bc480ebf2d8ecf5719ea72">tim2.Init.CounterMode = TIM_COUNTERMODE_UP;</div><div class="notion-text notion-block-9be0207339c04d92bbdca69a92468061">tim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;</div><div class="notion-text notion-block-8dee7c4541f2456096c2a70edec34325">tim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;</div><div class="notion-text notion-block-9c0e4d26aa6944768b3b6badae151784">HAL_TIM_Base_Init(&amp;tim2);</div><div class="notion-text notion-block-baad691e5c464fd19f80989c179676dd">__HAL_TIM_CLEAR_FLAG(&amp;tim2, TIM_FLAG_UPDATE);</div><div class="notion-text notion-block-4603a25560f044ab8553049d72a628f9">__HAL_TIM_ENABLE_IT(&amp;tim2, TIM1_UP_IRQn);</div><div class="notion-text notion-block-0dbc3d6db9ea4c9c8aed464d2f01151a">HAL_TIM_Base_Start_DMA(&amp;tim2, (uint32_t*)tim2_dmaBuff, 4);</div><div class="notion-text notion-block-c7550f1fdc2b4d53b9c4a5b49e2010b0">}</div><div class="notion-text notion-block-f65ff532562b4b54b59602d48c7c2944">//定时器 3</div><div class="notion-text notion-block-5bee3b3b642141de93e8ad1106e4bf38">void Timer3_Init(uint16_t arr, uint16_t psc)</div><div class="notion-text notion-block-fb8d29e3e6f3433f90993286b23e4b6d">{</div><div class="notion-text notion-block-ebad24cbdf354e119039deb27d73be0e">tim3.Instance = TIM3;</div><div class="notion-text notion-block-b0850e8c73364a59b34bbaf44d08dfe8">tim3.Init.Period = arr;</div><div class="notion-text notion-block-aa4044c42d91485c8a3ba1a13482f5c5">tim3.Init.Prescaler = psc;</div><div class="notion-text notion-block-4d37e1b9ff424f70a0b748b27584dfb8">tim3.Init.CounterMode = TIM_COUNTERMODE_UP;</div><div class="notion-text notion-block-ded03cfccb9d4b96be76c5e8fdd1c214">tim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;</div><div class="notion-text notion-block-a4213f4fccb4462697594f9079d4b925">tim3.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;</div><div class="notion-text notion-block-8feeeafe973a4377a04fc5778a86bde3">HAL_TIM_Base_Init(&amp;tim3); </div><div class="notion-text notion-block-a6e74ddcd8d14e2a886e2d713091f266">__HAL_TIM_CLEAR_FLAG(&amp;tim3, TIM_FLAG_UPDATE);</div><div class="notion-text notion-block-29c799c0986b4d648216a44db0f6c6df">__HAL_TIM_ENABLE_IT(&amp;tim3, TIM1_UP_IRQn);</div><div class="notion-text notion-block-588317fc23484179831979d4b4e315f0">HAL_TIM_Base_Start_DMA(&amp;tim3, (uint32_t*)tim3_dmaBuff, 4);</div><div class="notion-text notion-block-b0c453f7e50441f5bb2b20404fab0572">}</div><div class="notion-text notion-block-aac37a516a864c649f2a7f243fa6e7b7">//定时器 4</div><div class="notion-text notion-block-82c557567810452dbeeba8847bb198c9">void Timer4_Init(uint16_t arr, uint16_t psc)</div><div class="notion-text notion-block-8c0f102da45d4eb2ab153fb0da7edfc1">{</div><div class="notion-text notion-block-37f1b44b61634b78966542a9ab9506ea">tim4.Instance = TIM4;</div><div class="notion-text notion-block-70c3a6a484884cbe9266fae6992d8608">tim4.Init.Period = arr;</div><div class="notion-text notion-block-5d8ce37790da486baefcb7a220254d5b">tim4.Init.Prescaler = psc;</div><div class="notion-text notion-block-bfd875a4b68a45f9972871149c03398b">tim4.Init.CounterMode = TIM_COUNTERMODE_UP;</div><div class="notion-text notion-block-a1099c1cdb304639952ba79c0b732133">tim4.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;</div><div class="notion-text notion-block-203cdf63e3704a318c6afd49d2048034">tim4.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;</div><div class="notion-text notion-block-64ace5d0eef84d06a46848ac5f1897dc">HAL_TIM_Base_Init(&amp;tim4);</div><div class="notion-text notion-block-4acc658980084479a4f52f7acfb2f5bf">__HAL_TIM_CLEAR_FLAG(&amp;tim4, TIM_FLAG_UPDATE);</div><div class="notion-text notion-block-5fc52075bd714f9b87979b3eb340bb5a">__HAL_TIM_ENABLE_IT(&amp;tim4, TIM1_UP_IRQn);</div><div class="notion-text notion-block-94f501059b0a43af8de010ac1f6f9f6a">HAL_TIM_Base_Start_DMA(&amp;tim4, (uint32_t*)tim4_dmaBuff, 4);</div><div class="notion-text notion-block-03346eeefd5a43bfa13ad550667f72fc">}</div><div class="notion-text notion-block-c68866dab50f4b38b4266dc51858642f">//定时器 硬件初始化回调函数</div><div class="notion-text notion-block-ba5f9e16641d469392066cb442d04f8f">void HAL_TIM_Base_MspInit(TIM_HandleTypeDef *htim)</div><div class="notion-text notion-block-ff32ec88ff58476a9f48e1902896c8b8">{</div><div class="notion-text notion-block-f0be3d27a0954574b56b80243dfca7b2">if(htim-&gt;Instance == TIM1){<div class="notion-text-children"><div class="notion-text notion-block-d0e48d65a23b4046980393c645e9ce1c">__HAL_RCC_TIM1_CLK_ENABLE();                //使能时钟</div><div class="notion-text notion-block-a2442bb88baf4a21858d0cb0c537f1b5">__HAL_RCC_DMA1_CLK_ENABLE();</div><div class="notion-text notion-block-c4e2ab1349304ef4bdea31b5a7810031">HAL_NVIC_SetPriority(TIM1_UP_IRQn, 3, 0);   //配置、打开 更新中断</div><div class="notion-text notion-block-df361a8193b341b1a94af7fddc240102">HAL_NVIC_EnableIRQ(TIM1_UP_IRQn);</div><div class="notion-text notion-block-10ebc038977b4860a465245ffff350f1">/<em> DMA配置 </em>/</div><div class="notion-text notion-block-6d3732b0356440c8a6091cfbbae445b5">tim1_dmaup.Instance = DMA1_Channel5;    </div><div class="notion-text notion-block-0f47051f18604151beeef1e57f11340b">tim1_dmaup.Init.Direction = DMA_MEMORY_TO_PERIPH;   //存储区到外设</div><div class="notion-text notion-block-3ab9c8452ca648b49047d1e1bbaa2fe9">tim1_dmaup.Init.MemInc = DMA_MINC_ENABLE;           //存储区递增</div><div class="notion-text notion-block-6b97e19c426e4affbb10dd6e65cdbbd3">tim1_dmaup.Init.PeriphInc = DMA_PINC_DISABLE;       //外设不递增</div><div class="notion-text notion-block-9d876748d61e49babe9668b9ba12b986">tim1_dmaup.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD;     //半字 2字节</div><div class="notion-text notion-block-85cde7410d0c4377aab5e0ece911becb">tim1_dmaup.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD;</div><div class="notion-text notion-block-969f586639f64a53bc2f5002c1f600f2">tim1_dmaup.Init.Mode = DMA_NORMAL;  //单次模式</div><div class="notion-text notion-block-0e9e80dde90540a091425310a666cbf1">tim1_dmaup.Init.Priority = DMA_PRIORITY_MEDIUM; </div><div class="notion-text notion-block-b62f73b3c98b48459943d8b124ac8b39">__HAL_LINKDMA(&amp;tim1, hdma[TIM_DMA_ID_UPDATE], tim1_dmaup);</div><div class="notion-text notion-block-a3f89c804eca43459ffb9f6b3a303f13">HAL_DMA_Init(&amp;tim1_dmaup);</div><div class="notion-text notion-block-e0d493430a524334aa0865f1a03e5412">HAL_NVIC_SetPriority(DMA1_Channel5_IRQn, 3, 0);   //配置、打开 通道5的中断</div><div class="notion-text notion-block-64384084eb564d05ae9b043c6e2df350">HAL_NVIC_EnableIRQ(DMA1_Channel5_IRQn);</div></div></div><div class="notion-text notion-block-fcdbd50bb8b74f76bff9306dcefb29aa">}else if(htim-&gt;Instance == TIM2){<div class="notion-text-children"><div class="notion-text notion-block-a03cc542b1af426299bc8443961f6bad">__HAL_RCC_TIM2_CLK_ENABLE();</div><div class="notion-text notion-block-be16c9de9aa54667b2eadeff2446c9fe">__HAL_RCC_DMA1_CLK_ENABLE();</div><div class="notion-text notion-block-a46908694cb94fc0bfd0d7d0b3a76710">HAL_NVIC_SetPriority(TIM2_IRQn, 3, 0);</div><div class="notion-text notion-block-bb9bd6a00e174388b9482c7aa48ab86f">HAL_NVIC_EnableIRQ(TIM2_IRQn);<div class="notion-text-children"><div class="notion-text notion-block-8cc9fe1b46d941c2a23f0fee88a71200">/<em> DMA配置 </em>/</div><div class="notion-text notion-block-3b5fee4c96904090a65b5bcf613a8bd6">tim2_dmaup.Instance = DMA1_Channel2;    </div><div class="notion-text notion-block-ee37769778884ef2bccdfac0c17908e3">tim2_dmaup.Init.Direction = DMA_MEMORY_TO_PERIPH;   //存储区到外设</div><div class="notion-text notion-block-f34e6639b7604c62a2b987a678f32d53">tim2_dmaup.Init.MemInc = DMA_MINC_ENABLE;           //存储区递增</div><div class="notion-text notion-block-013a90a5bb344105b4dd11025563a0e3">tim2_dmaup.Init.PeriphInc = DMA_PINC_DISABLE;       //外设不递增</div><div class="notion-text notion-block-19feec3945d4436781e1210fe50fe98a">tim2_dmaup.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD;     //半字 2字节</div><div class="notion-text notion-block-efbbacb11173431f8a1d3e8f283752ef">tim2_dmaup.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD;</div><div class="notion-text notion-block-0108549497fc46e78c4537f747d17497">tim2_dmaup.Init.Mode = DMA_NORMAL;  //单次模式</div><div class="notion-text notion-block-acded72896314091baef4480b93fdcec">tim2_dmaup.Init.Priority = DMA_PRIORITY_MEDIUM; </div><div class="notion-text notion-block-5b9077a5f9064afc9aa684d86535befd">__HAL_LINKDMA(&amp;tim2, hdma[TIM_DMA_ID_UPDATE], tim2_dmaup);</div><div class="notion-text notion-block-c36766df86834c23acfdf22159531592">HAL_DMA_Init(&amp;tim2_dmaup);</div><div class="notion-text notion-block-bb9aae0c733d4eb1b438aba76cea57bd">HAL_NVIC_SetPriority(DMA1_Channel2_IRQn, 3, 0);   //配置、打开 通道5的中断</div><div class="notion-text notion-block-1ff35de6f0b24302be1b33cc41d1d228">HAL_NVIC_EnableIRQ(DMA1_Channel2_IRQn);</div><div class="notion-text notion-block-960a5a1ee3cf41a38cfdf870de798e98">}else if(htim-&gt;Instance == TIM3){<div class="notion-text-children"><div class="notion-text notion-block-bf5af5e06a6443ce9e1858276374b315">__HAL_RCC_TIM3_CLK_ENABLE();</div><div class="notion-text notion-block-6012af3d12a447af82c236b9fbbd7efc">__HAL_RCC_DMA1_CLK_ENABLE();</div><div class="notion-text notion-block-f72babf5b29c45a49d46c23961ece7cf">HAL_NVIC_SetPriority(TIM3_IRQn, 3, 0);</div><div class="notion-text notion-block-d62aedf464804917878fbc28fc789d46">HAL_NVIC_EnableIRQ(TIM3_IRQn);</div><div class="notion-text notion-block-862b6fb7857043afb89a0b858436fb32">/<em> DMA配置 </em>/</div><div class="notion-text notion-block-1fd2751cf687463cbbd4842cd2175203">tim3_dmaup.Instance = DMA1_Channel3;    </div><div class="notion-text notion-block-053502314b1044a58540a3ec1791d7d9">tim3_dmaup.Init.Direction = DMA_MEMORY_TO_PERIPH;   //存储区到外设</div><div class="notion-text notion-block-710386489c7e47209f15759c860f0195">tim3_dmaup.Init.MemInc = DMA_MINC_ENABLE;           //存储区递增</div><div class="notion-text notion-block-55f7b93a041c440f9416d3d97e9d7ea1">tim3_dmaup.Init.PeriphInc = DMA_PINC_DISABLE;       //外设不递增</div><div class="notion-text notion-block-562f725b43e443bba430baf8ad57cc50">tim3_dmaup.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD;     //半字 2字节</div><div class="notion-text notion-block-7ba37cfb27794c898bc100c889f444d9">tim3_dmaup.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD;</div><div class="notion-text notion-block-b4255f4034bf4238a21397df830e6228">tim3_dmaup.Init.Mode = DMA_NORMAL;  //单次模式</div><div class="notion-text notion-block-82200fb7e0ce4587bfec9fc57c66bf47">tim3_dmaup.Init.Priority = DMA_PRIORITY_MEDIUM; </div><div class="notion-text notion-block-bf3cbb20faf943d6aae5c81fd539c95c">__HAL_LINKDMA(&amp;tim3, hdma[TIM_DMA_ID_UPDATE], tim3_dmaup);</div><div class="notion-text notion-block-69f6f5e385ff4ef3ac166edd3963c1b9">HAL_DMA_Init(&amp;tim3_dmaup);</div><div class="notion-text notion-block-2fdeecfab2354a38982583ab3affc241">HAL_NVIC_SetPriority(DMA1_Channel3_IRQn, 3, 0);   //配置、打开 通道5的中断</div><div class="notion-text notion-block-6adf0bf9972047dda68e22690b85af0b">HAL_NVIC_EnableIRQ(DMA1_Channel3_IRQn);</div></div></div><div class="notion-text notion-block-d34a744f791f4c2f8d9f2136b0a0012a">}else if(htim-&gt;Instance == TIM4){<div class="notion-text-children"><div class="notion-text notion-block-688dc4706cdb405ab947738e66d35237">__HAL_RCC_TIM4_CLK_ENABLE();</div><div class="notion-text notion-block-a03393a57f694aaeb47e2777c8cf5907">__HAL_RCC_DMA1_CLK_ENABLE();</div><div class="notion-text notion-block-cb95e5b554cb42f19e04705fdfdc7e12">HAL_NVIC_SetPriority(TIM4_IRQn, 3, 0);</div><div class="notion-text notion-block-dfc6421893d34c8699b51b8590e742c2">HAL_NVIC_EnableIRQ(TIM4_IRQn);</div><div class="notion-text notion-block-f0915cc3069749f0af38f66ffcaa0413">/<em> DMA配置 </em>/</div><div class="notion-text notion-block-b99d95d0c25b4d6aa7d3cd4187773e7b">tim4_dmaup.Instance = DMA1_Channel7;    </div><div class="notion-text notion-block-33dc4e7884ed4efebd06679b5c5be12a">tim4_dmaup.Init.Direction = DMA_MEMORY_TO_PERIPH;   //存储区到外设</div><div class="notion-text notion-block-38a057ddfd7a4625afd58b722f85c08e">tim4_dmaup.Init.MemInc = DMA_MINC_ENABLE;           //存储区递增</div><div class="notion-text notion-block-d71e2641a86b4351bd33591d46a8f026">tim4_dmaup.Init.PeriphInc = DMA_PINC_DISABLE;       //外设不递增</div><div class="notion-text notion-block-4f693920aa8647ff9315c457965d3278">tim4_dmaup.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD;     //半字 2字节</div><div class="notion-text notion-block-9ca5daf0d83c469291d4fa251a33d073">tim4_dmaup.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD;</div><div class="notion-text notion-block-37b5659616f24d59be8c584b1834c33a">tim4_dmaup.Init.Mode = DMA_NORMAL;  //单次模式</div><div class="notion-text notion-block-13065dc5253d4b629d57f6a9ac2e3a81">tim4_dmaup.Init.Priority = DMA_PRIORITY_MEDIUM; </div><div class="notion-text notion-block-be95aee8e2874ac493b2c564dedc434e">__HAL_LINKDMA(&amp;tim4, hdma[TIM_DMA_ID_UPDATE], tim4_dmaup);</div><div class="notion-text notion-block-94c9f52892f14c43a1e2958493e25741">HAL_DMA_Init(&amp;tim4_dmaup);</div><div class="notion-text notion-block-17b37e252fc14d728aa90a32043c444e">HAL_NVIC_SetPriority(DMA1_Channel7_IRQn, 3, 0);   //配置、打开 通道5的中断</div><div class="notion-text notion-block-90d8959ac42d4ef1a437654b30eee6f7">HAL_NVIC_EnableIRQ(DMA1_Channel7_IRQn);</div></div></div><div class="notion-text notion-block-f3fa42033222406d9ac10eb41a1ad66f">}</div></div></div></div></div><div class="notion-text notion-block-811146bd0dc4448998ac626a2225a1fc">}</div><div class="notion-text notion-block-07c25b781e5b4f4b8053b8c1aec77a51">//定时器 硬件 De 回调函数</div><div class="notion-text notion-block-69c7ac82553c454c88a9a9d9b184668f">void HAL_TIM_Base_MspDeInit(TIM_HandleTypeDef *htim)</div><div class="notion-text notion-block-98534a772ea940279ae4d95417696c73">{</div><div class="notion-text notion-block-5551e2b9c9b44bd4bb08c6d17fa36b07">if(htim-&gt;Instance == TIM1){<div class="notion-text-children"><div class="notion-text notion-block-5f82acdd0361448fa2039738dd81a9c1">__HAL_RCC_TIM1_CLK_DISABLE();</div></div></div><div class="notion-text notion-block-e573393e6e2241178bf3f550ca4416f6">}else if(htim-&gt;Instance == TIM2){<div class="notion-text-children"><div class="notion-text notion-block-832d30c5119340d696e56e5f2a34d57c">__HAL_RCC_TIM2_CLK_DISABLE();</div></div></div><div class="notion-text notion-block-7d6916f8a0c0414ead3e5627df482d7a">}else if(htim-&gt;Instance == TIM3){<div class="notion-text-children"><div class="notion-text notion-block-08ffb28e9bac46e4bba3e6b5d9fabb5e">__HAL_RCC_TIM3_CLK_DISABLE();</div></div></div><div class="notion-text notion-block-44ac4ee73046475cba77969443011866">}else if(htim-&gt;Instance == TIM4){<div class="notion-text-children"><div class="notion-text notion-block-0132e9eade594f8d959570eb53f777f1">__HAL_RCC_TIM4_CLK_DISABLE();</div></div></div><div class="notion-text notion-block-3eb39001e0db44f089d4914eff5a4027">}    </div><div class="notion-text notion-block-37632ba06cba4fb1bf75aedf036a3819">}</div><div class="notion-text notion-block-0427e740c1e84537b0621a954c4f47c0">//更新中断  回调函数(同时也是DMA完成的回调函数)</div><div class="notion-text notion-block-197e3cf89ee94ed7b175e52343b9bc12">uint16_t time1 = 1;</div><div class="notion-text notion-block-6cb6667abd59452f8da7e60bc1f87bf4">uint16_t time2 = 1;</div><div class="notion-text notion-block-21a2452c45584b34bac23289fd46c421">uint16_t time3 = 1;</div><div class="notion-text notion-block-a844402dfd2b4c2e88f2d5409365ea22">uint16_t time4 = 1;</div><div class="notion-text notion-block-7de9fca3db544a38a1444c270b0f5c31">void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)</div><div class="notion-text notion-block-3d3f4c2d74a44801987a0303315caf1a">{    </div><div class="notion-text notion-block-fee3dcdc60164e2ab90fd5e2ac5004c8">if(htim-&gt;Instance == TIM1){<div class="notion-text-children"><div class="notion-text notion-block-187bc02a01d3451eac3dac9d0071ea74">/<em> 判断DMA是否为Ready状态，如果是则是DMA完成中断进入的回调函数 </em>/</div><div class="notion-text notion-block-db07591c3dd54c70b47f85f7605519a4">if(htim-&gt;hdma[TIM_DMA_ID_UPDATE]-&gt;State  == HAL_DMA_STATE_READY){<div class="notion-text-children"><div class="notion-text notion-block-0c20bb09288b43c587d15cb8fb34a21b">U1_Printf(&quot;DMA1 完成中断rn&quot;);</div><div class="notion-text notion-block-7a0da93eb2904028ab842b7c5589a804">HAL_DMA_DeInit(htim-&gt;hdma[TIM_DMA_ID_UPDATE]);  //关闭DMA</div></div></div><div class="notion-text notion-block-f183db5131664d3b8f2c7f05bf449cc5">}else{<div class="notion-text-children"><div class="notion-text notion-block-17afa15b81be4a8fbc698dfab6ea0af8">U1_Printf(&quot;定时器 1 定时时间:%drn&quot;,time1++);</div><div class="notion-text notion-block-bbd059159caa4561a31613e9a78227f1">if(time1 &gt;= 6){             //大于等于6 则关闭<div class="notion-text-children"><div class="notion-text notion-block-3043613fe56540c9b792559bf1fed792">U1_Printf(&quot;定时器1 关闭rn&quot;);</div><div class="notion-text notion-block-3782dc9d682f4fd5aea5086d5bd8010c">HAL_TIM_Base_Stop_DMA(htim);</div><div class="notion-text notion-block-1813e543b3e14c32a88c53b3df42822b">HAL_TIM_Base_DeInit(htim);</div></div></div><div class="notion-text notion-block-3f865b46648e44e7a462f0342c791c6e">}</div></div></div><div class="notion-text notion-block-731b6504aec24815aefe3399f8a9f7d5">}</div></div></div><div class="notion-text notion-block-4beeb3f5b00a4b9b868e607cf2dab313">}else if(htim-&gt;Instance == TIM2){<div class="notion-text-children"><div class="notion-text notion-block-001b575674bd489b8d08cbd4cd9d49d6">if(htim-&gt;hdma[TIM_DMA_ID_UPDATE]-&gt;State  == HAL_DMA_STATE_READY){<div class="notion-text-children"><div class="notion-text notion-block-b871cea46590491ab9df0086cf66f4a5">U1_Printf(&quot;DMA2 完成中断rn&quot;);</div><div class="notion-text notion-block-e6e258ea8ba04734aa18ba332b1513f4">HAL_DMA_DeInit(htim-&gt;hdma[TIM_DMA_ID_UPDATE]);  //关闭DMA</div></div></div><div class="notion-text notion-block-04db4a30857a4074bf9ba6fa3d6ad260">}else{<div class="notion-text-children"><div class="notion-text notion-block-e91bb2998d3f4ca58803d99f841b1a07">U1_Printf(&quot;定时器 2 定时时间:%drn&quot;,time2++);</div><div class="notion-text notion-block-51197ef88c6e49e9b097e8b3e87e90c5">if(time2 &gt;= 6){             //大于等于6 则关闭<div class="notion-text-children"><div class="notion-text notion-block-876ad6a98de1494a8741bc8d8eceb043">U1_Printf(&quot;定时器2 关闭rn&quot;);</div><div class="notion-text notion-block-78809626c6cf4776a7d88e3b981264b8">HAL_TIM_Base_Stop_DMA(htim);</div><div class="notion-text notion-block-7d1c6ed70f1a467cbea5b12538ee5af9">HAL_TIM_Base_DeInit(htim);</div></div></div><div class="notion-text notion-block-3818052bcc984efc973323aaa2354ea8">}</div></div></div><div class="notion-text notion-block-ab3c9901f399419da9e19921b4c4f8eb">}</div></div></div><div class="notion-text notion-block-dc7620e6c6da41c286b59af08f3aff80">}else if(htim-&gt;Instance == TIM3){<div class="notion-text-children"><div class="notion-text notion-block-a425d37268874e849d82b24366f26641">if(htim-&gt;hdma[TIM_DMA_ID_UPDATE]-&gt;State  == HAL_DMA_STATE_READY){<div class="notion-text-children"><div class="notion-text notion-block-6b739071b2cb462c9439dbe680643925">U1_Printf(&quot;DMA3 完成中断rn&quot;);</div><div class="notion-text notion-block-51d7c0b23e6742e0ba6ba51f94a7297b">HAL_DMA_DeInit(htim-&gt;hdma[TIM_DMA_ID_UPDATE]);  //关闭DMA</div></div></div><div class="notion-text notion-block-ab355f6565184d88ad816bfe81aef6c6">}else{<div class="notion-text-children"><div class="notion-text notion-block-c7d84091e80244689875671fb2abd65a">U1_Printf(&quot;定时器 3 定时时间:%drn&quot;,time3++);</div><div class="notion-text notion-block-77d6193d71434e68a5b5194bcb344285">if(time3 &gt;= 6){             //大于等于6 则关闭<div class="notion-text-children"><div class="notion-text notion-block-9c64d13ded9f46ccbaff5df61000fbac">U1_Printf(&quot;定时器3 关闭rn&quot;);</div><div class="notion-text notion-block-391335226eea460fb614696104e382fc">HAL_TIM_Base_Stop_DMA(htim);</div><div class="notion-text notion-block-cf98746a8e034a41bacbb900ec50abc8">HAL_TIM_Base_DeInit(htim);</div></div></div><div class="notion-text notion-block-e795943c00d44a3fa5626842ecc07833">}</div></div></div><div class="notion-text notion-block-a1c13bfe56a5425c82ed5f1b425043c6">}</div></div></div><div class="notion-text notion-block-125828f807f247bfa9ec652c6eab9169">}else if(htim-&gt;Instance == TIM4){<div class="notion-text-children"><div class="notion-text notion-block-27d072c7d71b4da9b3015498c5e3f871">if(htim-&gt;hdma[TIM_DMA_ID_UPDATE]-&gt;State  == HAL_DMA_STATE_READY){<div class="notion-text-children"><div class="notion-text notion-block-79e7b04a4b6e411295a7a485d8f2fd18">U1_Printf(&quot;DMA4 完成中断rn&quot;);</div><div class="notion-text notion-block-4f9df1fb6bf3442d86dda453b6a629d6">HAL_DMA_DeInit(htim-&gt;hdma[TIM_DMA_ID_UPDATE]);  //关闭DMA</div></div></div><div class="notion-text notion-block-2cfe78504e834fcd9842b5f9bb88437d">}else{<div class="notion-text-children"><div class="notion-text notion-block-8a0d69243be8495cbcc87e222a634264">U1_Printf(&quot;定时器 4 定时时间:%drn&quot;,time4++);</div><div class="notion-text notion-block-86b5b86a28944a4badedf74d92dba027">if(time4 &gt;= 6){             //大于等于6 则关闭<div class="notion-text-children"><div class="notion-text notion-block-65f88beca44741cf91f59d5756131259">U1_Printf(&quot;定时器4 关闭rn&quot;);</div><div class="notion-text notion-block-a84b4b00e1d84f3e8adf5c5ed9364648">HAL_TIM_Base_Stop_DMA(htim);</div><div class="notion-text notion-block-13d746dd783e4f849094f85edb428c51">HAL_TIM_Base_DeInit(htim);</div></div></div><div class="notion-text notion-block-540f5deacc2a433ba238feab965fd029">}</div></div></div><div class="notion-text notion-block-0b0c1ef08246457e9258003d3ee18e95">}</div></div></div><div class="notion-text notion-block-2637d32085fb4180b9e27bbcfcb593ed">}</div><div class="notion-text notion-block-0987970e2f1440afa788e832c2f51f8f">}</div><div class="notion-text notion-block-d46cf41e50ea4138919aa39850059ffb">//DMA 半完成回调函数</div><div class="notion-text notion-block-80463dec1a674c62b4a4f98557ce5634">void HAL_TIM_PeriodElapsedHalfCpltCallback(TIM_HandleTypeDef *htim)</div><div class="notion-text notion-block-53b71524cfca4a7d92fed035c712ad0e">{</div><div class="notion-text notion-block-3d2ef30017134906aee47f6461e7bb00">if(htim-&gt;Instance == TIM1){<div class="notion-text-children"><div class="notion-text notion-block-59c425fa80f7445796da94f5a65c59a6">U1_Printf(&quot;定时器 1 DMA半完成中断rn&quot;);</div></div></div><div class="notion-text notion-block-b21548e6685847b580bd41beff42081b">}else if(htim-&gt;Instance == TIM2){<div class="notion-text-children"><div class="notion-text notion-block-112ecf45fcd647b5b3aab7452df9f2e8">U1_Printf(&quot;定时器 2 DMA半完成中断rn&quot;);</div></div></div><div class="notion-text notion-block-1dcb45d1d42d490fa7729f686395eb79">}else if(htim-&gt;Instance == TIM3){<div class="notion-text-children"><div class="notion-text notion-block-19d1490c33474c75977252b8c4758382">U1_Printf(&quot;定时器 3 DMA半完成中断rn&quot;);</div></div></div><div class="notion-text notion-block-404093528f6f4585a4d71dc286f67416">}else if(htim-&gt;Instance == TIM4){<div class="notion-text-children"><div class="notion-text notion-block-2e4bdf5c8b5c4d3bbffd7357643ed749">U1_Printf(&quot;定时器 4 DMA半完成中断rn&quot;);</div></div></div><div class="notion-text notion-block-2168af5454df40db861165d99a10ec43">}</div><div class="notion-text notion-block-d938339770fb48d3a23847c2d7d9998b">}<div class="notion-text-children"><details class="notion-toggle notion-block-dec74b91246d4e20b53df4644c611488"><summary><h4 class="notion-h notion-h3 notion-block-dec74b91246d4e20b53df4644c611488" data-id="dec74b91246d4e20b53df4644c611488"><span><div id="dec74b91246d4e20b53df4644c611488" class="notion-header-anchor"></div><span class="notion-h-title">time.h</span></span></h4></summary><div><div class="notion-text notion-block-189bccda00f244519257e4a48d0cbc5e">#ifndef __TIME_H</div><div class="notion-text notion-block-85f9e58a146d4798a6464c285072b0de">#define __TIME_H</div><div class="notion-text notion-block-6b5f337f78e8493d926254a10140d3c0">#include &quot;uart.h&quot;</div><div class="notion-text notion-block-a45b058efbdc48aeb51eced9c8556284">/<em> 对外声明总控结构体 </em>/</div><div class="notion-text notion-block-9b258163f49d43e49960eb048f50fc2b">extern TIM_HandleTypeDef tim1;</div><div class="notion-text notion-block-91358cf1ef734db689f6a5fc189b86da">extern TIM_HandleTypeDef tim2;</div><div class="notion-text notion-block-7bbab0cab3df47daa8625f9c799094aa">extern TIM_HandleTypeDef tim3;</div><div class="notion-text notion-block-0615f9b6c032408bae42371bbbadeedd">extern TIM_HandleTypeDef tim4;</div><div class="notion-text notion-block-912f624969d34ad38fc9e4c6c056eb23">extern DMA_HandleTypeDef tim1_dmaup;</div><div class="notion-text notion-block-678f884efde6408e924c426166e2f472">extern DMA_HandleTypeDef tim2_dmaup;</div><div class="notion-text notion-block-8e5502adf0f54d838560535403c0f3a8">extern DMA_HandleTypeDef tim3_dmaup;</div><div class="notion-text notion-block-c2358f14dde74a3ba432d6c455f9bbe9">extern DMA_HandleTypeDef tim4_dmaup;</div><div class="notion-text notion-block-22a4bc354c2a437f9593149ee51bee84">/<em> 初始化函数 </em>/</div><div class="notion-text notion-block-2cb8373455be453aa484c53db504d684">void Timer1_Init(uint16_t arr, uint16_t psc, uint8_t rep);</div><div class="notion-text notion-block-05e340ad973b4525a90633453cdf041c">void Timer2_Init(uint16_t arr, uint16_t psc);</div><div class="notion-text notion-block-68b1bba44cc246eea54d6823ad7f8dba">void Timer3_Init(uint16_t arr, uint16_t psc);</div><div class="notion-text notion-block-d126df62387945aabf55953dbe943bf0">void Timer4_Init(uint16_t arr, uint16_t psc);</div><div class="notion-text notion-block-101d7d5d083e434e94fde80c456fbee3">#endif</div></div></details></div></div><details class="notion-toggle notion-block-2ad24b62e54f477d919cc434b8729f65"><summary><h4 class="notion-h notion-h3 notion-block-2ad24b62e54f477d919cc434b8729f65" data-id="2ad24b62e54f477d919cc434b8729f65"><span><div id="2ad24b62e54f477d919cc434b8729f65" class="notion-header-anchor"></div><span class="notion-h-title">stm32f1xx_it.c</span></span></h4></summary><div><div class="notion-text notion-block-09cb4fae34f14e41bf60263b2d8e0352">/<em>-------------------------------------------------</em>/</div><div class="notion-text notion-block-07d6709b80ae43118396512c9e090097">/<em>                                                 </em>/</div><div class="notion-text notion-block-56dd256265a043aeb79c67d185c27090">/<em>          实现各种中断服务函数的源文件           </em>/</div><div class="notion-text notion-block-0fb75e031c194ce5a782f2f1478e7e2d">/<em>                                                 </em>/</div><div class="notion-text notion-block-c2c6f2f69cbd42eeb821d7a4f3a191b1">/<em>-------------------------------------------------</em>/</div><div class="notion-text notion-block-040f6ceae2cb4f6e814dace2175dd654">#include &quot;stm32f1xx_hal.h&quot;   </div><div class="notion-text notion-block-d0e9408a5b5440be9f5bf507e49a5345">#include &quot;stm32f1xx_it.h&quot;</div><div class="notion-text notion-block-c23b7df520a048a38983e2150edcae71">#include &quot;uart.h&quot;</div><div class="notion-text notion-block-cbd25625ac05425aa30a6ab4432419fd">#include &quot;time.h&quot;</div><div class="notion-text notion-block-231e678a0b704260bad1df6a35b14f2a">void EXTI15_10_IRQHandler(void)</div><div class="notion-text notion-block-2e8da6c0e1be4e6aa542a257b1fec2dc">{<div class="notion-text-children"><div class="notion-text notion-block-9ad2c6f56afb42d389358ae8882082ea">HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_14);</div></div></div><div class="notion-text notion-block-05f41dc6ccea49369262ab2fc0f6a81a">}</div><div class="notion-text notion-block-dffdfca2f883466d8040e2b4da7c1709">void EXTI0_IRQHandler(void)</div><div class="notion-text notion-block-779b5ee87ba04ee4b26ced3abfd3e0a0">{<div class="notion-text-children"><div class="notion-text notion-block-e3346e476115493599474567a5bc6d86">HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_0);</div></div></div><div class="notion-text notion-block-b5e34722ccf74d1a876275e8e76e8911">}</div><div class="notion-text notion-block-5d1b2ef9b89846c69e787a57934f220f">void USART1_IRQHandler(void)</div><div class="notion-text notion-block-5ec2b51d65494b538f179b19505adaca">{<div class="notion-text-children"><div class="notion-text notion-block-82477c35ffcb4d52b605abac18903a79">HAL_UART_IRQHandler(&amp;uart1.uart);</div><div class="notion-text notion-block-1cde7e4950fd47a1abb530f5467fdbb2">if(__HAL_UART_GET_FLAG(&amp;uart1.uart, UART_FLAG_IDLE)){<div class="notion-text-children"><div class="notion-text notion-block-5b9bb589c58347e4a431952b776ebf55">__HAL_UART_CLEAR_IDLEFLAG(&amp;uart1.uart);</div><div class="notion-text notion-block-b9bb98fd4de7452080591632c968fb5e">uart1.RxCounter += (U1_RX_MAX - __HAL_DMA_GET_COUNTER(&amp;uart1.dmarx));</div><div class="notion-text notion-block-f9a4b9bd512a4f6fbbd831cf9be07c22">HAL_UART_AbortReceive_IT(&amp;uart1.uart);</div></div></div><div class="notion-text notion-block-87e1f3016fc748f7a7194e038dd9740c">}</div></div></div><div class="notion-text notion-block-819d2884ff6b41949084ef781851f052">}</div><div class="notion-text notion-block-ac797a9817e84631a810207b7beda850">void USART2_IRQHandler(void)</div><div class="notion-text notion-block-e51eb3b92c4949149841e98d5d553e84">{<div class="notion-text-children"><div class="notion-text notion-block-6fab3269fe244131a5fb754c2c234d7c">HAL_UART_IRQHandler(&amp;uart2.uart);</div><div class="notion-text notion-block-dc8562e8107548d8a4a2b057986f6978">if(__HAL_UART_GET_FLAG(&amp;uart2.uart, UART_FLAG_IDLE)){<div class="notion-text-children"><div class="notion-text notion-block-35a660566b75405897ecc070cbbd31c6">__HAL_UART_CLEAR_IDLEFLAG(&amp;uart2.uart);</div><div class="notion-text notion-block-317ab452852c4092b2d1ba919f82e4eb">uart2.RxCounter += (U2_RX_MAX - __HAL_DMA_GET_COUNTER(&amp;uart2.dmarx));</div><div class="notion-text notion-block-30e56d554bb04e369f2ede277ea92d2c">HAL_UART_AbortReceive_IT(&amp;uart2.uart);</div></div></div><div class="notion-text notion-block-d9de3b3646e74d6fae3c6da9dc34ec5f">}</div></div></div><div class="notion-text notion-block-03ab75f9cdee4f8eb9ee1cd5c24cfd85">}</div><div class="notion-text notion-block-97d11b6479304e0aa73a86a66387803e">void USART3_IRQHandler(void)</div><div class="notion-text notion-block-13aa2a5e18824f7088f1af2df75f9926">{<div class="notion-text-children"><div class="notion-text notion-block-2ceda7bf907244b69b99aa4b15e07e52">HAL_UART_IRQHandler(&amp;uart3.uart);</div><div class="notion-text notion-block-5afeeeaf451044c980250c5ac05e61dd">if(__HAL_UART_GET_FLAG(&amp;uart3.uart, UART_FLAG_IDLE)){<div class="notion-text-children"><div class="notion-text notion-block-91d964c4dbb34577bcf2869308c296e8">__HAL_UART_CLEAR_IDLEFLAG(&amp;uart3.uart);</div><div class="notion-text notion-block-3587aec44c824fbdb10b18de9424c181">uart3.RxCounter += (U3_RX_MAX - __HAL_DMA_GET_COUNTER(&amp;uart3.dmarx));</div><div class="notion-text notion-block-60eac083f2c9444baa65ac598b7081cb">HAL_UART_AbortReceive_IT(&amp;uart3.uart);</div></div></div><div class="notion-text notion-block-9a02cd39a19146ecb956573da8fde83b">}</div></div></div><div class="notion-text notion-block-e6617c358436428aa9c1b9e8057441eb">}</div><div class="notion-text notion-block-09ef567a57f74edc923ab6a2003791c7">void DMA1_Channel4_IRQHandler(void)</div><div class="notion-text notion-block-c4077c1c4c1547ed9c615896adeb7737">{<div class="notion-text-children"><div class="notion-text notion-block-c970fb44d3ab4aceb94b194fefd5e310">HAL_DMA_IRQHandler(&amp;uart1.dmatx);</div></div></div><div class="notion-text notion-block-9cc74b08299c4bbea93612e23ef83b88">}</div><div class="notion-text notion-block-5f10568060e145f797cd300922b44aad">//void DMA1_Channel5_IRQHandler(void)</div><div class="notion-text notion-block-a921a5b34e484222a9b72231b1aa5112">//{</div><div class="notion-text notion-block-ceccc21e597b46f09d0a688585ff8d08">//    HAL_DMA_IRQHandler(&amp;uart1.dmarx);</div><div class="notion-text notion-block-852029712fe4421085041eae8dce97b5">//}</div><div class="notion-text notion-block-e7117dc2af1649af8d6d8ee77aec8dfa">//void DMA1_Channel7_IRQHandler(void)</div><div class="notion-text notion-block-3bf36d420ff0404498350e5e80e54a11">//{</div><div class="notion-text notion-block-f30f7182eac4405180aec396f1dd6647">//    HAL_DMA_IRQHandler(&amp;uart2.dmatx);</div><div class="notion-text notion-block-cc49a31af1db42fd8a5e50b20238978c">//}</div><div class="notion-text notion-block-32c3adda0c93411c9e882ee953dab0fc">void DMA1_Channel6_IRQHandler(void)</div><div class="notion-text notion-block-a12b4e1a58a9434fb0e1960946ea90f9">{<div class="notion-text-children"><div class="notion-text notion-block-ca40b9fa2a4e4d638d0f512d3a6a38e6">HAL_DMA_IRQHandler(&amp;uart2.dmarx);</div></div></div><div class="notion-text notion-block-51960b31cde34018a5e07dc98e302337">}</div><div class="notion-text notion-block-084cebfc8d824ce9b53ff49c8b7fb31c">//void DMA1_Channel2_IRQHandler(void)</div><div class="notion-text notion-block-350cb54697ed4f29917dff1788679fe1">//{</div><div class="notion-text notion-block-dbbc58705b0b4073a07180d32b26f5ea">//    HAL_DMA_IRQHandler(&amp;uart3.dmatx);</div><div class="notion-text notion-block-abcfd025c5244a1ca0bc4e31cea1a72a">//}</div><div class="notion-text notion-block-0b1da62309aa447e8f15b521398cdc88">//void DMA1_Channel3_IRQHandler(void)</div><div class="notion-text notion-block-1a74c6c2b23942cca861dd8aaaca1a62">//{</div><div class="notion-text notion-block-f35ba77ca25b4b2880fc047fcfd7bde7">//    HAL_DMA_IRQHandler(&amp;uart3.dmarx);</div><div class="notion-text notion-block-945575e8c03640b492029a8dac73a38a">//}</div><div class="notion-text notion-block-535ea06b060a40ac82491d7f188e1205">void DMA1_Channel5_IRQHandler(void)</div><div class="notion-text notion-block-fd047e075add4e4e9c8ea209467b44d4">{<div class="notion-text-children"><div class="notion-text notion-block-da06ed5cad504f5eb86a673242d1a932">HAL_DMA_IRQHandler(&amp;tim1_dmaup);</div></div></div><div class="notion-text notion-block-1cb1cd04c698437f96a711736d17d8f5">}</div><div class="notion-text notion-block-4c89b34d3fd6408a820ec1fd46397163">void DMA1_Channel2_IRQHandler(void)</div><div class="notion-text notion-block-2c78a1b6f46343c8ac61095804609d76">{<div class="notion-text-children"><div class="notion-text notion-block-f47defc8b81245f493ae305c890330b2">HAL_DMA_IRQHandler(&amp;tim2_dmaup);</div></div></div><div class="notion-text notion-block-4f0ac10c674d4232befefb631c75c9d2">}</div><div class="notion-text notion-block-cd70eddad3ae4dec8d0ffc0a09b2b929">void DMA1_Channel3_IRQHandler(void)</div><div class="notion-text notion-block-ca7f0449b34d4979b44d34c58c2040ae">{<div class="notion-text-children"><div class="notion-text notion-block-d4990888f1de48dca6d7af4d35086466">HAL_DMA_IRQHandler(&amp;tim3_dmaup);</div></div></div><div class="notion-text notion-block-a8c492b84e9e4de89112834755fc9605">}</div><div class="notion-text notion-block-21f2547c87bd45e9824a92aee368a194">void DMA1_Channel7_IRQHandler(void)</div><div class="notion-text notion-block-37e5842eb81940cc96ba3862bd7f6d16">{<div class="notion-text-children"><div class="notion-text notion-block-ff35c26fc86040aabd9e3961eb83e221">HAL_DMA_IRQHandler(&amp;tim4_dmaup);</div></div></div><div class="notion-text notion-block-3f438be3523f4591bb66b42777d1695a">}</div><div class="notion-text notion-block-589013d74d3f4e37934f0f149536f8bb">void TIM1_UP_IRQHandler(void)</div><div class="notion-text notion-block-88b9f002a88343b081e823b0ac83da76">{<div class="notion-text-children"><div class="notion-text notion-block-bf412f84573746bc8d9ca07837e2787b">HAL_TIM_IRQHandler(&amp;tim1);</div></div></div><div class="notion-text notion-block-1a7fd76350de4319bee8be8a9b2b5db4">}</div><div class="notion-text notion-block-b18fe8806f654b1191550ddfee697e86">void TIM2_IRQHandler(void)</div><div class="notion-text notion-block-1918b66105d94ef8a6be8bd34b0cc006">{<div class="notion-text-children"><div class="notion-text notion-block-ac3713121b7c43a2883bfff6bc2ef8af">HAL_TIM_IRQHandler(&amp;tim2);</div></div></div><div class="notion-text notion-block-4dd65f9b65634c6fadd09f2c24e4e3ed">}</div><div class="notion-text notion-block-053de8b558a34bea99b9fe8d4c3c6914">void TIM3_IRQHandler(void)</div><div class="notion-text notion-block-58b9df4bfae3408bb52a15d0bb0d32aa">{<div class="notion-text-children"><div class="notion-text notion-block-22f67e57a2614d30a7864a02be27e9da">HAL_TIM_IRQHandler(&amp;tim3);</div></div></div><div class="notion-text notion-block-05b3a45716a24dc2a9ddb5adc96d8c8f">}</div><div class="notion-text notion-block-95c93bcef832416cb207b56254b157ce">void TIM4_IRQHandler(void)</div><div class="notion-text notion-block-477933a91de5433a86b223085f4cb87b">{<div class="notion-text-children"><div class="notion-text notion-block-9c44abe99465451fb8c363999a152ab6">HAL_TIM_IRQHandler(&amp;tim4);</div></div></div><div class="notion-text notion-block-647202977b414c85af34f37028c4e79b">}</div><div class="notion-text notion-block-c0029f4b4c95478b88717a2a2a9a8431">/<em>-------------------------------------------------</em>/</div><div class="notion-text notion-block-ad94fe0c1cb141acaa056a2e441e3f11">/<em>函数名：不可屏蔽中断处理函数                     </em>/</div><div class="notion-text notion-block-017af3c193a34ba5bb0d47c2fdfd9a9d">/<em>参  数：无                                       </em>/</div><div class="notion-text notion-block-5f2812ffeda84814b2b1f4262f0c9339">/<em>返回值：无                                       </em>/</div><div class="notion-text notion-block-cbb0f4392f41491b864d63d478ad4e2c">/<em>-------------------------------------------------</em>/</div><div class="notion-text notion-block-743ac62a19a04d98bc58bcd288542256">void NMI_Handler(void)</div><div class="notion-text notion-block-784963c8acbe41abb5fb29538b006be0">{</div><div class="notion-text notion-block-d34f2dbe42f14238af1673de50a1b8cd">}</div><div class="notion-text notion-block-58cd2cf410694363b52fb705ab940434">/<em>-------------------------------------------------</em>/</div><div class="notion-text notion-block-870836747801401cad0175177c09a158">/<em>函数名：硬件出错后进入的中断处理函数             </em>/</div><div class="notion-text notion-block-b3f4ceda0acd45549a7bc2a9e2111b1a">/<em>参  数：无                                       </em>/</div><div class="notion-text notion-block-5c1637564b4c4339a85acc429a0322e2">/<em>返回值：无                                       </em>/</div><div class="notion-text notion-block-461205905c0b4fdea66769f003be74e1">/<em>-------------------------------------------------</em>/</div><div class="notion-text notion-block-5e94aa054cb24b82b397db3bbe90d4f1">void HardFault_Handler(void)</div><div class="notion-text notion-block-515a5e90d8304b69ad7c0f2df361f819">{</div><div class="notion-text notion-block-4f839eeb16354168b85fb06e61b94e23">}</div><div class="notion-text notion-block-d9c9917174e24cf2a8a2166b691ff990">/<em>-------------------------------------------------</em>/</div><div class="notion-text notion-block-7cb84852a2f94a64b56b48f625cd7fdd">/<em>函数名：软中断，SWI 指令调用的处理函数           </em>/</div><div class="notion-text notion-block-2559b20c564c4dafa4d1ddbcc9ba8333">/<em>参  数：无                                       </em>/</div><div class="notion-text notion-block-db4f308361704e248dcdadfea4d85c00">/<em>返回值：无                                       </em>/</div><div class="notion-text notion-block-875162b42cda454abea13456382c20c4">/<em>-------------------------------------------------</em>/</div><div class="notion-text notion-block-14c21b7913e140029c4eb0c00257da34">void SVC_Handler(void)</div><div class="notion-text notion-block-70c6272f52124997859277b56ba17071">{</div><div class="notion-text notion-block-ddfae634530b48bc82b965433d14ec13">}</div><div class="notion-text notion-block-7c5c945d1a0d47e7a161f72586d537d0">/<em>-------------------------------------------------</em>/</div><div class="notion-text notion-block-ade787901473407ca1e866822d5b948a">/<em>函数名：可挂起的系统服务处理函数                 </em>/</div><div class="notion-text notion-block-56232d2ee763490d93238eeed6581d2b">/<em>参  数：无                                       </em>/</div><div class="notion-text notion-block-121362a9fd6640438124d36dacda9855">/<em>返回值：无                                       </em>/</div><div class="notion-text notion-block-0798a070ec8f411bb28247de30916984">/<em>-------------------------------------------------</em>/</div><div class="notion-text notion-block-de5ee678fd7f4e11918d8a140663da42">void PendSV_Handler(void)</div><div class="notion-text notion-block-0c5237b2452b44b4a94a95067ea49ffb">{</div><div class="notion-text notion-block-9d794322e8c44b57be7d079941dd3291">}</div><div class="notion-text notion-block-732fd2a3be704341875a6ea4732ddc71">/<em>-------------------------------------------------</em>/</div><div class="notion-text notion-block-96f2e149582d47a993ed54a98963ea7d">/<em>函数名：SysTic系统嘀嗒定时器处理函数             </em>/</div><div class="notion-text notion-block-0f96e26d14444e56a8336a3dd1e98a7e">/<em>参  数：无                                       </em>/</div><div class="notion-text notion-block-137fb6f63993477eba852da7d788edee">/<em>返回值：无                                       </em>/</div><div class="notion-text notion-block-31fccf83d3c0477eaaf6fc8282ebce19">/<em>-------------------------------------------------</em>/</div><div class="notion-text notion-block-70d4fed59b8846b5b15364917918ae10">void SysTick_Handler(void)</div><div class="notion-text notion-block-2d9b8536e98a4b5c9f03182313a73694">{  <div class="notion-text-children"><div class="notion-text notion-block-b52bda4ca7fe4c38b79a11a89155f31c">HAL_IncTick();	</div></div></div><div class="notion-text notion-block-800ccd5888da49f5999dfc341086acfe">}</div></div></details><details class="notion-toggle notion-block-09fdcb86abda4a06a8a0b9b157f8ee4c"><summary><h4 class="notion-h notion-h3 notion-block-09fdcb86abda4a06a8a0b9b157f8ee4c" data-id="09fdcb86abda4a06a8a0b9b157f8ee4c"><span><div id="09fdcb86abda4a06a8a0b9b157f8ee4c" class="notion-header-anchor"></div><span class="notion-h-title">main.c</span></span></h4></summary><div><div class="notion-text notion-block-99ad9fc454d34abfb1311d4c156178b0">#include &quot;stm32f1xx_hal.h&quot;</div><div class="notion-text notion-block-87059f899fe148d9a242459bc2eb6a06">#include &quot;rcc.h&quot;</div><div class="notion-text notion-block-0ca9de841c484ca3a550d7ace6583792">#include &quot;led.h&quot;</div><div class="notion-text notion-block-1494e393e0e44e5f9f2fe61f1a2d7524">#include &quot;sw.h&quot;</div><div class="notion-text notion-block-636157420d3146899322bb49c454a222">#include &quot;uart.h&quot;</div><div class="notion-text notion-block-0416cb06862442a4bbcd459780a2b8ba">#include &quot;time.h&quot;</div><div class="notion-text notion-block-96b09dd6247b47ccb08573eacb14eb46">int main(void){<div class="notion-text-children"><div class="notion-text notion-block-235bcf1d604f47a8a9f84acc5d5481ed">HAL_Init();</div><div class="notion-text notion-block-248d15be949f4bc8a6fa57d372dd2b10">RccClock_Init();</div><div class="notion-text notion-block-92eb7cfa7516411dba84dc6198583bc8">U1_Init(921600);</div><div class="notion-text notion-block-f95326782ba64f54bbdaa9891e9d21ff">Timer1_Init(10000 - 1, 7200 - 1, 1 - 1);   // 72000000/7200/10000  =  1s</div><div class="notion-text notion-block-3ce1e9da21eb4353b6e727101d2104b2">Timer2_Init(10000 - 1, 7200 - 1);   // 1s</div><div class="notion-text notion-block-7e9536d9d0d344bb8094825e8aeb893d">Timer3_Init(10000 - 1, 7200 - 1);   // 1s</div><div class="notion-text notion-block-6664ef15f909406ea5ae8ba640e2e986">Timer4_Init(10000 - 1, 7200 - 1);   // 1s</div></div></div><div class="notion-text notion-block-58c4e1e1c8cb48e4bb934a97511bd1de">//    uint16_t time1 = 0;</div><div class="notion-text notion-block-8c78310b768e496c9dc16243a1197dcf">//    uint16_t time2 = 0;</div><div class="notion-text notion-block-746b237d564c47a79a0fcca129375a94">//    uint16_t time3 = 0;</div><div class="notion-text notion-block-ee0dd10e317940caa12e9f14dd8a4017">//    uint16_t time4 = 0;<div class="notion-text-children"><div class="notion-text notion-block-69b3421fb7ba4c0c8c60730b5001b0e5">while(1){<div class="notion-text-children"><div class="notion-text notion-block-7e15ada9af28433b8e741d0bbcfe1a9c">/<em> 获取更新标志位 </em>/</div></div></div></div></div><div class="notion-text notion-block-99a27c94edce45ef9425e3411b14a3e9">//        if(__HAL_TIM_GET_FLAG(&amp;tim1, TIM_FLAG_UPDATE)){</div><div class="notion-text notion-block-549b2599a7ef4624a5172a47da96cf76">//            __HAL_TIM_CLEAR_FLAG(&amp;tim1, TIM_FLAG_UPDATE);   ///清除标志位</div><div class="notion-text notion-block-abb3098cea864f109d691dbca6093a14">//            U1_Printf(&quot;定时器 1 定时时间:%drn&quot;,time1++);</div><div class="notion-text notion-block-77d362044e934aad8b74b46b28fee23b">//        }</div><div class="notion-text notion-block-fc5fd07c9c2b4924b3b6914df8f4eef6">//        </div><div class="notion-text notion-block-73fab28efdd741e3b5dd61abb5bf5829">//        if(__HAL_TIM_GET_FLAG(&amp;tim2, TIM_FLAG_UPDATE)){</div><div class="notion-text notion-block-694703b904064b6597b450a516b6d04f">//            __HAL_TIM_CLEAR_FLAG(&amp;tim2, TIM_FLAG_UPDATE);</div><div class="notion-text notion-block-382fe9d326ee457f95b45b392c190590">//            U1_Printf(&quot;定时器 2 定时时间:%drn&quot;,time2++);</div><div class="notion-text notion-block-3e2f4a7a9b8e453cabcb7ac63b4d04a2">//        }</div><div class="notion-text notion-block-2889f018d3d14e06b6c2bd1bdae0e3db">//        </div><div class="notion-text notion-block-25f6a0f52b9d44b3806f9c7c6195fd1b">//        if(__HAL_TIM_GET_FLAG(&amp;tim3, TIM_FLAG_UPDATE)){</div><div class="notion-text notion-block-f27ec3547e8b49a7ae0ddb78e70a13f2">//            __HAL_TIM_CLEAR_FLAG(&amp;tim3, TIM_FLAG_UPDATE);</div><div class="notion-text notion-block-bcc83c5d34e0420f849f1d7f943d44dc">//            U1_Printf(&quot;定时器 3 定时时间:%drn&quot;,time3++);</div><div class="notion-text notion-block-59414642439348488dcba52f4cd4a6ff">//        }</div><div class="notion-text notion-block-bf1eaa35b5c64c0f9a048221a25d748a">//        </div><div class="notion-text notion-block-9efcb79da1a74c029f75e0ca3d383816">//        if(__HAL_TIM_GET_FLAG(&amp;tim4, TIM_FLAG_UPDATE)){</div><div class="notion-text notion-block-34efdf4367974dad93342a517761e87b">//            __HAL_TIM_CLEAR_FLAG(&amp;tim4, TIM_FLAG_UPDATE);</div><div class="notion-text notion-block-94ef18f8589f4d4188815dd07e3f2564">//            U1_Printf(&quot;定时器 4 定时时间:%drn&quot;,time4++);</div><div class="notion-text notion-block-80b7cc51ec1f4fcd9eef0a281d55b850">//        }<div class="notion-text-children"><div class="notion-text notion-block-1d600dde4523419d8b09903610a3e2c4">}</div></div></div><div class="notion-text notion-block-b70d7e1bb5e34cd3aa40f66f44a7ab0d">}</div></div></details></div></details><details class="notion-toggle notion-block-dd7027845f5d458d872d512a97eb11b6"><summary><h3 class="notion-h notion-h2 notion-h-indent-1 notion-block-dd7027845f5d458d872d512a97eb11b6" data-id="dd7027845f5d458d872d512a97eb11b6"><span><div id="dd7027845f5d458d872d512a97eb11b6" class="notion-header-anchor"></div><span class="notion-h-title">六、HAL库：TIM1234 DMA循环方式 改变定时时间</span></span></h3></summary><div><details class="notion-toggle notion-block-b62400d82c9547a19ccd935786775cb0"><summary><h4 class="notion-h notion-h3 notion-block-b62400d82c9547a19ccd935786775cb0" data-id="b62400d82c9547a19ccd935786775cb0"><span><div id="b62400d82c9547a19ccd935786775cb0" class="notion-header-anchor"></div><span class="notion-h-title">1. 实验现象</span></span></h4></summary><div></div></details><div class="notion-text notion-block-abc1e3c245e44b67958d9e7f1c78c255">DMA循环方式，<b>传输4次*n数据，改变定时时间：第一次定时1s（初始化），第二次定时2s，第三次定时3s，第四次定时4s第五次定时5s，然后第六次 2s，第七次3s，第八次4s，第、九次5s，第十次2s</b></div><details class="notion-toggle notion-block-6f48a7e98918431cac7e65383decf491"><summary><h4 class="notion-h notion-h3 notion-block-6f48a7e98918431cac7e65383decf491" data-id="6f48a7e98918431cac7e65383decf491"><span><div id="6f48a7e98918431cac7e65383decf491" class="notion-header-anchor"></div><span class="notion-h-title">2. 如何判断DMA中断还是更新中断*</span></span></h4></summary><div><ol start="1" class="notion-list notion-list-numbered notion-block-83988fb26100423d9e80a624edef0f1d" style="list-style-type:decimal"><li><b>上一小节所说：DMA有半完成回调 和 完成回调</b></li><ol class="notion-list notion-list-numbered notion-block-83988fb26100423d9e80a624edef0f1d" style="list-style-type:lower-alpha"><ul class="notion-list notion-list-disc notion-block-8db4d43364e74545bc1da8ef6a9347cc"><li><b>其中完成回调，和定时器更新回调的函数是一个函数</b></li></ul><ul class="notion-list notion-list-disc notion-block-7a6000bdd6b64faa81e2c6909115bda3"><li><b>所以，如果要使用更新中断和DMA完成中断，则需要判断一下。</b></li><ul class="notion-list notion-list-disc notion-block-7a6000bdd6b64faa81e2c6909115bda3"><li><b>方法：通过判断DMA的状态，如果为Busy，则说明是更新中断进入的  定时器更新回调函数</b></li></ul></ul></ol></ol><ol start="2" class="notion-list notion-list-numbered notion-block-d64c90e71c6d4268be7f4a06cf44fa96" style="list-style-type:decimal"><li>那么在这一节是行不通的，<b>因为DMA一直在循环模式，一直处于BUSY状态，所以不能判断了。</b>但是 <b> DMA的半完成中断和完成中断，在进入回调函数之前 就会把定时器设置成Ready状态，</b>而<b>定时器更新中断 并不会设置定时器的状态为Ready。</b></li><ol class="notion-list notion-list-numbered notion-block-d64c90e71c6d4268be7f4a06cf44fa96" style="list-style-type:lower-alpha"><ul class="notion-list notion-list-disc notion-block-c50648e7c1ef421d97cf191dcc060740"><li>所以，着急需要判断定时器的更新中断，就可以判断这次中断是更新中断还是 DMA的中断。</li></ul><ul class="notion-list notion-list-disc notion-block-e8b84f74ef444b4ebc31bc0504a3fcb2"><li>并且，<b>判断过后，需要把定时器状态重新赋值为 BUSY，</b> 这样是为了防止更新中断在进入时，仍然进入DMA完成的分支</li></ul><div class="notion-text notion-block-a2579e78774b4f319fe82217bc76cdc2">代码节选</div></ol></ol></div></details><div class="notion-text notion-block-842968cd47944fdcab53a37c66e6f26d">//更新中断  回调函数(同时也是DMA完成的回调函数)</div><div class="notion-text notion-block-d185f40b024e4a89bb97c83a04ff443a">uint16_t time1 = 1;</div><div class="notion-text notion-block-317492874c9f43ef996d11b9773cea6f">uint16_t time2 = 1; </div><div class="notion-text notion-block-d4a340f3368741c8b222676ec5ea0571">uint16_t time3 = 1;</div><div class="notion-text notion-block-7a60adca33b74a6886b0ebecb4043bb0">uint16_t time4 = 1;</div><div class="notion-text notion-block-adc5da26dd4a416b984ad48c03d5b0f3">void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)</div><div class="notion-text notion-block-7df577e2befc411dae60bd1553ccd29a">{    </div><div class="notion-text notion-block-abecc6fc01054fe4bf992dd6034b1e7a">if(htim-&gt;Instance == TIM1){<div class="notion-text-children"><div class="notion-text notion-block-d432e7b057cf461db7207ce0034a665b">/<em> 判断TIM是否为Ready状态，如果是 则是DMA完成中断进入的回调函数 </em>/</div><div class="notion-text notion-block-65754ebab4f34c15b3737399c1e19987">if(htim-&gt;State  == HAL_DMA_STATE_READY){<div class="notion-text-children"><div class="notion-text notion-block-17a64cf9045c40b0a4a2a0488df5c149">U1_Printf(&quot;DMA1 完成中断rn&quot;);</div><div class="notion-text notion-block-2ab145b2eb2a4e80a013ade8b719c96d">htim-&gt;State = HAL_TIM_STATE_BUSY;           //设置定时器 BUSY状态</div></div></div><div class="notion-text notion-block-0a7b74b7af104fd4b22cb2b836b8cc3e">}else{<div class="notion-text-children"><div class="notion-text notion-block-9d330104db0d42a49b2d834c4d0b778f">U1_Printf(&quot;定时器 1 定时时间:%drn&quot;,time1++);</div></div></div><div class="notion-text notion-block-cfaa75095d944e44afa111d11a4d9987">}</div></div></div><div class="notion-text notion-block-601872f356674568b7bc95e92bfd15b6">}else if(htim-&gt;Instance == TIM2){<div class="notion-text-children"><div class="notion-text notion-block-3d32814a4f5e4deb9431947796a8835e">if(htim-&gt;State  == HAL_DMA_STATE_READY){<div class="notion-text-children"><div class="notion-text notion-block-83d67aae97804d4588b7f2a06d37fee0">U1_Printf(&quot;DMA2 完成中断rn&quot;);</div><div class="notion-text notion-block-9a34b5cc526848378192cc3540d1de42">htim-&gt;State = HAL_TIM_STATE_BUSY;           //设置定时器 BUSY状态</div></div></div><div class="notion-text notion-block-5bc50348fec5429180861aa83b129145">}else{<div class="notion-text-children"><div class="notion-text notion-block-2ffd368a47634c06817b9d672eb7f8b9">U1_Printf(&quot;定时器 2 定时时间:%drn&quot;,time2++);</div></div></div><div class="notion-text notion-block-0d7061c3fe19445e921b21013181b45a">}</div></div></div><div class="notion-text notion-block-693c90a12fcf4f97b084d8eb83e32c57">}else if(htim-&gt;Instance == TIM3){<div class="notion-text-children"><div class="notion-text notion-block-8e5998845326402aaaa20ff472785e3f">if(htim-&gt;State  == HAL_DMA_STATE_READY){<div class="notion-text-children"><div class="notion-text notion-block-c4e8c615d38848f8911096979491c29e">U1_Printf(&quot;DMA3 完成中断rn&quot;);</div><div class="notion-text notion-block-d6f45683516c4dacbaa5134d31a8e342">htim-&gt;State = HAL_TIM_STATE_BUSY;           //设置定时器 BUSY状态</div></div></div><div class="notion-text notion-block-8533022fea0547f0b4fa377311b14b78">}else{<div class="notion-text-children"><div class="notion-text notion-block-39c5f074ecbd40bba330d18b29e017c7">U1_Printf(&quot;定时器 3 定时时间:%drn&quot;,time3++);</div></div></div><div class="notion-text notion-block-55944e9ad7294d239d3bfe852edb6a5a">}</div></div></div><div class="notion-text notion-block-675a88ee900e4457af20b2a9b5609c47">}else if(htim-&gt;Instance == TIM4){<div class="notion-text-children"><div class="notion-text notion-block-2e78dbb1652b442ca4be0b02202e89e1">if(htim-&gt;State  == HAL_DMA_STATE_READY){<div class="notion-text-children"><div class="notion-text notion-block-cc500bcc5eab4f9da0952c45635bdbd6">U1_Printf(&quot;DMA4 完成中断rn&quot;);</div><div class="notion-text notion-block-0e5d103d70f749f9b5907065e52ec2b7">htim-&gt;State = HAL_TIM_STATE_BUSY;           //设置定时器 BUSY状态</div></div></div><div class="notion-text notion-block-3a1f6c1ca66849ff92e540ce61e85a9a">}else{<div class="notion-text-children"><div class="notion-text notion-block-585b174061a9477b9f9e8f85bd448a8c">U1_Printf(&quot;定时器 4 定时时间:%drn&quot;,time4++);</div></div></div><div class="notion-text notion-block-d9cc5672f9404031b9d0246f13fe1430">}</div></div></div><div class="notion-text notion-block-e0b1a6d59ddf4c51a951c62f7f4d4a89">}</div><div class="notion-text notion-block-b593ffb474e14d549db69a527bce7c7f">}</div></div></details><details class="notion-toggle notion-block-87324956d6b1479fb4a4e238eb9ecfbd"><summary><h4 class="notion-h notion-h3 notion-h-indent-2 notion-block-87324956d6b1479fb4a4e238eb9ecfbd" data-id="87324956d6b1479fb4a4e238eb9ecfbd"><span><div id="87324956d6b1479fb4a4e238eb9ecfbd" class="notion-header-anchor"></div><span class="notion-h-title">4. 相关函数</span></span></h4></summary><div><ul class="notion-list notion-list-disc notion-block-02bee48fca8349a1aa1da3f60fcf70e8"><li><code class="notion-inline-code">TIM_HandleTypeDef</code> 定时器总控结构体</li></ul><ul class="notion-list notion-list-disc notion-block-511f71eeeb7c4df3b324e9ba09807b5b"><li><code class="notion-inline-code">DMA_HandleTypeDef</code> DMA总控结构体</li></ul><ul class="notion-list notion-list-disc notion-block-2afdee7a8add4305a4a89549c1e68a82"><li><code class="notion-inline-code">__HAL_TIM_CLEAR_FLAG</code><b> </b>清除标志位</li></ul><ul class="notion-list notion-list-disc notion-block-41a58a997b8d4cb8b3a94aedb31f57bc"><li><code class="notion-inline-code">__HAL_TIM_ENABLE_IT</code> 使能中断</li></ul><ul class="notion-list notion-list-disc notion-block-02cbdb84d87e4e2cadae36a78ec13a69"><li><code class="notion-inline-code">HAL_TIM_Base_Start_DMA</code> DMA方式启动定时器</li></ul><ul class="notion-list notion-list-disc notion-block-312efa57d6b84469a3829f99fffdefca"><li><code class="notion-inline-code">__HAL_LINKDMA</code> DMA LINK</li></ul><div class="notion-text notion-block-00474938f59c4e18b7e39fd7a61a31f7">/<em> DMA配置 </em>/</div><div class="notion-text notion-block-419c5c9a48b543489e0db3fbe7f369ee">tim4_dmaup.Instance = DMA1_Channel7;    </div><div class="notion-text notion-block-b5e074d36fa147c5b2ddd5115f228e62">tim4_dmaup.Init.Direction = DMA_MEMORY_TO_PERIPH;</div><div class="notion-text notion-block-6d1be0e2e43640ccbd496f29193bcfc8">tim4_dmaup.Init.MemInc = DMA_MINC_ENABLE;</div><div class="notion-text notion-block-3f3a114cec1943b6a27db3766fbb3038">tim4_dmaup.Init.PeriphInc = DMA_PINC_DISABLE;</div><div class="notion-text notion-block-b06ef97446d84fd3945c487b39b2d454">tim4_dmaup.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD;</div><div class="notion-text notion-block-ea54e53d105a45548541609055a26ac5">tim4_dmaup.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD;</div><div class="notion-text notion-block-9d36b4e0899f4a469b6774c546ba2b80">tim4_dmaup.Init.Mode = DMA_CIRCULAR;  //循环模式</div><div class="notion-text notion-block-f0dae49aae07438ea38ee06f73719d0a">tim4_dmaup.Init.Priority = DMA_PRIORITY_MEDIUM; </div><div class="notion-text notion-block-829a3e77cdc140af91b75711910c3dd7">__HAL_LINKDMA(&amp;tim4, hdma[TIM_DMA_ID_UPDATE], tim4_dmaup);</div><div class="notion-text notion-block-fcd61914f6154450bcff1bb86a7427c6">HAL_DMA_Init(&amp;tim4_dmaup);</div><details class="notion-toggle notion-block-10137e1564fb49ee85e383e633c5d9bf"><summary><h4 class="notion-h notion-h3 notion-block-10137e1564fb49ee85e383e633c5d9bf" data-id="10137e1564fb49ee85e383e633c5d9bf"><span><div id="10137e1564fb49ee85e383e633c5d9bf" class="notion-header-anchor"></div><span class="notion-h-title">4. 程序</span></span></h4></summary><div><details class="notion-toggle notion-block-0518bf3181d143cdac39d5b73a460cfd"><summary><h4 class="notion-h notion-h3 notion-block-0518bf3181d143cdac39d5b73a460cfd" data-id="0518bf3181d143cdac39d5b73a460cfd"><span><div id="0518bf3181d143cdac39d5b73a460cfd" class="notion-header-anchor"></div><span class="notion-h-title">time.c</span></span></h4></summary><div><div class="notion-text notion-block-0ec57ffec79441fab5348b6b9c6db1e1">#include &quot;stm32f1xx_hal.h&quot;</div><div class="notion-text notion-block-89442582fa7a4710893ed050a6dace16">#include &quot;time.h&quot;</div><div class="notion-text notion-block-58f92f0e539b458e98a20fe9ead3bed8">TIM_HandleTypeDef tim1; //（高级）定时器1总控结构体</div><div class="notion-text notion-block-39ad91bfe19041488cf6c036f99bf47e">TIM_HandleTypeDef tim2; </div><div class="notion-text notion-block-a13275c0765e4a5a81cab56f8aa4b879">TIM_HandleTypeDef tim3; </div><div class="notion-text notion-block-0355d67284b340ab9558b7f284678c73">TIM_HandleTypeDef tim4; </div><div class="notion-text notion-block-617ef60a8f914e42a5ee54cf4b5675bc">DMA_HandleTypeDef tim1_dmaup;</div><div class="notion-text notion-block-2f558168f17a4882aee67c85f1d5d377">DMA_HandleTypeDef tim2_dmaup;</div><div class="notion-text notion-block-6eb13686c7ff4df98c0b528fcf353450">DMA_HandleTypeDef tim3_dmaup;</div><div class="notion-text notion-block-a6a6a3f77fc246a3a9acea00a9a34a5b">DMA_HandleTypeDef tim4_dmaup;</div><div class="notion-text notion-block-034ad990f3df46cd9dcfa3a335b2fd6b">uint16_t tim1_dmaBuff[4] = {20000, 30000, 40000, 50000};</div><div class="notion-text notion-block-09700f93e594476a8650e9d42d42c31c">uint16_t tim2_dmaBuff[4] = {20000, 30000, 40000, 50000};</div><div class="notion-text notion-block-481b7a7aa5604aabb7f06a3320273aed">uint16_t tim3_dmaBuff[4] = {20000, 30000, 40000, 50000};</div><div class="notion-text notion-block-efcbf41041674a8d91e0ec3cc884476c">uint16_t tim4_dmaBuff[4] = {20000, 30000, 40000, 50000};</div><div class="notion-text notion-block-8210520878424a079536218a27622e3f">//定时器 1</div><div class="notion-text notion-block-e37fa17386af4bee97a1a507c02f16b7">void Timer1_Init(uint16_t arr, uint16_t psc, uint8_t rep)</div><div class="notion-text notion-block-d508bb2045904e0dbac315304d3be7d2">{<div class="notion-text-children"><div class="notion-text notion-block-c84ed9d6aa0745af81c36a9899c30da0">tim1.Instance = TIM1;                                        // 实例</div><div class="notion-text notion-block-f48c6838939a420e983593b972173636">tim1.Init.Period = arr;                                      // 重装载值</div><div class="notion-text notion-block-ba87180378c5402bb2c4d0d68a32786f">tim1.Init.Prescaler = psc;                                   // 分频系数</div></div></div></div></details><div class="notion-text notion-block-08637b96805b4ec089045db73bc13926">tim1.Init.CounterMode = TIM_COUNTERMODE_UP;                  // 计数模式</div><div class="notion-text notion-block-55ad38b5b57c4f6cbdad18e3d549d406">tim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;            // 分频因子</div><div class="notion-text notion-block-7fa4a777f8264dcaad256fb7490a53cb">tim1.Init.RepetitionCounter = rep;                           // 重复计数值</div><div class="notion-text notion-block-8e6c665cc65f4d7aad910231f58dd04a">tim1.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;// 自动重装载值 预装载使能位（影子寄存器）</div><div class="notion-text notion-block-e79789b27119472793712a10aeaab71a">HAL_TIM_Base_Init(&amp;tim1);                       //初始化定时器</div></div></details><div class="notion-text notion-block-1ca14782c16540818041b2c6fb14a5f0">__HAL_TIM_CLEAR_FLAG(&amp;tim1, TIM_FLAG_UPDATE);   //手动 清除 定时器 更新事件</div><div class="notion-text notion-block-f0c8c036c2cc45dc86819dadeb315beb">__HAL_TIM_ENABLE_IT(&amp;tim1, TIM1_UP_IRQn);       //手动 使能 定时器 更新中断</div><div class="notion-text notion-block-30be2e87e04546edbae124470c5a4d86">HAL_TIM_Base_Start_DMA(&amp;tim1, (uint32_t*)tim1_dmaBuff, 4);   //打开定时器（DMA方式）</div><div class="notion-text notion-block-d4bfe0d7a011418b82782e899df4afb0">}</div><div class="notion-text notion-block-c79220964c0a429bab3167c4c37fe4fc">//定时器 2</div><div class="notion-text notion-block-f5f23bd385704e42b1be67e200e5c9f0">void Timer2_Init(uint16_t arr, uint16_t psc)</div><div class="notion-text notion-block-69d465c5a5d94a70830605343eba905b">{</div><div class="notion-text notion-block-c20f235da8034acc84ac341c4ea20a4c">tim2.Instance = TIM2;</div><div class="notion-text notion-block-5b8d872c90aa436ca4bafd3aad831a35">tim2.Init.Period = arr; </div><div class="notion-text notion-block-8b203698979d4e8f81b38b8178ae24f4">tim2.Init.Prescaler = psc;</div><div class="notion-text notion-block-b6f2589c89c84a97b7519c38811f42e8">tim2.Init.CounterMode = TIM_COUNTERMODE_UP;</div><div class="notion-text notion-block-a38b27ae5d8b4b53b483c92b48585fa4">tim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;</div><div class="notion-text notion-block-21ba361e3c7d48f6ae4932e73854ded6">tim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;</div><div class="notion-text notion-block-22f383941f0c4453bfacfec8d075f43b">HAL_TIM_Base_Init(&amp;tim2);</div><div class="notion-text notion-block-006fa20ca1dc4b1ba1a4a82ea4e69fde">__HAL_TIM_CLEAR_FLAG(&amp;tim2, TIM_FLAG_UPDATE);</div><div class="notion-text notion-block-86c211d03b6045c0985b40ea3c0a7d99">__HAL_TIM_ENABLE_IT(&amp;tim2, TIM1_UP_IRQn);</div><div class="notion-text notion-block-e18301675af04610bb7e1a36737dd45f">HAL_TIM_Base_Start_DMA(&amp;tim2, (uint32_t*)tim2_dmaBuff, 4);</div><div class="notion-text notion-block-10bb55daa2744aaeb32a9f7e2a6f9acf">}</div><div class="notion-text notion-block-525c2c71e8c3451bb052209a5c58c9cb">//定时器 3</div><div class="notion-text notion-block-ef7fb778a63d499eb27679fe3ff14c5b">void Timer3_Init(uint16_t arr, uint16_t psc)</div><div class="notion-text notion-block-827a88fa9b934e4986695b3689c962f5">{</div><div class="notion-text notion-block-1a1e438dd7ae49cf927f050fb75c3184">tim3.Instance = TIM3;</div><div class="notion-text notion-block-86f0a0bc94614324950506d5b743c153">tim3.Init.Period = arr;</div><div class="notion-text notion-block-0561d09cc47b46da937b8a92ff4f030c">tim3.Init.Prescaler = psc;</div><div class="notion-text notion-block-a202630f211f4cc0b3300c1768ad4001">tim3.Init.CounterMode = TIM_COUNTERMODE_UP;</div><div class="notion-text notion-block-70d2c96810cf4e298503d640c2852b59">tim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;</div><div class="notion-text notion-block-6c8634674d5645ccb19652ba9e59a347">tim3.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;</div><div class="notion-text notion-block-d091b482d9e54f75b414a2e0fd9647ab">HAL_TIM_Base_Init(&amp;tim3); </div><div class="notion-text notion-block-91ba278de60b40ccb6d16e58cb59dfa0">__HAL_TIM_CLEAR_FLAG(&amp;tim3, TIM_FLAG_UPDATE);</div><div class="notion-text notion-block-faa3bd81ccbe490b8a6842ba75220660">__HAL_TIM_ENABLE_IT(&amp;tim3, TIM1_UP_IRQn);</div><div class="notion-text notion-block-125e137e39b64726a5da0df777d58db3">HAL_TIM_Base_Start_DMA(&amp;tim3, (uint32_t*)tim3_dmaBuff, 4);</div><div class="notion-text notion-block-5be50d2d92aa434294e07f1a38e1e62a">}</div><div class="notion-text notion-block-05a66a620513470baed993268b67defb">//定时器 4</div><div class="notion-text notion-block-3198a87a173e4210bb97d86bcc0423be">void Timer4_Init(uint16_t arr, uint16_t psc)</div><div class="notion-text notion-block-a2c2db2165a046c4b80938e56385c09e">{</div><div class="notion-text notion-block-a4b066d57499421aba992fe9a55ee22f">tim4.Instance = TIM4;</div><div class="notion-text notion-block-93c10153d3c1432fa5e089d5150c2278">tim4.Init.Period = arr;</div><div class="notion-text notion-block-33b7728138404f9e8ad74d69469ad83d">tim4.Init.Prescaler = psc;</div><div class="notion-text notion-block-1fa88d048dc642a6b00121b9f1768723">tim4.Init.CounterMode = TIM_COUNTERMODE_UP;</div><div class="notion-text notion-block-0a5b9dea922244848ce841f8eaf534db">tim4.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;</div><div class="notion-text notion-block-15182388e6934dc58812944d8528f7df">tim4.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;</div><div class="notion-text notion-block-8da659b37aa646c39ff08309e5fb9ac5">HAL_TIM_Base_Init(&amp;tim4);</div><div class="notion-text notion-block-8e0b78dc68004fa38b9ebca00e4c9334">__HAL_TIM_CLEAR_FLAG(&amp;tim4, TIM_FLAG_UPDATE);</div><div class="notion-text notion-block-a8eca21f267446a3bb468bae87dc8981">__HAL_TIM_ENABLE_IT(&amp;tim4, TIM1_UP_IRQn);</div><div class="notion-text notion-block-741d10563e8d48078d7e4777e1dcb50e">HAL_TIM_Base_Start_DMA(&amp;tim4, (uint32_t*)tim4_dmaBuff, 4);</div><div class="notion-text notion-block-37d2df0748074029af083109bb456dec">}</div><div class="notion-text notion-block-6c5df5d326be4e44a49333b0ea4a2bbf">//定时器 硬件初始化回调函数</div><div class="notion-text notion-block-2ee56cf96fd44af7bb7366f4322966ec">void HAL_TIM_Base_MspInit(TIM_HandleTypeDef *htim)</div><div class="notion-text notion-block-978eaf81909f4f1b8e6e7704b42a1fe3">{</div><div class="notion-text notion-block-e306a98303504ce79ba44cea63e48486">if(htim-&gt;Instance == TIM1){<div class="notion-text-children"><div class="notion-text notion-block-fdb352b808364079905a8454d1cdcae0">__HAL_RCC_TIM1_CLK_ENABLE();                //使能时钟</div><div class="notion-text notion-block-444ccdc47838426e9922b90b8d397c3b">__HAL_RCC_DMA1_CLK_ENABLE();</div></div></div><details class="notion-toggle notion-block-5afb34dd4de64ac2a5c334bad023e2c3"><summary><h4 class="notion-h notion-h3 notion-block-5afb34dd4de64ac2a5c334bad023e2c3" data-id="5afb34dd4de64ac2a5c334bad023e2c3"><span><div id="5afb34dd4de64ac2a5c334bad023e2c3" class="notion-header-anchor"></div><span class="notion-h-title">time.h</span></span></h4></summary><div><div class="notion-text notion-block-46aa39c1f0444a89af5bc51c8d163b2a">#ifndef __TIME_H</div><div class="notion-text notion-block-f64f5871b28047ca92ca7bd5b07337c4">#define __TIME_H</div><div class="notion-text notion-block-83985b7298194cad9c5fbab51d651da0">#include &quot;uart.h&quot;</div><div class="notion-text notion-block-d50ce1d504234ab0bc83c2c1590ee4e0">/<em> 对外声明总控结构体 </em>/</div><div class="notion-text notion-block-eb75efaf00294051b8c30d27bf65c219">extern TIM_HandleTypeDef tim1;</div><div class="notion-text notion-block-8daff4fe37d245a69381dd5122ab7fae">extern TIM_HandleTypeDef tim2;</div><div class="notion-text notion-block-c4cb5c0907b64104b2e7853b26c3b69f">extern TIM_HandleTypeDef tim3;</div><div class="notion-text notion-block-87511744e34f48d98230fff274b1505d">extern TIM_HandleTypeDef tim4;</div><div class="notion-text notion-block-9dbb6c8d78f64edc82b621e96aac792f">extern DMA_HandleTypeDef tim1_dmaup;</div><div class="notion-text notion-block-ab7db1afbdf0483a92634b58bee70b31">extern DMA_HandleTypeDef tim2_dmaup;</div><div class="notion-text notion-block-33278abf6dc9457ca929d7e3a2a4e451">extern DMA_HandleTypeDef tim3_dmaup;</div><div class="notion-text notion-block-42401d9f45284beb9dc2a128e13bc729">extern DMA_HandleTypeDef tim4_dmaup;</div><div class="notion-text notion-block-f9fcf80003e1410b86234990d7e2283f">/<em> 初始化函数 </em>/</div><div class="notion-text notion-block-34d9461826604495911c2500c0ec0dd9">void Timer1_Init(uint16_t arr, uint16_t psc, uint8_t rep);</div><div class="notion-text notion-block-9cfeb118f0e74cce9131bd2dbae9ecd1">void Timer2_Init(uint16_t arr, uint16_t psc);</div><div class="notion-text notion-block-8ee16ff9bc4f41a08ed41f2fbcebf416">void Timer3_Init(uint16_t arr, uint16_t psc);</div><div class="notion-text notion-block-d3389c906ed84848bb1f1f608986fb43">void Timer4_Init(uint16_t arr, uint16_t psc);</div><div class="notion-text notion-block-962ead0341fa48a4aaa910d81874e003">#endif</div></div></details><details class="notion-toggle notion-block-20b35ca0853c4701b423c871441f5884"><summary><h4 class="notion-h notion-h3 notion-block-20b35ca0853c4701b423c871441f5884" data-id="20b35ca0853c4701b423c871441f5884"><span><div id="20b35ca0853c4701b423c871441f5884" class="notion-header-anchor"></div><span class="notion-h-title">stm32f1xx_it.c</span></span></h4></summary><div><div class="notion-text notion-block-f5be6ac42a844509af576739c95aa38f">/<em>-------------------------------------------------</em>/</div><div class="notion-text notion-block-b844a1b867f348e48e99904996e0aeb2">/<em>                                                 </em>/</div><div class="notion-text notion-block-4158658d378b465bbaa697c64d348799">/<em>          实现各种中断服务函数的源文件           </em>/</div><div class="notion-text notion-block-fa90cfac27cf4c73ad239273455e1bd1">/<em>                                                 </em>/</div><div class="notion-text notion-block-bbd423b822ff4e86a98eb4a1a4cda6bf">/<em>-------------------------------------------------</em>/</div><div class="notion-text notion-block-d00b5d1855f541feacf30aeac3cbaf2e">#include &quot;stm32f1xx_hal.h&quot;   </div><div class="notion-text notion-block-e3fafd232ebd437ab45eb18de89fa9d9">#include &quot;stm32f1xx_it.h&quot;</div><div class="notion-text notion-block-026a62a4040547099c3d5a784ae9ca1c">#include &quot;uart.h&quot;</div><div class="notion-text notion-block-5f863a4ef30b4272b528ae651b334146">#include &quot;time.h&quot;</div><div class="notion-text notion-block-02aecfe75a704f60aa07ddb0897ee82f">void EXTI15_10_IRQHandler(void)</div><div class="notion-text notion-block-e6dba28381804073b34b3e590203b910">{<div class="notion-text-children"><div class="notion-text notion-block-6507741a0ab14c2e9f48b9272f86b555">HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_14);</div></div></div><div class="notion-text notion-block-26588cff947e4938b5e4d4e9f8aa002d">}</div><div class="notion-text notion-block-30a1f6c48da34cf2ad7133ec808d5625">void EXTI0_IRQHandler(void)</div><div class="notion-text notion-block-c96a696f3d30437488b82f2d0ea63b40">{<div class="notion-text-children"><div class="notion-text notion-block-92ca335e40184419a0860b12d8212e96">HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_0);</div></div></div><div class="notion-text notion-block-e9f6ca0a1f29483ca32a5c94cc5436dc">}</div><div class="notion-text notion-block-b8f38032691e443c8e2cb80e19362486">void USART1_IRQHandler(void)</div><div class="notion-text notion-block-e0649e6ee41742e09ebf8f87d497d3a8">{<div class="notion-text-children"><div class="notion-text notion-block-22701dfc23154746986b506e41fcc6da">HAL_UART_IRQHandler(&amp;uart1.uart);</div><div class="notion-text notion-block-67075749425246548e5e0428b74e37c2">if(__HAL_UART_GET_FLAG(&amp;uart1.uart, UART_FLAG_IDLE)){<div class="notion-text-children"><div class="notion-text notion-block-6615695aa3da4b7e9b7592e0f2aabf8c">__HAL_UART_CLEAR_IDLEFLAG(&amp;uart1.uart);</div><div class="notion-text notion-block-6c8a0331114a4c98b838a91a6b364a01">uart1.RxCounter += (U1_RX_MAX - __HAL_DMA_GET_COUNTER(&amp;uart1.dmarx));</div><div class="notion-text notion-block-d2bf61a46d4d4d8d95757ed2a9e4b146">HAL_UART_AbortReceive_IT(&amp;uart1.uart);</div></div></div><div class="notion-text notion-block-62e52b0669ef47d8ad8fba463376f3d7">}</div></div></div><div class="notion-text notion-block-4f20c153d6fd4dfba729bc0ecf3c9f9a">}</div><div class="notion-text notion-block-c24013bc3f214dcebf1ccf995eadfb3b">void USART2_IRQHandler(void)</div><div class="notion-text notion-block-069faee65269456dbeaf3f233e1ddda7">{<div class="notion-text-children"><div class="notion-text notion-block-8b97e3d96e0a47b4a90c5f1acf0f2ed1">HAL_UART_IRQHandler(&amp;uart2.uart);</div><div class="notion-text notion-block-0fac009caabb41fdaa481378aab2bb1e">if(__HAL_UART_GET_FLAG(&amp;uart2.uart, UART_FLAG_IDLE)){<div class="notion-text-children"><div class="notion-text notion-block-fe503704047549caaeff487d088af63f">__HAL_UART_CLEAR_IDLEFLAG(&amp;uart2.uart);</div><div class="notion-text notion-block-26bb62db6ace4d76967f35f1c465fa87">uart2.RxCounter += (U2_RX_MAX - __HAL_DMA_GET_COUNTER(&amp;uart2.dmarx));</div><div class="notion-text notion-block-95d180cf244443e690e997f5efb31f38">HAL_UART_AbortReceive_IT(&amp;uart2.uart);</div></div></div><div class="notion-text notion-block-fd8a353b0a0b49f892ed7c30d6ea2a9d">}</div></div></div><div class="notion-text notion-block-313e8cd87bc94b3ab431146923635c0e">}</div><div class="notion-text notion-block-5fe3148cfa43413d81b8da2ecd375fc8">void USART3_IRQHandler(void)</div><div class="notion-text notion-block-217ccbedc08045e689ee291bd982559e">{<div class="notion-text-children"><div class="notion-text notion-block-c70ce26b8d1241f088697d272a397b34">HAL_UART_IRQHandler(&amp;uart3.uart);</div><div class="notion-text notion-block-007c5fc69df94e01bddafe617dbcbafb">if(__HAL_UART_GET_FLAG(&amp;uart3.uart, UART_FLAG_IDLE)){<div class="notion-text-children"><div class="notion-text notion-block-9477dbbcc293400983a096b45edf61a9">__HAL_UART_CLEAR_IDLEFLAG(&amp;uart3.uart);</div><div class="notion-text notion-block-4dee87f79e8346f3a8d6726f4f7d3602">uart3.RxCounter += (U3_RX_MAX - __HAL_DMA_GET_COUNTER(&amp;uart3.dmarx));</div><div class="notion-text notion-block-d97f3a851b1048f598dbfc7609fdc5e3">HAL_UART_AbortReceive_IT(&amp;uart3.uart);</div></div></div><div class="notion-text notion-block-1b26a0274c654c96b0441ed6baea2bb9">}</div></div></div><div class="notion-text notion-block-6d7fecbccc384a6caf95a460f8736343">}</div><div class="notion-text notion-block-48db3234828449b09543918c43951263">void DMA1_Channel4_IRQHandler(void)</div><div class="notion-text notion-block-12aba2a35fc04952b954d758cae5ed0d">{<div class="notion-text-children"><div class="notion-text notion-block-8030af219a074300b9e5cecd4e3f7a75">HAL_DMA_IRQHandler(&amp;uart1.dmatx);</div></div></div><div class="notion-text notion-block-434ef8189d2b47b2afa86bb743bc01db">}</div><div class="notion-text notion-block-a783e039bcfd4817a446327b146577db">//void DMA1_Channel5_IRQHandler(void)</div><div class="notion-text notion-block-2ea063a2e2d6422f8ef179f4765b3c2d">//{</div><div class="notion-text notion-block-cd9b4ba5a93940208e758c8f0b2f4013">//    HAL_DMA_IRQHandler(&amp;uart1.dmarx);</div><div class="notion-text notion-block-e8342f3de45342a8bd39910df3f380f5">//}</div><div class="notion-text notion-block-a00e9eae206745949dabeab6ddef1e30">//void DMA1_Channel7_IRQHandler(void)</div><div class="notion-text notion-block-032af9dcd3834aaa949343fdfd7e019b">//{</div><div class="notion-text notion-block-34816e9df98d4fe8abfc4c7801bff83e">//    HAL_DMA_IRQHandler(&amp;uart2.dmatx);</div><div class="notion-text notion-block-237f5cf25b874afa80b3c8142a41f71c">//}</div><div class="notion-text notion-block-86cdfaf055674592a7b2c4799ce1e4ec">void DMA1_Channel6_IRQHandler(void)</div><div class="notion-text notion-block-462362edd45f44b29ce7901dfe4a86cb">{<div class="notion-text-children"><div class="notion-text notion-block-242438d21cf44e399ef5db5735ecfc59">HAL_DMA_IRQHandler(&amp;uart2.dmarx);</div></div></div><div class="notion-text notion-block-f4088858d94f427799118651ca0f41bc">}</div><div class="notion-text notion-block-695fc801e0bc4bf0ab7ad3d962f577b3">//void DMA1_Channel2_IRQHandler(void)</div><div class="notion-text notion-block-6a479f5ee556467d83f7256a88434d6c">//{</div><div class="notion-text notion-block-d637c4e1a0504ad7a85efdc06ca04a98">//    HAL_DMA_IRQHandler(&amp;uart3.dmatx);</div><div class="notion-text notion-block-6b2e8e9a1822432eb54dd038ee5edac9">//}</div><div class="notion-text notion-block-99e5476bcfc54d7d820e575fa0991bd2">//void DMA1_Channel3_IRQHandler(void)</div><div class="notion-text notion-block-7b2347d3e02c49398f3315534645477b">//{</div><div class="notion-text notion-block-afadb088f9d247aba946cd0e2a70ea04">//    HAL_DMA_IRQHandler(&amp;uart3.dmarx);</div><div class="notion-text notion-block-f21a34adae8f40919485638f50707188">//}</div><div class="notion-text notion-block-70ba4845faaa454e97fd54ad8c9ec18f">void DMA1_Channel5_IRQHandler(void)</div><div class="notion-text notion-block-989b31376f4940919b5af00a07ab2035">{<div class="notion-text-children"><div class="notion-text notion-block-4c3cdcfc4e194bb2b93fddb7422e8c59">HAL_DMA_IRQHandler(&amp;tim1_dmaup);</div></div></div><div class="notion-text notion-block-aa826b2030234d4b8222b5cb36a5cc9f">}</div><div class="notion-text notion-block-89100eace6834f2c839d12035f12e982">void DMA1_Channel2_IRQHandler(void)</div><div class="notion-text notion-block-05da3787b3f94ef49f1f2b7325e42675">{<div class="notion-text-children"><div class="notion-text notion-block-1fae9aae1ca545d3a8a83cb4fa450789">HAL_DMA_IRQHandler(&amp;tim2_dmaup);</div></div></div><div class="notion-text notion-block-4e4c46f0ff8a49aabe3ec7057dcbaff2">}</div><div class="notion-text notion-block-8d68043e9e1f4a858c76f0c13919daad">void DMA1_Channel3_IRQHandler(void)</div><div class="notion-text notion-block-bd3363641b454fb8aa28fe6147037df8">{<div class="notion-text-children"><div class="notion-text notion-block-6939d76b447f48b5a6cd3d4ce2a9f551">HAL_DMA_IRQHandler(&amp;tim3_dmaup);</div></div></div><div class="notion-text notion-block-6364e769dba34f6bbd3c0de597dfcb42">}</div><div class="notion-text notion-block-3731f75c38f543598fa373403cac9ca4">void DMA1_Channel7_IRQHandler(void)</div><div class="notion-text notion-block-20cb7dc69bce42c7b7be80ab38dae6d5">{<div class="notion-text-children"><div class="notion-text notion-block-758c13a8d6e646a483f83259892739aa">HAL_DMA_IRQHandler(&amp;tim4_dmaup);</div></div></div><div class="notion-text notion-block-0288b5efd36c4e1a860ca3a2c136cc50">}</div><div class="notion-text notion-block-07406cbcbe6f4a13809515a36678925b">void TIM1_UP_IRQHandler(void)</div><div class="notion-text notion-block-ec249387237b4ae2b6a1a25c6e5a9701">{<div class="notion-text-children"><div class="notion-text notion-block-83214a62db164421bc9eb8f4b1803353">HAL_TIM_IRQHandler(&amp;tim1);</div></div></div><div class="notion-text notion-block-ef1c509177ef4f9a8e74babc3fbccf05">}</div><div class="notion-text notion-block-d5ae8b6cfb454478b5c2512ead2782fe">void TIM2_IRQHandler(void)</div><div class="notion-text notion-block-313ef997cf0b4c2697885c479df355f1">{<div class="notion-text-children"><div class="notion-text notion-block-307db5cce1324cab923d015827a196b6">HAL_TIM_IRQHandler(&amp;tim2);</div></div></div><div class="notion-text notion-block-cb9228cb17cf419ab1506845340c230d">}</div><div class="notion-text notion-block-f2e621f72b614d929004ab95ac4b201b">void TIM3_IRQHandler(void)</div><div class="notion-text notion-block-e438dc672d2442abb5cbffae3ca1fdee">{<div class="notion-text-children"><div class="notion-text notion-block-415cc34a712c4a6da6d5cbe9f99de575">HAL_TIM_IRQHandler(&amp;tim3);</div></div></div><div class="notion-text notion-block-e08e21bfab2f4d709054e24774b15011">}</div><div class="notion-text notion-block-03c4b37d39634dbdb265753ac87f52d1">void TIM4_IRQHandler(void)</div><div class="notion-text notion-block-2618ffc040fa48a687865b5bce9f48fa">{<div class="notion-text-children"><div class="notion-text notion-block-c5014867cad248058a51ed8bb3943908">HAL_TIM_IRQHandler(&amp;tim4);</div></div></div><div class="notion-text notion-block-0d66f5e9816748a180819f9d20365348">}</div><div class="notion-text notion-block-223794ba3bea4bc4bd0b3c3c7df1e988">/<em>-------------------------------------------------</em>/</div><div class="notion-text notion-block-dcf19c8be88d4c76a4a60d4559a5ada5">/<em>函数名：不可屏蔽中断处理函数                     </em>/</div><div class="notion-text notion-block-f299260b1647435bbb807563213bc523">/<em>参  数：无                                       </em>/</div><div class="notion-text notion-block-16f7bf3318db4dc5bd293f483adcc977">/<em>返回值：无                                       </em>/</div><div class="notion-text notion-block-bece9bba58dc4b2cb64a3855b3f629bf">/<em>-------------------------------------------------</em>/</div><div class="notion-text notion-block-892e39c5f8ac4cd29da3c432bd8eeabc">void NMI_Handler(void)</div><div class="notion-text notion-block-31fdf1aabb8a4a4db25c3ec4007e90b3">{</div><div class="notion-text notion-block-f1d510d6952a41d895ffffc35ffbc09d">}</div><div class="notion-text notion-block-9350b4bfff1c4c48a4a3b22919eea438">/<em>-------------------------------------------------</em>/</div><div class="notion-text notion-block-3670f645773743d88ecb72f7f7f295a9">/<em>函数名：硬件出错后进入的中断处理函数             </em>/</div><div class="notion-text notion-block-4c64917ad905497d824a6baeedf80a66">/<em>参  数：无                                       </em>/</div><div class="notion-text notion-block-79975b12830a40018688a2d8218f8a3e">/<em>返回值：无                                       </em>/</div><div class="notion-text notion-block-0e5b3626f5c84f938b60338b301074fb">/<em>-------------------------------------------------</em>/</div><div class="notion-text notion-block-4d8b7244037745e59171fe01eeda7d34">void HardFault_Handler(void)</div><div class="notion-text notion-block-32d63868db1a4a18a3d0c0a331166678">{</div><div class="notion-text notion-block-a28a6d6be94e45d982c7f0d64ff73257">}</div><div class="notion-text notion-block-bca39f35e1654cccba637e165833a3ea">/<em>-------------------------------------------------</em>/</div><div class="notion-text notion-block-35ee6e5d1a984178b1450c148b0f32bd">/<em>函数名：软中断，SWI 指令调用的处理函数           </em>/</div><div class="notion-text notion-block-5cb31840cbe545f5b388f0dc88195d1f">/<em>参  数：无                                       </em>/</div><div class="notion-text notion-block-286ac7e487174a7ea2c75a7fbd5fac4d">/<em>返回值：无                                       </em>/</div><div class="notion-text notion-block-5bc2e184e87e4e4faf1bbf3d252970bb">/<em>-------------------------------------------------</em>/</div><div class="notion-text notion-block-3c7e36a359e54723a98141e1e3a10bcb">void SVC_Handler(void)</div><div class="notion-text notion-block-9898e626f51a44c9b891c10d0f853c0a">{</div><div class="notion-text notion-block-1f261164226a48a089150c976d75a16b">}</div><div class="notion-text notion-block-02c10139a8ec45ac96875abfbaeabfb7">/<em>-------------------------------------------------</em>/</div><div class="notion-text notion-block-6c9343ca32d3450daf03d282790bc3c9">/<em>函数名：可挂起的系统服务处理函数                 </em>/</div><div class="notion-text notion-block-aaa23fe373fb4e43856bccca0cab987a">/<em>参  数：无                                       </em>/</div><div class="notion-text notion-block-f851420eeda541b29a6990c05dbe7804">/<em>返回值：无                                       </em>/</div><div class="notion-text notion-block-9ee017df0a384fd4bff619fefe621682">/<em>-------------------------------------------------</em>/</div><div class="notion-text notion-block-e8fec7a658c243139504071eee8b10c4">void PendSV_Handler(void)</div><div class="notion-text notion-block-3048c47746b741359600cae9fb611292">{</div><div class="notion-text notion-block-6b59d97936fe4d35ac3c90cdef96d2c6">}</div><div class="notion-text notion-block-006722cff60f4b8fb9f1b897e4e87f25">/<em>-------------------------------------------------</em>/</div><div class="notion-text notion-block-a2f42df8a11b4d5685ab87e2fc1fa72b">/<em>函数名：SysTic系统嘀嗒定时器处理函数             </em>/</div><div class="notion-text notion-block-a4ef920b5dcb48eaaaa1fb3b8042a54b">/<em>参  数：无                                       </em>/</div><div class="notion-text notion-block-16aec726b98e4932a38810f6f8fb055f">/<em>返回值：无                                       </em>/</div><div class="notion-text notion-block-0ab3053cab1845bc915b61204f75a640">/<em>-------------------------------------------------</em>/</div><div class="notion-text notion-block-08c14c7f581644bf997ec46da8a5f1db">void SysTick_Handler(void)</div><div class="notion-text notion-block-8da9df3c9d5142869ef62742cbf267d2">{  <div class="notion-text-children"><div class="notion-text notion-block-9c73cc4417e44584827db8c7e2a91fa4">HAL_IncTick();	</div></div></div><div class="notion-text notion-block-7998be141cbd47bcb7a5c54b62a106f2">}</div><details class="notion-toggle notion-block-e8947a2ccf15439c8f15b293c110c244"><summary><h4 class="notion-h notion-h3 notion-block-e8947a2ccf15439c8f15b293c110c244" data-id="e8947a2ccf15439c8f15b293c110c244"><span><div id="e8947a2ccf15439c8f15b293c110c244" class="notion-header-anchor"></div><span class="notion-h-title">main.c</span></span></h4></summary><div><div class="notion-text notion-block-fbd4772b64f144b5addf03b39ef04228">#include &quot;stm32f1xx_hal.h&quot;</div><div class="notion-text notion-block-d5f519a6bed8491a8e9d88a94e4b7ca0">#include &quot;rcc.h&quot;</div><div class="notion-text notion-block-bafbf78332f247f8a06aa6779e69baff">#include &quot;led.h&quot;</div><div class="notion-text notion-block-6b36e743817f41d0ba884f24b9cfe61d">#include &quot;sw.h&quot;</div><div class="notion-text notion-block-f588e3ffec354077981edd3c2402a270">#include &quot;uart.h&quot;</div><div class="notion-text notion-block-bbb4524c57ac4fb9bc24f6557ccc64da">#include &quot;time.h&quot;</div><div class="notion-text notion-block-c0094aeaec134aed8b9e02cdb00ca2fc">int main(void){<div class="notion-text-children"><div class="notion-text notion-block-f9ce9ea0ecb6445aaa4e06d1916b9844">HAL_Init();</div><div class="notion-text notion-block-9720123bb5df4d0aaefbb540168fe075">RccClock_Init();</div><div class="notion-text notion-block-e5c1ff37fa6c4cd493cf2e8e69b67d33">U1_Init(921600);</div><div class="notion-text notion-block-7f74479a14d64573800e77eb5500eb03">Timer1_Init(10000 - 1, 7200 - 1, 1 - 1);   // 72000000/7200/10000  =  1s</div><div class="notion-text notion-block-d92a0c0a3f2f40fab5035fdb7827b3d5">Timer2_Init(10000 - 1, 7200 - 1);   // 1s</div><div class="notion-text notion-block-b790fbf3f9c04a8ca10a3829eddccfbf">Timer3_Init(10000 - 1, 7200 - 1);   // 1s</div><div class="notion-text notion-block-fabb2b0251044d81bc2466fd45d21540">Timer4_Init(10000 - 1, 7200 - 1);   // 1s</div></div></div><div class="notion-text notion-block-2cd93a1f643f410f96bbdcfe1c39f1d4">//    uint16_t time1 = 0;</div><div class="notion-text notion-block-e80aaba9843b41409f7e1bfb81e160a9">//    uint16_t time2 = 0;</div><div class="notion-text notion-block-a5ffbc5f339e4f268c730f35d33226f9">//    uint16_t time3 = 0;</div><div class="notion-text notion-block-755481a5638748d48b7fdaea8f01e27c">//    uint16_t time4 = 0;<div class="notion-text-children"><div class="notion-text notion-block-f6a889170ad645f59abe7bc59ab02820">while(1){<div class="notion-text-children"><div class="notion-text notion-block-20c9936678374159b459972d6709d76a">/<em> 获取更新标志位 </em>/</div></div></div></div></div><div class="notion-text notion-block-4f6397f22a4f47d89e25e91d884bda4b">//        if(__HAL_TIM_GET_FLAG(&amp;tim1, TIM_FLAG_UPDATE)){</div><div class="notion-text notion-block-089b7ee4fdc445a9833f63c7f7a166ce">//            __HAL_TIM_CLEAR_FLAG(&amp;tim1, TIM_FLAG_UPDATE);   ///清除标志位</div><div class="notion-text notion-block-4e37f08d4c00483f8da421216f2aaa8a">//            U1_Printf(&quot;定时器 1 定时时间:%drn&quot;,time1++);</div><div class="notion-text notion-block-968604abaad94fa5b41baddc4a08cd60">//        }</div><div class="notion-text notion-block-156905931cfc411c869b2c861da6fb7a">//        </div><div class="notion-text notion-block-3a59fb340c544be992eb2b69a55af3fd">//        if(__HAL_TIM_GET_FLAG(&amp;tim2, TIM_FLAG_UPDATE)){</div><div class="notion-text notion-block-aec1524f221b4d059301e79345ccb482">//            __HAL_TIM_CLEAR_FLAG(&amp;tim2, TIM_FLAG_UPDATE);</div><div class="notion-text notion-block-ab77d5f8cbec46bd9cdeff55e62eec7f">//            U1_Printf(&quot;定时器 2 定时时间:%drn&quot;,time2++);</div><div class="notion-text notion-block-4c25118b859149d49f35f1c4e8cbf018">//        }</div><div class="notion-text notion-block-1e96106b6f054f47b6578fe9e1c4bd29">//        </div><div class="notion-text notion-block-5f9992657414418397affece244958ad">//        if(__HAL_TIM_GET_FLAG(&amp;tim3, TIM_FLAG_UPDATE)){</div><div class="notion-text notion-block-2b2c2d7139cb436e8a31c40be01c04ca">//            __HAL_TIM_CLEAR_FLAG(&amp;tim3, TIM_FLAG_UPDATE);</div><div class="notion-text notion-block-67782d78609f4b3786ed114cfffeb817">//            U1_Printf(&quot;定时器 3 定时时间:%drn&quot;,time3++);</div><div class="notion-text notion-block-b292090634474e82a2935a811b5d8ae1">//        }</div><div class="notion-text notion-block-0ccadca71c494e15a4263159d8a4d039">//        </div><div class="notion-text notion-block-f083bc31ab1946f4939e66e22bc2828a">//        if(__HAL_TIM_GET_FLAG(&amp;tim4, TIM_FLAG_UPDATE)){</div><div class="notion-text notion-block-c636d01e5eb24c698870fe4493c304d0">//            __HAL_TIM_CLEAR_FLAG(&amp;tim4, TIM_FLAG_UPDATE);</div><div class="notion-text notion-block-20f843d0f017445e8f91aceb0860afbd">//            U1_Printf(&quot;定时器 4 定时时间:%drn&quot;,time4++);</div><div class="notion-text notion-block-628dba337aaf413fa9dc1ab348391376">//        }<div class="notion-text-children"><div class="notion-text notion-block-4143381f8f6943baaa76f09382b4682a">}</div></div></div><div class="notion-text notion-block-9cc4878b42514d0e97f707f4ee52ab7f">}</div></div></details></div></details></div></details></main></div>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Python学习]]></title>
            <link>https://www.mcoi.top/article/Post-Python-study</link>
            <guid>https://www.mcoi.top/article/Post-Python-study</guid>
            <pubDate>Tue, 22 Oct 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[潜学一下，让我能看懂python]]></description>
            <content:encoded><![CDATA[<div id="notion-article" class="mx-auto overflow-hidden "><main class="notion light-mode notion-page notion-block-2a9e940c69bb80b8b08ce9a41c6cf8af"><div class="notion-viewport"></div><div class="notion-collection-page-properties"></div><div class="notion-callout notion-gray_background_co notion-block-2a9e940c69bb80898957e07c27a7432d"><div class="notion-page-icon-inline notion-page-icon-span"><span class="notion-page-icon" role="img" aria-label="😀">😀</span></div><div class="notion-callout-text">一个简单的开头,潜学一下，让我能看懂python</div></div><h2 class="notion-h notion-h1 notion-h-indent-0 notion-block-2a9e940c69bb80a781f6ed517b3d93f3" data-id="2a9e940c69bb80a781f6ed517b3d93f3"><span><div id="2a9e940c69bb80a781f6ed517b3d93f3" class="notion-header-anchor"></div><a class="notion-hash-link" href="#2a9e940c69bb80a781f6ed517b3d93f3" title="一、Python基础语法"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">一、Python基础语法</span></span></h2><div class="notion-text notion-block-2a9e940c69bb80c0b5c6f3ac9df3caad">在python中，变量是没有类型的，变量存储的数据是有类型的</div><div class="notion-text notion-block-2a9e940c69bb800a9da5ea6c05fc5b8e">可以把变量当做一个存放物品的盒子</div><details class="notion-toggle notion-block-2a9e940c69bb800e96ace2555f896556"><summary><h3 class="notion-h notion-h2 notion-h-indent-1 notion-block-2a9e940c69bb800e96ace2555f896556" data-id="2a9e940c69bb800e96ace2555f896556"><span><div id="2a9e940c69bb800e96ace2555f896556" class="notion-header-anchor"></div><span class="notion-h-title">一、字面量</span></span></h3></summary><div><div class="notion-text notion-block-2a9e940c69bb8051bb11c39638a7c196">字面量：在代码中，<b>被写下来</b>的 <b>固定的值</b></div><details class="notion-toggle notion-block-dec65785419e44d9aa8f3023c7a4dca8"><summary><h4 class="notion-h notion-h3 notion-block-dec65785419e44d9aa8f3023c7a4dca8" data-id="dec65785419e44d9aa8f3023c7a4dca8"><span><div id="dec65785419e44d9aa8f3023c7a4dca8" class="notion-header-anchor"></div><span class="notion-h-title">python中常见的值的类型</span></span></h4></summary><div><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-bc2f7d7bdcda4de4a5ccd9a7d4b859cd"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:100%;max-width:100%;flex-direction:column"><img style="object-fit:cover" src="https://cdn.jsdmirror.com/gh/LZJ-I/picx-images-hosting@main/images/%E8%AF%AD%E8%A8%80%E4%B8%8E%E7%AE%97%E6%B3%95/Post-Python-study/94cd929e-566e-4f7c-9147-6a90c2266057.webp?spaceId=3a565fcb-f425-4846-b72a-d32a98183896&amp;t=bc2f7d7b-dcda-4de4-a5cc-d9a7d4b859cd" alt="notion image" loading="lazy" decoding="async"/></div></figure><div class="notion-text notion-block-f64375559bd64dc785fa3c8c64a29753">)</div></div></details></div></details><details class="notion-toggle notion-block-2a9e940c69bb8031bb1ad4190306f5c9"><summary><h3 class="notion-h notion-h2 notion-h-indent-1 notion-block-2a9e940c69bb8031bb1ad4190306f5c9" data-id="2a9e940c69bb8031bb1ad4190306f5c9"><span><div id="2a9e940c69bb8031bb1ad4190306f5c9" class="notion-header-anchor"></div><span class="notion-h-title">二、注释</span></span></h3></summary><div></div></details><details class="notion-toggle notion-block-2a9e940c69bb800898aced3b4be0545e"><summary><h3 class="notion-h notion-h2 notion-h-indent-1 notion-block-2a9e940c69bb800898aced3b4be0545e" data-id="2a9e940c69bb800898aced3b4be0545e"><span><div id="2a9e940c69bb800898aced3b4be0545e" class="notion-header-anchor"></div><span class="notion-h-title">三、变量</span></span></h3></summary><div><div class="notion-text notion-block-2a9e940c69bb804db838c8ae557d9353">变量：<b>在程序运行时</b>，能<b>储存</b>计算结果 或 能<b>表示值</b>的抽象概念简单的说，</div></div></details><div class="notion-text notion-block-14b4136c489247f288c52ec48b8dba8d">变量就是在程序运行时，记录数据用的<div class="notion-text-children"><ol start="1" class="notion-list notion-list-numbered notion-block-b91059de23b149609f269065f4e7599b" style="list-style-type:decimal"><li>print</li><ol class="notion-list notion-list-numbered notion-block-b91059de23b149609f269065f4e7599b" style="list-style-type:lower-alpha"><ul class="notion-list notion-list-disc notion-block-f357988028cd47fc8895472b13b01765"><li>可以通过 ， 输出多个变量</li></ul></ol></ol><ol start="2" class="notion-list notion-list-numbered notion-block-4f46b1b1b7e04de1a0ec1a4872c4cdf0" style="list-style-type:decimal"><li>type() </li><ol class="notion-list notion-list-numbered notion-block-4f46b1b1b7e04de1a0ec1a4872c4cdf0" style="list-style-type:lower-alpha"><ul class="notion-list notion-list-disc notion-block-f1e451369692439aa15707f0a8acac77"><li>返回  变量类型</li></ul></ol></ol><ol start="3" class="notion-list notion-list-numbered notion-block-87903d77ccb446f1bfafd2d72417f454" style="list-style-type:decimal"><li>数据类型转换</li><ol class="notion-list notion-list-numbered notion-block-87903d77ccb446f1bfafd2d72417f454" style="list-style-type:lower-alpha"><ul class="notion-list notion-list-disc notion-block-123c5e3fee654686b77833d904e722eb"><li><code class="notion-inline-code">str()</code></li></ul><ul class="notion-list notion-list-disc notion-block-4412c8c39dd84b0c8edbe7c0d360926f"><li><code class="notion-inline-code">float()</code></li></ul><ul class="notion-list notion-list-disc notion-block-139e61a57bcc4c728ab4f78eb7283e60"><li><code class="notion-inline-code">int()</code></li></ul><ul class="notion-list notion-list-disc notion-block-b731423dcac5444c8c66379dde6e5430"><li>任何内容都可以转换为字符串</li></ul><ul class="notion-list notion-list-disc notion-block-0e8eb1f658884b87b2d634c9bd8f722a"><li>字符串要转换为int或float类型，需要确保字符串中的内容只有数字</li></ul></ol></ol></div></div><details class="notion-toggle notion-block-2a9e940c69bb80a28d78dd3f5a8ae35a"><summary><h3 class="notion-h notion-h2 notion-h-indent-1 notion-block-2a9e940c69bb80a28d78dd3f5a8ae35a" data-id="2a9e940c69bb80a28d78dd3f5a8ae35a"><span><div id="2a9e940c69bb80a28d78dd3f5a8ae35a" class="notion-header-anchor"></div><span class="notion-h-title">四、标识符</span></span></h3></summary><div><ol start="1" class="notion-list notion-list-numbered notion-block-2a9e940c69bb809f8574e4892d64f088" style="list-style-type:decimal"><li>标识符命名：只能出现 英文中文数字下划线</li><ol class="notion-list notion-list-numbered notion-block-2a9e940c69bb809f8574e4892d64f088" style="list-style-type:lower-alpha"><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb80c09fa5c1cb82ba800d"><li><b>不推荐</b>使用中文</li></ul><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb80a5bfdbe1b5b35595ca"><li>数字<b>不能作为开头</b></li></ul></ol></ol><ol start="2" class="notion-list notion-list-numbered notion-block-2a9e940c69bb80718395f6e6f752c2fb" style="list-style-type:decimal"><li>标识符大小写敏感</li></ol><ol start="3" class="notion-list notion-list-numbered notion-block-2a9e940c69bb807181e2f1de7ec312d4" style="list-style-type:decimal"><li>不可占用关键字</li><ol class="notion-list notion-list-numbered notion-block-2a9e940c69bb807181e2f1de7ec312d4" style="list-style-type:lower-alpha"><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-a269fd49582c4788b3da4483e87a1e9f"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:100%;max-width:100%;flex-direction:column"><img style="object-fit:cover" src="https://cdn.jsdmirror.com/gh/LZJ-I/picx-images-hosting@main/images/%E8%AF%AD%E8%A8%80%E4%B8%8E%E7%AE%97%E6%B3%95/Post-Python-study/a93c2343-7289-4f15-aa78-54f5a4af0f06.webp?spaceId=3a565fcb-f425-4846-b72a-d32a98183896&amp;t=a269fd49-582c-4788-b3da-4483e87a1e9f" alt="notion image" loading="lazy" decoding="async"/></div></figure></ol></ol></div></details><details class="notion-toggle notion-block-2a9e940c69bb80d69a19d3ea88969402"><summary><h3 class="notion-h notion-h2 notion-h-indent-1 notion-block-2a9e940c69bb80d69a19d3ea88969402" data-id="2a9e940c69bb80d69a19d3ea88969402"><span><div id="2a9e940c69bb80d69a19d3ea88969402" class="notion-header-anchor"></div><span class="notion-h-title">五、运算符</span></span></h3></summary><div><ol start="1" class="notion-list notion-list-numbered notion-block-2a9e940c69bb80f09acace3624aa9ea0" style="list-style-type:decimal"><li><b>算数运算符</b></li><ol class="notion-list notion-list-numbered notion-block-2a9e940c69bb80f09acace3624aa9ea0" style="list-style-type:lower-alpha"><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-9dbc17ee536e426f9318d8055bce1320"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:100%;max-width:100%;flex-direction:column"><img style="object-fit:cover" src="https://cdn.jsdmirror.com/gh/LZJ-I/picx-images-hosting@main/images/%E8%AF%AD%E8%A8%80%E4%B8%8E%E7%AE%97%E6%B3%95/Post-Python-study/668d80c8-44bf-4bd1-8ad5-9da22e2a55c8.webp?spaceId=3a565fcb-f425-4846-b72a-d32a98183896&amp;t=9dbc17ee-536e-426f-9318-d8055bce1320" alt="notion image" loading="lazy" decoding="async"/></div></figure></ol></ol><ol start="2" class="notion-list notion-list-numbered notion-block-2a9e940c69bb8009ad0eee114804a252" style="list-style-type:decimal"><li>赋值运算符</li><ol class="notion-list notion-list-numbered notion-block-2a9e940c69bb8009ad0eee114804a252" style="list-style-type:lower-alpha"><div class="notion-text notion-block-2a9e940c69bb800cbe59dd441530f2de">=</div></ol></ol><ol start="3" class="notion-list notion-list-numbered notion-block-2a9e940c69bb80d286b5f71c023bb843" style="list-style-type:decimal"><li>复合赋值运算符</li><ol class="notion-list notion-list-numbered notion-block-2a9e940c69bb80d286b5f71c023bb843" style="list-style-type:lower-alpha"><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-710e97a87d05434593be321da5221ed2"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:100%;max-width:100%;flex-direction:column"><img style="object-fit:cover" src="https://cdn.jsdmirror.com/gh/LZJ-I/picx-images-hosting@main/images/%E8%AF%AD%E8%A8%80%E4%B8%8E%E7%AE%97%E6%B3%95/Post-Python-study/0ec53921-8630-4397-b4ec-c2470ff9afc4.webp?spaceId=3a565fcb-f425-4846-b72a-d32a98183896&amp;t=710e97a8-7d05-4345-93be-321da5221ed2" alt="notion image" loading="lazy" decoding="async"/></div></figure></ol></ol></div></details><details class="notion-toggle notion-block-2a9e940c69bb8006a760c1b51c364311"><summary><h3 class="notion-h notion-h2 notion-h-indent-1 notion-block-2a9e940c69bb8006a760c1b51c364311" data-id="2a9e940c69bb8006a760c1b51c364311"><span><div id="2a9e940c69bb8006a760c1b51c364311" class="notion-header-anchor"></div><span class="notion-h-title">六、字符串扩展</span></span></h3></summary><div><details class="notion-toggle notion-block-addaa6fc360d493eaf8718e6d54aedfc"><summary><h4 class="notion-h notion-h3 notion-block-addaa6fc360d493eaf8718e6d54aedfc" data-id="addaa6fc360d493eaf8718e6d54aedfc"><span><div id="addaa6fc360d493eaf8718e6d54aedfc" class="notion-header-anchor"></div><span class="notion-h-title">1. 字符串的定义</span></span></h4></summary><div><div class="notion-text notion-block-f2e940e85b154623ae2f794d512c2d1e">在Python中支持三种字符串的定义</div><ol start="1" class="notion-list notion-list-numbered notion-block-441318c19ec847888bf2a309fc853f68" style="list-style-type:decimal"><li>单引号定义法:  name = ‘你好’</li></ol><ol start="2" class="notion-list notion-list-numbered notion-block-1c41ec0982b14e96a90b3758d2715b48" style="list-style-type:decimal"><li>双引号定义法:  name = “”你好””</li></ol><ol start="3" class="notion-list notion-list-numbered notion-block-d4ff65a8a89b4de4bc6fc0cec31b19af" style="list-style-type:decimal"><li>三引号定义法:  name = “””你好”””</li><ol class="notion-list notion-list-numbered notion-block-d4ff65a8a89b4de4bc6fc0cec31b19af" style="list-style-type:lower-alpha"><ul class="notion-list notion-list-disc notion-block-774a3a54532b44a99d4384859f960b8d"><li>三引号定义法，和多行注释的写法一样，同样支持换行操作.</li></ul><ul class="notion-list notion-list-disc notion-block-ce896044acaa46078251e84900fc44c6"><li><b>使用变量接收它，它就是字符串</b></li></ul><ul class="notion-list notion-list-disc notion-block-59270b58ea1d4a51b250ac2211b7e652"><li>不使用变量接收它，就可以作为多行注释使用，</li></ul></ol></ol><ol start="4" class="notion-list notion-list-numbered notion-block-c6fec454c6b94e698547dbf1f6c15767" style="list-style-type:decimal"><li>要定义的字符串本身，是包含:单引号、双引号自身</li><ol class="notion-list notion-list-numbered notion-block-c6fec454c6b94e698547dbf1f6c15767" style="list-style-type:lower-alpha"><ul class="notion-list notion-list-disc notion-block-5899d9280a6d4aff88fb29300d2f8046"><li>单引号定义法，可以内含双引号</li></ul><ul class="notion-list notion-list-disc notion-block-20d5d7ba6af84951851bb4b86d928479"><li>双引号定义法，可以内含单引号</li></ul><ul class="notion-list notion-list-disc notion-block-cc1909134b4841e2af86aeed6bf87415"><li>可以使用转移字符<b>()</b>来将引号解除效用，变成普通字符串</li></ul></ol></ol></div></details><details class="notion-toggle notion-block-e13af625098b4d32b9f4e10e543b6373"><summary><h4 class="notion-h notion-h3 notion-block-e13af625098b4d32b9f4e10e543b6373" data-id="e13af625098b4d32b9f4e10e543b6373"><span><div id="e13af625098b4d32b9f4e10e543b6373" class="notion-header-anchor"></div><span class="notion-h-title">2. 字符串的拼接</span></span></h4></summary><div><div class="notion-text notion-block-8c1bf2cf99444c1490bb75d356be573a">使用 <b>+ </b></div><div class="notion-text notion-block-dd8feb212811457f9d7b015a9b84adb7"><b>但无法和非字符串类型拼接</b></div></div></details><details class="notion-toggle notion-block-5f80398f6d9d46e3a59559c25b94ddaf"><summary><h4 class="notion-h notion-h3 notion-block-5f80398f6d9d46e3a59559c25b94ddaf" data-id="5f80398f6d9d46e3a59559c25b94ddaf"><span><div id="5f80398f6d9d46e3a59559c25b94ddaf" class="notion-header-anchor"></div><span class="notion-h-title">3. 字符串格式化</span></span></h4></summary><div><ol start="1" class="notion-list notion-list-numbered notion-block-ca72df8e03884944911a8908f05b7a12" style="list-style-type:decimal"><li><b>占位型拼接</b></li><ol class="notion-list notion-list-numbered notion-block-ca72df8e03884944911a8908f05b7a12" style="list-style-type:lower-alpha"><blockquote class="notion-quote notion-block-0dd99e158f2945a589c0c95a98cf0e66"><div>多个变量占位</div></blockquote><blockquote class="notion-quote notion-block-600f66bed0fa45619abf3be7f9e5a5ee"><div>变量要用括号括起来</div></blockquote><blockquote class="notion-quote notion-block-ed9b58b5478b4a6d93dedd080b0e5582"><div>并按照占位的顺序填入</div></blockquote><div class="notion-text notion-block-8ee29f7c2e414ea099199e9029f7b0ca">% 为占位符</div><div class="notion-text notion-block-bf63b5e2a45843a6b00da8414eac9247">s 将变量变为字符串类型，放入占位的地方</div></ol></ol><ol start="2" class="notion-list notion-list-numbered notion-block-e044a71f01ee4d778e235594b9b6ec11" style="list-style-type:decimal"><li><b>通过语法：</b><code class="notion-inline-code"><b>f&quot;内容{变量}&quot;</b></code><b>的格式来快速格式化</b></li><ol class="notion-list notion-list-numbered notion-block-e044a71f01ee4d778e235594b9b6ec11" style="list-style-type:lower-alpha"><ul class="notion-list notion-list-disc notion-block-17cf5a777d8a4f7586918636f83dfe88"><li>不关心精度问题，适合对精度没有要求的场合</li></ul><ul class="notion-list notion-list-disc notion-block-2093203f9e284124ba51dece2659b1fc"><li>不会理会类型</li></ul></ol></ol></div></details><details class="notion-toggle notion-block-b9d5d2202dec4c838f45fabe5c5e0b0a"><summary><h4 class="notion-h notion-h3 notion-block-b9d5d2202dec4c838f45fabe5c5e0b0a" data-id="b9d5d2202dec4c838f45fabe5c5e0b0a"><span><div id="b9d5d2202dec4c838f45fabe5c5e0b0a" class="notion-header-anchor"></div><span class="notion-h-title">4. 字符串格式化的精度控制</span></span></h4></summary><div><div class="notion-text notion-block-821ebce537c440379a3541ebfa83bc21">我们可以使用辅助符号&quot;m.n&quot;来控制数据的宽度和精度</div><ul class="notion-list notion-list-disc notion-block-801df37181bc45a6aea25488e2f7275b"><li>m，控制宽度，要求是数字<b>(很少使用),设置的宽度小于数字自身，不生效</b></li></ul><ul class="notion-list notion-list-disc notion-block-b4e21917671448ca969c17c9aad6958e"><li>.n，控制小数点精度，要求是数字，<b>会进行小数的四舍五入</b></li></ul><div class="notion-text notion-block-add7c5fde3434ebd9df457fa3f046367"><b>示例:</b></div><ul class="notion-list notion-list-disc notion-block-ec68a50a284d4950ae4dd046bea57679"><li>%5d： 表示将整数的宽度控制在5位，如数字1，被设置为5d，就会变成：[空格][空格][空格]111，用三个空格补足宽度。</li></ul><ul class="notion-list notion-list-disc notion-block-082812e9b69041aaa6e5f25f0d98cc20"><li>%5.2f：表示将宽度控制为5，将小数点精度设置为2</li><ul class="notion-list notion-list-disc notion-block-082812e9b69041aaa6e5f25f0d98cc20"><div class="notion-text notion-block-10538143151f40408951fd11f657db85">小数点和小数部分也算入宽度计算。如，对11.345设置了%7.2f后，结果是:[空格][空格]11.35。2个空格补足宽度，小数部分限制2位精度后，四舍五入为.35</div></ul></ul><details class="notion-toggle notion-block-467ab0dc4069403883f3315f45f87eb8"><summary><h4 class="notion-h notion-h3 notion-block-467ab0dc4069403883f3315f45f87eb8" data-id="467ab0dc4069403883f3315f45f87eb8"><span><div id="467ab0dc4069403883f3315f45f87eb8" class="notion-header-anchor"></div><span class="notion-h-title">5.表达式的格式化</span></span></h4></summary><div><div class="notion-text notion-block-587e9bd24e114332814daf143f7fb231">以上四条都是对变量的格式化</div><div class="notion-text notion-block-eea3125de8fa4f81b3087974be753dc6">下面是对表达式的格式化</div></div></details></div></details></div></details><details class="notion-toggle notion-block-2a9e940c69bb81548139c3d02091dfe0"><summary><h3 class="notion-h notion-h2 notion-h-indent-1 notion-block-2a9e940c69bb81548139c3d02091dfe0" data-id="2a9e940c69bb81548139c3d02091dfe0"><span><div id="2a9e940c69bb81548139c3d02091dfe0" class="notion-header-anchor"></div><span class="notion-h-title">七、数据输入</span></span></h3></summary><div><div class="notion-text notion-block-2a9e940c69bb81288689eb4bdbba55c2"><code class="notion-inline-code">input()</code></div><div class="notion-text notion-block-2a9e940c69bb81c3bde4d8ead29da1d7"><b>input输入的数据，统统为字符串类型</b></div></div></details><details class="notion-toggle notion-block-2a9e940c69bb81f2a33be95b66041c4c"><summary><h3 class="notion-h notion-h2 notion-h-indent-1 notion-block-2a9e940c69bb81f2a33be95b66041c4c" data-id="2a9e940c69bb81f2a33be95b66041c4c"><span><div id="2a9e940c69bb81f2a33be95b66041c4c" class="notion-header-anchor"></div><span class="notion-h-title">八、布尔类型和比较运算符</span></span></h3></summary><div><ol start="1" class="notion-list notion-list-numbered notion-block-2a9e940c69bb81fabcc5f5f6134a38b5" style="list-style-type:decimal"><li>布尔类型</li><ol class="notion-list notion-list-numbered notion-block-2a9e940c69bb81fabcc5f5f6134a38b5" style="list-style-type:lower-alpha"><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb8130a884c6bea7706adc"><li>xxx = True</li></ul><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb8144b975fb50f4a48cd2"><li>xxx = Flase</li></ul></ol></ol><ol start="2" class="notion-list notion-list-numbered notion-block-2a9e940c69bb81b8ab55f6bd51fe71f8" style="list-style-type:decimal"><li>比较运算符  返回值为布尔类型</li><ol class="notion-list notion-list-numbered notion-block-2a9e940c69bb81b8ab55f6bd51fe71f8" style="list-style-type:lower-alpha"><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb811a9f33f2756ec1dffc"><li>==</li></ul><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb81ccaaebfd292c71d25f"><li>!=</li></ul><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb81a4915ddcc5077a4c0d"><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb81a4915ddcc5077a4c0d"></ul></ul><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb8100a709cf305daed6e1"><li>&lt;</li></ul><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb8179a930ce986721416e"><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb8179a930ce986721416e"><blockquote class="notion-quote notion-block-2da7e7e2929745aa9f53ef0c1a15e38d"><div>=</div></blockquote></ul></ul><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb817a9ebfda937f6fe631"><li>&lt;=</li></ul></ol></ol></div></details><details class="notion-toggle notion-block-2a9e940c69bb819d9a60e01cde07354e"><summary><h3 class="notion-h notion-h2 notion-h-indent-1 notion-block-2a9e940c69bb819d9a60e01cde07354e" data-id="2a9e940c69bb819d9a60e01cde07354e"><span><div id="2a9e940c69bb819d9a60e01cde07354e" class="notion-header-anchor"></div><span class="notion-h-title">九、if语句</span></span></h3></summary><div><details class="notion-toggle notion-block-c965cdacb07942a190331e931c7905bb"><summary><h4 class="notion-h notion-h3 notion-block-c965cdacb07942a190331e931c7905bb" data-id="c965cdacb07942a190331e931c7905bb"><span><div id="c965cdacb07942a190331e931c7905bb" class="notion-header-anchor"></div><span class="notion-h-title"><b>基本格式</b></span></span></h4></summary><div><details class="notion-toggle notion-block-29e01b35fac1483f9b053795047bcbfa"><summary><h4 class="notion-h notion-h3 notion-block-29e01b35fac1483f9b053795047bcbfa" data-id="29e01b35fac1483f9b053795047bcbfa"><span><div id="29e01b35fac1483f9b053795047bcbfa" class="notion-header-anchor"></div><span class="notion-h-title"><b>if判断的注意事项：</b></span></span></h4></summary><div><ul class="notion-list notion-list-disc notion-block-61c8bc6796db413a8d7db7b9fef522dc"><li>判断条件的结果一定要是布尔类型</li></ul><ul class="notion-list notion-list-disc notion-block-86e24a3f40564d8fa9740cda21269051"><li><b>不要忘记判断条件后的</b><code class="notion-inline-code"><b>:</b></code></li></ul><ul class="notion-list notion-list-disc notion-block-6b8a640acd9b41d6a4b985e2cd92f165"><li>冒号归属于if语句的代码块，要需在前方填充4个空格缩进(python 通过缩进来判断代码块的归属关系)</li></ul><ul class="notion-list notion-list-disc notion-block-0f4961a882ce412da28bf2acb0030f9a"><li>elif可以写多个</li></ul><ul class="notion-list notion-list-disc notion-block-dae86a6fe87549ee945fd660f2f1e18b"><li><b>判断是互斥且有序的</b>上一个满足后面的就不会判断了</li></ul><ul class="notion-list notion-list-disc notion-block-d6b05ac1ec2a4b3895e358cd1a7ce74d"><li>可以在条件判断中，直接写input语句，节省代码量</li></ul><ul class="notion-list notion-list-disc notion-block-201775ad11ca412c9a2da408365500ab"><li><b>判断语句是可以嵌套的</b></li></ul></div></details></div></details></div></details><details class="notion-toggle notion-block-a81fa1ff3c51420d8b08e940d8ed6883"><summary><h3 class="notion-h notion-h2 notion-h-indent-1 notion-block-a81fa1ff3c51420d8b08e940d8ed6883" data-id="a81fa1ff3c51420d8b08e940d8ed6883"><span><div id="a81fa1ff3c51420d8b08e940d8ed6883" class="notion-header-anchor"></div><span class="notion-h-title">十、while循环</span></span></h3></summary><div><details class="notion-toggle notion-block-621a0afadf844bc388334764fd1aa02d"><summary><h4 class="notion-h notion-h3 notion-block-621a0afadf844bc388334764fd1aa02d" data-id="621a0afadf844bc388334764fd1aa02d"><span><div id="621a0afadf844bc388334764fd1aa02d" class="notion-header-anchor"></div><span class="notion-h-title">格式</span></span></h4></summary><div><details class="notion-toggle notion-block-f5953eff00fe496783b1a764f475a2f5"><summary><h4 class="notion-h notion-h3 notion-block-f5953eff00fe496783b1a764f475a2f5" data-id="f5953eff00fe496783b1a764f475a2f5"><span><div id="f5953eff00fe496783b1a764f475a2f5" class="notion-header-anchor"></div><span class="notion-h-title">注意事项</span></span></h4></summary><div><ul class="notion-list notion-list-disc notion-block-57a8ad44e0fb4d8580308ba013bc2da8"><li>条件需提供布尔类型结果，True继续，False停止</li></ul><ul class="notion-list notion-list-disc notion-block-ed2de696045942f6b94d5c85ec7d7ef1"><li>空格缩进不能忘</li></ul><ul class="notion-list notion-list-disc notion-block-a90bf9334b2a4154aaece58ba68e30b1"><li>请规划好循环终止条件，否则将无限循环3</li></ul><ul class="notion-list notion-list-disc notion-block-bb3d0614493943b699e3b49aab5a67a5"><li><b>While可嵌套</b></li></ul></div></details></div></details></div></details><details class="notion-toggle notion-block-6b1499dacfe34cf48ee7d2dd33a1360f"><summary><h3 class="notion-h notion-h2 notion-h-indent-1 notion-block-6b1499dacfe34cf48ee7d2dd33a1360f" data-id="6b1499dacfe34cf48ee7d2dd33a1360f"><span><div id="6b1499dacfe34cf48ee7d2dd33a1360f" class="notion-header-anchor"></div><span class="notion-h-title">十一、for循环</span></span></h3></summary><div><div class="notion-text notion-block-acd09e16a36d45f79e55db859cb83b02">把待处理的数据集按顺序赋给临时变量。然后执行代码。直到赋完，</div><ul class="notion-list notion-list-disc notion-block-4a26b01131e94d40a55c43bd8d43591b"><li>语法中的:  待处理数据集，严格来说，称之为: <b>序列类型</b></li></ul><ul class="notion-list notion-list-disc notion-block-f0993b7e8cb044e0b7a8255912a9fb2f"><li>序列类型指，<b>其内容可以一个个依次取出的一种类型</b>，包括:</li><ul class="notion-list notion-list-disc notion-block-f0993b7e8cb044e0b7a8255912a9fb2f"><li>字符串</li><li>列表</li><li>元组</li><li>等</li></ul></ul><div class="notion-text notion-block-583532fdae694e0d85e65fcc5d07218e">for循环语句，本质上是遍历: 序列类型。</div><details class="notion-toggle notion-block-c099ce22189e4a24b2fe05e75d18e53e"><summary><h4 class="notion-h notion-h3 notion-block-c099ce22189e4a24b2fe05e75d18e53e" data-id="c099ce22189e4a24b2fe05e75d18e53e"><span><div id="c099ce22189e4a24b2fe05e75d18e53e" class="notion-header-anchor"></div><span class="notion-h-title">range语句</span></span></h4></summary><div><ol start="1" class="notion-list notion-list-numbered notion-block-366b52f713e849109316b63736c583ad" style="list-style-type:decimal"><li><b>语法一</b></li><ol class="notion-list notion-list-numbered notion-block-366b52f713e849109316b63736c583ad" style="list-style-type:lower-alpha"><ul class="notion-list notion-list-disc notion-block-dc70c82e6b984937ba45102dbbe7e3f5"><li>range（num）</li></ul><ul class="notion-list notion-list-disc notion-block-a3fca1ec5d6a409a97e3c56b600b50a1"><li>获取一个从0开始，到num结束的数字序列(不含num本身)</li></ul><ul class="notion-list notion-list-disc notion-block-1273743cea8d43e1b654ad7d989e185f"><li>如range(5)取得的数据是:[0,1,2,3,4]</li></ul></ol></ol><ol start="2" class="notion-list notion-list-numbered notion-block-df8b084784934a558e38220263a4cee5" style="list-style-type:decimal"><li><b>语法二</b></li><ol class="notion-list notion-list-numbered notion-block-df8b084784934a558e38220263a4cee5" style="list-style-type:lower-alpha"><ul class="notion-list notion-list-disc notion-block-2a08f70a84ce416c86dd75efba4a0e17"><li>range(num1，num2)</li></ul><ul class="notion-list notion-list-disc notion-block-fbd5339c256247a2bc812b0f0c7e387b"><li>获得一个从num1开始，到num2结束的数字序列(不含num2本身)</li></ul><ul class="notion-list notion-list-disc notion-block-ed2edee9e6ff482eabb8e39ad95bedb2"><li>如，range(5,10)取得的数据是:[5,6,7,8,9]</li></ul></ol></ol><ol start="3" class="notion-list notion-list-numbered notion-block-3945e5a8903b439a8a30dd4f8375cdb3" style="list-style-type:decimal"><li><b>语法三:</b></li><ol class="notion-list notion-list-numbered notion-block-3945e5a8903b439a8a30dd4f8375cdb3" style="list-style-type:lower-alpha"><ul class="notion-list notion-list-disc notion-block-130e175176cf4efcba5ba9fcba5308d3"><li>range(num1,num2,step)</li></ul><ul class="notion-list notion-list-disc notion-block-c042ba07756f4cb982f8f0de14c3009e"><li>获得一个从num1开始，到num2结束的数字序列(不含num2本身)</li></ul></ol></ol></div></details><div class="notion-text notion-block-60140d241ef544bea07311fb243502c9">数字之间的步长，以step为准(step默认为1)<div class="notion-text-children"><ul class="notion-list notion-list-disc notion-block-11f3b4901dfc43a68ae680cd6334b06f"><li>如，range(5,10,2)取得的数据是:[5,7,9]</li></ul></div></div><details class="notion-toggle notion-block-7b37e66ed59443a09ad9864f3ebc23a6"><summary><h4 class="notion-h notion-h3 notion-block-7b37e66ed59443a09ad9864f3ebc23a6" data-id="7b37e66ed59443a09ad9864f3ebc23a6"><span><div id="7b37e66ed59443a09ad9864f3ebc23a6" class="notion-header-anchor"></div><span class="notion-h-title">基础语法格式</span></span></h4></summary><div><details class="notion-toggle notion-block-1a07e99a2b784c1a8e71e38b598a576d"><summary><h4 class="notion-h notion-h3 notion-block-1a07e99a2b784c1a8e71e38b598a576d" data-id="1a07e99a2b784c1a8e71e38b598a576d"><span><div id="1a07e99a2b784c1a8e71e38b598a576d" class="notion-header-anchor"></div><span class="notion-h-title">for循环的注意点</span></span></h4></summary><div><ul class="notion-list notion-list-disc notion-block-a7806d5a59704909a2dc65302c8875c2"><li>无法定义循环条件，只能被动取出数据处理</li></ul><ul class="notion-list notion-list-disc notion-block-1f3cb5ab16374de5b2e4b0b0a016c6a1"><li>要注意，循环内的语句，需要有空格缩进</li></ul><ul class="notion-list notion-list-disc notion-block-fbe02ac4102044f19301c2b05e95981d"><li><b>for循环也可以嵌套</b></li></ul></div></details><details class="notion-toggle notion-block-88a73a319b46488492ee96a4ccd3f1fc"><summary><h4 class="notion-h notion-h3 notion-block-88a73a319b46488492ee96a4ccd3f1fc" data-id="88a73a319b46488492ee96a4ccd3f1fc"><span><div id="88a73a319b46488492ee96a4ccd3f1fc" class="notion-header-anchor"></div><span class="notion-h-title">for循环临时变量作用域</span></span></h4></summary><div><ol start="1" class="notion-list notion-list-numbered notion-block-8bf1b462dac24eddae0777b695048011" style="list-style-type:decimal"><li>for循环中的临时变量，其作用域限定为循环内</li></ol><ol start="2" class="notion-list notion-list-numbered notion-block-5c618a4ba7544ae6a33b3316fd8a0ff0" style="list-style-type:decimal"><li>这种限定是编程规范的限定，而非强制限定</li><ol class="notion-list notion-list-numbered notion-block-5c618a4ba7544ae6a33b3316fd8a0ff0" style="list-style-type:lower-alpha"><div class="notion-text notion-block-62f38743fa3640fbb810a42ad1087d6f">不遵守也能正常运行，但是不建议这样做</div><div class="notion-text notion-block-a101432610a0462d9aa02b2de21b55fa">如需访问临时变量，可以预先在循环外定义它</div></ol></ol></div></details></div></details></div></details><details class="notion-toggle notion-block-49a8d85a8b834526a3f7e0307c77199e"><summary><h3 class="notion-h notion-h2 notion-h-indent-1 notion-block-49a8d85a8b834526a3f7e0307c77199e" data-id="49a8d85a8b834526a3f7e0307c77199e"><span><div id="49a8d85a8b834526a3f7e0307c77199e" class="notion-header-anchor"></div><span class="notion-h-title">十二、continue和break</span></span></h3></summary><div><div class="notion-text notion-block-22124ab57fbf43f7aede5cf9447c0e66">continue，退出当前循环</div><div class="notion-text notion-block-0ddf46f908f44437ad7128d5f64d7e4a">break退出循环</div><div class="notion-text notion-block-9f649acbe5c74ab08416e137872e164c">他们可用在while 和 for中</div><div class="notion-text notion-block-dba7675964bb408d98ab6d9f94638ec5">注意：只能在作用在当层，无法对上层循环作用</div></div></details><details class="notion-toggle notion-block-42829896623e42b1866e7c310bb39c77"><summary><h3 class="notion-h notion-h2 notion-h-indent-1 notion-block-42829896623e42b1866e7c310bb39c77" data-id="42829896623e42b1866e7c310bb39c77"><span><div id="42829896623e42b1866e7c310bb39c77" class="notion-header-anchor"></div><span class="notion-h-title">十三、一些其他的小东西</span></span></h3></summary><div><div class="notion-text notion-block-16b8c4555eef492ab9722fa73e3261bd">关键字：random</div><div class="notion-text notion-block-b89b18689749491dbd305ae71a21f8c7"><b>用法：</b></div></div></details><div class="notion-text notion-block-dceb3ab188374643b997fa93349dbf89">函数：len</div><div class="notion-text notion-block-df08536e57ca41b6a49b18ec075f9a89">用法：<div class="notion-text-children"></div></div><h2 class="notion-h notion-h1 notion-h-indent-0 notion-block-aa3a9f01b2e24b95b90f0d85ea1e1bba" data-id="aa3a9f01b2e24b95b90f0d85ea1e1bba"><span><div id="aa3a9f01b2e24b95b90f0d85ea1e1bba" class="notion-header-anchor"></div><a class="notion-hash-link" href="#aa3a9f01b2e24b95b90f0d85ea1e1bba" title="二、Python的五种容器和函数"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">二、Python的五种容器和函数</span></span></h2><details class="notion-toggle notion-block-5ab12ebe8af7487e930e11cfd8168578"><summary><h3 class="notion-h notion-h2 notion-h-indent-1 notion-block-5ab12ebe8af7487e930e11cfd8168578" data-id="5ab12ebe8af7487e930e11cfd8168578"><span><div id="5ab12ebe8af7487e930e11cfd8168578" class="notion-header-anchor"></div><span class="notion-h-title">一、函数介绍</span></span></h3></summary><div><div class="notion-text notion-block-f9b6ce3047e34ab3a1cf4d8a3a444c02"><b>函数:是组织好的，可重复使用的，用来实现特定功能的代码段。</b></div><div class="notion-text notion-block-f802675bd8ec411d8ef90100a98e34e3">好处：</div><ul class="notion-list notion-list-disc notion-block-6db9a9e3ee564a87b36b0d39965b866a"><li>将功能封装在函数内，可供随时随地重复利用</li></ul><ul class="notion-list notion-list-disc notion-block-d566bf0a7c6840eca8de83d72f86e760"><li>提高代码的复用性，减少重复代码，提高开发效率</li></ul><div class="notion-blank notion-block-a140492cc4374dd7bda21be48d60023a"> </div></div></details><details class="notion-toggle notion-block-ff87a7546b494fa5b029bd7099ffdfe3"><summary><h3 class="notion-h notion-h2 notion-h-indent-1 notion-block-ff87a7546b494fa5b029bd7099ffdfe3" data-id="ff87a7546b494fa5b029bd7099ffdfe3"><span><div id="ff87a7546b494fa5b029bd7099ffdfe3" class="notion-header-anchor"></div><span class="notion-h-title">二、函数的定义</span></span></h3></summary><div><ul class="notion-list notion-list-disc notion-block-eb1d4aea04c54189a935c0e5b168968c"><li>参数 和 返回值可以 省略</li></ul><ul class="notion-list notion-list-disc notion-block-48a54175e7fd42c6a821052711c664fd"><li>函数需要先定义后调用函数</li></ul><ul class="notion-list notion-list-disc notion-block-a8368bac694a4f28b52d5d43de4e3329"><li>形参（函数声明时用的）和实参（传入的参数）</li></ul><ul class="notion-list notion-list-disc notion-block-b3d631af546f46038356b0dc65862512"><li>函数不管写不写return ，本质都是有返回值的，若不写，则默认返回None</li></ul><ul class="notion-list notion-list-disc notion-block-876fdd8c73f2467a9dce1783e6aead42"><li>函数可以嵌套调用</li></ul><ul class="notion-list notion-list-disc notion-block-fc6ed414342e495092a6a72760289c33"><li>函数中的变量为局部变量</li></ul><div class="notion-text notion-block-0e3d8e52dd40404fa572488e330b4116"><b>注意：</b></div><ul class="notion-list notion-list-disc notion-block-c4156fc3593b47cbb609fdcbca61bc43"><li>return后的代码部分不会执行</li></ul><ul class="notion-list notion-list-disc notion-block-aec399b85d2f4e23ad876053b4b21a1b"><li>注意加<b>：</b>号</li></ul><div class="notion-blank notion-block-980376cdd330461ba51dea19024f9997"> </div></div></details><details class="notion-toggle notion-block-6ce6ace025ee4cadbb61c0d03c9c821f"><summary><h3 class="notion-h notion-h2 notion-h-indent-1 notion-block-6ce6ace025ee4cadbb61c0d03c9c821f" data-id="6ce6ace025ee4cadbb61c0d03c9c821f"><span><div id="6ce6ace025ee4cadbb61c0d03c9c821f" class="notion-header-anchor"></div><span class="notion-h-title">三、列表</span></span></h3></summary><div><details class="notion-toggle notion-block-99904b60c3cb499185ccff721ac2951c"><summary><h4 class="notion-h notion-h3 notion-block-99904b60c3cb499185ccff721ac2951c" data-id="99904b60c3cb499185ccff721ac2951c"><span><div id="99904b60c3cb499185ccff721ac2951c" class="notion-header-anchor"></div><span class="notion-h-title">1. 数据容器介绍</span></span></h4></summary><div><div class="notion-text notion-block-876ec869667841778b87af030b198137"><b>数据容器：</b>一种可以容纳多份数据的数据类型，容纳的每一份数据称之为1个元素</div><div class="notion-text notion-block-aa80ebab2b0a4ecaa568af125a9ce7ea"><b>每一个元素，可以是任意类型的数据，如字符串、数字、布尔等，并且允许重复元素的存在，可以增删查改等…</b></div><div class="notion-text notion-block-00ef3608bc944f128e8d23e019e94b69">数据容器根据特点的不同：</div><ul class="notion-list notion-list-disc notion-block-181d8066432a4dc696b78cb1335060e8"><li>是否支持重复元素</li></ul><ul class="notion-list notion-list-disc notion-block-a11b5678c6ef4d7b8b767bbb98936881"><li>是否可以修改</li></ul><ul class="notion-list notion-list-disc notion-block-5bbbd5e90d5e45cf9e430824424e0066"><li>是否有序，等分为5类，</li><ul class="notion-list notion-list-disc notion-block-5bbbd5e90d5e45cf9e430824424e0066"><li>分别是 :  列表(list)、</li><li>元组(tuple)、</li><li>字符串(str)、</li><li>集合(set)、</li><li>字典(dict)</li></ul></ul></div></details><details class="notion-toggle notion-block-609312a01a754e36a27b00ebaf5344d7"><summary><h4 class="notion-h notion-h3 notion-block-609312a01a754e36a27b00ebaf5344d7" data-id="609312a01a754e36a27b00ebaf5344d7"><span><div id="609312a01a754e36a27b00ebaf5344d7" class="notion-header-anchor"></div><span class="notion-h-title">2. 列表<b>的定义</b></span></span></h4></summary><div><div class="notion-text notion-block-cb965046375c4403892172fe33936899">列表中的每个数据，都叫元素</div></div></details><ul class="notion-list notion-list-disc notion-block-26e8a39a798546479600bedef0836314"><li><b>列表支持嵌套，如：</b></li></ul><div class="notion-text notion-block-db0064774b334745935bcb8cdb7dc5a3">列表的两个元素都是列表<div class="notion-text-children"></div></div><details class="notion-toggle notion-block-7e6e4b5861ea442ab8ecbf50b6c9b330"><summary><h4 class="notion-h notion-h3 notion-block-7e6e4b5861ea442ab8ecbf50b6c9b330" data-id="7e6e4b5861ea442ab8ecbf50b6c9b330"><span><div id="7e6e4b5861ea442ab8ecbf50b6c9b330" class="notion-header-anchor"></div><span class="notion-h-title"><b>3. 列表可以通过下标索引</b></span></span></h4></summary><div><div class="notion-text notion-block-d176b12280da4c50ae1de1664f01543e">索引可以是正向，也可以反向</div><div class="notion-text notion-block-81c8398fe27e494fa9a69946bf5517e2">用法：</div><div class="notion-text notion-block-ed3213c889b84e86859fc3bce334537d">对于嵌套了列表的列表：在后面再进行索引就行。<code class="notion-inline-code">name_list[1][2]</code></div><ul class="notion-list notion-list-disc notion-block-edbed3535227499e8ccf953487b1809d"><li><b>列表的注意事项：</b></li></ul><div class="notion-text notion-block-74bee642a3714f03ab9f07c2423b111e">注意下标索引的范围不要超出元素的最大值（- 1 ）</div><div class="notion-blank notion-block-43f4c5d725154fd48ee820537dafce78"> </div></div></details><details class="notion-toggle notion-block-8a958783efe64168aeac4cdbeba09ae8"><summary><h4 class="notion-h notion-h3 notion-block-8a958783efe64168aeac4cdbeba09ae8" data-id="8a958783efe64168aeac4cdbeba09ae8"><span><div id="8a958783efe64168aeac4cdbeba09ae8" class="notion-header-anchor"></div><span class="notion-h-title">4. 引入：方法</span></span></h4></summary><div></div></details><ol start="1" class="notion-list notion-list-numbered notion-block-eb1f2eea49f74a6d8c172fd57f0161c4" style="list-style-type:decimal"><li>调用类中的方法</li><ol class="notion-list notion-list-numbered notion-block-eb1f2eea49f74a6d8c172fd57f0161c4" style="list-style-type:lower-alpha"><div class="notion-blank notion-block-6f32991f3eb549048653487b260245b4"> </div></ol></ol><details class="notion-toggle notion-block-2822352032864e8fac2aef5e9accdf87"><summary><h4 class="notion-h notion-h3 notion-block-2822352032864e8fac2aef5e9accdf87" data-id="2822352032864e8fac2aef5e9accdf87"><span><div id="2822352032864e8fac2aef5e9accdf87" class="notion-header-anchor"></div><span class="notion-h-title">5. 列表的方法</span></span></h4></summary><div><ul class="notion-list notion-list-disc notion-block-83dbb82a5afd4d9d8f8afa7a8aebeb42"><li>查找指定元素在列表的下标。如果找不到，报错ValueError!</li></ul><ul class="notion-list notion-list-disc notion-block-47f6977c80ec487c9e0f87f92a389a62"><li>语法：<code class="notion-inline-code">列表.index(元素)</code></li></ul><ol start="1" class="notion-list notion-list-numbered notion-block-fec775fb48b84216a4ead0b90da143c9" style="list-style-type:decimal"><li>对某下标的元素重新赋值</li><ol class="notion-list notion-list-numbered notion-block-fec775fb48b84216a4ead0b90da143c9" style="list-style-type:lower-alpha"><ul class="notion-list notion-list-disc notion-block-4133e13a060a427689ce2a2efc8bbfaf"><li>语法：<code class="notion-inline-code">列表[] = xxx</code> </li></ul></ol></ol><ol start="2" class="notion-list notion-list-numbered notion-block-c125fb5156fa4207a9334e9821f0a66f" style="list-style-type:decimal"><li>插入元素</li><ol class="notion-list notion-list-numbered notion-block-c125fb5156fa4207a9334e9821f0a66f" style="list-style-type:lower-alpha"><ul class="notion-list notion-list-disc notion-block-1db39e3f06df4b6ab071cc16e527d048"><li>在指定的下标位置，插入指定的元素，后面的元素往后排</li></ul><ul class="notion-list notion-list-disc notion-block-6d0f8a73f6834446b33f71d45e8c02ab"><li>语法：<code class="notion-inline-code">列表.insert(下标, xxx)</code> </li></ul></ol></ol><ol start="3" class="notion-list notion-list-numbered notion-block-1630c71720f54fd98b0ab257342ff0da" style="list-style-type:decimal"><li>追加元素（1）</li><ol class="notion-list notion-list-numbered notion-block-1630c71720f54fd98b0ab257342ff0da" style="list-style-type:lower-alpha"><ul class="notion-list notion-list-disc notion-block-e8309f3be2eb4750bbf04caf0cc07649"><li>将指定元素，追加到列表尾部</li></ul><ul class="notion-list notion-list-disc notion-block-f03d944c058f48eba9cb602d1f989dff"><li>语法：<code class="notion-inline-code">列表.append(元素)</code></li></ul></ol></ol><ol start="4" class="notion-list notion-list-numbered notion-block-f9d0f50ec883409488107f5565182d74" style="list-style-type:decimal"><li>追加元素（2）</li><ol class="notion-list notion-list-numbered notion-block-f9d0f50ec883409488107f5565182d74" style="list-style-type:lower-alpha"><ul class="notion-list notion-list-disc notion-block-d8a28611d72b46daab4fd62cd1e61e88"><li>将其他容器的内容取出，依次 追加到列表尾部</li></ul><ul class="notion-list notion-list-disc notion-block-eef8fa4885f84148a677dd8746152691"><li>语法：<code class="notion-inline-code">列表.extend(其他数据容器)</code>3</li></ul></ol></ol><ol start="5" class="notion-list notion-list-numbered notion-block-b7fac27e3bb44165a32bfe706cc9924d" style="list-style-type:decimal"><li>删除元素</li><ol class="notion-list notion-list-numbered notion-block-b7fac27e3bb44165a32bfe706cc9924d" style="list-style-type:lower-alpha"><ul class="notion-list notion-list-disc notion-block-4f7aec9114574aef812f6e14eda58c77"><li>语法1： <code class="notion-inline-code">列表.pop(下标)</code>   </li></ul><ul class="notion-list notion-list-disc notion-block-709fb1f8130445f0ae23e7b825ad4aa6"><li>语法2：<code class="notion-inline-code">del 列表[下标]</code>  </li></ul></ol></ol><ol start="6" class="notion-list notion-list-numbered notion-block-c18849bc42314d30aa35bd80347c2ed8" style="list-style-type:decimal"><li>删除元素</li><ol class="notion-list notion-list-numbered notion-block-c18849bc42314d30aa35bd80347c2ed8" style="list-style-type:lower-alpha"><ul class="notion-list notion-list-disc notion-block-c3fd603869d14142b3417b4ea50969ac"><li>删除某元素在列表中的<b>第一个匹配项</b></li></ul><ul class="notion-list notion-list-disc notion-block-4fb13b79d83e41c38769248feb7b3c56"><li>语法：<code class="notion-inline-code">列表.remove(元素)</code></li></ul></ol></ol><ol start="7" class="notion-list notion-list-numbered notion-block-a2c88c77998d4b568e0ec3b19672a503" style="list-style-type:decimal"><li>清空列表</li><ol class="notion-list notion-list-numbered notion-block-a2c88c77998d4b568e0ec3b19672a503" style="list-style-type:lower-alpha"><ul class="notion-list notion-list-disc notion-block-5ed8bf2dde7b44939ebcaa34c49c4592"><li>语法：<code class="notion-inline-code">列表.clear(列表)</code></li></ul></ol></ol><ol start="8" class="notion-list notion-list-numbered notion-block-d17c230bb61a4e509fb5b2614507f36b" style="list-style-type:decimal"><li>统计元素在列表中的数量</li><ol class="notion-list notion-list-numbered notion-block-d17c230bb61a4e509fb5b2614507f36b" style="list-style-type:lower-alpha"><ul class="notion-list notion-list-disc notion-block-325ba526ddd245dd8854dd1d1140ad83"><li>语法：<code class="notion-inline-code">列表.count(元素)</code></li></ul></ol></ol><ol start="9" class="notion-list notion-list-numbered notion-block-003de2aae01c4e978a4cb07617131cce" style="list-style-type:decimal"><li>统计元素的数量</li><ol class="notion-list notion-list-numbered notion-block-003de2aae01c4e978a4cb07617131cce" style="list-style-type:lower-alpha"><ul class="notion-list notion-list-disc notion-block-5d74801a52f745ee8d19ca4b97e06f96"><li>语法：<code class="notion-inline-code">len(列表)</code></li></ul></ol></ol></div></details></div></details><details class="notion-toggle notion-block-dd41341258654c09b51c6e793a8293c8"><summary><h4 class="notion-h notion-h3 notion-h-indent-2 notion-block-dd41341258654c09b51c6e793a8293c8" data-id="dd41341258654c09b51c6e793a8293c8"><span><div id="dd41341258654c09b51c6e793a8293c8" class="notion-header-anchor"></div><span class="notion-h-title">6. 列表的循环遍历</span></span></h4></summary><div><div class="notion-text notion-block-47aeb61a27a0456f96730cf0c912101e">遍历：把容器内的数据依次取出，并处理。又叫迭代</div><div class="notion-text notion-block-28414cbebd214208a4702ad336755c30"><b>while循环和for循环，都是循环语句，但细节不同:</b></div><div class="notion-text notion-block-c41fde71c0fe4e69a4b0717e0961ce37"><b>在循环控制上:</b></div><ul class="notion-list notion-list-disc notion-block-807aabaa9a03400fabaf712eae5021c4"><li>while循环可以自定循环条件，并自行控制</li></ul><ul class="notion-list notion-list-disc notion-block-f4e8a9f7b1af4f28b7c430722f87906f"><li>for循环不可以自定循环条件，只可以一个个从容器内取出数据</li></ul><div class="notion-text notion-block-daea1be70a164ea189885e64cf0b3bea"><b>在无限循环上:</b></div><ul class="notion-list notion-list-disc notion-block-b39ce902fc9b40139553f0d4b9b7fb90"><li><b>whi</b>le循环可以通过条件控制做到无限循环</li></ul><ul class="notion-list notion-list-disc notion-block-f269e6192c954b0d8d49d237db5cb1df"><li>for循环理论上不可以，因为被遍历的容器容量不是无限的</li></ul><div class="notion-text notion-block-a079969844754144994a2b36ec96cd6e"><b>在使用场景上:</b></div><ul class="notion-list notion-list-disc notion-block-f0f6653d1997424c8c9edfe468641233"><li>while循环适用于任何想要循环的场景</li></ul><ul class="notion-list notion-list-disc notion-block-56ab60d7b2e74acf90839ed920bb3474"><li>for循环适用于，遍历数据容器的场景或简单的固定次数循环场景</li></ul><div class="notion-blank notion-block-5440644f5e00479381fd08ddc9cf416e"> </div></div></details><details class="notion-toggle notion-block-e2b53c683b6e452a92f9359cc4551b22"><summary><h3 class="notion-h notion-h2 notion-h-indent-1 notion-block-e2b53c683b6e452a92f9359cc4551b22" data-id="e2b53c683b6e452a92f9359cc4551b22"><span><div id="e2b53c683b6e452a92f9359cc4551b22" class="notion-header-anchor"></div><span class="notion-h-title">四、元组</span></span></h3></summary><div></div></details><details class="notion-toggle notion-block-7e90899be1af41b68f69a17c9ceed035"><summary><h4 class="notion-h notion-h3 notion-h-indent-2 notion-block-7e90899be1af41b68f69a17c9ceed035" data-id="7e90899be1af41b68f69a17c9ceed035"><span><div id="7e90899be1af41b68f69a17c9ceed035" class="notion-header-anchor"></div><span class="notion-h-title">1. 介绍</span></span></h4></summary><div><div class="notion-text notion-block-8f4ce05f53d04b79ac239c3f4ae375ea">元组和列表的最大不同！</div></div></details><div class="notion-text notion-block-57b21d6c510249babca3a85012b2bb25">元组一旦定义完成，就不可修改</div><details class="notion-toggle notion-block-e69e847e796246fbb0eea1094a18da19"><summary><h4 class="notion-h notion-h3 notion-h-indent-2 notion-block-e69e847e796246fbb0eea1094a18da19" data-id="e69e847e796246fbb0eea1094a18da19"><span><div id="e69e847e796246fbb0eea1094a18da19" class="notion-header-anchor"></div><span class="notion-h-title">2.元组的定义</span></span></h4></summary><div><div class="notion-text notion-block-c8eb8bfe6e7b4349a1f5fccccd67cdc5">元组定义:   定义元组使用小括号，且使用逗号隔开各个数据，数据可以是不同的数据类型。</div><div class="notion-text notion-block-cf6f556a56b448a7b2a921890e0eae24"><b>定义的注意事项：</b></div><ul class="notion-list notion-list-disc notion-block-b7d914ef72f6484aaf13ee985eb0626d"><li>定义1个元素的元组必须带有逗号，否则不是元组类型</li><ul class="notion-list notion-list-disc notion-block-b7d914ef72f6484aaf13ee985eb0626d"></ul></ul></div></details><details class="notion-toggle notion-block-17448d3424854d01ab5a820399c8ed66"><summary><h4 class="notion-h notion-h3 notion-h-indent-2 notion-block-17448d3424854d01ab5a820399c8ed66" data-id="17448d3424854d01ab5a820399c8ed66"><span><div id="17448d3424854d01ab5a820399c8ed66" class="notion-header-anchor"></div><span class="notion-h-title">3. 元组的常用操作方法</span></span></h4></summary><div><ol start="1" class="notion-list notion-list-numbered notion-block-9ccd96d466f144c2b7a7ea771e338918" style="list-style-type:decimal"><li><code class="notion-inline-code">index()</code></li><ol class="notion-list notion-list-numbered notion-block-9ccd96d466f144c2b7a7ea771e338918" style="list-style-type:lower-alpha"><ul class="notion-list notion-list-disc notion-block-38a109a38e194813bdb9a8c2481c5a0f"><li>查找某个数据，如果数据存在返回对应的下标，否则报错</li></ul><ul class="notion-list notion-list-disc notion-block-8eedcaa0d6544db9a0264cfbf818e23a"><li>语法：<code class="notion-inline-code">元组.index（查找的元素）</code></li></ul><ul class="notion-list notion-list-disc notion-block-3155527e4d0345d58042e2d29dc6c78c"><li>返回查找的元素的下标</li></ul></ol></ol><ol start="2" class="notion-list notion-list-numbered notion-block-d55febc768e843d0b49493406929fd30" style="list-style-type:decimal"><li><code class="notion-inline-code">count()</code></li><ol class="notion-list notion-list-numbered notion-block-d55febc768e843d0b49493406929fd30" style="list-style-type:lower-alpha"><ul class="notion-list notion-list-disc notion-block-2021a78f9eb6410687fa7b14c63b7c18"><li>统计某个数据在当前元组出现的次数</li></ul><ul class="notion-list notion-list-disc notion-block-8fe37b7a314c4998b2ceb8a3c7515afc"><li>语法：<code class="notion-inline-code">元组.count（要统计的元素）</code></li></ul><ul class="notion-list notion-list-disc notion-block-816b1659b3e64a0faa2ac7f706c12480"><li>返回这个元素的个数</li></ul></ol></ol><ol start="3" class="notion-list notion-list-numbered notion-block-732b3c962c694cb88d8735444407a6d2" style="list-style-type:decimal"><li><code class="notion-inline-code">len(元组)</code></li><ol class="notion-list notion-list-numbered notion-block-732b3c962c694cb88d8735444407a6d2" style="list-style-type:lower-alpha"><ul class="notion-list notion-list-disc notion-block-c2a0d90f1b1949feb9a43cb91f83a9d3"><li>统计元组内的元素个数</li></ul><ul class="notion-list notion-list-disc notion-block-93729f1106f74182ad55f555882d3022"><li><code class="notion-inline-code">语法：len(元组)</code></li></ul><ul class="notion-list notion-list-disc notion-block-c80e718b283344d6851956abbf1e713d"><li>返回元素个数</li></ul></ol></ol><div class="notion-blank notion-block-251a06e872c447898a9132f4ab801b9e"> </div></div></details><details class="notion-toggle notion-block-15bee81a036a4ed5a00043013f9f8494"><summary><h4 class="notion-h notion-h3 notion-h-indent-2 notion-block-15bee81a036a4ed5a00043013f9f8494" data-id="15bee81a036a4ed5a00043013f9f8494"><span><div id="15bee81a036a4ed5a00043013f9f8494" class="notion-header-anchor"></div><span class="notion-h-title">4. 元组<b>的</b>特点</span></span></h4></summary><div><ul class="notion-list notion-list-disc notion-block-83ff6df4f1804e57955cb42a7148f038"><li>可以容纳多个数据</li></ul><ul class="notion-list notion-list-disc notion-block-0a507ab9c2c947db8406264afeba380d"><li>可以容纳不同类型的数据(混装)</li></ul><ul class="notion-list notion-list-disc notion-block-8f53ed20161740c89dc6773db3149450"><li>数据是有序存储的(下标索引)</li></ul><ul class="notion-list notion-list-disc notion-block-1c46abde3528484d87be6dd4e72067d3"><li>允许重复数据存在</li></ul><ul class="notion-list notion-list-disc notion-block-63ff9d212f9c41deadeb95d5952a315b"><li>不可以修改(增加或删除元素等)</li></ul><ul class="notion-list notion-list-disc notion-block-4bfd53ead96c49dba39db5c867c28d15"><li>支持for循环</li></ul><ul class="notion-list notion-list-disc notion-block-e6421a9fc6334b8e96bc344fcb80f533"><li>元素中如果有列表，可以修改元组的元素中的列表的内部元素</li></ul></div></details><details class="notion-toggle notion-block-767fcd67c4264a8ba1add31787d9dbd7"><summary><h3 class="notion-h notion-h2 notion-h-indent-1 notion-block-767fcd67c4264a8ba1add31787d9dbd7" data-id="767fcd67c4264a8ba1add31787d9dbd7"><span><div id="767fcd67c4264a8ba1add31787d9dbd7" class="notion-header-anchor"></div><span class="notion-h-title">五、字符串</span></span></h3></summary><div></div></details><details class="notion-toggle notion-block-07c291a10da84c24bc1a82ce82a9f06f"><summary><h4 class="notion-h notion-h3 notion-h-indent-2 notion-block-07c291a10da84c24bc1a82ce82a9f06f" data-id="07c291a10da84c24bc1a82ce82a9f06f"><span><div id="07c291a10da84c24bc1a82ce82a9f06f" class="notion-header-anchor"></div><span class="notion-h-title">1. 介绍</span></span></h4></summary><div><div class="notion-text notion-block-75bebdffd2b748b4b29685c1209a4ae1">字符串时字符的容器，一个字符串可以存放任意数量的字符</div><ul class="notion-list notion-list-disc notion-block-1ed2bb9174444335be5fa1e51a25f696"><li>和其他容器一样，字符串也是支持下标的</li></ul><ul class="notion-list notion-list-disc notion-block-83aabadc41e64c84a9a850cd623edea9"><li>字符串不可以 修改 移出  或者追加</li></ul><ul class="notion-list notion-list-disc notion-block-c609ebc0693c45a291358212eb3b48ed"><li>字符串可以 查找、和替换</li></ul></div></details><details class="notion-toggle notion-block-d661acd5555e450a8d70799487f170e8"><summary><h4 class="notion-h notion-h3 notion-h-indent-2 notion-block-d661acd5555e450a8d70799487f170e8" data-id="d661acd5555e450a8d70799487f170e8"><span><div id="d661acd5555e450a8d70799487f170e8" class="notion-header-anchor"></div><span class="notion-h-title">2. 字符串的常用操作方法</span></span></h4></summary><div><ol start="1" class="notion-list notion-list-numbered notion-block-c3e6cb1ab1ad454f92be45e6dbd5dc98" style="list-style-type:decimal"><li>字符串的替换</li><ol class="notion-list notion-list-numbered notion-block-c3e6cb1ab1ad454f92be45e6dbd5dc98" style="list-style-type:lower-alpha"><ul class="notion-list notion-list-disc notion-block-e461c1f56cd942b6aa93aa0b59736e9d"><li><b>语法：</b>字符串.replace(字符串1，字符串2)</li></ul><ul class="notion-list notion-list-disc notion-block-2fb73c7b157a4ec099c66fa60d6d59cd"><li><b>功能：将字符串内的全部:字符串1替换为字符串2</b></li></ul><ul class="notion-list notion-list-disc notion-block-6a10f129b61e49668e46611462edbe09"><li><b>注意：是局部替换，但是要注意，这个返回值是一个新的字符串，不是在老字符串上进行修改</b></li></ul></ol></ol><ol start="2" class="notion-list notion-list-numbered notion-block-608f38a37cf449d3b07ec929d29825d9" style="list-style-type:decimal"><li>字符串的分割</li><ol class="notion-list notion-list-numbered notion-block-608f38a37cf449d3b07ec929d29825d9" style="list-style-type:lower-alpha"><ul class="notion-list notion-list-disc notion-block-bc1c2b17a131451cb97c793e0e34c32c"><li><b>语法：</b>字符串.split(分隔符字符串)</li></ul><ul class="notion-list notion-list-disc notion-block-3460bdf341c84f6f82cfd4c401d41642"><li><b>功能：</b>按照指定的分隔符字符串，将字符串划分为多个字符串，并存入列表对象中</li></ul><ul class="notion-list notion-list-disc notion-block-191e61b3ac814193ad83def0e4259fda"><li><b>注意：字符串本身不变，而是得到了一个列表对象</b></li></ul><ul class="notion-list notion-list-disc notion-block-95393b4a3924465ca10382a0a6704381"><li>示例：</li><ul class="notion-list notion-list-disc notion-block-95393b4a3924465ca10382a0a6704381"></ul></ul></ol></ol><ol start="3" class="notion-list notion-list-numbered notion-block-c6058ccc130a40028295b13872853137" style="list-style-type:decimal"><li>字符串的规整操作</li><ol class="notion-list notion-list-numbered notion-block-c6058ccc130a40028295b13872853137" style="list-style-type:lower-alpha"><li>去除前后空格</li><ol class="notion-list notion-list-numbered notion-block-1037299940544a2db06744d6a01a070d" style="list-style-type:lower-roman"><ul class="notion-list notion-list-disc notion-block-37b2cb01504b48c3955711af4910688d"><li>语法：<code class="notion-inline-code">字符串.strip()</code></li></ul><ul class="notion-list notion-list-disc notion-block-349598ccd37c46dd8a9674efb1fc7888"><li>示例：</li><ul class="notion-list notion-list-disc notion-block-349598ccd37c46dd8a9674efb1fc7888"></ul></ul></ol><li>去除前后指定字符串</li><ol class="notion-list notion-list-numbered notion-block-05fef4e8a27e4fc48e06aa85015d0e7d" style="list-style-type:lower-roman"><ul class="notion-list notion-list-disc notion-block-8ca61c4be1d249dc92247bf5792074d4"><li>语法：<code class="notion-inline-code">字符串.strip(字符串)</code></li></ul><ul class="notion-list notion-list-disc notion-block-a3cff757fb9a4a58bf1f3a488d5311ad"><li>注意：传入“12”，的意思是，‘’1‘和‘’2’‘都会移出，是按照单个字符</li></ul><ul class="notion-list notion-list-disc notion-block-9c74993ae21e40c0b5de6c6885da4e90"><li>示例：</li><ul class="notion-list notion-list-disc notion-block-9c74993ae21e40c0b5de6c6885da4e90"></ul></ul></ol></ol></ol><ol start="4" class="notion-list notion-list-numbered notion-block-db8306a161674dc28a613a1fb06f8b62" style="list-style-type:decimal"><li>统计字符串中某个字符出现的次数</li><ol class="notion-list notion-list-numbered notion-block-db8306a161674dc28a613a1fb06f8b62" style="list-style-type:lower-alpha"><ul class="notion-list notion-list-disc notion-block-e2a4f43bb4c644dc9445503797c3a512"><li>统计某个数据在当前元组出现的次数</li></ul><ul class="notion-list notion-list-disc notion-block-d8bee4738e084d9f8563fec417c233e7"><li>语法：<code class="notion-inline-code">字符串.count（要统计的元素）</code></li></ul><ul class="notion-list notion-list-disc notion-block-fa7a44768609454284e14adfa45e4c73"><li>返回这个元素的个数</li></ul></ol></ol><ol start="5" class="notion-list notion-list-numbered notion-block-4ec7bbbe32ec4c71ae2d08e6b7d957b4" style="list-style-type:decimal"><li>统计字符串的长度</li><ol class="notion-list notion-list-numbered notion-block-4ec7bbbe32ec4c71ae2d08e6b7d957b4" style="list-style-type:lower-alpha"><ul class="notion-list notion-list-disc notion-block-d071ed28897e4483ac60e8d176eac105"><li>统计元组内的元素个数</li></ul><ul class="notion-list notion-list-disc notion-block-c4283888d0d642ef82aa7dae65460484"><li><code class="notion-inline-code">语法：len(字符串)</code></li></ul><ul class="notion-list notion-list-disc notion-block-1827a44e7e7f4cd68c242d20180f37af"><li>返回元素个数</li></ul></ol></ol></div></details><details class="notion-toggle notion-block-258c59e019264fcda92909d875484fb6"><summary><h4 class="notion-h notion-h3 notion-h-indent-2 notion-block-258c59e019264fcda92909d875484fb6" data-id="258c59e019264fcda92909d875484fb6"><span><div id="258c59e019264fcda92909d875484fb6" class="notion-header-anchor"></div><span class="notion-h-title">3. 字符串的特点</span></span></h4></summary><div><ul class="notion-list notion-list-disc notion-block-7f02e1b7aa234376a2087e6687a9042f"><li>只可以存储字符串</li></ul><ul class="notion-list notion-list-disc notion-block-79ab6f6a0b5047ef9314081b59dcf812"><li>长度任意(取决于内存大小)</li></ul><ul class="notion-list notion-list-disc notion-block-7ac4638976184e56ab0efa406604cec8"><li>支持下标索引</li></ul><ul class="notion-list notion-list-disc notion-block-263da69b443f45f8b30db620cc4dbf23"><li>允许重复字符串存在</li></ul><ul class="notion-list notion-list-disc notion-block-72ccbad6834741d9b3122f593d06c9a5"><li><b>不可以修改(增加或删除元素等)</b></li></ul><ul class="notion-list notion-list-disc notion-block-f38e5d5b7cc342f88e8f45d9d165461a"><li>支持for循环</li></ul></div></details><details class="notion-toggle notion-block-64611c2f8eab40649722da94e4d722ec"><summary><h3 class="notion-h notion-h2 notion-h-indent-1 notion-block-64611c2f8eab40649722da94e4d722ec" data-id="64611c2f8eab40649722da94e4d722ec"><span><div id="64611c2f8eab40649722da94e4d722ec" class="notion-header-anchor"></div><span class="notion-h-title">六、数据容器（序列）的切片操作</span></span></h3></summary><div></div></details><details class="notion-toggle notion-block-f06993d7d4ec4b759461bb94eebda26b"><summary><h4 class="notion-h notion-h3 notion-h-indent-2 notion-block-f06993d7d4ec4b759461bb94eebda26b" data-id="f06993d7d4ec4b759461bb94eebda26b"><span><div id="f06993d7d4ec4b759461bb94eebda26b" class="notion-header-anchor"></div><span class="notion-h-title">1. 什么是序列</span></span></h4></summary><div><ul class="notion-list notion-list-disc notion-block-ea932b6a1141468693f65e35d44845af"><li>序列是指：内容连续、有序，可使用下标索引的一类数据容器</li></ul><ul class="notion-list notion-list-disc notion-block-2970372d1b2c49c6ad64fbefff263080"><li><b>列表、元组、字符串，均可以可以视为序列</b></li></ul></div></details><details class="notion-toggle notion-block-b177b56dbded4ba48359d1bf2f1ade4a"><summary><h4 class="notion-h notion-h3 notion-h-indent-2 notion-block-b177b56dbded4ba48359d1bf2f1ade4a" data-id="b177b56dbded4ba48359d1bf2f1ade4a"><span><div id="b177b56dbded4ba48359d1bf2f1ade4a" class="notion-header-anchor"></div><span class="notion-h-title">2. 序列的常用操作</span></span></h4></summary><div><div class="notion-text notion-block-6780a5f77a57452dab92886515f60e8a">序列支持切片，即：列表、元组、字符串，均支持进行切片操作</div><div class="notion-text notion-block-f264e3c6a98a40ceacd63f321ec3183c">切片：从一个序列中，取出一个子序列</div><div class="notion-text notion-block-b3794e36e01b4ec799112feae49783ca">语法：<code class="notion-inline-code">序列[起始下标:结束下标:步长]</code>     </div><div class="notion-text notion-block-55d12ac0ea904f96a56676a87909d5ad"><b>表示从序列中，从指定位置开始，依次取出元素，到指定位置结束，得到一个新序列：</b></div><ul class="notion-list notion-list-disc notion-block-32f264d8417242ffb42026e47f4df42c"><li>起始下标表示从何处开始，可以留空，留空视作从头开始</li></ul><ul class="notion-list notion-list-disc notion-block-2c2f80cfd49142b2867c91a44a890751"><li>结束下标(不含)表示何处结束，可以留空，留空视作截取到结尾</li></ul><ul class="notion-list notion-list-disc notion-block-d957fc53ad7b42faaff26254749764bd"><li>步长表示，依次取元素的间隔</li><ul class="notion-list notion-list-disc notion-block-d957fc53ad7b42faaff26254749764bd"><li>步长1表示，一个个取元素</li><li>步长2表示，每次跳过1个元素取</li><li>步长N表示，每次跳过N-1个元素取</li><li>步长为负数表示，反向取  (注意，起始下标和结束下标也要反向标记)</li></ul></ul><blockquote class="notion-quote notion-block-be47313783604dc6985329f141172cf0"><div>切片不会影响序列本身，而是得到一个新的序列</div></blockquote><blockquote class="notion-quote notion-block-0efaa3becc974ddaa1cd76e708b7a172"><div>起始和结束的下标也能不写，默认为从头到尾。步长也可以不写，默认为1</div></blockquote><blockquote class="notion-quote notion-block-f73c6195f6b94aa983b854392289f67b"><div>范围为  左闭右开</div></blockquote><blockquote class="notion-quote notion-block-fd02cb23b3eb4194bd3b5c5563d5470c"><div>可以这样用my_str[::-1][9:14]</div></blockquote></div></details><details class="notion-toggle notion-block-bd5aaaf95ca844c3af2b0b78696a9880"><summary><h3 class="notion-h notion-h2 notion-h-indent-1 notion-block-bd5aaaf95ca844c3af2b0b78696a9880" data-id="bd5aaaf95ca844c3af2b0b78696a9880"><span><div id="bd5aaaf95ca844c3af2b0b78696a9880" class="notion-header-anchor"></div><span class="notion-h-title">七、集合</span></span></h3></summary><div></div></details><details class="notion-toggle notion-block-8d85faff8c2a4001be505c5ae4144990"><summary><h4 class="notion-h notion-h3 notion-h-indent-2 notion-block-8d85faff8c2a4001be505c5ae4144990" data-id="8d85faff8c2a4001be505c5ae4144990"><span><div id="8d85faff8c2a4001be505c5ae4144990" class="notion-header-anchor"></div><span class="notion-h-title">1. 集合的介绍：</span></span></h4></summary><div><ul class="notion-list notion-list-disc notion-block-bd2eab7544314725a2987efc5ac9223f"><li>集合 set</li></ul><ul class="notion-list notion-list-disc notion-block-d1621bae11e045eaa050a249be37f16b"><li>集合会去重，<b>不能重复</b></li></ul><ul class="notion-list notion-list-disc notion-block-7a80426b3f544036b928e4ded1e6f0da"><li>集合内容是<b>无序的（所以不支持下标索引访问）</b></li></ul></div></details><details class="notion-toggle notion-block-685dfba50aba47c9a1e34fea0a0f6d8b"><summary><h4 class="notion-h notion-h3 notion-h-indent-2 notion-block-685dfba50aba47c9a1e34fea0a0f6d8b" data-id="685dfba50aba47c9a1e34fea0a0f6d8b"><span><div id="685dfba50aba47c9a1e34fea0a0f6d8b" class="notion-header-anchor"></div><span class="notion-h-title"><b>2. 集合的定义</b></span></span></h4></summary><div><div class="notion-text notion-block-ffcec876bdc9433d90d53b778a80d572">集合  set</div></div></details><details class="notion-toggle notion-block-01657a76e81c40f4a6477125a1116ab7"><summary><h4 class="notion-h notion-h3 notion-h-indent-2 notion-block-01657a76e81c40f4a6477125a1116ab7" data-id="01657a76e81c40f4a6477125a1116ab7"><span><div id="01657a76e81c40f4a6477125a1116ab7" class="notion-header-anchor"></div><span class="notion-h-title">3. 集合的一些方法</span></span></h4></summary><div><ol start="1" class="notion-list notion-list-numbered notion-block-6f5ce109e155431eaaef5cd2cf2e0c32" style="list-style-type:decimal"><li>添加新元素</li><ol class="notion-list notion-list-numbered notion-block-6f5ce109e155431eaaef5cd2cf2e0c32" style="list-style-type:lower-alpha"><ul class="notion-list notion-list-disc notion-block-872ce49f2bbe431d978a9955237ecc52"><li>语法：<code class="notion-inline-code">集合.add(元素)</code></li></ul></ol></ol><ol start="2" class="notion-list notion-list-numbered notion-block-e721c6d15cd34d0392034d2b554cb146" style="list-style-type:decimal"><li>移出元素</li><ol class="notion-list notion-list-numbered notion-block-e721c6d15cd34d0392034d2b554cb146" style="list-style-type:lower-alpha"><ul class="notion-list notion-list-disc notion-block-7f3ba89855b24d49ad6533684c0bbf49"><li>语法：<code class="notion-inline-code">集合.remove(元素)</code></li></ul></ol></ol><ol start="3" class="notion-list notion-list-numbered notion-block-236991e5e5044f73b161ba37b5ac9e39" style="list-style-type:decimal"><li>随机取出一个元素</li><ol class="notion-list notion-list-numbered notion-block-236991e5e5044f73b161ba37b5ac9e39" style="list-style-type:lower-alpha"><ul class="notion-list notion-list-disc notion-block-125a1061bcc8415c816bf9cf2c3f785b"><li>语法：<code class="notion-inline-code">集合.pop()</code></li></ul><ul class="notion-list notion-list-disc notion-block-668cb942362442189271be696d5be20d"><li>注意：真  取出来了，原本的集合没了</li></ul><li>清空集合</li><ol class="notion-list notion-list-numbered notion-block-cecd1bdaa5cf4b46bbb9831728670320" style="list-style-type:lower-roman"><ul class="notion-list notion-list-disc notion-block-4908e45187974ff4974e7cd73179da08"><li>语法：<code class="notion-inline-code">集合.clear()</code></li></ul></ol><li>取出2个集合的差集</li><ol class="notion-list notion-list-numbered notion-block-1896ffb4faae4c13a7443a0b95961142" style="list-style-type:lower-roman"><ul class="notion-list notion-list-disc notion-block-2024b99828e54cdeb089cb670b014242"><li>语法：<code class="notion-inline-code">集合1.difference(集合2)</code></li></ul><ul class="notion-list notion-list-disc notion-block-5bac1aeea3a142ff848fb23ef9019422"><li>功能：<b>取出集合1和集合2的差集.，</b>集合1有 而 集合2没有的</li></ul><ul class="notion-list notion-list-disc notion-block-11d8c0ea2bc84b2db88bcc7987a8ee52"><li>结果：得到一个新集合，集合1和集合2不变</li></ul></ol><li>消除2个集合的差集</li><ol class="notion-list notion-list-numbered notion-block-8b8d0963b30b41ea914b4c984054728f" style="list-style-type:lower-roman"><ul class="notion-list notion-list-disc notion-block-8c226f6f3b05492a84feb1e7c7ff9f83"><li>语法：<code class="notion-inline-code">集合1.difference_update(集合2)</code></li></ul><ul class="notion-list notion-list-disc notion-block-7cb71ea9f01840e091714023e56d5b5a"><li>功能：对比集合1和集合2，<b>在集合1内，删除和集合2相同的元素。</b></li></ul><ul class="notion-list notion-list-disc notion-block-a6182c3bca4248699363cec9e2750058"><li>结果：集合1被修改，集合2不变</li></ul></ol><li>2个集合合并</li><ol class="notion-list notion-list-numbered notion-block-aebab5b7df9c4c2d884480041cb8ead4" style="list-style-type:lower-roman"><ul class="notion-list notion-list-disc notion-block-5a618d5a647d4501a915f89378e7640e"><li>语法：<code class="notion-inline-code">集合1.unior(集合2)</code></li></ul><ul class="notion-list notion-list-disc notion-block-2fcaa3d0a4d843b2a77af70a396f9f63"><li>功能：将集合1和集合2组合成新集合</li></ul><ul class="notion-list notion-list-disc notion-block-e5769db356bb4ed3bde559a600be75b9"><li>结果：得到新集合，集合1和集合2不变</li></ul></ol><li>统计集合元素的数量</li><ol class="notion-list notion-list-numbered notion-block-0e73a54ea1c8408490f528954e9beee3" style="list-style-type:lower-roman"><ul class="notion-list notion-list-disc notion-block-5ac88544c29c4115b36eb9defe8cbcf1"><li>语法：<code class="notion-inline-code">len(集合)</code></li></ul></ol><li>集合的遍历</li><ol class="notion-list notion-list-numbered notion-block-5abd72947c874249a0ccd380667a4da5" style="list-style-type:lower-roman"><ul class="notion-list notion-list-disc notion-block-97f503fdf9104e448b4adc66c20049a1"><li>集合不支持下标索引，所以不支持 while循环</li></ul><ul class="notion-list notion-list-disc notion-block-28a1b2af9b9d4d5bb7cc0156de5df11c"><li>集合支持for循环</li></ul></ol></ol></ol></div></details><details class="notion-toggle notion-block-f5d34ef15b4a43d89f8a59c4f96e3c6c"><summary><h4 class="notion-h notion-h3 notion-h-indent-2 notion-block-f5d34ef15b4a43d89f8a59c4f96e3c6c" data-id="f5d34ef15b4a43d89f8a59c4f96e3c6c"><span><div id="f5d34ef15b4a43d89f8a59c4f96e3c6c" class="notion-header-anchor"></div><span class="notion-h-title">4. 集合的特点</span></span></h4></summary><div><ul class="notion-list notion-list-disc notion-block-99758272cec542d1b6abeab64f278a7b"><li>可以容纳多个数据</li></ul><ul class="notion-list notion-list-disc notion-block-14642a8476894470aec5759d6dcd32f0"><li>可以容纳不同类型的数据(混装)</li></ul><ul class="notion-list notion-list-disc notion-block-aefde79baeef49d29e45a4e1aa8f9b3f"><li><b>数据是无序存储的(不支持下标索引)</b></li></ul><ul class="notion-list notion-list-disc notion-block-22c39c363c67435f824dfd7fe5ff7010"><li><b>不允许重复数据存在</b></li></ul><ul class="notion-list notion-list-disc notion-block-227c78caebce45f297f65ca0838a3b66"><li>可以修改(增加或删除元素等)</li></ul><ul class="notion-list notion-list-disc notion-block-3ec6d233c1c54d77b3ac076276686080"><li>支持for循环</li></ul></div></details><details class="notion-toggle notion-block-955465ff8ffa4a5fa5f4457dbec58ee6"><summary><h3 class="notion-h notion-h2 notion-h-indent-1 notion-block-955465ff8ffa4a5fa5f4457dbec58ee6" data-id="955465ff8ffa4a5fa5f4457dbec58ee6"><span><div id="955465ff8ffa4a5fa5f4457dbec58ee6" class="notion-header-anchor"></div><span class="notion-h-title">八、字典</span></span></h3></summary><div><div class="notion-text notion-block-a74f3daf5b764b8a96e337acdfd2084b">通过字典，可以实现用key 取出 value的操作</div></div></details><details class="notion-toggle notion-block-9c7dd61c5edc4ffeb7a7fe71c29903df"><summary><h4 class="notion-h notion-h3 notion-h-indent-2 notion-block-9c7dd61c5edc4ffeb7a7fe71c29903df" data-id="9c7dd61c5edc4ffeb7a7fe71c29903df"><span><div id="9c7dd61c5edc4ffeb7a7fe71c29903df" class="notion-header-anchor"></div><span class="notion-h-title">1. 字典的定义</span></span></h4></summary><div><div class="notion-text notion-block-7694996cc2694877a6ed2a82270fd8ff">字典中存储的<b>元素 叫 ： 键值对</b></div><ul class="notion-list notion-list-disc notion-block-5c3d5aed7f924e7b9681617055bd99fd"><li>字典不允许重复，新的会把老的覆盖掉</li></ul><ul class="notion-list notion-list-disc notion-block-19180a0d3a2646fb95fbde33d94c456a"><li>字典不允许下标索引</li></ul><ul class="notion-list notion-list-disc notion-block-ccba5f2c91f543d4ad5c3e76a65fdc5d"><li>字典的key不允许为字典，value 不受限制，可以嵌套字典</li></ul></div></details><details class="notion-toggle notion-block-221b78fe7d5b4b7d8a58d38347010862"><summary><h4 class="notion-h notion-h3 notion-h-indent-2 notion-block-221b78fe7d5b4b7d8a58d38347010862" data-id="221b78fe7d5b4b7d8a58d38347010862"><span><div id="221b78fe7d5b4b7d8a58d38347010862" class="notion-header-anchor"></div><span class="notion-h-title">2. 字典的常用操作</span></span></h4></summary><div><ol start="1" class="notion-list notion-list-numbered notion-block-ed558832f54848c2aac7b4de9fba3afc" style="list-style-type:decimal"><li>新增元素</li><ol class="notion-list notion-list-numbered notion-block-ed558832f54848c2aac7b4de9fba3afc" style="list-style-type:lower-alpha"><ul class="notion-list notion-list-disc notion-block-9648591628c345568e5bf3dccf6aa3ee"><li>语法：<code class="notion-inline-code">字典[Key] = Value</code></li></ul><ul class="notion-list notion-list-disc notion-block-544a0d16fd3146d8bf4338fdbdf0d114"><li>结果：字典被修改，新增了元素</li></ul></ol></ol><ol start="2" class="notion-list notion-list-numbered notion-block-953028a3e533461084ce4ae611238043" style="list-style-type:decimal"><li>更新元素</li><ol class="notion-list notion-list-numbered notion-block-953028a3e533461084ce4ae611238043" style="list-style-type:lower-alpha"><ul class="notion-list notion-list-disc notion-block-bb58a649a1824932bb1b2d67d3a94281"><li>语法：<code class="notion-inline-code">字典[Key] = Value</code></li></ul><ul class="notion-list notion-list-disc notion-block-e32ed1b8ad0944b6a707bd288da51559"><li>结果：字典被修改，元素被更新</li></ul><ul class="notion-list notion-list-disc notion-block-b133fc69af614d9a9d7f6b2a4e67f7e6"><li>注意：字典key不可以重复，如果key已经有了，再执行就是更新元素</li></ul></ol></ol><ol start="3" class="notion-list notion-list-numbered notion-block-6b4d620455b04cb3a96ebb6474f6beed" style="list-style-type:decimal"><li>删除元素</li><ol class="notion-list notion-list-numbered notion-block-6b4d620455b04cb3a96ebb6474f6beed" style="list-style-type:lower-alpha"><ul class="notion-list notion-list-disc notion-block-3d59456b5f7246ea86047727b2f00793"><li>语法：<code class="notion-inline-code">字典.pop(key)</code></li></ul><ul class="notion-list notion-list-disc notion-block-ee49eb54b83141ca8fd55992d99f386f"><li>结果：获得指定key的value，同时字典被修改，指定key的数据被删除</li></ul></ol></ol><ol start="4" class="notion-list notion-list-numbered notion-block-8e25a766bc8946c4bc85ae6005d4f7e0" style="list-style-type:decimal"><li>清空元素</li><ol class="notion-list notion-list-numbered notion-block-8e25a766bc8946c4bc85ae6005d4f7e0" style="list-style-type:lower-alpha"><ul class="notion-list notion-list-disc notion-block-81d7de4d3d9b46428fa9e81efafb7259"><li>语法：<code class="notion-inline-code">字典.clear()</code></li></ul></ol></ol><ol start="5" class="notion-list notion-list-numbered notion-block-0cedaf9e9b72415d8df766bd833d12c8" style="list-style-type:decimal"><li>获取全部的Key</li><ol class="notion-list notion-list-numbered notion-block-0cedaf9e9b72415d8df766bd833d12c8" style="list-style-type:lower-alpha"><ul class="notion-list notion-list-disc notion-block-91f2ca3dfbca49fa80ce5bb4d855ec2b"><li>语法：<code class="notion-inline-code">字典.keys()</code></li></ul></ol></ol><ol start="6" class="notion-list notion-list-numbered notion-block-457d965eb8f842c9bba730ab1dea8a46" style="list-style-type:decimal"><li>统计字典内的元素数量</li><ol class="notion-list notion-list-numbered notion-block-457d965eb8f842c9bba730ab1dea8a46" style="list-style-type:lower-alpha"><ul class="notion-list notion-list-disc notion-block-6cfbfc33d3f8460dbe51fc6957b2c837"><li>语法：<code class="notion-inline-code">len(字典)</code></li></ul></ol></ol><ol start="7" class="notion-list notion-list-numbered notion-block-53cca6e791c44bd9813307596f93570b" style="list-style-type:decimal"><li>遍历字典</li><ol class="notion-list notion-list-numbered notion-block-53cca6e791c44bd9813307596f93570b" style="list-style-type:lower-alpha"><ul class="notion-list notion-list-disc notion-block-61971170905849879bf0b4da8cba32b1"><li>通过获取全部的key来遍历字典</li><ul class="notion-list notion-list-disc notion-block-61971170905849879bf0b4da8cba32b1"></ul></ul><ul class="notion-list notion-list-disc notion-block-933402f5c0f3447c87e74b9b2c3f6e6d"><li><b>直接对字典进行for循环，每次循环都是直接得到key</b></li><ul class="notion-list notion-list-disc notion-block-933402f5c0f3447c87e74b9b2c3f6e6d"></ul></ul></ol></ol></div></details><details class="notion-toggle notion-block-e7b881ba6b8041d79b00474922db68e0"><summary><h4 class="notion-h notion-h3 notion-h-indent-2 notion-block-e7b881ba6b8041d79b00474922db68e0" data-id="e7b881ba6b8041d79b00474922db68e0"><span><div id="e7b881ba6b8041d79b00474922db68e0" class="notion-header-anchor"></div><span class="notion-h-title">3.字典的特点</span></span></h4></summary><div><ul class="notion-list notion-list-disc notion-block-c82be45ed31f4555b8add63fede4b946"><li>可以容纳多个数据</li></ul><ul class="notion-list notion-list-disc notion-block-37d0c6e3315446c78ac123064a5de062"><li>可以容纳不同类型的数据</li></ul><ul class="notion-list notion-list-disc notion-block-9d8173dd79d1467a943e96af92fa7292"><li><b>每一份数据是KeyValue键值对</b></li></ul><ul class="notion-list notion-list-disc notion-block-d8000f4015914540a9ff99912bbf55c1"><li><b>可以通过Key获取到Value，Ktv不可重复(重复会覆盖)</b></li></ul><ul class="notion-list notion-list-disc notion-block-b1b4f2d146a94eeeb6d7f2c5be54c22c"><li>不支持下标索引</li></ul><ul class="notion-list notion-list-disc notion-block-ad9bcb5e9b3a4d4c91f85cf0c5536b62"><li>可以修改(增加或删除更新元素等)</li></ul><ul class="notion-list notion-list-disc notion-block-41e46c23323b470eab3250e4a9c50a62"><li>支持for循环，</li></ul><ul class="notion-list notion-list-disc notion-block-d0bc7013b51b4d838413468aaf0f87fa"><li>不支持while循环</li></ul></div></details><details class="notion-toggle notion-block-055795708b6e40c0b9225d5920f6ca4b"><summary><h3 class="notion-h notion-h2 notion-h-indent-1 notion-block-055795708b6e40c0b9225d5920f6ca4b" data-id="055795708b6e40c0b9225d5920f6ca4b"><span><div id="055795708b6e40c0b9225d5920f6ca4b" class="notion-header-anchor"></div><span class="notion-h-title">九、五种容器总结</span></span></h3></summary><div></div></details><details class="notion-toggle notion-block-7435a57ec4b24b6281d7a3c7ca4eff81"><summary><h4 class="notion-h notion-h3 notion-h-indent-2 notion-block-7435a57ec4b24b6281d7a3c7ca4eff81" data-id="7435a57ec4b24b6281d7a3c7ca4eff81"><span><div id="7435a57ec4b24b6281d7a3c7ca4eff81" class="notion-header-anchor"></div><span class="notion-h-title">1. 容器的分类</span></span></h4></summary><div><table class="notion-simple-table notion-block-0fdf59d23da34d989649361dc493629a"><tbody><tr class="notion-simple-table-row notion-simple-table-header-row notion-block-75096f7c74014cc39879efb7776582ad"><td class="notion-simple-table-header-cell" style="width:120px"><div class="notion-simple-table-cell"><b>分类</b></div></td><td class="" style="width:120px"><div class="notion-simple-table-cell"><b>元组</b></div></td><td class="" style="width:120px"><div class="notion-simple-table-cell"><b>集合</b></div></td><td class="" style="width:120px"><div class="notion-simple-table-cell"><b>字典</b></div></td><td class="" style="width:120px"><div class="notion-simple-table-cell"><b>字符串</b></div></td><td class="" style="width:120px"><div class="notion-simple-table-cell"><b>列表</b></div></td></tr><tr class="notion-simple-table-row notion-block-6f433ca366a5446eb564227721a0b09d"><td class="notion-simple-table-header-cell" style="width:120px"><div class="notion-simple-table-cell">元素数量</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">支持多个</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">支持多个</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">支持多个</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">支持多个</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">支持多个</div></td></tr><tr class="notion-simple-table-row notion-block-cfa29051bf1249f7966a3759466f3642"><td class="notion-simple-table-header-cell" style="width:120px"><div class="notion-simple-table-cell">元素类型</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">任意</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">任意</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">Key: Value Key: 除字典外任意类型 Value: 任意类型</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell"><b>仅字符</b></div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">任意</div></td></tr><tr class="notion-simple-table-row notion-block-54a14eeaa93e4767962067dec66aa658"><td class="notion-simple-table-header-cell" style="width:120px"><div class="notion-simple-table-cell">下标索引</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">支持</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell"><b>不支持</b></div></td><td class="" style="width:120px"><div class="notion-simple-table-cell"><b>不支持</b></div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">支持</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">支持</div></td></tr><tr class="notion-simple-table-row notion-block-925ce2f4746340529aa5cb0afa3ffe1c"><td class="notion-simple-table-header-cell" style="width:120px"><div class="notion-simple-table-cell">重复元素</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">支持</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell"><b>不支持</b></div></td><td class="" style="width:120px"><div class="notion-simple-table-cell"><b>不支持</b></div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">支持</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">支持</div></td></tr><tr class="notion-simple-table-row notion-block-a882dbddb92e4114a04c46a65459b2a9"><td class="notion-simple-table-header-cell" style="width:120px"><div class="notion-simple-table-cell">可修改性</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell"><b>不支持</b></div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">支持</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">支持</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell"><b>不支持</b></div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">支持</div></td></tr><tr class="notion-simple-table-row notion-block-ff4ae50ac1694d39829fc0135043eafb"><td class="notion-simple-table-header-cell" style="width:120px"><div class="notion-simple-table-cell">数据有序</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">是</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell"><b>否</b></div></td><td class="" style="width:120px"><div class="notion-simple-table-cell"><b>否</b></div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">是</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">是</div></td></tr><tr class="notion-simple-table-row notion-block-1471bf19b55245a5a9e6beb0f0c5cf13"><td class="notion-simple-table-header-cell" style="width:120px"><div class="notion-simple-table-cell">使用场景</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">不可修改、可重复的一批数据记录场景</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">不可重复的数据记录场景</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">以 Key 检索 Value 的数据记录场景</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">一串字符的记录场景</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">可修改、可重复的一批数据记录场景</div></td></tr></tbody></table><ul class="notion-list notion-list-disc notion-block-9f35c947b05d4f8a9ef682af5e10d344"><li>五类容器都支持for循环</li></ul><ul class="notion-list notion-list-disc notion-block-a57be251b08e4903a27fe9e7e3f36634"><li>集合和字典不支持while循环</li></ul></div></details><details class="notion-toggle notion-block-8d3defae6675402489426c441c2a9a69"><summary><h4 class="notion-h notion-h3 notion-h-indent-2 notion-block-8d3defae6675402489426c441c2a9a69" data-id="8d3defae6675402489426c441c2a9a69"><span><div id="8d3defae6675402489426c441c2a9a69" class="notion-header-anchor"></div><span class="notion-h-title">2. 容器的通用操作</span></span></h4></summary><div><div class="notion-text notion-block-ccdd7c877061456190703819de271dc4"><b>通用统计功能</b></div><ol start="1" class="notion-list notion-list-numbered notion-block-6347b4ca624e48679a995224fe244fc3" style="list-style-type:decimal"><li><code class="notion-inline-code">len(容器)</code></li><ol class="notion-list notion-list-numbered notion-block-6347b4ca624e48679a995224fe244fc3" style="list-style-type:lower-alpha"><ul class="notion-list notion-list-disc notion-block-15a03c76ef0c43df8fc35628cd9cc471"><li>统计元素个数</li></ul></ol></ol><ol start="2" class="notion-list notion-list-numbered notion-block-782f62d8138d4ef78d835b9608f6483c" style="list-style-type:decimal"><li><code class="notion-inline-code">max(容器)</code></li><ol class="notion-list notion-list-numbered notion-block-782f62d8138d4ef78d835b9608f6483c" style="list-style-type:lower-alpha"><ul class="notion-list notion-list-disc notion-block-a8e1e93246614870831bc06c5de131ed"><li>统计容器的最大元素</li></ul></ol></ol><ol start="3" class="notion-list notion-list-numbered notion-block-e844678dec6144918c7e455b18fe2b08" style="list-style-type:decimal"><li><code class="notion-inline-code">min(容器)</code></li><ol class="notion-list notion-list-numbered notion-block-e844678dec6144918c7e455b18fe2b08" style="list-style-type:lower-alpha"><ul class="notion-list notion-list-disc notion-block-78ce5230e8f048fe9a320ea38b461e10"><li>统计容器的最小元素</li></ul></ol></ol><div class="notion-text notion-block-b99388dcf17349c1961c54984a882f43"><b>通用转换功能</b></div><ul class="notion-list notion-list-disc notion-block-a7a0ab97a13b446b9534cd359ae37759"><li>注意字典在转换为非字符串的时候，会丢失value</li></ul><ol start="1" class="notion-list notion-list-numbered notion-block-4ca1a70c21e04a738062f6744c59f252" style="list-style-type:decimal"><li><code class="notion-inline-code">list(容器)</code></li><ol class="notion-list notion-list-numbered notion-block-4ca1a70c21e04a738062f6744c59f252" style="list-style-type:lower-alpha"><ul class="notion-list notion-list-disc notion-block-b12b524b9cb540e9845879cbf14f4d54"><li>将给定容器转换为列表</li></ul></ol></ol><ol start="2" class="notion-list notion-list-numbered notion-block-9e5c540cb1a8490ebaee3d0c3e99c03e" style="list-style-type:decimal"><li><code class="notion-inline-code">str(容器)</code></li><ol class="notion-list notion-list-numbered notion-block-9e5c540cb1a8490ebaee3d0c3e99c03e" style="list-style-type:lower-alpha"><ul class="notion-list notion-list-disc notion-block-f5275375dfc442cba0e3c2a6884648f7"><li>将给定容器转换为字符串</li></ul></ol></ol><ol start="3" class="notion-list notion-list-numbered notion-block-ee5c59ce41154afe90fb9869f73bd291" style="list-style-type:decimal"><li><code class="notion-inline-code">tuple(容器)</code></li><ol class="notion-list notion-list-numbered notion-block-ee5c59ce41154afe90fb9869f73bd291" style="list-style-type:lower-alpha"><ul class="notion-list notion-list-disc notion-block-11fb00a4ce2d4849b585b89f2d9b23b3"><li>将给定容器转换为元组</li></ul></ol></ol><ol start="4" class="notion-list notion-list-numbered notion-block-4ad33289f6e14245a95af9926bed577e" style="list-style-type:decimal"><li><code class="notion-inline-code">set(容器)</code></li><ol class="notion-list notion-list-numbered notion-block-4ad33289f6e14245a95af9926bed577e" style="list-style-type:lower-alpha"><ul class="notion-list notion-list-disc notion-block-1e6e6b679a8b4946b6d059389d4cd60e"><li>将给定容器转换为集合</li></ul></ol></ol><div class="notion-text notion-block-0a45a45badcd4eb7a3fa00acbe3f9990">通用排序功能</div><ol start="1" class="notion-list notion-list-numbered notion-block-dbdcc1925dd446febc92225e29d2d3e1" style="list-style-type:decimal"><li><code class="notion-inline-code">sorted(容器,[reverse=True])</code></li><ol class="notion-list notion-list-numbered notion-block-dbdcc1925dd446febc92225e29d2d3e1" style="list-style-type:lower-alpha"><ul class="notion-list notion-list-disc notion-block-b5f1f87c974e414ca04b152140d7c0d6"><li>将给定容器进行排序</li></ul><ul class="notion-list notion-list-disc notion-block-e27627214b234aa591c1e90ef7b211e5"><li>注意：会放到列表中，字典在排序的时候会丢失value</li></ul></ol></ol></div></details><div class="notion-callout notion-gray_background_co notion-block-55fe98b9242143558b8587f5ad11f365"><div class="notion-page-icon-inline notion-page-icon-span"><span class="notion-page-icon" role="img" aria-label="💡">💡</span></div><div class="notion-callout-text"><div class="notion-text notion-block-cd05e1e3b6314b3b86a785236c86066e">欢迎您在底部评论区留言，一起交流~</div></div></div></main></div>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[ESP8266模块学习]]></title>
            <link>https://www.mcoi.top/article/Post-ESP8266</link>
            <guid>https://www.mcoi.top/article/Post-ESP8266</guid>
            <pubDate>Fri, 02 Aug 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[主要记录了ESP8266模块的烧录和AT指令]]></description>
            <content:encoded><![CDATA[<div id="notion-article" class="mx-auto overflow-hidden "><main class="notion light-mode notion-page notion-block-2a9e940c69bb80c78214ce29eb8079cf"><div class="notion-viewport"></div><div class="notion-collection-page-properties"></div><div class="notion-callout notion-gray_background_co notion-block-2a9e940c69bb80ea8d16e2af6396690d"><div class="notion-page-icon-inline notion-page-icon-span"><span class="notion-page-icon" role="img" aria-label="😀">😀</span></div><div class="notion-callout-text">Hi，这是我学习绘制F1最小系统板的笔记。</div></div><h2 class="notion-h notion-h1 notion-h-indent-0 notion-block-2a9e940c69bb80828d53f814a350c9cf" data-id="2a9e940c69bb80828d53f814a350c9cf"><span><div id="2a9e940c69bb80828d53f814a350c9cf" class="notion-header-anchor"></div><a class="notion-hash-link" href="#2a9e940c69bb80828d53f814a350c9cf" title="ESP8266烧录"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">ESP8266烧录</span></span></h2><ol start="1" class="notion-list notion-list-numbered notion-block-2a9e940c69bb8023b3b9ebe350ca3dec" style="list-style-type:decimal"><li>AT固件可重官网下载：<a class="notion-link" href="http://wiki.ai-thinker.com/esp8266/sdk" target="_blank" rel="noopener noreferrer">http://wiki.ai-thinker.com/esp8266/sdk</a> </li></ol><ol start="2" class="notion-list notion-list-numbered notion-block-2a9e940c69bb8026ae7cf8d68aff4ea3" style="list-style-type:decimal"><li>使用flash_download_tool软件烧录</li></ol><ol start="3" class="notion-list notion-list-numbered notion-block-2a9e940c69bb80e4b4c0f1aa91518e83" style="list-style-type:decimal"><li>选择AT固件，后面地址填0x00000 注意前面必须打上勾</li></ol><blockquote class="notion-quote notion-block-2a9e940c69bb803ba932e33759dfe804"><div>引脚－接法
GND－GND
VCC－3v3
EN(CH-PD)－VCC
GPIO0－GND
RXD－TXD
TXD－RXD</div></blockquote><div class="notion-text notion-block-2a9e940c69bb80e29f51c19c5cb09e7b">选择40MHZ、QIO、其他默认</div><div class="notion-text notion-block-2a9e940c69bb80f9a41eed4f4e9746a1">选择端口号烧录</div><div class="notion-text notion-block-2a9e940c69bb80a0ad9ffd6dbef9c477">测试：发送AT、回复OK就可</div><h2 class="notion-h notion-h1 notion-h-indent-0 notion-block-2a9e940c69bb801db663c89ea741db7f" data-id="2a9e940c69bb801db663c89ea741db7f"><span><div id="2a9e940c69bb801db663c89ea741db7f" class="notion-header-anchor"></div><a class="notion-hash-link" href="#2a9e940c69bb801db663c89ea741db7f" title="ESP8266模块 AT指令学习笔记"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title"><b>ESP8266模块 AT指令学习笔记</b></span></span></h2><h3 class="notion-h notion-h2 notion-h-indent-1 notion-block-2a9e940c69bb80c28c5dcf828eefcb66" data-id="2a9e940c69bb80c28c5dcf828eefcb66"><span><div id="2a9e940c69bb80c28c5dcf828eefcb66" class="notion-header-anchor"></div><a class="notion-hash-link" href="#2a9e940c69bb80c28c5dcf828eefcb66" title="零、简介"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">零、简介</span></span></h3><div class="notion-text notion-block-2a9e940c69bb80c384c3fbd9f100ddd6">感谢百文网韦东山 老师对ESP8266模块的讲解</div><div class="notion-text notion-block-2a9e940c69bb8030b989ee1f6af0bd5c"><b>笔记在CSDN也有文章备份</b></div><div class="notion-text notion-block-2a9e940c69bb8086b716cedad393e424"><b>大家可以在我的gitee仓库 中下载笔记源文件、ESP8266资料等</b></div><div class="notion-text notion-block-2a9e940c69bb80ca8217c7840eec26ca"><b>笔记源文件可以在Notion中导入</b></div><h3 class="notion-h notion-h2 notion-h-indent-1 notion-block-2a9e940c69bb80769578c1a79b79c34d" data-id="2a9e940c69bb80769578c1a79b79c34d"><span><div id="2a9e940c69bb80769578c1a79b79c34d" class="notion-header-anchor"></div><a class="notion-hash-link" href="#2a9e940c69bb80769578c1a79b79c34d" title="一、ESP8266-01S模块详细介绍"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">一、ESP8266-01S模块详细介绍</span></span></h3><details class="notion-toggle notion-block-2a9e940c69bb80fc8875e9402964ffcd"><summary><h4 class="notion-h notion-h3 notion-h-indent-2 notion-block-2a9e940c69bb80fc8875e9402964ffcd" data-id="2a9e940c69bb80fc8875e9402964ffcd"><span><div id="2a9e940c69bb80fc8875e9402964ffcd" class="notion-header-anchor"></div><span class="notion-h-title">1. 名字的由来</span></span></h4></summary><div><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb80138fa4f6d917af3e6b"><li>ESP8266 是方形的主控芯片</li></ul><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb8028b7eafe1822d2ccf9"><li>旁边的长方形是一个Flash</li></ul><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb809286e4fe7bb1ac616c"><li>-01S 是用来区分基于ESP8266芯片做成的型号（种类）</li></ul><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb80c1b93ad59c060216df"><li>也能称ESP8266-01S为ESP-01S</li></ul><div class="notion-blank notion-block-2a9e940c69bb80a1b6ead72bc6304b8d"> </div><details class="notion-toggle notion-block-5e63095ae4a84d72a8ef11b7901c0ebd"><summary><h4 class="notion-h notion-h3 notion-block-5e63095ae4a84d72a8ef11b7901c0ebd" data-id="5e63095ae4a84d72a8ef11b7901c0ebd"><span><div id="5e63095ae4a84d72a8ef11b7901c0ebd" class="notion-header-anchor"></div><span class="notion-h-title">2. 引脚定义</span></span></h4></summary><div><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-93530801626448249a3ab64d40a0dc35"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:100%;max-width:100%;flex-direction:column"><img style="object-fit:cover" src="https://cdn.jsdmirror.com/gh/LZJ-I/picx-images-hosting@main/images/%E5%B7%A5%E5%85%B7%E4%B8%8E%E9%85%8D%E7%BD%AE/Post-ESP8266/b0a5b746-d1ce-4e1f-ae82-54170f113195-image.webp?spaceId=3a565fcb-f425-4846-b72a-d32a98183896&amp;t=93530801-6264-4824-9a3a-b64d40a0dc35" alt="notion image" loading="lazy" decoding="async"/></div></figure><div class="notion-text notion-block-6be00269cd1d4453b75ecd73d66b2541">单片机常用连接方式</div><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-8f795c504b95494d8a5c9982af3f275f"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:100%;max-width:100%;flex-direction:column"><img style="object-fit:cover" src="https://cdn.jsdmirror.com/gh/LZJ-I/picx-images-hosting@main/images/%E5%B7%A5%E5%85%B7%E4%B8%8E%E9%85%8D%E7%BD%AE/Post-ESP8266/c5bd9ab7-1562-4801-896e-789f458964e9-image.webp?spaceId=3a565fcb-f425-4846-b72a-d32a98183896&amp;t=8f795c50-4b95-494d-8a5c-9982af3f275f" alt="notion image" loading="lazy" decoding="async"/></div></figure></div></details><details class="notion-toggle notion-block-26209254799340f382edd6ddf381c198"><summary><h4 class="notion-h notion-h3 notion-block-26209254799340f382edd6ddf381c198" data-id="26209254799340f382edd6ddf381c198"><span><div id="26209254799340f382edd6ddf381c198" class="notion-header-anchor"></div><span class="notion-h-title">3. 与ESP826601对比</span></span></h4></summary><div><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-f2793f34a7e44fee957cbb08b5fb6a2c"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:100%;max-width:100%;flex-direction:column"><img style="object-fit:cover" src="https://cdn.jsdmirror.com/gh/LZJ-I/picx-images-hosting@main/images/%E5%B7%A5%E5%85%B7%E4%B8%8E%E9%85%8D%E7%BD%AE/Post-ESP8266/042bf2e6-60be-4e58-a575-6239b16014bf-image.webp?spaceId=3a565fcb-f425-4846-b72a-d32a98183896&amp;t=f2793f34-a7e4-4fee-957c-bb08b5fb6a2c" alt="notion image" loading="lazy" decoding="async"/></div></figure><ol start="1" class="notion-list notion-list-numbered notion-block-97df39615e5e4130b31dead024471836" style="list-style-type:decimal"><li>ESP8266-01</li><ol class="notion-list notion-list-numbered notion-block-97df39615e5e4130b31dead024471836" style="list-style-type:lower-alpha"><ul class="notion-list notion-list-disc notion-block-06162b85924c451a9c26244691d2e05a"><li>两个灯，一个为电源，一个为串口信号灯（有串口发送会一闪一闪的）</li></ul><ul class="notion-list notion-list-disc notion-block-bff67ac34000477aa2f20fa7aa6cec71"><li>在接线时还需要把4引脚拉高（官方建议再接个电阻）</li></ul></ol></ol><ol start="2" class="notion-list notion-list-numbered notion-block-a5a9afbbdf60434198a0acd112b10c60" style="list-style-type:decimal"><li>ESP8266-01S</li><ol class="notion-list notion-list-numbered notion-block-a5a9afbbdf60434198a0acd112b10c60" style="list-style-type:lower-alpha"><ul class="notion-list notion-list-disc notion-block-1e21cc0a40ad4070a82d34e106dd9dd4"><li>一个灯，但为信号灯</li></ul><ul class="notion-list notion-list-disc notion-block-c16651f83c6147a18f0b5d9709d5bb56"><li>正面有ESP-01S的丝印</li></ul><ul class="notion-list notion-list-disc notion-block-8b95234ff98d4725be73dc30860f18c0"><li>背面有引脚名称的丝印</li></ul><ul class="notion-list notion-list-disc notion-block-aa92079626c8498f8f3f455362ec6128"><li>在接线时只需要RX、TX、GND和3V3接好就OK了</li></ul></ol></ol></div></details></div></details><h3 class="notion-h notion-h2 notion-h-indent-1 notion-block-2a9e940c69bb80dc8c97faa9893bd603" data-id="2a9e940c69bb80dc8c97faa9893bd603"><span><div id="2a9e940c69bb80dc8c97faa9893bd603" class="notion-header-anchor"></div><a class="notion-hash-link" href="#2a9e940c69bb80dc8c97faa9893bd603" title="二、AT指令简介"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">二、AT指令简介</span></span></h3><div class="notion-text notion-block-2a9e940c69bb803baa12e5951765120e">全程AT command set，AT 是 Attention的缩写。</div><div class="notion-text notion-block-2a9e940c69bb801eb4c9c4a677258e45">出自Dennis Hayes，为海斯智能300所开发的一种命令语言。</div><div class="notion-text notion-block-2a9e940c69bb80d9b78dfb9713a46e64">可以使用指令集 与 设备进行沟通</div><h3 class="notion-h notion-h2 notion-h-indent-1 notion-block-2a9e940c69bb80639a51c3911ede2cb2" data-id="2a9e940c69bb80639a51c3911ede2cb2"><span><div id="2a9e940c69bb80639a51c3911ede2cb2" class="notion-header-anchor"></div><a class="notion-hash-link" href="#2a9e940c69bb80639a51c3911ede2cb2" title="三、AT指令注意事项"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">三、AT指令注意事项</span></span></h3><blockquote class="notion-quote notion-block-2a9e940c69bb80278e6ee34a3579913e"><div>注意事项</div><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb80ea8af3c94265975f0d"><li>不是每条<em> AT </em>指令都具备上述<em> 4 </em>种类型的命令。</li></ul><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb80f4863cd44368ddaad8"><li>括号内为缺省值，不必填写或者可能不显示。</li></ul><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb80b09c5bf43759d5b66a"><li>使⽤双引号表示字符串数据<em> ”string”</em>，例如：AT+CWSAP=&quot;ESP756290&quot;,&quot;21030826&quot;,1,4</li></ul><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb801dafaec9833792ca73"><li>默认波特率为<em> 115200</em>。</li></ul><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb8084b4f7ce2cfeb795e8"><li><em>AT </em>指令必须⼤写，并且以回⻋换⾏符结尾（<em>CR LF</em>）。</li></ul></blockquote><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb80ec8e38cca24b1fbf46"><li>对于认识的指令，他会作出处理并返回OK</li></ul><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb8065b51fea3766003ba1"><li>对于不认识的指令，他会返回ERROR！</li></ul><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb8049bfe8e4ca59a4a0e3"><li><b>指令必须全部大写</b>（其实AT可以小写），</li></ul><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb80efaec0f67317563991"><li><b>指令必须以\r\n结尾</b>（否则ESP8266会认为是一条指令，直到\r\n换行）</li><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb80efaec0f67317563991"><li>CR (Carriage Return) 表示回车</li><li>LF (Line Feed) 表示换行</li><li>Dos和Windows采用回车+换行(CR+LF)表示下一行</li><li>而UNIX/Linux采用换行符:(LF)表示下一行</li><li>MAC OS系统采用回车符(CR)表示下一行</li><li>所以 Windows下编写的Shell脚本，直接放到linux/unix下执行会报错，就是因为行结束符不一样导致的。</li><li>\r为回车  \n为换行</li></ul></ul><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb80818cefc77faeab4b79"><li>ESP8266默认的波特率为115200</li></ul><div class="notion-text notion-block-2a9e940c69bb806a851fccc2ba69c17f">例如<div class="notion-text-children"><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb80dd953cf835d76b2794"><li>串口发送：AT ，那么会收到OK</li></ul><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb80a69518efab933e685d"><li>发送AT+RST ，ESP8266会重置，并打印日志，最后输出Ready</li></ul></div></div><div class="notion-text notion-block-2a9e940c69bb80669907fda6b3df31fe">AT指令详情参考《ESP8266 Non-OS SDK AT 指令集_V3.0.1.pdf》</div><h3 class="notion-h notion-h2 notion-h-indent-1 notion-block-2a9e940c69bb80dbae57cf4a7e357a83" data-id="2a9e940c69bb80dbae57cf4a7e357a83"><span><div id="2a9e940c69bb80dbae57cf4a7e357a83" class="notion-header-anchor"></div><a class="notion-hash-link" href="#2a9e940c69bb80dbae57cf4a7e357a83" title="四、AT指令的分类和提示信息"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">四、AT指令的分类和提示信息</span></span></h3><details class="notion-toggle notion-block-2a9e940c69bb803b9410c6a89832edc2"><summary><h4 class="notion-h notion-h3 notion-h-indent-2 notion-block-2a9e940c69bb803b9410c6a89832edc2" data-id="2a9e940c69bb803b9410c6a89832edc2"><span><div id="2a9e940c69bb803b9410c6a89832edc2" class="notion-header-anchor"></div><span class="notion-h-title">1. 四种类型</span></span></h4></summary><div><div class="notion-text notion-block-2a9e940c69bb807fa075fe815c00a685">AT指令可以细分为四种类型</div><ol start="1" class="notion-list notion-list-numbered notion-block-2a9e940c69bb80679368f38680f87661" style="list-style-type:decimal"><li>测试指令</li><ol class="notion-list notion-list-numbered notion-block-2a9e940c69bb80679368f38680f87661" style="list-style-type:lower-alpha"><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb8051b9abedcc90c6cbd2"><li>该命令用于该命令用于查询设置指令的参数以及取值范围</li></ul><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb80d0ade3c6ce43411dc2"><li>指令格式：AT+&lt;x&gt;=?</li></ul></ol></ol><ol start="2" class="notion-list notion-list-numbered notion-block-2a9e940c69bb80e4aff9d091cb1fb548" style="list-style-type:decimal"><li>查询指令</li><ol class="notion-list notion-list-numbered notion-block-2a9e940c69bb80e4aff9d091cb1fb548" style="list-style-type:lower-alpha"><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb8014865fd4ac8634552b"><li>该命令用于返回参数的当前值。</li></ul><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb808180b7ff77c1d2cc15"><li>指令格式：AT+&lt;x&gt;?</li></ul></ol></ol><ol start="3" class="notion-list notion-list-numbered notion-block-2a9e940c69bb80898c31c48cc1df4bd3" style="list-style-type:decimal"><li>设置指令</li><ol class="notion-list notion-list-numbered notion-block-2a9e940c69bb80898c31c48cc1df4bd3" style="list-style-type:lower-alpha"><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb80feb94be7ed6a73c132"><li>该命令用于设置用户自定义的参数值。</li></ul><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb80b5b07fd2815d18c44a"><li>指令格式：AT+&lt;x&gt;=&lt;…&gt;</li></ul></ol></ol><ol start="4" class="notion-list notion-list-numbered notion-block-2a9e940c69bb80109b1ef14e9b5e1d21" style="list-style-type:decimal"><li>执行指令</li><ol class="notion-list notion-list-numbered notion-block-2a9e940c69bb80109b1ef14e9b5e1d21" style="list-style-type:lower-alpha"><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb809dbe59c488c69ac827"><li>该命令用于执行受模块内部程序控制的参数不可变的功能，</li></ul><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb80989731d5519b2cc541"><li>指令格式：AT+&lt;x&gt;</li></ul></ol></ol><details class="notion-toggle notion-block-cac9d0a4a75e4c4e89243dfdfb517927"><summary><h4 class="notion-h notion-h3 notion-block-cac9d0a4a75e4c4e89243dfdfb517927" data-id="cac9d0a4a75e4c4e89243dfdfb517927"><span><div id="cac9d0a4a75e4c4e89243dfdfb517927" class="notion-header-anchor"></div><span class="notion-h-title">2. 简单测试</span></span></h4></summary><div><div class="notion-text notion-block-2f64992d46544cae96c4bd787c5df2d5">例如可以使用测试指令查看取值列表、查询指令查询当前模式是什么、设置指令设置当前模式。</div><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-773262978ed14449a448590bde89cd0d"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:100%;max-width:100%;flex-direction:column"><img style="object-fit:cover" src="https://cdn.jsdmirror.com/gh/LZJ-I/picx-images-hosting@main/images/%E5%B7%A5%E5%85%B7%E4%B8%8E%E9%85%8D%E7%BD%AE/Post-ESP8266/0dcbfd60-fd86-43cf-b257-d823fe87ef84-image.webp?spaceId=3a565fcb-f425-4846-b72a-d32a98183896&amp;t=77326297-8ed1-4449-a448-590bde89cd0d" alt="notion image" loading="lazy" decoding="async"/></div></figure><div class="notion-text notion-block-34aba51d05e54d529c4cd41bbdb489cc">串口工具测试发送如下</div><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-691eb8fe0b474bc49bb9a82b11b60616"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:100%;max-width:100%;flex-direction:column"><img style="object-fit:cover" src="https://cdn.jsdmirror.com/gh/LZJ-I/picx-images-hosting@main/images/%E5%B7%A5%E5%85%B7%E4%B8%8E%E9%85%8D%E7%BD%AE/Post-ESP8266/984a7bf4-64cb-4413-8422-62a61eee80a8-image.webp?spaceId=3a565fcb-f425-4846-b72a-d32a98183896&amp;t=691eb8fe-0b47-4bc4-9bb9-a82b11b60616" alt="notion image" loading="lazy" decoding="async"/></div></figure></div></details><details class="notion-toggle notion-block-da33f86c0d104e9da2703a28eda2ab65"><summary><h4 class="notion-h notion-h3 notion-block-da33f86c0d104e9da2703a28eda2ab65" data-id="da33f86c0d104e9da2703a28eda2ab65"><span><div id="da33f86c0d104e9da2703a28eda2ab65" class="notion-header-anchor"></div><span class="notion-h-title">3. CUR与DEF</span></span></h4></summary><div><div class="notion-text notion-block-537ec67ccd08440f91d4727d2f654265">附录A：</div><blockquote class="notion-quote notion-block-d40cf84d9d554b919eaa510ef5c13be9"><div><b>AT指令有一部分分为保存到Flash和不保存到Flash
    </b>显然，保存到Flash的下次开机仍会保持，而临时的则在下次掉电 或 重启后恢复原状
    保存到Falash的指令会在手册的附录中列出（大部分的指令都有<b>后缀DEF</b>，是definite   明确的 的缩写。）
    那么临时改变的话，<b>后缀就是CUR</b>（是current  当前的 的缩写）
如果不加后缀，那么默认是保存在Flash中的，即带DEF后缀
例如AT+CWMODE=3（AT+CWMODE_DEF=3）</div></blockquote></div></details><details class="notion-toggle notion-block-0193baf79776443ebc656277605284c2"><summary><h4 class="notion-h notion-h3 notion-block-0193baf79776443ebc656277605284c2" data-id="0193baf79776443ebc656277605284c2"><span><div id="0193baf79776443ebc656277605284c2" class="notion-header-anchor"></div><span class="notion-h-title">4. 提示信息</span></span></h4></summary><div><div class="notion-text notion-block-0880989840164a5d8a654fe5b70f1bb5">附录B：</div><table class="notion-simple-table notion-block-861cd9a095584432b951120d252917cc"><tbody><tr class="notion-simple-table-row notion-block-de9963c6c5ef483baa65d4ba18cd2d73"><td class="" style="width:120px"><div class="notion-simple-table-cell">提示信息</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell"><b>说明</b></div></td></tr><tr class="notion-simple-table-row notion-block-51f5378990c54f66888e8fda4675f0d0"><td class="" style="width:120px"><div class="notion-simple-table-cell">ready</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">AT 固件成功启动</div></td></tr><tr class="notion-simple-table-row notion-block-11bfec63d85e4d1bac0b2b11df91bda2"><td class="" style="width:120px"><div class="notion-simple-table-cell">ERROR</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">指令输入错误，或者指令执行出错</div></td></tr><tr class="notion-simple-table-row notion-block-908f648a2b1a45a5940d248c1fc2c743"><td class="" style="width:120px"><div class="notion-simple-table-cell">WIFI CONNECTED</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">ESP8266 station 连接到 AP</div></td></tr><tr class="notion-simple-table-row notion-block-d6a900f6a0324cf49fc995bb76636c04"><td class="" style="width:120px"><div class="notion-simple-table-cell">WIFI GOT IP</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">ESP8266 station 获取到 IP 地址</div></td></tr><tr class="notion-simple-table-row notion-block-0d679aabcbb74b0080343399c3e4f260"><td class="" style="width:120px"><div class="notion-simple-table-cell">WIFI DISCONNECT</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">ESP8266 station 的 WiFi 连接断开</div></td></tr><tr class="notion-simple-table-row notion-block-ac48e1b2c160452ea359567dde523276"><td class="" style="width:120px"><div class="notion-simple-table-cell">busy s...</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">busy sending，表示系统正在发送数据的过程中，无法响应当前输入</div></td></tr><tr class="notion-simple-table-row notion-block-d18f9166f571417a80d214fe3cfc2d90"><td class="" style="width:120px"><div class="notion-simple-table-cell">busy p...</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">busy processing，表示系统正在处理前一条指令，无法响应当前输入</div></td></tr><tr class="notion-simple-table-row notion-block-1a70645071ff495c8db1f8fa13f28097"><td class="" style="width:120px"><div class="notion-simple-table-cell">&lt;conn_id&gt;,CONNECT</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">建立了 &lt;conn_id&gt; 号网络连接</div></td></tr><tr class="notion-simple-table-row notion-block-cfe16ecc2a534563bd041a794b70b05b"><td class="" style="width:120px"><div class="notion-simple-table-cell">&lt;conn_id&gt;,CLOSED</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">&lt;conn_id&gt; 号网络连接断开</div></td></tr><tr class="notion-simple-table-row notion-block-d6bb9042a3e344afb57607e4192e558e"><td class="" style="width:120px"><div class="notion-simple-table-cell">+IPD</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">接收到网络数据</div></td></tr><tr class="notion-simple-table-row notion-block-141370b7fd5e44cdab955b488900f03e"><td class="" style="width:120px"><div class="notion-simple-table-cell">+STA_CONNECTED:&lt;sta_mac&gt;</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">有 station 连入 ESP8266 softAP</div></td></tr><tr class="notion-simple-table-row notion-block-53399afd635945969c6e9500a7ad1192"><td class="" style="width:120px"><div class="notion-simple-table-cell">+DIST_STA_IP:&lt;sta_mac&gt;,&lt;sta_ip&gt;</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">ESP8266 softAP 给连入的 station 分配 IP 地址</div></td></tr><tr class="notion-simple-table-row notion-block-eec906fd167a46e99ae2847b03feec31"><td class="" style="width:120px"><div class="notion-simple-table-cell">+STA_DISCONNECTED:&lt;sta_mac&gt;</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">station 从 ESP8266 softAP 断开连接</div></td></tr></tbody></table></div></details></div></details><h3 class="notion-h notion-h2 notion-h-indent-1 notion-block-2a9e940c69bb80f69363d31ea153e9b3" data-id="2a9e940c69bb80f69363d31ea153e9b3"><span><div id="2a9e940c69bb80f69363d31ea153e9b3" class="notion-header-anchor"></div><a class="notion-hash-link" href="#2a9e940c69bb80f69363d31ea153e9b3" title="五、使用AT指令的简单方法"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">五、使用AT指令的简单方法</span></span></h3><div class="notion-text notion-block-2a9e940c69bb8046966cc5c6d5bc4ed3"><b>使用AT指令的大概步骤：</b></div><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb80d8aa38c19417a3e77a"><li>打开AT文档</li></ul><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb80599e94fa69084e7bcc"><li>找到指令所在的位置</li></ul><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb80628866d01f8ed3d33f"><li>查看指令说明</li><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb80628866d01f8ed3d33f"><li>指令类型</li><li>相应信息</li><li>注意事项</li><li>参数说明</li><li>指令示例</li></ul></ul><h3 class="notion-h notion-h2 notion-h-indent-1 notion-block-2a9e940c69bb800aa532eb3672e45786" data-id="2a9e940c69bb800aa532eb3672e45786"><span><div id="2a9e940c69bb800aa532eb3672e45786" class="notion-header-anchor"></div><a class="notion-hash-link" href="#2a9e940c69bb800aa532eb3672e45786" title="六、AT指令应用示例"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">六、AT指令应用示例</span></span></h3><div class="notion-text notion-block-2a9e940c69bb80ccae3ef3edf34c123e">以下示例，均来自乐鑫官方的《ESP8266 AT 指令使⽤示例.pdf》文档</div><details class="notion-toggle notion-block-2a9e940c69bb80339752e1e2c039471e"><summary><h4 class="notion-h notion-h3 notion-h-indent-2 notion-block-2a9e940c69bb80339752e1e2c039471e" data-id="2a9e940c69bb80339752e1e2c039471e"><span><div id="2a9e940c69bb80339752e1e2c039471e" class="notion-header-anchor"></div><span class="notion-h-title">1.  TCP 单连接 Client</span></span></h4></summary><div><ol start="1" class="notion-list notion-list-numbered notion-block-2a9e940c69bb80d9819fefcad48b1448" style="list-style-type:decimal"><li>配置 WiFi 模式：</li><ol class="notion-list notion-list-numbered notion-block-2a9e940c69bb80d9819fefcad48b1448" style="list-style-type:lower-alpha"><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb80e484b8f4cfb78d42da"><li>使用命令 “AT+CWMODE=3”，设置为可连可被连模式。</li></ul><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb807d815bc445f16305a0"><li>响应：OK。</li></ul></ol></ol><ol start="2" class="notion-list notion-list-numbered notion-block-2a9e940c69bb80aaa478e6bd9c397f4c" style="list-style-type:decimal"><li>连接路由器（热点）：</li><ol class="notion-list notion-list-numbered notion-block-2a9e940c69bb80aaa478e6bd9c397f4c" style="list-style-type:lower-alpha"><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb80d3a5b5f471fd88991f"><li>使用命令 “AT+CWJAP=&quot;SSID&quot;,&quot;password&quot;”（其中 SSID 是 wifi 名称，后者为密码）。</li></ul><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb804fadbbfeda052931b7"><li>响应：OK。</li></ul></ol></ol><ol start="3" class="notion-list notion-list-numbered notion-block-2a9e940c69bb808a9f1fc514b959d3a2" style="list-style-type:decimal"><li>查询 ESP8266 设备的 IP 地址：</li><ol class="notion-list notion-list-numbered notion-block-2a9e940c69bb808a9f1fc514b959d3a2" style="list-style-type:lower-alpha"><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb80d1b129f67179685751"><li>使用命令 “AT+CIFSR”。</li></ul><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb803e92dadce7ef6169d1"><li>响应：</li><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb803e92dadce7ef6169d1"></ul></ul></ol></ol><ol start="4" class="notion-list notion-list-numbered notion-block-2a9e940c69bb80f09eb3ddc94f5dbe77" style="list-style-type:decimal"><li>PC 与 ESP8266 设备连接同一路由器，在 PC 端使用网络调试工具，建立一个 TCP 服务器。</li><ol class="notion-list notion-list-numbered notion-block-2a9e940c69bb80f09eb3ddc94f5dbe77" style="list-style-type:lower-alpha"><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb80bbb815f87793019b40"><li>假设 PC 创建的服务器 IP 地址为 192.168.3.116，端口为 8080。</li><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb80bbb815f87793019b40"><li>这里使用了网络调试工具，监听PC端所处的网关</li></ul></ul></ol></ol><ol start="5" class="notion-list notion-list-numbered notion-block-2a9e940c69bb80ff9cf2d81ecaf8775a" style="list-style-type:decimal"><li>ESP8266 设备作为 TCP client 连接到上述服务器：</li><ol class="notion-list notion-list-numbered notion-block-2a9e940c69bb80ff9cf2d81ecaf8775a" style="list-style-type:lower-alpha"><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb8013ac53e850c54fc389"><li>使用命令 “AT+CIPSTART=&quot;TCP&quot;,&quot;192.168.3.116&quot;,8080”
（protocol、server IP 和 port）（协议、IP地址、端口）。</li></ul><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb808c9fcdf6a3ac7e4598"><li>响应：OK。</li></ul></ol></ol><ol start="6" class="notion-list notion-list-numbered notion-block-2a9e940c69bb8089a548c2e3d1e8663c" style="list-style-type:decimal"><li>ESP8266 设备向服务器发送数据：</li><ol class="notion-list notion-list-numbered notion-block-2a9e940c69bb8089a548c2e3d1e8663c" style="list-style-type:lower-alpha"><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb80e397ebec0cb8c86b18"><li>使用命令 “AT+CIPSEND=4”（设置要发送的数据长度，例如 4 字节）。</li></ul><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb8081ac19d1ae29d99cfd"><li>输入 1234”（输入数据，无回车符）。</li></ul><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb80f1967afa9175d3c09e"><li>响应：Recv 4 bytes     SEND OK。</li></ul></ol></ol><ol start="7" class="notion-list notion-list-numbered notion-block-2a9e940c69bb80db9259e4c262b45bb7" style="list-style-type:decimal"><li>当 ESP8266 设备接收到服务器发来的数据，将提示如下信息：</li><ol class="notion-list notion-list-numbered notion-block-2a9e940c69bb80db9259e4c262b45bb7" style="list-style-type:lower-alpha"><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb804cb7f9c4ec1d7f1008"><li>“+IPD,n:xxxxxxxxxx”</li></ul><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb8040addac3cbe2e10761"><li>n指接收到的字节，后面的xx为接收到的数据</li></ul><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb804fbad1e7ce7d05546f"><li><b>例如
默认这里的3，指的是接收到3字节（因为发送时有\r\n换行回车，他们各占一个字节）（中文每个占2字节</b>）</li><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb804fbad1e7ce7d05546f"></ul></ul></ol></ol></div></details><details class="notion-toggle notion-block-2a9e940c69bb809db9a9f4dc30a90c70"><summary><h4 class="notion-h notion-h3 notion-h-indent-2 notion-block-2a9e940c69bb809db9a9f4dc30a90c70" data-id="2a9e940c69bb809db9a9f4dc30a90c70"><span><div id="2a9e940c69bb809db9a9f4dc30a90c70" class="notion-header-anchor"></div><span class="notion-h-title">2. UDP 传输_固定远端的UDP通信</span></span></h4></summary><div><div class="notion-text notion-block-2a9e940c69bb80efa209ebd1e9c1476f">基础配置：</div><ol start="1" class="notion-list notion-list-numbered notion-block-2a9e940c69bb80e084f1d6b1a4f16dae" style="list-style-type:decimal"><li>配置 WiFi 模式： <code class="notion-inline-code">AT+CWMODE=1</code></li></ol><ol start="2" class="notion-list notion-list-numbered notion-block-2a9e940c69bb80dcaf74f517f7a0fa05" style="list-style-type:decimal"><li>连接路由器（热点）：<code class="notion-inline-code">AT+CWJAP=&quot;SSID&quot;,&quot;password</code></li></ol><ol start="3" class="notion-list notion-list-numbered notion-block-2a9e940c69bb80f3a5ecf7b63b5d2878" style="list-style-type:decimal"><li>查询 ESP8266 设备的 IP 地址： <code class="notion-inline-code">AT+CIFSR</code></li></ol><div class="notion-text notion-block-2a9e940c69bb8097b6b2eafbfe4dbf23"><b>UDP 通信步骤</b>：<div class="notion-text-children"><blockquote class="notion-quote notion-block-2a9e940c69bb80bc83a8dc0d0dca38ee"><div><b>UDP 通信远端固定规则</b>：AT+CIPSTART 指令的<b>最后一个参数设置为 0 决定UDP通信</b>为<b>远端固定</b> 。系统会分配一个连接号给这个固定连接，UDP 通信双方不会被其他设备替代。</div></blockquote><div class="notion-text notion-block-2a9e940c69bb8025aa2dd4bc085c54d0"><b>假设，PC 创建的 UDP ⾃身 IP 地址为 192.168.118.168，端⼝为 25563</b></div></div></div><ol start="1" class="notion-list notion-list-numbered notion-block-2a9e940c69bb803a8201c013c7735445" style="list-style-type:decimal"><li>使能多连接：<code class="notion-inline-code">AT+CIPMUX=1</code>。</li><ol class="notion-list notion-list-numbered notion-block-2a9e940c69bb803a8201c013c7735445" style="list-style-type:lower-alpha"><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb80129b37c38ffbb562f4"><li>多连接模式 (AT+CIPMUX=1) 时，设置指令：
<code class="notion-inline-code">AT+CIPSTART=&lt;link ID&gt;,&lt;type&gt;,&lt;remote IP&gt;,&lt;remote port&gt;[,(&lt;UDP local port&gt;)，(&lt;UDP mode&gt;)]</code></li></ul><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb8025bcdec66708eab03e"><li>&lt;link ID&gt;：⽹络连接 ID (0 ~ 4)，⽤于多连接的情况
• &lt;type&gt;：字符串参数，连接类型，&quot;TCP&quot;，&quot;UDP&quot;或&quot;SSL&quot;
• &lt;remote IP&gt;：远端 IP 地址，字符串参数
• &lt;remote port&gt;：远端端⼝号
• [&lt;UDP	local port&gt;]：UDP 传输时，设置本地端⼝
• [&lt;UDP	mode&gt;]：UDP 传输的属性，若透传，则必须为 0
      ‣ 0：收到数据后，不更改远端⽬标，默认值为 0
      ‣ 1：收到数据后，改变⼀次远端⽬标
      ‣ 2：收到数据后，改变远端⽬标</li></ul></ol></ol><ol start="2" class="notion-list notion-list-numbered notion-block-2a9e940c69bb80b68affc525e81d5cca" style="list-style-type:decimal"><li>创建 UDP 传输，例如连接号为 4 的指令为 <code class="notion-inline-code">AT+CIPSTART=4,&quot;UDP&quot;,&quot;192.168.118.168&quot;,25563,9090,0 </code>响应为 4,CONNNECT 和 OK。</li><ol class="notion-list notion-list-numbered notion-block-2a9e940c69bb80b68affc525e81d5cca" style="list-style-type:lower-alpha"><div class="notion-text notion-block-2a9e940c69bb80fe964ffcc8393439ea">参数说明如下：</div><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb80ee8a48d4e17d696c23"><li><em>&quot;</em>192.168.118.168<em>&quot;, 25563</em>为<em> UDP </em>传输的远端<em> IP </em>和端⼝，即前⽂中<em> PC </em>建⽴的<em> UDP </em>端⼝；</li></ul><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb806ba28eee98052c484e"><li>9090为<em> ESP8266 </em>本地的<em> UDP </em>端⼝，⽤户可⾃⾏设置，如不设置则为随机值；</li></ul><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb804bab1ef7205554544b"><li><em>0 </em>表示当前<em> UDP </em>传输建⽴后，<em>UDP </em>远端不会被其他设备更改；即使有其他设备通过<em> UDP </em>协议发数据到</li></ul><div class="notion-text notion-block-2a9e940c69bb80ad973de72cc4cd54dc"><em>ESP8266 UDP </em>端⼝<em> 1112</em>，<em>ESP8266 </em>的第<em> 4 </em>号<em> UDP </em>传输的远端也不会被替换，使⽤指令</div><div class="notion-text notion-block-2a9e940c69bb80188562fda06dc53bc9"><em>“AT+CIPSEND=4, X” </em>发送数据，仍然是当前固定的<em> PC </em>端收到。</div></ol></ol><ol start="3" class="notion-list notion-list-numbered notion-block-2a9e940c69bb8000a250cd298f8e1424" style="list-style-type:decimal"><li>发送数据：<code class="notion-inline-code">AT+CIPSEND=4,7</code>，输入 “<code class="notion-inline-code">UDPtest</code>”，响应为 Recv 7 bytes 和 SEND OK。</li></ol><ol start="4" class="notion-list notion-list-numbered notion-block-2a9e940c69bb8062be84d4ab6f7fb578" style="list-style-type:decimal"><li>接收数据时，ESP8266 设备会提示 “+IPD,4,n:xxxxxxxxxx”</li></ol><ol start="5" class="notion-list notion-list-numbered notion-block-2a9e940c69bb8008b987cf372e0c3918" style="list-style-type:decimal"><li>断开 UDP 传输：<code class="notion-inline-code">AT+CIPCLOSE=4</code>，响应为 4,CLOSED 和 OK。</li></ol><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-1f8842e0986a491b9b454e76f36b8dbc"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:100%;max-width:100%;flex-direction:column"><img style="object-fit:cover" src="https://cdn.jsdmirror.com/gh/LZJ-I/picx-images-hosting@main/images/%E5%B7%A5%E5%85%B7%E4%B8%8E%E9%85%8D%E7%BD%AE/Post-ESP8266/29b7da24-007a-4d97-9e80-8ab754691de2-image.webp?spaceId=3a565fcb-f425-4846-b72a-d32a98183896&amp;t=1f8842e0-986a-491b-9b45-4e76f36b8dbc" alt="notion image" loading="lazy" decoding="async"/></div></figure></div></details><details class="notion-toggle notion-block-2a9e940c69bb80b7b63ed9a69e711e6b"><summary><h4 class="notion-h notion-h3 notion-h-indent-2 notion-block-2a9e940c69bb80b7b63ed9a69e711e6b" data-id="2a9e940c69bb80b7b63ed9a69e711e6b"><span><div id="2a9e940c69bb80b7b63ed9a69e711e6b" class="notion-header-anchor"></div><span class="notion-h-title">3. UDP 传输_远端可变的UDP通信</span></span></h4></summary><div><div class="notion-text notion-block-2a9e940c69bb8084af43cebe9a4902ba">基础配置：</div><ol start="1" class="notion-list notion-list-numbered notion-block-2a9e940c69bb809ea28feab95ca44dbd" style="list-style-type:decimal"><li>配置 WiFi 模式： <code class="notion-inline-code">AT+CWMODE=1</code></li></ol><ol start="2" class="notion-list notion-list-numbered notion-block-2a9e940c69bb80928faffba972374c11" style="list-style-type:decimal"><li>连接路由器（热点）：<code class="notion-inline-code">AT+CWJAP=&quot;SSID&quot;,&quot;password</code></li></ol><ol start="3" class="notion-list notion-list-numbered notion-block-2a9e940c69bb8021b91adcdb6ab58334" style="list-style-type:decimal"><li>查询 ESP8266 设备的 IP 地址： <code class="notion-inline-code">AT+CIFSR</code></li></ol><blockquote class="notion-quote notion-block-2a9e940c69bb8073b8b0f6db3f2e7629"><div><b>UDP 通信远端可改变的情况</b>：当使用 AT+CIPSTART 指令创建 UDP 通信，将最后一个参数设置为 2 时，UDP 通信的远端可改变。</div></blockquote><div class="notion-text notion-block-2a9e940c69bb8039a648e62b0ac7f4bc"><b>UDP 通信步骤</b>：</div><div class="notion-text notion-block-2a9e940c69bb80368606df38c5a641f2"><em>（这里不需要使能多连接）</em></div><ol start="1" class="notion-list notion-list-numbered notion-block-2a9e940c69bb8082b53bd7a9aa4b3cb3" style="list-style-type:decimal"><li>创建 UDP 传输：<code class="notion-inline-code">AT+CIPSTART=&quot;UDP&quot;,&quot;192.168.118.168&quot;,25563,9090,2</code>，响应为 CONNNECT 和 OK。</li></ol><ol start="2" class="notion-list notion-list-numbered notion-block-2a9e940c69bb80f1b641d44b4af400c1" style="list-style-type:decimal"><li><b>发送数据</b>：<code class="notion-inline-code">AT+CIPSEND=7</code>，输入 “<code class="notion-inline-code">UDPtest</code>”，响应为 Recv 7 bytes 和 SEND OK。
<em>（这里不需要再和</em><code class="notion-inline-code">AT+CIPSEND=4,7</code>一样，指定网络连接ID<em>）</em></li></ol><ol start="3" class="notion-list notion-list-numbered notion-block-2a9e940c69bb80739868d1558fc0128d" style="list-style-type:decimal"><li><b>发送数据到其他指定远端</b>，例如发数据到 192.168.118.168，端口25563：<code class="notion-inline-code">AT+CIPSEND=7,&quot; 192.168.118.168&quot;,25563</code>，输入 “<code class="notion-inline-code">UDPtest</code>”，响应为 Recv 7 bytes 和 SEND OK。</li></ol><div class="notion-text notion-block-2a9e940c69bb80d28e06ffa0500d025c"><b>参数说明</b>：192.168.118.168&quot;,25563为 UDP 传输的远端 IP 和端口；9090为 ESP8266 本地的 UDP 端口，用户可自行设置，如不设置则为随机值；2 表示当前 UDP 传输建立后，UDP 传输远端会自动更改为最近一个与 ESP8266 UDP 通信的远端。</div><div class="notion-text notion-block-2a9e940c69bb805bb0d2d2117fe2fda4"><b>注意事项</b>：发送数据时，如果输入的字节数超过了设置长度（n），系统将提示 busy，并发送数据的前 n 个字节，发送完成后响应 SEND OK，超出长度的部分数据被认为是无效数据，不被接受。</div><div class="notion-text notion-block-2a9e940c69bb80588600fdd2bf2fbbaf">接收数据时，ESP8266 设备会提示 “+IPD,n:xxxxxxxxxx”</div><ol start="1" class="notion-list notion-list-numbered notion-block-2a9e940c69bb80abac0ac6053331208f" style="list-style-type:decimal"><li>断开 UDP 传输：<code class="notion-inline-code">AT+CIPCLOSE</code>，响应为 CLOSED 和 OK。</li></ol></div></details><details class="notion-toggle notion-block-2a9e940c69bb80fb8009d23395fce4b3"><summary><h4 class="notion-h notion-h3 notion-h-indent-2 notion-block-2a9e940c69bb80fb8009d23395fce4b3" data-id="2a9e940c69bb80fb8009d23395fce4b3"><span><div id="2a9e940c69bb80fb8009d23395fce4b3" class="notion-header-anchor"></div><span class="notion-h-title">4. TCP 单连接 透传</span></span></h4></summary><div><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb800d94cff04ab362efc5"><li>透传 就是 透明传输就是在传输过程中，对外界透明，就是说你看不见他是传送网络，不管传输的业务如何，我只负责将需要传送的业务传送到目的节点，相当于一条数据线或者串口线，同时保证传输的质量即可，<b>而不对传输的业务进行处理。</b></li></ul><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb80678ce5f8c9f26aad5d"><li>ESP8266 AT 默认仅在 TCP client 单连接或 UDP 传输模式时，⽀持透传。</li></ul><div class="notion-text notion-block-2a9e940c69bb80a1a0eddbea8da59a11"><b>一、ESP8266 透传功能概述</b></div><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb800dba80cdbc10566b71"><li>ESP8266 可作为 station 实现 TCP client 单连接透传，作为 softAP 也可同理实现透传。</li></ul><div class="notion-text notion-block-2a9e940c69bb808281bbdc5ea64821d8"><b>二、配置步骤</b></div><ol start="1" class="notion-list notion-list-numbered notion-block-2a9e940c69bb80d29e8df82fd170199d" style="list-style-type:decimal"><li><b>配置 WiFi 模式</b>：</li><ol class="notion-list notion-list-numbered notion-block-2a9e940c69bb80d29e8df82fd170199d" style="list-style-type:lower-alpha"><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb804bb4b8e9d5d56376f3"><li>指令：AT+CWMODE=3，设置为 softAP+station 模式。</li></ul><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb8044ae86e0e2ca51920f"><li>响应：OK。</li></ul></ol></ol><ol start="2" class="notion-list notion-list-numbered notion-block-2a9e940c69bb80148d80db30586230ba" style="list-style-type:decimal"><li><b>连接路由器</b>：</li><ol class="notion-list notion-list-numbered notion-block-2a9e940c69bb80148d80db30586230ba" style="list-style-type:lower-alpha"><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb80cb9c12e4172d628a12"><li>指令：AT+CWJAP=&quot;SSID&quot;,&quot;password&quot;，输入路由器的 SSID 和密码。</li></ul><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb8019a5eedd6f81f45452"><li>响应：OK。</li></ul></ol></ol><ol start="3" class="notion-list notion-list-numbered notion-block-2a9e940c69bb80c6abe6c77fcbffeb07" style="list-style-type:decimal"><li><b>查询 IP 地址</b>：</li><ol class="notion-list notion-list-numbered notion-block-2a9e940c69bb80c6abe6c77fcbffeb07" style="list-style-type:lower-alpha"><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb8019803ed973413962d4"><li>指令：AT+CIFSR。</li></ul><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb80fabb0ffbc571455196"><li>响应：显示 APIP、APMAC、STAIP、STAMAC 等信息，如 +CIFSR:APIP,&quot;192.168.4.1&quot;、+CIFSR:APMAC,&quot;1a:fe:34:a5:8d:c6&quot;、+CIFSR:STAIP,&quot;192.168.3.133&quot;、+CIFSR:STAMAC,&quot;18:fe:34:a5:8d:c6&quot;。</li></ul><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb8025a135dfff68daf231"><li>响应：OK。</li></ul></ol></ol><ol start="4" class="notion-list notion-list-numbered notion-block-2a9e940c69bb80418e68f5dc2e767ddc" style="list-style-type:decimal"><li><b>PC 端操作与连接</b>：</li><ol class="notion-list notion-list-numbered notion-block-2a9e940c69bb80418e68f5dc2e767ddc" style="list-style-type:lower-alpha"><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb80f6b99df8038970ecec"><li>PC 与 ESP8266 设备连接同一路由器，在 PC 端使用网络调试工具，建立一个 TCP 服务器。假设 PC 创建的服务器 IP 地址为 192.168.3.116，端口为 8080。</li></ul></ol></ol><ol start="5" class="notion-list notion-list-numbered notion-block-2a9e940c69bb80c09cd5f33c64604b2e" style="list-style-type:decimal"><li><b>ESP8266 作为 TCP client 连接服务器</b>：</li><ol class="notion-list notion-list-numbered notion-block-2a9e940c69bb80c09cd5f33c64604b2e" style="list-style-type:lower-alpha"><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb802ea1cdcc5f047ae256"><li>指令：AT+CIPSTART=&quot;TCP&quot;,&quot;192.168.3.116&quot;,8080，指定协议、服务器 IP 和端口。</li></ul><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb80bab365c0dc4e2ffd2e"><li>响应：OK。</li></ul></ol></ol><ol start="6" class="notion-list notion-list-numbered notion-block-2a9e940c69bb80fe9a4ad82b52571c6c" style="list-style-type:decimal"><li><b>使能透传模式</b>：</li><ol class="notion-list notion-list-numbered notion-block-2a9e940c69bb80fe9a4ad82b52571c6c" style="list-style-type:lower-alpha"><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb8052a3f2d6af52fbace8"><li>指令：AT+CIPMODE=1。</li></ul><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb80ed934ddfcd2991a281"><li>响应：OK。</li></ul><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb805bada1fe4f9fa6d826"><li>注意<b>（</b>此设置不保存到flash<b>，</b>透传模式传输时，如果连接断开，ESP8266 会不停尝试重连，此时单独输入 +++ 退出透传，则停止重连;普通传输模式则不会重连，提示连接断开。<b>）</b></li></ul></ol></ol><ol start="7" class="notion-list notion-list-numbered notion-block-2a9e940c69bb805ebc60c33e17d175fa" style="list-style-type:decimal"><li><b>ESP8266 设备向服务器发送数据</b>：</li><ol class="notion-list notion-list-numbered notion-block-2a9e940c69bb805ebc60c33e17d175fa" style="list-style-type:lower-alpha"><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb80c59991e0d914bc9c8e"><li>指令：AT+CIPSEND。</li></ul><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb806eb6d6eba86ea5032f"><li>响应：&gt;，<b>表示从此时起，从 UART 接收的数据将自动传输到服务器。</b></li></ul><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb80148b9bf141c8992e7c"><li>注意：每次发送（每包）最大2048个字节，或者每包20ms间隔区分</li></ul></ol></ol><ol start="8" class="notion-list notion-list-numbered notion-block-2a9e940c69bb80db8604fc2066f5fdfb" style="list-style-type:decimal"><li><b>退出发送数据</b>：</li><ol class="notion-list notion-list-numbered notion-block-2a9e940c69bb80db8604fc2066f5fdfb" style="list-style-type:lower-alpha"><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb8028accbf3733019804d"><li>在透传发送数据过程中，若识别到单独的一包数据 “+++”，则退出透传发送。
建议使用串口工具一次性发送 “+++”，<b>且不要携带空格或换行符等不可见字符</b>。
之后，至少间隔 1 秒，再发下一条 AT 指令。</li></ul></ol></ol><ol start="9" class="notion-list notion-list-numbered notion-block-2a9e940c69bb800686c2cefba3b43731" style="list-style-type:decimal"><li><b>退出透传模式</b>：</li><ol class="notion-list notion-list-numbered notion-block-2a9e940c69bb800686c2cefba3b43731" style="list-style-type:lower-alpha"><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb804ab590c8a435b68007"><li>指令：AT+CIPMODE=0。</li></ul><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb80f88b2cd5ba33a5d2d6"><li>响应：OK。</li></ul></ol></ol><ol start="10" class="notion-list notion-list-numbered notion-block-2a9e940c69bb800589bde2e8338ca893" style="list-style-type:decimal"><li><b>断开 TCP 连接</b>：</li></ol><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb8048b027e41412ac78dd"><li>指令：AT+CIPCLOSE。</li></ul><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb808193fce2b3d98e8f29"><li>响应：CLOSED、OK。</li></ul></div></details><details class="notion-toggle notion-block-2a9e940c69bb803db7cfc2c303c76bff"><summary><h4 class="notion-h notion-h3 notion-h-indent-2 notion-block-2a9e940c69bb803db7cfc2c303c76bff" data-id="2a9e940c69bb803db7cfc2c303c76bff"><span><div id="2a9e940c69bb803db7cfc2c303c76bff" class="notion-header-anchor"></div><span class="notion-h-title">5. UDP 透传</span></span></h4></summary><div><div class="notion-text notion-block-2a9e940c69bb800193c4dce9573c45b4"><b>一、ESP8266 UDP 透传功能概述</b></div><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb804db7b2c2950a0ab529"><li>ESP8266 作为 softAP 可实现 UDP 透传，作为 station 同理可实现。</li></ul><div class="notion-text notion-block-2a9e940c69bb80ca940ed11abed3b0c3"><b>二、配置步骤</b></div><ol start="1" class="notion-list notion-list-numbered notion-block-2a9e940c69bb80e4b26cdad9946c2bbd" style="list-style-type:decimal"><li><b>配置 WiFi 模式</b>：</li><ol class="notion-list notion-list-numbered notion-block-2a9e940c69bb80e4b26cdad9946c2bbd" style="list-style-type:lower-alpha"><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb80a48befd37b62bc2e94"><li>指令：AT+CIMODE=3，设置为 softAP+station 模式。</li></ul><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb80248da3fc0d5ccc99d0"><li>响应：OK（假设此处应有 OK 响应）。</li></ul></ol></ol><ol start="2" class="notion-list notion-list-numbered notion-block-2a9e940c69bb8097bf1ad2bfa820d68f" style="list-style-type:decimal"><li><b>PC 连入 ESP8266 softAP</b>：无特定指令，在 PC 上选择 ESP8266 的无线网络连接。</li><ol class="notion-list notion-list-numbered notion-block-2a9e940c69bb8097bf1ad2bfa820d68f" style="list-style-type:lower-alpha"><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb801ca4abef75c873192a"><li>模块和PC接入同局域网也可</li></ul></ol></ol><hr class="notion-hr notion-block-2a9e940c69bb8005912eecc66d219baa"/><ol start="1" class="notion-list notion-list-numbered notion-block-2a9e940c69bb801e8316fbb4fac203b1" style="list-style-type:decimal"><li><b>PC 端建立 UDP 传输</b>：</li><ol class="notion-list notion-list-numbered notion-block-2a9e940c69bb801e8316fbb4fac203b1" style="list-style-type:lower-alpha"><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb8065a674fe778e49baaf"><li>在 PC 端使用网络调试工具，建立一个 UDP 传输。假设 PC 创建的 UDP 自身 IP 地址为 192.168.4.2，端口为 1001。</li></ul></ol></ol><ol start="2" class="notion-list notion-list-numbered notion-block-2a9e940c69bb80599337fbaa103db92f" style="list-style-type:decimal"><li><b>ESP8266 建立 UDP 传输</b>：</li><ol class="notion-list notion-list-numbered notion-block-2a9e940c69bb80599337fbaa103db92f" style="list-style-type:lower-alpha"><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb80f1b4cbf82d7b47c190"><li>指令：AT+CIPSTART=&quot;UDP&quot;, &quot;192.168.4.2&quot;,1081,2233,0。</li></ul><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb80b9a3f1de28994358d0"><li>响应：OK（假设此处应有 OK 响应）。</li></ul></ol></ol><ol start="3" class="notion-list notion-list-numbered notion-block-2a9e940c69bb8084af8ef3cc34591cb8" style="list-style-type:decimal"><li><b>使能透传模式</b>：</li><ol class="notion-list notion-list-numbered notion-block-2a9e940c69bb8084af8ef3cc34591cb8" style="list-style-type:lower-alpha"><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb8074b949f173c90b9b57"><li>指令：AT+CIPMODE=1。</li></ul><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb809b9de0f2a1fc451959"><li>响应：OK。</li></ul></ol></ol><ol start="4" class="notion-list notion-list-numbered notion-block-2a9e940c69bb80efa8f8e52031466102" style="list-style-type:decimal"><li><b>ESP8266 设备向服务器发送数据</b>：</li><ol class="notion-list notion-list-numbered notion-block-2a9e940c69bb80efa8f8e52031466102" style="list-style-type:lower-alpha"><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb80648176dd20a83c2ad7"><li>指令：AT+CIPSEND。</li></ul><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb80fe9001d7cc4216162d"><li>响应：&gt;，表示从此时起，从 UART 接收的数据将自动传输到服务器。</li></ul><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb8083ad17f5de91a29350"><li>注意：发送数据时，如果输入的字节数超过了设置长度 (n)，系统将提示 busy，并发送数据的前 n 个字节，发送完成后响应 SEND OK。超出长度的部分数据被认为是无效数据，不被接受。</li></ul></ol></ol><ol start="5" class="notion-list notion-list-numbered notion-block-2a9e940c69bb8049a7f3e334a4985486" style="list-style-type:decimal"><li><b>退出发送数据</b>：</li><ol class="notion-list notion-list-numbered notion-block-2a9e940c69bb8049a7f3e334a4985486" style="list-style-type:lower-alpha"><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb8005a3bbe07e15f15364"><li>在透传发送数据过程中，若识别到单独的一包数据 “+++”，则退出透传发送。建议使用串口工具一次性发送 “+++”，且不要携带空格或换行符等不可见字符。之后，至少间隔 1 秒，再发下一条 AT 指令。</li></ul><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb807ab2d3c4ae5f1be791"><li>注意：“+++” 退出透传发送数据，回到正常 AT 指令模式。此时，TCP 连接仍然是保持的，可以再发 AT+CIPSEND 指令，重新开始透传。</li></ul></ol></ol><ol start="6" class="notion-list notion-list-numbered notion-block-2a9e940c69bb804e8117fbfe82d02ff9" style="list-style-type:decimal"><li><b>退出透传模式</b>：</li><ol class="notion-list notion-list-numbered notion-block-2a9e940c69bb804e8117fbfe82d02ff9" style="list-style-type:lower-alpha"><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb80ce959cca81ccb593aa"><li>指令：AT+CIPMODE=0。</li></ul><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb8013846acf191ab14441"><li>响应：OK。</li></ul></ol></ol><ol start="7" class="notion-list notion-list-numbered notion-block-2a9e940c69bb80279f2eed49c222aecd" style="list-style-type:decimal"><li><b>断开 UTP 连接</b>：</li><ol class="notion-list notion-list-numbered notion-block-2a9e940c69bb80279f2eed49c222aecd" style="list-style-type:lower-alpha"><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb800ba823f2e2ffd14e91"><li>指令：AT+CIPCLOSE。</li></ul><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb80cd9b47ea07d4383a98"><li>响应：CLOSED、OK。</li></ul></ol></ol></div></details><details class="notion-toggle notion-block-2a9e940c69bb80959431d6024720e862"><summary><h4 class="notion-h notion-h3 notion-h-indent-2 notion-block-2a9e940c69bb80959431d6024720e862" data-id="2a9e940c69bb80959431d6024720e862"><span><div id="2a9e940c69bb80959431d6024720e862" class="notion-header-anchor"></div><span class="notion-h-title">6. 多连接 TCP Server</span></span></h4></summary><div><div class="notion-text notion-block-2a9e940c69bb80f4be28cdc9e4056219"><b>一、ESP8266 多连接 TCP Server 功能概述</b></div><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb808bbe4bf18b17383759"><li>ESP8266 AT 仅支持建立一个 TCP 服务器，且必须使能多连接，允许连接多个 TCP client。ESP8266 作为 softAP 可建立 TCP 服务器，作为 station 在连接路由后同理可建立服务器。</li></ul><div class="notion-text notion-block-2a9e940c69bb805d9401fa1a4487113d"><b>二、配置步骤</b></div><ol start="1" class="notion-list notion-list-numbered notion-block-2a9e940c69bb80668ac1d037f414a194" style="list-style-type:decimal"><li><b>配置 WiFi 模式</b>：</li><ol class="notion-list notion-list-numbered notion-block-2a9e940c69bb80668ac1d037f414a194" style="list-style-type:lower-alpha"><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb80eda23cc48f4bbb11e4"><li>指令：AT+CWMODE=3，设置为 softAP+station 模式。</li></ul><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb80669118f7abf5fdb018"><li>响应：OK（假设此处应有 OK 响应）。</li></ul></ol></ol><ol start="2" class="notion-list notion-list-numbered notion-block-2a9e940c69bb80e2a48cf6d895cdc0d8" style="list-style-type:decimal"><li><b>使能多连接</b>：</li><ol class="notion-list notion-list-numbered notion-block-2a9e940c69bb80e2a48cf6d895cdc0d8" style="list-style-type:lower-alpha"><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb80a4b21dee2581fa4b26"><li>AT+CIPMUX=1</li></ul><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-4a1e63fbae4e4489ad84919e6edf89c3"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:100%;max-width:100%;flex-direction:column"><img style="object-fit:cover" src="https://cdn.jsdmirror.com/gh/LZJ-I/picx-images-hosting@main/images/%E5%B7%A5%E5%85%B7%E4%B8%8E%E9%85%8D%E7%BD%AE/Post-ESP8266/8210ba23-58b0-4f06-9cc2-de80ccbb9758-image.webp?spaceId=3a565fcb-f425-4846-b72a-d32a98183896&amp;t=4a1e63fb-ae4e-4489-ad84-919e6edf89c3" alt="notion image" loading="lazy" decoding="async"/></div></figure><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb8003bf19c8c4cd01926c"><li>响应：OK。</li></ul></ol></ol><ol start="3" class="notion-list notion-list-numbered notion-block-2a9e940c69bb80229c15fa01b6810798" style="list-style-type:decimal"><li><b>建立 TCP server</b>：</li><ol class="notion-list notion-list-numbered notion-block-2a9e940c69bb80229c15fa01b6810798" style="list-style-type:lower-alpha"><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb80eeb096d7008c66d4dc"><li>指令：AT+CIPSERVER=1（默认端口为 333）。</li></ul><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb8041b6ebed5e9e69b8cf"><li>（AT+CIPSERVER=&lt;mode&gt;[,&lt;port&gt;]）</li></ul><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb8078b4fbd965b4d9a504"><li>响应：OK。</li></ul></ol></ol><ol start="4" class="notion-list notion-list-numbered notion-block-2a9e940c69bb809bb276f542dc06f550" style="list-style-type:decimal"><li><b>PC 连入 ESP8266 softAP</b>：无特定指令，在 PC 上选择 ESP8266 的无线网络连接。</li><ol class="notion-list notion-list-numbered notion-block-2a9e940c69bb809bb276f542dc06f550" style="list-style-type:lower-alpha"><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb80349759d029630be2b0"><li><b>模块和PC接入同局域网也可</b></li></ul></ol></ol><ol start="5" class="notion-list notion-list-numbered notion-block-2a9e940c69bb8090aa22e92137acccac" style="list-style-type:decimal"><li><b>PC 端建立多个 TCP client 连接 ESP8266 的 TCP server</b>：在 PC 端使用网络调试工具建立一个 TCP client，连接 ESP8266 的 TCP server。</li></ol><ol start="6" class="notion-list notion-list-numbered notion-block-2a9e940c69bb8039ace5d67a20c2d19d" style="list-style-type:decimal"><li>如果要显示端口和IP可以使能这个</li><ol class="notion-list notion-list-numbered notion-block-2a9e940c69bb8039ace5d67a20c2d19d" style="list-style-type:lower-alpha"><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-644bd96efb7544ff9786c2d78ba76461"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:100%;max-width:100%;flex-direction:column"><img style="object-fit:cover" src="https://cdn.jsdmirror.com/gh/LZJ-I/picx-images-hosting@main/images/%E5%B7%A5%E5%85%B7%E4%B8%8E%E9%85%8D%E7%BD%AE/Post-ESP8266/5e534171-1c86-4917-bdfd-b0867e5606ea-image.webp?spaceId=3a565fcb-f425-4846-b72a-d32a98183896&amp;t=644bd96e-fb75-44ff-9786-c2d78ba76461" alt="notion image" loading="lazy" decoding="async"/></div></figure></ol></ol><ol start="7" class="notion-list notion-list-numbered notion-block-2a9e940c69bb80b79f01c4d43dd52c8d" style="list-style-type:decimal"><li>断开链接</li><ol class="notion-list notion-list-numbered notion-block-2a9e940c69bb80b79f01c4d43dd52c8d" style="list-style-type:lower-alpha"><div class="notion-text notion-block-2a9e940c69bb80379cf8f891da69d8e1">AT+CIPCLOSE=1</div><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-4034502f68c54a3b9294bde7ed93f203"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:100%;max-width:100%;flex-direction:column"><img style="object-fit:cover" src="https://cdn.jsdmirror.com/gh/LZJ-I/picx-images-hosting@main/images/%E5%B7%A5%E5%85%B7%E4%B8%8E%E9%85%8D%E7%BD%AE/Post-ESP8266/0046a371-24fa-4a5b-9658-e9fb0df2ac94-image.webp?spaceId=3a565fcb-f425-4846-b72a-d32a98183896&amp;t=4034502f-68c5-4a3b-9294-bde7ed93f203" alt="notion image" loading="lazy" decoding="async"/></div></figure></ol></ol><div class="notion-text notion-block-2a9e940c69bb808684cfd8dd3bc0608a"><b>注意：</b></div><div class="notion-text notion-block-2a9e940c69bb80cc958fda5c09512dde"><em>ESP8266 </em>作为<em> TCP server </em>有超时机制，如果连接建⽴后，⼀段时间内⽆数据来往，<em>ESP8266 TCP server </em>会将<em> TCP client </em>踢掉。因此，请在<em> PC TCP client </em>连上<em> ESP8266 TCP server </em>后建⽴⼀个<em> 2s </em>的循环数据发送，⽤于保持连接。</div><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-c6f1b347a8b34636b0874cc11984f272"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:100%;max-width:100%;flex-direction:column"><img style="object-fit:cover" src="https://cdn.jsdmirror.com/gh/LZJ-I/picx-images-hosting@main/images/%E5%B7%A5%E5%85%B7%E4%B8%8E%E9%85%8D%E7%BD%AE/Post-ESP8266/650478f6-d2ee-485f-b71a-65ec27068a31-image.webp?spaceId=3a565fcb-f425-4846-b72a-d32a98183896&amp;t=c6f1b347-a8b3-4636-b087-4cc11984f272" alt="notion image" loading="lazy" decoding="async"/></div></figure></div></details><div class="notion-blank notion-block-2a9e940c69bb80a3bd0cdeb75c636a05"> </div><div class="notion-callout notion-gray_background_co notion-block-2a9e940c69bb80ea8726fee96f532b87"><div class="notion-page-icon-inline notion-page-icon-span"><span class="notion-page-icon" role="img" aria-label="💡">💡</span></div><div class="notion-callout-text">其他的问题，欢迎在底部评论区留言，一起交流~</div></div><div class="notion-blank notion-block-2a9e940c69bb80688cace01e51a0fa4a"> </div></main></div>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[在KickPi K2B开发板部署Sherpa-ONNX框架+关键词识别+语音识别+语音合成模型]]></title>
            <link>https://www.mcoi.top/article/Post-KickPi2B-Sherpa-ONNX</link>
            <guid>https://www.mcoi.top/article/Post-KickPi2B-Sherpa-ONNX</guid>
            <pubDate>Mon, 17 Nov 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[使用KickPi开发板，部署离线语音识别、关键词唤醒、语音合成模型]]></description>
            <content:encoded><![CDATA[<div id="notion-article" class="mx-auto overflow-hidden "><main class="notion light-mode notion-page notion-block-2aee940c69bb80a69594e1228f24bb67"><div class="notion-viewport"></div><div class="notion-collection-page-properties"></div><div class="notion-callout notion-gray_background_co notion-block-2aee940c69bb80bc90a9d51289293f69"><div class="notion-page-icon-inline notion-page-icon-span"><span class="notion-page-icon" role="img" aria-label="😀">😀</span></div><div class="notion-callout-text">本文主要是记录在Arm64架构的KickPi K2B开发板上，Sherpa-ONNX离线语音处理框架的部署与语音识别、语音合成、关键词唤醒模型的测试。
目前仅实现了利用官方部署好的静态库实现 <b>离线语音转文字</b>。
后续会实现<b>语音合成、关键词识别
</b>并且用其开发工具和C语言来实现demo</div></div><details class="notion-toggle notion-block-2b2e940c69bb80f2aa9aef90d8fffd03"><summary><h2 class="notion-h notion-h1 notion-h-indent-0 notion-block-2b2e940c69bb80f2aa9aef90d8fffd03" data-id="2b2e940c69bb80f2aa9aef90d8fffd03"><span><div id="2b2e940c69bb80f2aa9aef90d8fffd03" class="notion-header-anchor"></div><span class="notion-h-title">目录</span></span></h2></summary><div><div class="notion-table-of-contents notion-gray notion-block-2b2e940c69bb800eb46fca3d33e8913e"><a href="#2b2e940c69bb80f2aa9aef90d8fffd03" class="notion-table-of-contents-item"><span class="notion-table-of-contents-item-body" style="display:inline-block;margin-left:0">目录</span></a><a href="#2aee940c69bb807491e3df7f30e8b2dd" class="notion-table-of-contents-item"><span class="notion-table-of-contents-item-body" style="display:inline-block;margin-left:0">核心概念说明</span></a><a href="#2aee940c69bb8079820fdb6a58971671" class="notion-table-of-contents-item"><span class="notion-table-of-contents-item-body" style="display:inline-block;margin-left:0">所需资料下载</span></a><a href="#2aee940c69bb80528382cb10691b6f97" class="notion-table-of-contents-item"><span class="notion-table-of-contents-item-body" style="display:inline-block;margin-left:24px">1. 语音处理框架（Sherpa-ONNX）</span></a><a href="#2aee940c69bb8024b6add43e13356dc6" class="notion-table-of-contents-item"><span class="notion-table-of-contents-item-body" style="display:inline-block;margin-left:24px">2. 核心模型下载</span></a><a href="#2aee940c69bb80cdbe2afc9d3ee59de0" class="notion-table-of-contents-item"><span class="notion-table-of-contents-item-body" style="display:inline-block;margin-left:0">语音识别（语音转文字）简单部署与测试</span></a><a href="#2aee940c69bb808393e4c7808c149e11" class="notion-table-of-contents-item"><span class="notion-table-of-contents-item-body" style="display:inline-block;margin-left:24px">1. 框架解压与目录说明</span></a><a href="#2aee940c69bb80529221ee44fb789808" class="notion-table-of-contents-item"><span class="notion-table-of-contents-item-body" style="display:inline-block;margin-left:24px">2. 语音识别模型解压</span></a><a href="#2aee940c69bb80d986caf665d337e7da" class="notion-table-of-contents-item"><span class="notion-table-of-contents-item-body" style="display:inline-block;margin-left:24px">3. 关键参数与设备配置</span></a><a href="#2aee940c69bb80b9b355d0bed2c67c01" class="notion-table-of-contents-item"><span class="notion-table-of-contents-item-body" style="display:inline-block;margin-left:24px">4. 语音识别执行命令</span></a><a href="#82543e280e0b4eba99b58a54f34444c6" class="notion-table-of-contents-item"><span class="notion-table-of-contents-item-body" style="display:inline-block;margin-left:0">语音合成（文字转语音）简单部署与测试</span></a><a href="#dc0b75e44bc04fb9b624d9a6eb36a77d" class="notion-table-of-contents-item"><span class="notion-table-of-contents-item-body" style="display:inline-block;margin-left:24px">1.前置准备(工具与模型校验)</span></a><a href="#2f8b9ad4949141668a92e3e285e72575" class="notion-table-of-contents-item"><span class="notion-table-of-contents-item-body" style="display:inline-block;margin-left:24px">2. 核心操作：从设备配置到语音合成</span></a><a href="#cdd6076a0c564683aafc9ddf162c024d" class="notion-table-of-contents-item"><span class="notion-table-of-contents-item-body" style="display:inline-block;margin-left:48px">步骤 1：查询音频输出设备（关键！）</span></a><a href="#57a397f0bca0407b93a85fd3062c4799" class="notion-table-of-contents-item"><span class="notion-table-of-contents-item-body" style="display:inline-block;margin-left:48px">步骤 2：执行语音合成命令</span></a><a href="#44b92b1fd1cb49c781d1ebe0c791a679" class="notion-table-of-contents-item"><span class="notion-table-of-contents-item-body" style="display:inline-block;margin-left:24px">3、结果验证：确认合成成功</span></a><a href="#d3c989a497c3496fbb7511a59ab5c01a" class="notion-table-of-contents-item"><span class="notion-table-of-contents-item-body" style="display:inline-block;margin-left:0">关键词检测（KWS）的完整部署与测试</span></a><a href="#b2767cde7f8744f3891aa87b3afd4c8e" class="notion-table-of-contents-item"><span class="notion-table-of-contents-item-body" style="display:inline-block;margin-left:24px">1. 前置准备：工具与模型校验</span></a><a href="#b407734b19744ce780e9631a4ec16397" class="notion-table-of-contents-item"><span class="notion-table-of-contents-item-body" style="display:inline-block;margin-left:24px">2. 自定义关键词配置</span></a><a href="#07c8706438ce499aa2671da887ba0814" class="notion-table-of-contents-item"><span class="notion-table-of-contents-item-body" style="display:inline-block;margin-left:24px">3. 核心操作：从设备配置到实时检测</span></a><a href="#bdcb9c6b22b94f288fa83e740eac34df" class="notion-table-of-contents-item"><span class="notion-table-of-contents-item-body" style="display:inline-block;margin-left:24px">4. 结果验证与解读</span></a><a href="#6b7884246fa543ad833d1aea13082495" class="notion-table-of-contents-item"><span class="notion-table-of-contents-item-body" style="display:inline-block;margin-left:0">基于C语言的Sherpa-ONNX框架集成与大模型调用</span></a><a href="#2c5878fe51a34b628fa5b636346e98d4" class="notion-table-of-contents-item"><span class="notion-table-of-contents-item-body" style="display:inline-block;margin-left:24px">1.置准备：依赖库安装与适配</span></a><a href="#db89f08a29b944c897a4fb693d838472" class="notion-table-of-contents-item"><span class="notion-table-of-contents-item-body" style="display:inline-block;margin-left:24px">2.代码架构解析：模块化封装思路</span></a><a href="#c73bd66823f2442792370657229a59a9" class="notion-table-of-contents-item"><span class="notion-table-of-contents-item-body" style="display:inline-block;margin-left:24px">3.核心逻辑拆解：整个项目的运行逻辑</span></a><a href="#5a9f66deb73341899bd813c7503eb41b" class="notion-table-of-contents-item"><span class="notion-table-of-contents-item-body" style="display:inline-block;margin-left:24px">代码参考（部分我已加注释）</span></a><a href="#689dd2a110d540f8a295a3392ac6ad8d" class="notion-table-of-contents-item"><span class="notion-table-of-contents-item-body" style="display:inline-block;margin-left:48px">1. ALSA 音频设备驱动封装（录音核心）</span></a><a href="#88f71c238b774b75a0446e470f6ab8f3" class="notion-table-of-contents-item"><span class="notion-table-of-contents-item-body" style="display:inline-block;margin-left:48px">2. ALSA 音频重采样模块（格式适配核心）</span></a><a href="#b1afe124ce7540f1ad53ded180680799" class="notion-table-of-contents-item"><span class="notion-table-of-contents-item-body" style="display:inline-block;margin-left:48px">3. Sherpa-ONNX 模型调用asr模型（推理核心）</span></a><a href="#983ac87b921a4b13be74b8fe78d02409" class="notion-table-of-contents-item"><span class="notion-table-of-contents-item-body" style="display:inline-block;margin-left:48px">4. 主程序（模块整合与业务流程）</span></a><a href="#ade2ce20f0fa4dfd8240735c9afd8873" class="notion-table-of-contents-item"><span class="notion-table-of-contents-item-body" style="display:inline-block;margin-left:48px">5. Makefile：编译脚本（嵌入式编译配置）</span></a><a href="#76676c2c2d03462d92dc0ed43582244a" class="notion-table-of-contents-item"><span class="notion-table-of-contents-item-body" style="display:inline-block;margin-left:48px">6. Sherpa-ONNX 模型调用kws模型（推理核心）</span></a></div></div></details><h2 class="notion-h notion-h1 notion-h-indent-0 notion-block-2aee940c69bb807491e3df7f30e8b2dd" data-id="2aee940c69bb807491e3df7f30e8b2dd"><span><div id="2aee940c69bb807491e3df7f30e8b2dd" class="notion-header-anchor"></div><a class="notion-hash-link" href="#2aee940c69bb807491e3df7f30e8b2dd" title="核心概念说明"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title"><b>核心概念说明</b></span></span></h2><div class="notion-text notion-block-2aee940c69bb80e38d91e1e33e777f0e">本次使用的是<b>Sherpa-ONNX</b>这一基于 ONNX 的离线语音处理框架，下面先理清几个核心概念，再详细说明在 KickPi K2B 开发板上的部署与测试流程。</div><ol start="1" class="notion-list notion-list-numbered notion-block-2aee940c69bb80e090a2e8847768ffee" style="list-style-type:decimal"><li><b>大模型与推理引擎的关系</b>：若把大模型比作电影，推理引擎就是播放器。两者相辅相成，缺少任何一方都无法实现语音处理功能，Sherpa-ONNX 在此扮演的就是推理引擎的角色。</li></ol><ol start="2" class="notion-list notion-list-numbered notion-block-2aee940c69bb80bb9a6dd205e1d09ee1" style="list-style-type:decimal"><li><b>ONNX 格式</b>：ONNX 是通用的大模型格式，除此之外，常见的大模型格式还有 PyTorch、TensorFlow 等，而 Sherpa-ONNX 正是依托 ONNX 运行时实现高效语音处理。</li></ol><ol start="3" class="notion-list notion-list-numbered notion-block-2aee940c69bb80ffa8c4f6b31b603ef9" style="list-style-type:decimal"><li><b>Sherpa-ONNX 核心介绍</b>Sherpa-ONNX 是基于 ONNX 运行时的开源语音处理库，设计理念是提供灵活、易用且高性能的语音处理解决方案，其核心特性如下：</li><ol class="notion-list notion-list-numbered notion-block-2aee940c69bb80ffa8c4f6b31b603ef9" style="list-style-type:lower-alpha"><li><b>多功能支持</b>：涵盖语音识别、语音合成、说话人识别、语言识别、音频标签、语音活动检测（VAD）和关键词检测等多种语音任务。</li><li><b>跨平台兼容</b>：可运行于 Windows、macOS、Linux 等桌面系统，也适配 Android、iOS 移动平台，同时支持 Raspberry Pi、RISC-V 架构等嵌入式设备，完美匹配 KickPi K2B 的 Arm64 架构。</li><li><b>多语言 API</b>：提供 C++、C、Python 等十余种编程语言接口，本次实践选用 C 语言进行开发适配。</li><li><b>离线运行</b>：无需网络连接即可工作，契合嵌入式场景对隐私和安全性的需求。</li></ol></ol><h2 class="notion-h notion-h1 notion-h-indent-0 notion-block-2aee940c69bb8079820fdb6a58971671" data-id="2aee940c69bb8079820fdb6a58971671"><span><div id="2aee940c69bb8079820fdb6a58971671" class="notion-header-anchor"></div><a class="notion-hash-link" href="#2aee940c69bb8079820fdb6a58971671" title="所需资料下载"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title"><b>所需资料下载</b></span></span></h2><div class="notion-blank notion-block-2d4e940c69bb80e5ada9dc9789039cc6"> </div><div class="notion-text notion-block-2aee940c69bb8019bae0c226093c5ee6">本次开发针对 KickPi K2B（Arm64 架构），需下载框架程序库和对应语音模型，所有资源均来自 Sherpa-ONNX 官方 GitHub 仓库，具体清单如下：</div><h3 class="notion-h notion-h2 notion-h-indent-1 notion-block-2aee940c69bb80528382cb10691b6f97" data-id="2aee940c69bb80528382cb10691b6f97"><span><div id="2aee940c69bb80528382cb10691b6f97" class="notion-header-anchor"></div><a class="notion-hash-link" href="#2aee940c69bb80528382cb10691b6f97" title="1. 语音处理框架（Sherpa-ONNX）"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title"><b>1. 语音处理框架（Sherpa-ONNX）</b></span></span></h3><div class="notion-text notion-block-2aee940c69bb80c7a296dd6ee0ea43c5">从<a class="notion-link" href="https://github.com/k2-fsa/sherpa-onnx/releases" target="_blank" rel="noopener noreferrer">Sherpa-ONNX Github Releases</a>下载适配 KickPi K2B（Arm64 架构）的预编译包，下载以下三个版本：</div><ul class="notion-list notion-list-disc notion-block-2aee940c69bb80f49757e2a1c9efbe88"><li>静态库版本（sherpa-onnx-v1.12.17-linux-aarch64-static.tar.bz2）：打包所有依赖，无需额外系统库，适合测试场景。</li></ul><ul class="notion-list notion-list-disc notion-block-2aee940c69bb8088aa0ff385ec2d40bf"><li>指令集优化版本（sherpa-onnx-v1.12.17-linux-aarch64-jni.tar.bz2）：支持 ARM NEON 指令集，推理速度更快，适配现代 Arm64 开发板。</li></ul><ul class="notion-list notion-list-disc notion-block-2aee940c69bb8030b5bbeba910771e08"><li>动态链接版本（sherpa-onnx-v1.12.17-linux-aarch64-shared-cpu.tar.bz2）：文件体积小，适合动态链接到其他程序，需依赖系统预装 C++ 运行库。包含的是<code class="notion-inline-code">.so</code>动态库和依赖动态库的可执行程序。</li></ul><h3 class="notion-h notion-h2 notion-h-indent-1 notion-block-2aee940c69bb8024b6add43e13356dc6" data-id="2aee940c69bb8024b6add43e13356dc6"><span><div id="2aee940c69bb8024b6add43e13356dc6" class="notion-header-anchor"></div><a class="notion-hash-link" href="#2aee940c69bb8024b6add43e13356dc6" title="2. 核心模型下载"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title"><b>2. 核心模型下载</b></span></span></h3><ul class="notion-list notion-list-disc notion-block-2aee940c69bb80109af5c44ddd0d1f3c"><li>关键词检测（KWS）模型：<a class="notion-link" href="https://github.com/k2-fsa/sherpa-onnx/releases/tag/kws-models" target="_blank" rel="noopener noreferrer">sherpa-onnx-kws-zipformer-wenetspeech-3.3M-2024-01-01-mobile.tar.bz2</a>，轻量化中文关键词检测模型，适配嵌入式场景。</li></ul><ul class="notion-list notion-list-disc notion-block-2aee940c69bb80c58594e671675fafbb"><li>语音识别（ASR）模型：<a class="notion-link" href="https://github.com/k2-fsa/sherpa-onnx/releases/tag/asr-models" target="_blank" rel="noopener noreferrer">sherpa-onnx-streaming-zipformer-small-bilingual-zh-en-2023-02-16.tar.bz2</a>，中英双语流式模型，支持边说话边转文字。</li></ul><ul class="notion-list notion-list-disc notion-block-2aee940c69bb80afb27fde4bafeb7dc2"><li>文本转语音（TTS）模型：<a class="notion-link" href="https://github.com/k2-fsa/sherpa-onnx/releases/tag/tts-models" target="_blank" rel="noopener noreferrer">vits-icefall-zh-aishell3.tar.bz2</a>，中文优化 VITS 架构模型，音质自然。</li></ul><h2 class="notion-h notion-h1 notion-h-indent-0 notion-block-2aee940c69bb80cdbe2afc9d3ee59de0" data-id="2aee940c69bb80cdbe2afc9d3ee59de0"><span><div id="2aee940c69bb80cdbe2afc9d3ee59de0" class="notion-header-anchor"></div><a class="notion-hash-link" href="#2aee940c69bb80cdbe2afc9d3ee59de0" title="语音识别（语音转文字）简单部署与测试"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title"><b>语音识别（语音转文字）简单部署与测试</b></span></span></h2><h3 class="notion-h notion-h2 notion-h-indent-1 notion-block-2aee940c69bb808393e4c7808c149e11" data-id="2aee940c69bb808393e4c7808c149e11"><span><div id="2aee940c69bb808393e4c7808c149e11" class="notion-header-anchor"></div><a class="notion-hash-link" href="#2aee940c69bb808393e4c7808c149e11" title="1. 框架解压与目录说明"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title"><b>1. 框架解压与目录说明</b></span></span></h3><div class="notion-text notion-block-2aee940c69bb80f79ec4f3fb185848ec">将下载的 Sherpa-ONNX 预编译包解压至开发板，进入解压后的<code class="notion-inline-code">bin</code>目录，可看到各类可执行文件（如<code class="notion-inline-code">sherpa-onnx-offline-tts</code>用于文本转语音、<code class="notion-inline-code">sherpa-onnx-alsa</code>用于对接音频设备的语音识别）。</div><h3 class="notion-h notion-h2 notion-h-indent-1 notion-block-2aee940c69bb80529221ee44fb789808" data-id="2aee940c69bb80529221ee44fb789808"><span><div id="2aee940c69bb80529221ee44fb789808" class="notion-header-anchor"></div><a class="notion-hash-link" href="#2aee940c69bb80529221ee44fb789808" title="2. 语音识别模型解压"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">2. 语音识别模型解压</span></span></h3><div class="notion-text notion-block-2aee940c69bb805e9a6dd006674949f9">将下载的语音识别模型解压至开发板，进入解压后的目录，可看到<code class="notion-inline-code">encoder</code>/<code class="notion-inline-code">decoder</code>/<code class="notion-inline-code">joiner</code>的模型核心组件，还有<code class="notion-inline-code">tokens</code>指定词汇表文件。这些东西都与后期在框架中的参数输入有关。</div><h3 class="notion-h notion-h2 notion-h-indent-1 notion-block-2aee940c69bb80d986caf665d337e7da" data-id="2aee940c69bb80d986caf665d337e7da"><span><div id="2aee940c69bb80d986caf665d337e7da" class="notion-header-anchor"></div><a class="notion-hash-link" href="#2aee940c69bb80d986caf665d337e7da" title="3. 关键参数与设备配置"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title"><b>3. 关键参数与设备配置</b></span></span></h3><div class="notion-text notion-block-2aee940c69bb80b2bcb7cb74a030c67e">进入Sherpa框架的bin文件，核心就是使用<code class="notion-inline-code">sherpa-onnx-alsa</code>工具实现语音识别，首先需要直到麦克风设备，通过命令查看麦克风设备：</div><div class="notion-text notion-block-2aee940c69bb809a9f96e8dd03f5ed47">输出结果中，例如我的 USB 麦克风对应设备号为<code class="notion-inline-code">card 2</code>，设备标识为<code class="notion-inline-code">hw:2,0</code>（可能随重启变化，需重新查询确认）。</div><h3 class="notion-h notion-h2 notion-h-indent-1 notion-block-2aee940c69bb80b9b355d0bed2c67c01" data-id="2aee940c69bb80b9b355d0bed2c67c01"><span><div id="2aee940c69bb80b9b355d0bed2c67c01" class="notion-header-anchor"></div><a class="notion-hash-link" href="#2aee940c69bb80b9b355d0bed2c67c01" title="4. 语音识别执行命令"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title"><b>4. 语音识别执行命令</b></span></span></h3><div class="notion-text notion-block-2aee940c69bb80a087c0f05b7a1264e0">在<code class="notion-inline-code">bin</code>目录下输入<code class="notion-inline-code">./sherpa - onnx - alsa</code>可查看工具帮助文档
这里我的目录结构是这个<div class="notion-text-children"><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-b8901894ad514027b33800e54cb84e8e"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:100%;max-width:100%;flex-direction:column"><img style="object-fit:cover" src="https://cdn.jsdmirror.com/gh/LZJ-I/picx-images-hosting@main/images/%E5%B5%8C%E5%85%A5%E5%BC%8F%E8%BD%AF%E4%BB%B6%E5%BC%80%E5%8F%91/Post-KickPi2B-Sherpa-ONNX/98d38e4c-fd6e-44cf-b4c0-34635f2d9e44-image.webp?spaceId=3a565fcb-f425-4846-b72a-d32a98183896&amp;t=b8901894-ad51-4027-b338-00e54cb84e8e" alt="notion image" loading="lazy" decoding="async"/></div></figure></div></div><div class="notion-text notion-block-2aee940c69bb80ce9df6e2a603fa581f">各核心参数说明如下：</div><table class="notion-simple-table notion-block-2aee940c69bb80bfaa1bf8e849a8781b"><tbody><tr class="notion-simple-table-row notion-simple-table-header-row notion-block-2aee940c69bb8077a7f2e2dfdb57af39"><td class="" style="width:166.6640625px"><div class="notion-simple-table-cell"><b>参数</b></div></td></tr><tr class="notion-simple-table-row notion-block-2aee940c69bb803ebd59c874a13d9ca4"><td class="" style="width:166.6640625px"><div class="notion-simple-table-cell">tokens</div></td></tr><tr class="notion-simple-table-row notion-block-2aee940c69bb80e281e3faaccc2d86e4"><td class="" style="width:166.6640625px"><div class="notion-simple-table-cell">encoder</div></td></tr><tr class="notion-simple-table-row notion-block-2aee940c69bb80c3af36e070eecd79e4"><td class="" style="width:166.6640625px"><div class="notion-simple-table-cell">decoder</div></td></tr><tr class="notion-simple-table-row notion-block-2aee940c69bb80ba8a6fe6e955132b02"><td class="" style="width:166.6640625px"><div class="notion-simple-table-cell">joiner</div></td></tr><tr class="notion-simple-table-row notion-block-11f65c16df5b46948d7e49efec58a312"><td class="" style="width:166.6640625px"><div class="notion-simple-table-cell">provider</div></td></tr></tbody></table><div class="notion-text notion-block-5f246ff2d4b74638b391e2d6915ce838">&lt;td&gt;指定推理硬件&lt;/td&gt;</div><div class="notion-text notion-block-0a3a1612904f4f9c9e5328797d245050">&lt;td&gt;因开发板硬件限制，此处选择<code class="notion-inline-code">cpu</code>&lt;/td&gt;</div><div class="notion-text notion-block-d9ea3d8322034b79bc92da4cd60d6d29">&lt;/tr&gt;</div><div class="notion-text notion-block-e3438e4b87c5449691ee8b0bc810f1e2">&lt;tr&gt;</div><div class="notion-text notion-block-558c84be029646c89b8e25caba410012">&lt;/tr&gt;</div><div class="notion-text notion-block-37e9ac02dcec46619aa6514c2ec2c7ea">&lt;/tr&gt;</div><div class="notion-text notion-block-06fd9f49e6de46fd95167b49b955f250">&lt;/tr&gt;</div><div class="notion-text notion-block-8640a0d103af44cabd4ece0080e0d700">&lt;/tr&gt;</div><div class="notion-text notion-block-18bba5a222a9451fb7582dbb2df2dd15">&lt;/tr&gt;</div><div class="notion-text notion-block-3c8c99a55c7f46b9a0cfc3e630cacaed">&lt;/tr&gt;</div><div class="notion-text notion-block-77b68cedf3ae4e4da25eeb45b3d5b4cb">&lt;/tr&gt;</div><div class="notion-text notion-block-e8b675fe34ee436cae4f9df2fc10c6be">&lt;/tr&gt;</div><div class="notion-text notion-block-acc8f01266c24370b1816ff94383aaa1">&lt;/tr&gt;</div><div class="notion-text notion-block-ee782489279e429dbbfc73534c90d9c1">&lt;/tr&gt;</div><div class="notion-text notion-block-ab320fc0d28341bebc7b48169b9b24f3">&lt;/tr&gt;</div><div class="notion-text notion-block-3f4f328531504279ba8ea55380292fe2">&lt;/tr&gt;</div><div class="notion-text notion-block-3a766c3d4422470ea22760ef39c51ddb">&lt;/tr&gt;</div><div class="notion-text notion-block-e1a5817fb4b34d83930469bc71f75c21">&lt;/tr&gt;</div><div class="notion-text notion-block-839290e538a64df39d8b0cdcac244f8d">&lt;/tr&gt;</div><div class="notion-text notion-block-f01df9c5104b4411b03f9dd79cdf336d">&lt;/tr&gt;</div><div class="notion-text notion-block-0ab47896f3e042eea0892e70d01d0c72">&lt;/tr&gt;</div><div class="notion-text notion-block-8b44458130614711af9de02a63e0523b">&lt;/tr&gt;</div><div class="notion-text notion-block-502df75740cc42ce9dcba49c4e4725eb">&lt;/tr&gt;</div><div class="notion-text notion-block-0e99c99f3d9d4651bf7b340141c56c53">&lt;/tr&gt;</div><div class="notion-text notion-block-1f0fc5b682944a1ebd58056b5b7c6722">&lt;td&gt;num-threads&lt;/td&gt;</div><div class="notion-text notion-block-badb22c8ed7a4407b88f79f5cb3f6fb8">&lt;td&gt;设置线程数&lt;/td&gt;</div><div class="notion-text notion-block-82b36e7acda94070b37db1d7703c1829">&lt;td&gt;配置为 2，平衡性能与资源占用&lt;/td&gt;</div><div class="notion-text notion-block-0ace9ec0251f455681690dd52c97ef5a">&lt;/tr&gt;</div><div class="notion-text notion-block-1dd3ae177b55431c85dea252d3a07389">&lt;tr&gt;</div><div class="notion-text notion-block-f4b9f41f353848c981e732cca0166de7">&lt;/tr&gt;</div><div class="notion-text notion-block-71cf32f815c74fd584278f13d41eb4e1">&lt;/tr&gt;</div><div class="notion-text notion-block-8f9d9b8af6fb482ea3d4ec25f017d412">&lt;/tr&gt;</div><div class="notion-text notion-block-8295ed9c04c847c59cdbf865bbd84e5a">&lt;/tr&gt;</div><div class="notion-text notion-block-1bf2e87dd8634653aa2529c615740671">&lt;/tr&gt;</div><div class="notion-text notion-block-532ef731712b4c26b806b7f140567703">&lt;/tr&gt;</div><div class="notion-text notion-block-3f60b53668e64c0ab60239a64d87685f">&lt;/tr&gt;</div><div class="notion-text notion-block-1573f0e863684686813718382e462132">&lt;/tr&gt;</div><div class="notion-text notion-block-7996e4ed00fb4511a12cdb9f0debac59">&lt;/tr&gt;</div><div class="notion-text notion-block-b949ced6b867451f91a378887dbd7444">&lt;/tr&gt;</div><div class="notion-text notion-block-824d52165d3e49c3a7f1adbca1f6b34c">&lt;/tr&gt;</div><div class="notion-text notion-block-3ceb9f9090b7406594008c4d5c21ffcd">&lt;/tr&gt;</div><div class="notion-text notion-block-586413cc60344a81842cbd6d6ad27403">&lt;/tr&gt;</div><div class="notion-text notion-block-100b49f421c44b05be608741ccaf4de7">&lt;/tr&gt;</div><div class="notion-text notion-block-f124ee9ec3574e1cb4b430cb6371a954">&lt;/tr&gt;</div><div class="notion-text notion-block-749e7d501e8a4e62bccd783a793dea36">&lt;/tr&gt;</div><div class="notion-text notion-block-69cb67d12bf0497cb3dcff39a99141da">&lt;/tr&gt;</div><div class="notion-text notion-block-ec447bdf42a04610a1c8683950afe137">&lt;/tr&gt;</div><div class="notion-text notion-block-0e692ba461de4bd5954823b2a637c5d2">&lt;/tr&gt;</div><div class="notion-text notion-block-b4634c7901a644449e525acb73cbd7f7">&lt;/tr&gt;</div><div class="notion-text notion-block-a03d590c8d644d80b4ba2e9bf165dc4d">&lt;td&gt;decoding-method&lt;/td&gt;</div><div class="notion-text notion-block-73cf58c1b7414e9ba5b61ce46d6bb3c7">&lt;td&gt;指定解码方式&lt;/td&gt;</div><div class="notion-text notion-block-23470c6dcae64cc0891fa28e67f86d6c">&lt;td&gt;选用<code class="notion-inline-code">greedy_search</code>（贪心搜索），兼顾效率与识别准确率&lt;/td&gt;</div><div class="notion-text notion-block-9bb1955250f14446ba3689a878a3ce5e">&lt;/tr&gt;</div><div class="notion-text notion-block-4bae47b621fb40ec80fe4a01ba18a75f">&lt;tr&gt;</div><div class="notion-text notion-block-5645609c3a36497c8b93986567c6b014">&lt;/tr&gt;</div><div class="notion-text notion-block-448b3536e8a2489980651318ffc652bd">&lt;/tr&gt;</div><div class="notion-text notion-block-664a0bda39b44137b09a42337ae6e154">&lt;/tr&gt;</div><div class="notion-text notion-block-883778b6b2164df3ae9daa3c2ecb690c">&lt;/tr&gt;</div><div class="notion-text notion-block-f14713acde7b4a4bab5ccca1f482d19a">&lt;/tr&gt;</div><div class="notion-text notion-block-5f8c7de6febb4d85a10c352bc11f16c1">&lt;/tr&gt;</div><div class="notion-text notion-block-275b35206f01445b94130cae15c5f80e">&lt;/tr&gt;</div><div class="notion-text notion-block-9ad24120db90465d8409213e7402a9aa">&lt;/tr&gt;</div><div class="notion-text notion-block-7dd7a4f1eedf4d7291574607636a71e3">&lt;/tr&gt;</div><div class="notion-text notion-block-02a9efb75e2b4f8eaa37a3dc469acbfc">&lt;/tr&gt;</div><div class="notion-text notion-block-f85a5be158054a8aae304ef8a16270eb">&lt;/tr&gt;</div><div class="notion-text notion-block-00a089ee93f04c0d8d2a8a20c6361827">&lt;/tr&gt;</div><div class="notion-text notion-block-d3e4a2a6f15e4cae8e7826f3b0f0096e">&lt;/tr&gt;</div><div class="notion-text notion-block-19875b459aba43598288bd4357e4b626">&lt;/tr&gt;</div><div class="notion-text notion-block-9d48e2a7b4e5483eb232501e896ce914">&lt;/tr&gt;</div><div class="notion-text notion-block-fe6b4463f9ba47398f655d566d3d1368">&lt;/tr&gt;</div><div class="notion-text notion-block-8c9879dc2f72425faeb143bf2045cdd7">&lt;/tr&gt;</div><div class="notion-text notion-block-d4d06c8358a446118fdfd279eb82cfb4">&lt;/tr&gt;</div><div class="notion-text notion-block-661f91165be64200bff58716bd77530c">&lt;/tr&gt;</div><div class="notion-text notion-block-c66786cb469d4fa1b74688d7bd4c7547">&lt;/tr&gt;</div><div class="notion-text notion-block-2451878b427c470f83c68022dace239c">&lt;td&gt;device_name&lt;/td&gt;</div><div class="notion-text notion-block-6a2effc6bd914ed9930462a2ba47a30b">&lt;td&gt;指定音频输入设备&lt;/td&gt;</div><div class="notion-text notion-block-bcd084a6069842d2b77c8e090fa3bb2c">&lt;td&gt;即麦克风设备标识，需通过指令查询确定例如我的参数为<code class="notion-inline-code">hw:2,0</code>&lt;/td&gt;</div><div class="notion-text notion-block-14c9fcceef564c52a5713502c1a89745">&lt;/tr&gt;</div><div class="notion-text notion-block-e643885c021e4eb7abb1c73744ce16d2">&lt;/table&gt;</div><div class="notion-text notion-block-c522688f7fe348c0ab47f6c7f952b683">经过一系列的加载，当看到开始录音，请说话时，就代表成功了。</div><h2 class="notion-h notion-h1 notion-h-indent-0 notion-block-82543e280e0b4eba99b58a54f34444c6" data-id="82543e280e0b4eba99b58a54f34444c6"><span><div id="82543e280e0b4eba99b58a54f34444c6" class="notion-header-anchor"></div><a class="notion-hash-link" href="#82543e280e0b4eba99b58a54f34444c6" title="语音合成（文字转语音）简单部署与测试"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title"><b>语音合成（文字转语音）简单部署与测试</b></span></span></h2><div class="notion-text notion-block-2734d7d35ba44805bfdf24527aa61114">语音合成（TTS）功能可将文本直接转换为可听语音，本次基于 Sherpa-ONNX 框架的 sherpa-onnx-offline-tts-play-alsa 工具实现 —— 该工具支持直接对接开发板音频输出设备，无需额外播放软件，适配嵌入式场景的轻量化需求。</div><h3 class="notion-h notion-h2 notion-h-indent-1 notion-block-dc0b75e44bc04fb9b624d9a6eb36a77d" data-id="dc0b75e44bc04fb9b624d9a6eb36a77d"><span><div id="dc0b75e44bc04fb9b624d9a6eb36a77d" class="notion-header-anchor"></div><a class="notion-hash-link" href="#dc0b75e44bc04fb9b624d9a6eb36a77d" title="1.前置准备(工具与模型校验)"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title"><b>1.前置准备(工具与模型校验)</b></span></span></h3><div class="notion-text notion-block-ebd9ca6bc06442299537b4e2eb85ce7c">在执行操作前，需先确认工具可用性与模型完整性，避免后续因文件缺失或路径错误导致失败。</div><div class="notion-text notion-block-b0bf384831284ccebf03b3f72d950801"><b>1. 确认 TTS 工具位置</b></div><div class="notion-text notion-block-146171e7f5954d319727ded3635f1bca">Sherpa-ONNX 预编译包的 bin 目录中包含多个 TTS 相关工具，核心工具及用途如下：</div><table class="notion-simple-table notion-block-7183dce0ecf04dc6a4e9260720a9184f"><tbody><tr class="notion-simple-table-row notion-block-bd45aa31821847669e322f67224b4faf"><td class="" style="width:120px"><div class="notion-simple-table-cell">工具名称</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">核心功能</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">适用场景</div></td></tr><tr class="notion-simple-table-row notion-block-a4bc3a8a1e8643aa84baaf46b5caf6be"><td class="" style="width:120px"><div class="notion-simple-table-cell"><code class="notion-inline-code">sherpa-onnx-offline-tts</code></div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">仅将文本转换为 WAV 音频文件（需后续播放）</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">需保存语音文件的场景</div></td></tr><tr class="notion-simple-table-row notion-block-c33e8dfb7dc7461190ff5bfcf2e81edf"><td class="" style="width:120px"><div class="notion-simple-table-cell"><code class="notion-inline-code">sherpa-onnx-offline-tts-play-alsa</code></div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">文本转语音后直接通过 ALSA 设备播放</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">实时听语音结果的测试场景</div></td></tr><tr class="notion-simple-table-row notion-block-4469674ccd1148a4a66fde4f3a4327b8"><td class="" style="width:120px"><div class="notion-simple-table-cell"><code class="notion-inline-code">sherpa-onnx-offline-zeroshot-tts</code></div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">零样本 TTS（支持自定义发音人）</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">需灵活切换发音风格的场景</div></td></tr></tbody></table><div class="notion-text notion-block-e86a62f14aa1410c8de4199ea6d6c8d7">本次选择<code class="notion-inline-code"> sherpa-onnx-offline-tts-play-alsa</code>（实时播放），先通过以下命令确认工具可执行：</div><div class="notion-text notion-block-6fb30fa11308418ea9665e965d34efd3">在执行操作前，需先确认工具可用性与模型完整性，避免后续因文件缺失或路径错误导致失败。</div><div class="notion-text notion-block-35d472117757409b98cf3f5ff42dd213"><b>2. 校验 TTS 模型文件完整性</b></div><div class="notion-text notion-block-79b0ce36dcae460db7462dc5e0542866">需确保已下载的 TTS 模型（<a class="notion-link" href="http://vits-icefall-zh-aishell3.tar.bz" target="_blank" rel="noopener noreferrer">vits-icefall-zh-aishell3.tar.bz</a>2）解压后，核心文件齐全。进入模型解压目录，应包含以下文件：</div><div class="notion-blank notion-block-7eabe31835de460abd3d1673ec219d05"> </div><div class="notion-text notion-block-a867c4761b6e4fe1aa2bc38a197e304d">需存在的核心文件：</div><ul class="notion-list notion-list-disc notion-block-207e2abec2ae47898824ad0b39dc2869"><li><code class="notion-inline-code">model.onnx</code>：VITS 架构的核心合成模型（必选）</li></ul><ul class="notion-list notion-list-disc notion-block-091d661717c54ffd897c017711bad003"><li><code class="notion-inline-code">tokens.txt</code>：文本字符映射表（定义模型可识别的汉字 / 符号，必选）</li></ul><ul class="notion-list notion-list-disc notion-block-cba202e5146f4b28b83eff89a4ad6862"><li><code class="notion-inline-code">lexicon.txt</code>：词典文件（将汉字映射为拼音，解决多音字问题，必选）</li></ul><ul class="notion-list notion-list-disc notion-block-9d8a03e2056c4631bf96c94f7c242d54"><li><code class="notion-inline-code">date.fst/number.fst</code> 等：文本预处理规则文件（处理日期、数字的发音，如 “2025” 读作 “二千零二十五年”，必选）</li></ul><div class="notion-text notion-block-02242713f64a4869bb80c8acf616ecde">若缺少上述文件，需重新下载并解压模型包，避免因文件缺失导致合成失败。</div><h3 class="notion-h notion-h2 notion-h-indent-1 notion-block-2f8b9ad4949141668a92e3e285e72575" data-id="2f8b9ad4949141668a92e3e285e72575"><span><div id="2f8b9ad4949141668a92e3e285e72575" class="notion-header-anchor"></div><a class="notion-hash-link" href="#2f8b9ad4949141668a92e3e285e72575" title="2. 核心操作：从设备配置到语音合成"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title"><b>2. 核心操作：从设备配置到语音合成</b></span></span></h3><h4 class="notion-h notion-h3 notion-h-indent-2 notion-block-cdd6076a0c564683aafc9ddf162c024d" data-id="cdd6076a0c564683aafc9ddf162c024d"><span><div id="cdd6076a0c564683aafc9ddf162c024d" class="notion-header-anchor"></div><a class="notion-hash-link" href="#cdd6076a0c564683aafc9ddf162c024d" title="步骤 1：查询音频输出设备（关键！）"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title"><b>步骤 1：查询音频输出设备（关键！）</b></span></span></h4><div class="notion-text notion-block-3c9c039d5b6e4506a9462c49fb72beef">语音合成需指定开发板的 “音频播放设备”，通过 <code class="notion-inline-code">aplay -l</code> 命令查询硬件设备列表：</div><div class="notion-text notion-block-ff5db5f073a749e091c90040b5d888c9"><b>示例输出</b>（需重点关注 <code class="notion-inline-code">card X</code> 和 <code class="notion-inline-code">device Y</code>）：</div><div class="notion-blank notion-block-2dea98fce95b498181ec00d11b235182"> </div><ul class="notion-list notion-list-disc notion-block-a7eaddf024e043c8ac2da2167c914d98"><li>若连接耳机 / 音箱到开发板的 3.5mm 接口，通常对应 <code class="notion-inline-code">card 0</code>（如示例中的 <code class="notion-inline-code">audiocodec</code>）</li></ul><ul class="notion-list notion-list-disc notion-block-ab72bb8c0d9248a68ce210e159a51e5a"><li>若通过 HDMI 输出音频，对应 <code class="notion-inline-code">card 1</code>（<code class="notion-inline-code">ahubhdmi</code>）</li></ul><ul class="notion-list notion-list-disc notion-block-291c18595b034c59835adf90ea111737"><li><b>设备标识格式</b>：<code class="notion-inline-code">hw:X,Y</code>（X=card 编号，Y=device 编号），示例中 3.5mm 接口对应 <code class="notion-inline-code">hw:0,0</code></li></ul><h4 class="notion-h notion-h3 notion-h-indent-2 notion-block-57a397f0bca0407b93a85fd3062c4799" data-id="57a397f0bca0407b93a85fd3062c4799"><span><div id="57a397f0bca0407b93a85fd3062c4799" class="notion-header-anchor"></div><a class="notion-hash-link" href="#57a397f0bca0407b93a85fd3062c4799" title="步骤 2：执行语音合成命令"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title"><b>步骤 2：执行语音合成命令</b></span></span></h4><div class="notion-text notion-block-63b3d58d14bd47c0b3acb294447f73f5">在 Sherpa-ONNX 的 <code class="notion-inline-code">bin</code> 目录下，执行以下命令（需根据自身路径和设备标识修改参数）：</div><div class="notion-blank notion-block-f23d7acc6a6b4a63a70e3b2b101dddb2"> </div><div class="notion-text notion-block-17ad48ccf02a44d6a545fe22866cd569"><b>关键参数详解（修正原表述误差，补充实操细节）</b></div><div class="notion-blank notion-block-c6030ff0d3fa429fbe56d2af47d5e7be"> </div><table class="notion-simple-table notion-block-3d195e77121f4714919e88d439a6f83b"><tbody><tr class="notion-simple-table-row notion-block-b5360f28e8be42a48d29527aea14e37d"><td class="" style="width:120px"><div class="notion-simple-table-cell">参数</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">核心作用</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">实操注意事项</div></td></tr><tr class="notion-simple-table-row notion-block-c41b35347e52435ab1f76e274ce9e1e7"><td class="" style="width:120px"><div class="notion-simple-table-cell">--vits-model</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">指定 VITS 架构的核心合成模型</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">路径必须完整，若提示 “File not found”，检查路径是否包含空格（需用引号包裹）</div></td></tr><tr class="notion-simple-table-row notion-block-81138562f4244245b2a031a29ded1cb1"><td class="" style="width:120px"><div class="notion-simple-table-cell">--vits-tokens</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">定义模型可识别的字符（汉字、标点等）</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">不可省略，缺失会导致文本无法解析（如特殊符号可能被过滤）</div></td></tr><tr class="notion-simple-table-row notion-block-4794df0d66cd4db7978387eacffe03c3"><td class="" style="width:120px"><div class="notion-simple-table-cell">--vits-lexicon</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">解决多音字问题（如 “行” 读 xíng 或 háng）</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">若合成语音出现读音错误，可检查此文件是否包含对应汉字的拼音映射</div></td></tr><tr class="notion-simple-table-row notion-block-a428f4de8e6a478fb1641584358cd362"><td class="" style="width:120px"><div class="notion-simple-table-cell">--tts-rule-fsts</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">处理特殊文本格式（日期、数字、符号）</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">例如 “2025” 会被转换为 “二千零二十五年”，缺失会导致数字读作 “二零二五”</div></td></tr></tbody></table><div class="notion-text notion-block-bd52b4b1266d4ecbb86fba86bb49af86">&lt;td&gt;--vits-length-scale&lt;/td&gt;</div><div class="notion-text notion-block-059916bcd8e143ad9848bf861684089d">&lt;td&gt;控制语音速度&lt;/td&gt;</div><div class="notion-text notion-block-cfff94d6c90842d0b5a55a09b8a0e885">&lt;td&gt;取值范围 0.1-3.0：0.5 = 快节奏，1.0 = 默认，1.5 = 慢节奏，根据需求调整&lt;/td&gt;</div><div class="notion-text notion-block-1b661485b5764ae6b72a9cbad091b1c0">&lt;/tr&gt;</div><div class="notion-text notion-block-cf763c1f6af347d9bed80a4c90651589">&lt;tr&gt;</div><div class="notion-text notion-block-efa556a466b24a5bac8f7804c6a2f2bc">&lt;/tr&gt;</div><div class="notion-text notion-block-e5efec83fbd743e4a0a2cf5bc75df036">&lt;/tr&gt;</div><div class="notion-text notion-block-8518d33c10364c6f91a9b6b5806430a3">&lt;/tr&gt;</div><div class="notion-text notion-block-4a39288ed5fb417a9b76cf06fafb2294">&lt;/tr&gt;</div><div class="notion-text notion-block-4de4ffa6c47d445e8a19a63f2452f3cf">&lt;/tr&gt;</div><div class="notion-text notion-block-91b207a547ba4db7875471f62ebf0e59">&lt;/tr&gt;</div><div class="notion-text notion-block-fc1ea1d424a24a35950241836ba12a0f">&lt;/tr&gt;</div><div class="notion-text notion-block-1f787f52a1ff4de6beb41dea1dc3e2f1">&lt;/tr&gt;</div><div class="notion-text notion-block-eaff17a6360d4862b576aa8d835aa7cc">&lt;/tr&gt;</div><div class="notion-text notion-block-99913d979aa145058a5f5fc64b8d51bc">&lt;/tr&gt;</div><div class="notion-text notion-block-c03eb9eac18c489fb33a9fba0abd3192">&lt;/tr&gt;</div><div class="notion-text notion-block-69dc87fecbd6498cb1d4c6fcdd164ced">&lt;/tr&gt;</div><div class="notion-text notion-block-0c172af788f44dfd9c61e8277b757801">&lt;/tr&gt;</div><div class="notion-text notion-block-6f74e1d308bb48079042faafcea7c3ff">&lt;/tr&gt;</div><div class="notion-text notion-block-441bf3982431450499c6e93803515550">&lt;/tr&gt;</div><div class="notion-text notion-block-b61b3c8efd664d1e9d5c940d52ed5cca">&lt;/tr&gt;</div><div class="notion-text notion-block-dc1f450dce6740e198cc1972b1e560bf">&lt;/tr&gt;</div><div class="notion-text notion-block-6905af4192b046638d103393dc744955">&lt;/tr&gt;</div><div class="notion-text notion-block-c80778b58ae14739999b79eba11780cb">&lt;/tr&gt;</div><div class="notion-text notion-block-4b6696cbb27b4e27852829868afef937">&lt;td&gt;--sid&lt;/td&gt;</div><div class="notion-text notion-block-79e71442580046fa820fd055f91caa48">&lt;td&gt;指定发音人（音色切换）&lt;/td&gt;</div><div class="notion-text notion-block-b3bc3a5287d04fbdb4915e4349d9996c">&lt;td&gt;模型支持 0-174 共 175 个发音人：0 = 男性，100 = 中性女声，150 = 儿童声（可多试 ID）&lt;/td&gt;</div><div class="notion-text notion-block-a6fafe9d1ac54770ab9c6aec5db42044">&lt;/tr&gt;</div><div class="notion-text notion-block-0c5fa170ebbd4feda640bd2e30f61cbc">&lt;tr&gt;</div><div class="notion-text notion-block-dcc8ce88204f46d09c2dcc63f2988b8d">&lt;/tr&gt;</div><div class="notion-text notion-block-55b0e8b7666b493f9e239f27160b7655">&lt;/tr&gt;</div><div class="notion-text notion-block-4827431e3c81487ab7a1a40599a0dd5c">&lt;/tr&gt;</div><div class="notion-text notion-block-ec67b4508ec74fb4b1500979c4a43082">&lt;/tr&gt;</div><div class="notion-text notion-block-06f0e980cd1848c1b9a1f2f7ccf5cd21">&lt;/tr&gt;</div><div class="notion-text notion-block-4bb9db544d804a578f67d0d00ab27f8c">&lt;/tr&gt;</div><div class="notion-text notion-block-84bf61338b5d4cd4a1fb7a45074e9168">&lt;/tr&gt;</div><div class="notion-text notion-block-5532eab72e5c4b0cb64e96c3e2ab94d4">&lt;/tr&gt;</div><div class="notion-text notion-block-610fffcd36e64c0f9c5259b551f20520">&lt;/tr&gt;</div><div class="notion-text notion-block-a179e248f563477ba480cba2f195232e">&lt;/tr&gt;</div><div class="notion-text notion-block-b49f74e8c01442ad8865d0714d9a7999">&lt;/tr&gt;</div><div class="notion-text notion-block-47f579d519ee46c79e71030d3a1a7be7">&lt;/tr&gt;</div><div class="notion-text notion-block-fb4c122924974a49b711c7a0fc4bc036">&lt;/tr&gt;</div><div class="notion-text notion-block-d9098c139e4d4fa28d23ab408b6c70ef">&lt;/tr&gt;</div><div class="notion-text notion-block-dcb5c2d21dfb4b90b7b3487b75a36cbb">&lt;/tr&gt;</div><div class="notion-text notion-block-9c0d5953beb249d5a2ad7662fbe16396">&lt;/tr&gt;</div><div class="notion-text notion-block-aa2601dc77ee43928e58db501a3395f5">&lt;/tr&gt;</div><div class="notion-text notion-block-ff8566a5192f4bcd81d952d7c83ed64d">&lt;/tr&gt;</div><div class="notion-text notion-block-16e37cdf842a493ca390697801b79ff6">&lt;/tr&gt;</div><div class="notion-text notion-block-04c88cfc836247feba57b7d5978bfee2">&lt;td&gt;--num-threads&lt;/td&gt;</div><div class="notion-text notion-block-0d773bcab1104333a61563d6fe507a39">&lt;td&gt;分配的 CPU 线程数&lt;/td&gt;</div><div class="notion-text notion-block-f44b363bf8ad47faaf723facd6004696">&lt;td&gt;KickPi K2B 建议 2-4 线程：线程过少会卡顿，过多会占用其他进程资源&lt;/td&gt;</div><div class="notion-text notion-block-c5f24b5e727e464d9097580983d3b9fb">&lt;/tr&gt;</div><div class="notion-text notion-block-50ce7353f6234a6c952293b29396d956">&lt;tr&gt;</div><div class="notion-text notion-block-5bf62f2d708e4b329e19a5828dc8eb7a">&lt;/tr&gt;</div><div class="notion-text notion-block-689da8e8430f45baa2e02f4852bfc908">&lt;/tr&gt;</div><div class="notion-text notion-block-74e4d7c11c7d4d45bd8797d3b11be546">&lt;/tr&gt;</div><div class="notion-text notion-block-f236fa92619b4c27b20c93de7b9641d7">&lt;/tr&gt;</div><div class="notion-text notion-block-9a84eedd56d64b58a6551f5ed4a98ce1">&lt;/tr&gt;</div><div class="notion-text notion-block-3b033bedbe124256960e08ca8e6ecf74">&lt;/tr&gt;</div><div class="notion-text notion-block-044217f513b142a197570cbcc85d887d">&lt;/tr&gt;</div><div class="notion-text notion-block-c54eb29d9f8149fe9c25d35c2c67ec02">&lt;/tr&gt;</div><div class="notion-text notion-block-87625b9599bb47e7b35dfd12f97d4b97">&lt;/tr&gt;</div><div class="notion-text notion-block-24878e13e2204f2ba120e2d573d53bdb">&lt;/tr&gt;</div><div class="notion-text notion-block-b3bb2d9953d1434abb88e6d2be93c4ff">&lt;/tr&gt;</div><div class="notion-text notion-block-29f150d280b8464fb0be63bc9d5718f0">&lt;/tr&gt;</div><div class="notion-text notion-block-e43f1d2e139448588c74cac7c98211c8">&lt;/tr&gt;</div><div class="notion-text notion-block-4c1b99eac2374913a2bb225d041e3d53">&lt;/tr&gt;</div><div class="notion-text notion-block-6ba31669b0494147ac2f7882a5efa974">&lt;/tr&gt;</div><div class="notion-text notion-block-eaddb26047d1460b94f03ec4a27caf3d">&lt;/tr&gt;</div><div class="notion-text notion-block-9b6ce73028b14261958e6654ef77d35d">&lt;/tr&gt;</div><div class="notion-text notion-block-224e6c441336494592dd47de581e790a">&lt;/tr&gt;</div><div class="notion-text notion-block-33278b5957eb44858013299a6ce02ed6">&lt;/tr&gt;</div><div class="notion-text notion-block-970aadb0bb2942238e56a215b43c5bc5">&lt;td&gt;--device&lt;/td&gt;</div><div class="notion-text notion-block-ac36b854235a4f979858a26ef4e38655">&lt;td&gt;指定音频播放设备&lt;/td&gt;</div><div class="notion-text notion-block-99dfa28d7ce246739af4bbc738aa60a3">&lt;td&gt;必须与aplay -l查询的标识一致，否则无声音输出（常见错误：设备号填错）&lt;/td&gt;</div><div class="notion-text notion-block-4218ca35995949e783b90b8b916969b2">&lt;/tr&gt;</div><div class="notion-text notion-block-dd3ec7ba16b04ced86a4757c483a7a4d">&lt;/table&gt;</div><h3 class="notion-h notion-h2 notion-h-indent-1 notion-block-44b92b1fd1cb49c781d1ebe0c791a679" data-id="44b92b1fd1cb49c781d1ebe0c791a679"><span><div id="44b92b1fd1cb49c781d1ebe0c791a679" class="notion-header-anchor"></div><a class="notion-hash-link" href="#44b92b1fd1cb49c781d1ebe0c791a679" title="3、结果验证：确认合成成功"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title"><b>3、结果验证：确认合成成功</b></span></span></h3><div class="notion-text notion-block-dc667445a9ee400b92b7cc1d80dffeb1">执行命令后，通过以下现象判断是否成功：</div><ol start="1" class="notion-list notion-list-numbered notion-block-c1c2719f54804405bba02c4850c42298" style="list-style-type:decimal"><li><b>无报错提示</b>：命令行未出现 “Model load failed”“Device not found” 等错误</li></ol><ol start="2" class="notion-list notion-list-numbered notion-block-85bf9be65c814c569518fcc700496e70" style="list-style-type:decimal"><li><b>音频输出</b>：连接的耳机 / 音箱能清晰听到文本对应的语音（如 “今天是 2025 年 11 月 18 日...”）</li></ol><ol start="3" class="notion-list notion-list-numbered notion-block-e1c3f9032b844fd8b7a99a5336c2430f" style="list-style-type:decimal"><li><b>临时文件</b>：工具会在内存中生成临时 WAV 文件（无需手动保存），播放完成后自动清理</li></ol><div class="notion-text notion-block-0db531ccdab24e08b942a40c812b4edd">若未听到声音，按以下顺序排查：</div><ol start="1" class="notion-list notion-list-numbered notion-block-5bc1132760524f08af5a59e835da0096" style="list-style-type:decimal"><li>检查 --device 参数是否与 aplay -l 结果一致（如误填 hw:1,0 而实际用 3.5mm 接口）</li></ol><ol start="2" class="notion-list notion-list-numbered notion-block-bda03da4fab64950990dcf8a68ada49e" style="list-style-type:decimal"><li>确认耳机 / 音箱已通电且音量正常（可通过 aplay test.wav 播放测试音频验证设备）</li></ol><ol start="3" class="notion-list notion-list-numbered notion-block-6f52064cda7b4f5a9770ff4bf22aa3b7" style="list-style-type:decimal"><li>检查模型文件是否完整（重新解压模型包，确认 model.onnx 大小是否正常，避免下载损坏）</li></ol><div class="notion-blank notion-block-4760adb9bbbd43aaa4832662d70ad1f9"> </div><h2 class="notion-h notion-h1 notion-h-indent-0 notion-block-d3c989a497c3496fbb7511a59ab5c01a" data-id="d3c989a497c3496fbb7511a59ab5c01a"><span><div id="d3c989a497c3496fbb7511a59ab5c01a" class="notion-header-anchor"></div><a class="notion-hash-link" href="#d3c989a497c3496fbb7511a59ab5c01a" title="关键词检测（KWS）的完整部署与测试"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title"><b>关键词检测（KWS）的完整部署与测试</b></span></span></h2><div class="notion-text notion-block-11524110b3734ebb923710299e1f066f">关键词检测（Keyword Spotting，简称 KWS）是语音交互系统的重要组成部分，能够在持续监听的同时，快速识别特定唤醒词（如 &quot;小爱同学&quot;、&quot;你好军哥&quot;），是实现语音助手、智能设备唤醒的核心技术。本次基于 Sherpa-ONNX 框架的sherpa-onnx-keyword-spotter-alsa工具，实现在 KickPi K2B 开发板上的实时关键词检测功能。</div><h3 class="notion-h notion-h2 notion-h-indent-1 notion-block-b2767cde7f8744f3891aa87b3afd4c8e" data-id="b2767cde7f8744f3891aa87b3afd4c8e"><span><div id="b2767cde7f8744f3891aa87b3afd4c8e" class="notion-header-anchor"></div><a class="notion-hash-link" href="#b2767cde7f8744f3891aa87b3afd4c8e" title="1. 前置准备：工具与模型校验"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title"><b>1. 前置准备：工具与模型校验</b></span></span></h3><div class="notion-text notion-block-8646bf73c6724d0fa0a8f065df6fca34">在执行关键词检测前，需先确认工具可用性与模型完整性，确保所有依赖文件正确配置。</div><div class="notion-text notion-block-281556df29d643fa9ca683ca48885e24"><b>1.1 确认关键词检测工具位置</b></div><div class="notion-text notion-block-0fb685f018dc4635a78134e94aea5c1b">Sherpa-ONNX 预编译包的bin目录中包含多个 KWS 相关工具，核心工具及用途如下：</div><table class="notion-simple-table notion-block-c214673504424218b000ba7ea8d8f56e"><tbody><tr class="notion-simple-table-row notion-block-8f6169a42d9f4f2091d13f064777ea87"><td class="" style="width:120px"><div class="notion-simple-table-cell">工具名称</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">核心功能</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">适用场景</div></td></tr><tr class="notion-simple-table-row notion-block-4d6d46325a384cf7b513928adbde03e9"><td class="" style="width:120px"><div class="notion-simple-table-cell"><code class="notion-inline-code">sherpa-onnx-keyword-spotter</code></div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">基础关键词检测工具（需手动输入音频文件）</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">离线批量检测场景</div></td></tr><tr class="notion-simple-table-row notion-block-d7523a90a6dd4a428ed0096862573fe0"><td class="" style="width:120px"><div class="notion-simple-table-cell"><code class="notion-inline-code">sherpa-onnx-keyword-spotter-alsa</code></div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">对接 ALSA 音频设备的实时关键词检测</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">实时语音交互场景</div></td></tr><tr class="notion-simple-table-row notion-block-2a7c92b435664a70a86cda4eca8fe524"><td class="" style="width:120px"><div class="notion-simple-table-cell"><code class="notion-inline-code">sherpa-onnx-keyword-spotter-microphone</code></div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">通用麦克风接口的关键词检测</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">跨平台兼容性需求场景</div></td></tr></tbody></table><div class="notion-text notion-block-8137ed55374641f191a42a39ae931227">本次选择<code class="notion-inline-code"><b>sherpa-onnx-keyword-spotter-alsa</b></code>（实时 ALSA 设备支持），先通过以下命令确认工具可执行：</div><div class="notion-text notion-block-824ceabc129243e29bf5334aa4266aa8">若工具正常，将显示完整的参数说明文档。</div><div class="notion-text notion-block-2fd6a82f681a4eb5aa558757fb155230"><b>1.2 校验 KWS 模型文件完整性</b></div><div class="notion-text notion-block-a5571b3c412440378a135528b94c8034">需确保已下载的 KWS 模型（<a class="notion-link" href="http://sherpa-onnx-kws-zipformer-wenetspeech-3.3M-2024-01-01-mobile.tar.bz" target="_blank" rel="noopener noreferrer">sherpa-onnx-kws-zipformer-wenetspeech-3.3M-2024-01-01-mobile.tar.bz</a>2）解压后，核心文件齐全。进入模型解压目录，应包含以下文件：</div><div class="notion-text notion-block-31a244a16df74bdeb84cebf21b5e1333">需存在的核心文件：</div><ul class="notion-list notion-list-disc notion-block-d886890f438541e2a62635178a36de45"><li><code class="notion-inline-code">encoder-epoch-12-avg-2-chunk-16-left-64.onnx</code>：编码器模型（处理音频特征提取）</li></ul><ul class="notion-list notion-list-disc notion-block-546bdfe89fba450d85b3de2cec9c3077"><li><code class="notion-inline-code">decoder-epoch-12-avg-2-chunk-16-left-64.onnx</code>：解码器模型（关键词匹配）</li></ul><ul class="notion-list notion-list-disc notion-block-342c8b205c6a410b98b0739c48a3406c"><li><code class="notion-inline-code">joiner-epoch-12-avg-2-chunk-16-left-64.int8.onnx</code>：融合器模型（优化检测精度）</li></ul><ul class="notion-list notion-list-disc notion-block-7d3753cf214948479327b443bac2f7e6"><li><code class="notion-inline-code">tokens.txt</code>：词汇表文件（定义模型可识别的语音单元）</li></ul><ul class="notion-list notion-list-disc notion-block-c4dc2a80fa65426ba316aea22aba48fe"><li><code class="notion-inline-code">keywords.txt</code>：关键词配置文件（定义需要检测的唤醒词）</li></ul><ul class="notion-list notion-list-disc notion-block-9ece53f2147a4dc1aaee607ac1a0d01f"><li><code class="notion-inline-code">keywords_raw.txt</code>：原始关键词文件（备用参考）</li></ul><div class="notion-text notion-block-f889b813d0ea42e9845cec706c81b37d"><b>1.3 关键词配置文件详解</b></div><div class="notion-text notion-block-0e666f951006402083f41a671558d2d2">keywords.txt是 KWS 功能的核心配置文件，定义了系统需要识别的关键词。文件格式采用 &quot;拼音序列 @ 关键词文本&quot; 的结构：</div><div class="notion-text notion-block-3270133d3bf74d66aa5b17b9597a7611">默认配置示例：</div><div class="notion-text notion-block-08b5cbc3648447a6b28f3a6e6e3bc92a"><b>格式说明</b>：</div><ul class="notion-list notion-list-disc notion-block-940d565f0d6b499392fe0eebb748f4cb"><li>拼音部分：每个音节用空格分隔（如 &quot;x iǎo ài t óng x ué&quot; 对应 &quot;小爱同学&quot;）</li></ul><ul class="notion-list notion-list-disc notion-block-f464a128f25749dc8b9c8c3a41e0a1a5"><li>@符号：分隔拼音序列和关键词文本</li></ul><ul class="notion-list notion-list-disc notion-block-2188bda090f846a8ab7a41881229d008"><li>关键词文本：实际显示的唤醒词名称</li></ul><h3 class="notion-h notion-h2 notion-h-indent-1 notion-block-b407734b19744ce780e9631a4ec16397" data-id="b407734b19744ce780e9631a4ec16397"><span><div id="b407734b19744ce780e9631a4ec16397" class="notion-header-anchor"></div><a class="notion-hash-link" href="#b407734b19744ce780e9631a4ec16397" title="2. 自定义关键词配置"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title"><b>2. 自定义关键词配置</b></span></span></h3><div class="notion-text notion-block-d4fb5f69f68a494aab3d88b81367b774">根据实际需求，可以添加自定义关键词，扩展系统的唤醒词库。</div><div class="notion-text notion-block-697438307702436d9b535e36ef97b983"><b>2.1 添加自定义关键词</b></div><div class="notion-text notion-block-b32546550cb14838af9f116a6b238530">以添加 &quot;小刘同学&quot; 为例：</div><div class="notion-text notion-block-ebf7c30781a9480eb37c316518c00ffc"><b>2.2 关键词配置原则</b></div><ol start="1" class="notion-list notion-list-numbered notion-block-a5289776ab56496b858be178d43022ef" style="list-style-type:decimal"><li><b>发音清晰</b>：选择发音清晰、不易混淆的词汇</li></ol><ol start="2" class="notion-list notion-list-numbered notion-block-f3c5b9e1583b4629a191a84766380f99" style="list-style-type:decimal"><li><b>长度适中</b>：建议 2-4 个汉字，过短易误触发，过长识别困难</li></ol><ol start="3" class="notion-list notion-list-numbered notion-block-4937e666abc34737b070ca0ad1803d2b" style="list-style-type:decimal"><li><b>独特性强</b>：避免与常用词汇过于相似</li></ol><ol start="4" class="notion-list notion-list-numbered notion-block-6bd650ce6b074a3094084ee25512028c" style="list-style-type:decimal"><li><b>拼音准确</b>：确保拼音标注准确，特别是多音字</li></ol><h3 class="notion-h notion-h2 notion-h-indent-1 notion-block-07c8706438ce499aa2671da887ba0814" data-id="07c8706438ce499aa2671da887ba0814"><span><div id="07c8706438ce499aa2671da887ba0814" class="notion-header-anchor"></div><a class="notion-hash-link" href="#07c8706438ce499aa2671da887ba0814" title="3. 核心操作：从设备配置到实时检测"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title"><b>3. 核心操作：从设备配置到实时检测</b></span></span></h3><div class="notion-text notion-block-bb36aee3494e45abb20b6aeb7aa640b6"><b>3.1 查询音频输入设备</b></div><div class="notion-text notion-block-32af4601b17944eba74eb905ea5e82d2">关键词检测需要指定麦克风设备，通过arecord -l命令查询：</div><div class="notion-text notion-block-e3169f5445e246988ff81fa020ccc284"><code class="notion-inline-code">arecord -l</code></div><div class="notion-text notion-block-636b9723515f4ab39e9895a5db39c4e7"><b>示例输出</b>：</div><div class="notion-text notion-block-91b412eda95048f79e14a880abdf97c0"><b>设备标识规则</b>：</div><ul class="notion-list notion-list-disc notion-block-4f0b5f131cb44820a421ff327ecc0384"><li>USB 麦克风通常对应card 2（如示例中的 &quot;USB Composite Device&quot;）</li></ul><ul class="notion-list notion-list-disc notion-block-013d3ceeb50649dc99d9b6b90fe467a4"><li>设备标识格式：hw:X,Y（X=card 编号，Y=device 编号）</li></ul><ul class="notion-list notion-list-disc notion-block-6c87a2447fa848c8b4d82acdf7dff622"><li>示例中 USB 麦克风对应hw:2,0</li></ul><div class="notion-text notion-block-143f43157b354794bdbf767abe933799"><b>3.2 执行关键词检测命令</b></div><div class="notion-text notion-block-abfa2930f73a48e78156eac22bfeb4d3">在 Sherpa-ONNX 的bin目录下，执行以下完整命令：</div><div class="notion-text notion-block-f96ee2ecbdd14db08929472a8c64f2de">--encoder=&quot;/root/shepa/1-关键词检测/sherpa-onnx-kws-zipformer-wenetspeech-3.3M-2024-01-01-mobile/encoder-epoch-12-avg-2-chunk-16-left-64.onnx&quot; \</div><div class="notion-text notion-block-2758bdcb30f34f6fba80ab99c048bb82">--decoder=&quot;/root/shepa/1-关键词检测/sherpa-onnx-kws-zipformer-wenetspeech-3.3M-2024-01-01-mobile/decoder-epoch-12-avg-2-chunk-16-left-64.onnx&quot; \</div><div class="notion-text notion-block-19322ab1f07642dca7a1f15fa866e8b2">--joiner=&quot;/root/shepa/1-关键词检测/sherpa-onnx-kws-zipformer-wenetspeech-3.3M-2024-01-01-mobile/<a class="notion-link" href="http://joiner-epoch-12-avg-2-chunk-16-left-64.int" target="_blank" rel="noopener noreferrer">joiner-epoch-12-avg-2-chunk-16-left-64.int</a>8.onnx&quot; \</div><div class="notion-text notion-block-feda8f36d1844b209ceb11e77c640788">--provider=cpu \</div><div class="notion-text notion-block-b3846009376d424aaae071caad0e597c">--num-threads=4 \</div><div class="notion-text notion-block-53e8d8d0e5f341c09dab03b6e8566a22">--keywords-file=&quot;/root/shepa/1-关键词检测/sherpa-onnx-kws-zipformer-wenetspeech-3.3M-2024-01-01-mobile/keywords.txt&quot; \</div><div class="notion-text notion-block-e5befd9fe64e4891ad2aa62b24d1721e">--threshold=0.5 \</div><div class="notion-text notion-block-a18fb7bc30104701a5d9af9a821adf56">--min-active=0.5 \</div><div class="notion-text notion-block-329ba21e374b49d889bf6f71c16ed654">hw:2,0</div><div class="notion-text notion-block-badc799d12464b1d81bed419cacd0d05"><b>3.3 关键参数详解</b></div><table class="notion-simple-table notion-block-951cfd5d3fdc47fc936bd0e8ac6841ee"><tbody><tr class="notion-simple-table-row notion-block-067da6d41dff4b6c8e2b0fa28b42a348"><td class="" style="width:120px"><div class="notion-simple-table-cell">参数</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">核心作用</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">取值建议</div></td></tr><tr class="notion-simple-table-row notion-block-e9b0e5a148e74185a8ff32b5a2263f17"><td class="" style="width:120px"><div class="notion-simple-table-cell">--tokens</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">指定词汇表文件</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">必须与模型配套，不可修改路径</div></td></tr><tr class="notion-simple-table-row notion-block-695bfa60312443619137b736702d0de6"><td class="" style="width:120px"><div class="notion-simple-table-cell">--encoder</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">指定编码器模型</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">处理音频特征提取，核心组件</div></td></tr><tr class="notion-simple-table-row notion-block-ddff3cd65aca4efca5f986e238744b07"><td class="" style="width:120px"><div class="notion-simple-table-cell">--decoder</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">指定解码器模型</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">负责关键词序列匹配</div></td></tr><tr class="notion-simple-table-row notion-block-58939be2ad93445ca30b2d42f1131613"><td class="" style="width:120px"><div class="notion-simple-table-cell">--joiner</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">指定融合器模型</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">优化检测精度，建议使用 int8 量化版本</div></td></tr><tr class="notion-simple-table-row notion-block-6ab389654d45448f941471db6b3c8acd"><td class="" style="width:120px"><div class="notion-simple-table-cell">--provider</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">指定推理硬件</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">嵌入式设备建议使用<code class="notion-inline-code">cpu</code></div></td></tr><tr class="notion-simple-table-row notion-block-29b5a3a59e6e4009aae47c6945110009"><td class="" style="width:120px"><div class="notion-simple-table-cell">--num-threads</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">CPU 线程数配置</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">Arm64 架构建议 2-4 线程</div></td></tr><tr class="notion-simple-table-row notion-block-181fc67683bd4965938fcf0f679f1e56"><td class="" style="width:120px"><div class="notion-simple-table-cell">--keywords-file</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">关键词配置文件</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">包含所有需要检测的唤醒词</div></td></tr><tr class="notion-simple-table-row notion-block-0f4462081523429c825f69e4cf96f393"><td class="" style="width:120px"><div class="notion-simple-table-cell">--threshold</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">检测阈值</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">0.1-1.0，值越高误检率越低但漏检率越高</div></td></tr><tr class="notion-simple-table-row notion-block-ce6413e06c184dd9b02b64dcbdee5b9f"><td class="" style="width:120px"><div class="notion-simple-table-cell">--min-active</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">最小激活时间</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">0.1-2.0 秒，过滤过短的检测结果</div></td></tr><tr class="notion-simple-table-row notion-block-d8a976cb9048494d9d1b662948e14964"><td class="" style="width:120px"><div class="notion-simple-table-cell">device_name</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">音频输入设备</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">通过<code class="notion-inline-code">arecord -l</code>查询获取</div></td></tr></tbody></table><h3 class="notion-h notion-h2 notion-h-indent-1 notion-block-bdcb9c6b22b94f288fa83e740eac34df" data-id="bdcb9c6b22b94f288fa83e740eac34df"><span><div id="bdcb9c6b22b94f288fa83e740eac34df" class="notion-header-anchor"></div><a class="notion-hash-link" href="#bdcb9c6b22b94f288fa83e740eac34df" title="4. 结果验证与解读"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title"><b>4. 结果验证与解读</b></span></span></h3><div class="notion-text notion-block-e20d5590a4ca45dc86802e1650d44806">执行命令后，系统开始实时监听麦克风输入，当检测到关键词时会输出 JSON 格式的结果。</div><div class="notion-text notion-block-68a2d3ea04c64bfe88071f232c32bff5"><b>4.1 成功运行的标志</b></div><div class="notion-text notion-block-24cca5fab36443baa5bee536fbe73c3a">出现以上提示表示系统已开始正常监听。</div><div class="notion-text notion-block-f03f71198d6b4f6cade9b92b598c2fd5"><b>4.2 检测结果示例</b></div><div class="notion-text notion-block-504816f233d144d9a6c29ed6b593097c"><b>4.3 结果字段解读</b></div><table class="notion-simple-table notion-block-5fe543f09e8b48f19d630a82a631f424"><tbody><tr class="notion-simple-table-row notion-block-d11c79824dfc4943be0eaa3c11297a92"><td class="" style="width:120px"><div class="notion-simple-table-cell">字段</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">含义</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">示例说明</div></td></tr><tr class="notion-simple-table-row notion-block-63a2b53896f4433b8d8c634a28ab7805"><td class="" style="width:120px"><div class="notion-simple-table-cell">start_time</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">检测开始时间</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">相对于程序启动的时间戳</div></td></tr><tr class="notion-simple-table-row notion-block-606b5e25f6b14aff8810b9f379117dbe"><td class="" style="width:120px"><div class="notion-simple-table-cell">keyword</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">检测到的关键词</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">&quot;小刘同学&quot;（自定义添加的关键词）</div></td></tr><tr class="notion-simple-table-row notion-block-dabc2afff99440b9a8e850d4259a032d"><td class="" style="width:120px"><div class="notion-simple-table-cell">timestamps</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">时间戳序列</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">每个音节的开始时间点</div></td></tr><tr class="notion-simple-table-row notion-block-dcf05b150b274c7aa3409793fde72ce2"><td class="" style="width:120px"><div class="notion-simple-table-cell">tokens</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">语音识别单元</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">对应的拼音音节序列</div></td></tr></tbody></table><h2 class="notion-h notion-h1 notion-h-indent-0 notion-block-6b7884246fa543ad833d1aea13082495" data-id="6b7884246fa543ad833d1aea13082495"><span><div id="6b7884246fa543ad833d1aea13082495" class="notion-header-anchor"></div><a class="notion-hash-link" href="#6b7884246fa543ad833d1aea13082495" title="基于C语言的Sherpa-ONNX框架集成与大模型调用"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title"><b>基于C语言的Sherpa-ONNX框架集成与大模型调用</b></span></span></h2><div class="notion-text notion-block-ffc5cff521684ea4b547da065f8ffa20">前文已通过官方预编译工具实现了语音识别、合成与关键词检测的基础功能，但实际项目需将框架集成到自定义 C 语言程序中。本节重点讲解如何通过<b>Sherpa-ONNX C API</b> 封装 ALSA 录音、音频重采样与大模型调用流程，实现 “实时录音→模型推理→结果输出” 的端到端功能。</div><h3 class="notion-h notion-h2 notion-h-indent-1 notion-block-2c5878fe51a34b628fa5b636346e98d4" data-id="2c5878fe51a34b628fa5b636346e98d4"><span><div id="2c5878fe51a34b628fa5b636346e98d4" class="notion-header-anchor"></div><a class="notion-hash-link" href="#2c5878fe51a34b628fa5b636346e98d4" title="1.置准备：依赖库安装与适配"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title"><b>1.置准备：依赖库安装与适配</b></span></span></h3><ol start="1" class="notion-list notion-list-numbered notion-block-9bf315d573a646c08dcd336f415b5f96" style="list-style-type:decimal"><li>前置需求</li></ol><div class="notion-text notion-block-800c3667456642ee924bc054f826ccfe">由于开发板麦克风采样率（如 44100Hz）与 ASR 大模型要求的<b>16000Hz</b>不匹配，需先安装音频重采样库<b>libsamplerate</b>下载指令：</div><div class="notion-text notion-block-af9802dad409474694696aa701ae2b87">其次就是之前下载的<b>指令集优化版本</b>（<code class="notion-inline-code">sherpa-onnx-v1.12.17-linux-aarch64-jni.tar.bz2</code>），和<b>动态链接版本</b>（<code class="notion-inline-code">sherpa-onnx-v1.12.17-linux-aarch64-shared-cpu.tar.bz2</code>）。这两个文件可以为我们提供所需的链接库<code class="notion-inline-code">.so</code>和头文件<code class="notion-inline-code">include</code> 。后续在开发和编译时，只需要将其放到/lib文件一起usr/include目录下，我们就可以完成开发（或在编译链接时-l -I -L下）。</div><ol start="1" class="notion-list notion-list-numbered notion-block-5f361b5f24ee41109a095cdcee35d501" style="list-style-type:decimal"><li>校验需求（路径记得换）</li></ol><h3 class="notion-h notion-h2 notion-h-indent-1 notion-block-db89f08a29b944c897a4fb693d838472" data-id="db89f08a29b944c897a4fb693d838472"><span><div id="db89f08a29b944c897a4fb693d838472" class="notion-header-anchor"></div><a class="notion-hash-link" href="#db89f08a29b944c897a4fb693d838472" title="2.代码架构解析：模块化封装思路"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title"><b>2.代码架构解析：模块化封装思路</b></span></span></h3><div class="notion-text notion-block-c2b4dd8390e94239a0b60aada6e490a7">代码流程参考的是这里的官方示例代码：</div><div class="notion-text notion-block-4ebd8b0a40834b30ab0d16b145ad3c41"><a class="notion-link" href="https://github.com/k2-fsa/sherpa-onnx/blob/master/c-api-examples/asr-microphone-example/c-api-alsa.cc" target="_blank" rel="noopener noreferrer">sherpa-onnx/c-api-examples/asr-microphone-example/c-api-alsa.cc at master · k2-fsa/sherpa-onnx</a></div><div class="notion-text notion-block-8174d64f3f744839afebcf5e8860c2e8">（模块对照表略）</div><h3 class="notion-h notion-h2 notion-h-indent-1 notion-block-c73bd66823f2442792370657229a59a9" data-id="c73bd66823f2442792370657229a59a9"><span><div id="c73bd66823f2442792370657229a59a9" class="notion-header-anchor"></div><a class="notion-hash-link" href="#c73bd66823f2442792370657229a59a9" title="3.核心逻辑拆解：整个项目的运行逻辑"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title"><b>3.核心逻辑拆解：</b>整个项目的运行逻辑</span></span></h3><ol start="1" class="notion-list notion-list-numbered notion-block-1792b1b4dc824782af7589502914b417" style="list-style-type:decimal"><li>初始化ALSA（用于录音）、重采样器（用于将不同的采样频率转换为模型支持的16000HZ）、sherpa-onnx框架（用于运行模型）</li></ol><ol start="2" class="notion-list notion-list-numbered notion-block-6dba97db890b4cbe921efd1a769b0f41" style="list-style-type:decimal"><li>程序不断麦克风读取<b>int16_t 格式、单声道</b>的 PCM 数据，采样率按照实际麦克风参数不定（我的为48000HZ)</li></ol><ol start="3" class="notion-list notion-list-numbered notion-block-fbffc1bf740b4e50b5fd1938f6cc377e" style="list-style-type:decimal"><li>数据输入到重采样器中，在采样器函数中，解决 “麦克风采样率≠模型要求采样率” 问题，同时将int16_t（ALSA 输出）转换为float（模型输入，范围 [-1.0, 1.0]）。然后将处理好的数据存入开辟的堆内存空间中。</li></ol><ol start="4" class="notion-list notion-list-numbered notion-block-3335b9a1f4864b2299743e56dc933a60" style="list-style-type:decimal"><li>提<b>交处理好的音频数据</b>给sherp-onnx-C-API 加载的ASR模型等待并解码结果。</li></ol><ol start="5" class="notion-list notion-list-numbered notion-block-5e209fe188214799a4ad82103140f133" style="list-style-type:decimal"><li>上述过程不断循环，直到模型说明已到达端点（可以理解为断句阈值，后续有提）程序输出语音转文字结果。</li></ol><ol start="6" class="notion-list notion-list-numbered notion-block-720d0813095f48dcb578466a716ff316" style="list-style-type:decimal"><li>重置录音流、清除结果内存。。再开始新的一轮循环。</li></ol><h3 class="notion-h notion-h2 notion-h-indent-1 notion-block-5a9f66deb73341899bd813c7503eb41b" data-id="5a9f66deb73341899bd813c7503eb41b"><span><div id="5a9f66deb73341899bd813c7503eb41b" class="notion-header-anchor"></div><a class="notion-hash-link" href="#5a9f66deb73341899bd813c7503eb41b" title="代码参考（部分我已加注释）"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">代码参考（部分我已加注释）</span></span></h3><details class="notion-toggle notion-block-689dd2a110d540f8a295a3392ac6ad8d"><summary><h4 class="notion-h notion-h3 notion-h-indent-2 notion-block-689dd2a110d540f8a295a3392ac6ad8d" data-id="689dd2a110d540f8a295a3392ac6ad8d"><span><div id="689dd2a110d540f8a295a3392ac6ad8d" class="notion-header-anchor"></div><span class="notion-h-title"><b>1. ALSA 音频设备驱动封装（录音核心）</b></span></span></h4></summary><div><details class="notion-toggle notion-block-3cf2e7a3e7294eeb8be24d796fba5195"><summary><b>alsa.c：</b></summary><div></div></details></div></details><details class="notion-toggle notion-block-17161477c1a14770b6520e6d2800d591"><summary><b>alsa.c说明</b></summary><div><div class="notion-text notion-block-e77d1624ed204a43907e5819912db12d">该文件是<b>底层音频输入接口</b>，基于 ALSA（Advanced Linux Sound Architecture）框架实现麦克风录音功能，核心解决 “嵌入式设备如何稳定获取符合格式的 PCM 音频数据” 问题。</div><ul class="notion-list notion-list-disc notion-block-6f94e184524f47cda5eb1037b37cbee2"><li>核心定位：负责初始化录音设备、配置硬件参数（采样率、格式、声道数）、读取 int16_t 格式 PCM 数据、释放设备资源，为后续重采样和模型推理提供原始音频输入。</li></ul><ul class="notion-list notion-list-disc notion-block-3021a28c18d946ffa3d19c191a1b9a12"><li>关键设计：</li><ul class="notion-list notion-list-disc notion-block-3021a28c18d946ffa3d19c191a1b9a12"><ol start="1" class="notion-list notion-list-numbered notion-block-6b83425af90842f9b60b3a6f2015316f" style="list-style-type:decimal"><li>硬件参数配置：强制使用 “单声道 + S16_LE（16 位有符号小端）” 格式，匹配 Sherpa-ONNX 模型对输入音频的要求；</li></ol><ol start="2" class="notion-list notion-list-numbered notion-block-f2d2eeef3bdb4f4f9d544391ba6a0297" style="list-style-type:decimal"><li>采样率适配：允许硬件返回 “最接近请求值” 的采样率（如请求 16000Hz，硬件实际支持 48000Hz），后续通过重采样统一格式；</li></ol><ol start="3" class="notion-list notion-list-numbered notion-block-86868e574eed428ca917192e5957a157" style="list-style-type:decimal"><li>缓冲区周期优化：设置<code class="notion-inline-code">PERIOD_SIZE=1024</code>（单次读取样本数），平衡嵌入式设备的 “低延迟”（实时识别需求）和 “资源占用”（避免频繁 IO）；</li></ol><ol start="4" class="notion-list notion-list-numbered notion-block-083b51b818a7462aa21eef2c77a33912" style="list-style-type:decimal"><li>错误处理：针对 ALSA 常见错误（如缓冲区过载<code class="notion-inline-code">EPIPE</code>）做重置处理，保证录音稳定性。</li></ol></ul></ul></div></details><details class="notion-toggle notion-block-8b7590f38bf04c28922e876ab00718ec"><summary>alsa.h</summary><div></div></details><details class="notion-toggle notion-block-3f99c7c2a9674e15af033906e3aff88c"><summary>alsa.h<b>说明</b></summary><div><div class="notion-text notion-block-88bac516e8ce453fa5257f3903438dbd">该文件是<b>ALSA 模块的对外接口契约</b>，负责定义录音设备参数、暴露全局变量和函数声明，实现 “模块化解耦”—— 让重采样、主程序等外部模块无需关心 ALSA 内部实现，仅通过头文件调用功能。</div><ul class="notion-list notion-list-disc notion-block-78db1e4beb4247eebcde045c9ed47815"><li>核心定位：</li><ul class="notion-list notion-list-disc notion-block-78db1e4beb4247eebcde045c9ed47815"><ol start="1" class="notion-list notion-list-numbered notion-block-6d15c371b6c842d1a92a0c62f5da4909" style="list-style-type:decimal"><li>宏定义：固化录音设备关键参数（设备名<code class="notion-inline-code">RECORD_DEVICE</code>、请求采样率<code class="notion-inline-code">RATE</code>、周期大小<code class="notion-inline-code">PERIOD_SIZE</code>、声道数<code class="notion-inline-code">CHANNELS</code>），方便后续根据硬件修改；</li></ol><ol start="2" class="notion-list notion-list-numbered notion-block-3a27254dc6724816ac4c4903e0d51f3e" style="list-style-type:decimal"><li>全局变量声明：暴露<code class="notion-inline-code">g_pcm_handle</code>（PCM 设备句柄）和<code class="notion-inline-code">g_actual_rate</code>（硬件实际采样率），供重采样模块获取真实采样率用于格式转换；</li></ol><ol start="3" class="notion-list notion-list-numbered notion-block-95ce3b893594411cbdf03abfaebde715" style="list-style-type:decimal"><li>函数声明：明确<code class="notion-inline-code">init_alsa()</code>（初始化）和<code class="notion-inline-code">cleanup_alsa()</code>（资源清理）的接口，确保外部模块调用规范。</li></ol></ul></ul><ul class="notion-list notion-list-disc notion-block-5d9a7c8e8607499f9c583d4131b7a8ac"><li>嵌入式适配：强制<code class="notion-inline-code">CHANNELS=1</code>（单声道），因为此嵌入式语音模型仅支持单声道输入，减少数据处理开销。</li></ul></div></details><details class="notion-toggle notion-block-88f71c238b774b75a0446e470f6ab8f3"><summary><h4 class="notion-h notion-h3 notion-h-indent-2 notion-block-88f71c238b774b75a0446e470f6ab8f3" data-id="88f71c238b774b75a0446e470f6ab8f3"><span><div id="88f71c238b774b75a0446e470f6ab8f3" class="notion-header-anchor"></div><span class="notion-h-title"><b>2. ALSA 音频重采样模块（格式适配核心）</b></span></span></h4></summary><div><details class="notion-toggle notion-block-e64f811cf5374e4a9788ff71a6cb2e33"><summary>mysamplerate.c</summary><div></div></details></div></details><details class="notion-toggle notion-block-a5bd56f99343425f8977f3cae2f50fb2"><summary>mysamplerate.c<b>说明：</b></summary><div><div class="notion-text notion-block-daa3d0e84e6b45248a471adc8e26f74e">该文件是<b>音频格式桥梁</b>，解决 “嵌入式麦克风采样率≠模型要求采样率” 和 “数据格式不匹配” 两大问题 —— 麦克风输出 int16_t 格式（如 48000Hz），而 Sherpa-ONNX 模型需要 float 格式（16000Hz，范围 [-1.0,1.0]）。</div><ul class="notion-list notion-list-disc notion-block-80fc1a3595b74845b505319a8b14a496"><li>核心定位：</li><ul class="notion-list notion-list-disc notion-block-80fc1a3595b74845b505319a8b14a496"><ol start="1" class="notion-list notion-list-numbered notion-block-70b1d6e49446404797b7586b8c291998" style="list-style-type:decimal"><li>重采样初始化：基于<code class="notion-inline-code">libsamplerate</code>库创建重采样器，计算 “目标采样率 / 实际采样率” 的转换比率，选择<code class="notion-inline-code">SRC_SINC_FASTEST</code>模式（适合嵌入式实时场景，平衡速度与精度）；</li></ol><ol start="2" class="notion-list notion-list-numbered notion-block-a6e5f876a2ac46f290743425ad75a44d" style="list-style-type:decimal"><li>数据格式转换：将 ALSA 输出的 int16_t 数据归一化为 float（除以 32768，因 int16_t 最大值为 32767，避免溢出）；</li></ol><ol start="3" class="notion-list notion-list-numbered notion-block-6c7c7732c60e414382e25b0392aafeda" style="list-style-type:decimal"><li>流式重采样：按帧处理音频数据，使用堆分配缓冲区（避免嵌入式栈空间不足），返回转换后的 float 数据供模型使用；</li></ol></ul></ul><ul class="notion-list notion-list-disc notion-block-872c1a1eb53444c5a4801a089668340f"><li>关键细节：设置<code class="notion-inline-code">MAX_OUTPUT_FRAMES=PERIOD_SIZE*3</code>，应对 “实际采样率高于目标采样率” 时输出帧数增多的情况，避免缓冲区溢出。</li></ul></div></details><details class="notion-toggle notion-block-c10e591085794b37a05fd070ca2fa948"><summary>mysamplerate.h</summary><div></div></details><details class="notion-toggle notion-block-99d2b7da91d347589d46f5aa71bd06ed"><summary>mysamplerate.h<b>说明</b></summary><div><div class="notion-text notion-block-66e9eedcb1204e72a85eb340d31ffd26">该文件是<b>重采样模块的对外接口</b>，负责声明核心函数，隐藏模块内部状态（如<code class="notion-inline-code">src_state</code>），确保外部模块（如 main.c）仅通过规范接口调用重采样功能，降低耦合度。</div><ul class="notion-list notion-list-disc notion-block-3afe608a13864e3a9ef08dcc5e1dc6d0"><li>核心定位：</li><ul class="notion-list notion-list-disc notion-block-3afe608a13864e3a9ef08dcc5e1dc6d0"><ol start="1" class="notion-list notion-list-numbered notion-block-da0866e7d27c4ab28a6379513aad71b4" style="list-style-type:decimal"><li>依赖引入：包含<code class="notion-inline-code">samplerate.h</code>（libsamplerate 库头文件）和<code class="notion-inline-code">alsa.h</code>（获取 ALSA 配置参数）；</li></ol><ol start="2" class="notion-list notion-list-numbered notion-block-242d88d1e20f43e684709a79fcc66f8d" style="list-style-type:decimal"><li>函数声明：明确<code class="notion-inline-code">init_resampler()</code>（初始化）、<code class="notion-inline-code">resample_audio()</code>（格式转换）、<code class="notion-inline-code">cleanup_resampler()</code>（资源清理）的参数和返回值，指导外部模块正确传参（如输入 int16_t 数据、输出 float 数据指针）；</li></ol></ul></ul><ul class="notion-list notion-list-disc notion-block-a14e8e4f601f4cf08e5e734261506a2b"><li>嵌入式适配：通过<code class="notion-inline-code">alsa.h</code>复用<code class="notion-inline-code">CHANNELS</code>和<code class="notion-inline-code">MODEL_SAMPLE_RATE</code>，避免参数重复定义，减少修改时的不一致风险。</li></ul></div></details><details class="notion-toggle notion-block-b1afe124ce7540f1ad53ded180680799"><summary><h4 class="notion-h notion-h3 notion-h-indent-2 notion-block-b1afe124ce7540f1ad53ded180680799" data-id="b1afe124ce7540f1ad53ded180680799"><span><div id="b1afe124ce7540f1ad53ded180680799" class="notion-header-anchor"></div><span class="notion-h-title"><b>3. Sherpa-ONNX 模型调用asr模型（推理核心）</b></span></span></h4></summary><div><details class="notion-toggle notion-block-297df014871945228ef22e8ce93e4991"><summary>sherpa-asr.c</summary><div></div></details></div></details><details class="notion-toggle notion-block-57c364a627d3413788c6f84181de0394"><summary>sherpa-asr.c<b>说明</b></summary><div><div class="notion-text notion-block-3f44dddce8ef48e58c765051a17f0938">该文件是<b>Sherpa-ONNX 框架的 C API 封装</b>，负责加载语音识别模型、创建推理流、配置推理参数，将 “模型调用” 封装为独立模块，让主程序无需关注 ONNX 底层细节。</div><ul class="notion-list notion-list-disc notion-block-5e1202a7275840b382b7e09745ea4c7a"><li>核心定位：</li><ul class="notion-list notion-list-disc notion-block-5e1202a7275840b382b7e09745ea4c7a"><ol start="1" class="notion-list notion-list-numbered notion-block-6351c8312b7d4ddea70e3ac83d56c8c0" style="list-style-type:decimal"><li>模型配置：设置模型路径（encoder/decoder/joiner）、线程数（<code class="notion-inline-code">num_threads=4</code>，适配 Arm64 架构性能）、解码方法（<code class="notion-inline-code">greedy_search</code>，嵌入式场景兼顾速度与准确率）；</li></ol><ol start="2" class="notion-list notion-list-numbered notion-block-f4346f624d164c0d9128f6b13ce9578d" style="list-style-type:decimal"><li>端点检测：开启<code class="notion-inline-code">enable_endpoint=1</code>，通过三个规则（最小尾端静音、最小语音长度）判断语音结束，避免无意义推理；</li></ol><ol start="3" class="notion-list notion-list-numbered notion-block-9267ff5d47f2416eae9098c1e8e4c4e9" style="list-style-type:decimal"><li>资源管理：创建<code class="notion-inline-code">g_asr_recognizer</code>（识别器）和<code class="notion-inline-code">g_asr_stream</code>（音频流），确保资源创建与释放顺序（先创建识别器，再创建流；释放时反之）；</li></ol></ul></ul><ul class="notion-list notion-list-disc notion-block-7f36c89e265d44489f9bae57e38a5e16"><li>关键细节：模型路径需与开发板实际路径一致（如<code class="notion-inline-code">/root/shepa/...</code>），否则会导致模型加载失败。</li></ul></div></details><details class="notion-toggle notion-block-02213fa18234441fa40ce1edb8f15f7a"><summary>asherpa-asr.h</summary><div></div></details><details class="notion-toggle notion-block-325f45f275c34abd82cfd90b007ac56a"><summary>asherpa-asr.h<b>说明</b></summary><div><div class="notion-text notion-block-b6f00b7b49bc4818a76ff9010ccbebe4">该文件是<b>Sherpa-ONNX 模块的对外接口</b>，负责引入框架头文件、声明全局推理资源和核心函数，让主程序能获取<code class="notion-inline-code">g_asr_stream</code>（音频流）和<code class="notion-inline-code">g_asr_recognizer</code>（识别器），并调用初始化 / 清理函数。</div><ul class="notion-list notion-list-disc notion-block-8f4e65a40d2944bb9ccc5f7f87e1ab83"><li>核心定位：</li><ul class="notion-list notion-list-disc notion-block-8f4e65a40d2944bb9ccc5f7f87e1ab83"><ol start="1" class="notion-list notion-list-numbered notion-block-95ae4fea9b94455a84d60ff45e6f4491" style="list-style-type:decimal"><li>依赖引入：包含<code class="notion-inline-code">Sherpa-ONNX C API</code>头文件（<code class="notion-inline-code">sherpa-onnx/c-api/c-api.h</code>）和<code class="notion-inline-code">alsa.h</code>（复用<code class="notion-inline-code">MODEL_SAMPLE_RATE</code>）；</li></ol><ol start="2" class="notion-list notion-list-numbered notion-block-9d4e7fbb804649a382a173e6712717d0" style="list-style-type:decimal"><li>资源暴露：声明全局变量<code class="notion-inline-code">g_asr_stream</code>和<code class="notion-inline-code">g_asr_recognizer</code>，供 main.c 提交音频数据和获取推理结果；</li></ol><ol start="3" class="notion-list notion-list-numbered notion-block-e028ec3d8e844e809f2ad511b7167a06" style="list-style-type:decimal"><li>函数声明：明确<code class="notion-inline-code">init_sherpa_asr()</code>和<code class="notion-inline-code">cleanup_sherpa_asr()</code>的接口，确保主程序按顺序初始化 / 清理资源。</li></ol></ul></ul></div></details><details class="notion-toggle notion-block-983ac87b921a4b13be74b8fe78d02409"><summary><h4 class="notion-h notion-h3 notion-h-indent-2 notion-block-983ac87b921a4b13be74b8fe78d02409" data-id="983ac87b921a4b13be74b8fe78d02409"><span><div id="983ac87b921a4b13be74b8fe78d02409" class="notion-header-anchor"></div><span class="notion-h-title"><b>4. 主程序（模块整合与业务流程）</b></span></span></h4></summary><div><details class="notion-toggle notion-block-31db53f9d374430999e2b3630b689ea6"><summary>main.c</summary><div></div></details><details class="notion-toggle notion-block-94b1a30da423445db7806d145ad44251"><summary>main.c<b>说明：</b></summary><div><div class="notion-text notion-block-7008c4e3b785492b8ab33a828f0a1ccc">该文件是<b>整个系统的入口</b>，负责串联 ALSA 录音、音频重采样、Sherpa-ONNX 推理三大模块，实现 “实时录音→格式适配→模型推理→结果输出” 的端到端业务流程，同时处理嵌入式场景的优雅退出。</div><ul class="notion-list notion-list-disc notion-block-2c3a7d3c618645b9919452afb8080a78"><li>核心定位：</li><ul class="notion-list notion-list-disc notion-block-2c3a7d3c618645b9919452afb8080a78"><ol start="1" class="notion-list notion-list-numbered notion-block-ee510916cca64470bb391ebdbd159a3d" style="list-style-type:decimal"><li>模块初始化：按 “ALSA→重采样→Sherpa-ONNX” 顺序初始化（后模块依赖前模块的参数，如重采样依赖 ALSA 的实际采样率）；</li></ol><ol start="2" class="notion-list notion-list-numbered notion-block-e6a17ca342f845288d8dcc4d62dc2376" style="list-style-type:decimal"><li>信号处理：捕获<code class="notion-inline-code">SIGINT</code>（Ctrl+C）信号，设置<code class="notion-inline-code">running=0</code>，实现 “触发退出后清理资源”，避免嵌入式设备因强制退出导致资源泄漏；</li></ol><ol start="3" class="notion-list notion-list-numbered notion-block-23cab9ec240b426d8e8da2c05fb16bcb" style="list-style-type:decimal"><li>主循环逻辑：</li><ol class="notion-list notion-list-numbered notion-block-23cab9ec240b426d8e8da2c05fb16bcb" style="list-style-type:lower-alpha"><ul class="notion-list notion-list-disc notion-block-f3d6e3d119024b06808e18591da79768"><li>录音：从 ALSA 读取 int16_t 数据；</li></ul><ul class="notion-list notion-list-disc notion-block-3478a124550d4fc0a35229cc76df0866"><li>适配：调用重采样模块转换为 float 格式；</li></ul><ul class="notion-list notion-list-disc notion-block-2e3016cc23b548e28c9e9b4f041e118f"><li>推理：提交数据到 Sherpa-ONNX 流，执行解码；</li></ul><ul class="notion-list notion-list-disc notion-block-1e9a7e0ce4974f66a3c691cd3d8eea0e"><li>结果输出：检测到语音结束（端点）时，打印识别结果，重置流准备下一轮；</li></ul></ol></ol></ul></ul></div></details></div></details><details class="notion-toggle notion-block-ade2ce20f0fa4dfd8240735c9afd8873"><summary><h4 class="notion-h notion-h3 notion-h-indent-2 notion-block-ade2ce20f0fa4dfd8240735c9afd8873" data-id="ade2ce20f0fa4dfd8240735c9afd8873"><span><div id="ade2ce20f0fa4dfd8240735c9afd8873" class="notion-header-anchor"></div><span class="notion-h-title"><b>5. Makefile：编译脚本（嵌入式编译配置）</b></span></span></h4></summary><div><details class="notion-toggle notion-block-7d900292d73a4c8694032723afa4fcb3"><summary>Makefile</summary><div></div></details></div></details><details class="notion-toggle notion-block-4811209ec3ce4f1f996f00fc7f19f8f6"><summary>Makefile<b>说明</b></summary><div><div class="notion-text notion-block-ee1074313a944d7ab6cf7bef176b9319">该文件是<b>嵌入式编译的核心配置</b>，负责指定编译器、头文件路径、链接库、编译规则，确保代码能在 KickPi K2B（Arm64 架构）上正确编译为可执行文件。</div><ul class="notion-list notion-list-disc notion-block-568391653d9444c88c58bfea19f59c45"><li>核心定位：</li><ul class="notion-list notion-list-disc notion-block-568391653d9444c88c58bfea19f59c45"><ol start="1" class="notion-list notion-list-numbered notion-block-48755128864a461ba1d54822098de401" style="list-style-type:decimal"><li>编译选项：<code class="notion-inline-code">I</code>指定 Sherpa-ONNX 头文件路径，<code class="notion-inline-code">Wall</code>开启警告（便于调试），<code class="notion-inline-code">g</code>生成调试信息（嵌入式调试用）；</li></ol><ol start="2" class="notion-list notion-list-numbered notion-block-7383ccc081f44ab7949a7b819edaa480" style="list-style-type:decimal"><li>链接配置：<code class="notion-inline-code">L</code>指定 Sherpa-ONNX 库路径，<code class="notion-inline-code">lasound</code>（链接 ALSA 库）、<code class="notion-inline-code">lsamplerate</code>（链接重采样库）、<code class="notion-inline-code">lsherpa-onnx-c-api</code>（链接 Sherpa-ONNX C API 库）；</li></ol><ol start="3" class="notion-list notion-list-numbered notion-block-0e76ce56ad7949b0aa2d7a114bb68ec6" style="list-style-type:decimal"><li>清理规则：<code class="notion-inline-code">clean</code>目标删除编译生成的<code class="notion-inline-code">.o</code>文件和可执行文件，避免残留文件影响下次编译；</li></ol><li>因为我是在嵌入式端直接编译，无需额外指定 Arm64 架构（若使用交叉编译，需添加<code class="notion-inline-code">CC=aarch64-linux-gnu-gcc</code>），直接使用开发板自带的<code class="notion-inline-code">gcc</code>编译，确保兼容性。</li></ul></ul></div></details><div class="notion-callout notion-gray_background_co notion-block-9cc1d9b9524c4e3c92524e95625e2975"><div class="notion-page-icon-inline notion-page-icon-span"><span class="notion-page-icon" role="img" aria-label="💡">💡</span></div><div class="notion-callout-text"><div class="notion-text notion-block-ac1ad4a88262422dad3500341f87b3db">有关Sherpa-ONNX在嵌入式开发板的部署或语音模型适配的问题，欢迎您在底部评论区留言，一起交流~</div></div></div><blockquote class="notion-quote notion-block-758d7291d4c24954b53527770496806e"><div>至此，我们就完成了 使用C语言 调用框架运行模型。后面的关键词识别和语音合成同理。
可以去github参考示例文件来编写程序。
关键词识别：<a class="notion-link" href="https://github.com/k2-fsa/sherpa-onnx/blob/master/c-api-examples/kws-c-api.c" target="_blank" rel="noopener noreferrer">sherpa-onnx/c-api-examples/kws-c-api.c at master · k2-fsa/sherpa-onnx</a>
语音合成：<a class="notion-link" href="https://github.com/k2-fsa/sherpa-onnx/blob/master/c-api-examples/offline-tts-c-api.c" target="_blank" rel="noopener noreferrer">sherpa-onnx/c-api-examples/offline-tts-c-api.c at master · k2-fsa/sherpa-onnx</a>
思路是：先关键词唤醒，然后等待语音识别，如果识别成功则继续切换到关键词唤醒。
后续会对识别的内容进行处理（可能是接入deepseek大模型？然后tts合成语音后回复）这里我不放全部代码了。（其实稍微改改我上面的代码就能用了~ 步骤和 asr 基本一样)</div></blockquote><details class="notion-toggle notion-block-76676c2c2d03462d92dc0ed43582244a"><summary><h4 class="notion-h notion-h3 notion-h-indent-2 notion-block-76676c2c2d03462d92dc0ed43582244a" data-id="76676c2c2d03462d92dc0ed43582244a"><span><div id="76676c2c2d03462d92dc0ed43582244a" class="notion-header-anchor"></div><span class="notion-h-title"><b>6. Sherpa-ONNX 模型调用kws模型（推理核心）</b></span></span></h4></summary><div><details class="notion-toggle notion-block-6e96e261d35f4c2cb950e9a06e0fdc26"><summary>sherpa-kws.c</summary><div></div></details><details class="notion-toggle notion-block-55647fbf4aba403ca1d17570f72729af"><summary>asherpa-kws.h</summary><div></div></details></div></details><blockquote class="notion-quote notion-block-ed04b2d961a0485a8fa00dd03d4ddef4"><div>现在已经可以输出结果了,我这里直接选用有名管道，来作为通信的方式，与其他的程序进行通信，就不详细演示啦~~</div></blockquote><blockquote class="notion-quote notion-block-ee83b51ed3794604bd4fb44cf17da6db"><div>当多个进程同时对播放设备进行操作， 会导致没有权限（已打开、无法共享）的问题。
可以设置一下 混音插件，让多个设备共享。</div></blockquote></main></div>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[LoRa学习]]></title>
            <link>https://www.mcoi.top/article/Post-Lora</link>
            <guid>https://www.mcoi.top/article/Post-Lora</guid>
            <pubDate>Tue, 01 Apr 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[之前做Lora一对多无线通信时记录的笔记，里面大概包含了Lora的简单配置和串口测试案例 。 不附带代码]]></description>
            <content:encoded><![CDATA[<div id="notion-article" class="mx-auto overflow-hidden "><main class="notion light-mode notion-page notion-block-2a9e940c69bb80a2a61dc2af57e81bc6"><div class="notion-viewport"></div><div class="notion-collection-page-properties"></div><div class="notion-callout notion-gray_background_co notion-block-2a9e940c69bb80bb8060e3774156cfbe"><div class="notion-page-icon-inline notion-page-icon-span"><span class="notion-page-icon" role="img" aria-label="😀">😀</span></div><div class="notion-callout-text">之前做Lora一对多无线通信时记录的笔记，里面包含了Lora的简单配置寄存器和串口测试案例 。 不附带代码
其实Lora也支持AT指令。。。</div></div><h2 class="notion-h notion-h1 notion-h-indent-0 notion-block-2a9e940c69bb8069ab32cb6b92b3e752" data-id="2a9e940c69bb8069ab32cb6b92b3e752"><span><div id="2a9e940c69bb8069ab32cb6b92b3e752" class="notion-header-anchor"></div><a class="notion-hash-link" href="#2a9e940c69bb8069ab32cb6b92b3e752" title="LoRa学习"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">LoRa学习</span></span></h2><h3 class="notion-h notion-h2 notion-h-indent-1 notion-block-2a9e940c69bb808db13cfc581e0be1ae" data-id="2a9e940c69bb808db13cfc581e0be1ae"><span><div id="2a9e940c69bb808db13cfc581e0be1ae" class="notion-header-anchor"></div><a class="notion-hash-link" href="#2a9e940c69bb808db13cfc581e0be1ae" title="引脚定义"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">引脚定义</span></span></h3><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-e66a093f9f23424e8c6a9b11443b1798"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:100%;max-width:100%;flex-direction:column"><img style="object-fit:cover" src="https://cdn.jsdmirror.com/gh/LZJ-I/picx-images-hosting@main/images/%E5%B5%8C%E5%85%A5%E5%BC%8F%E8%BD%AF%E4%BB%B6%E5%BC%80%E5%8F%91/Post-Lora/38e321ca-ad0c-4b71-b686-daa5f3a1aa40-image.png?spaceId=3a565fcb-f425-4846-b72a-d32a98183896&amp;t=e66a093f-9f23-424e-8c6a-9b11443b1798" alt="notion image" loading="lazy" decoding="async"/></div></figure><table class="notion-simple-table notion-block-2a9e940c69bb80728792c67f0f62540b"><tbody><tr class="notion-simple-table-row notion-simple-table-header-row notion-block-2a9e940c69bb8096ab0dda716de6bc61"><td class="" style="width:120px"><div class="notion-simple-table-cell">引脚序号</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">引脚名称</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">引脚方向</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">引脚用途</div></td></tr><tr class="notion-simple-table-row notion-block-2a9e940c69bb80bd9a91d530bc69d7b0"><td class="" style="width:120px"><div class="notion-simple-table-cell">1</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">M0</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">输入（极弱上拉）</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">和 M1 配合， 决定模块的 4 种工作模式（<b>不可悬空， 如不使用可接地</b>）</div></td></tr><tr class="notion-simple-table-row notion-block-2a9e940c69bb80918eb6ec99eaafda58"><td class="" style="width:120px"><div class="notion-simple-table-cell">2</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">M1</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">输入（极弱上拉）</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">和 M0 配合， 决定模块的 4 种工作模式（<b>不可悬空， 如不使用可接地</b>）</div></td></tr><tr class="notion-simple-table-row notion-block-2a9e940c69bb80b19bc5eab42b66add5"><td class="" style="width:120px"><div class="notion-simple-table-cell">3</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">RXD</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">输入</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">TTL 串口输入， 连接到外部 TXD 输出引脚；</div></td></tr><tr class="notion-simple-table-row notion-block-2a9e940c69bb8020b672c25043d5e0b8"><td class="" style="width:120px"><div class="notion-simple-table-cell">4</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">TXD</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">输出</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">TTL 串口输出， 连接到外部 RXD 输入引脚；</div></td></tr><tr class="notion-simple-table-row notion-block-2a9e940c69bb802b8126fd27c7395445"><td class="" style="width:120px"><div class="notion-simple-table-cell">5</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">AUX</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">输出</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">用于指示模块工作状态；用户唤醒外部 MCU， 上电自检初始化期间输出低电平； （可以悬空）</div></td></tr><tr class="notion-simple-table-row notion-block-2a9e940c69bb8002b085cb1855109100"><td class="" style="width:120px"><div class="notion-simple-table-cell">6</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">VCC</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">电源</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">模块电源正参考， 电压范围： 2.3～5.5V DC</div></td></tr><tr class="notion-simple-table-row notion-block-2a9e940c69bb80dba5a1c1e6a4647be6"><td class="" style="width:120px"><div class="notion-simple-table-cell">7</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">GND</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">电源</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">模块地线</div></td></tr></tbody></table><h3 class="notion-h notion-h2 notion-h-indent-1 notion-block-2a9e940c69bb80d9ac70c3d70f79a20f" data-id="2a9e940c69bb80d9ac70c3d70f79a20f"><span><div id="2a9e940c69bb80d9ac70c3d70f79a20f" class="notion-header-anchor"></div><a class="notion-hash-link" href="#2a9e940c69bb80d9ac70c3d70f79a20f" title="工作模式"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">工作模式</span></span></h3><div class="notion-text notion-block-2a9e940c69bb80f698e6ddb690c45c3b">模块有四种工作模式， 由引脚 M1、 M0 设置； 详细情况如下表所示： </div><table class="notion-simple-table notion-block-2a9e940c69bb8004a926e627b7b0e95e"><tbody><tr class="notion-simple-table-row notion-block-2a9e940c69bb80aea4d2fedd06cb779a"><td class="" style="width:120px"><div class="notion-simple-table-cell">模式（0-3）</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">M1</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">M0</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">模式介绍</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">备注</div></td></tr><tr class="notion-simple-table-row notion-block-2a9e940c69bb8059be52dbbec6c995fd"><td class="" style="width:120px"><div class="notion-simple-table-cell"><b>0 传输模式</b></div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">0</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">0</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">串口打开， 无线打开， 透明传输</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">支持特殊指令空中配置</div></td></tr><tr class="notion-simple-table-row notion-block-2a9e940c69bb80819cf9d3424ffa1c41"><td class="" style="width:120px"><div class="notion-simple-table-cell">1 WOR 模式</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">0</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">1</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">可以定义为 WOR 发送方和 WOR 接收方</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">支持空中唤醒</div></td></tr><tr class="notion-simple-table-row notion-block-2a9e940c69bb806dbbd1d10fe1ca5385"><td class="" style="width:120px"><div class="notion-simple-table-cell"><b>2 配置模式</b></div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">1</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">0</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">用户可通过串口对寄存器进行访问， 从而控制模块工作状态</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">ㅤ</div></td></tr><tr class="notion-simple-table-row notion-block-2a9e940c69bb806fac42f5013e84133a"><td class="" style="width:120px"><div class="notion-simple-table-cell">3 深度休眠</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">1</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">1</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">模块进入休眠</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">ㅤ</div></td></tr></tbody></table><h3 class="notion-h notion-h2 notion-h-indent-1 notion-block-2a9e940c69bb80cc90e1c01eca58ddad" data-id="2a9e940c69bb80cc90e1c01eca58ddad"><span><div id="2a9e940c69bb80cc90e1c01eca58ddad" class="notion-header-anchor"></div><a class="notion-hash-link" href="#2a9e940c69bb80cc90e1c01eca58ddad" title="寄存器读写控制"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">寄存器读写控制</span></span></h3><details class="notion-toggle notion-block-2a9e940c69bb80c4ae1bf46a34dd0f36"><summary><h4 class="notion-h notion-h3 notion-h-indent-2 notion-block-2a9e940c69bb80c4ae1bf46a34dd0f36" data-id="2a9e940c69bb80c4ae1bf46a34dd0f36"><span><div id="2a9e940c69bb80c4ae1bf46a34dd0f36" class="notion-header-anchor"></div><span class="notion-h-title">指令格式</span></span></h4></summary><div><div class="notion-text notion-block-2a9e940c69bb80c982e9fdbec1538e64"><b>配置模式（模式 2： M1=1， M0=0） 下</b></div><div class="notion-text notion-block-09a9e34b9855404983c90c19ac05de1f"><b>支持的指令列表如下（设置时， 只支持 9600， 8N1 格式） </b></div><ul class="notion-list notion-list-disc notion-block-dc7bf80033254605b8f8a059f228cce2"><li>设置寄存器</li><ul class="notion-list notion-list-disc notion-block-dc7bf80033254605b8f8a059f228cce2"><li>指令： C0+起始地址+长度+参数</li><li>响应： C1+起始地址+长度+参数</li><li>例子： C0 05 01 09   即在 0x05 地址 依次写入一次数据  0x09</li><li>例子： C0 00 04 12 34 00 61 即在 0x00 地址 依次写入 四次数据，分别是 0x12 0x34 0x00 0x61</li></ul></ul><ul class="notion-list notion-list-disc notion-block-00cdac57fe704fafba309d77df591836"><li>读取寄存器</li><ul class="notion-list notion-list-disc notion-block-00cdac57fe704fafba309d77df591836"><li>指令： C1+起始地址+长度</li><li>响应： C1+起始地址+长度+参数</li></ul></ul><ul class="notion-list notion-list-disc notion-block-44a6620a166d4dfba43acab8dcbc7afa"><li>设置临时寄存器</li><ul class="notion-list notion-list-disc notion-block-44a6620a166d4dfba43acab8dcbc7afa"><li>指令： C2 +起始地址+长度+参数</li><li>响应： C1 +起始地址+长度+参数</li></ul></ul><ul class="notion-list notion-list-disc notion-block-94f5abc6edc64e1ebdb12bb106a62aa5"><li>无线配置</li><ul class="notion-list notion-list-disc notion-block-94f5abc6edc64e1ebdb12bb106a62aa5"><li>指令： CF CF + 常规指令</li><li>响应： CF CF + 常规响应</li><li>例 1： 无线配置信道为 0x09
            无线指令头 + 指令 + 起始地址 + 长度 + 参数
发送： CF CF <b>C0</b> 05 01 09
返回： CF CF <b>C1</b> 05 01 09</li></ul></ul><ul class="notion-list notion-list-disc notion-block-a3681e9e3f524e7bbb21bc848dfe7440"><li>格式错误</li><ul class="notion-list notion-list-disc notion-block-a3681e9e3f524e7bbb21bc848dfe7440"><li>格式错误响应FF FF FF</li></ul></ul><details class="notion-toggle notion-block-6bc788e5b10343ec907605c449890e20"><summary><h4 class="notion-h notion-h3 notion-block-6bc788e5b10343ec907605c449890e20" data-id="6bc788e5b10343ec907605c449890e20"><span><div id="6bc788e5b10343ec907605c449890e20" class="notion-header-anchor"></div><span class="notion-h-title">寄存器地址</span></span></h4></summary><div><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-7be624a04f7e4ad9b548d967cf461a28"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:100%;max-width:100%;flex-direction:column"><img style="object-fit:cover" src="https://cdn.jsdmirror.com/gh/LZJ-I/picx-images-hosting@main/images/%E5%B5%8C%E5%85%A5%E5%BC%8F%E8%BD%AF%E4%BB%B6%E5%BC%80%E5%8F%91/Post-Lora/5550dff6-f7c9-4679-8e89-0bdd76e4e0ab-a017f47250cee7d32d2f8fdc667ebb8.png?spaceId=3a565fcb-f425-4846-b72a-d32a98183896&amp;t=7be624a0-4f7e-4ad9-b548-d967cf461a28" alt="notion image" loading="lazy" decoding="async"/></div></figure></div></details></div></details><h3 class="notion-h notion-h2 notion-h-indent-1 notion-block-2a9e940c69bb808d9ed9c06edb05dd0a" data-id="2a9e940c69bb808d9ed9c06edb05dd0a"><span><div id="2a9e940c69bb808d9ed9c06edb05dd0a" class="notion-header-anchor"></div><a class="notion-hash-link" href="#2a9e940c69bb808d9ed9c06edb05dd0a" title="功能详解"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">功能详解</span></span></h3><details class="notion-toggle notion-block-2a9e940c69bb809a8630dc0ced37b3d7"><summary><h4 class="notion-h notion-h3 notion-h-indent-2 notion-block-2a9e940c69bb809a8630dc0ced37b3d7" data-id="2a9e940c69bb809a8630dc0ced37b3d7"><span><div id="2a9e940c69bb809a8630dc0ced37b3d7" class="notion-header-anchor"></div><span class="notion-h-title">定点发射</span></span></h4></summary><div><div class="notion-text notion-block-2a9e940c69bb80969fe8c370005b163a">STM32 给 LoRa发送这种格式的数据</div><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-fd71408bfeff4fe0adf9f8fd39e36e6c"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:100%;max-width:100%;flex-direction:column"><img style="object-fit:cover" src="https://cdn.jsdmirror.com/gh/LZJ-I/picx-images-hosting@main/images/%E5%B5%8C%E5%85%A5%E5%BC%8F%E8%BD%AF%E4%BB%B6%E5%BC%80%E5%8F%91/Post-Lora/3fa1ccd5-48c7-47ba-85a1-482353bf3f45-image.png?spaceId=3a565fcb-f425-4846-b72a-d32a98183896&amp;t=fd71408b-feff-4fe0-adf9-f8fd39e36e6c" alt="notion image" loading="lazy" decoding="async"/></div></figure></div></details><details class="notion-toggle notion-block-2a9e940c69bb8080af06e95a4e9ad1d3"><summary><h4 class="notion-h notion-h3 notion-h-indent-2 notion-block-2a9e940c69bb8080af06e95a4e9ad1d3" data-id="2a9e940c69bb8080af06e95a4e9ad1d3"><span><div id="2a9e940c69bb8080af06e95a4e9ad1d3" class="notion-header-anchor"></div><span class="notion-h-title">广播发射</span></span></h4></summary><div><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-5aa089a2a27b4802bf88a3dc122db3e6"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:100%;max-width:100%;flex-direction:column"><img style="object-fit:cover" src="https://cdn.jsdmirror.com/gh/LZJ-I/picx-images-hosting@main/images/%E5%B5%8C%E5%85%A5%E5%BC%8F%E8%BD%AF%E4%BB%B6%E5%BC%80%E5%8F%91/Post-Lora/3cf6a143-4a79-40f0-a233-be093ebe7094-image.png?spaceId=3a565fcb-f425-4846-b72a-d32a98183896&amp;t=5aa089a2-a27b-4802-bf88-a3dc122db3e6" alt="notion image" loading="lazy" decoding="async"/></div></figure></div></details><h3 class="notion-h notion-h2 notion-h-indent-1 notion-block-2a9e940c69bb807084f0e38ef7357337" data-id="2a9e940c69bb807084f0e38ef7357337"><span><div id="2a9e940c69bb807084f0e38ef7357337" class="notion-header-anchor"></div><a class="notion-hash-link" href="#2a9e940c69bb807084f0e38ef7357337" title="测试"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">测试</span></span></h3><div class="notion-text notion-block-2a9e940c69bb80459b12f9ba6656bf50">我们把这个LoRa模块 配置为</div><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb8002ae3fd4ff091e770d"><li>地址		0x00 0x01</li></ul><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb80d58d28ee9d6213a71a"><li>网络地址	0x04</li></ul><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb807eabc3c5bcc572c570"><li>串口		9600 8N1</li></ul><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb806caab3cc576040cce7"><li>空中		2.4K</li></ul><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb809590dbe43f46b52642"><li>信道		0x17	</li></ul><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb800197eaf58fdedd2083"><li>定点传输</li></ul><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb804eaf2cf58932787388"><li>其他默认就行</li></ul><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb80cdb9e2eb670917c0b9"><li>那么只需要写入 C0 00 07 00 01 04 62 00 17 40</li></ul><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb8051a35ed6be7360cf8d"><li>C0 写入、00 起始地址、07 依次写入7次、后续为7次数据。需要根据2进制转为16进制。</li><ul class="notion-list notion-list-disc notion-block-2a9e940c69bb8051a35ed6be7360cf8d"><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-94f3cf7af84c4d519746a8d22d37af9c"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:100%;max-width:100%;flex-direction:column"><img style="object-fit:cover" src="https://cdn.jsdmirror.com/gh/LZJ-I/picx-images-hosting@main/images/%E5%B5%8C%E5%85%A5%E5%BC%8F%E8%BD%AF%E4%BB%B6%E5%BC%80%E5%8F%91/Post-Lora/5a4644e1-632a-4177-8983-f40432397324-image.png?spaceId=3a565fcb-f425-4846-b72a-d32a98183896&amp;t=94f3cf7a-f84c-4d51-9746-a8d22d37af9c" alt="notion image" loading="lazy" decoding="async"/></div></figure></ul></ul><div class="notion-text notion-block-2a9e940c69bb80a9ad04e62cfe00972d">这样就代表成功了！</div><div class="notion-callout notion-gray_background_co notion-block-2a9e940c69bb8064a826c4425498a17c"><div class="notion-page-icon-inline notion-page-icon-span"><span class="notion-page-icon" role="img" aria-label="💡">💡</span></div><div class="notion-callout-text">有关Lora学习或者使用上的问题，欢迎您在底部评论区留言，一起交流~</div></div></main></div>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[MAX30102心率传感器]]></title>
            <link>https://www.mcoi.top/article/Post-MAX30102</link>
            <guid>https://www.mcoi.top/article/Post-MAX30102</guid>
            <pubDate>Thu, 06 Mar 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[MAX30102心率传感器的简介和STM32标准库驱动]]></description>
            <content:encoded><![CDATA[<div id="notion-article" class="mx-auto overflow-hidden "><main class="notion light-mode notion-page notion-block-2a9e940c69bb8070ae6bc7aba453e1ed"><div class="notion-viewport"></div><div class="notion-collection-page-properties"></div><div class="notion-callout notion-gray_background_co notion-block-2a9e940c69bb814e849bfb4226fae003"><div class="notion-page-icon-inline notion-page-icon-span"><span class="notion-page-icon" role="img" aria-label="😀">😀</span></div><div class="notion-callout-text">一句简单的开头</div></div><h2 class="notion-h notion-h1 notion-h-indent-0 notion-block-2a9e940c69bb80c191b7d127871bcb5b" data-id="2a9e940c69bb80c191b7d127871bcb5b"><span><div id="2a9e940c69bb80c191b7d127871bcb5b" class="notion-header-anchor"></div><a class="notion-hash-link" href="#2a9e940c69bb80c191b7d127871bcb5b" title="模块简介"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">模块简介</span></span></h2><div class="notion-text notion-block-2a9e940c69bb80b79221dd23df28b0ec">MAX30102是一个集成的脉搏血氧仪和心率监测仪生物传感器的模块。</div><div class="notion-text notion-block-2a9e940c69bb8052997cdfe5bd00b245">它集成了一个红光LED和一个红外光LED、光电检测器、光器件，以及带环境光抑制的低噪声电子电路。</div><div class="notion-text notion-block-2a9e940c69bb805e86e3c1229d7522e8">MAX30102采用一个1.8V电源和一个独立的5.0V用于内部LED的电源，应用于可穿戴设备进行心率和血氧采集检测，佩戴于手指点耳垂和手腕处。</div><div class="notion-text notion-block-2a9e940c69bb802db589ebd21b8797a0">标准的I2C兼容的通信接口可以将采集到的数值传输给Arduino、KL25Z、STM32、STC51等单片机进行心率和血氧计算。</div><div class="notion-text notion-block-2a9e940c69bb802ba102c5f700def1cd">此外，该芯片还可以通过软件关断模块，待机电流接近为零，实现电源始终维持供电状态。</div><h3 class="notion-h notion-h2 notion-h-indent-1 notion-block-2a9e940c69bb808db6d6d962a2c0599e" data-id="2a9e940c69bb808db6d6d962a2c0599e"><span><div id="2a9e940c69bb808db6d6d962a2c0599e" class="notion-header-anchor"></div><a class="notion-hash-link" href="#2a9e940c69bb808db6d6d962a2c0599e" title="主要参数:"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title"><b>主要参数</b>:</span></span></h3><table class="notion-simple-table notion-block-2a9e940c69bb80a984c4e1e23181e506"><tbody><tr class="notion-simple-table-row notion-block-2a9e940c69bb80bd91a6c4d886259687"><td class="" style="width:332px"><div class="notion-simple-table-cell"><b>产品名称</b></div></td><td class="" style="width:332px"><div class="notion-simple-table-cell"><b>MAX30102 心率模块</b></div></td></tr><tr class="notion-simple-table-row notion-block-2a9e940c69bb80b8a3c2d3a02c32e9c3"><td class="" style="width:332px"><div class="notion-simple-table-cell">LED峰值波长器</div></td><td class="" style="width:332px"><div class="notion-simple-table-cell">660nm/880nm</div></td></tr><tr class="notion-simple-table-row notion-block-2a9e940c69bb80a1818bf0030dcd234c"><td class="" style="width:332px"><div class="notion-simple-table-cell">LED供电电压</div></td><td class="" style="width:332px"><div class="notion-simple-table-cell">3.3 ~ 5V</div></td></tr><tr class="notion-simple-table-row notion-block-2a9e940c69bb80c4a196da13ab2529cf"><td class="" style="width:332px"><div class="notion-simple-table-cell">检测信号类型</div></td><td class="" style="width:332px"><div class="notion-simple-table-cell">光反射信号（PPG）</div></td></tr><tr class="notion-simple-table-row notion-block-2a9e940c69bb805b92b3faef02ea596c"><td class="" style="width:332px"><div class="notion-simple-table-cell">输出信号接口</div></td><td class="" style="width:332px"><div class="notion-simple-table-cell">I2C接口</div></td></tr><tr class="notion-simple-table-row notion-block-2a9e940c69bb8093910afa78598efd75"><td class="" style="width:332px"><div class="notion-simple-table-cell">通信接口电压</div></td><td class="" style="width:332px"><div class="notion-simple-table-cell">1.8 ~ 3.3V ~ 5V（可选）</div></td></tr></tbody></table><h3 class="notion-h notion-h2 notion-h-indent-1 notion-block-2a9e940c69bb80aaba9bef3c13cbd5ca" data-id="2a9e940c69bb80aaba9bef3c13cbd5ca"><span><div id="2a9e940c69bb80aaba9bef3c13cbd5ca" class="notion-header-anchor"></div><a class="notion-hash-link" href="#2a9e940c69bb80aaba9bef3c13cbd5ca" title="产品尺寸："><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title"><b>产品尺寸</b>：</span></span></h3><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-cc522dfadcf24f2a931a1c4ec2dc6d52"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:100%;max-width:100%;flex-direction:column"><img style="object-fit:cover" src="https://cdn.jsdmirror.com/gh/LZJ-I/picx-images-hosting@main/images/%E5%B5%8C%E5%85%A5%E5%BC%8F%E8%BD%AF%E4%BB%B6%E5%BC%80%E5%8F%91/Post-MAX30102/7aae163e-1e30-482b-8d7d-87237067ad53-image.webp?spaceId=3a565fcb-f425-4846-b72a-d32a98183896&amp;t=cc522dfa-dcf2-4f2a-931a-1c4ec2dc6d52" alt="notion image" loading="lazy" decoding="async"/></div></figure><h3 class="notion-h notion-h2 notion-h-indent-1 notion-block-2a9e940c69bb802c8a6be53a8e883093" data-id="2a9e940c69bb802c8a6be53a8e883093"><span><div id="2a9e940c69bb802c8a6be53a8e883093" class="notion-header-anchor"></div><a class="notion-hash-link" href="#2a9e940c69bb802c8a6be53a8e883093" title="工作原理"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title"><b>工作原理</b></span></span></h3><div class="notion-text notion-block-2a9e940c69bb8082b126c3e12b7711a9">光电容积法的基本原理是利用人体组织在血管搏动时造成透光率不同来进行脉搏和血氧饱和度测量的。光源一般采用对动脉血中<span class="notion-brown_background"><b>氧合血红蛋白(Hb02)和血红蛋自(Hb)</b></span>有选择性的特定波长的发光二极管(一般选用<span class="notion-orange_background"><b>660nm附近的红光和900nm附近的红外光</b></span>)。当光束透过人体外周血管，由于动脉搏动充血容积变化导致这束光的透过光率发生改变，此时由光电变换器接收人体组织反射的光线，转变为电信号并将其放大和输出。由于脉搏是随心脏的搏动而周期性变化的信号，动脉血管容积也周期性变化，因此光电变换器的电信号变化周期就是脉搏率。同时根据血氧饱和度的定义，计算如下:</div><div class="notion-text notion-block-2a9e940c69bb8014b0e4cb7e7f54a92d">透光率转化为电信号：动脉搏动充血容积变化导致这束光的透光率发送改变，此时由光电变换接收经人体组织反射光线，转变为电信号并将其放大输出。</div><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-f76a3d90984841b79c21ff35c4142150"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:100%;max-width:100%;flex-direction:column"><img style="object-fit:cover" src="https://cdn.jsdmirror.com/gh/LZJ-I/picx-images-hosting@main/images/%E5%B5%8C%E5%85%A5%E5%BC%8F%E8%BD%AF%E4%BB%B6%E5%BC%80%E5%8F%91/Post-MAX30102/c121e81b-ebf1-4f30-b6c6-5a42c5b4ca96-image.webp?spaceId=3a565fcb-f425-4846-b72a-d32a98183896&amp;t=f76a3d90-9848-41b7-9c21-ff35c4142150" alt="notion image" loading="lazy" decoding="async"/></div></figure><h3 class="notion-h notion-h2 notion-h-indent-1 notion-block-2a9e940c69bb80dca84df34b3c9cc4ea" data-id="2a9e940c69bb80dca84df34b3c9cc4ea"><span><div id="2a9e940c69bb80dca84df34b3c9cc4ea" class="notion-header-anchor"></div><a class="notion-hash-link" href="#2a9e940c69bb80dca84df34b3c9cc4ea" title="原理图及引脚说明"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title"><b>原理图及引脚说明</b></span></span></h3><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-2bbfa822e002488e98ec8b6eea09f326"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:100%;max-width:100%;flex-direction:column"><img style="object-fit:cover" src="https://cdn.jsdmirror.com/gh/LZJ-I/picx-images-hosting@main/images/%E5%B5%8C%E5%85%A5%E5%BC%8F%E8%BD%AF%E4%BB%B6%E5%BC%80%E5%8F%91/Post-MAX30102/d49f8747-2e0b-46c3-9607-6154a3637b7b-image.webp?spaceId=3a565fcb-f425-4846-b72a-d32a98183896&amp;t=2bbfa822-e002-488e-98ec-8b6eea09f326" alt="notion image" loading="lazy" decoding="async"/></div></figure><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-39780bb0878349cfb444786501af6289"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:100%;max-width:100%;flex-direction:column"><img style="object-fit:cover" src="https://cdn.jsdmirror.com/gh/LZJ-I/picx-images-hosting@main/images/%E5%B5%8C%E5%85%A5%E5%BC%8F%E8%BD%AF%E4%BB%B6%E5%BC%80%E5%8F%91/Post-MAX30102/7e14d4fb-e2b0-4587-9267-00bc0c12ef3c-image.webp?spaceId=3a565fcb-f425-4846-b72a-d32a98183896&amp;t=39780bb0-8783-49cf-b444-786501af6289" alt="notion image" loading="lazy" decoding="async"/></div></figure><table class="notion-simple-table notion-block-2a9e940c69bb8010a2eac1dd54178f56"><tbody><tr class="notion-simple-table-row notion-block-2a9e940c69bb8024bb48f1d68b807681"><td class="" style="width:81px"><div class="notion-simple-table-cell">VIN</div></td><td class="" style="width:318px"><div class="notion-simple-table-cell">电源输入 1.6V-5.5V</div></td></tr><tr class="notion-simple-table-row notion-block-2a9e940c69bb8033b610fcaf062ee129"><td class="" style="width:81px"><div class="notion-simple-table-cell">3位焊盘</div></td><td class="" style="width:318px"><div class="notion-simple-table-cell">选择总线的上拉电平，取决于引脚主控电压可选1.8v或者3.3v</div></td></tr><tr class="notion-simple-table-row notion-block-2a9e940c69bb80cab70bcc569eac7b92"><td class="" style="width:81px"><div class="notion-simple-table-cell">SDA</div></td><td class="" style="width:318px"><div class="notion-simple-table-cell">IIC-SDA</div></td></tr><tr class="notion-simple-table-row notion-block-2a9e940c69bb803c9c54df611a6f815c"><td class="" style="width:81px"><div class="notion-simple-table-cell">SCL</div></td><td class="" style="width:318px"><div class="notion-simple-table-cell">IIC-SCL</div></td></tr><tr class="notion-simple-table-row notion-block-2a9e940c69bb80a9b94dc1cd80e95b46"><td class="" style="width:81px"><div class="notion-simple-table-cell">GND</div></td><td class="" style="width:318px"><div class="notion-simple-table-cell">地</div></td></tr><tr class="notion-simple-table-row notion-block-2a9e940c69bb809f8119da223d169962"><td class="" style="width:81px"><div class="notion-simple-table-cell">INT</div></td><td class="" style="width:318px"><div class="notion-simple-table-cell">INT 低电平有效中断（漏极开路）MAX30102 的中断引脚</div></td></tr><tr class="notion-simple-table-row notion-block-2a9e940c69bb80e78b88cf5586954007"><td class="" style="width:81px"><div class="notion-simple-table-cell">IRD</div></td><td class="" style="width:318px"><div class="notion-simple-table-cell">IR_DRV IR LED阴极和LED驱动器连接点 一般不接</div></td></tr><tr class="notion-simple-table-row notion-block-2a9e940c69bb80bd9f8fd55c7624170f"><td class="" style="width:81px"><div class="notion-simple-table-cell">RD</div></td><td class="" style="width:318px"><div class="notion-simple-table-cell">R_DRV 红色LED阴极和LED驱动器连接点 一般不接</div></td></tr></tbody></table><div class="notion-text notion-block-2a9e940c69bb80b1a5b2d67308b8818a">芯片内部有3.3V-5.0V的LED电源和1.8V的逻辑电源，所以模块带有两路稳压电路，将5V电源分别转化为3.3V和1.8V；由于LED驱动电源的供电范围为3.3V-5.0V，3.3V稳压电路可省去。
由于MAX30102的<b>逻辑电路的IIC通信电平为1.8V，</b>这与我们常用的STM32单片机的引脚电平不匹配。
这里有个解决方法，因为MAX30102的SDA、SCL、INT引脚为开漏，如图<div class="notion-text-children"><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-09d3757fa1954a87a5ac61ba9abe65fe"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:100%;max-width:100%;flex-direction:column"><img style="object-fit:cover" src="https://cdn.jsdmirror.com/gh/LZJ-I/picx-images-hosting@main/images/%E5%B5%8C%E5%85%A5%E5%BC%8F%E8%BD%AF%E4%BB%B6%E5%BC%80%E5%8F%91/Post-MAX30102/1394ffaa-6406-4ca3-9170-e64325ca1b37-image.webp?spaceId=3a565fcb-f425-4846-b72a-d32a98183896&amp;t=09d3757f-a195-4a87-a5ac-61ba9abe65fe" alt="notion image" loading="lazy" decoding="async"/></div></figure></div></div><div class="notion-text notion-block-2a9e940c69bb80dba51efa5593f59a13">所以可以将模块上的R1、R2、R3电阻去掉，对于51单片机来说，在SDA、SCL、INT引脚上分别加一个4.7-10k电阻上拉至5V；对于STM32单片机，只需要将相应的控制引脚配置为上拉模式即可。</div><h2 class="notion-h notion-h1 notion-h-indent-0 notion-block-2a9e940c69bb80ba8a89ff6cac1155c8" data-id="2a9e940c69bb80ba8a89ff6cac1155c8"><span><div id="2a9e940c69bb80ba8a89ff6cac1155c8" class="notion-header-anchor"></div><a class="notion-hash-link" href="#2a9e940c69bb80ba8a89ff6cac1155c8" title="STM32软件驱动"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title"><b>STM32软件驱动</b></span></span></h2><details class="notion-toggle notion-block-2a9e940c69bb8088a281e5cd25d849b1"><summary><h3 class="notion-h notion-h2 notion-h-indent-1 notion-block-2a9e940c69bb8088a281e5cd25d849b1" data-id="2a9e940c69bb8088a281e5cd25d849b1"><span><div id="2a9e940c69bb8088a281e5cd25d849b1" class="notion-header-anchor"></div><span class="notion-h-title">官方驱动</span></span></h3></summary><div><details class="notion-toggle notion-block-2a9e940c69bb809e8106d2bfddf96f46"><summary><h4 class="notion-h notion-h3 notion-block-2a9e940c69bb809e8106d2bfddf96f46" data-id="2a9e940c69bb809e8106d2bfddf96f46"><span><div id="2a9e940c69bb809e8106d2bfddf96f46" class="notion-header-anchor"></div><span class="notion-h-title">IIC通信代码</span></span></h4></summary><div><div class="notion-text notion-block-5950df4dca21449dac07320b54b9cdf2">#include &quot;mbed.h&quot;</div><div class="notion-text notion-block-0dca88380f564ca388a1ca885a470e12">#include &quot;MAX30102.h&quot;</div><div class="notion-text notion-block-cb815d3b96e947e59405bb01db8209a0">I2C i2c(I2C_SDA, I2C_SCL);//SDA-PB9,SCL-PB8</div><div class="notion-text notion-block-242b3e15a44b4d0f842039943bc48d09">bool maxim_max30102_write_reg(uint8_t uch_addr, uint8_t uch_data)</div><div class="notion-text notion-block-86866ed83bfa40feac0293c3382a8892">/</div><ul class="notion-list notion-list-disc notion-block-217d9e75c48441a883115625db8589ea"><li>brief        Write a value to a MAX30102 register</li></ul><ul class="notion-list notion-list-disc notion-block-3f7ef6cc26994bac830f0d83af964c14"><li>par          Details</li></ul><ul class="notion-list notion-list-disc notion-block-8c124696bf6b4b02909e829cd7983c56"><li>This function writes a value to a MAX30102 register</li></ul><ul class="notion-list notion-list-disc notion-block-e9776f367fff4d6b95e7556ce3e5ea04"></ul><ul class="notion-list notion-list-disc notion-block-0f0e5d261b0045a1a8a6cdd219ea3b1d"><li>param[in]    uch_addr    - register address</li></ul><ul class="notion-list notion-list-disc notion-block-fd82205fc5944f9f85250d1a5081a19c"><li>param[in]    uch_data    - register data</li></ul><ul class="notion-list notion-list-disc notion-block-a90cde87b3344fe8b5b692e01615a71f"></ul><ul class="notion-list notion-list-disc notion-block-091c739ac86a4fb68189948d195a2fd9"><li>retval       true on success</li></ul><div class="notion-text notion-block-512ad30810784f45a10094b3c007a66f">*/</div><div class="notion-text notion-block-521dfa42b6f54bbc872d46d8963091a9">{<div class="notion-text-children"><div class="notion-text notion-block-73d7fb6641da4da9a5f520da682d1ed8">char ach_i2c_data[2];</div><div class="notion-text notion-block-e579c8a7388d4216bc8e7d2b3e34943b">ach_i2c_data[0]=uch_addr;</div><div class="notion-text notion-block-d1eaab66c1624dc2b9a13adca8f9cc13">ach_i2c_data[1]=uch_data;</div><div class="notion-text notion-block-c4ea64f8f6f24035ae748f6971222598">if(i2c.write(I2C_WRITE_ADDR, ach_i2c_data, 2, false)==0)<div class="notion-text-children"><div class="notion-text notion-block-4cac29fa2e3544f996bd44d1749395e4">return true;</div></div></div><div class="notion-text notion-block-496d6960d42e4515a5d5a29c188c83d5">else<div class="notion-text-children"><div class="notion-text notion-block-7bb197c105e64a5298e82b8541faaa2e">return false;</div></div></div></div></div><div class="notion-text notion-block-ee9c5ae1048b40bf8ce2c64b21b8666b">}</div><div class="notion-text notion-block-bcd5b0f2a72447e39be4b9e78d4e705b">bool maxim_max30102_read_reg(uint8_t uch_addr, uint8_t *puch_data)</div><div class="notion-text notion-block-69f818cb62e347058814f449627eb10c">/</div><ul class="notion-list notion-list-disc notion-block-728c3cdbb2444e93b975452580078c1b"><li>brief        Read a MAX30102 register</li></ul><ul class="notion-list notion-list-disc notion-block-c7741b0edc2849e4ba8a538ffa47ba5e"><li>par          Details</li></ul><ul class="notion-list notion-list-disc notion-block-fd759417a7834dec84181edd858e6412"><li>This function reads a MAX30102 register</li></ul><ul class="notion-list notion-list-disc notion-block-0445c93b635045b783772bedb29f73aa"></ul><ul class="notion-list notion-list-disc notion-block-4306f1ca3231479992807ef2026ee901"><li>param[in]    uch_addr    - register address</li></ul><ul class="notion-list notion-list-disc notion-block-3823420c481146d686fb2012259f9698"><li>param[out]   puch_data    - pointer that stores the register data</li></ul><ul class="notion-list notion-list-disc notion-block-311b0c10d1e14ff48440684a238e1c3d"></ul><ul class="notion-list notion-list-disc notion-block-0c950d97a04347c88839b2551f03e034"><li>retval       true on success</li></ul><div class="notion-text notion-block-fd9c0a8b49b74c6cbc3f9b750e6368e4">*/</div><div class="notion-text notion-block-a8bc53b98e984761894133885887cfa1">{</div><div class="notion-text notion-block-375af942294a464e8b7971492ba439e7">char ch_i2c_data;</div><div class="notion-text notion-block-0da8407de3744aff8bc4c448f505d044">ch_i2c_data=uch_addr;</div><div class="notion-text notion-block-c633c7b624624bd8830803d5ee64ed4d">if(i2c.write(I2C_WRITE_ADDR, &amp;ch_i2c_data, 1, true)!=0)<div class="notion-text-children"><div class="notion-text notion-block-ee5ec51bafd840dabc38530878dafee0">return false;</div></div></div><div class="notion-text notion-block-0dfdfe16623943cf87522b4f9425d620">if(<a class="notion-link" href="http://i2c.read" target="_blank" rel="noopener noreferrer">i2c.read</a>(I2C_READ_ADDR, &amp;ch_i2c_data, 1, false)==0)</div><div class="notion-text notion-block-e98b9dea4c60492d9ae608db2aa20d1e">{<div class="notion-text-children"><div class="notion-text notion-block-aff550db36c3401bb258cecbd6970360">*puch_data=(uint8_t) ch_i2c_data;</div><div class="notion-text notion-block-f5f66ad79c594e758ca390069c4367ad">return true;</div></div></div><div class="notion-text notion-block-40f13bd9011547ee81b3ff71c3d2e6b4">}</div><div class="notion-text notion-block-9d662d32803b47098ef5495ac512719f">else<div class="notion-text-children"><div class="notion-text notion-block-7873de43f47d4703b97f476b85c246c4">return false;</div></div></div></div></details></div></details><div class="notion-text notion-block-8435a30866cb40cc8b9b4ac21c6c4751">}</div><div class="notion-text notion-block-7c9e4c1aa9614ddc9aee1455a7411951">bool maxim_max30102_init()</div><div class="notion-text notion-block-a01f4c2110dc4014bdb258ddb73e1b2c">/</div><ul class="notion-list notion-list-disc notion-block-b66c978f8f0a4e87ab5335a596140662"><li>brief        Initialize the MAX30102</li></ul><ul class="notion-list notion-list-disc notion-block-e95e7a66875d42e492b3caede3043735"><li>par          Details</li></ul><ul class="notion-list notion-list-disc notion-block-3cad6d462d934e92a3ca1c267b69aef6"><li>This function initializes the MAX30102</li></ul><ul class="notion-list notion-list-disc notion-block-2d45f2f95529457ab4256deef3789c60"></ul><ul class="notion-list notion-list-disc notion-block-cfd8c31e601b4e748fe45ff9c71df350"><li>param        None</li></ul><ul class="notion-list notion-list-disc notion-block-07fad526e8a24a50846decec2dc2b9bd"></ul><ul class="notion-list notion-list-disc notion-block-8cc9c3be471d4d4696ff6cbb1ef5b60b"><li>retval       true on success</li></ul><div class="notion-text notion-block-0561044545ad47a6be7597c8c32a0525">*/</div><div class="notion-text notion-block-e17ffff2e583412f8e9371cf5b439bb8">{<div class="notion-text-children"><div class="notion-text notion-block-bb06da9d43fa4c4f95989c73876ed3f0">if(!maxim_max30102_write_reg(REG_INTR_ENABLE_1,0xc0)) // INTR setting<div class="notion-text-children"><div class="notion-text notion-block-fffdc87bada740aaa5d9093d7804baec">return false;</div></div></div><div class="notion-text notion-block-d945d837ce214af88a5f8a071842e7b9">if(!maxim_max30102_write_reg(REG_INTR_ENABLE_2,0x00))<div class="notion-text-children"><div class="notion-text notion-block-f007a6f7267d4bde98f183814fd657a0">return false;</div></div></div><div class="notion-text notion-block-dcb83d23352241fd95b24a11e0c0c110">if(!maxim_max30102_write_reg(REG_FIFO_WR_PTR,0x00))  //FIFO_WR_PTR[4:0]<div class="notion-text-children"><div class="notion-text notion-block-2f988615b7c34e5b9051fb857d64f7c2">return false;</div></div></div><div class="notion-text notion-block-b748bc2ee68c454d8c7cd6953152d9df">if(!maxim_max30102_write_reg(REG_OVF_COUNTER,0x00))  //OVF_COUNTER[4:0]<div class="notion-text-children"><div class="notion-text notion-block-5d215db369f54590b1eca9a3b43e6cae">return false;</div></div></div><div class="notion-text notion-block-384044963cd3415ab325ee84a6bfae1d">if(!maxim_max30102_write_reg(REG_FIFO_RD_PTR,0x00))  //FIFO_RD_PTR[4:0]<div class="notion-text-children"><div class="notion-text notion-block-d4140e8b22df4779a3587f5661e103c5">return false;</div></div></div><div class="notion-text notion-block-cac0adf2b5664658bd84a77d92e6c8c2">if(!maxim_max30102_write_reg(REG_FIFO_CONFIG,0x0f))  //sample avg = 1, fifo rollover=false, fifo almost full = 17<div class="notion-text-children"><div class="notion-text notion-block-047d25408feb4c6d9ffbc3c4f422335c">return false;</div></div></div><div class="notion-text notion-block-ce05a9a891854fac95826c7d5c4bae46">if(!maxim_max30102_write_reg(REG_MODE_CONFIG,0x03))   //0x02 for Red only, 0x03 for SpO2 mode 0x07 multimode LED<div class="notion-text-children"><div class="notion-text notion-block-b50c6b1a57204d4289d1aee0c17f9567">return false;</div></div></div><div class="notion-text notion-block-b99e64afedc24e3d8476a980485db3f1">if(!maxim_max30102_write_reg(REG_SPO2_CONFIG,0x27))  // SPO2_ADC range = 4096nA, SPO2 sample rate (100 Hz), LED pulseWidth (400uS)<div class="notion-text-children"><div class="notion-text notion-block-807588a025e24a168a6691541ffd751f">return false;</div></div></div><div class="notion-text notion-block-f294fed9ba8b401d80e9bff66c2ce4e7">if(!maxim_max30102_write_reg(REG_LED1_PA,0x24))   //Choose value for ~ 7mA for LED1<div class="notion-text-children"><div class="notion-text notion-block-b214476247c3413f95270d4d9d0d130f">return false;</div></div></div><div class="notion-text notion-block-26842fee4f7742c3aeb37b3e92c4b615">if(!maxim_max30102_write_reg(REG_LED2_PA,0x24))   // Choose value for ~ 7mA for LED2<div class="notion-text-children"><div class="notion-text notion-block-04b109f65873447ba3d3c4280e75b9d7">return false;</div></div></div><div class="notion-text notion-block-baf290b2a49a46248c81b99d1e4eecbd">if(!maxim_max30102_write_reg(REG_PILOT_PA,0x7f))   // Choose value for ~ 25mA for Pilot LED<div class="notion-text-children"><div class="notion-text notion-block-6b0b4bc6d8b94cd1add0be780d2feb45">return false;</div></div></div><div class="notion-text notion-block-7e33df5246694f7796f64e582000235b">return true;  </div></div></div><div class="notion-text notion-block-09223fb013244955a9dffb2dda8c9549">}</div><div class="notion-text notion-block-c72d88ac3f3d41b790e36c82805b9241">bool maxim_max30102_read_fifo(uint32_t <em>pun_red_led, uint32_t </em>pun_ir_led)</div><div class="notion-text notion-block-7bc7fe3264df409ea24d6109818b43ba">/</div><ul class="notion-list notion-list-disc notion-block-d82c19eada504198be4576794165bcd9"><li>brief        Read a set of samples from the MAX30102 FIFO register</li></ul><ul class="notion-list notion-list-disc notion-block-7b31d653a68846709774f2d454e3a1f4"><li>par          Details</li></ul><ul class="notion-list notion-list-disc notion-block-b49f387ea6f9461889398fa87a3080fe"><li>This function reads a set of samples from the MAX30102 FIFO register</li></ul><ul class="notion-list notion-list-disc notion-block-ef5d44a76fc44c2480d7a7d261595418"></ul><ul class="notion-list notion-list-disc notion-block-251cb0770ebf476287b169d77df5360f"><li>param[out]   *pun_red_led   - pointer that stores the red LED reading data</li></ul><ul class="notion-list notion-list-disc notion-block-8364377c9f4c4dceacf57ad1bf31c7fd"><li>param[out]   *pun_ir_led    - pointer that stores the IR LED reading data</li></ul><ul class="notion-list notion-list-disc notion-block-eb3a29f3c77e44ea8f9f63d07381fb50"></ul><ul class="notion-list notion-list-disc notion-block-00f19aac9ef84673939c1797d31aedbf"><li>retval       true on success</li></ul><div class="notion-text notion-block-1078785488424d8d95c785013fc712ec">*/</div><div class="notion-text notion-block-4dce968e65464012b67daf2de0e1b9cb">{<div class="notion-text-children"><div class="notion-text notion-block-89724603536c4aa58b97c62ec701db58">uint32_t un_temp;</div><div class="notion-text notion-block-a2a8b3705a704588b0d87975c64e815e">unsigned char uch_temp;</div><div class="notion-text notion-block-9a498bbc480f4856bf1e649721224c85">*pun_red_led=0;</div><div class="notion-text notion-block-264c7fa643664019a8ed16471a37c170">*pun_ir_led=0;</div><div class="notion-text notion-block-18d686c87c3e48f7a5d6bfdb34da5d65">char ach_i2c_data[6];</div><div class="notion-text notion-block-1c181f0cf44d491f8a8220f2c61c5de2">//read and clear status register</div><div class="notion-text notion-block-95e7b9cba88c4d0faef500e73caccf5f">maxim_max30102_read_reg(REG_INTR_STATUS_1, &amp;uch_temp);</div><div class="notion-text notion-block-5977bc699881430a8fc1fc3142fe3444">maxim_max30102_read_reg(REG_INTR_STATUS_2, &amp;uch_temp);</div><div class="notion-text notion-block-e3857673832041b78a8e10e85f7021a0">ach_i2c_data[0]=REG_FIFO_DATA;</div><div class="notion-text notion-block-5c568b33628747ee867ccd415a5a6b07">if(i2c.write(I2C_WRITE_ADDR, ach_i2c_data, 1, true)!=0)<div class="notion-text-children"><div class="notion-text notion-block-b7090c7c570f469da6c62aa0b39fd0a4">return false;</div></div></div><div class="notion-text notion-block-319f8999b79c4e898b246575c80a8cb4">if(<a class="notion-link" href="http://i2c.read" target="_blank" rel="noopener noreferrer">i2c.read</a>(I2C_READ_ADDR, ach_i2c_data, 6, false)!=0)</div><div class="notion-text notion-block-10fe695cde3b49589ae67b7327bbe96a">{<div class="notion-text-children"><div class="notion-text notion-block-dcf8ea2aea6d4cb0b179d50338100190">return false;</div></div></div><div class="notion-text notion-block-a7c17524c4dd4d47a3a038f43148b0c0">}</div><div class="notion-text notion-block-6dffa65d43ff40758e11a5d837df4b38">un_temp=(unsigned char) ach_i2c_data[0];</div><div class="notion-text notion-block-8c97a3eaee1745e581abbcb8047383a9">un_temp&lt;&lt;=16;</div><div class="notion-text notion-block-d25a0d931da443b7899c4170e4afe6df">*pun_red_led+=un_temp;</div><div class="notion-text notion-block-e7898ca160d94fd0b4bd0e9748da5d4e">un_temp=(unsigned char) ach_i2c_data[1];</div><div class="notion-text notion-block-06876426319b4149a9c280ae58dd34e5">un_temp&lt;&lt;=8;</div><div class="notion-text notion-block-b6a6cfbf753942bcbcce64a8cbced8d9">*pun_red_led+=un_temp;</div><div class="notion-text notion-block-21d34ed186d8477391d29c1ee374e556">un_temp=(unsigned char) ach_i2c_data[2];</div><div class="notion-text notion-block-201a81c3afd14d459746461778359c30">*pun_red_led+=un_temp;</div><div class="notion-text notion-block-616638e67cc5477aaeca5bf4619b3bf1">un_temp=(unsigned char) ach_i2c_data[3];</div><div class="notion-text notion-block-2a2695d4b719436db48bcfdaf91d3008">un_temp&lt;&lt;=16;</div><div class="notion-text notion-block-d5e20d46cda34c0894a47f317200a524">*pun_ir_led+=un_temp;</div><div class="notion-text notion-block-3f5127debc9e4e30a54e03a95666e12b">un_temp=(unsigned char) ach_i2c_data[4];</div><div class="notion-text notion-block-c9aeee6c88ed4b2f8e276977938039f4">un_temp&lt;&lt;=8;</div><div class="notion-text notion-block-e9dd7d28d9c345fd8f083c44d59be32c">*pun_ir_led+=un_temp;</div><div class="notion-text notion-block-3491d1536d644c6cabcd65472e8fe171">un_temp=(unsigned char) ach_i2c_data[5];</div><div class="notion-text notion-block-c01f8ede83b84658a7d205d8659de95e">*pun_ir_led+=un_temp;</div><div class="notion-text notion-block-58f657a7630e42b2a819ee09e7ea4d5e">*pun_red_led&amp;=0x03FFFF;  //Mask MSB [23:18]</div><div class="notion-text notion-block-bdbdaab86d7f4857bd85bfa3b87d5172">*pun_ir_led&amp;=0x03FFFF;  //Mask MSB [23:18]</div><div class="notion-text notion-block-ff693158d24f4333b123d9204dc3b40b">return true;</div></div></div><div class="notion-text notion-block-be625fdf7c8b456da9c28a401ed9f023">}</div><div class="notion-text notion-block-28a5c735672c4cb0a5110c14a4499ec9">bool maxim_max30102_reset()</div><div class="notion-text notion-block-8dcc1f83ae6c4681ab7ba7d3a5023cb8">/</div><ul class="notion-list notion-list-disc notion-block-62afe56f58d7468da016a77d5f60eb69"><li>brief        Reset the MAX30102</li></ul><ul class="notion-list notion-list-disc notion-block-d674bf1d0c284bdd902dcc521e0ea9c1"><li>par          Details</li></ul><ul class="notion-list notion-list-disc notion-block-21dffab5e294493e8fbdf3455c4abcd1"><li>This function resets the MAX30102</li></ul><ul class="notion-list notion-list-disc notion-block-7e75c0aefa9542a0b88f4c6a5cecddae"></ul><ul class="notion-list notion-list-disc notion-block-e15b19eb446e4be490e81192f39e25fa"><li>param        None</li></ul><ul class="notion-list notion-list-disc notion-block-f2accaa365114aeb9e8ee6185f34acfd"></ul><ul class="notion-list notion-list-disc notion-block-98ac0f542d8644a4b71474838da928a1"><li>retval       true on success</li></ul><div class="notion-text notion-block-69af63cbfa69489a9fbf0ef60ca453e8">*/</div><div class="notion-text notion-block-58257ea4144446dca0a3b314abafa27c">{<div class="notion-text-children"><div class="notion-text notion-block-073cf5e32a394ef5a12b6faebee86acf">if(!maxim_max30102_write_reg(REG_MODE_CONFIG,0x40))<div class="notion-text-children"><div class="notion-text notion-block-0d13c1a845c640a5bfe39c7eaaece892">return false;</div></div></div><div class="notion-text notion-block-074c9e4b26904688915e0b214dbb69a7">else<div class="notion-text-children"><div class="notion-text notion-block-fbf8e866b230475da6a78e360a470129">return true;    </div></div></div></div></div><div class="notion-text notion-block-d739fafbd08c4fb49351e41a2301ac75">}<div class="notion-text-children"><div class="notion-blank notion-block-6b96cbe793094426aaed51d18aba4535"> </div><details class="notion-toggle notion-block-69aff61c332d40e8b82d0a41face2cea"><summary><h4 class="notion-h notion-h3 notion-block-69aff61c332d40e8b82d0a41face2cea" data-id="69aff61c332d40e8b82d0a41face2cea"><span><div id="69aff61c332d40e8b82d0a41face2cea" class="notion-header-anchor"></div><span class="notion-h-title">数值转换代码</span></span></h4></summary><div><div class="notion-text notion-block-696c8e4697cc4bec8ff1a4dba92f771b">#include &quot;algorithm.h&quot;</div><div class="notion-text notion-block-5571bda0d8b340ce9b99d06f71c4fee6">#include &quot;mbed.h&quot;</div><div class="notion-text notion-block-5c8fee4861974523ab18d57b576a86ab">void maxim_heart_rate_and_oxygen_saturation(uint32_t <em>pun_ir_buffer,  int32_t n_ir_buffer_length, uint32_t </em>pun_red_buffer, int32_t <em>pn_spo2, int8_t </em>pch_spo2_valid, </div><div class="notion-text notion-block-837b7af690184033aaa8be8438c19f99">int32_t <em>pn_heart_rate, int8_t  </em>pch_hr_valid)</div><div class="notion-text notion-block-460ddc2f3b4e4de995b4a74c08288cf7">/</div><ul class="notion-list notion-list-disc notion-block-d92e113fd8d247378f0c5bc598bc3d9c"><li>brief        Calculate the heart rate and SpO2 level</li></ul><ul class="notion-list notion-list-disc notion-block-143fa0fa04854133a60134a033aa3e00"><li>par          Details</li></ul><ul class="notion-list notion-list-disc notion-block-7b76f499f12948a0ac8e5b2bd3be37ee"><li>By detecting  peaks of PPG cycle and corresponding AC/DC of red/infra-red signal, the ratio for the SPO2 is computed.</li></ul><ul class="notion-list notion-list-disc notion-block-cf8fd2b444954cdfa2faf24042d5bb13"><li>Since this algorithm is aiming for Arm M0/M3. formaula for SPO2 did not achieve the accuracy due to register overflow.</li></ul><ul class="notion-list notion-list-disc notion-block-a6d23a554e3a45a9aff6d096f9683dcf"><li>Thus, accurate SPO2 is precalculated and save longo uch_spo2_table[] per each ratio.</li></ul><ul class="notion-list notion-list-disc notion-block-73d75c65815342f083055ceedd2f04d9"></ul><ul class="notion-list notion-list-disc notion-block-7f394d15812b4537b2ef9c5d4afc18dc"><li>param[in]    *pun_ir_buffer           - IR sensor data buffer</li></ul><ul class="notion-list notion-list-disc notion-block-a79d8ad3ff494a48b6b5bd9fb83eab01"><li>param[in]    n_ir_buffer_length      - IR sensor data buffer length</li></ul><ul class="notion-list notion-list-disc notion-block-f5b30551487149368716b2543f7de905"><li>param[in]    *pun_red_buffer          - Red sensor data buffer</li></ul><ul class="notion-list notion-list-disc notion-block-59527ad9a7214e7b9ddafca4a93e3dfc"><li>param[out]    *pn_spo2                - Calculated SpO2 value</li></ul><ul class="notion-list notion-list-disc notion-block-45145cb44d7e4afebd7b2b63b8796b3a"><li>param[out]    *pch_spo2_valid         - 1 if the calculated SpO2 value is valid</li></ul><ul class="notion-list notion-list-disc notion-block-60eabcd9a5e3439cb58f75405a52beb6"><li>param[out]    *pn_heart_rate          - Calculated heart rate value</li></ul><ul class="notion-list notion-list-disc notion-block-82de3d4e614c452b8d9d56f47bda8b5c"><li>param[out]    *pch_hr_valid           - 1 if the calculated heart rate value is valid</li></ul><ul class="notion-list notion-list-disc notion-block-06851f1094144a8dbacbe5d848bdd736"></ul><ul class="notion-list notion-list-disc notion-block-f3e4d2b5b02d476bb9b89228d6efe66a"><li>retval       None</li></ul><div class="notion-text notion-block-cc375b102c6048e3b79c03ae53ee950b">*/</div><div class="notion-text notion-block-164d62c0826a4f17805ddba47d06d861">{</div><div class="notion-text notion-block-23d660d0ec464e5a8a842095544824e2">uint32_t un_ir_mean ,un_only_once ;</div><div class="notion-text notion-block-d90700261cdf46cdbaca814e009c59f4">int32_t k ,n_i_ratio_count;</div><div class="notion-text notion-block-7d68fec3e3b14e14b2119933a95ce7b0">int32_t i, s, m, n_exact_ir_valley_locs_count ,n_middle_idx;</div><div class="notion-text notion-block-5b7c2ee7ffe74d048fb0979e59cad2c9">int32_t n_th1, n_npks,n_c_min;      </div><div class="notion-text notion-block-2daf93b37dbb452ba2f117707e091627">int32_t an_ir_valley_locs[15] ;</div><div class="notion-text notion-block-4d39048d1a9541d2b8718d002d4e9b3f">int32_t an_exact_ir_valley_locs[15] ;</div><div class="notion-text notion-block-6926df976b204b5996a4f1659c77b88e">int32_t an_dx_peak_locs[15] ;</div><div class="notion-text notion-block-eed349d56cf34368b607c305f7807c8a">int32_t n_peak_interval_sum;</div><div class="notion-text notion-block-5fd1155d049b4bd08bc62232491a21fe">int32_t n_y_ac, n_x_ac;</div><div class="notion-text notion-block-706a1adadb224af9a2e4f006fd0dafa2">int32_t n_spo2_calc; </div><div class="notion-text notion-block-c2545042b9294f4a84a3c44e4e5536af">int32_t n_y_dc_max, n_x_dc_max; </div><div class="notion-text notion-block-d1ecd450317a4f21aac5cae54eb33eb7">int32_t n_y_dc_max_idx, n_x_dc_max_idx; </div><div class="notion-text notion-block-34432cbe76e84736b9faef2c3162b76c">int32_t an_ratio[5],n_ratio_average; </div><div class="notion-text notion-block-9b26539d5bff4f4a9ace764ce4f179e7">int32_t n_nume,  n_denom ;</div><div class="notion-text notion-block-6fef05c880464920814b98d139def2a4">// remove DC of ir signal    </div><div class="notion-text notion-block-5e70f495c6ac4f9b8189f43e905e2f8f">un_ir_mean =0; </div><div class="notion-text notion-block-3fb980e1fa7549d0b982420279f8aea4">for (k=0 ; k&lt;n_ir_buffer_length ; k++ ) un_ir_mean += pun_ir_buffer[k] ;</div><div class="notion-text notion-block-50dc1ef48b944000bdc0e5c01906569c">un_ir_mean =un_ir_mean/n_ir_buffer_length ;</div><div class="notion-text notion-block-c821537be998460d84dc6e3002ea6a1f">for (k=0 ; k&lt;n_ir_buffer_length ; k++ )  an_x[k] =  pun_ir_buffer[k] - un_ir_mean ; </div><div class="notion-text notion-block-b10feafc932e495f93aa6ac39d415d3a">// 4 pt Moving Average</div><div class="notion-text notion-block-13d81161a59b4d8facc1d29c9792df1f">for(k=0; k&lt; BUFFER_SIZE-MA4_SIZE; k++){</div><div class="notion-text notion-block-2b33457d4a9647e8b838f79b6d5720cf">n_denom= ( an_x[k]+an_x[k+1]+ an_x[k+2]+ an_x[k+3]);</div><div class="notion-text notion-block-79a2a1cf5c054e46ba6d8f47bb1fcf0d">an_x[k]=  n_denom/(int32_t)4; </div><div class="notion-text notion-block-98a5ccc6346341aaaf49eb2ad4b22161">}</div><div class="notion-text notion-block-b2ba680cea12431d9f5f3ee3be43ce72">// get difference of smoothed IR signal</div><div class="notion-text notion-block-052f6b5809084b93a8890f028cd234b5">for( k=0; k&lt;BUFFER_SIZE-MA4_SIZE-1;  k++)</div><div class="notion-text notion-block-68cca245652b4ac69e5fd6915c2ba8d6">an_dx[k]= (an_x[k+1]- an_x[k]);</div><div class="notion-text notion-block-4be30499bc85431aadb1dfc16718ffb1">// 2-pt Moving Average to an_dx</div></div></details><div class="notion-text notion-block-1fcb5fe63e204918908f989c8ec5024f">for(k=0; k&lt; BUFFER_SIZE-MA4_SIZE-2; k++){<div class="notion-text-children"><div class="notion-text notion-block-ee450a67b60940e5b33598a9a698f374">an_dx[k] =  ( an_dx[k]+an_dx[k+1])/2 ;</div></div></div><div class="notion-text notion-block-c5f0a1b960a24d83b55368cd2725309a">}</div><div class="notion-text notion-block-f58095cce8df4feab059916debcd565d">// hamming window</div><div class="notion-text notion-block-1d19b6ff20fa4619bf5c518165bd0808">// flip wave form so that we can detect valley with peak detector</div><div class="notion-text notion-block-325e0d39194f4837b063f21ee4522b64">for ( i=0 ; i&lt;BUFFER_SIZE-HAMMING_SIZE-MA4_SIZE-2 ;i++){<div class="notion-text-children"><div class="notion-text notion-block-9dfbe869ca4d46a0aa1d2f1e24ab5b64">s= 0;</div><div class="notion-text notion-block-ed2078c0e4514bc29f9b64d989fa1ab5">for( k=i; k&lt;i+ HAMMING_SIZE ;k++){<div class="notion-text-children"><div class="notion-text notion-block-f98e706d795f4844b8ac48a75d7c35da">s -= an_dx[k] *auw_hamm[k-i] ; <div class="notion-text-children"><div class="notion-text notion-block-24a76f2c9f144a34a17f6d1badd720d5">}</div></div></div></div></div><div class="notion-text notion-block-be468c65cc174283bd224fca462da758">an_dx[i]= s/ (int32_t)1146; // divide by sum of auw_hamm </div></div></div><div class="notion-text notion-block-564f068b15e04718bae6aebc73d7ed0c">}</div><div class="notion-text notion-block-affa55de180541c1b5bdf3ae62714bfe">n_th1=0; // threshold calculation</div><div class="notion-text notion-block-4dcd99526d7d48f4b22bf0b137dbfe62">for ( k=0 ; k&lt;BUFFER_SIZE-HAMMING_SIZE ;k++){<div class="notion-text-children"><div class="notion-text notion-block-6f0a917b17f449689aae1adba13ed014">n_th1 += ((an_dx[k]&gt;0)? an_dx[k] : ((int32_t)0-an_dx[k])) ;</div></div></div><div class="notion-text notion-block-e1787c56e8af4160ae7848b37dc68079">}</div><div class="notion-text notion-block-2957383b1f494ac0b5f23ebde2d66cb2">n_th1= n_th1/ ( BUFFER_SIZE-HAMMING_SIZE);</div><div class="notion-text notion-block-eb01f65e22d849dba4dc3dfa9a0c110d">// peak location is acutally index for sharpest location of raw signal since we flipped the signal         </div><div class="notion-text notion-block-db43143bb47e47ff8dd587372e8d0eec">maxim_find_peaks( an_dx_peak_locs, &amp;n_npks, an_dx, BUFFER_SIZE-HAMMING_SIZE, n_th1, 8, 5 );//peak_height, peak_distance, max_num_peaks </div><div class="notion-text notion-block-b57c35f0953c4fbabe9cee4237309585">n_peak_interval_sum =0;</div><div class="notion-text notion-block-8a7c9da1d60646e6918d0f18cf9f5c01">if (n_npks&gt;=2){<div class="notion-text-children"><div class="notion-text notion-block-f24d09c24b2f4111be601a27a74048a4">for (k=1; k&lt;n_npks; k++)<div class="notion-text-children"><div class="notion-text notion-block-ea7855053725408eb351aacc2fec46ff">n_peak_interval_sum += (an_dx_peak_locs[k]-an_dx_peak_locs[k -1]);</div></div></div><div class="notion-text notion-block-6869b0765920402cb4ea303f89d9f56e">n_peak_interval_sum=n_peak_interval_sum/(n_npks-1);</div><div class="notion-text notion-block-18465f95320a4ac3a118c18c14625f37">*pn_heart_rate=(int32_t)(6000/n_peak_interval_sum);// beats per minutes</div><div class="notion-text notion-block-fda6f0b0077249adb3d4c852f58f0bb8">*pch_hr_valid  = 1;</div></div></div><div class="notion-text notion-block-8dcda443e3b0401c9f0d2f7c3a0bce11">}</div><div class="notion-text notion-block-b572156537ff4e8cb0260d15ed35e611">else  {<div class="notion-text-children"><div class="notion-text notion-block-b165763773e74fe9b71d5a5dbe1fff3d">*pn_heart_rate = -999;</div><div class="notion-text notion-block-6220e759485f4317935dbc3adb50bd2f">*pch_hr_valid  = 0;</div></div></div><div class="notion-text notion-block-02d29624ffc94874a2f457d1220244de">}</div><div class="notion-text notion-block-4871f8e86cbc452b89757e105e723123">for ( k=0 ; k&lt;n_npks ;k++)<div class="notion-text-children"><div class="notion-text notion-block-f882b720679b496c8904aaa7f5a77aaa">an_ir_valley_locs[k]=an_dx_peak_locs[k]+HAMMING_SIZE/2; </div></div></div><div class="notion-text notion-block-4197ce3ba79a4f9db5f7de9923b3fd5e">// raw value : RED(=y) and IR(=X)</div><div class="notion-text notion-block-746c0df513ea4c2e835ab8dfa0979657">// we need to assess DC and AC value of ir and red PPG. </div><div class="notion-text notion-block-f6475f9843984bbfbc81c0a04ec3448c">for (k=0 ; k&lt;n_ir_buffer_length ; k++ )  {<div class="notion-text-children"><div class="notion-text notion-block-420f278cd0274c58be1564d8ef2b4f98">an_x[k] =  pun_ir_buffer[k] ; </div><div class="notion-text notion-block-778df8070d5840e29d64562064b36d00">an_y[k] =  pun_red_buffer[k] ; </div></div></div><div class="notion-text notion-block-bdb8737143ca4879b7643d40b2f4d988">}</div><div class="notion-text notion-block-292189b0a5e6443495bf87a5e01c83b0">// find precise min near an_ir_valley_locs</div><div class="notion-text notion-block-971e3f61b0084a308b2e84632e8dd8da">n_exact_ir_valley_locs_count =0; </div><div class="notion-text notion-block-3f76a0f08cff42438018450d6c7600b8">for(k=0 ; k&lt;n_npks ;k++){<div class="notion-text-children"><div class="notion-text notion-block-19230251b8a7450289f50f41f1989ebb">un_only_once =1;</div><div class="notion-text notion-block-18662c0646e64733b469d31279e73035">m=an_ir_valley_locs[k];</div><div class="notion-text notion-block-722b181b91f64ed3a5ce21d19271a6da">n_c_min= 16777216;//2^24;<div class="notion-text-children"><div class="notion-text notion-block-bcae7f6e45ef4ba3b384f8ad67717922">if (m+5 &lt;  BUFFER_SIZE-HAMMING_SIZE  &amp;&amp; m-5 &gt;0){<div class="notion-text-children"><div class="notion-text notion-block-f21f2508bdd84cdf9dffcbb540817afa">for(i= m-5;i&lt;m+5; i++)<div class="notion-text-children"><div class="notion-text notion-block-c014e16acac3406ca04683c31729131e">if (an_x[i]&lt;n_c_min){<div class="notion-text-children"><div class="notion-text notion-block-5bfaa7b90faf4f42b88a41290ed26d12">if (un_only_once &gt;0){<div class="notion-text-children"><div class="notion-text notion-block-32a10b6db3e24945b8f6ec7a729320cb">un_only_once =0;</div></div></div><div class="notion-text notion-block-21f2ea5d72f74300ab6c96f8d41cba45">} </div><div class="notion-text notion-block-73504e0310d046d69267d9a01eb7e407">n_c_min= an_x[i] ;</div><div class="notion-text notion-block-36910e29a6644ba7b8daa2c93a586789">an_exact_ir_valley_locs[k]=i;</div></div></div><div class="notion-text notion-block-2496425edfc44ea1a7de19f1bfc1bae8">}</div></div></div><div class="notion-text notion-block-b77105b3e2ee418b915257c6ba87327b">if (un_only_once ==0)<div class="notion-text-children"><div class="notion-text notion-block-f92e76babc9349d087a6f333ba3f42e8">n_exact_ir_valley_locs_count ++ ;</div></div></div></div></div><div class="notion-text notion-block-47c59f34cdea4c6eb5838388da88f428">}</div><div class="notion-text notion-block-0d290e75b682406abdab08be9fcceb2f">}</div><div class="notion-text notion-block-a1089425953e4a90a33c049d5fabba55">if (n_exact_ir_valley_locs_count &lt;2 ){<div class="notion-text-children"><div class="notion-text notion-block-2333becc48c64e9597b419584742c343">*pn_spo2 =  -999 ; // do not use SPO2 since signal ratio is out of range</div><div class="notion-text notion-block-86f620fffa7340e4852c188b6b88026a">*pch_spo2_valid  = 0; </div><div class="notion-text notion-block-9960cb54a6f144bd9673d0d4105c97bd">return;</div></div></div><div class="notion-text notion-block-430503975bc849eeb9c1e1274b2986da">}</div><div class="notion-text notion-block-a1702e7576ae40b39ab3dd426c643e86">// 4 pt MA</div><div class="notion-text notion-block-dd6034c9d2884ed6bb12fa2d6514a00a">for(k=0; k&lt; BUFFER_SIZE-MA4_SIZE; k++){<div class="notion-text-children"><div class="notion-text notion-block-693d19dbf7554dea8e275c22fecd91da">an_x[k]=( an_x[k]+an_x[k+1]+ an_x[k+2]+ an_x[k+3])/(int32_t)4;</div><div class="notion-text notion-block-be7773e326b34a7e9ab85194f4e88c31">an_y[k]=( an_y[k]+an_y[k+1]+ an_y[k+2]+ an_y[k+3])/(int32_t)4;</div></div></div><div class="notion-text notion-block-23e584a12fd34041a5c0043b73457cd7">}</div><div class="notion-text notion-block-b7a6c448e9f34f27bc4a9fd10df669bb">//using an_exact_ir_valley_locs , find ir-red DC andir-red AC for SPO2 calibration ratio</div><div class="notion-text notion-block-6f3e4600659049d79269495c969352bb">//finding AC/DC maximum of raw ir * red between two valley locations</div><div class="notion-text notion-block-fe860c0cb54246d388ac3f5ebef54925">n_ratio_average =0; </div><div class="notion-text notion-block-7cd8283ba9024b23bf9c7cd52aa235f4">n_i_ratio_count =0; </div><div class="notion-text notion-block-70280f331b1940feba7de3937bfac341">for(k=0; k&lt; 5; k++) an_ratio[k]=0;</div><div class="notion-text notion-block-ea58adac36d140a08bd6b9ec38775e8d">for (k=0; k&lt; n_exact_ir_valley_locs_count; k++){<div class="notion-text-children"><div class="notion-text notion-block-5c75c3c175014c09b098fd139d95f441">if (an_exact_ir_valley_locs[k] &gt; BUFFER_SIZE ){             <div class="notion-text-children"><div class="notion-text notion-block-3691c82b1dc247b690d7403178bf6a5f">*pn_spo2 =  -999 ; // do not use SPO2 since valley loc is out of range</div><div class="notion-text notion-block-7d750d99a2d644739159da63e72686bb">*pch_spo2_valid  = 0; </div><div class="notion-text notion-block-21ddc4f131c14c4eb67befcc49473144">return;</div></div></div><div class="notion-text notion-block-82c2d9687cdd455699a2ccb9a7c91c1c">}</div></div></div><div class="notion-text notion-block-f3c08e0c9876479eb8a224104a568874">}</div><div class="notion-text notion-block-3ac5050687364f47953584ae8e706977">// find max between two valley locations </div><div class="notion-text notion-block-71afd354198a4a5c9b957209b61a1f57">// and use ratio betwen AC compoent of Ir &amp; Red and DC compoent of Ir &amp; Red for SPO2 </div><div class="notion-text notion-block-c9b9e6297c8443b6bbd862b466ea50c1">for (k=0; k&lt; n_exact_ir_valley_locs_count-1; k++){<div class="notion-text-children"><div class="notion-text notion-block-183324533ec54b17af877cf7b38a1d6c">n_y_dc_max= -16777216 ; </div><div class="notion-text notion-block-13ca4b36b1ea400eaaaeaf3c87248cf4">n_x_dc_max= - 16777216; </div><div class="notion-text notion-block-14834a7f7333428c8e71056124e0bf7f">if (an_exact_ir_valley_locs[k+1]-an_exact_ir_valley_locs[k] &gt;10){<div class="notion-text-children"><div class="notion-text notion-block-308b7b4fd2f74f0e91786d7537e81c57">for (i=an_exact_ir_valley_locs[k]; i&lt; an_exact_ir_valley_locs[k+1]; i++){<div class="notion-text-children"><div class="notion-text notion-block-2331e8eb831a49afaa0e064f09402232">if (an_x[i]&gt; n_x_dc_max) {n_x_dc_max =an_x[i];n_x_dc_max_idx =i; }</div><div class="notion-text notion-block-00568986acad42258df8db4d687a3a1c">if (an_y[i]&gt; n_y_dc_max) {n_y_dc_max =an_y[i];n_y_dc_max_idx=i;}</div></div></div><div class="notion-text notion-block-314162c59a0e4d3d865b8a18d6e52b95">}</div><div class="notion-text notion-block-d74a740d47064c45b34815bdadb09f91">n_y_ac= (an_y[an_exact_ir_valley_locs[k+1]] - an_y[an_exact_ir_valley_locs[k] ] )*(n_y_dc_max_idx -an_exact_ir_valley_locs[k]); //red</div><div class="notion-text notion-block-79329f9c003041c1aa8576fc66da4b9a">n_y_ac=  an_y[an_exact_ir_valley_locs[k]] + n_y_ac/ (an_exact_ir_valley_locs[k+1] - an_exact_ir_valley_locs[k])  ; </div><div class="notion-text notion-block-5f6215eeedb6435f83e2f6fbb7a6374f">n_y_ac=  an_y[n_y_dc_max_idx] - n_y_ac;    // subracting linear DC compoenents from raw </div><div class="notion-text notion-block-9e78ca72e9b54a33a5c465ea531cb3a0">n_x_ac= (an_x[an_exact_ir_valley_locs[k+1]] - an_x[an_exact_ir_valley_locs[k] ] )*(n_x_dc_max_idx -an_exact_ir_valley_locs[k]); // ir</div><div class="notion-text notion-block-e62dc096dd95402fba9bba5cf21602f8">n_x_ac=  an_x[an_exact_ir_valley_locs[k]] + n_x_ac/ (an_exact_ir_valley_locs[k+1] - an_exact_ir_valley_locs[k]); </div><div class="notion-text notion-block-ed40a3f428f943c4af693e3ab671d98e">n_x_ac=  an_x[n_y_dc_max_idx] - n_x_ac;      // subracting linear DC compoenents from raw </div><div class="notion-text notion-block-60855349f29f453c96eb96b5f27d5bd4">n_nume=( n_y_ac *n_x_dc_max)&gt;&gt;7 ; //prepare X100 to preserve floating value</div><div class="notion-text notion-block-58e8b60e38f94c14aa0610edd9e5242f">n_denom= ( n_x_ac *n_y_dc_max)&gt;&gt;7;</div><div class="notion-text notion-block-5c9a5a51ed964f65b2e3aed7ffb47983">if (n_denom&gt;0  &amp;&amp; n_i_ratio_count &lt;5 &amp;&amp;  n_nume != 0)</div><div class="notion-text notion-block-efbeac2490364796a6d6aa762b8d229f">{   <div class="notion-text-children"><div class="notion-text notion-block-fd1c9ccf40024592a4fd2c2fbb15954c">an_ratio[n_i_ratio_count]= (n_nume<em>100)/n_denom ; //formular is ( n_y_ac </em>n_x_dc_max) / ( n_x_ac *n_y_dc_max) ;</div><div class="notion-text notion-block-f8731bb6f0e841ccaed53f28005a74af">n_i_ratio_count++;</div></div></div><div class="notion-text notion-block-73b21f31bf794ce89dcfdf411d0b9958">}</div></div></div><div class="notion-text notion-block-0e6481c324bf4fb58d52170ebd9d574e">}</div></div></div><div class="notion-text notion-block-c35864cb12d145ea80de423bac68ddf1">}</div><div class="notion-text notion-block-80c4ea214808415bb4ce429414a02d51">maxim_sort_ascend(an_ratio, n_i_ratio_count);</div><div class="notion-text notion-block-0ded85ee43644c45b8bf2e005f61e22e">n_middle_idx= n_i_ratio_count/2;</div><div class="notion-text notion-block-67456908441f43a0a877666c2b0324e5">if (n_middle_idx &gt;1)<div class="notion-text-children"><div class="notion-text notion-block-a1163bb8a10247798b76bad462fd9a28">n_ratio_average =( an_ratio[n_middle_idx-1] +an_ratio[n_middle_idx])/2; // use median</div></div></div><div class="notion-text notion-block-bd17c5f20ac04a369a55004a628a24e1">else<div class="notion-text-children"><div class="notion-text notion-block-935c78b0707d46628d5fddfc54f01fac">n_ratio_average = an_ratio[n_middle_idx ];</div></div></div><div class="notion-text notion-block-96ec6341be6845ab8fa3407f40b363f5">if( n_ratio_average&gt;2 &amp;&amp; n_ratio_average &lt;184){<div class="notion-text-children"><div class="notion-text notion-block-357bc06d2f2240c2a0efe533bf033358">n_spo2_calc= uch_spo2_table[n_ratio_average] ;</div><div class="notion-text notion-block-bc378852d3324758b54c621254716345">*pn_spo2 = n_spo2_calc ;</div><div class="notion-text notion-block-b60cf3c8fcc444a6848de76a08f2d1b9"><em>pch_spo2_valid  = 1;//  float_SPO2 =  -45.060</em>n_ratio_average<em> n_ratio_average/10000 + 30.354 </em>n_ratio_average/100 + 94.845 ;  // for comparison with table</div></div></div><div class="notion-text notion-block-f07ad10f4f5746f0914e518364d53d0f">}</div><div class="notion-text notion-block-74f75e79f0204cfdbfb359c648e94eb8">else{<div class="notion-text-children"><div class="notion-text notion-block-53b72a28a2eb4e44aea86a899dcca91c">*pn_spo2 =  -999 ; // do not use SPO2 since signal ratio is out of range</div><div class="notion-text notion-block-b1506554ec4a4cff92632553001d21cf">*pch_spo2_valid  = 0; </div></div></div><div class="notion-text notion-block-07b4c0680ff54e9eb8299198d5561c2e">}</div></div></div></div></div></div></div><div class="notion-text notion-block-8efa3f372be5498998f5e1319914eb26">}</div><div class="notion-text notion-block-a89c8c3369f047c0a408131153f99ecd">void maxim_find_peaks(int32_t <em>pn_locs, int32_t </em>pn_npks, int32_t *pn_x, int32_t n_size, int32_t n_min_height, int32_t n_min_distance, int32_t n_max_num)</div><div class="notion-text notion-block-128d24f9782c41eda165ca58dfe10b32">/</div><ul class="notion-list notion-list-disc notion-block-24f6d1f6cc0d409d9d7694d9f0e47086"><li>brief        Find peaks</li></ul><ul class="notion-list notion-list-disc notion-block-fedb127d622d415283cb58c884030790"><li>par          Details</li></ul><ul class="notion-list notion-list-disc notion-block-4c4a49ecac124b14ae2090d750035b08"><li>Find at most MAX_NUM peaks above MIN_HEIGHT separated by at least MIN_DISTANCE</li></ul><ul class="notion-list notion-list-disc notion-block-16cac87697674ceba81470356d1d13a8"></ul><ul class="notion-list notion-list-disc notion-block-045660161a7248e6937f2546defc97fb"><li>retval       None</li></ul><div class="notion-text notion-block-da221f9e3f274235afca24ea87d8341a">*/</div><div class="notion-text notion-block-61d29d62e8e9441babc73e2cbb7bc0c8">{<div class="notion-text-children"><div class="notion-text notion-block-1418b4625d2149d78eb12e4d04165627">maxim_peaks_above_min_height( pn_locs, pn_npks, pn_x, n_size, n_min_height );</div><div class="notion-text notion-block-5b6d41cfbcb74a40888aa61e8d080b42">maxim_remove_close_peaks( pn_locs, pn_npks, pn_x, n_min_distance );</div><div class="notion-text notion-block-f4867a81ddbb4fb780f08a0a3b329222"><em>pn_npks = min( </em>pn_npks, n_max_num );</div></div></div><div class="notion-text notion-block-88742a2971a34f079e113eaf590ebbe7">}</div><div class="notion-text notion-block-9f1628550cf64c13b65f95c1ea308092">void maxim_peaks_above_min_height(int32_t <em>pn_locs, int32_t </em>pn_npks, int32_t  *pn_x, int32_t n_size, int32_t n_min_height)</div><div class="notion-text notion-block-4e85335e7dfc49fab5bd5dd87de831b7">/</div><ul class="notion-list notion-list-disc notion-block-8372b9734ea3447685f08ed3b04da2fc"><li>brief        Find peaks above n_min_height</li></ul><ul class="notion-list notion-list-disc notion-block-9144ac43a4224f3c8439913f18834f82"><li>par          Details</li></ul><ul class="notion-list notion-list-disc notion-block-52f060598d6f44c18498db96a25df5f3"><li>Find all peaks above MIN_HEIGHT</li></ul><ul class="notion-list notion-list-disc notion-block-8a396c05154d45279e009d04a05a9594"></ul><ul class="notion-list notion-list-disc notion-block-e7feebb08a35497588eba3e2ecc3529f"><li>retval       None</li></ul><div class="notion-text notion-block-e85f1b5924cb48f9b7ba8f2604b708f9">*/</div><div class="notion-text notion-block-3baa58dd344f4ffdbaadb42632e44cba">{<div class="notion-text-children"><div class="notion-text notion-block-d74bf69cca6241d1a8feacfc9de51205">int32_t i = 1, n_width;</div><div class="notion-text notion-block-7388b8469bc745c7948e16df272ad017">*pn_npks = 0;</div><div class="notion-text notion-block-2b85e88dc7254ef1808f6e21b461d5e1">while (i &lt; n_size-1){<div class="notion-text-children"><div class="notion-text notion-block-ac2ce8579bad453d9096bd8e64fd661f">if (pn_x[i] &gt; n_min_height &amp;&amp; pn_x[i] &gt; pn_x[i-1]){            // find left edge of potential peaks<div class="notion-text-children"><div class="notion-text notion-block-c39dd9260fba4ce8a85f370f04eb26ef">n_width = 1;</div><div class="notion-text notion-block-b009857dfd0249c68ce3cce93d46b3bb">while (i+n_width &lt; n_size &amp;&amp; pn_x[i] == pn_x[i+n_width])    // find flat peaks<div class="notion-text-children"><div class="notion-text notion-block-be940f60f18e4a629181c53d8704d77e">n_width++;</div></div></div><div class="notion-text notion-block-b4e47b95bbf94787ab6fa6c0703e269f">if (pn_x[i] &gt; pn_x[i+n_width] &amp;&amp; (*pn_npks) &lt; 15 ){                            // find right edge of peaks<div class="notion-text-children"><div class="notion-text notion-block-55e880839b224276972ed28d568fe388">pn_locs[(*pn_npks)++] = i;        </div><div class="notion-text notion-block-5075a35a0b584129842151d48d99b34a">// for flat peaks, peak location is left edge</div><div class="notion-text notion-block-1f970cb9790042d4b9a8f23ba9162b18">i += n_width+1;</div></div></div><div class="notion-text notion-block-fa14d0fef9c0448b94cf54bd420e70a3">}</div><div class="notion-text notion-block-70a3da4ba2c54c99aa15de83c3f0d03c">else<div class="notion-text-children"><div class="notion-text notion-block-1a9f106fef9f4bb39cd898a85634b40a">i += n_width;</div></div></div></div></div><div class="notion-text notion-block-f2e09a29b8844abda4734350d96940a3">}</div><div class="notion-text notion-block-844b871f395b441b85f2c31e8fe48b61">else<div class="notion-text-children"><div class="notion-text notion-block-6d57f7bc64e14f9e8d3473dc09c36458">i++;</div></div></div></div></div><div class="notion-text notion-block-a07f4c183f284a1f8fea820d7370cea9">}</div></div></div><div class="notion-text notion-block-6657e0b5c3c949b18bef04f9587e5e99">}</div><div class="notion-text notion-block-d24c4179201243bdbeb81f00354574ae">void maxim_remove_close_peaks(int32_t <em>pn_locs, int32_t </em>pn_npks, int32_t *pn_x, int32_t n_min_distance)</div><div class="notion-text notion-block-632a45066b7546d6ae15b29da57c4eb3">/</div><ul class="notion-list notion-list-disc notion-block-b022b762dc354e5ba3326dae609d7408"><li>brief        Remove peaks</li></ul><ul class="notion-list notion-list-disc notion-block-5cb7ec78502e4bfbac31b874e8dc9af9"><li>par          Details</li></ul><ul class="notion-list notion-list-disc notion-block-bf7f1485d3424d4080b50fb0f8d6a241"><li>Remove peaks separated by less than MIN_DISTANCE</li></ul><ul class="notion-list notion-list-disc notion-block-94b5e344baa14860a2ea27da02bfa396"></ul><ul class="notion-list notion-list-disc notion-block-aecf21456a9a4642899f3741152a4c60"><li>retval       None</li></ul><div class="notion-text notion-block-8f179820f8b445e4999af61692a66e9d">*/</div><div class="notion-text notion-block-efa5b56266374fa6b623d9d2773e3687">{<div class="notion-text-children"><div class="notion-text notion-block-6afb0684259d49feb1bab2b1b4a5665f">int32_t i, j, n_old_npks, n_dist;</div><div class="notion-text notion-block-4aeba0e0edf34502b30e05951c204108">/<em> Order peaks from large to small </em>/</div><div class="notion-text notion-block-ab6a03f2d1104e48975ad017328b2c68">maxim_sort_indices_descend( pn_x, pn_locs, *pn_npks );</div><div class="notion-text notion-block-d74a073e14b14fe48fdbc30fc1eb1838">for ( i = -1; i &lt; *pn_npks; i++ ){<div class="notion-text-children"><div class="notion-text notion-block-7996058e26b74cb1bda7879994363115">n_old_npks = *pn_npks;</div><div class="notion-text notion-block-d816ef3db591498d91f0d2a198c01b37">*pn_npks = i+1;</div><div class="notion-text notion-block-d9b22e5d906b40db81f4e0579f9ce262">for ( j = i+1; j &lt; n_old_npks; j++ ){<div class="notion-text-children"><div class="notion-text notion-block-a8f81c0f8b254fb88bdd07e0068d53ec">n_dist =  pn_locs[j] - ( i == -1 ? -1 : pn_locs[i] ); // lag-zero peak of autocorr is at index -1</div><div class="notion-text notion-block-2362625784b641388461c0b43890a9e2">if ( n_dist &gt; n_min_distance || n_dist &lt; -n_min_distance )<div class="notion-text-children"><div class="notion-text notion-block-279c1202cc2246978eb3202f8e3a5be4">pn_locs[(*pn_npks)++] = pn_locs[j];</div></div></div></div></div><div class="notion-text notion-block-d5dcdd709a854784b2faa2ff7a4819d9">}</div></div></div><div class="notion-text notion-block-762eca2c19034c5891b1e99fb764e405">}</div><div class="notion-text notion-block-ac998172358b41a88f3a5729fa2a1719">// Resort indices longo ascending order</div><div class="notion-text notion-block-f5024420ed184940ac0fa80eea4d8754">maxim_sort_ascend( pn_locs, *pn_npks );</div></div></div><div class="notion-text notion-block-977a87b8e85d40ad872bd8f6c153294c">}</div><div class="notion-text notion-block-424de5d9c4384bb393b4e46a4811384a">void maxim_sort_ascend(int32_t *pn_x,int32_t n_size) </div><div class="notion-text notion-block-813d5ea8e9654ab58da5ff74afaba8dc">/</div><ul class="notion-list notion-list-disc notion-block-b461f763be6c4f5d8ba755adbdf891c4"><li>brief        Sort array</li></ul><ul class="notion-list notion-list-disc notion-block-102b75cd2089482989a38b12f00c77ec"><li>par          Details</li></ul><ul class="notion-list notion-list-disc notion-block-5c6e5f8746784e648f3a1a6576e44c6f"><li>Sort array in ascending order (insertion sort algorithm)</li></ul><ul class="notion-list notion-list-disc notion-block-27a8c88c01194647bafa9cf8944c3d21"></ul><ul class="notion-list notion-list-disc notion-block-c8d7bc7877664d4daebf6b02ac7d6ab7"><li>retval       None</li></ul><div class="notion-text notion-block-b402a89013af4aa9a9508d6d6525a070">*/</div><div class="notion-text notion-block-de0ed6f9c59e42ecb39f61b9aa20e391">{<div class="notion-text-children"><div class="notion-text notion-block-73f8c15e14fd4d5c9524026981287f5c">int32_t i, j, n_temp;</div><div class="notion-text notion-block-844876c8a5b94f1283fc805b8fdba74d">for (i = 1; i &lt; n_size; i++) {<div class="notion-text-children"><div class="notion-text notion-block-a7dac60bebe84a96822aeb070d78df92">n_temp = pn_x[i];</div><div class="notion-text notion-block-5200dee320414eb1b78b005fd217e900">for (j = i; j &gt; 0 &amp;&amp; n_temp &lt; pn_x[j-1]; j--)<div class="notion-text-children"><div class="notion-text notion-block-21f984d25e3c400788ac334b983482ca">pn_x[j] = pn_x[j-1];</div></div></div><div class="notion-text notion-block-7d27b404ed2d4ee495c30d04f28dbd86">pn_x[j] = n_temp;</div></div></div><div class="notion-text notion-block-335835fbc3e0469399d1453c615c1526">}</div></div></div><div class="notion-text notion-block-830ad668abf040adb330f9021d041af7">}</div><div class="notion-text notion-block-ad53a9b5f515413593fe2cfce2438069">void maxim_sort_indices_descend(int32_t <em>pn_x, int32_t </em>pn_indx, int32_t n_size)</div><div class="notion-text notion-block-0ad0eb1ac7e843d8903be402deb68abf">/</div><ul class="notion-list notion-list-disc notion-block-3b0bbf332d484425b1db349085700340"><li>brief        Sort indices</li></ul><ul class="notion-list notion-list-disc notion-block-0ffbb8204e5e480089e28fcda5f7468a"><li>par          Details</li></ul><ul class="notion-list notion-list-disc notion-block-bf096828cb6e4ad79b5e6dcc0a23f851"><li>Sort indices according to descending order (insertion sort algorithm)</li></ul><ul class="notion-list notion-list-disc notion-block-43a81ae7589841298de81f763fb73f87"></ul><ul class="notion-list notion-list-disc notion-block-30bd1b7e76ae46ad82db74d3eac8e73a"><li>retval       None</li></ul><div class="notion-text notion-block-d8516be19e7744d6a48aced42fb1b3e9">*/ </div><div class="notion-text notion-block-5233a4191037453d9cf8b3a39713d6a7">{<div class="notion-text-children"><div class="notion-text notion-block-1f2a8ac2fa8b4b95980aff4bbe738461">int32_t i, j, n_temp;</div><div class="notion-text notion-block-6386e10b1dff4a1394333db4a02e72a5">for (i = 1; i &lt; n_size; i++) {<div class="notion-text-children"><div class="notion-text notion-block-d1a36207d4f649428a8b7b41fb9ba561">n_temp = pn_indx[i];</div><div class="notion-text notion-block-1073e81c830d41b89fe6706bf7357477">for (j = i; j &gt; 0 &amp;&amp; pn_x[n_temp] &gt; pn_x[pn_indx[j-1]]; j--)<div class="notion-text-children"><div class="notion-text notion-block-8fc395bb3f3246a5a9b033fe543ad416">pn_indx[j] = pn_indx[j-1];</div></div></div><div class="notion-text notion-block-27891bab7bb04f2fa322eb1236b41cc1">pn_indx[j] = n_temp;</div></div></div><div class="notion-text notion-block-d51cdd750e714673b7edfa87a51015dd">}</div></div></div><div class="notion-text notion-block-9fd90ee1a1b04823aa35c9fb811b884a">}</div><details class="notion-toggle notion-block-15d950dba65946a7b24403bb7c00ae69"><summary><h4 class="notion-h notion-h3 notion-h-indent-2 notion-block-15d950dba65946a7b24403bb7c00ae69" data-id="15d950dba65946a7b24403bb7c00ae69"><span><div id="15d950dba65946a7b24403bb7c00ae69" class="notion-header-anchor"></div><span class="notion-h-title"><b>main函数</b></span></span></h4></summary><div></div></details><div class="notion-text notion-block-e0c82d51e63c45cc8543fffb3cf98e8f">#include &quot;stm32f103c8t6.h&quot;</div><div class="notion-text notion-block-1a5e2a493d14462ea948c5dad264ba8e">#include &quot;mbed.h&quot;</div><div class="notion-text notion-block-fc500a6c200a41d0ba78983b256b4627">#include &quot;algorithm.h&quot;</div><div class="notion-text notion-block-ff9a212cb46745aeb7265a3e4f605c8d">#include &quot;MAX30102.h&quot;</div><div class="notion-text notion-block-dcdf1d68bb0a4829bf9ae48e9a24ed3b">#define MAX_BRIGHTNESS 255</div><div class="notion-text notion-block-9fe8348aa267470ba70c6f95ca414e5c">uint32_t aun_ir_buffer[500]; //IR LED sensor data</div><div class="notion-text notion-block-1de3306b901640b28f4883dde05a0fd7">int32_t n_ir_buffer_length;    //data length</div><div class="notion-text notion-block-775c1e12a2494ef1b6128ac9f7c4fafa">uint32_t aun_red_buffer[500];    //Red LED sensor data</div><div class="notion-text notion-block-18e8ce7443a4413687afb5df244e98fe">int32_t n_sp02; //SPO2 value</div><div class="notion-text notion-block-443bc206803743e1a02e880bc3703522">int8_t ch_spo2_valid;   //indicator to show if the SP02 calculation is valid</div><div class="notion-text notion-block-afb5ab69db4e4e8680fb62d26d7bf104">int32_t n_heart_rate;   //heart rate value</div><div class="notion-text notion-block-12151fa4af47428b8c720f50bebe0009">int8_t  ch_hr_valid;    //indicator to show if the heart rate calculation is valid</div><div class="notion-text notion-block-bfccfab7c0c945639196acd9eed1dfa0">uint8_t uch_dummy;</div><div class="notion-text notion-block-aed2e5d1d5cc438580fbd5db15022a8f">Serial pc(SERIAL_TX, SERIAL_RX);    //initializes the serial port, TX-PA2, RX-PA3</div><div class="notion-text notion-block-02d6f46cbc88439aa93613fb0b9ed406">PwmOut pwmled(PB_3);  //initializes the pwm output PB3 that connects to the LED</div><div class="notion-text notion-block-ae51d59ef1f44c25aa576410d3896662">DigitalIn INT(PB_7);  //pin PB7 connects to the interrupt output pin of the MAX30102</div><div class="notion-text notion-block-c4cb5d326c324cfd9f28e6021ac3c55a">DigitalOut led(PC_13); //PC13 connects to the on board user LED</div><div class="notion-text notion-block-735e3c64e20c4e9388d5745cecc09e43">// the setup routine runs once when you press reset:</div><div class="notion-text notion-block-413ca34e9cf84cef859349103cd2177e">int main() { <div class="notion-text-children"><div class="notion-text notion-block-4cfa66049f0a46efb414a39aeb11d342">uint32_t un_min, un_max, un_prev_data;  //variables to calculate the on-board LED brightness that reflects the heartbeats</div><div class="notion-text notion-block-44d7bee4ccbf4b6993cd131a0d681377">int i;</div><div class="notion-text notion-block-5c15186fe7ce405c9553978d8a994142">int32_t n_brightness;</div><div class="notion-text notion-block-751358b2854c42c7b4666e8dc332ca05">float f_temp;</div><div class="notion-text notion-block-40a1756e460943738fd46c33fb9594e8">maxim_max30102_reset(); //resets the MAX30102</div><div class="notion-text notion-block-939089cff20345f1974e279fe9643af9">// initialize serial communication at 115200 bits per second:</div><div class="notion-text notion-block-baa621ae62d6403d9457c065a894bf7e">pc.baud(115200);</div><div class="notion-text notion-block-1e9b09667f4e4b0481c8e3216ac41372">pc.format(8,SerialBase::None,1);</div><div class="notion-text notion-block-4e2638b77dda4e779d195823705b4068">wait(1);</div><div class="notion-text notion-block-9f26bffe0e63447ba1378fe12804601e">//read and clear status register</div><div class="notion-text notion-block-306271d107a44f8086acf33c3481f060">maxim_max30102_read_reg(0,&amp;uch_dummy);</div><div class="notion-text notion-block-58025b66a5ae4269a6d3a82112cad206">//wait until the user presses a key</div></div></div><div class="notion-text notion-block-40245004902743d8a298154914c82aa4">//    while(pc.readable()==0)</div><div class="notion-text notion-block-a217621635fd4ae6a2c7f6ab1653d841">//    {</div><div class="notion-text notion-block-979d3115bfc1466f88c568cf08d6fb49">//        pc.printf(&quot;x1B[2J&quot;);  //clear terminal program screen</div><div class="notion-text notion-block-c82e25121bbd46bc9f8a59548aaae03e">//        pc.printf(&quot;Press any key to start conversionnr&quot;);</div><div class="notion-text notion-block-6eb129190dfd4096b19e1a14fdec4c80">//        wait(1);</div><div class="notion-text notion-block-d53fd935ed0e4418bf9952dace566baf">//    }</div><div class="notion-text notion-block-93db5db42b7d413dbe050bf8b6f1c8ff">//    uch_dummy=getchar();<div class="notion-text-children"><div class="notion-text notion-block-35d6dd2c578c44769cd0ac7cf1948c70">maxim_max30102_init();  //initializes the MAX30102</div><div class="notion-text notion-block-fad79a0a868244c4953e0dd221247778">n_brightness=0;</div><div class="notion-text notion-block-516ac0cab2904126ac00f084bb8e8336">un_min=0x3FFFF;</div><div class="notion-text notion-block-01ea3332c4f94e57a87671b4d95458fa">un_max=0;</div><div class="notion-text notion-block-0c2d8ad9a6b444a49c597fda118777a3">n_ir_buffer_length=500; //buffer length of 100 stores 5 seconds of samples running at 100sps</div><div class="notion-text notion-block-051dc8de7cb04afca71f7dd1ced179f4">//read the first 500 samples, and determine the signal range</div><div class="notion-text notion-block-26290b9530ee45b89e884d7717ce0406">for(i=0;i&lt;n_ir_buffer_length;i++)</div><div class="notion-text notion-block-2561b8f1c1d94d8086f65c99b7fa8a3f">{<div class="notion-text-children"><div class="notion-text notion-block-4619f8ec959348ca971094040245b7fd">while(<a class="notion-link" href="http://INT.read" target="_blank" rel="noopener noreferrer">INT.read</a>()==1);   //wait until the interrupt pin asserts</div><div class="notion-text notion-block-9d9132f58f2c475d9e174433bb146f82">maxim_max30102_read_fifo((aun_red_buffer+i), (aun_ir_buffer+i));  //read from MAX30102 FIFO</div><div class="notion-text notion-block-e66ac188d11040098384c1063d808ceb">if(un_min&gt;aun_red_buffer[i])<div class="notion-text-children"><div class="notion-text notion-block-538216b9dde741d79ba731d778fbe84e">un_min=aun_red_buffer[i];    //update signal min</div></div></div><div class="notion-text notion-block-a3d842c0aee64fc9a4bc59653c26fb67">if(un_max&lt;aun_red_buffer[i])<div class="notion-text-children"><div class="notion-text notion-block-d6ff2c7f5cd5402da6988f8882f7131a">un_max=aun_red_buffer[i];    //update signal max</div></div></div><div class="notion-text notion-block-89e843ad48074c87b5b7d2c95700f1cf">pc.printf(&quot;red=&quot;);</div><div class="notion-text notion-block-f01aa66dc46043e7b9839dc0920df733">pc.printf(&quot;%i&quot;, aun_red_buffer[i]);</div><div class="notion-text notion-block-9136e3807e6742e7b88aa22a1ba57553">pc.printf(&quot;, ir=&quot;);</div><div class="notion-text notion-block-e056de0a55df4264b4f84e4e877f54cf">pc.printf(&quot;%inr&quot;, aun_ir_buffer[i]);</div></div></div><div class="notion-text notion-block-5bd53040584f44d28ba996933e232023">}</div><div class="notion-text notion-block-0f58526a930a44e49401e066c6c4ec1b">un_prev_data=aun_red_buffer[i];</div><div class="notion-text notion-block-adf4c1bf35774f97b0d3eb3a65cd6603">//calculate heart rate and SpO2 after first 500 samples (first 5 seconds of samples)</div><div class="notion-text notion-block-bc150b2160784417a3656b99d1f2b89e">maxim_heart_rate_and_oxygen_saturation(aun_ir_buffer, n_ir_buffer_length, aun_red_buffer, &amp;n_sp02, &amp;ch_spo2_valid, &amp;n_heart_rate, &amp;ch_hr_valid); </div><div class="notion-text notion-block-23d44ef755f94823842b4d4e2fe2dc7f">//Continuously taking samples from MAX30102.  Heart rate and SpO2 are calculated every 1 second</div><div class="notion-text notion-block-09e2c4978f1c4237961427798db3ee4e">while(1)</div><div class="notion-text notion-block-b960a1ca651348f99011ee64ca164320">{<div class="notion-text-children"><div class="notion-text notion-block-5743a2abc6c5413eae6de66312204cab">i=0;</div><div class="notion-text notion-block-fd776aa309504bac932c3cebcc6b6794">un_min=0x3FFFF;</div><div class="notion-text notion-block-aa9bb98235b644eaa138b5e725dd539d">un_max=0;</div><div class="notion-text notion-block-f8394d7586854956ac8ea33ae918249a">//dumping the first 100 sets of samples in the memory and shift the last 400 sets of samples to the top</div><div class="notion-text notion-block-240d22a79aaa47a8828dae4e6ec118a5">for(i=100;i&lt;500;i++)</div><div class="notion-text notion-block-112de7e9e9e4412a9f4461fc09f4d1ec">{<div class="notion-text-children"><div class="notion-text notion-block-a135de34ec2646bf86defe96b0b0f8a0">aun_red_buffer[i-100]=aun_red_buffer[i];</div><div class="notion-text notion-block-307cbd22227c4c96a4e1e8e18ff00f3d">aun_ir_buffer[i-100]=aun_ir_buffer[i];</div><div class="notion-text notion-block-ce6d3f7dda3548b69434f976dec9433d">//update the signal min and max</div><div class="notion-text notion-block-47193a162e7248aa9489444480138a7e">if(un_min&gt;aun_red_buffer[i])</div><div class="notion-text notion-block-8afa19b313c443049266e77a774d8a88">un_min=aun_red_buffer[i];</div><div class="notion-text notion-block-ed80baeafad74894bbcc7f508956c47d">if(un_max&lt;aun_red_buffer[i])</div><div class="notion-text notion-block-9cfb8ea1d71f4c028a3b8621c704991b">un_max=aun_red_buffer[i];</div></div></div><div class="notion-text notion-block-ae7f623fda3547faa9665450b121c3d6">}</div><div class="notion-text notion-block-ae70606b59d8466b97e74040755e33a4">//take 100 sets of samples before calculating the heart rate.</div><div class="notion-text notion-block-f78df28e49a64cbbb5d2163f08b31e97">for(i=400;i&lt;500;i++)</div><div class="notion-text notion-block-0f60067c5dbd414795ab1b7dfd178c7e">{<div class="notion-text-children"><div class="notion-text notion-block-6a39c3b5421f40429a8eba11176c7cea">un_prev_data=aun_red_buffer[i-1];</div><div class="notion-text notion-block-6838f053009e4265aa6067ece683c37e">while(<a class="notion-link" href="http://INT.read" target="_blank" rel="noopener noreferrer">INT.read</a>()==1);</div><div class="notion-text notion-block-3d8c87e0402940d6ac571a921f7b95b1">maxim_max30102_read_fifo((aun_red_buffer+i), (aun_ir_buffer+i));</div><div class="notion-text notion-block-0804a311513d48c683b1326b899cbacb">if(aun_red_buffer[i]&gt;un_prev_data)//just to determine the brightness of LED according to the deviation of adjacent two AD data</div><div class="notion-text notion-block-863cba7f5f864966ab94b2df2b23102f">{<div class="notion-text-children"><div class="notion-text notion-block-91198afccf894876a74f13f755294089">f_temp=aun_red_buffer[i]-un_prev_data;</div><div class="notion-text notion-block-e441fe90170e43fdaf27e2f78094fc0d">f_temp/=(un_max-un_min);</div><div class="notion-text notion-block-8c60a70c755641c48e6e3d346728a8a7">f_temp*=MAX_BRIGHTNESS;</div><div class="notion-text notion-block-a2a368e2c00d474088a78594cc66949c">n_brightness-=(int)f_temp;</div><div class="notion-text notion-block-8b4a0dcd61d2485789a80cd7913e12d2">if(n_brightness&lt;0)<div class="notion-text-children"><div class="notion-text notion-block-1aba452976cd4fe8942462c0f4025009">n_brightness=0;</div></div></div></div></div><div class="notion-text notion-block-c5089413c13a4bbaa3b80e6ffee8194e">}</div><div class="notion-text notion-block-87637596d6274cfc8d2530f0ce8cf463">else</div><div class="notion-text notion-block-d6849c2f48b24149822719b3eb40b44d">{<div class="notion-text-children"><div class="notion-text notion-block-7c7ba22408d2403f8ea6d5cb6dc74df4">f_temp=un_prev_data-aun_red_buffer[i];</div><div class="notion-text notion-block-488d9665e07a4b48920241be83ceb15e">f_temp/=(un_max-un_min);</div><div class="notion-text notion-block-d2224cb66e524d6e9df62ef1ab28731c">f_temp*=MAX_BRIGHTNESS;</div><div class="notion-text notion-block-367fefd672444b1797a56e8a4882eccc">n_brightness+=(int)f_temp;</div><div class="notion-text notion-block-5559f7d86494494a86fbcfb5a8ab3c78">if(n_brightness&gt;MAX_BRIGHTNESS)<div class="notion-text-children"><div class="notion-text notion-block-40fbcc2da1754d648c9dca1e86271ca3">n_brightness=MAX_BRIGHTNESS;</div></div></div></div></div><div class="notion-text notion-block-ac290a3a59cd4694a36a8e1b5971408b">}</div><div class="notion-text notion-block-5c21cf2d5d4e41879b7868978ae24ca9">pwmled.write(1-(float)n_brightness/256);//pwm control led brightness</div></div></div><div class="notion-text notion-block-d491910350ce469886087b4a27977d9b">if(n_brightness&lt;120)<div class="notion-text-children"><div class="notion-text notion-block-e7a1b56a58e24361a799f808fb9c3843">led=1;</div></div></div><div class="notion-text notion-block-5887c229966a4f7c9f0bb2005e38a4ea">else<div class="notion-text-children"><div class="notion-text notion-block-0ac239d15cde4b50b079b201a8975272">led=0;<div class="notion-text-children"><div class="notion-text notion-block-911baa05b4c4443b8a88f0058299a700">//send samples and calculation result to terminal program through UART</div><div class="notion-text notion-block-39ce30e7f5d040199740d7b633cf1a61">pc.printf(&quot;red=&quot;);<div class="notion-text-children"><div class="notion-text notion-block-b5a2207c16604ef1b1d15ec692c59c80">pc.printf(&quot;%i&quot;, aun_red_buffer[i]);</div><div class="notion-text notion-block-4b33e550830d47beae0a1801d2ea191f">pc.printf(&quot;, ir=&quot;);</div><div class="notion-text notion-block-7739bafc06ac4d3abd018e3bf54928b1">pc.printf(&quot;%i&quot;, aun_ir_buffer[i]);</div><div class="notion-text notion-block-d24a924110b84ef3b0e0b599507e0a38">pc.printf(&quot;, HR=%i, &quot;, n_heart_rate); </div><div class="notion-text notion-block-f14db5857b614cc8b661bfb231619ad1">pc.printf(&quot;HRvalid=%i, &quot;, ch_hr_valid);</div><div class="notion-text notion-block-1dc5ad178894468c803691fba65cca89">pc.printf(&quot;SpO2=%i, &quot;, n_sp02);</div><div class="notion-text notion-block-2f0c2b6eff2f4d2d9e7039e78e366737">pc.printf(&quot;SPO2Valid=%inr&quot;, ch_spo2_valid);</div><div class="notion-text notion-block-5d9d8b02d45340cfad2724ba2583b14c">}</div><div class="notion-text notion-block-b24c87b1ff1a46cd8bc8f935d43aa61c">maxim_heart_rate_and_oxygen_saturation(aun_ir_buffer, n_ir_buffer_length, aun_red_buffer, &amp;n_sp02, &amp;ch_spo2_valid, &amp;n_heart_rate, &amp;ch_hr_valid); </div></div></div><div class="notion-text notion-block-d71441b2f4a549199ae30d7363c98e70">}</div></div></div></div></div></div></div></div></div><div class="notion-text notion-block-1f406ae5ae8a4b7d944cacec4503ebc8">}<div class="notion-text-children"><div class="notion-text notion-block-5c820acb17f84fa6bff9b89478d7c14c">将输出数据转成曲线</div><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-5381d1899a6c4e11809be67ad6fd2b1c"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:100%;max-width:100%;flex-direction:column"><img style="object-fit:cover" src="https://cdn.jsdmirror.com/gh/LZJ-I/picx-images-hosting@main/images/%E5%B5%8C%E5%85%A5%E5%BC%8F%E8%BD%AF%E4%BB%B6%E5%BC%80%E5%8F%91/Post-MAX30102/c277bc22-31e8-432e-a54a-24dfd149c446-image.webp?spaceId=3a565fcb-f425-4846-b72a-d32a98183896&amp;t=5381d189-9a6c-4e11-809b-e67ad6fd2b1c" alt="notion image" loading="lazy" decoding="async"/></div></figure></div></div><details class="notion-toggle notion-block-6277448befa347d184381f1c063c3a0f"><summary><h3 class="notion-h notion-h2 notion-h-indent-1 notion-block-6277448befa347d184381f1c063c3a0f" data-id="6277448befa347d184381f1c063c3a0f"><span><div id="6277448befa347d184381f1c063c3a0f" class="notion-header-anchor"></div><span class="notion-h-title">个人驱动</span></span></h3></summary><div><details class="notion-toggle notion-block-8e3795b1a6d8418fb09d29ae7091bad9"><summary><h4 class="notion-h notion-h3 notion-block-8e3795b1a6d8418fb09d29ae7091bad9" data-id="8e3795b1a6d8418fb09d29ae7091bad9"><span><div id="8e3795b1a6d8418fb09d29ae7091bad9" class="notion-header-anchor"></div><span class="notion-h-title">main函数</span></span></h4></summary><div></div></details></div></details><div class="notion-text notion-block-1127da8e0ca4499b9a1643f7485da222">#include &quot;stm32f10x.h&quot;</div><div class="notion-text notion-block-329b3085d0864f20a623828d8f51de3b">#include &quot;usart.h&quot;</div><div class="notion-text notion-block-fad681f5f4a7472c9773df54fde720d8">#include &quot;delay.h&quot;</div><div class="notion-text notion-block-af41e3b3948a4588a741750b28c532f4">#include &quot;max30102.h&quot;</div><div class="notion-text notion-block-58e0f4a43f424f2da85be84e2bca19e0">#include &quot;myiic.h&quot;</div><div class="notion-text notion-block-700ab84d76324786815619abf95d6a47">#include &quot;algorithm.h&quot;</div><div class="notion-text notion-block-1873b8efee0a47df9868f7e740e78b0d">#include &quot;oled_iic.h&quot;</div><div class="notion-text notion-block-f0843e975e6d4b6fa362b78906b670fd">#define MAX_BRIGHTNESS 255</div><div class="notion-text notion-block-6784380aca454fd29a8706ecbf144170">u32 aun_ir_buffer[500];//IR LED sensor data</div><div class="notion-text notion-block-88f70f39f8df4d9694d3cad5ab5afe83">int32_t n_ir_buffer_length; //数据长度</div><div class="notion-text notion-block-e3a37a1e5c1f4e29bd96960f68dedfcd">u32 aun_red_buffer[500]; //Red LED sensor data</div><div class="notion-text notion-block-66b5d2b2155e43128bc0653a649a6dcf">int32_t n_sp02; //SPO2 value</div><div class="notion-text notion-block-45ab70cee96d4c798fafb6ecb07f532a">int8_t ch_spo2_valid;   //indicator to show if the SP02 calculation is valid</div><div class="notion-text notion-block-b97d19ae9a6e43b287108ef6c7a465e8">int32_t n_heart_rate;   //heart rate value</div><div class="notion-text notion-block-6c21d9b262e14559a2a1b3a6c7da2262">int8_t  ch_hr_valid;    //indicator to show if the heart rate calculation is valid</div><div class="notion-text notion-block-e20668a6b6c84b63b1b16125cc68b51c">int main(void)</div><div class="notion-text notion-block-4010c280e2924788a970cedcd3b96fa0">{<div class="notion-text-children"><div class="notion-text notion-block-ade2fec66f7f43f393f410cd2ddf0e14">u8 t = 0;  // 初始化一个计数变量t，用于计数，初始值为0</div><div class="notion-text notion-block-5c60aa3777834996948460f2c8013b93">u32 un_min, un_max, un_prev_data;  // 初始化三个32位无符号整数，用于存储信号的最小值、最大值和上一个数据</div><div class="notion-text notion-block-e9558447140b4119a145a0ba160d326a">int32_t n_brightness;  // 初始化一个32位有符号整数，用于表示亮度调整</div><div class="notion-text notion-block-59854aaab2a449e5bf5f0ae6c011a5dd">u16 i;  // 初始化一个16位无符号整数i，用于循环计数</div><div class="notion-text notion-block-637abf6733c24f9a94c5ffdccd185965">u8 temp[6];  // 初始化一个长度为6的无符号字符数组，用于存储传感器采样的数据</div><div class="notion-text notion-block-02a82df4540f45ef80dfaa2101f33bef">float f_temp;  // 初始化一个单精度浮点数，用于存储临时的浮点型数据</div><div class="notion-text notion-block-242caf9a394643dba81a27cdb76de2c3">u8 dis_hr = 0, dis_spo2 = 0;  // 初始化两个8位无符号整数，用于表示心率和血氧饱和度的显示值</div><div class="notion-text notion-block-455af3c71d1847deb2554c7a78466985">delay_init();  // 调用延时函数的初始化，初始化延时功能</div><div class="notion-text notion-block-37baac68193e4403b70c0b59d87f5597">HZ = GB16_NUM();  // 获取GB16字体的数量</div><div class="notion-text notion-block-debadc9300ab46c08436c96c6c0d0b07">delay_ms(50);  // 进行短暂的延时，等待系统初始化</div><div class="notion-text notion-block-2c0a255ca38e4516aa15076ddec0a7f0">OLED_Init();  // 初始化OLED显示屏</div><div class="notion-text notion-block-aceea295e6b44da58cbca8a99e1cc4d2">delay_ms(50);  // 进行短暂的延时，等待OLED初始化完成</div><div class="notion-text notion-block-3b65686130fe4667bb574255b592f7b6">OLED_Clear();  // 清除OLED屏幕上的内容</div><div class="notion-text notion-block-191ee99437324b13973cbda6731904be">delay_ms(50);  // 进行短暂的延时，等待清屏完成</div><div class="notion-text notion-block-e550425c84774d469ebd07a8a7ce605c">OLED_ShowCH(16,2,&quot;心率:000&quot;);</div><div class="notion-text notion-block-2acd9ffa46f2463891c9f28a3591d8df">OLED_ShowCH(16,4,&quot;血氧:000%&quot;);</div><div class="notion-text notion-block-0694e8ce41b54b26a3aac0ea1f0575b7">uart_init(115200);</div><div class="notion-text notion-block-7d9b7207dd894d119fd7a3093fce7f20">MX_GPIO_Init();</div><div class="notion-text notion-block-9a6c16f4f51a46b5b3e835d73601ee60">max30102_init();</div><div class="notion-text notion-block-3bd74c12ad0e4eed96ca0563c54f17ad">un_min = 0x3FFFF;  // 初始化信号最小值为一个较大的初始值</div><div class="notion-text notion-block-69250ea93f7b4b67a7bd466b1626e07b">un_max = 0;        // 初始化信号最大值为0</div><div class="notion-text notion-block-7aa82a16a1774d5cadd2d1622a559cf8">n_ir_buffer_length = 500;  // 缓冲区长度为500，存储5秒运行时的100sps采样数据</div><div class="notion-text notion-block-63994ac3a7554609bb91c5a05b9e1035">// 读取前500个样本，确定信号范围</div><div class="notion-text notion-block-e435b3f031a54e21bc0230edd67565d4">for(i = 0; i &lt; n_ir_buffer_length; i++)</div><div class="notion-text notion-block-1194b4c6d1464183a60571e12bd74397">{<div class="notion-text-children"><div class="notion-text notion-block-22c71a9fd1364f28930dafb346ad407a">while(MAX30102_INT == 1);  // 等待直到中断引脚触发中断</div><div class="notion-text notion-block-6f4c256796854eefb9b4657730b5e716">//读取心率血氧传感器（max30102）的FIFO（First In, First Out）数据，然后解析这些数据并将其存储在相应的缓冲区中。</div><div class="notion-text notion-block-66c6707eae3f499990e914bb376bc925">//调用max30102_FIFO_ReadBytes函数从max30102的FIFO寄存器中读取6个字节的数据，存储在名为temp的数组中。</div><div class="notion-text notion-block-2c62906aba054fc48d139ae321719004">max30102_FIFO_ReadBytes(REG_FIFO_DATA, temp);</div><div class="notion-text notion-block-589fa088ae4045a3a3b5ddefe4ff9bc9">//将temp数组的前三个字节组合成一个32位的长整型，用于存储红光传感器的数据。这个数据的组合方式是:</div><div class="notion-text notion-block-44e9aa9e3eb349899cfb2131e63743fb">//将temp[0]的低两位（temp[0] &amp; 0x03）左移16位，然后与temp[1]左移8位的结果以及temp[2]的结果进行按位或运算。</div><div class="notion-text notion-block-37d22e94908f4340a36360c5d6ea86d3">aun_red_buffer[i] = (long)((long)((long)temp[0] &amp; 0x03) &lt;&lt; 16) | (long)temp[1] &lt;&lt; 8 | (long)temp[2];</div><div class="notion-text notion-block-8caf3d76ef264adbb29a4cfd25afae0a">//将temp数组的后三个字节组合成一个32位的长整型，用于存储红外光传感器的数据。这个数据的组合方式与红光传感器类似。</div><div class="notion-text notion-block-45974891bdd34185b9c0ceed6a2c0a80">aun_ir_buffer[i] = (long)((long)((long)temp[3] &amp; 0x03) &lt;&lt; 16) | (long)temp[4] &lt;&lt; 8 | (long)temp[5];</div><div class="notion-text notion-block-08d9d4fdccf34ec984c4534a1def85e3">if(un_min &gt; aun_red_buffer[i])<div class="notion-text-children"><div class="notion-text notion-block-cff6e6d6fed34665b18f57e8e1361156">un_min = aun_red_buffer[i];  // 更新信号最小值</div></div></div><div class="notion-text notion-block-bfa0c651a46248f09e0d0b0cf6dcc5e6">if(un_max &lt; aun_red_buffer[i])<div class="notion-text-children"><div class="notion-text notion-block-27326d1f96a64519b57a13bb5e482241">un_max = aun_red_buffer[i];  // 更新信号最大值</div></div></div></div></div><div class="notion-text notion-block-7967dadbfd4145b49e930f14e8c41ade">}</div><div class="notion-text notion-block-f7f12d0a7fcb467a814865cb9a49a27b">un_prev_data = aun_red_buffer[i];  // 记录最后一个样本值</div><div class="notion-text notion-block-8827acd464304e539f0defb5113899f6">// 在前500个样本（5秒的样本）之后，计算心率和血氧饱和度</div><div class="notion-text notion-block-ebdbe54b96df42939396205a5378822a">maxim_heart_rate_and_oxygen_saturation(aun_ir_buffer, n_ir_buffer_length, aun_red_buffer, &amp;n_sp02, &amp;ch_spo2_valid, &amp;n_heart_rate, &amp;ch_hr_valid);</div><div class="notion-text notion-block-995d81c93a9a4867bf22e03a9e258c1e">while(1)</div><div class="notion-text notion-block-8bfdc4314927457b875de45319ad2e6c">{<div class="notion-text-children"><div class="notion-text notion-block-49fb7e9219ec4020a5ab25621b6fb778">i = 0;</div><div class="notion-text notion-block-237b5e5f6bb749b2a0ffed2d4febea2a">un_min = 0x3FFFF;</div><div class="notion-text notion-block-e1286a64e89241a297b84a1e11de45ce">un_max = 0;</div><div class="notion-text notion-block-7c7e5c47f86646ac8c5ce48766e285df">// 将内存中的前100组样本丢弃，将最后400组样本移动到数组的前面</div><div class="notion-text notion-block-ab19b0a14d5e4eb8a4098d6aa60b0417">for(i = 100; i &lt; 500; i++)</div><div class="notion-text notion-block-edf15f11824d48239e49589dc6839a6f">{<div class="notion-text-children"><div class="notion-text notion-block-dac08a3a4801483bb7197a002ed71d25">aun_red_buffer[i - 100] = aun_red_buffer[i];</div><div class="notion-text notion-block-f3a90953310049a29dfcb5f37a2bc9e1">aun_ir_buffer[i - 100] = aun_ir_buffer[i];</div><div class="notion-text notion-block-0dc7c4ec5f694bd49956c53c2927fb6f">// 更新信号的最小值和最大值</div><div class="notion-text notion-block-33f69852b9d84b4e8b8b88d2cf99d8dd">if(un_min &gt; aun_red_buffer[i])<div class="notion-text-children"><div class="notion-text notion-block-ade82cf4d31a40dfaa784f406f55b9f7">un_min = aun_red_buffer[i];</div></div></div><div class="notion-text notion-block-5db99d92b1df4462b8ab2f62888452cd">if(un_max &lt; aun_red_buffer[i])<div class="notion-text-children"><div class="notion-text notion-block-928a2a627bf44f9c92b5f7a9274a58ef">un_max = aun_red_buffer[i];</div></div></div></div></div><div class="notion-text notion-block-b3a546e586dd4d148054f492c5918cb2">}</div><div class="notion-text notion-block-ce5b4822e17e412d9f9e08bf3e212a3c">// 取得计算心率之前的100组样本</div><div class="notion-text notion-block-83db488be8614360be6b32afeb8c9ce8">for(i = 400; i &lt; 500; i++)</div><div class="notion-text notion-block-3455e92880ef46588715554d1d68983a">{<div class="notion-text-children"><div class="notion-text notion-block-a9708facbf8c4be9b2297dba92d8bc76">un_prev_data = aun_red_buffer[i - 1];</div><div class="notion-text notion-block-ff2b7c781c364794bd86dcf9dbd77f5a">while(MAX30102_INT == 1);</div><div class="notion-text notion-block-73cc706f6c184e998053f681e4ca171d">max30102_FIFO_ReadBytes(REG_FIFO_DATA, temp);</div><div class="notion-text notion-block-a23f0c3a6d1c4f53ac226e9fb6e2c55e">aun_red_buffer[i] = (long)((long)((long)temp[0] &amp; 0x03) &lt;&lt; 16) | (long)temp[1] &lt;&lt; 8 | (long)temp[2];</div><div class="notion-text notion-block-b5003308d5bc4bd6a4b6d0eee1a0fdb3">aun_ir_buffer[i] = (long)((long)((long)temp[3] &amp; 0x03) &lt;&lt; 16) | (long)temp[4] &lt;&lt; 8 | (long)temp[5];</div><div class="notion-text notion-block-d3ba646aa0204d4a95d39d770a2e26d0">if(aun_red_buffer[i] &gt; un_prev_data)</div><div class="notion-text notion-block-dd6df1449ecb41c0ab5453568e711e21">{<div class="notion-text-children"><div class="notion-text notion-block-dc53db075ee244e2a609caefdb693e99">f_temp = aun_red_buffer[i] - un_prev_data;</div><div class="notion-text notion-block-81fe0709cc7c4854a667adf5ab8273a0">f_temp /= (un_max - un_min);</div><div class="notion-text notion-block-f316ef3b6734437e91b28aaad3f8d8f2">f_temp *= MAX_BRIGHTNESS;</div><div class="notion-text notion-block-b767cc2c7ca94fa098ef7ddfb62e68d2">n_brightness -= (int)f_temp;</div><div class="notion-text notion-block-28cc07b465ac4af1a2fd37dc2d0a5a46">if(n_brightness &lt; 0)<div class="notion-text-children"><div class="notion-text notion-block-5cfe2774d7d945c0a46062d6f967f02a">n_brightness = 0;</div></div></div></div></div><div class="notion-text notion-block-7ddeddac08b54efcb00f41c126e69bc9">}</div><div class="notion-text notion-block-c0e1a26456b848479b733798a73e1329">else</div><div class="notion-text notion-block-10ab1aef23ff4c5ab2d899c73ce91349">{<div class="notion-text-children"><div class="notion-text notion-block-50660e6146f04e18994fa1aa6b12cc62">f_temp = un_prev_data - aun_red_buffer[i];</div><div class="notion-text notion-block-e36e778b97984522a8ade5814d3b8586">f_temp /= (un_max - un_min);</div><div class="notion-text notion-block-fdf4c90f9fc648718cdb5316e29be433">f_temp *= MAX_BRIGHTNESS;</div><div class="notion-text notion-block-4b0f2c0372304473ac695a580c2e132c">n_brightness += (int)f_temp;</div><div class="notion-text notion-block-f7034b9bd1ef446a998575b131591154">if(n_brightness &gt; MAX_BRIGHTNESS)<div class="notion-text-children"><div class="notion-text notion-block-27fb3a0d322447a0b181f370716c33ce">n_brightness = MAX_BRIGHTNESS;</div></div></div></div></div><div class="notion-text notion-block-f166e46828ad4b5bb3854920154c5b95">}</div><div class="notion-text notion-block-339debfc65d4428e84f325c6ccd85ac9">// 将样本和计算结果通过UART发送到终端程序</div><div class="notion-text notion-block-3cf16143c36c4122990f7e8dcc0cba0a">if((ch_hr_valid == 1))  // ch_hr_valid == 1 &amp;&amp; ch_spo2_valid ==1 &amp;&amp; n_heart_rate&lt;120 &amp;&amp; n_sp02&lt;101</div><div class="notion-text notion-block-cfb5cbb1119f4b6ab00d35c96f7ea9f6">{<div class="notion-text-children"><div class="notion-text notion-block-07011e6da4b34529b432de9000c499d9">if(n_heart_rate &lt; 120)<div class="notion-text-children"><div class="notion-text notion-block-d660ff09bbd44da095217eac7f449835">dis_hr = n_heart_rate;</div></div></div><div class="notion-text notion-block-d57107ccacd946afa79cc7f97b415925">else<div class="notion-text-children"><div class="notion-text notion-block-a953a8bac8e54912a1260298f582a4f7">dis_hr = 0;</div></div></div><div class="notion-text notion-block-ca97e00f53b6483e9383245b4f361391">dis_spo2 = n_sp02;</div></div></div><div class="notion-text notion-block-99d852dfa0ad46c78863b20b125bc189">}</div><div class="notion-text notion-block-b8188d6b59cc4ee68e388f949779df05">else</div><div class="notion-text notion-block-f066e3f7bb214088b59cbebf6a3ba990">{<div class="notion-text-children"><div class="notion-text notion-block-3f9081dac28d42ec990573ad58a2397f">dis_hr = 0;</div><div class="notion-text notion-block-5c4bf3165ff64b60be45f9c8d2dc0b4d">dis_spo2 = 0;</div></div></div><div class="notion-text notion-block-959d9df1e8224d0cb186fba7b6444b43">}</div><div class="notion-text notion-block-03058287c34541fdba9b127b29280b2f">t++;</div><div class="notion-text notion-block-4e309881b5074ad2a3dc3b3354d9ef17">if(t &gt; 10)</div><div class="notion-text notion-block-7384a77513d944119c1399b57c0a2a8d">{<div class="notion-text-children"><div class="notion-text notion-block-bd1c8a448d574d5f991257d5e8e3ed21">t = 0;</div><div class="notion-text notion-block-0c9fa3d601244516b00d28ac15b55507">printf(&quot;HR=%i,SpO2=%irn &quot;, dis_hr, dis_spo2);</div></div></div><div class="notion-text notion-block-36b4fa1b22034fb68e8e9cb5e9002a0e">}</div><div class="notion-text notion-block-d57647dcb89a4173b2570d70ee9ac9ed">OLED_ShowNum(56, 2, dis_hr, 3, 1);</div><div class="notion-text notion-block-55be55811581480285a1fc1c43bae934">OLED_ShowNum(56, 4, dis_spo2, 3, 1);</div></div></div><div class="notion-text notion-block-53d33f7e567e454b96d1833e35171f9d">}</div><div class="notion-text notion-block-617e7c7a00974be4a932fb45f74224b6">// 调用函数计算心率和血氧饱和度，并通过OLED显示</div><div class="notion-text notion-block-4568b5627e7946a5b570bc592a6436f7">maxim_heart_rate_and_oxygen_saturation(aun_ir_buffer, n_ir_buffer_length, aun_red_buffer, &amp;n_sp02, &amp;ch_spo2_valid, &amp;n_heart_rate, &amp;ch_hr_valid);</div><div class="notion-text notion-block-94e184ade02c4ef985d12a4bb8fea0f5">delay_ms(200);</div></div></div><div class="notion-text notion-block-163dc2f2667046deb3db7a7a90522e07">}</div></div></div><div class="notion-text notion-block-dd5fbe19f43b40e4a28cdf1d36aff3dd">}<div class="notion-text-children"><details class="notion-toggle notion-block-8d5df56a9b014c9d8d96c074a8184b33"><summary><h4 class="notion-h notion-h3 notion-block-8d5df56a9b014c9d8d96c074a8184b33" data-id="8d5df56a9b014c9d8d96c074a8184b33"><span><div id="8d5df56a9b014c9d8d96c074a8184b33" class="notion-header-anchor"></div><span class="notion-h-title"><b>max30102.h</b></span></span></h4></summary><div><div class="notion-text notion-block-62f08818ce7149f09332a3194e36d59a">#ifndef __MAX30102_H</div><div class="notion-text notion-block-4349b61b62804c3bb593cb644a291eb2">#define __MAX30102_H</div><div class="notion-text notion-block-0d34b3f2a5fe442da00deace47ffe39a">#include &quot;sys.h&quot;</div></div></details></div></div><div class="notion-text notion-block-b6b6831c254a4a43a91582213c3f710a">// 	  </div><div class="notion-text notion-block-bbcdd72e8707485ca6e4d8b7571d7faa">#define MAX30102_INT PBin(9)</div><div class="notion-text notion-block-42e93e044adc408889bc36c955ebcb6d">#define I2C_WR	0		/<em> 写控制bit </em>/</div><div class="notion-text notion-block-a315dddec5664bd6aa923f02517f4d49">#define I2C_RD	1		/<em> 读控制bit </em>/</div><div class="notion-text notion-block-7c4395e7bdf74191aa71095bdd34133c">#define max30102_WR_address 0xAE</div><div class="notion-text notion-block-2a35d0806adf41f5859918fb3e8da130">#define I2C_WRITE_ADDR 0xAE</div><div class="notion-text notion-block-f46dde52abcb4388ad5725907c32f96c">#define I2C_READ_ADDR 0xAF</div><div class="notion-text notion-block-c610cf84bddc48619d232b6c1ad2fd5b">//register addresses</div><div class="notion-text notion-block-577bafd84abe4a85bf477cdc18878d4d">#define REG_INTR_STATUS_1 0x00</div><div class="notion-text notion-block-e1df3cfac8e14ee8b319f1c80819ff6b">#define REG_INTR_STATUS_2 0x01</div><div class="notion-text notion-block-92a09e7387b64d01b6b3f24cc3c638a8">#define REG_INTR_ENABLE_1 0x02</div><div class="notion-text notion-block-a8e1a1b2d5464d34b2d5e8d6673f5f25">#define REG_INTR_ENABLE_2 0x03</div><div class="notion-text notion-block-53c1b5a4e17c4f98883703c5bf61b8d1">#define REG_FIFO_WR_PTR 0x04</div><div class="notion-text notion-block-1f3f5fdd5e8c4878851121b5c0d78485">#define REG_OVF_COUNTER 0x05</div><div class="notion-text notion-block-09b38259359d42de8517b3e037251a2a">#define REG_FIFO_RD_PTR 0x06</div><div class="notion-text notion-block-fef33ec292ba4746b66bd55569f723f9">#define REG_FIFO_DATA 0x07</div><div class="notion-text notion-block-591603c31e6a4b29b559f8b6802b1caf">#define REG_FIFO_CONFIG 0x08</div><div class="notion-text notion-block-4d5edeaa315542d5aa82235908b763a2">#define REG_MODE_CONFIG 0x09</div><div class="notion-text notion-block-158cc42ab9e34f74848afe1fb0885c23">#define REG_SPO2_CONFIG 0x0A</div><div class="notion-text notion-block-0694b08402544a8ba3ed34380c261c4f">#define REG_LED1_PA 0x0C</div><div class="notion-text notion-block-a190073299fe48b6ac55a5702796fb9e">#define REG_LED2_PA 0x0D</div><div class="notion-text notion-block-a1b9aecd2f13445d8045ab09f43aadaf">#define REG_PILOT_PA 0x10</div><div class="notion-text notion-block-cda70377b8f04cd79e5c4e5bdb1d44d8">#define REG_MULTI_LED_CTRL1 0x11</div><div class="notion-text notion-block-f47bdfa8149447d9b75ad61e9c2ff905">#define REG_MULTI_LED_CTRL2 0x12</div><div class="notion-text notion-block-ec9e230de4a54451853dd0edaa66876f">#define REG_TEMP_INTR 0x1F</div><div class="notion-text notion-block-099f2ac9a4194fb1ae86bbd2e0a3a10e">#define REG_TEMP_FRAC 0x20</div><div class="notion-text notion-block-77f3eef035b047148678121cd9c05409">#define REG_TEMP_CONFIG 0x21</div><div class="notion-text notion-block-495caac347b54ea9a01ad1e64ba7724f">#define REG_PROX_INT_THRESH 0x30</div><div class="notion-text notion-block-621405ad1dd648409658e1728cd73247">#define REG_REV_ID 0xFE</div><div class="notion-text notion-block-49658b1f00d0458caabad9283c2b3f15">#define REG_PART_ID 0xFF</div><div class="notion-text notion-block-553346d1208041409fedea30ec5f6ec5">void MX_GPIO_Init(void);</div><div class="notion-text notion-block-1c397dd1d6b04f30b4191b663fc69d04">void max30102_init(void);  </div><div class="notion-text notion-block-a5b3e498c52540f88c7a59793b9b829e">void max30102_reset(void);</div><div class="notion-text notion-block-9064c53d6ae1453b9c7f50a3706678cc">u8 max30102_Bus_Write(u8 Register_Address, u8 Word_Data);</div><div class="notion-text notion-block-436c3a69ebad42f3834b7a066ddc4798">u8 max30102_Bus_Read(u8 Register_Address);</div><div class="notion-text notion-block-35a8a251c4464be09f0803893d65fe1a">void max30102_FIFO_ReadWords(u8 Register_Address,u16  Word_Data[][2],u8 count);</div><div class="notion-text notion-block-61dfc3a93b3f4a96a2044460ad36656d">void max30102_FIFO_ReadBytes(u8 Register_Address,u8* Data);</div><div class="notion-text notion-block-74890c280c15425e8b1abc7693a32ea7">void maxim_max30102_write_reg(uint8_t uch_addr, uint8_t uch_data);</div><div class="notion-text notion-block-b92e57ec0f514cf1928bd946c8748a39">void maxim_max30102_read_reg(uint8_t uch_addr, uint8_t *puch_data);</div><div class="notion-text notion-block-4cb1766fae824cc391abbd1aea144a58">void maxim_max30102_read_fifo(uint32_t <em>pun_red_led, uint32_t </em>pun_ir_led);</div><div class="notion-text notion-block-266210eacbcf4694b0a08795fe65277f">#endif<div class="notion-text-children"><details class="notion-toggle notion-block-58e996dab508485a922080ce497be4b4"><summary><h4 class="notion-h notion-h3 notion-block-58e996dab508485a922080ce497be4b4" data-id="58e996dab508485a922080ce497be4b4"><span><div id="58e996dab508485a922080ce497be4b4" class="notion-header-anchor"></div><span class="notion-h-title"><b>max30102.c</b></span></span></h4></summary><div><div class="notion-text notion-block-7fd6973577bf468f90db2bdbab7135e5">#include &quot;max30102.h&quot;</div><div class="notion-text notion-block-fa97795ea2124734b17b9193a7ac80f9">#include &quot;myiic.h&quot;</div><div class="notion-text notion-block-e064f52182ac45acbde1115fae886b64">#include &quot;delay.h&quot;</div></div></details></div></div><div class="notion-text notion-block-45de6e0b44ac4f01914640a8eeb56c06">// 初始化GPIO配置</div><div class="notion-text notion-block-a6cdaa463aa540fb919a46c57231adb8">void MX_GPIO_Init()</div><div class="notion-text notion-block-496861b347454883b68fb60cb2b2396f">{<div class="notion-text-children"><div class="notion-text notion-block-5d6cfd1cafb54d6b8ac22b9e42826c28">GPIO_InitTypeDef GPIO_InitStructure;</div><div class="notion-text notion-block-37abca2c44f44f729c48ac80066f5112">RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);//GPIOB</div><div class="notion-text notion-block-e1533c5aa6c24955941deabf9691d35d">GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;</div><div class="notion-text notion-block-8b7b3b7687e8409caabd95e4e9f2073a">GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7|GPIO_Pin_8;</div><div class="notion-text notion-block-ebb2e5b16ecc48c9bfc2aa96dcb21fde">GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;</div><div class="notion-text notion-block-35836660cff44225acfdcef9fc36a0b5">GPIO_Init(GPIOB, &amp;GPIO_InitStructure);</div><div class="notion-text notion-block-047ed905a0994d9e90fbc3f110824d54">GPIO_ResetBits(GPIOB, GPIO_Pin_7|GPIO_Pin_8);</div><div class="notion-text notion-block-4565281adaca4648b6f4c6b24f82e64d">GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;</div><div class="notion-text notion-block-8451dc670083455c8594ca8e1e55c176">GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;</div><div class="notion-text notion-block-9eabe616c75b4a95b5ca80dd2395f59e">GPIO_Init(GPIOB, &amp;GPIO_InitStructure);	</div></div></div><div class="notion-text notion-block-63715d8ad8f6485fbae04e4d56adc8f8">}</div><div class="notion-text notion-block-fae6d0a3c1cf43cfb111198e9db5793c">// 通过I2C总线写入数据</div><div class="notion-text notion-block-baf70ac577a94dc4a73cb04fde041c14">u8 max30102_Bus_Write(u8 Register_Address, u8 Word_Data)</div><div class="notion-text notion-block-2c053670ba1948e99fd52cef7d5d0913">{<div class="notion-text-children"><div class="notion-text notion-block-6d43af004b384f4d8a637661bd2ad5a4">// 采用串行EEPROM随即读取指令序列，连续读取若干字节</div><div class="notion-text notion-block-ccab2ec9f65f42c5bcb2bf1edaa051e7">// 第1步：发起I2C总线启动信号</div><div class="notion-text notion-block-63697536da9f4c228478f23bfebe0ad9">iic_Start();</div><div class="notion-text notion-block-78a662e918254be085aef6176a88bea9">// 第2步：发起控制字节，高7bit是地址，bit0是读写控制位，0表示写，1表示读</div><div class="notion-text notion-block-4f21bfe83bc64b83921c5706e3d925dd">iic_Send_Byte(max30102_WR_address | I2C_WR);	// 此处是写指令</div><div class="notion-text notion-block-b4f2f503729e4b5e9a7eb37f74cd19cb">// 第3步：发送ACK</div><div class="notion-text notion-block-96b5dc5769a147d7aaec08366cbfa473">if (iic_Wait_Ack() != 0)</div><div class="notion-text notion-block-43dd4987d3694d30a08cb8b7fd52dad2">{<div class="notion-text-children"><div class="notion-text notion-block-36cdbf5f26b7466192e291bb240ea43c">goto cmd_fail;	// EEPROM器件无应答</div></div></div><div class="notion-text notion-block-7f4faf7fbdb44ecba84dd168554b699a">}</div><div class="notion-text notion-block-8f9d4b32eaf64cbda1fbf3787812320b">// 第4步：发送字节地址</div><div class="notion-text notion-block-8b17a8ed484e4a61b24a8ecf5872a11d">iic_Send_Byte(Register_Address);</div><div class="notion-text notion-block-243245acd8f040d7992d88172e31ab15">if (iic_Wait_Ack() != 0)</div><div class="notion-text notion-block-19f624f2d01f4e3483e2f6f59b51a6e6">{<div class="notion-text-children"><div class="notion-text notion-block-c5f792c2977340d0b90318c9f9617352">goto cmd_fail;	// EEPROM器件无应答</div></div></div><div class="notion-text notion-block-8dd3a3ae2a5146c9b05c747a4fe49211">}</div><div class="notion-text notion-block-7710dd5d847a428e8ca227d5b355aac0">// 第5步：开始写入数据</div><div class="notion-text notion-block-b6d1736bb7f5497b8870ef378ef95be5">iic_Send_Byte(Word_Data);</div><div class="notion-text notion-block-adad0e2264194907a893de27419cd322">// 第6步：发送ACK<div class="notion-text-children"><div class="notion-text notion-block-6b9d0b6140f44119a5361a5282072deb">if (iic_Wait_Ack() != 0)</div><div class="notion-text notion-block-cd9e14168e4e491ebc5c52194ea3aba6">{<div class="notion-text-children"><div class="notion-text notion-block-f1d8a18898c34efbb9b5e81d8ff7f14c">goto cmd_fail;	// EEPROM器件无应答</div></div></div><div class="notion-text notion-block-82d341b4d69646a29a422b0ec3766f14">}</div><div class="notion-text notion-block-42203e7f65004d528bf066d74416a1fe">// 发送I2C总线停止信号</div><div class="notion-text notion-block-c2f60f0fa2dc445a9ca7bd1ccf3b87c3">iic_Stop();</div><div class="notion-text notion-block-5fba4a48eb8a425584d4c40bce6d0648">return 1;	// 执行成功</div></div></div></div></div><div class="notion-text notion-block-5d8ac87fdb2d414788b6ba082cdd7a92">cmd_fail: // 命令执行失败后，切记发送停止信号，避免影响I2C总线上其他设备<div class="notion-text-children"><div class="notion-text notion-block-013b69c5554f4107a6e8a016d402866d">// 发送I2C总线停止信号</div><div class="notion-text notion-block-8a37df5a09fc40239c5f0eb31837cb00">iic_Stop();</div><div class="notion-text notion-block-f185e52fca5a4677b1268317bf903d5a">return 0;</div></div></div><div class="notion-text notion-block-5ad94673406b4415ad7e2548cafe014b">}</div><div class="notion-text notion-block-a80253890c9643ef9943bbdcb9acc7e6">// 通过I2C总线读取数据</div><div class="notion-text notion-block-6520eddabd0b4aa5909fb6ab7454ab9b">u8 max30102_Bus_Read(u8 Register_Address)</div><div class="notion-text notion-block-f3e8e5cdb0844c04a1f31ef75a6c0daa">{<div class="notion-text-children"><div class="notion-text notion-block-c68574b8c9714ffcb9edc955001d507c">u8 data;</div><div class="notion-text notion-block-95a4923de211471480536fb9962a8102">// 第1步：发起I2C总线启动信号</div><div class="notion-text notion-block-5a652435d0e241e78fa59c36fd85a87b">iic_Start();</div><div class="notion-text notion-block-132c80905dcc441b9db260a17753a8f6">// 第2步：发起控制字节，高7bit是地址，bit0是读写控制位，0表示写，1表示读</div><div class="notion-text notion-block-5e04b8839368458982329f759a51e4b0">iic_Send_Byte(max30102_WR_address | I2C_WR);	// 此处是写指令</div><div class="notion-text notion-block-dc5d4ad438094d87b9642c4e01ef4586">// 第3步：发送ACK</div><div class="notion-text notion-block-a73b303688cd4ef088e7cbd0bfe602a9">if (iic_Wait_Ack() != 0)</div><div class="notion-text notion-block-f8f1d873f6be493c9f81803201373ab8">{<div class="notion-text-children"><div class="notion-text notion-block-e82ea2f0f26e409f90d0412955b50828">goto cmd_fail;	// EEPROM器件无应答</div></div></div><div class="notion-text notion-block-0a838feed2494522880ae61d82c8bda9">}</div><div class="notion-text notion-block-0c00847f584043dcb87f38fc0fb37304">// 第4步：发送字节地址</div><div class="notion-text notion-block-61fa29c432fc4777859da9f8d628fa93">iic_Send_Byte((uint8_t)Register_Address);</div><div class="notion-text notion-block-3e7fb37b5a6e4766b94eb64c07e6f39f">if (iic_Wait_Ack() != 0)</div><div class="notion-text notion-block-c830808fe3e94f1392d0ffc6aaa37bb9">{<div class="notion-text-children"><div class="notion-text notion-block-556fbb69c17942869d17e3ea2ce433b1">goto cmd_fail;	// EEPROM器件无应答</div></div></div><div class="notion-text notion-block-7ee4baf0afec4b59a94f37d6a74ad062">}</div><div class="notion-text notion-block-745a395cf8b94d078b2d78d4af413e10">// 第6步：重新启动I2C总线。下面开始读取数据</div><div class="notion-text notion-block-e47ac5aac85f40b3a85cc1b516ae6539">iic_Start();</div><div class="notion-text notion-block-f69b3fe3751843dbb76fafa6082808b6">// 第7步：发起控制字节，高7bit是地址，bit0是读写控制位，0表示写，1表示读</div><div class="notion-text notion-block-dc7672259a55476eb4f74bf0efe5885e">iic_Send_Byte(max30102_WR_address | I2C_RD);	// 此处是读指令</div><div class="notion-text notion-block-7ee056ee7d76416cb8879b8164c1c125">// 第8步：发送ACK</div><div class="notion-text notion-block-fbf4f11373f34df98fd331f80859cefe">if (iic_Wait_Ack() != 0)</div><div class="notion-text notion-block-4199c7c7686b49f8bc3a20aa948710ff">{<div class="notion-text-children"><div class="notion-text notion-block-8afe094da09d49d8a84d8d5ad6f72c50">goto cmd_fail;	// EEPROM器件无应答</div></div></div><div class="notion-text notion-block-459a8b04021245e6bf02330364c9be27">}</div><div class="notion-text notion-block-f626444711fd41c08ffe79ef7262a8d1">// 第9步：读取数据</div><div class="notion-text notion-block-753b8bdc7c534cf78f12a0dd4989b64d">{<div class="notion-text-children"><div class="notion-text notion-block-4d429ad27c174cb3b77786c48cab5158">data = iic_Read_Byte(0);	// 读1个字节</div><div class="notion-text notion-block-5603ec2157074734bfffcedf58f52f2c">iic_NAck();	// 最后1个字节读完后，CPU产生NACK信号(驱动SDA = 1)</div></div></div><div class="notion-text notion-block-8caa481d21154e5fac6ab930b9d1f77f">}</div><div class="notion-text notion-block-3f3d009959de473eaffaf0657af6f76f">// 发送I2C总线停止信号</div><div class="notion-text notion-block-5476664d50054e69a3c45111a555fb90">iic_Stop();</div><div class="notion-text notion-block-5afa9e24a31944d0a7df02e811716acb">return data;	// 执行成功 返回data值</div></div></div><div class="notion-text notion-block-457133ad989144b0b305b8937cabcc84">cmd_fail: // 命令执行失败后，切记发送停止信号，避免影响I2C总线上其他设备<div class="notion-text-children"><div class="notion-text notion-block-5fe8b4e323de482faea492d6c9dc1788">// 发送I2C总线停止信号</div><div class="notion-text notion-block-0ba9bbc0eb5543e58219de42b0e76ce6">iic_Stop();</div><div class="notion-text notion-block-ad2bf2b78abb424fb6559f386b61e7f2">return 0;</div></div></div><div class="notion-text notion-block-3e46d54bcaed4c8382d49115e51a0fc1">}</div><div class="notion-text notion-block-4eece17e78524774b43e8f4c49165072">// 通过I2C总线读取多个字节的数据</div><div class="notion-text notion-block-330af6e9b33742cc9c9bd9f08095c0a6">void max30102_FIFO_ReadWords(u8 Register_Address, u16 Word_Data[][2], u8 count)</div><div class="notion-text notion-block-3c422d37347540f0aac30f7df678abe4">{<div class="notion-text-children"><div class="notion-text notion-block-fba0c68da120475d89b7e0f4e810ef9c">u8 i = 0;</div><div class="notion-text notion-block-da7e0f984d844b98a4600f8f04567b23">u8 no = count;</div><div class="notion-text notion-block-6893250732fb4b2ebfc5b446572fe7a1">u8 data1, data2;</div><div class="notion-text notion-block-138fba133b0345b496f44c491d534c9c">// 第1步：发起I2C总线启动信号</div><div class="notion-text notion-block-970e8a15892c477796985a9daf892bfb">iic_Start();</div><div class="notion-text notion-block-9e388a4c0b59423abc91c99c1fa92261">// 第2步：发起控制字节，高7bit是地址，bit0是读写控制位，0表示写，1表示读</div><div class="notion-text notion-block-d4235400e03c43c89883744362dd1ba0">iic_Send_Byte(max30102_WR_address | I2C_WR);	// 此处是写指令</div><div class="notion-text notion-block-80b3966c658a4d4ea80defe0b1d4fb4a">// 第3步：发送ACK</div><div class="notion-text notion-block-69d9ef9064ad4d1b9dd05cc6ca67aac4">if (iic_Wait_Ack() != 0)</div><div class="notion-text notion-block-e58555d0f41f4ddb9dd7576d4036b75b">{<div class="notion-text-children"><div class="notion-text notion-block-d79989113ef04f549cb21d257a86e04c">goto cmd_fail;	// EEPROM器件无应答</div></div></div><div class="notion-text notion-block-80394e4f88d64db4803bbfe0f5828b0b">}</div><div class="notion-text notion-block-468185102aa44668a7b73f79135ef83b">// 第4步：发送字节地址</div><div class="notion-text notion-block-caa3ce9f1d1c48c39ff1d436e2fd62c0">iic_Send_Byte((uint8_t)Register_Address);</div><div class="notion-text notion-block-f4ec443787d441978a74bffe70968d12">if (iic_Wait_Ack() != 0)</div><div class="notion-text notion-block-0f23de5d5d6147fd93c1b83d2d69007a">{<div class="notion-text-children"><div class="notion-text notion-block-ac65b04cc2f4476fb4204f5ca836a50a">goto cmd_fail;	// EEPROM器件无应答</div></div></div><div class="notion-text notion-block-c19c4ada0b1845a0bdda9045906cc752">}</div><div class="notion-text notion-block-3dcc9f020ab14a1687e1103af53fc89d">// 第6步：重新启动I2C总线。下面开始读取数据</div><div class="notion-text notion-block-2eadbaac7f9f4d5982311f5e08aefb87">iic_Start();</div><div class="notion-text notion-block-191a9b430b024ecab835aab3571ede7a">// 第7步：发起控制字节，高7bit是地址，bit0是读写控制位，0表示写，1表示读</div><div class="notion-text notion-block-99c15883ea2e4565a5913f9f7fda39c1">iic_Send_Byte(max30102_WR_address | I2C_RD);	// 此处是读指令</div><div class="notion-text notion-block-cc97a7910c5b43eeb33ff77b2d1b58d1">// 第8步：发送ACK</div><div class="notion-text notion-block-be410d706ae04536ad1e1490a3876f0a">if (iic_Wait_Ack() != 0)</div><div class="notion-text notion-block-e6d1fedce2924b1399b12c0f8569a752">{<div class="notion-text-children"><div class="notion-text notion-block-981c51ae02ca44ceaa155f24a20272a2">goto cmd_fail;	// EEPROM器件无应答</div></div></div><div class="notion-text notion-block-9378baf314724902a686f1486c26181b">}</div><div class="notion-text notion-block-f84a25d3cb7046f88ea834b1a8492bbe">// 第9步：读取数据</div><div class="notion-text notion-block-60b0ae4ad2e14cf7958bd3f748e66928">while (no)</div><div class="notion-text notion-block-21689e40323a4a2a9f1e1e51bf88d5ac">{<div class="notion-text-children"><div class="notion-text notion-block-68d9577773ca4c55b72cb54e160c9983">data1 = iic_Read_Byte(0);	</div><div class="notion-text notion-block-b3cb9c883ddc4074ab23ac3f878974bd">iic_Ack();</div><div class="notion-text notion-block-d5da9c87468145d4b719292b73ddaa87">data2 = iic_Read_Byte(0);</div><div class="notion-text notion-block-1d288c2013644e8696ae69e40da0a67e">iic_Ack();</div><div class="notion-text notion-block-436bedf019a44900b3efc560a9a9b9e2">Word_Data[i][0] = (((u16)data1 &lt;&lt; 8) | data2);  //</div><div class="notion-text notion-block-eed17a5f9e91472e82d8dfddc875a878">data1 = iic_Read_Byte(0);	</div><div class="notion-text notion-block-05632d165a9748728724f9e3041d60cc">iic_Ack();</div><div class="notion-text notion-block-b5cc42c5f82e404a82e829fbf5dbf3ae">data2 = iic_Read_Byte(0);</div><div class="notion-text notion-block-11d7ad831cf2469da6111a2044d10abe">if (1 == no)<div class="notion-text-children"><div class="notion-text notion-block-ff1caa34803c47ec867bb92d91d134a9">iic_NAck();	// 最后1个字节读完后，CPU产生NACK信号(驱动SDA = 1)</div></div></div><div class="notion-text notion-block-de8a86e9ca584f98b6c481a6f0f432a8">else<div class="notion-text-children"><div class="notion-text notion-block-224c4ae66f29458d91f3ef8688a4cbd9">iic_Ack();</div></div></div><div class="notion-text notion-block-3f9e9b4c2a6d438bbb8f7a45e0822456">Word_Data[i][1] = (((u16)data1 &lt;&lt; 8) | data2); </div><div class="notion-text notion-block-c8c454d66f634a818cb9355f940871e0">no--;	</div><div class="notion-text notion-block-b83bec09969e4f31a0d804eb71871bf3">i++;</div></div></div><div class="notion-text notion-block-cd45e78063e8472682294b94867271c7">}</div><div class="notion-text notion-block-525e313837cd48e69bd294c75ffc4df7">// 发送I2C总线停止信号</div><div class="notion-text notion-block-ae7ed517722247ab8e3eaecedad206c8">iic_Stop();</div></div></div><div class="notion-text notion-block-dbf18476e1224baea14b1349427c990e">cmd_fail: // 命令执行失败后，切记发送停止信号，避免影响I2C总线上其他设备<div class="notion-text-children"><div class="notion-text notion-block-0bc3eb7ed0ab4003ad1493705895770c">// 发送I2C总线停止信号</div><div class="notion-text notion-block-f4a52cc0adec49948b8b365c237975fb">iic_Stop();</div></div></div><div class="notion-text notion-block-85637d7b524b4fdaab2eaea297e6c76b">}</div><div class="notion-text notion-block-b601d0428834429a8725fb4cbcf5cbb9">// 通过I2C总线读取字节数据</div><div class="notion-text notion-block-590c76359fd7448292c9827a3fad1c78">void max30102_FIFO_ReadBytes(u8 Register_Address, u8* Data)</div><div class="notion-text notion-block-6125d2ffe03240b1b5e1ab1efc3f09f5">{	<div class="notion-text-children"><div class="notion-text notion-block-707fa8c6c2a64af3b97e4f3c18f451b7">max30102_Bus_Read(REG_INTR_STATUS_1);</div><div class="notion-text notion-block-4d5be1dd3fbe400f8f65b225e53c1277">max30102_Bus_Read(REG_INTR_STATUS_2);</div><div class="notion-text notion-block-5970640282564388a72f33f54788feca">// 第1步：发起I2C总线启动信号</div><div class="notion-text notion-block-82c12ee7a4c341d0aff35282a3fd14e1">iic_Start();</div><div class="notion-text notion-block-d56c3f6c649e406188e61ee7f167e3c0">// 第2步：发起控制字节，高7bit是地址，bit0是读写控制位，0表示写，1表示读</div><div class="notion-text notion-block-b91fd10ac113459d9d42d896b93f93ea">iic_Send_Byte(max30102_WR_address | I2C_WR);	// 此处是写指令</div><div class="notion-text notion-block-3e348133e42e4a2a9224b8b4db42370e">// 第3步：发送ACK</div><div class="notion-text notion-block-ab04ce3363ab48d68f221d537b4afd6e">if (iic_Wait_Ack() != 0)</div><div class="notion-text notion-block-b2e5bc787fc249feb26d36afdce93518">{<div class="notion-text-children"><div class="notion-text notion-block-d7959c13e4d543fbbd04f28261397283">goto cmd_fail;	// EEPROM器件无应答</div></div></div><div class="notion-text notion-block-f3b4692ddc034e5cb5c0f53ab53a9eb5">}</div><div class="notion-text notion-block-3546166473a14ef39995a3e470426722">// 第4步：发送字节地址</div><div class="notion-text notion-block-8684577691444ee9b7f485b60269d986">iic_Send_Byte((uint8_t)Register_Address);</div><div class="notion-text notion-block-8f697859645f4325b17f095febfdc35e">if (iic_Wait_Ack() != 0)</div><div class="notion-text notion-block-3eb82af5a3ec41e28d1556b919530d91">{<div class="notion-text-children"><div class="notion-text notion-block-e3c766550e734a03b1c80c36b1bde613">goto cmd_fail;	// EEPROM器件无应答</div></div></div><div class="notion-text notion-block-29d6f15db9d04123acfb5b7e6c5fa310">}</div><div class="notion-text notion-block-30cf74113b67442697888f57ae63c127">// 第6步：重新启动I2C总线。下面开始读取数据</div><div class="notion-text notion-block-fb4d604d535a40d4ac7ca9311c9a36ac">iic_Start();</div><div class="notion-text notion-block-072d8882d17849629eb0da8de7ab5ec3">// 第7步：发起控制字节，高7bit是地址，bit0是读写控制位，0表示写，1表示读</div><div class="notion-text notion-block-2a0dad78db234d99bac09a5e9dc38179">iic_Send_Byte(max30102_WR_address | I2C_RD);	// 此处是读指令</div><div class="notion-text notion-block-eccc9c664f8e4071804ee321f701ffd1">// 第8步：发送ACK</div><div class="notion-text notion-block-4e7b6ea3e4ae4c82ab5ff4ba7b5b1bda">if (iic_Wait_Ack() != 0)</div><div class="notion-text notion-block-89be327f115d43e291c1b0edb73013a6">{<div class="notion-text-children"><div class="notion-text notion-block-a5820bb731354bd2a732cc895ad24282">goto cmd_fail;	// EEPROM器件无应答</div></div></div><div class="notion-text notion-block-34dccb96f1a54c6c9c9b87165624b3c7">}</div><div class="notion-text notion-block-ed530beacd884ad18f731123b0911021">// 第9步：读取数据</div><div class="notion-text notion-block-1fe6eb0da12145349c90fcbc6ec45fd9">Data[0] = iic_Read_Byte(1);	</div><div class="notion-text notion-block-f0a4888f29d649b58861c20b90a356ac">Data[1] = iic_Read_Byte(1);	</div><div class="notion-text notion-block-5407c54af3754b2d909afed9fed25d03">Data[2] = iic_Read_Byte(1);	</div><div class="notion-text notion-block-2334c8188641485690be4863c7939768">Data[3] = iic_Read_Byte(1);</div><div class="notion-text notion-block-e2574fc496d4481c9216944e4c6e2106">Data[4] = iic_Read_Byte(1);	</div><div class="notion-text notion-block-fb209d25499f4862b307aee08f461544">Data[5] = iic_Read_Byte(0);</div><div class="notion-text notion-block-ba2f278e1a44411388f8fc228440925c">// 最后1个字节读完后，CPU产生NACK信号(驱动SDA = 1)</div><div class="notion-text notion-block-a02fd45ffee64b11906ccc1cf967f983">// 发送I2C总线停止信号</div><div class="notion-text notion-block-3bb4eb5ad9b44346967f57cfb0e2f34f">iic_Stop();</div></div></div><div class="notion-text notion-block-bb24da1bf01b490682be61155abf64a8">cmd_fail: // 命令执行失败后，切记发送停止信号，避免影响I2C总线上其他设备<div class="notion-text-children"><div class="notion-text notion-block-0b04fc22a1c848a787f88e2b5f33ac2d">// 发送I2C总线停止信号</div><div class="notion-text notion-block-39a76b3c09df4c07a15b079d2e0a27ca">iic_Stop();</div></div></div><div class="notion-text notion-block-0a20558a570648aaa723285063434917">}</div><div class="notion-text notion-block-25e9fbdc32df4b5ea3313f9053dab2bd">// MAX30102传感器初始化配置</div><div class="notion-text notion-block-5e96cdf060384c0dbf34b95f605a6ad0">void max30102_init(void)</div><div class="notion-text notion-block-ec959ba31e694a7b91530562b096dec7">{<div class="notion-text-children"><div class="notion-text notion-block-2afa0b72042d4e77b7c0732f8eb1b3f3">iic_Init();  // 初始化I2C总线</div><div class="notion-text notion-block-3112cccbcb8c4beeab4e58f8f4c91955">max30102_reset();  // 复位MAX30102传感器</div><div class="notion-text notion-block-822d8198fda944cdb609bccbc75d2682">// 下面是一些配置参数的设置<div class="notion-text-children"><div class="notion-text notion-block-5b1e40baf35942198b69bd9a8b0703f2">// max30102_Bus_Write(REG_INTR_ENABLE_1, 0xc0);	// INTR setting</div><div class="notion-text notion-block-b520cf02017243e68312953a72cbbb1d">max30102_Bus_Write(REG_INTR_ENABLE_1, 0xc0);	// 使能中断，开启PPG_RDY_EN</div><div class="notion-text notion-block-f6ddfd4c8ae8426183ace2d78592758e">max30102_Bus_Write(REG_INTR_ENABLE_2, 0x00);  // 关闭其他中断</div><div class="notion-text notion-block-6bb390f597de421086439367b0e254ea">// MAX30102配置参数设置</div><div class="notion-text notion-block-013419e859cd434e92e875983a472b3d">max30102_Bus_Write(REG_INTR_ENABLE_1, 0xc0);	// INTR setting</div><div class="notion-text notion-block-f050144b806642c289ec9d2549a2faa7">max30102_Bus_Write(REG_INTR_ENABLE_2, 0x00);</div><div class="notion-text notion-block-a473c1ffbef2482fa4edad64411afb0a">max30102_Bus_Write(REG_FIFO_WR_PTR, 0x00);  	// 设置FIFO写指针，位[4:0]</div><div class="notion-text notion-block-b7b7e8ba88e8483d80f696c1a03e31b3">max30102_Bus_Write(REG_OVF_COUNTER, 0x00);  	// 设置溢出计数器，位[4:0]</div><div class="notion-text notion-block-ad94b4ebc1dc487bb6364778a72d7682">max30102_Bus_Write(REG_FIFO_RD_PTR, 0x00);  	// 设置FIFO读指针，位[4:0]</div><div class="notion-text notion-block-e31f1bdd7f844a1abe3182584d8c779d">max30102_Bus_Write(REG_FIFO_CONFIG, 0x0f);  	// 配置FIFO，设置样本平均值为1，禁止FIFO循环，FIFO几乎满时触发中断</div><div class="notion-text notion-block-9cdb758223964716acd3fe6f8d9ee306">max30102_Bus_Write(REG_MODE_CONFIG, 0x03);  	// 配置工作模式，0x02表示仅红光模式，0x03表示SpO2模式，0x07表示多模式LED</div><div class="notion-text notion-block-ed3988013c034147bd37f6b0055be5b3">max30102_Bus_Write(REG_SPO2_CONFIG, 0x27);  	// 配置SpO2，设置ADC范围为4096nA，SpO2采样率为100 Hz，LED脉冲宽度为400uS</div><div class="notion-text notion-block-d26c41698d2a4f07a90676184d7ebd24">max30102_Bus_Write(REG_LED1_PA, 0x24);   	// 设置LED1功率，选择值约为7mA</div><div class="notion-text notion-block-18f5ab4db0c5421a95fba98798c39b46">max30102_Bus_Write(REG_LED2_PA, 0x24);   	// 设置LED2功率，选择值约为7mA</div><div class="notion-text notion-block-2d9e475040a846f381cb0f6e936de334">max30102_Bus_Write(REG_PILOT_PA, 0x7f);   	// 设置Pilot LED功率，选择值约为25mA</div></div></div></div></div><div class="notion-text notion-block-cb52d691805540079f8ac925cc3d08d5">}</div><div class="notion-text notion-block-58703bf8598342ae91b46a13ae9d7d18">// 下面是对其他函数的注释，与max30102_init函数相似</div><div class="notion-text notion-block-e9242063d8a1496893e4aa6913b5cd78">void max30102_reset(void)</div><div class="notion-text notion-block-1a561cf5a9d0434bb56e313a96055dfc">{<div class="notion-text-children"><div class="notion-text notion-block-22213ed4694a43089f52c66825404916">max30102_Bus_Write(REG_MODE_CONFIG, 0x40);</div><div class="notion-text notion-block-716e937af0ed45098d8fb0ab8e6544b2">max30102_Bus_Write(REG_MODE_CONFIG, 0x40);</div></div></div><div class="notion-text notion-block-949487158c044192b38451d186780cd6">}</div><div class="notion-text notion-block-c5964af752314cf49c6e60e97c91cf9d">void maxim_max30102_write_reg(uint8_t uch_addr, uint8_t uch_data)</div><div class="notion-text notion-block-a6c158a297464864ae0d030cbbf9cb69">{<div class="notion-text-children"><div class="notion-text notion-block-6c895ab65c6e48f99b214a4e9853aeb1">iic_Write_One_Byte(I2C_WRITE_ADDR, uch_addr, uch_data);</div></div></div><div class="notion-text notion-block-ed5c2140faec40bd8e59a6dfe93cdbc1">}</div><div class="notion-text notion-block-a2c411fbc7744d21a4b0cbaf81a3b4e2">void maxim_max30102_read_reg(uint8_t uch_addr, uint8_t *puch_data)</div><div class="notion-text notion-block-b1a821e1b6f94a53af827e1fa6310419">{<div class="notion-text-children"><div class="notion-text notion-block-31ef8006973340b0b2dec405b33ae497">iic_Read_One_Byte(I2C_WRITE_ADDR, uch_addr, puch_data);</div></div></div><div class="notion-text notion-block-ebe30287c0b649c8a8c8bc9a71c0cb30">}</div><div class="notion-text notion-block-93328c9fafbd4dc4a0cecacdb5f6537e">void maxim_max30102_read_fifo(uint32_t <em>pun_red_led, uint32_t </em>pun_ir_led)</div><div class="notion-text notion-block-c17f40b40669466ab60ee355fe46bda3">{<div class="notion-text-children"><div class="notion-text notion-block-1d741f4ec43e408c90cfb2ad78fa0ea6">uint32_t un_temp;</div><div class="notion-text notion-block-97465f362902419ba5eeb366d9da6f7b">unsigned char uch_temp;</div><div class="notion-text notion-block-37b23cbba4b546c1867ba6393d801b1f">char ach_i2c_data[6];</div><div class="notion-text notion-block-b0db374ec0b648ecb66ac3c88eeee870">*pun_red_led = 0;</div><div class="notion-text notion-block-1c2b97945cf943bfbb8480f0f18ec3e3">*pun_ir_led = 0;</div><div class="notion-text notion-block-3d454ab3d12b4d4bb294a7ea4a931d30">// 读取和清除状态寄存器</div><div class="notion-text notion-block-0af150be981c48b9b9aaef9abf668e74">maxim_max30102_read_reg(REG_INTR_STATUS_1, &amp;uch_temp);</div><div class="notion-text notion-block-27b083bd617b403c805eeb1df6ac83ad">maxim_max30102_read_reg(REG_INTR_STATUS_2, &amp;uch_temp);</div><div class="notion-text notion-block-b31124d7798946998a254ea9639a04cb">// 读取FIFO数据</div><div class="notion-text notion-block-05b76cc65ae742ac9e3b183b0c665ddc">iic_ReadBytes(I2C_WRITE_ADDR, REG_FIFO_DATA, (u8 *)ach_i2c_data, 6);</div><div class="notion-text notion-block-6e35c50fa1114ccc8480495f4d1f37f5">// 解析FIFO数据</div><div class="notion-text notion-block-914b40bf21d949a09f115c3db037c6dc">un_temp = (unsigned char)ach_i2c_data[0];  // 读取FIFO数据的第一个字节</div><div class="notion-text notion-block-a1768f24aaf6412db6c8ab7f44988b59">un_temp &lt;&lt;= 16;  // 左移16位，将数据放入对应的高位</div><div class="notion-text notion-block-1bfa179c1d4040a1b9b638e4baa94709">*pun_red_led += un_temp;  // 累加到红光LED的数据中</div><div class="notion-text notion-block-9bb31322080e4966b354d9a2c7d51a7a">un_temp = (unsigned char)ach_i2c_data[1];  // 读取FIFO数据的第二个字节</div><div class="notion-text notion-block-38601f6c1ef440c09853a2b45e9d47b5">un_temp &lt;&lt;= 8;   // 左移8位，将数据放入对应的高位</div><div class="notion-text notion-block-67822f99747946b790d08153e2a7dc78">*pun_red_led += un_temp;  // 累加到红光LED的数据中</div><div class="notion-text notion-block-4361b9f63659424fabca4ab921db89e1">un_temp = (unsigned char)ach_i2c_data[2];  // 读取FIFO数据的第三个字节</div><div class="notion-text notion-block-08b13627910a4537995d9d70f53f7007">*pun_red_led += un_temp;  // 累加到红光LED的数据中</div><div class="notion-text notion-block-96e4d822dd8f4bb3910e118562281e9e">un_temp = (unsigned char)ach_i2c_data[3];  // 读取FIFO数据的第四个字节</div><div class="notion-text notion-block-c4c030a0b750424caae0d0caa0080d8f">un_temp &lt;&lt;= 16;  // 左移16位，将数据放入对应的高位</div><div class="notion-text notion-block-8c5504007c6e4caf9fed4e6cd7cba4cf">*pun_ir_led += un_temp;  // 累加到红外LED的数据中</div><div class="notion-text notion-block-c0f84a64d0734df7a3280c928399e2fd">un_temp = (unsigned char)ach_i2c_data[4];  // 读取FIFO数据的第五个字节</div><div class="notion-text notion-block-f6ffc37fc3f24220a014bcf3c0b4c188">un_temp &lt;&lt;= 8;   // 左移8位，将数据放入对应的高位</div><div class="notion-text notion-block-87177cbc7974477d8cfb0282c0fb43ed">*pun_ir_led += un_temp;  // 累加到红外LED的数据中</div><div class="notion-text notion-block-49ac3af064a9452eacbded34fec8d8d0">un_temp = (unsigned char)ach_i2c_data[5];  // 读取FIFO数据的第六个字节</div><div class="notion-text notion-block-6fc66711ff4b4df0b1c1c142915a1cc5">*pun_ir_led += un_temp;  // 累加到红外LED的数据中</div><div class="notion-text notion-block-9d07dfcd24e642129396d1e787b19ed7">*pun_red_led &amp;= 0x03FFFF;  // 对红光LED的数据进行按位与操作，屏蔽掉高位 [23:18]</div><div class="notion-text notion-block-bbfc2104f1f547d79da6cee0c72a44fc">*pun_ir_led &amp;= 0x03FFFF;   // 对红外LED的数据进行按位与操作，屏蔽掉高位 [23:18]</div></div></div><div class="notion-text notion-block-b88ea0bef41c461aa6eeaf82f383730d">}<div class="notion-text-children"><details class="notion-toggle notion-block-845de9610e064fc1a6f8b1e33f246eee"><summary><h4 class="notion-h notion-h3 notion-block-845de9610e064fc1a6f8b1e33f246eee" data-id="845de9610e064fc1a6f8b1e33f246eee"><span><div id="845de9610e064fc1a6f8b1e33f246eee" class="notion-header-anchor"></div><span class="notion-h-title"><b>algorithm.h</b></span></span></h4></summary><div><div class="notion-text notion-block-25763071ddba4090b59398c743e1d78b">//Copyright (C) 2015 Maxim Integrated Products, Inc., All Rights Reserved.</div><div class="notion-text notion-block-4270d99b815c48bdb62d235390a99a48">#ifndef ALGORITHM_H_</div><div class="notion-text notion-block-7f2b89c55075464196b358700c33c705">#define ALGORITHM_H_</div></div></details></div></div><div class="notion-text notion-block-b4ea3e12197941019ded7c825d6b5319">#include &quot;sys.h&quot;</div><div class="notion-text notion-block-766837c690594d6b958df9960c32e238">#define true 1</div><div class="notion-text notion-block-f19aa2b4dc9d4a96b838c923416acd44">#define false 0</div><div class="notion-text notion-block-0987e1aaa96a47d28993c4b63162634a">#define FS 100</div><div class="notion-text notion-block-64ea241ab7204e03b8fdad14ec6d539e">#define BUFFER_SIZE  (FS* 5) </div><div class="notion-text notion-block-d0dc312550364774aa3618c3f0628216">#define HR_FIFO_SIZE 7</div><div class="notion-text notion-block-0dfe78f48f5346e2a54d38ac52fbc3ab">#define MA4_SIZE  4 // DO NOT CHANGE</div><div class="notion-text notion-block-a8ab16ad96b54c7c8c6792f23f33c016">#define HAMMING_SIZE  5// DO NOT CHANGE</div><div class="notion-text notion-block-68ef3a85c14b48a0a3860dd9f57f0ced">#define min(x,y) ((x) &lt; (y) ? (x) : (y))</div><div class="notion-text notion-block-9200209a4d734ef5b80329b3c6eddd39">void maxim_heart_rate_and_oxygen_saturation(uint32_t <em>pun_ir_buffer ,  int32_t n_ir_buffer_length, uint32_t </em>pun_red_buffer ,   int32_t <em>pn_spo2, int8_t </em>pch_spo2_valid ,  int32_t <em>pn_heart_rate , int8_t  </em>pch_hr_valid);</div><div class="notion-text notion-block-28af960c144547b7adc8ec2327ac98de">void maxim_find_peaks( int32_t <em>pn_locs, int32_t </em>pn_npks,  int32_t *pn_x, int32_t n_size, int32_t n_min_height, int32_t n_min_distance, int32_t n_max_num );</div><div class="notion-text notion-block-77890d79d00741afb2234012b9ddff84">void maxim_peaks_above_min_height( int32_t <em>pn_locs, int32_t </em>pn_npks,  int32_t *pn_x, int32_t n_size, int32_t n_min_height );</div><div class="notion-text notion-block-b4e15f7c89a24d21bc4b96bdcb75b1b5">void maxim_remove_close_peaks( int32_t <em>pn_locs, int32_t </em>pn_npks,   int32_t  *pn_x, int32_t n_min_distance );</div><div class="notion-text notion-block-411a1426ffde4f1eb287363b3e9971f5">void maxim_sort_ascend( int32_t *pn_x, int32_t n_size );</div><div class="notion-text notion-block-92991af2099f4f60990039f4a2c83a34">void maxim_sort_indices_descend(  int32_t  <em>pn_x, int32_t </em>pn_indx, int32_t n_size);</div><div class="notion-text notion-block-af6c12467c7e46b4969ecd21bbe41f18">#endif<div class="notion-text-children"><details class="notion-toggle notion-block-0d5f23fb7d0040d29525b77477ab86e1"><summary><h4 class="notion-h notion-h3 notion-block-0d5f23fb7d0040d29525b77477ab86e1" data-id="0d5f23fb7d0040d29525b77477ab86e1"><span><div id="0d5f23fb7d0040d29525b77477ab86e1" class="notion-header-anchor"></div><span class="notion-h-title"><b>algorithm.c</b></span></span></h4></summary><div><div class="notion-text notion-block-7d0cb6df0d0c43bd801d4ae3fa3d3110">#include &quot;algorithm.h&quot;</div></div></details></div></div><div class="notion-text notion-block-a801b95e7c604912844135a938124c9f">//汉明窗口，函数的目的是在时域内对信号进行平滑处理，以减小信号两端的幅度，防止频谱泄漏。</div><div class="notion-text notion-block-dea94fd5e2a94984b80f30b6143b2659">//计算公式：w(n)=0.54-0.46cos(2 pi n/N-1)，其中 N 是窗口的长度</div><div class="notion-text notion-block-53740597bd30404382bd5ea8fc49e51f">const uint16_t auw_hamm[31]={ 41,    276,    512,    276,     41 }; //Hamm=  long16(512* hamming(5)&#x27;);</div><div class="notion-text notion-block-b547c736b6c3419194ff24ca83b65a98">//uch_spo2_table is computed as  -45.060<em>ratioAverage</em> ratioAverage + 30.354 *ratioAverage + 94.845 ;</div><div class="notion-text notion-block-e5b4f9864cb145b787a58554c143ea01">//ratioAverage 是一个用于计算血氧饱和度的比值。这个比值与红外光和红光的交流和直流分量的比值有关</div><div class="notion-text notion-block-b70a9f43c39746c9a7d2046bee87d451">const uint8_t uch_spo2_table[184]={ 95, 95, 95, 96, 96, 96, 97, 97, 97, 97, 97, 98, 98, 98, 98, 98, 99, 99, 99, 99, <div class="notion-text-children"><div class="notion-text notion-block-0431dcadec9245e2978e1010002cc69b">99, 99, 99, 99, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, </div><div class="notion-text notion-block-46d5dc18bab24d5495a40aaf0318a638">100, 100, 100, 100, 99, 99, 99, 99, 99, 99, 99, 99, 98, 98, 98, 98, 98, 98, 97, 97, </div><div class="notion-text notion-block-e6aa8621cb6446aba50b1fafd5da38fd">97, 97, 96, 96, 96, 96, 95, 95, 95, 94, 94, 94, 93, 93, 93, 92, 92, 92, 91, 91, </div><div class="notion-text notion-block-b37e5ee58be046a5950edd63ee4e7934">90, 90, 89, 89, 89, 88, 88, 87, 87, 86, 86, 85, 85, 84, 84, 83, 82, 82, 81, 81, </div><div class="notion-text notion-block-42d393a9b07b4f97a796d97781ce8320">80, 80, 79, 78, 78, 77, 76, 76, 75, 74, 74, 73, 72, 72, 71, 70, 69, 69, 68, 67, </div><div class="notion-text notion-block-532d17e355884664808c9994ca307df2">66, 66, 65, 64, 63, 62, 62, 61, 60, 59, 58, 57, 56, 56, 55, 54, 53, 52, 51, 50, </div><div class="notion-text notion-block-6c2ac5bb6c2f4291bb84536badbad649">49, 48, 47, 46, 45, 44, 43, 42, 41, 40, 39, 38, 37, 36, 35, 34, 33, 31, 30, 29, </div><div class="notion-text notion-block-2a26fb9749e84ac899ff3c95820d49db">28, 27, 26, 25, 23, 22, 21, 20, 19, 17, 16, 15, 14, 12, 11, 10, 9, 7, 6, 5, </div><div class="notion-text notion-block-bc1a314b6d294110858d16309c612099">3, 2, 1 } ;</div></div></div><div class="notion-text notion-block-d551c7df0f5942458863f6bda1bc88b2">static  int32_t an_dx[ BUFFER_SIZE-MA4_SIZE]; // delta</div><div class="notion-text notion-block-962512d06d254b3ab88f1bb74a62d110">static  int32_t an_x[ BUFFER_SIZE]; //ir</div><div class="notion-text notion-block-a11c188c431f4ca0ad2c46469eb4693a">static  int32_t an_y[ BUFFER_SIZE]; //red</div><div class="notion-text notion-block-dbc375f8ecf54796a65d9169a2b06765">void maxim_heart_rate_and_oxygen_saturation(uint32_t <em>pun_ir_buffer,  int32_t n_ir_buffer_length, uint32_t </em>pun_red_buffer, int32_t <em>pn_spo2, int8_t </em>pch_spo2_valid, <div class="notion-text-children"><div class="notion-text notion-block-2739a3aa01e64c48a20101ee3b1a298d">int32_t <em>pn_heart_rate, int8_t  </em>pch_hr_valid)</div></div></div><div class="notion-text notion-block-2bfecfa1b5b24229b8fde4ccb8abf411">/</div><ul class="notion-list notion-list-disc notion-block-3cea02083c91409f8980dff38ada584c"><li>brief        Calculate the heart rate and SpO2 level</li></ul><ul class="notion-list notion-list-disc notion-block-6a9aa0b5baf54b5c944666e9f59088f9"><li>par          Details</li></ul><ul class="notion-list notion-list-disc notion-block-15431e98b9f747e4b71f9d0918168198"><li>通过检测PPG周期的峰值和相应的红/红外信号的AC/DC，计算出SPO2的比值。</li></ul><ul class="notion-list notion-list-disc notion-block-c24da31823cb4f9aaacf688b6d267dfd"><li>因为这个算法的目标是Arm M0/M3。由于寄存器溢出，SPO2的公式没有达到精度。</li></ul><ul class="notion-list notion-list-disc notion-block-4fd899aa2f5f403bab5a39a58643b72c"><li>因此，准确的SPO2是预先计算出来的，并且每个比率都节省了很长的uch_spo2_table[]。</li></ul><ul class="notion-list notion-list-disc notion-block-83458670c3cb4ef0bbd067d9272bde1f"></ul><ul class="notion-list notion-list-disc notion-block-8ec91637087d4b279fa8a0a1cc12b297"><li>param[in]	*pun_ir_buffer 				-红外传感器数据缓冲区</li></ul><ul class="notion-list notion-list-disc notion-block-dd78db31649f455a9bf29de3ef634dd8"><li>param[in]	n_ir_buffer_length 			-红外传感器数据缓冲区长度</li></ul><ul class="notion-list notion-list-disc notion-block-4438ad7a37bd46a4abee1aa0ef30c36f"><li>param[in]	*pun_red_buffer 			-红光传感器数据缓冲区</li></ul><ul class="notion-list notion-list-disc notion-block-79c53561677a4fee8948d1b359f487f9"><li>param[out]	*pn_spo2 					-计算的SpO2值</li></ul><ul class="notion-list notion-list-disc notion-block-4a4477ad0a7c402f8015e33187b623dd"><li>param[out]	*pch_spo2_valid 			-如果计算的SpO2值有效，则为1</li></ul><ul class="notion-list notion-list-disc notion-block-7215863f350b4b0e83182e5e474ad915"><li>param[out]	*pn_heart_rate 				-计算心率值</li></ul><ul class="notion-list notion-list-disc notion-block-cf19792884674de1a96269eadba62944"><li>param[out]	*pch_hr_valid 				- 1如果计算的心率值是有效的</li></ul><ul class="notion-list notion-list-disc notion-block-324a977d58f449b39b1e02624a80035e"><li>存储计算结果的指针pn_spo2、pch_spo2_valid、pn_heart_rate和pch_hr_valid。</li></ul><ul class="notion-list notion-list-disc notion-block-1080ed06436e4e36abd39c89b39461a0"><li>retval       None</li></ul><ul class="notion-list notion-list-disc notion-block-e265f1fed4bf4333839b9905af18fdd0"><li>实现步骤：</li><ul class="notion-list notion-list-disc notion-block-e265f1fed4bf4333839b9905af18fdd0"><div class="notion-text notion-block-edadd52be21448fd9c2a86619c2cd672">主要实现过程包括：</div><div class="notion-text notion-block-25dc41192fb54a64a905f67f8a54d304">（1）去除IR信号的直流成分：<div class="notion-text-children"><div class="notion-text notion-block-16ad4bc34fd745daa3846d582e93bdeb">计算IR信号的平均值，然后从原始IR信号中减去平均值，得到去除直流成分的信号。</div></div></div><div class="notion-text notion-block-eafa6df874ff494cb833c162bff34ac6">（2）平滑信号：<div class="notion-text-children"><div class="notion-text notion-block-a946b8fcffdd42c5b44945196fa58989">对去除直流成分的IR信号进行4点移动平均。</div></div></div><div class="notion-text notion-block-49a40aeba49543dab9e46f4a5d3fbe59">（3）计算信号差分：<div class="notion-text-children"><div class="notion-text notion-block-2182bf23b2374aaf89c27d0c9eab3d45">计算平滑后的IR信号的差分。</div></div></div><div class="notion-text notion-block-1ec63085ec594fb6b3b37e3bc687a854">（4）使用汉明窗口翻转波形：<div class="notion-text-children"><div class="notion-text notion-block-d1369e5cb191408bb55195355c204a76">对差分信号使用汉明窗口，以便在后续步骤中检测波谷。</div></div></div><div class="notion-text notion-block-e5a36165a66146f6b719b0f6baf3dade">（5）使用峰值检测找到波谷：<div class="notion-text-children"><div class="notion-text notion-block-307a6fe14ede4dfaa7e052f2e8790e91">使用峰值检测算法找到波谷的位置，并保存在an_ir_valley_locs数组中。</div></div></div><div class="notion-text notion-block-a8ac71308fac4d72902fb9c66b48b0f0">（6）计算心率：<div class="notion-text-children"><div class="notion-text notion-block-67b25affc6c34b798b728a4170c68f5a">根据波谷的位置计算心率，单位为每分钟心跳数（BPM）。</div></div></div><div class="notion-text notion-block-51eae079e3af458791bf0c90e9a216e5">（7）计算IR和红光信号的AC/DC比值：<div class="notion-text-children"><div class="notion-text notion-block-c95f64c4f8cb4fdbad56d419c85e76c9">在两个相邻波谷之间，找到IR和红光信号的AC（交流）和DC（直流）成分，并计算AC/DC比值。</div><div class="notion-text notion-block-64ac3a2cfa3a43629d762d86ec25eeb8">在每个心跳周期内，计算红外和红光信号的AC分量和DC分量。</div><div class="notion-text notion-block-461822aa550d4fc1b080f62e6b1e2640">AC分量反映了血液的脉动变化，而DC分量反映了总体的血液吸收</div></div></div><div class="notion-text notion-block-554e2b0608e947ccbcea02dc66898f07">（8）使用比值计算血氧饱和度：<div class="notion-text-children"><div class="notion-text notion-block-d3634924120d40f5b11d5c0155817b81">使用IR和红光信号的AC/DC比值，查表计算血氧饱和度。结果存储在pn_spo2中。</div><div class="notion-text notion-block-e193deffc3bc4dfa9125ec76cf0d37fe">红外和红光的AC/DC比值与血液的含氧量相关，因为含氧血液和脱氧血液对红外和红光的吸收比例不同</div><div class="notion-text notion-block-61fc4e96b26d451d9161b2d88be28d48">使用预先计算好的SPO2校准表，将红外和红光的AC/DC比值映射到实际的SPO2值。</div></div></div></ul></ul><div class="notion-text notion-block-7fd9bde698cd453cbc9c20c84dbf4b28">*/</div><div class="notion-text notion-block-866d945187ac49d9b0ebfd0bd5b72aaf">{<div class="notion-text-children"><div class="notion-text notion-block-5282a3390c894253bedb6c50d437834d">uint32_t un_ir_mean, un_only_once;		// IR信号的均值和标志位，用于去除直流（DC）成分</div><div class="notion-text notion-block-5ad62405ae3c4bbc9a5859cae4f21e81">int32_t k, n_i_ratio_count;				// 循环变量k，AC/DC比值计数器</div><div class="notion-text notion-block-0c6312b73f58447a8b18ba118061e0b4">int32_t i, s, m, n_exact_ir_valley_locs_count, n_middle_idx;</div><div class="notion-text notion-block-18b6bcd6d340445dac78ff6c600315d8">// 循环变量i，临时变量s，计数器m，精确IR谷点数目，中间索引</div><div class="notion-text notion-block-edda16b0769845f99ddf4ba1f982275d">int32_t n_th1, n_npks, n_c_min;			// 阈值n_th1，峰值计数n_npks，最小值n_c_min</div><div class="notion-text notion-block-0380bcbb91a24a5eb96d90dd6910bfba">int32_t an_ir_valley_locs[15];			// IR信号谷点的数组</div><div class="notion-text notion-block-ec9f194522d141239c392de1b722945c">int32_t an_exact_ir_valley_locs[15];	// 精确IR信号谷点的数组</div><div class="notion-text notion-block-2e189f63fc944d4dbccea23a8a8e9201">int32_t an_dx_peak_locs[15];			// 微分信号峰点的数组</div><div class="notion-text notion-block-18c8fd28f3164c76b22202864afd3699">int32_t n_peak_interval_sum;			// 峰值间隔总和</div><div class="notion-text notion-block-b31d8a0caefc48d28b55cd072433a45a">int32_t n_y_ac, n_x_ac;					// 红光和红外光的AC（交流）分量</div><div class="notion-text notion-block-fc93b11c966c4cd29b47bc6912fb67ec">int32_t n_spo2_calc;					// 计算得到的SPO2值</div><div class="notion-text notion-block-a69bc7b08e634d739659c5c4bf0a87b5">int32_t n_y_dc_max, n_x_dc_max;			// 红光和红外光的DC（直流）最大值</div><div class="notion-text notion-block-685644162e984a18bd4493e607826b91">int32_t n_y_dc_max_idx, n_x_dc_max_idx; // 红光和红外光的DC最大值索引</div><div class="notion-text notion-block-daaf3c89082443308a84257b87802a19">int32_t an_ratio[5], n_ratio_average;	// AC/DC比值数组和比值平均值</div><div class="notion-text notion-block-09e25fb178f7463582eba0bb00a7f387">int32_t n_nume, n_denom;				// 分子和分母，用于计算AC/DC比值<div class="notion-text-children"><div class="notion-text notion-block-2473a8e7da0c4c198f2c0ba28ed1bdbc">// 去除IR信号的直流成分</div><div class="notion-text notion-block-7f30ae8a4e5f48cf9f4b9fe5b76a1ca4">un_ir_mean = 0;</div><div class="notion-text notion-block-cf5bdc164eab4ceab0faff39ae0f8e50">for (k = 0; k &lt; n_ir_buffer_length; k++) un_ir_mean += pun_ir_buffer[k];</div><div class="notion-text notion-block-0e2bed6650ad41e1883e40a5434282ce">un_ir_mean = un_ir_mean / n_ir_buffer_length;</div><div class="notion-text notion-block-966f0ce4958340ab96088c5c24d76316">for (k = 0; k &lt; n_ir_buffer_length; k++) an_x[k] = pun_ir_buffer[k] - un_ir_mean;</div><div class="notion-text notion-block-a2d1d230f7d5465088a4be5f7656cebf">// 4点移动平均</div><div class="notion-text notion-block-6e4db8629fb146fbad33e530ed8cea19">for (k = 0; k &lt; BUFFER_SIZE - MA4_SIZE; k++)</div><div class="notion-text notion-block-e4485b15ad904fce93c65029d563bab7">{</div><div class="notion-text notion-block-113eadfe9eb944b19cd9c5468e51be88">// 计算4个点的和<div class="notion-text-children"><div class="notion-text notion-block-71d8fc66b9c24f2389882d1bb9e53e35">n_denom = (an_x[k] + an_x[k + 1] + an_x[k + 2] + an_x[k + 3]);</div></div></div><div class="notion-text notion-block-aa5c026dbd4f477e8d47dcf6da26c7bb">// 计算移动平均值并替换原始值<div class="notion-text-children"><div class="notion-text notion-block-984e5a2a32e54800a9194f22d61a643e">an_x[k] = n_denom / (int32_t)4;</div><div class="notion-text notion-block-bd5ee342517f4cd9b4953d25fa62bd78">}</div><div class="notion-text notion-block-66eb354b45b84923b2ceb1876d1f0ebd">// 计算信号差分，计算信号an_x的差分，即相邻元素之间的差值。</div></div></div></div></div><div class="notion-text notion-block-53f7032b2ea94ec58384a5d6632b90e7">//通过对原始信号进行差分运算，可以获取信号的变化率，有助于后续的信号处理和特征提取。<div class="notion-text-children"><div class="notion-text notion-block-89be88af423740d08d971f6feb5ba3a5">for (k = 0; k &lt; BUFFER_SIZE - MA4_SIZE - 1; k++)<div class="notion-text-children"><div class="notion-text notion-block-041fadccb2ee4d2b80b99eaedd04667c">an_dx[k] = (an_x[k + 1] - an_x[k]);</div></div></div><div class="notion-text notion-block-67281ba97f624bd6aca8f766d4ef4ea0">// 2点移动平均</div><div class="notion-text notion-block-2c7a31de68cd4d31881da56cc22fbf59">for (k = 0; k &lt; BUFFER_SIZE - MA4_SIZE - 2; k++)</div><div class="notion-text notion-block-7efb12afa3e64c35b48a38d525f515a9">{<div class="notion-text-children"><div class="notion-text notion-block-e9ecc2707f474a088acd2c0e25fc68a6">an_dx[k] = (an_dx[k] + an_dx[k + 1]) / 2;</div></div></div><div class="notion-text notion-block-482b316b91d64a069af1fe0282b8ef33">}</div></div></div><div class="notion-text notion-block-ff131f9312ea4b5e8ed5b6041f50ba4a">// 汉明窗口</div><div class="notion-text notion-block-2c81043feba3440eaac251fdcb8dc9bf">//汉明窗口是一种窗口函数，通常用于在信号处理中对信号进行平滑处理，以减少频谱泄漏。</div><div class="notion-text notion-block-64870810f50c41d98d2ea4dea7de482b">//在这里，通过对差分信号应用汉明窗口，可以对信号进行加权，突出信号中的特定频率成分。</div><div class="notion-text notion-block-ea1a8e12d1f74b3a93088337740d1652">//这个加权后的信号被用于后续的信号处理步骤，以提取相关的特征或信息。</div><div class="notion-text notion-block-b15607672e994d4f968bec944689a3e4">for (i = 0; i &lt; BUFFER_SIZE - HAMMING_SIZE - MA4_SIZE - 2; i++)</div><div class="notion-text notion-block-dd3c5f080a084d07a500801dbd7fb321">{<div class="notion-text-children"><div class="notion-text notion-block-8b705c1e988d4957911e1d6f79f82898">s = 0;</div><div class="notion-text notion-block-c5aa715ce12a40dd8652973f0a87cadf">// 应用汉明窗口对信号进行加权</div><div class="notion-text notion-block-b00e829f83124e40b5bc8fa8428cd02f">for (k = i; k &lt; i + HAMMING_SIZE; k++)</div><div class="notion-text notion-block-0ab0d56d98cc4424ac759c6cd338ec91">{<div class="notion-text-children"><div class="notion-text notion-block-b1ab3783c64f4d279c252095557e465a">// 汉明窗口的权重数组为 auw_hamm</div><div class="notion-text notion-block-b8f9d6374df944d5842280c80ba547e9">// 将差分信号 an_dx 与汉明窗口加权，并求和</div><div class="notion-text notion-block-e1af035e148c47fcb9a09ae1c3a1e00a">s -= an_dx[k] * auw_hamm[k - i];</div></div></div><div class="notion-text notion-block-c4e17a76ee1042508b7ae7db1f93a284">}</div><div class="notion-text notion-block-7dc18ada748f4d0abf7563a5cb919bf6">// 将加权和除以汉明窗口权重之和（1146）,归一化</div><div class="notion-text notion-block-1d6349d5d16f400b94c7ebf6b1f602b5">an_dx[i] = s / (int32_t)1146;</div></div></div><div class="notion-text notion-block-42c52ff302134f5885c6e727840e81b6">}</div><div class="notion-text notion-block-7230e18d43624db9b72b3c64cd9aaaeb">// 阈值计算，计算差分信号数组 an_dx 的平均阈值 n_th1</div><div class="notion-text notion-block-d3dc7c58dedc4bd6808d822e37c4cc18">n_th1 = 0; // 初始化阈值</div><div class="notion-text notion-block-d512f6820c4346748ee69e5f741b0463">// 遍历差分信号数组 an_dx，计算阈值</div><div class="notion-text notion-block-4124e3aa94f9406b8e0dc4ad96380200">for (k = 0; k &lt; BUFFER_SIZE - HAMMING_SIZE; k++)</div><div class="notion-text notion-block-1094c7c54c5b4d5784e732f2e2c3c561">{<div class="notion-text-children"><div class="notion-text notion-block-79a18e51610c4f08af318fade74e3a03">// 阈值为正差分信号之和，如果差分信号为负值，则取绝对值累加</div><div class="notion-text notion-block-21e188e08e344cf8a8134ab0ea940dd9">n_th1 += ((an_dx[k] &gt; 0) ? an_dx[k] : ((int32_t)0 - an_dx[k]));</div></div></div><div class="notion-text notion-block-f8760bb1b8f84611889d052c038f62da">}</div><div class="notion-text notion-block-feda5333d33949a686368b76072b6eda">// 将阈值除以数组长度，得到平均阈值</div><div class="notion-text notion-block-7cdc2f78ba7845558006ef7cd69e97f9">n_th1 = n_th1 / (BUFFER_SIZE - HAMMING_SIZE);</div><div class="notion-text notion-block-05b9ee36a8d941b2bf89539b36e2186a">// 使用峰值检测找到波谷，计算心率</div><div class="notion-text notion-block-173f3dfb6d6f4f8a9b79aacb6db5ac6b">/*</div><div class="notion-text notion-block-3a957e5acdf44f0e9176ca65dcfc983f">思路：</div><div class="notion-text notion-block-e96aedb856634e31a8324eb809909395">maxim_find_peaks 函数找到差分信号数组 an_dx 中的峰值位置，并将这些位置存储在 an_dx_peak_locs 数组中</div><div class="notion-text notion-block-aa34b4a5d14a4ce88eac7b1591f11c1c">然后，通过计算峰值之间的平均间隔，利用心率计算公式计算心率值。</div><div class="notion-text notion-block-a92fe83671b945aabcc3047d99cb42ab">最后，根据检测到的峰值位置，计算波谷位置，并将波谷位置存储在 an_ir_valley_locs 数组中。</div><div class="notion-text notion-block-b6b61feb40fd435cb2bb2a1f0b5ab191">*/</div><div class="notion-text notion-block-ec27aba20012499bb60695a4455c045e">maxim_find_peaks(an_dx_peak_locs, &amp;n_npks, an_dx, BUFFER_SIZE - HAMMING_SIZE, n_th1, 8, 5);</div><div class="notion-text notion-block-a63278c6dbca4db7a0766a915d222a70">n_peak_interval_sum = 0;</div><div class="notion-text notion-block-686496e184004a9c979cb5ab3d43a43c">// 如果检测到至少两个峰值</div><div class="notion-text notion-block-49e083f6dab94ee5a5dbe418002ca85f">if (n_npks &gt;= 2)</div><div class="notion-text notion-block-8487eb4e66bc43d9b560752920a4fee4">{<div class="notion-text-children"><div class="notion-text notion-block-554cb71e53ee4ecc9b9c4442d69f63c6">// 计算峰值之间的平均间隔</div><div class="notion-text notion-block-0270cb7ac6054774a49145a6952bef8e">for (k = 1; k &lt; n_npks; k++)<div class="notion-text-children"><div class="notion-text notion-block-a159eadb37a944fd8aa41b3ccd1d66ce">n_peak_interval_sum += (an_dx_peak_locs[k] - an_dx_peak_locs[k - 1]);</div></div></div><div class="notion-text notion-block-0fad32250d804b5b939478012d545c20">// 计算心率（每分钟心跳数）</div><div class="notion-text notion-block-76aea722cbc54626a83290e1b64671fd">n_peak_interval_sum = n_peak_interval_sum / (n_npks - 1);</div><div class="notion-text notion-block-c8be9ac8b46946cf9badfa28d7df9e6a">*pn_heart_rate = (int32_t)(6000 / n_peak_interval_sum);</div><div class="notion-text notion-block-e0777eb2b1ef409a841f587f289b7505">// 设置心率有效标志为1</div><div class="notion-text notion-block-1d56332c2f9542a38612ede6fb4e4abd">*pch_hr_valid = 1;</div></div></div><div class="notion-text notion-block-c546889e7a6742578b5564ac6b73a41b">}</div><div class="notion-text notion-block-7265848020ab46c39268d8db697a8dcc">else</div><div class="notion-text notion-block-5575d22e1424467e92752a251c504ee2">{<div class="notion-text-children"><div class="notion-text notion-block-d390cea21b0046d3a0cb0493cd9dbb25">// 如果未检测到足够的峰值，设置心率为无效值-999</div><div class="notion-text notion-block-550af0996c4c4b6f9e1f4855d3395134">*pn_heart_rate = -999;</div><div class="notion-text notion-block-21e13a73511946b4b9b2dd24b0e4f385">// 设置心率有效标志为0</div><div class="notion-text notion-block-a2922a2a6c164d838d6456c40c7827ab">*pch_hr_valid = 0;</div></div></div><div class="notion-text notion-block-1c705741bffd4202b529e592e93a80a1">}</div><div class="notion-text notion-block-b5112792036946e2b39a5ee5955af107">// 将峰值位置加上 HAMMING_SIZE / 2 作为波谷位置，为后面寻找准确的波谷做准备</div><div class="notion-text notion-block-d5324b3781a64984bbb8cf8fa047fed4">for (k = 0; k &lt; n_npks; k++)<div class="notion-text-children"><div class="notion-text notion-block-b35b0b537ba24d468938916323bb4c9a">an_ir_valley_locs[k] = an_dx_peak_locs[k] + HAMMING_SIZE / 2;</div></div></div><div class="notion-text notion-block-41690d37b5bc42ce92bbc70c1f3bec6b">// 计算AC/DC比值，从原始的红外和红光信号中提取出用于计算的实际波谷位置</div><div class="notion-text notion-block-768a6dd476254f77b70d39846674e161">/*</div><div class="notion-text notion-block-f304d179f6054f519768b5f1ab93fac2">首先，将原始的红外信号存储在 an_x 数组中，红光信号存储在 an_y 数组中。</div><div class="notion-text notion-block-e91517a3246340139af242d9b10b95f9">然后，遍历波谷位置数组，寻找每个波谷的实际位置。通过在波谷位置的前后寻找最小值，确定波谷的确切位置，</div><div class="notion-text notion-block-4ad8e89dfc0c43e2941c61192bb0650b">并将这些位置存储在 an_exact_ir_valley_locs 数组中。</div><div class="notion-text notion-block-dc659de110544243a3f8e87e910d811b">*/</div><div class="notion-text notion-block-136f5be7524243b6a9efff0068bf1e30">for (k = 0; k &lt; n_ir_buffer_length; k++)</div><div class="notion-text notion-block-39174d06a586461baefcd56c629983cf">{<div class="notion-text-children"><div class="notion-text notion-block-cdb63090cd634b8ab1fca037a0871006">an_x[k] = pun_ir_buffer[k];  // 将红外信号存储在 an_x 数组中</div><div class="notion-text notion-block-325c15d3fc23498498ff04e552826117">an_y[k] = pun_red_buffer[k]; // 将红光信号存储在 an_y 数组中</div></div></div><div class="notion-text notion-block-61b8757ec82049cc9faa8a5cd4194866">}</div><div class="notion-text notion-block-aa8035ecccd14ee8b853e2e11f094479">n_exact_ir_valley_locs_count = 0;</div><div class="notion-text notion-block-78389f8cb408481d91c5042836caad3e">// 遍历波谷位置数组，找到每个波谷的实际位置</div><div class="notion-text notion-block-b9cf947682e546958665385cc9528918">for (k = 0; k &lt; n_npks; k++)</div><div class="notion-text notion-block-70e68bfed0cc4c09b915cf8102e5c02a">{<div class="notion-text-children"><div class="notion-text notion-block-667e12cec63246e196628a42a27604f0">un_only_once = 1;</div><div class="notion-text notion-block-643ef8700ba24b8ca763efb5a887f1a2">m = an_ir_valley_locs[k];</div><div class="notion-text notion-block-b48ab9709ca74757bbb02986d490a546">n_c_min = 16777216; // 设置一个较大的初始值，2^24</div><div class="notion-text notion-block-daab684a012a443982b3ceb0a57c3534">// 在波谷位置的前后寻找最小值，以确定波谷的实际位置</div><div class="notion-text notion-block-ad03d543221c40b2897b79f417d668cb">if (m + 5 &lt; BUFFER_SIZE - HAMMING_SIZE &amp;&amp; m - 5 &gt; 0)</div><div class="notion-text notion-block-7e29730ab8704eb587292d17ff2ec3b8">//检查实际红外信号谷值位置 m 前后是否有足够的空间，以防数组越界。</div><div class="notion-text notion-block-7f569ac99169499f8c5df1ae61a9a944">{<div class="notion-text-children"><div class="notion-text notion-block-7a47d9b12dc4473380827d88916729ea">for (i = m - 5; i &lt; m + 5; i++)</div><div class="notion-text notion-block-50aa56d32e5e4b1d9e9076fcfec2ee3b">//循环遍历从当前谷值位置向前后各取5个点的范围。</div><div class="notion-text notion-block-23abb159943f45d6be1f3bfe7e7c4058">{<div class="notion-text-children"><div class="notion-text notion-block-21ad23deb99c4a5daedc5d5932a7eade">if (an_x[i] &lt; n_c_min)</div><div class="notion-text notion-block-3017c954d5ea4e318313959e622d3c3f">{<div class="notion-text-children"><div class="notion-text notion-block-2d0e95ffb93a4e4f86e6e5d1d625c101">if (un_only_once &gt; 0)</div><div class="notion-text notion-block-42947f85021740bab69abe7f753141fb">{<div class="notion-text-children"><div class="notion-text notion-block-9bcd4ed9074346c4a6c831f7505028d0">//第一次找到最小值，将其设为0以标记已经找到最小值。</div><div class="notion-text notion-block-e548f2fadcdf456b9c75ed49ffdc87dd">un_only_once = 0;</div></div></div><div class="notion-text notion-block-82fd59cc8cfb43f48388f9111d097e6f">}</div><div class="notion-text notion-block-b6e0516207084939be4ee464bacacfb5">n_c_min = an_x[i];</div><div class="notion-text notion-block-692ac93653904fe184749a15f441db47">an_exact_ir_valley_locs[k] = i;</div></div></div><div class="notion-text notion-block-4bddf7631a664cd18e943e68f4ca1e29">}</div></div></div><div class="notion-text notion-block-af5ecb4464334a37a5e74ef906d993ee">}</div><div class="notion-text notion-block-5392bff5de4c473f889ef5d9c8bafe4d">// 如果找到了最小值，增加实际波谷位置的计数</div><div class="notion-text notion-block-bb8128b74e5b425d8d5526d9c092d0a1">if (un_only_once == 0)<div class="notion-text-children"><div class="notion-text notion-block-7e23e3a525f946c098997d65f4bd6f61">n_exact_ir_valley_locs_count++;</div></div></div></div></div><div class="notion-text notion-block-d63cb425833649cd964acfd50156a3b8">}</div></div></div><div class="notion-text notion-block-0c3cbdb9b1c44c04b0a8a177dc581791">}</div><div class="notion-text notion-block-7971d75ce9ff444793dfed0b8ad3df40">// 波谷是信号的极小值，用于确定每个心跳周期的起始点。如果确切波谷位置的数量小于2，说明信号比值超出范围，设置SPO2为无效值-999</div><div class="notion-text notion-block-d4f3995e1a8a4b428f4efde400e448b7">if (n_exact_ir_valley_locs_count &lt; 2)</div><div class="notion-text notion-block-1347babc7fa54fc6a2fd44b48ab93b1f">{<div class="notion-text-children"><div class="notion-text notion-block-41dff26f1ade4dffae4b05d80edabc9d">*pn_spo2 = -999;</div><div class="notion-text notion-block-c78d4ccb69dd4296aac62d03b6eef973">*pch_spo2_valid = 0;</div><div class="notion-text notion-block-d1663c9ede564bf8925f22d2b84e99cb">return;</div></div></div><div class="notion-text notion-block-d0ebac642a6e471081daafcc66cd5684">}<div class="notion-text-children"><div class="notion-text notion-block-60d2889fcf7548b5a0ad9b88fdd64237">// 4点移动平均，平滑信号并降低高频噪声的影响</div><div class="notion-text notion-block-ce706b0c7ff94e24bd02bb212b0b4209">for (k = 0; k &lt; BUFFER_SIZE - MA4_SIZE; k++)</div><div class="notion-text notion-block-fa1c97ea9cba43108ccaadc9a8f35329">{<div class="notion-text-children"><div class="notion-text notion-block-13a043617a93439e9a4a2f5aa49ba1ce">an_x[k] = (an_x[k] + an_x[k + 1] + an_x[k + 2] + an_x[k + 3]) / (int32_t)4;</div><div class="notion-text notion-block-3952942be7084dadb1e3ab9ca1e8fa5a">an_y[k] = (an_y[k] + an_y[k + 1] + an_y[k + 2] + an_y[k + 3]) / (int32_t)4;</div></div></div><div class="notion-text notion-block-5374c2f606f3475fa14f657b167fb56b">}<div class="notion-text-children"><div class="notion-text notion-block-8f4a0f84d3354957bf5bce1f8c816c7a">// 使用an_exact_ir_valley_locs，找到IR-RED DC和IR-RED AC进行SPO2校准比率</div></div></div></div></div><div class="notion-text notion-block-17e157dfaede4b9890aa973e892fb3c8">//使用先前找到的红外信号的谷位置（an_exact_ir_valley_locs），来计算IR-RED DC和IR-RED AC的比率。用于SPO2（血氧饱和度）的校准。<div class="notion-text-children"><div class="notion-text notion-block-99c65f551a6a48afb4ae0f952eef6076">n_ratio_average = 0;</div><div class="notion-text notion-block-555c1c61105a4d7db04fe55b3e0a5a5a">n_i_ratio_count = 0;</div><div class="notion-text notion-block-6ee434a83323485da9a1558c5c62d7fe">for (k = 0; k &lt; 5; k++)<div class="notion-text-children"><div class="notion-text notion-block-4407efb7e58847628c4c12b9099b9fb3">an_ratio[k] = 0;</div></div></div><div class="notion-text notion-block-fbb0cbcd96864e2f8b4dceff91f6746f">for (k = 0; k &lt; n_exact_ir_valley_locs_count; k++)</div><div class="notion-text notion-block-c4bd3503cdeb42b3b1065964f6ed57d6">{<div class="notion-text-children"><div class="notion-text notion-block-6a00d64209904a7da2bfd4d9393a6827">if (an_exact_ir_valley_locs[k] &gt; BUFFER_SIZE)</div><div class="notion-text notion-block-4dab4199f012448d986d8ba78abc2d17">{<div class="notion-text-children"><div class="notion-text notion-block-19ae71a7ce0646d4a9081aa09265519b">*pn_spo2 = -999;   // 因为谷位置超出范围，不是正确的SPO2</div><div class="notion-text notion-block-18418f06b73f4e9f83b4fb0420333206">*pch_spo2_valid = 0;</div><div class="notion-text notion-block-ce42bdf362d04c6d82269e32c729401b">return;</div></div></div><div class="notion-text notion-block-11505fe93390472f917d25dd57faedd9">}</div></div></div><div class="notion-text notion-block-c0f1d315abd14f629b06a3db206e9555">}</div></div></div><div class="notion-text notion-block-4304934ecd0e4adbb5dfbc706e132bb2">/*</div><div class="notion-text notion-block-9a1384c5aa5045f08c29bbffcf812d58">计算红光和红外信号的交流分量的乘积，并将计算得到的AC/DC比值保存到数组中。</div><div class="notion-text notion-block-a3bb88a92963461494f378d578eb9869">其中，通过找到两个谷值之间的最大值来估算直流分量，然后计算交流分量，并最终得到AC/DC比值。</div><div class="notion-text notion-block-e79c8746e9864e18a4d1f65449a9abc6">整个过程旨在对信号进行预处理，为后续的SPO2（血氧饱和度）计算提供必要的信息。</div><div class="notion-text notion-block-4d5d36655c534d148f9ca784e9a2869c">*/</div><div class="notion-text notion-block-1ab25d00b2094a95a1d61c445dbf1aed">for (k = 0; k &lt; n_exact_ir_valley_locs_count - 1; k++)</div><div class="notion-text notion-block-b386587d4ab248aa874a16f4a1838a78">{<div class="notion-text-children"><div class="notion-text notion-block-9fce33a903c34d4680b54ee36712e8bf">n_y_dc_max = -16777216;   // 初始化红光信号的最大直流分量为一个较小的负数</div><div class="notion-text notion-block-d1d990e5cce740cea7f7da6156734b55">n_x_dc_max = -16777216;   // 初始化红外信号的最大直流分量为一个较小的负数</div><div class="notion-text notion-block-fe0f2ccaf4b440f08151f4767d208ad1">// 判断两个谷值之间的距离是否大于10个样本点，确保两谷之间有足够的数据进行计算</div><div class="notion-text notion-block-4628f670c76e41769724e4ddaeb228c7">if (an_exact_ir_valley_locs[k + 1] - an_exact_ir_valley_locs[k] &gt; 10)</div><div class="notion-text notion-block-9c77d3d48d5444699348201c4c893b56">{<div class="notion-text-children"><div class="notion-text notion-block-afb8a4394bb04b9d99c1c7cf88631cb2">// 遍历两个谷值之间的数据</div><div class="notion-text notion-block-3440cd5bfb744fbfae837d5bd4520059">for (i = an_exact_ir_valley_locs[k]; i &lt; an_exact_ir_valley_locs[k + 1]; i++)</div><div class="notion-text notion-block-6a306bb01fee4d50ab31a206ad2866d1">{<div class="notion-text-children"><div class="notion-text notion-block-842e8ad596f04809a0532f0905d1850a">// 找到红外信号的最大值及对应索引</div><div class="notion-text notion-block-d576a1a77d9e4f0d8276f6d71c633d9f">if (an_x[i] &gt; n_x_dc_max)</div><div class="notion-text notion-block-b5a4738015214ad99afeaff0758f492d">{<div class="notion-text-children"><div class="notion-text notion-block-aefe506a847146a28e1e042703461078">n_x_dc_max = an_x[i];</div><div class="notion-text notion-block-287cd1f8ea6b4676903ea9b2154049d9">n_x_dc_max_idx = i;</div></div></div><div class="notion-text notion-block-d107355c4ec24075aee04522a4409984">}</div><div class="notion-text notion-block-db9f8c209f054238bd5ecc1c91163bb5">// 找到红光信号的最大值及对应索引</div><div class="notion-text notion-block-a9f1becc7c9f4b648b8f2799fa2faa5b">if (an_y[i] &gt; n_y_dc_max)</div><div class="notion-text notion-block-c9c3faa5ed084c1a913e00d3ebf3b1ad">{<div class="notion-text-children"><div class="notion-text notion-block-f0324848dfdf4f6a9b3bc9cf31b22d84">n_y_dc_max = an_y[i];</div><div class="notion-text notion-block-d2d3f74badc44447925d073c36503d62">n_y_dc_max_idx = i;</div></div></div><div class="notion-text notion-block-624fd826a57c490db3603b4957700659">}</div></div></div><div class="notion-text notion-block-a6b359f1be014822a85698cff89b43bb">}</div><div class="notion-text notion-block-27869db46e0d4ffda2c87fa73ce685e3">// 计算红光的交流分量</div><div class="notion-text notion-block-96a5350c3068423089f0f52f454ab759">//计算红光信号在两个相邻谷值之间的交流成分，使用两个谷值之间的光强差值乘以相邻两个峰谷之间的距离。</div><div class="notion-text notion-block-2b2a59a940714946883ec47e347c57d1">//an_y: 这是存储红光信号光强数据的数组</div><div class="notion-text notion-block-9617483b0b6b47cb9f8e5b9d5e6aa6c2">//an_exact_ir_valley_locs: 这是存储实际红外信号波谷位置的数组</div><div class="notion-text notion-block-4ded8faf691342da80b038092e2fec8f">//n_y_dc_max_idx，红光信号的最大峰值位置的索引</div><div class="notion-text notion-block-9ffe3c3cc0c14c279f1abe1c74099bf1">n_y_ac = (an_y[an_exact_ir_valley_locs[k + 1]] - an_y[an_exact_ir_valley_locs[k]]) * (n_y_dc_max_idx - an_exact_ir_valley_locs[k]);</div><div class="notion-text notion-block-7b0df1783c874cbb8319a70891fa37ce">//将得到的红光的交流分量加到红光信号在前一个谷值位置的基线值上</div><div class="notion-text notion-block-62df9b8c5f994c8d84d5a03bb2f2a134">n_y_ac = an_y[an_exact_ir_valley_locs[k]] + n_y_ac / (an_exact_ir_valley_locs[k + 1] - an_exact_ir_valley_locs[k]);</div><div class="notion-text notion-block-cdc0e8d8d0ab4f9bb4b4f37da4c97209">// 消除红光信号的直流分量</div><div class="notion-text notion-block-1c53fc0f0c4143dbbbbbb7bb8bc35be9">n_y_ac = an_y[n_y_dc_max_idx] - n_y_ac;</div><div class="notion-text notion-block-6249128ce8794ce68ab08c325e348bc1">//写成abs(n_y_ac - an_y[n_y_dc_max_idx])是否可以？</div><div class="notion-text notion-block-9b85266bac6e474caf4a87f687e785be">// 计算红外光的交流分量</div><div class="notion-text notion-block-2406f45aacf0449788f0d4511aae8102">n_x_ac = (an_x[an_exact_ir_valley_locs[k + 1]] - an_x[an_exact_ir_valley_locs[k]]) * (n_x_dc_max_idx - an_exact_ir_valley_locs[k]);</div><div class="notion-text notion-block-75c5ceddc6e548ae9dcf36c61fb3995c">n_x_ac = an_x[an_exact_ir_valley_locs[k]] + n_x_ac / (an_exact_ir_valley_locs[k + 1] - an_exact_ir_valley_locs[k]);</div><div class="notion-text notion-block-6291f4f312a841fbae32905eee38f65a">// 消除红外信号的直流分量</div><div class="notion-text notion-block-541de8dfea6149938e7cf68169dcdf92">n_x_ac = an_x[an_exact_ir_valley_locs[k + 1]] - n_x_ac;</div><div class="notion-text notion-block-ced15ba8c00d4453b8d90080dbe02b5b">// 将红光信号的AC分量与红外信号最大峰值位置的直流分量相乘，作为计算SPO2的分子</div><div class="notion-text notion-block-1ffb032a40354945a9217c499b2e85a2">n_nume = (n_y_ac * n_x_dc_max) &gt;&gt; 7;</div><div class="notion-text notion-block-c57be054339047108bb79c7cf83dffb6">// 将红外信号的AC分量与红光信号最大峰值位置的直流分量相乘，作为计算SPO2的分母</div><div class="notion-text notion-block-94f710cdf4b04360be587341eda4e4a5">n_denom = (n_x_ac * n_y_dc_max) &gt;&gt; 7;</div><div class="notion-text notion-block-56bd611513e247548ebdb64949399401">// 判断分母是否大于0，避免除零错误，并判断是否满足条件，满足则进行下一步计算</div><div class="notion-text notion-block-0951710c48ce4a51abea69f947c6a5c0">if (n_denom &gt; 0 &amp;&amp; n_i_ratio_count &lt; 5 &amp;&amp; n_nume != 0)</div><div class="notion-text notion-block-c24f40b970af4fd2a02a93515b5cbf90">{<div class="notion-text-children"><div class="notion-text notion-block-78c51a2785f54bd7a2e50768e9070f49">// 计算AC/DC比值并保存到数组中</div><div class="notion-text notion-block-336cc8476cb748e0820bd5ee240e8531">an_ratio[n_i_ratio_count] = (n_nume * 20) / n_denom;</div><div class="notion-text notion-block-494c5c1bc3224f8eb02a48df1b995cf2">n_i_ratio_count++;</div></div></div><div class="notion-text notion-block-3ddaf71c321642c49c6061a431dd6846">}</div></div></div><div class="notion-text notion-block-239609e0b90e48dbb6a5cbee8c5fc157">}</div></div></div><div class="notion-text notion-block-452a304460fe4084be2425430c4c7285">}</div><div class="notion-text notion-block-29f70617187e4ef29833519908f151ee">/*</div><div class="notion-text notion-block-f258408afc0847ffbddd9157d6a33946">对排序后的AC/DC比值数组进行处理，计算得到中值平均（或直接取中值），并通过判断得到的AC/DC比值</div><div class="notion-text notion-block-cee9c4114c4142d599940a4941ca4b41">是否在有效范围内，确定最终的SPO2值。如果AC/DC比值有效，通过查表获取对应的SPO2值，否则将SPO2</div><div class="notion-text notion-block-0110d4cea3f94e118a0598552fd15f74">值设为无效。在实际应用中，通过对AC/DC比值的处理，结合预先计算的SPO2表格，可以更准确地估算血氧饱和度。</div><div class="notion-text notion-block-4b6f38b4d4bf47659f5fd66bcb0ee403">*/</div><div class="notion-text notion-block-1db29a4adcb840abaa7ef5b346194c63">// 将存储AC/DC比值的数组按升序排列</div><div class="notion-text notion-block-94de772cd38c4e7e87b00b46314e3589">maxim_sort_ascend(an_ratio, n_i_ratio_count);</div><div class="notion-text notion-block-158215102a3b4daea9200b86bf0be8ff">// 计算中间值的索引</div><div class="notion-text notion-block-767804ebd89a4fa296c0e9bcbd7c39fe">n_middle_idx = n_i_ratio_count / 2;</div><div class="notion-text notion-block-aca5f4b6ad0043e89f2573da82012cff">// 如果中间索引大于1，使用中值平均计算AC/DC比值</div><div class="notion-text notion-block-7b260efcc49848f88a7dc929a9719918">if (n_middle_idx &gt; 1)<div class="notion-text-children"><div class="notion-text notion-block-9a831c4d9f664317835ef3d09d3d504f">n_ratio_average = (an_ratio[n_middle_idx - 1] + an_ratio[n_middle_idx]) / 2;</div></div></div><div class="notion-text notion-block-e22dbe8c7a7b48b39c87983a4dfc04b8">else<div class="notion-text-children"><div class="notion-text notion-block-00148964c20b404eba7773e7f82d7ebf">n_ratio_average = an_ratio[n_middle_idx];</div></div></div><div class="notion-text notion-block-6d7adb78d2b6430bad0a9a65eeac51b7">// 判断计算得到的AC/DC比值是否在有效范围内</div><div class="notion-text notion-block-f397b1b87cbc494c8d9796d0b88e398c">if (n_ratio_average &gt; 2 &amp;&amp; n_ratio_average &lt; 184)</div><div class="notion-text notion-block-e03f24d8563441428214dd1952b1b2cd">{<div class="notion-text-children"><div class="notion-text notion-block-6af1db8c5259428c94e215951e4fe2a0">// 通过查表获取对应的SPO2值</div><div class="notion-text notion-block-f9b6f99a57ca459592d1bfbd5c653fcb">n_spo2_calc = uch_spo2_table[n_ratio_average];</div><div class="notion-text notion-block-49dfd5b4e32d4fb1aedb0ab14038f56f">*pn_spo2 = n_spo2_calc;</div><div class="notion-text notion-block-745c61081b214823a9608c895622992e">*pch_spo2_valid = 1; // 设置SPO2有效标志</div><div class="notion-text notion-block-3299e84a7b1c4c1a9c2abd21ad8b71a9">// 可选：用以下公式计算浮点数SPO2，与查表结果进行比较</div><div class="notion-text notion-block-243961a8ab804efaa993032cf832fded">// float_SPO2 = -45.060 <em> n_ratio_average </em> n_ratio_average / 10000 + 30.354 * n_ratio_average / 100 + 94.845;</div></div></div><div class="notion-text notion-block-a595646afc104699bf1438cf3f33df36">}</div><div class="notion-text notion-block-f897fac9dd174bd5b64acf9ae4490b9f">else</div><div class="notion-text notion-block-3deed3f9e89d4005a3c53e0151f338b4">{<div class="notion-text-children"><div class="notion-text notion-block-78dada314e474262bc94cca6b4731a8a">// 如果计算得到的AC/DC比值不在有效范围内，设置SPO2为无效值</div><div class="notion-text notion-block-f85df67c48744ab1b11442a5b4a3358d">*pn_spo2 = -999;</div><div class="notion-text notion-block-908ca503405f4e1a8f50b0872eed533c">*pch_spo2_valid = 0;</div></div></div><div class="notion-text notion-block-4273be19f0e7487b8e68f08096b0f93b">}</div></div></div><div class="notion-text notion-block-4c343f5d779d49b2aede11e6d3bb09aa">}</div><div class="notion-text notion-block-e389a121bae644359424f1e8b6126b73">void maxim_find_peaks(int32_t <em>pn_locs, int32_t </em>pn_npks, int32_t *pn_x, int32_t n_size, int32_t n_min_height, int32_t n_min_distance, int32_t n_max_num)</div><div class="notion-text notion-block-4646a7675ce048bb98762f5cf5b576e8">/</div><ul class="notion-list notion-list-disc notion-block-1bc130c391bb4d17addbabdfc42f245d"><li>brief        Find peaks</li></ul><ul class="notion-list notion-list-disc notion-block-ab34b19941804aeba6f94b4988398a45"><li>par          Details</li></ul><ul class="notion-list notion-list-disc notion-block-7f0c97ffa84045d4831c6ae24c3a93ee"><li>Find at most MAX_NUM peaks above MIN_HEIGHT separated by at least MIN_DISTANCE</li></ul><ul class="notion-list notion-list-disc notion-block-7c9c1c5691f6424bb9c3e67e1bc17fe5"></ul><ul class="notion-list notion-list-disc notion-block-62b8cdbd982d46f08601602c3fdcca8d"><li>retval       None</li></ul><div class="notion-text notion-block-4d55d1bc29a74e7ca984850f2238fdd1">*/</div><div class="notion-text notion-block-9aea881453494a6d87e0b5ed6d9edd20">{<div class="notion-text-children"><div class="notion-text notion-block-b19f2524b99d4344ae3504702744a8dd">maxim_peaks_above_min_height( pn_locs, pn_npks, pn_x, n_size, n_min_height );<div class="notion-text-children"><div class="notion-text notion-block-19ee0f75ab3943f5b3d9bf8e37e392c9">maxim_remove_close_peaks( pn_locs, pn_npks, pn_x, n_min_distance );</div><div class="notion-text notion-block-a6ffe5d084994e6dabbe64c2e15dceba"><em>pn_npks = min( </em>pn_npks, n_max_num );</div></div></div></div></div><div class="notion-text notion-block-7916c083567847eb984ebf117ee48255">}</div><div class="notion-text notion-block-1a6a4f5b8e9d4964ae8275b892eb352d">void maxim_peaks_above_min_height(int32_t <em>pn_locs, int32_t </em>pn_npks, int32_t  *pn_x, int32_t n_size, int32_t n_min_height)</div><div class="notion-text notion-block-a69e50db9fd04b52adcec47d23917e3c">/</div><ul class="notion-list notion-list-disc notion-block-ee86903846a243c2a1690e1e1b7cd5e4"><li>brief        Find peaks above n_min_height</li></ul><ul class="notion-list notion-list-disc notion-block-cffb5ff0ee374bcd8edf6f26445fa0eb"><li>par          Details</li></ul><ul class="notion-list notion-list-disc notion-block-26306a95e8b04a4da4d4cb83a1937945"><li>Find all peaks above MIN_HEIGHT</li></ul><ul class="notion-list notion-list-disc notion-block-a41f782bcc114b13b27b75c6d87ac16d"></ul><ul class="notion-list notion-list-disc notion-block-4d0b9e1c03fc463faf0ebf96d7f34b32"><li>retval       None</li></ul><div class="notion-text notion-block-2c7053545ceb453eacad410770fa632c">*/</div><div class="notion-text notion-block-2737d8f12a0346fbbd22925e889033c3">{<div class="notion-text-children"><div class="notion-text notion-block-7461853250c44b0e9f4328d1a58ac1c7">int32_t i = 1, n_width;</div><div class="notion-text notion-block-ff9173ad59514d5a9440b242861c9257">*pn_npks = 0;</div><div class="notion-text notion-block-1ab8023161ae4185a557616cde83e470">while (i &lt; n_size-1){<div class="notion-text-children"><div class="notion-text notion-block-c563c079239d40fe8814f125e39fa770">if (pn_x[i] &gt; n_min_height &amp;&amp; pn_x[i] &gt; pn_x[i-1]){            // find left edge of potential peaks<div class="notion-text-children"><div class="notion-text notion-block-427284f6499647b8b0c1a67bc94a310d">n_width = 1;</div><div class="notion-text notion-block-8a40dc01a71d4229ba678f4813af0f4f">while (i+n_width &lt; n_size &amp;&amp; pn_x[i] == pn_x[i+n_width])    // find flat peaks<div class="notion-text-children"><div class="notion-text notion-block-2445e4239d94471089c8dc3069957e5e">n_width++;</div></div></div><div class="notion-text notion-block-4ba9e0c615b74441998509dca67b666a">if (pn_x[i] &gt; pn_x[i+n_width] &amp;&amp; (*pn_npks) &lt; 15 ){                            // find right edge of peaks<div class="notion-text-children"><div class="notion-text notion-block-93ccc07fe5f245fbaf78242420ece437">pn_locs[(*pn_npks)++] = i;        </div><div class="notion-text notion-block-0fb94953a8c64efab64200bed54e9347">// for flat peaks, peak location is left edge</div><div class="notion-text notion-block-49ee2856589446ffbafd3c3be79caad8">i += n_width+1;</div></div></div><div class="notion-text notion-block-eb4456dd772d408480ddb7fcd15743a7">}</div><div class="notion-text notion-block-105044749cd34543ad56a904355402ba">else<div class="notion-text-children"><div class="notion-text notion-block-ebdb6cd4bf5b441798f6041a0bb11c88">i += n_width;</div></div></div></div></div><div class="notion-text notion-block-3d87ca43d60b41c89497e4516c24d868">}</div><div class="notion-text notion-block-6415e80982524e748e25f558848d5fe9">else<div class="notion-text-children"><div class="notion-text notion-block-597c095cf571451181565637783ea36a">i++;</div></div></div></div></div><div class="notion-text notion-block-f74c927f8e94474d99ccc0266efc3b43">}</div></div></div><div class="notion-text notion-block-8ac6de821b22431d9197b67e53719a3c">}</div><div class="notion-text notion-block-3acec64d3b064d199d374669ccebbb61">void maxim_remove_close_peaks(int32_t <em>pn_locs, int32_t </em>pn_npks, int32_t *pn_x, int32_t n_min_distance)</div><div class="notion-text notion-block-840d1204b8024302840e1a65720a5cf3">/</div><ul class="notion-list notion-list-disc notion-block-10d3fc4b1ac14faebb8f14c329a6a811"><li>brief        Remove peaks</li></ul><ul class="notion-list notion-list-disc notion-block-88a24b13051d4c83bc82589c4a9c1a66"><li>par          Details</li></ul><ul class="notion-list notion-list-disc notion-block-f441ef2ec59943fa9af0aa85c6b26b79"><li>Remove peaks separated by less than MIN_DISTANCE</li></ul><ul class="notion-list notion-list-disc notion-block-1f99082b286b43b889f77bbe139f7d00"></ul><ul class="notion-list notion-list-disc notion-block-e36d1c98b6ca401b949d2bb198226d76"><li>retval       None</li></ul><div class="notion-text notion-block-c2da36032dc74db283dad66c3aab321f">*/</div><div class="notion-text notion-block-2f63e895b93d4d958b90ccffc9d539e4">{<div class="notion-text-children"><div class="notion-text notion-block-f2689ee04f1745db994da02f2a9c4eac">int32_t i, j, n_old_npks, n_dist;</div><div class="notion-text notion-block-ee755d0347c64d13990fa06072b32823">/<em> Order peaks from large to small </em>/</div><div class="notion-text notion-block-f8e4b7a97a10444da1ab650bc8c4882c">maxim_sort_indices_descend( pn_x, pn_locs, *pn_npks );</div><div class="notion-text notion-block-bac9c19bc7c24bd1b758d2caff7c2aec">for ( i = -1; i &lt; *pn_npks; i++ ){<div class="notion-text-children"><div class="notion-text notion-block-0740c7e0329249cb84fa7c7ad2793401">n_old_npks = *pn_npks;</div><div class="notion-text notion-block-efbcecba9dcc4856be819d640565a189">*pn_npks = i+1;</div><div class="notion-text notion-block-4520f9f7f5f64b78a5a45b736e4ce041">for ( j = i+1; j &lt; n_old_npks; j++ ){<div class="notion-text-children"><div class="notion-text notion-block-f4784240df624267afa52cde2d3c98aa">n_dist =  pn_locs[j] - ( i == -1 ? -1 : pn_locs[i] ); // lag-zero peak of autocorr is at index -1</div><div class="notion-text notion-block-d42013fac6114edfb84e69c464af381d">if ( n_dist &gt; n_min_distance || n_dist &lt; -n_min_distance )<div class="notion-text-children"><div class="notion-text notion-block-8b52bc0d25074b3abdae9b3a19d47691">pn_locs[(*pn_npks)++] = pn_locs[j];</div></div></div></div></div><div class="notion-text notion-block-d0f1fd43c95b4d779bce1296d73a93b7">}</div></div></div><div class="notion-text notion-block-be7dc4845fce4a5c846de31558206356">}</div><div class="notion-text notion-block-30b860ca2c4a4e7ca31166b044862322">// Resort indices longo ascending order</div><div class="notion-text notion-block-cd8ee90ff3744b7784ebc28ac62ab4ec">maxim_sort_ascend( pn_locs, *pn_npks );</div></div></div><div class="notion-text notion-block-fd1e90cdc2ca4a04a60a846ae6f43467">}</div><div class="notion-text notion-block-3f492e10492e47e89f9d7db106d2d825">void maxim_sort_ascend(int32_t *pn_x,int32_t n_size) </div><div class="notion-text notion-block-924dc991d6d94b75b6616715dccc8bd5">/</div><ul class="notion-list notion-list-disc notion-block-5185c0974bf94ad0ab36b55b8f0467cd"><li>brief        Sort array</li></ul><ul class="notion-list notion-list-disc notion-block-460485063306408e832df9201bfb4a18"><li>par          Details</li></ul><ul class="notion-list notion-list-disc notion-block-25678837ffa04134a2e0e966efe99456"><li>Sort array in ascending order (insertion sort algorithm)</li></ul><ul class="notion-list notion-list-disc notion-block-b1d2c4c131bf492399605b0a8d4a759c"></ul><ul class="notion-list notion-list-disc notion-block-cb0eb3dbeeab4b9aab71b05ab5645efc"><li>retval       None</li></ul><div class="notion-text notion-block-b1af10d62b34407ea86360bdb011cb58">*/</div><div class="notion-text notion-block-412cdae87fdb4969b4992ce6d22c88c7">{<div class="notion-text-children"><div class="notion-text notion-block-9ae4e89efcd64a22beec899703d65b82">int32_t i, j, n_temp;</div><div class="notion-text notion-block-c5796160c7e24c5381fcd01783574463">for (i = 1; i &lt; n_size; i++) {<div class="notion-text-children"><div class="notion-text notion-block-146ff980e0a243c09ff5c9f58a57ceef">n_temp = pn_x[i];</div><div class="notion-text notion-block-6cb7ba2afc544e68b451a1b93b51bc14">for (j = i; j &gt; 0 &amp;&amp; n_temp &lt; pn_x[j-1]; j--)<div class="notion-text-children"><div class="notion-text notion-block-5a6ac4586f684317a482f10c94af0d41">pn_x[j] = pn_x[j-1];</div></div></div><div class="notion-text notion-block-9c4743f5dff742dca550f20c1708e2a0">pn_x[j] = n_temp;</div></div></div><div class="notion-text notion-block-3874d646cd894d2db6c50dfa06f5d3e5">}</div></div></div><div class="notion-text notion-block-95e40654d4a84c27a1d4913e973ab2b2">}</div><div class="notion-text notion-block-4980726e9d504af9b58fe9f351fc134e">void maxim_sort_indices_descend(int32_t <em>pn_x, int32_t </em>pn_indx, int32_t n_size)</div><div class="notion-text notion-block-49c7bfc539964d4cb5172ec8f537865a">/</div><ul class="notion-list notion-list-disc notion-block-45df745ab19245f18861c2b883906ea5"><li>brief        Sort indices</li></ul><ul class="notion-list notion-list-disc notion-block-c7e688603ec84725a4cf4b490502dabe"><li>par          Details</li></ul><ul class="notion-list notion-list-disc notion-block-f7ff05be790447e7adee52c6fb75aa60"><li>Sort indices according to descending order (insertion sort algorithm)</li></ul><ul class="notion-list notion-list-disc notion-block-a6e132a5b5bb4cafa9040613600d2086"></ul><ul class="notion-list notion-list-disc notion-block-ea98ddb0a317469d961a27c7566a39bc"><li>retval       None</li></ul><div class="notion-text notion-block-fe50b49b973842c5a2e0743a9acbfefd">*/ </div><div class="notion-text notion-block-d35b86610c8c488ba17f51d44e83955c">{<div class="notion-text-children"><div class="notion-text notion-block-a353cb97c2354896b420c65786c1ca47">int32_t i, j, n_temp;</div><div class="notion-text notion-block-08077de3d84c44c5adfffdeef5f423fb">for (i = 1; i &lt; n_size; i++) {<div class="notion-text-children"><div class="notion-text notion-block-81cfb468b6024e72af3ff4e6df7411a9">n_temp = pn_indx[i];</div><div class="notion-text notion-block-2d03f83b8cf5466eb817a2078d48dc21">for (j = i; j &gt; 0 &amp;&amp; pn_x[n_temp] &gt; pn_x[pn_indx[j-1]]; j--)<div class="notion-text-children"><div class="notion-text notion-block-e63e646fa0e0455fbd35a2f3dbe53bc2">pn_indx[j] = pn_indx[j-1];</div></div></div><div class="notion-text notion-block-463eb3c0547e47ae940bbcbf21ade90d">pn_indx[j] = n_temp;</div></div></div><div class="notion-text notion-block-06bdf1758396418ab24fd3e7b53f7071">}</div></div></div><div class="notion-text notion-block-592e0332311f4b1aae7ddff9e95b9eea">}<div class="notion-text-children"></div></div><div class="notion-callout notion-gray_background_co notion-block-6b684031310444b2bc0a9db3037efe67"><div class="notion-page-icon-inline notion-page-icon-span"><span class="notion-page-icon" role="img" aria-label="💡">💡</span></div><div class="notion-callout-text"><div class="notion-text notion-block-e12eece8af394274b91f0ac9dff1c468">有关MAX30102学习或者使用上的问题，欢迎您在底部评论区留言，一起交流~</div></div></div></main></div>]]></content:encoded>
        </item>
    </channel>
</rss>