<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Stm32_note on ynhugo</title><link>https://ynhugo.github.io/tags/stm32_note/</link><description>Recent content in Stm32_note on ynhugo</description><generator>Hugo -- gohugo.io</generator><language>zh-cn</language><lastBuildDate>Thu, 16 Feb 2023 08:03:05 +0800</lastBuildDate><atom:link href="https://ynhugo.github.io/tags/stm32_note/index.xml" rel="self" type="application/rss+xml"/><item><title>stm32_note_01day</title><link>https://ynhugo.github.io/p/stm32_01day/</link><pubDate>Thu, 16 Feb 2023 08:03:05 +0800</pubDate><guid>https://ynhugo.github.io/p/stm32_01day/</guid><description>&#10;&lt;div id="outline-container-headline-1" class="outline-2"&gt;&#10;&lt;h2 id="headline-1"&gt;&#10;stm32_note_01day&#10;&lt;/h2&gt;&#10;&lt;div id="outline-text-headline-1" class="outline-text-2"&gt;&#10;&lt;p&gt;&#10;=============================&lt;br&gt;&#10;2022-8-15&lt;br&gt;&#10;=============================&lt;/p&gt;&#10;&lt;div id="outline-container-headline-2" class="outline-3"&gt;&#10;&lt;h3 id="headline-2"&gt;&#10;一.进入新的阶段&#10;&lt;/h3&gt;&#10;&lt;div id="outline-text-headline-2" class="outline-text-3"&gt;&#10;&lt;pre class="example"&gt;&#10; STM32阶段(智能终端设备阶段)&#10; 原由&#10; 1.为了从应用层到底层内核驱动的过渡&#10; 2.在高端的开发板上讲带操作系统的驱动,裸板驱动在STM32上讲&#10; 3.国家大力的推广5G技术(海量物联)-&amp;gt;所以需要讲智能终端设备&#10;&lt;/pre&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;div id="outline-container-headline-3" class="outline-3"&gt;&#10;&lt;h3 id="headline-3"&gt;&#10;二.阶段性项目&#10;&lt;/h3&gt;&#10;&lt;div id="outline-text-headline-3" class="outline-text-3"&gt;&#10;&lt;pre class="example"&gt;&#10; 物联网智能终端的产品&#10; 基础的物联网项目架构&#10; 分为4个层次&#10; 感知层&#10; 网络层&#10; 平台层&#10; 应用层&#10; 新型的物联网项目框架会加入边缘计算设备&#10; 物联网的两个分支&#10; 智能终端设备 : 单片机的内容&#10; 边缘计算设备 : 高端芯片的内容&#10; 小爱同学&#10; 天猫精灵&#10; 小度小度&#10;&lt;/pre&gt;&#10;&lt;p&gt;&#10;基础的物联网项目架构&lt;br&gt;&#10;&lt;img src="resources/基础的物联网项目架构.png" alt="resources/基础的物联网项目架构.png" title="resources/基础的物联网项目架构.png" /&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;div id="outline-container-headline-4" class="outline-3"&gt;&#10;&lt;h3 id="headline-4"&gt;&#10;三.安装开发环境&#10;&lt;/h3&gt;&#10;&lt;div id="outline-text-headline-4" class="outline-text-3"&gt;&#10;&lt;pre class="example"&gt;&#10; 同学们在飞秋上，下载压缩包&amp;lt;STM32RBT6_SDK.zip&amp;gt;&#10; 同学们在电脑上安装一个好用的PDF阅读器&#10; 1.把windows操作系统上的文件扩展名先显示出来&#10; 2.把压缩包&amp;lt;STM32RBT6_SDK.zip&amp;gt;解压一下&#10; 3.工具包文件的认知&#10; &amp;lt;DataSheet&amp;gt;&#9;存放的都是数据手册&#10; &amp;lt;ST官方固件&amp;gt;&#9;存放的都是ST公司的官方固件&#10; &amp;lt;开发板原理图&amp;gt;&#9;存放的是开发板原理图&#10; &amp;lt;开发工具&amp;gt;&#9;存放的是单片机开发会用到的工具&#10; 4.安装集成的开发环境&#10; 在&amp;lt;STM32RBT6\开发工具\MDK520&amp;gt;中&amp;lt;MDK520.exe&amp;gt;&#10; 双击安装&#10; 1)在安装Keil时安装路径！！！千万不要有中文！！！&#10; 2)在安装Keil时有填写 姓 名 公司名称 邮箱 都写数字 1 即可&#10; 3)在安装最后有可能会弹出小对话框问是否安装驱动,选择安装&#10; 4)安装结束会弹出网页以及联网安装补丁,都选择关闭&#10;&#10; 手动安装补丁&#10; 在&amp;lt;STM32RBT6\开发工具\MDK520&amp;gt;中5个.pack结尾的文件&#10; 安装从上往下的顺序,依次双击安装&#10; &#10; 仿真器的驱动&#10; STLink仿真器的驱动&#10; 在&amp;lt;STM32RBT6\开发工具\STLink V2驱动\STLINK_V2_USBDriver&amp;gt;中&#10; 如果Windows系统是64bit的就安装&amp;lt;dpinst_amd64.exe&amp;gt;&#10; 如果Windows系统是32bit的就安装&amp;lt;dpinst_x86.exe&amp;gt;&#10;&lt;/pre&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;</description></item><item><title>stm32_note_02day</title><link>https://ynhugo.github.io/p/stm32_02day/</link><pubDate>Thu, 16 Feb 2023 08:03:05 +0800</pubDate><guid>https://ynhugo.github.io/p/stm32_02day/</guid><description>&#10;&lt;div id="outline-container-headline-1" class="outline-2"&gt;&#10;&lt;h2 id="headline-1"&gt;&#10;stm32_note_02day&#10;&lt;/h2&gt;&#10;&lt;div id="outline-text-headline-1" class="outline-text-2"&gt;&#10;&lt;p&gt;&#10;============================&lt;br&gt;&#10;2022-8-16&lt;br&gt;&#10;============================&lt;/p&gt;&#10;&lt;div id="outline-container-headline-2" class="outline-3"&gt;&#10;&lt;h3 id="headline-2"&gt;&#10;一.温故知新&#10;&lt;/h3&gt;&#10;&lt;div id="outline-text-headline-2" class="outline-text-3"&gt;&#10;&lt;pre class="example"&gt;&#10; 1.搭建了物联网项目框架&#10; 感知层&#9;智能终端设备的裸板驱动&#10; STM32F103RBT6&#10; 网络层&#9;WiFi模块&#10; 平台层&#9;华为&#9;OceanConnect//太繁琐(安全性高)&#10; 小米&#9;小米IoT//企业用户&#10; 阿里&#9;AIoT//繁琐(安全性高)&#10; 百度&#9;天工//添加设备丰富&#10; 移动&#9;OneNet//简单&#10; 联通&#9;中国联通物联网//没用过&#10; 东方瑞通&#9;ESLink&#10; 应用层&#9;只要是提供了云平台都会提供应用层的APP&#10; 2.在基础版本的物联网项目框架中引入边缘计算设备&#10; 3.两个分支&#10; 智能终端设备&#10; 边缘计算设备&#10; 4.安装开发环境&#10;&#10;学习的时候注重的是过程&#10;工作的时候注重的是结果&#10;&lt;/pre&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;div id="outline-container-headline-3" class="outline-3"&gt;&#10;&lt;h3 id="headline-3"&gt;&#10;二.从表象到里象的方式了解开发板&#10;&lt;/h3&gt;&#10;&lt;div id="outline-text-headline-3" class="outline-text-3"&gt;&#10;&lt;pre class="example"&gt;&#10; 1.从外观入手(查看配件有哪些以及芯片的型号)&#10; 打开&amp;lt;STM32RBT6\开发板原理图&amp;gt;目录下&amp;lt;stm32-mix.jpg&amp;gt;&#10; 2.了解芯片的结构&#10; 通过画图了解&#10; 无论是SOC(高端的芯片)还是MCU(单片机芯片)&#10; 都是可以自己组成微型的计算机系统&#9;&#10; STM32F103RBT6 = CPU + 内存 + 硬盘 + 外设&#10; CPU = ARM-CORTEX-M3(用来做大量计算,处理数据)&#10; 内存 = 运行程序时会占用的空间&#10; 硬盘 = 保存烧写的程序&#10; 外设 = 操作芯片功能的接口&#10;&lt;/pre&gt;&#10;&lt;p&gt;&#10;01MCU内部结构&lt;br&gt;&#10;&lt;img src="resources/01MCU内部结构.png" alt="resources/01MCU内部结构.png" title="resources/01MCU内部结构.png" /&gt;&lt;/p&gt;&#10;&lt;pre class="example"&gt;&#10; S5P6818 = CPU + 内存 + 硬盘 + 外设&#10; CPU = ARM-CORTEX-A53(用来做大量计算,处理数据)&#10; 内存 = 运行硬盘中固件会占用的空间&#10; 硬盘 = 存储的是芯片厂商烧写好的固件(Read Only)&#10; 外设 = 操作芯片功能的接口&#10; 注意 : 高端芯片外部需要外接内存，外接硬盘&#10;&lt;/pre&gt;&#10;&lt;p&gt;&#10;01SOC内部结构&lt;br&gt;&#10;&lt;img src="resources/02SOC内部结构.png" alt="resources/02SOC内部结构.png" title="resources/02SOC内部结构.png" /&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;div id="outline-container-headline-4" class="outline-3"&gt;&#10;&lt;h3 id="headline-4"&gt;&#10;三.介绍ARM公司和ST公司&#10;&lt;/h3&gt;&#10;&lt;div id="outline-text-headline-4" class="outline-text-3"&gt;&#10;&lt;pre class="example"&gt;&#10; ARM公司是在英国剑桥成立，在2016年年底被日本软银收购&#10; 嵌入式领域芯片架构&#10; 曾经三足鼎立&#10; PPC&#9;游戏机/掌机&#10; MIPS&#9;路由器/交换机、网络探头&#10; ARM&#9;手机&#10; 现在&#10; MIPS&#9;&#10; ARM&#9;各种电子产品&#10; ST公司，意法半导体公司，在2020年国家统计数据，&#10; 咱们国家使用ST公司的芯片NO.1&#10;&lt;/pre&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;div id="outline-container-headline-5" class="outline-3"&gt;&#10;&lt;h3 id="headline-5"&gt;&#10;四.开发方式&#10;&lt;/h3&gt;&#10;&lt;div id="outline-text-headline-5" class="outline-text-3"&gt;&#10;&lt;pre class="example"&gt;&#10; 1.传统开发方式&#10; 使用C语言的位运算符操作芯片外设的寄存器&#10; &amp;lt;&amp;lt; &amp;gt;&amp;gt; &amp;amp; | ~ ^&#10; 对于驱动开发工程师来说容易出错&#10; 需要驱动开发工程师写驱动 + 业务逻辑&#10; 2.流行开发方式&#10; 使用ST公司的官方固件(LIB库)&#10; 涉及到函数调用即可&#10; 需要驱动开发工程师写驱动 + 业务逻辑&#10; 3.未来开发方式&#10; 使用STM32CUBEMX开发工具 + 官方固件(HAL库)&#10; 涉及到函数调用即可&#10; 需要驱动开发工程师写业务逻辑&#10;&lt;/pre&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;div id="outline-container-headline-6" class="outline-3"&gt;&#10;&lt;h3 id="headline-6"&gt;&#10;五.搭建模板项目工程&#10;&lt;/h3&gt;&#10;&lt;div id="outline-text-headline-6" class="outline-text-3"&gt;&#10;&lt;pre class="example"&gt;&#10; 1.模板项目工程只有在刚开始会教大家搭建，后面的项目工程直接拷贝使用&#10; 2.搭建模板项目工程的流程必须要会&#10; 3.搭建模板项目工程的方法并不唯一&#10;&#10;前提准备 : 把Windows系统下,文件的扩展名显示出来&#10; 1.创建目录结构&#10; 在&amp;lt;桌面&amp;gt;上新建文件夹,重命名为&amp;lt;stm32f103&amp;gt;&#10; 在&amp;lt;桌面\stm32f103&amp;gt;目录中新建文件夹,重命名为&amp;lt;01test&amp;gt;&#10; 在&amp;lt;桌面\stm32f103\01test&amp;gt;目录中新建文件夹&#10; cmsis&#9;存放有关arm-cortex-m系列的文件&#10; fwlib&#9;存放的是ST公司的官方固件&#10; mylib&#9;存放的是程序员自己写的固件&#10; project&#9;存放的是项目工程文件&#10; user&#9;存放的是主文件&#10;&amp;lt;STM32RBT6\ST官方固件\STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\CoreSupport&amp;gt;目录下的所有文件&#10;拷贝到&#10;&amp;lt;桌面\stm32f103\01test\cmsis&amp;gt;&#10;&#10;&amp;lt;STM32RBT6\ST官方固件\STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\startup\arm&amp;gt;&#10;目录下的&amp;lt;startup_stm32f10x_md.s&amp;gt;&#10;拷贝到&#10;&amp;lt;桌面\stm32f103\01test\cmsis&amp;gt;&#10;&#10;&amp;lt;STM32RBT6\ST官方固件\STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\STM32F10x_StdPeriph_Driver&amp;gt;目录下的&amp;lt;inc&amp;gt;和&amp;lt;src&amp;gt;&#10;拷贝到&#10;&amp;lt;桌面\stm32f103\01test\fwlib&amp;gt;&#10;&#10;&amp;lt;STM32RBT6\ST官方固件\STM32F10x_StdPeriph_Lib_V3.5.0\Project\STM32F10x_StdPeriph_Template&amp;gt;目录下的&#10;&amp;lt;main.c&amp;gt; &amp;lt;stm32f10x_conf.h&amp;gt; &amp;lt;stm32f10x_it.c&amp;gt;&#10;&amp;lt;stm32f10x_it.h&amp;gt; &amp;lt;system_stm32f10x.c&amp;gt;&#10;&amp;lt;system_stm32f10x.h&amp;gt;&#10;拷贝到&#10;&amp;lt;桌面\stm32f103\01test\user&amp;gt;&#9;&#10;&#10; 2.通过Keil搭建项目工程&#10; Define&#10; STM32F10X_MD,USE_STDPERIPH_DRIVER&#10; 1&amp;gt;在桌面上运行KEIL软件&#10; 2&amp;gt;如果默认打开的keil界面显示的是上一次的项目工程可以在keil的菜单栏&amp;lt;Project&amp;gt;中选择Close Project&#10; 3&amp;gt;在keil的菜单栏&amp;lt;Project&amp;gt;中选择New μVision Project&#10; 4&amp;gt;弹出了Create New Project对话框,选择新的项目工程创建的位置(选择之前项目工程创建的位置)&#10; 5&amp;gt;弹出了Select Device For Target对话框，可以在Search这一栏录入要操作的芯片型号&amp;lt;STM32F103RB&amp;gt;&#10; 6&amp;gt;点击左下角显示的找到的芯片型号，右边Description显示了芯片信息之后，点击OK&#10; 7&amp;gt;会弹出Manager Run-Time Environment的对话框，直接关闭&#10; 8&amp;gt;把keil默认的项目工程的层次结构调整成和windows下自己搭建的层次结构一致&#10; 9&amp;gt;点击第三行菜单栏中的Manager Project Items&#10; A&amp;gt;在Project Targets这一栏中，把Target 1 修改成 Target //注意:双击蓝色的这一条可以编辑&#10; B&amp;gt;在Groups这一栏中，把Source Group1去掉，添加上cmsis fwlib mylib user 4个组&#10; C&amp;gt;首先在Groups这一栏中，选择cmsis这个组，然后在对话框右下角点击Add Files&#10; D&amp;gt;弹出对话框&amp;lt;Add Files To Group &amp;#39;cmsis&amp;#39;&amp;gt;，默认的查找范围是project，找到自己创建的cmsis目录&#10; //注意:在这一步添加文件，只需要添加.c .s文件即可，不需要添加.h文件&#10; E&amp;gt;在cmsis目录中选择core_cm3.c文件和startup_stm32f10x_md.s添加到cmsis组中即可&#10; F&amp;gt;选择fwlib的组继续添加文件，找到stm32f10x_rcc.c文件，添加到fwlib组中&#10; G&amp;gt;选择user的组继续添加文件，找到main.c stm32f10x_it.c system_stm32f10x.c，添加到user组中&#10; H&amp;gt;在Manager Project Items的对话框中点击OK&#10; I&amp;gt;在keil界面的左边的Project栏中，找到main.c文件，双击打开&#10; J&amp;gt;在main.c文件中全选文件内容，全部删掉，加入自己写得main函数//注意:在文件最后一定要多加几个空行&#10; K&amp;gt;在keil的第三行菜单栏中选择 Options for Target &amp;#39;Target&amp;#39;这一项&#10; L&amp;gt;在对话框中选择C/C++这一项，在Define：这一栏中填入 STM32F10X_MD,USE_STDPERIPH_DRIVER&#10; M&amp;gt;在C/C++这一项中，找到Include Paths，在这一项中添加头文件的路径&#10; N&amp;gt;在Include Paths这一行最后有一个三个点的按钮，点击，弹出Folder Setup对话框&#10; O&amp;gt;在Folder Setup对话框中选择4个路径即可 cmsis fwlib\inc mylib user&#10; P&amp;gt;添加完之后，点击OK，跳出对话框&#10; Q&amp;gt;开始编译项目工程，点击keil的第三行菜单栏的Rebuild的按钮&#10; R&amp;gt;在keil中设置仿真器，(1.安装仿真器的驱动 2.把开发板连接到电脑上 3.开发板上电)&#10; S&amp;gt;在keil的第三行菜单栏中选择 Options for Target &amp;#39;Target&amp;#39;这一项&#10; T&amp;gt;在Options for Target &amp;#39;Target&amp;#39;对话框的菜单栏中选择Debug，在Debug菜单中的右测下拉菜单中选择ST-Link Debugger&#10; U&amp;gt;选择ST-Link Debugger之后选择之后的Settings按钮，弹出Cortex-M Target Driver Setup对话框&#10; V&amp;gt;如果在SWDIO中确定有一串十六进制的数字，那么keil识别了开发板的仿真器&#10; W&amp;gt;在Cortex-M Target Driver Setup对话框中选择，Flash Download菜单，在Download Function中选择上Reset and Run&#10; X&amp;gt;在对话框中选择OK，退出对话框&#10; Y&amp;gt;在KEIL的第三行菜单栏中选择 Download 按钮，下载程序(确保程序编译没有错误没有警告)&#9;&#10;&#10;=================================&#10;1.重新搭建项目工程&#10;=================================&#10;&lt;/pre&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;div id="outline-container-headline-7" class="outline-3"&gt;&#10;&lt;h3 id="headline-7"&gt;&#10;六.通过数据手册了解芯片内部的结构&#10;&lt;/h3&gt;&#10;&lt;div id="outline-text-headline-7" class="outline-text-3"&gt;&#10;&lt;pre class="example"&gt;&#10; 1.通过数据手册了解芯片内部外设的数量&#10;打开&amp;lt;STM32RBT6\DataSheet\STM32&amp;gt;目录下&amp;lt;ST_MCU最新选型手册.pdf&amp;gt;&#10; 硬盘&#9;&#9;128Kb&#10; 内存&#9;&#9;20Kb&#10; 封装形式&#9;&#9;64管脚的封装形式&#10; 定时器&#9;&#9;4个16bit的定时器(普通定时器) + 其他定时器&#10; 2个看门狗、实时时钟、24bit向下计数定时器&#10; ADC(模/数转换器)&#9;16×12bit&#10; GPIO&#9;&#9;51个&#10; 串口&#9;&#9;2个SPI、2个I²C、3个USART/UART、&#10; 1个USB、1个CAN&#10; 电压范围&#9;&#9;2.0V - 3.6V&#10; &amp;lt;最新选型手册&amp;gt;在公司中是在项目立项的时候会使用(技术总监、组长)&#10; 1.你选择的芯片的外设资源可以满足你的所有需求&#10; 2.在满足第一点的条件下，其他外设资源越少越好&#10;&lt;/pre&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;</description></item><item><title>stm32_note_03day</title><link>https://ynhugo.github.io/p/stm32_03day/</link><pubDate>Thu, 16 Feb 2023 08:03:05 +0800</pubDate><guid>https://ynhugo.github.io/p/stm32_03day/</guid><description>&#10;&lt;div id="outline-container-headline-1" class="outline-2"&gt;&#10;&lt;h2 id="headline-1"&gt;&#10;stm32_note_03day&#10;&lt;/h2&gt;&#10;&lt;div id="outline-text-headline-1" class="outline-text-2"&gt;&#10;&lt;p&gt;&#10;===========================&lt;br&gt;&#10;2022-8-17&lt;br&gt;&#10;===========================&lt;/p&gt;&#10;&lt;div id="outline-container-headline-2" class="outline-3"&gt;&#10;&lt;h3 id="headline-2"&gt;&#10;一.温故知新&#10;&lt;/h3&gt;&#10;&lt;div id="outline-text-headline-2" class="outline-text-3"&gt;&#10;&lt;pre class="example"&gt;&#10; 从表象到里象的方式去了解设备&#10; 1.从外观入手&#10; 开发板上外接了哪些模块、使用芯片的型号&#10; 2.画图了解芯片内部结构&#10; CPU + 内存 + 硬盘 + 外设&#10; 3.介绍了ARM公司和ST公司&#10; ARM-CORTEX-A&#9;针对高端应用(手机 平板电脑 安卓电视)&#10; ARM-CORTEX-R&#9;针对实时操作系统(军工、航天、医疗)&#10; ARM-CORTEX-M&#9;针对工控领域(智能终端设备)&#9;&#10; 4.通过手册了解芯片&#10; 最新选型手册 : 外设数量、存储大小、封装形式&#10; 5.开发方式&#10; 6.搭建模板项目工程&#10;&lt;/pre&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;div id="outline-container-headline-3" class="outline-3"&gt;&#10;&lt;h3 id="headline-3"&gt;&#10;二.通过硬件的手册了解芯片内部的结构&#10;&lt;/h3&gt;&#10;&lt;div id="outline-text-headline-3" class="outline-text-3"&gt;&#10;&lt;pre class="example"&gt;&#10; 打开&amp;lt;STM32RBT6\DataSheet\STM32&amp;gt;目录下&amp;lt;STM32F103RB.pdf&amp;gt;&#10; P19&#9;芯片内部的结构&#10; &#10; 1.STGM32F103RBT6芯片使用的CPU是ARM-CORTEX-M3主频是72MHz&#10; 2.CPU是通过三总线来访问外设的&#10; 3.三总线包括 : 数据总线(传输数据) 地址总线(传输地址) 控制总线(控制读写)&#10; --------------------------------------------------------&#10; 例子 :&#10; 在某工程中,要求给地址为0xaa55的空间复制一个整型的数据,&#10; 数据为0x55aa&#10; 0xaa55 = 0x55aa;.//不可以,因为左值是一个常量&#10; *(volatile unsigned int *)(0xaa55) = 0x55aa;&#10; --------------------------------------------------------&#10; 4.在STM32芯片中AHB AHB1 AHB2都是三总线,叫做高速总线&#10; APB1 APB2也是三总线,叫做外设总线&#10; 5.GPIO的管脚是从0开始计数的&#10; GPIOxy&#10; [x = A B C D]&#10; [y = 0 1 2 ... 15]&#10; 6.大部分的外设都是连接到了外设总线上,所以当某个外设工作时&#10; 需要先通过相应的外设总线打开外设的时钟,该外设才能工作&#10; &#10; P23&#9;芯片的管脚&#10; GPIOA&#9;[0 - 15]&#10; GPIOB&#9;[0 - 15]&#10; GPIOC&#9;[0 - 15]&#10; GPIOD&#9;[0 1 2]&#10;&#10; P26&#9;芯片管脚的复用&#10; 芯片的管脚是多功能复用型的管脚&#10; 输入功能&#10; 上拉输入&#10; 下拉输入&#10; 浮空输入&#10; 输出功能&#10; 推挽输出&#10; 开漏输出&#10; 复用功能&#10; 推挽复用&#10; 开漏复用&#10; 模拟功能&#10; 模拟输入&#10;&lt;/pre&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;div id="outline-container-headline-4" class="outline-3"&gt;&#10;&lt;h3 id="headline-4"&gt;&#10;三.GPIO外设之输出功能&#10;&lt;/h3&gt;&#10;&lt;div id="outline-text-headline-4" class="outline-text-3"&gt;&#10;&lt;pre class="example"&gt;&#10; 输入功能相当于是检测,输出功能相当于是控制&#10; 输出功能分为推挽输出和开漏(漏级)输出&#10; 推挽输出 : 管脚既可以输出高电平,也可以输出低电平&#10; 开漏输出 : 管脚只能输出低电平,输出不了高电平&#10; LED-&amp;gt;PC9管脚&#10; 如果PC9管脚输出高电平,LED灯灭&#10; 如果PC9管脚输出低电平,LED灯亮&#10;&lt;/pre&gt;&#10;&lt;p&gt;&#10;01LED灯&lt;br&gt;&#10;&lt;img src="resources/01LED灯.png" alt="resources/01LED灯.png" title="resources/01LED灯.png" /&gt;&lt;/p&gt;&#10;&lt;pre class="example"&gt;&#10; 问题 : 芯片的管脚是多功能复用型的管脚,如何给管脚选择输出功能?&#10; 答 : 可以通过操作GPIO外设的寄存器来选择输出的功能&#10; 问题 : GPIO都有哪些寄存器?&#10; 答 : 可以通过查询芯片的手册了解GPIO的寄存器以及操作方式&#10;打开&amp;lt;STM32RBT6\DataSheet\STM32&amp;gt;目录下&amp;lt;STM32F10x中文参考手册.pdf&amp;gt;&#10;寄存器的真实地址 = 基地址 + 偏移地址&#10;例如 : &#10;GPIOC_CRL的真实地址 = GPIOC组的基地址 + CRL寄存器的偏移地址&#10; = 0x40011000 + 0x00&#10;因为需要操作PC9管脚，所以需要使用端口配置高寄存器&#10;GPIOC_CRH的真实地址 = GPIOC组的基地址 + CRH寄存器的偏移地址&#10; = 0x40011000 + 0x04&#10;#define GPIOC_CRH *(volatile unsigned int *)(0x40011000 + 0x04)&#10;GPIOC_CRH |= (3 &amp;lt;&amp;lt; 4);//把PC9管脚配置为输出功能并且为50MHz的输出速率&#10;-----------------------------------------------------------------------------&#10;3&#9;&#9;00000000 00000000 00000000 00000011&#10;3&amp;lt;&amp;lt;4&#9;&#9;00000000 00000000 00000000 00110000&#10; |&#10;GPIOC_CRH&#9;xxxxxxxx xxxxxxxx xxxxxxxx xx##xxxx&#10; =&#10;GPIOC_CRH&#9;xxxxxxxx xxxxxxxx xxxxxxxx xx11xxxx&#10;-----------------------------------------------------------------------------&#10;GPIOC_CRH &amp;amp;= ~(3 &amp;lt;&amp;lt; 6);.//把PC9管脚配置为推挽输出&#10;-----------------------------------------------------------------------------&#10;3&#9;&#9;00000000 00000000 00000000 00000011&#10;3&amp;lt;&amp;lt;6&#9;&#9;00000000 00000000 00000000 11000000&#10;~(3&amp;lt;&amp;lt;6)&#9;&#9;11111111 11111111 11111111 00111111&#10; &amp;amp;&#10;GPIOC_CRH&#9;xxxxxxxx xxxxxxxx xxxxxxxx ##11xxxx&#10; =&#10;GPIOC_CRH&#9;xxxxxxxx xxxxxxxx xxxxxxxx 0011xxxx&#10;-----------------------------------------------------------------------------&#10;#define GPIOC_ODR *(volatile unsigned int *)(0x40011000 + 0x0C)&#10;GPIOC_ODR &amp;amp;= ~(1 &amp;lt;&amp;lt; 9);//把PC9管脚输出低电平(亮灯)&#10;&#10;GPIOC_ODR |= (1 &amp;lt;&amp;lt; 9);//把PC9管脚输出高电平(灭灯)&#10;&lt;/pre&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;div id="outline-container-headline-5" class="outline-3"&gt;&#10;&lt;h3 id="headline-5"&gt;&#10;四.通过开发板原理图查看芯片的管脚&#10;&lt;/h3&gt;&#10;&lt;div id="outline-text-headline-5" class="outline-text-3"&gt;&#10;&lt;pre class="example"&gt;&#10; 打开&amp;lt;STM32RBT6\开发板原理图&amp;gt;目录下&amp;lt;MCU.pdf&amp;gt;和&amp;lt;Periph.pdf&amp;gt;&#10; LED0&#9;PC1&#10; LED1&#9;PC2&#10; LED2&#9;PC3&#10; 输出高电平,灯亮&#10; 输出低电平,灯灭&#10; 需要操作GPIOC_CRL(端口配置低寄存器)以及&#10; GPIOC_ODR(端口输出数据寄存器)&#10;&lt;/pre&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;div id="outline-container-headline-6" class="outline-3"&gt;&#10;&lt;h3 id="headline-6"&gt;&#10;五.写程序驱动LED灯&#10;&lt;/h3&gt;&#10;&lt;div id="outline-text-headline-6" class="outline-text-3"&gt;&#10;&lt;pre class="example"&gt;&#10; 1.通过开发板原理图找到LED灯连接的管脚&#10; 2.分析模块的工作方式&#10; 3.把最近的一个项目工程拷贝一份重命名一下&#10; 4.在&amp;lt;02led/mylib&amp;gt;目录中新建&amp;lt;led.c&amp;gt;和&amp;lt;led.h&amp;gt;&#10; 5.在&amp;lt;02led/project&amp;gt;目录中找到项目工程文件,并且打开&#10; 6.在Keil的左边侧边栏中的mylib组内添加led.c文件&#10;&lt;/pre&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;div id="outline-container-headline-7" class="outline-3"&gt;&#10;&lt;h3 id="headline-7"&gt;&#10;六.举一反三&#10;&lt;/h3&gt;&#10;&lt;div id="outline-text-headline-7" class="outline-text-3"&gt;&#10;&lt;pre class="example"&gt;&#10; 大家通过&amp;lt;02led&amp;gt;的项目工程,尝试着搭建&amp;lt;03beep&amp;gt;的项目工程&#10; 效果&#10; 在流水灯的基础上加入蜂鸣器&#10; 0 1 2&#10; 0-&amp;gt;1-&amp;gt;2-&amp;gt;0-&amp;gt;1-&amp;gt;2&#10; 灯亮的同时蜂鸣器响,灯灭的同时蜂鸣器关闭&#10;&#10;=================================&#10;作业&#10;1.把今天讲过的内容完完整整的复习一遍&#10;2.把举一反三的内容做出来&#10;3.刷题&#10;课外&#10;自己找音乐的编码把音乐通过蜂鸣器播放出来&#10;=================================&#10;&lt;/pre&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;</description></item><item><title>stm32_note_04day</title><link>https://ynhugo.github.io/p/stm32_04day/</link><pubDate>Thu, 16 Feb 2023 08:03:05 +0800</pubDate><guid>https://ynhugo.github.io/p/stm32_04day/</guid><description>&#10;&lt;div id="outline-container-headline-1" class="outline-2"&gt;&#10;&lt;h2 id="headline-1"&gt;&#10;stm32_note_04day&#10;&lt;/h2&gt;&#10;&lt;div id="outline-text-headline-1" class="outline-text-2"&gt;&#10;&lt;p&gt;&#10;============================&lt;br&gt;&#10;2022-8-18&lt;br&gt;&#10;============================&lt;/p&gt;&#10;&lt;div id="outline-container-headline-2" class="outline-3"&gt;&#10;&lt;h3 id="headline-2"&gt;&#10;一.温故知新&#10;&lt;/h3&gt;&#10;&lt;div id="outline-text-headline-2" class="outline-text-3"&gt;&#10;&lt;pre class="example"&gt;&#10; 1.通过讲硬件的手册了解芯片内部结构&#10; CPU使用的是ARM-CORTEX-M3的核心,主频是72MHz&#10; CPU是通过三总线(数据 地址 控制)来访问外设的&#10; 在STM32中AHB AHB1 AHB2都是三总线叫做高速总线&#10; 在STM32中APB1 APB2也是三总线叫做外设总线&#10; 芯片的管脚是多功能复用型的管脚&#10; 2.GPIO的输出&#10; 驱动LED灯&#10; 选择了操作外设的寄存器的开发方式(需要使用C语言的位运算符)&#10; 寄存器的真实地址 = 基地址 + 偏移地址&#10; *(volatile unsigned int *)(0x40011000 + 0x0C)&#10; 举一反三&#10; 驱动蜂鸣器&#10; BEEP&#9;PC7&#10; 管脚输出高电平,蜂鸣器响&#10; 管脚输出低电平,蜂鸣器不响&#10;&lt;/pre&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;div id="outline-container-headline-3" class="outline-3"&gt;&#10;&lt;h3 id="headline-3"&gt;&#10;二.GPIO的输入&#10;&lt;/h3&gt;&#10;&lt;div id="outline-text-headline-3" class="outline-text-3"&gt;&#10;&lt;pre class="example"&gt;&#10; 输入功能相当于检测,输出功能相当于控制&#10; 输入功能分为&#10; 上拉输入&#9;管脚在没有外设操作的情况下,默认呈现的是高电平的状态&#10; 对于低电平有触发效果&#10; 下拉输入&#9;管脚在没有外设操作的情况下,默认呈现的是低电平的状态&#10; 对于高电平有触发效果&#10; 浮空输入&#9;管脚在没有外设操作的情况下,默认呈现的既不是高也不是低&#10; 会对于外界的影响而变化&#10; (当在操作串口外设功能时会用到浮空输入)&#10; 驱动开发板上的功能按键&#10; 1.查看开发板原理图&#10; KEY0&#9;PC9&#9;上拉输入&#10; KEY1&#9;PC8&#9;上拉输入&#10; KEY2&#9;PA0&#9;下拉输入&#10; KEY0 KEY1在没有按下时应当检测到高电平,按下应当检测到低电平&#10; KEY2在没有按下时应当检测到低电平,按下应当检测到高电平&#10; 2.查看芯片的手册&#10; #define GPIOC_IDR *(volatile unsigned int *)(GPIOC_BASE + 0x08)&#10; 如何读取第9位的电平高低？&#10; ret = (GPIOC_IDR &amp;gt;&amp;gt; 9) &amp;amp; 0x01;&#10; 3.写功能按键的驱动程序&#10; ST的官方固件大部分的参数都是按照位图来定义的&#10; 以位图的形式定义&#10; GPIOA&#9;0x0001&#9;0001&#10; GPIOB&#9;0x0002&#9;0010&#10; GPIOC&#9;0x0004&#9;0100&#10; GPIOD&#9;0x0008&#9;1000&#10; GPIOA | GPIOB = 0011&#10; 不是以位图的形式定义&#10; GPIOA&#9;0x0001&#9;0001&#10; GPIOB&#9;0x0002&#9;0010&#10; GPIOC&#9;0x0003&#9;0011&#10; GPIOD&#9;0x0004&#9;0100&#10; GPIOA | GPIOB = 0011&#10;&lt;/pre&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;div id="outline-container-headline-4" class="outline-3"&gt;&#10;&lt;h3 id="headline-4"&gt;&#10;三.换一种开发方式&#10;&lt;/h3&gt;&#10;&lt;div id="outline-text-headline-4" class="outline-text-3"&gt;&#10;&lt;pre class="example"&gt;&#10; 需要调用ST公司的官方固件&#10; 手册是辅助大家开发的,千万不要本末倒置&#10;&lt;/pre&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;div id="outline-container-headline-5" class="outline-3"&gt;&#10;&lt;h3 id="headline-5"&gt;&#10;四.演示未来的开发方式&#10;&lt;/h3&gt;&#10;&lt;div id="outline-text-headline-5" class="outline-text-3"&gt;&#10;&lt;pre class="example"&gt;&#10; STM32CUBEMX + Keil&#10;&#10;===============================&#10;作业&#10;1.把今天讲过的内容完整的复习一遍&#10;2.把&amp;lt;01test&amp;gt;项目工程拷贝一份,用LIB库实现LED灯、蜂鸣器、功能按键&#10;3.完成需求&#10; 通过3个功能按键,控制3个LED灯(开关)&#10; 当按下抬起KEY0,LED0常亮,当再一次按下抬起KEY0,LED0常灭&#10; 当按下抬起KEY1,LED1常亮,当再一次按下抬起KEY1,LED1常灭&#10; 当按下抬起KEY2,LED2常亮,当再一次按下抬起KEY2,LED2常灭&#10;===============================&#10;&lt;/pre&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;</description></item><item><title>stm32_note_05day</title><link>https://ynhugo.github.io/p/stm32_05day/</link><pubDate>Thu, 16 Feb 2023 08:03:05 +0800</pubDate><guid>https://ynhugo.github.io/p/stm32_05day/</guid><description>&#10;&lt;div id="outline-container-headline-1" class="outline-2"&gt;&#10;&lt;h2 id="headline-1"&gt;&#10;stm32_note_05day&#10;&lt;/h2&gt;&#10;&lt;div id="outline-text-headline-1" class="outline-text-2"&gt;&#10;&lt;p&gt;&#10;=============================&lt;br&gt;&#10;2022-8-19&lt;br&gt;&#10;=============================&lt;/p&gt;&#10;&lt;div id="outline-container-headline-2" class="outline-3"&gt;&#10;&lt;h3 id="headline-2"&gt;&#10;一.温故知新&#10;&lt;/h3&gt;&#10;&lt;div id="outline-text-headline-2" class="outline-text-3"&gt;&#10;&lt;pre class="example"&gt;&#10; 1.GPIO的输出实验-&amp;gt;蜂鸣器&#10; 2.GPIO的输入实验-&amp;gt;功能按键&#10; 检测按键是否被按下&#10; (轮询 和 中断)&#10; 3.更换开发方式-&amp;gt;调用ST公司的LIB库&#10; 4.演示STM32CUBEMX工具的使用&#10;&lt;/pre&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;div id="outline-container-headline-3" class="outline-3"&gt;&#10;&lt;h3 id="headline-3"&gt;&#10;二.位带(bitband)&#10;&lt;/h3&gt;&#10;&lt;div id="outline-text-headline-3" class="outline-text-3"&gt;&#10;&lt;pre class="example"&gt;&#10; 位带可以以原子操作的方式操作寄存器中的某些位&#10; 1.引出位带&#10; ----------------------------------------------------&#10; 例子 : &#10; 想要把十进制整数100,赋值到0x12345678地址中?&#10; *(volatile unsigned int *)(0x12345678) = 100;&#10; 一次性操作32bit&#10; ----------------------------------------------------&#10; 例子:&#10; 想要把0x12345678地址中的第9bit,置1&#10; *(volatile unsigned int *)(0x12345678) |= (1 &amp;lt;&amp;lt; 9);&#10; 想要把0x12345678地址中的第8bit,清0&#10; *(volatile unsigned int *)(0x12345678) &amp;amp;= ~(1 &amp;lt;&amp;lt; 8);&#10; 一次操作1bit&#10; ----------------------------------------------------&#10; 但是上述直接给某一个位赋值的操作,不是原子操作&#10; 原子操作 : 就是不可分割的操作,原子操作在执行结束前,&#10; 不会被任何信号或者任何中断打断&#10; &#10; 2.介绍位带&#10; 位带并不是C语言提供的,是硬件提供的,并不是STM32芯片提供的,&#10; 而是由ARM-CORTEX-M3的核心提供的&#10; ----------------------------------------------------&#10; 位带和位域有点类似&#10; ----------------------------------------------------&#10; 打开&amp;lt;STM32RBT6\DataSheet\ARM-CORTEX-M&amp;gt;目录下&#10; &amp;lt;Cortex-M3权威指南CnR2（电子书）.pdf&amp;gt;&#10; P83&#9;查看存储器的映射&#10; ARM-CORTEX-M3支持访问4Gb的空间大小(物理的空间)&#10; 只有片上SRAM开头的1Mb空间和片上外设的1MB空间支持位带访问&#10; 位带的操作其实&#10; 就是把位带区中的每一位都做一个地址别名,映射到位带别名区&#10; 将来在访问位带别名区的空间时,就相当于是在访问位带区中某一位&#10;&#10; 位带区的空间有1M个字节,等于有8M个位,每一位都做一个地址别名映射到&#10; 位带别名区,映射的地址需要以4字节的方式对齐,所以&#10; 位带区的1MB会在位带别名区膨胀成32MB&#10;&#10; 虽然片上SRAM和片上外设都支持位带访问,&#10; 但是片上外设的位带操作会用的更多一些(尤其是GPIO的输入与输出)&#10;&#10; 3.位带转换的表达式&#10; 可以把位带转换的操作封装成宏函数&#10;#define BITBAND(ADDR, BITNUM)&#10;((ADDR&amp;amp;0xF0000000)+0x2000000+((ADDR&amp;amp;0xFFFFF)&amp;lt;&amp;lt;5)+(BITNUM&amp;lt;&amp;lt;2))&#10;&#10;#define MEM_ADDR(ADDR) *(volatile unsigned int *)(ADDR)&#10;&#10;#define BIT_BAND(ADDR,BITNUM) MEM_ADDR(BITBAND(ADDR, BITNUM))&#10; &#10;#define GPIOA_IDR (GPIOA_BASE + 0x08)&#10;#define GPIOA_ODR (GPIOA_BASE + 0x0C)&#10;&#10;#define GPIOB_IDR (GPIOB_BASE + 0x08)&#10;#define GPIOB_ODR (GPIOB_BASE + 0x0C)&#10;&#10;#define GPIOC_IDR (GPIOC_BASE + 0x08)&#10;#define GPIOC_ODR (GPIOC_BASE + 0x0C)&#10;&#10;#define GPIOD_IDR (GPIOD_BASE + 0x08)&#10;#define GPIOD_ODR (GPIOD_BASE + 0x0C)&#10;&#10;#define PAOut(BITNUM) BIT_BAND(GPIOA_ODR, BITNUM)&#10;#define PAIn(BITNUM) BIT_BAND(GPIOA_IDR, BITNUM)&#10;&#10;PAOut(9) = 1;//把PA9管脚拉高&#10;PAOut(8) = 0;//把PA8管脚拉低&#10;&#10; ret = PAIn(0);//读取PA0管脚的电平高低&#10;&#10; 4.在项目工程中引入位带的操作&#10;&lt;/pre&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;div id="outline-container-headline-4" class="outline-3"&gt;&#10;&lt;h3 id="headline-4"&gt;&#10;三.定时器&#10;&lt;/h3&gt;&#10;&lt;div id="outline-text-headline-4" class="outline-text-3"&gt;&#10;&lt;pre class="example"&gt;&#10; 流水灯的程序中需要使用延时(精确延时 和 粗略延时)&#10; 精确延时需要使用定时器&#10; 无论何种定时器都是由两个因素来决定定时长短的&#10; 时钟频率 和 计数值&#10;计数值&#9;10 10 72000000 72000 72 72 / 1000&#10;时钟频率&#9;1Hz 10Hz 72MHz 72MHz 72MHz 72MHz&#10;定时时间&#9;10s 1s&#9; 1s 1ms 1us 1ns&#10; 1s = 1000ms = 1000000us = 1000000000ns&#10;&lt;/pre&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;div id="outline-container-headline-5" class="outline-3"&gt;&#10;&lt;h3 id="headline-5"&gt;&#10;四.系统定时器&#10;&lt;/h3&gt;&#10;&lt;div id="outline-text-headline-5" class="outline-text-3"&gt;&#10;&lt;pre class="example"&gt;&#10; 通过最新选型手册可知,在STM32芯片中有非常丰富的定时器资源&#10; 可以分为普通定时器和其他(特殊)定时器&#10; 除了STM32芯片为程序员提供了定时器资源以外,ARM-CORTEX-M3的核心&#10; 也为程序员提供了定时器的资源&#10; 由ARM核心提供的定时器资源叫做系统定时器(system timer | systick)&#10; 1.系统定时器的时钟频率&#10;打开&amp;lt;STM32RBT6\DataSheet\STM32&amp;gt;目录下&amp;lt;STM32F10x中文参考手册.pdf&amp;gt;&#10;P46&#9;&#10; 在STM32芯片中有多个时钟源&#10; HSI&#9;系统内部的高速时钟&#9;8MHz&#10; HSE&#9;系统外部的高速时钟&#9;8MHz&#10; PLL&#9;锁相环(倍频器)&#9;72MHz&#10; LSI&#9;系统内部的低速时钟&#9;40KHz&#10; LSE&#9;系统外部的低速时钟&#9;32.768KHz&#10; 系统定时器的时钟频率 = SYSCLK / 8 或者 SYSCLK&#10; SYSCLK的时钟&#9;可以由&#9;HSI 或者HSE或者PLL提供&#10; 已知HSI和HSE都是8MHz的时钟频率,都不足以达到72MHz&#10; 所以只能是由PLL为SYSCLK提供时钟频率&#10; PLL是一个锁相环,是一个倍频器,本身是不会产生时钟频率的,&#10; 需要有基础的时钟频率才能进行倍频&#10; PLL的基础时钟频率&#9;可以由&#9;HSI或者HSE来提供&#10; 默认会选择HSE为PLL提供基础的时钟频率&#10; 芯片外部的晶振产生的时钟频率要比芯片内部自己产生的时钟频率稳定的多&#10;&#10; 2.系统定时器的计数值范围&#10; 打开&amp;lt;STM32RBT6\DataSheet\ARM-CORTEX-M&amp;gt;目录下&#10; &amp;lt;Cortex-M3权威指南CnR2（电子书）.pdf&amp;gt;&#10; P189&#9;&#10; 控制及状态寄存器&#10; 第0位&#9;&#9;开启系统定时器的计数&#10; 0:关闭&#9;1:开启&#10; 第1位&#9;&#9;是否触发中断&#10; 0:不触发&#9;1:触发&#10; 第2位&#9;&#9;时钟源的选择&#10; 0:外部的&#9;1:内部的&#10; 第3-15位&#9;&#9;保留&#10; 第16位&#9;&#9;用于判断计数器是否计数到0&#10; 第17-31位&#9;&#9;保留&#10; 重装载值寄存器&#10; 第0-23位&#9;&#9;用来存放重装载值&#10; 第24-31位&#9;&#9;保留&#10; 当前值寄存器&#10; 第0-23位&#9;&#9;用来存放当前计数值&#10; 第24-31位&#9;&#9;保留&#10; 计数值的范围是[24个0 - 24个1]（0 - 16M-1）&#10;&#10; 3.调用官方固件驱动系统定时器&#10; 官方提供的固件有问题&#10; 1)只有开启系统定时器,没有关闭系统定时器&#10; 2)默认开启了中断&#10;&#10;==============================&#10;作业&#10;1.把这周讲过的内容完完整整的复习一遍&#10;2.把这周写过的项目工程再重新写一遍&#10;==============================&#10;&lt;/pre&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;</description></item><item><title>stm32_note_06day</title><link>https://ynhugo.github.io/p/stm32_06day/</link><pubDate>Thu, 16 Feb 2023 08:03:05 +0800</pubDate><guid>https://ynhugo.github.io/p/stm32_06day/</guid><description>&#10;&lt;div id="outline-container-headline-1" class="outline-2"&gt;&#10;&lt;h2 id="headline-1"&gt;&#10;stm32_note_06day&#10;&lt;/h2&gt;&#10;&lt;div id="outline-text-headline-1" class="outline-text-2"&gt;&#10;&lt;p&gt;&#10;=============================&lt;br&gt;&#10;2022-8-22&lt;br&gt;&#10;=============================&lt;/p&gt;&#10;&lt;div id="outline-container-headline-2" class="outline-3"&gt;&#10;&lt;h3 id="headline-2"&gt;&#10;一.温故知新&#10;&lt;/h3&gt;&#10;&lt;div id="outline-text-headline-2" class="outline-text-3"&gt;&#10;&lt;pre class="example"&gt;&#10; 驱动LED灯、蜂鸣器、功能按键、系统定时器&#10; 直接操作外设寄存器、官方LIB库、官方HAL库&#10; 是由ARM核心支持的位带的操作&#10; 系统定时器(system timer | systick)&#10; 是由ARM核心提供的定时器资源&#10; 决定定时长短是由时钟频率和计数值&#10; 时钟频率是通过时钟树的分析得出的SYSCLK / 8 或者 SYSCLK&#10; 计数值是通过ARM的手册分析得出&#10; 控制及状态寄存器&#9;&#9;一共有32bit&#10; 第0位&#9;&#9;开启定时器的&#10; 第1位&#9;&#9;是否触发外部请求&#10; 第2位&#9;&#9;时钟源的选择&#10; 第3-15位&#9;&#9;保留&#10; 第16位&#9;&#9;判断计数是否计到0&#10; 第17-31位&#9;&#9;保留&#10; 重装载值寄存器&#9;&#9;一共有32bit&#10; 第0-23位&#9;&#9;存储重装载值[0 - 16M-1]&#10; 第24-31位&#9;&#9;保留&#10; 当前值寄存器&#10; 第0-23位&#9;&#9;当前计数值[0 - 16M-1]&#10; 第24-31位&#9;&#9;保留&#10;&lt;/pre&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;div id="outline-container-headline-3" class="outline-3"&gt;&#10;&lt;h3 id="headline-3"&gt;&#10;二.中断&#10;&lt;/h3&gt;&#10;&lt;div id="outline-text-headline-3" class="outline-text-3"&gt;&#10;&lt;pre class="example"&gt;&#10; 之前写了LED灯的流水灯程序-&amp;gt;延时使用的是粗略延时(空循环)&#10; 使用精确的延时-&amp;gt;使用了系统定时器&#10; 之前写了功能按键的程序-&amp;gt;轮询的方法检测按键是否被按下&#10; while(1)&#10; {&#10; button_status(0);&#10; }&#10; 由于轮询的方法浪费资源,可以替换成中断的方法&#10; 目的 : 把轮询检测按键的程序,修改成中断的方式处理功能按键&#10; 1.了解轮询和中断的关系&#10; 轮询 : CPU被绑定到检测的函数上,一直不断的调用&#10; 是非常消耗CPU资源&#10; 中断 : 在中断到来之前CPU可以处理任何事情,当中断到来之后&#10; 会打断CPU,CPU调用中断处理函数&#10; 2.介绍中断控制器&#10; VIC : 向量中断控制器&#10; NVIC : 可嵌套的向量中断控制器&#10; GIC : 通用的中断控制器&#10; 一般来说VIC和NVIC是在单片机中使用的中断控制器&#10; 一般来说GIC是在高端芯片中使用的中断控制器&#10; VIC和NVIC 相对于 GIC来说,在硬件上支持中断向量&#10; NVIC 相对于 VIC来说,在硬件上支持中断嵌套&#10; 3.我们芯片上的中断控制器&#10; 在STM32F103RBT6芯片中使用的是NVIC&#10; 前提 : &#10; 有些手册会把NVIC画到ARM核心的内部&#10; 有些手册会把NVIC画到ARM核心的外部&#10; 有些手册会把NVIC画到紧贴着ARM核心&#10; 想要表达的含义就是NVIC和ARM核心是紧密相联的关系&#10; NVIC和ARM-CORTEX-M3之间是紧密相联的关系&#10; NVIC中断控制器会做两个操作&#10; 1)会为每一个连接到NVIC上的中断源分配一个中断号&#10; 2)处理优先级的问题&#10; 组优先级(抢占优先级)&#10; 子优先级(占先式优先级)&#10;&lt;/pre&gt;&#10;&lt;p&gt;&#10;nvic&lt;br&gt;&#10;&lt;img src="resources/nvic.png" alt="resources/nvic.png" title="resources/nvic.png" /&gt;&lt;/p&gt;&#10;&lt;pre class="example"&gt;&#10; 4.GPIO触发中断的方法&#10; GPIO想要触发中断需要借助EXTI外设&#10; EXTI叫做外部中断&#10; EXTI仅仅是NVIC上的一个中断源而已&#10;打开&amp;lt;STM32RBT6\DataSheet\STM32&amp;gt;目录下&amp;lt;STM32F10x中文参考手册.pdf&amp;gt;&#10; P89&#9;NVIC以及异常向量表&#10; P91&#9;EXTI的描述&#10; 每组GPIO的0号管脚可以触发EXTI0&#10; 每组GPIO的1号管脚可以触发EXTI1&#10; ...&#10; 每组GPIO的15号管脚可以触发EXTI15&#10; ----------------------------------------------------&#10; 已知KEY0按键使用的是PC9管脚,&#10; 将来GPIOC9管脚想要触发中断需要使用EXTI9&#10; ----------------------------------------------------&#10; EXTI9只能由PC9触发吗?&#10; 也可以是PA9 PB9 PC9触发,需要通过 AFIO外设 进行选择&#10; ----------------------------------------------------&#10; NVIC : 可嵌套的向量中断控制器&#10; EXTI : 外部中断&#10; EXTI仅仅是NVIC上的一个中断源而已&#10; ----------------------------------------------------&#10; 中断号是中断号,外部中断号是外部中断号,是不一样的&#10; 中断号 : 和异常向量表中异常处理函数的顺序有关&#10; 外部中断号 : 和GPIO的管脚编号有关&#10; ----------------------------------------------------&#10; 有些外部中断会自己享用一个中断号,有些外部中断会共用一个中断号&#10;&lt;/pre&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;div id="outline-container-headline-4" class="outline-3"&gt;&#10;&lt;h3 id="headline-4"&gt;&#10;三.驱动外部中断&#10;&lt;/h3&gt;&#10;&lt;div id="outline-text-headline-4" class="outline-text-3"&gt;&#10;&lt;pre class="example"&gt;&#10; 把轮询检测按键的程序修改成中断的方式&#10; KEY0&#9;PC9&#9;EXTI9&#9;上拉输入&#9;下降沿触发&#10; KEY1&#9;PC8&#9;EXTI8&#9;上拉输入&#9;下降沿触发&#10; KEY2&#9;PA0&#9;EXTI0&#9;下拉输入&#9;上升沿触发&#10; 需要通过AFIO外设为外部中断选择触发的管脚&#10; 1.初始化eint&#10; 1)通过APB2总线使能GPIOC组和GPIOA组以及AFIO的时钟&#10; (因为需要通过AFIO为外部中断选择触发的管脚)&#10; 2)初始化功能按键使用的GPIO管脚&#10; 1&amp;gt;把PC9 PC8管脚配置为上拉输入模式&#10; 2&amp;gt;把PA0管脚配置为下拉输入模式&#10; 3)为外部中断选择触发的管脚&#10; 1&amp;gt;为EXTI9选择由PC9触发&#10; 2&amp;gt;为EXTI8选择由PC8触发&#10; 3&amp;gt;为EXTI0选择由PA0触发&#10; 4)初始化NVIC&#10; 1&amp;gt;配置组优先级和子优先级的所占比例&#10; 2&amp;gt;选择中断号&#10; 3&amp;gt;使能该中断&#10; 4&amp;gt;配置组优先级的级别&#10; 5&amp;gt;配置子优先级的级别&#10;&lt;/pre&gt;&#10;&lt;p&gt;&#10;优先级所占比例&lt;br&gt;&#10;&lt;img src="resources/优先级所占比例.png" alt="resources/优先级所占比例.png" title="resources/优先级所占比例.png" /&gt;&lt;/p&gt;&#10;&lt;pre class="example"&gt;&#10; 5)初始化EXTI&#10; 1&amp;gt;选择外部中断号&#10; 2&amp;gt;使能该外部中断&#10; 3&amp;gt;选择中断的模式&#10; 4&amp;gt;选择触发的方式&#10;&#10;============================&#10;作业&#10;1.把今天讲过的内容完完整整的复习一遍&#10;2.把外部中断的项目工程重新搭建一遍&#10;3.使用中断 + 消抖的方法实现按键开关的项目工程&#10;============================&#10;&lt;/pre&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;</description></item><item><title>stm32_note_07day</title><link>https://ynhugo.github.io/p/stm32_07day/</link><pubDate>Thu, 16 Feb 2023 08:03:05 +0800</pubDate><guid>https://ynhugo.github.io/p/stm32_07day/</guid><description>&#10;&lt;div id="outline-container-headline-1" class="outline-2"&gt;&#10;&lt;h2 id="headline-1"&gt;&#10;stm32_note_07day&#10;&lt;/h2&gt;&#10;&lt;div id="outline-text-headline-1" class="outline-text-2"&gt;&#10;&lt;p&gt;&#10;============================&lt;br&gt;&#10;2022-8-23&lt;br&gt;&#10;============================&lt;/p&gt;&#10;&lt;div id="outline-container-headline-2" class="outline-3"&gt;&#10;&lt;h3 id="headline-2"&gt;&#10;一.温故知新&#10;&lt;/h3&gt;&#10;&lt;div id="outline-text-headline-2" class="outline-text-3"&gt;&#10;&lt;pre class="example"&gt;&#10; 1.目的&#10; 之前写过检测按键是否被按下的程序-&amp;gt;使用的是轮询的方式检测-&amp;gt;CPU很忙&#10; 是把轮询检测的程序修改成了中断的方式-&amp;gt;需要使用中断控制器&#10; 2.介绍芯片中常见的中断控制器&#10; VIC&#9;向量中断控制器&#9;&#9;单片机芯片中常用&#10; NVIC&#9;可嵌套的向量中断控制器&#9;单片机芯片中常用&#10; GIC&#9;通用的中断控制器&#9;&#9;高端芯片中常用&#10; 3.在STM32F103RBT6芯片中使用的是NVIC中断控制器&#10; NVIC中断控制器会处理两个事情&#10; 1)为每一个连接到NVIC上的中断源分配一个中断号&#10; 2)处理优先级(组优先级 和 子优先级)&#10; 异常向量表中存储的是异常处理函数的函数名(异常处理函数的入口地址)&#10; 异常向量表中异常处理函数的顺序和中断号是一一对应&#10; 4.GPIO需要借助EXTI来触发中断&#10; EXTI叫做外部中断&#10; 每一组GPIO的0号管脚都可以触发EXTI0&#10; 每一组GPIO的1号管脚都可以触发EXTI1&#10; ...&#10; 每一组GPIO的15号管脚都可以触发EXTI15&#10; 需要通过AFIO外设为外部中断选择触发的GPIO管脚&#10;&lt;/pre&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;div id="outline-container-headline-3" class="outline-3"&gt;&#10;&lt;h3 id="headline-3"&gt;&#10;二.看门狗&#10;&lt;/h3&gt;&#10;&lt;div id="outline-text-headline-3" class="outline-text-3"&gt;&#10;&lt;pre class="example"&gt;&#10; STM32F103RBT6芯片使用的核心是ARM-CORTEX-M3的核心&#10; 在工控领域中经常会使用到看门狗外设,所以今天主要讲看门狗外设&#10; 1.从最新选型手册中了解看门狗信息&#10;打开&amp;lt;STM32RBT6\DataSheet\STM32&amp;gt;目录下&amp;lt;ST_MCU最新选型手册.pdf&amp;gt;&#10; P21&#10; 看门狗属于定时器的资源,在STM32芯片中属于其他定时器资源&#10; 在STM32芯片中有两个看门狗,分别是独立看门狗 和 窗口看门狗&#10;&#10; 2.产生的问题&#10; 1)查找看门狗的时钟频率?&#9;&#9;40KHz&#10; 2)查找看门狗的计数值范围?&#9;&#9;[0 - 4095]&#10; 3)看门狗提供的其他功能是什么?&#9;&#9;重启系统&#10;&#10; 3.看门狗的使用环境&#10; 在工业的工作环境中,嵌入式设备经常会面临一些恶劣的工作环境:超高温、&#10; 超低温、非常湿润、非常干燥、强烈的电磁干扰,这些环境都会影响嵌入式设备&#10; 的正常工作,有可能会造成设备死机 或者 设备中运行的程序直接跑飞&#10; 所以可以使用看门狗帮助程序员监测嵌入式设备是否死机或者程序跑飞&#10; 一旦设备死机了或者程序跑飞了,看门狗可以帮助程序员重启系统&#10;&#10; 4.看门狗的简介&#10; 既然看门狗属于定时器的资源,那么决定定时长短是由时钟频率和计数值范围&#10; 来决定的,&#10; 和普通定时器不同,普通定时器定时到了之后,去处理程序员指定要做的事情&#10; 看门狗定时到了之后,直接重启系统(效果和按下reset按键一样)&#10; 如果设备死机了,看门狗可以帮助程序员重启系统&#10; 如果设备没有死机,看门狗不需要重启系统&#10; (只要让看门狗的计数器永远计不到0,看门狗就不会重启系统了)&#10;&#10; 5.喂狗(feed dog)&#10; 需要每隔一段时间,往看门狗的计数器中重新写入计数值,让看门狗永远计不到0&#10;&#10; 6.介绍STM32芯片内部的看门狗&#10; 在STM32芯片中有两种看门狗&#10; 独立看门狗 : (IWDG)&#10; 窗口看门狗 : (WWDG)&#10; 注意 : 一般来说高端的芯片中只有一个看门狗,更像是独立看门狗&#10;&#10; 7.独立看门狗和窗口看门狗的区别&#10; 相同点&#10; 1)IWDG和WWDG都是由STM32芯片提供的外设资源&#10; 2)IWDG和WWDG功能一样,都会因为设备死机或者程序跑飞,&#10; 重启系统&#10; 3)IWDG和WWDG都可以自行调节喂狗时间&#10; 不同点&#10; 1)时钟源不同&#10; IWDG使用的是独立RC(LSI&amp;lt;40KHz&amp;gt;)提供的时钟&#10; 不需要使用总线使能时钟&#10; WWDG使用是APB1总线提供的时钟&#10; 需要通过APB1总线使能WWDG的时钟&#10; 2)产生中断不同&#10; IWDG是没有中断的,只要IWDG计到0,直接重启系统&#10; WWDG是有中断,只要计数器超时,可以触发中断&#10; 3)计数的方式不同&#10; IWDG使用的是12bit的计数器&#10; WWDG使用的是7bit的计数器&#10; 4)喂狗的时间范围不同&#10; IWDG只要计数器计到0之前,任意时间喂狗都可以&#10; WWDG会有一个上阙值和下阙值&#10;&lt;/pre&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;div id="outline-container-headline-4" class="outline-3"&gt;&#10;&lt;h3 id="headline-4"&gt;&#10;三.独立看门狗&#10;&lt;/h3&gt;&#10;&lt;div id="outline-text-headline-4" class="outline-text-3"&gt;&#10;&lt;pre class="example"&gt;&#10; 打开&amp;lt;STM32RBT6\DataSheet\STM32&amp;gt;目录下&#10; &amp;lt;STM32F10x中文参考手册.pdf&amp;gt;&#10; P276&#10; IWDG使用的是LSI(40KHz)的时钟源&#10; IWDG是一个递减的计数器(向下计数)&#10; IWDG的计数器计数到0时会产生系统复位&#10; &#10; IWDG_KR(键寄存器)&amp;lt;写入特定的值会有特定的操作&amp;gt;&#10; 0xAAAA&#9;&#9;喂狗的操作&#10; 0x5555&#9;&#9;开启IWDG_PR和OWDG_RLR寄存器的写访问&#10; 0xCCCC&#9;&#9;开启看门狗&#10; &#10; IWDG_PR(预分频寄存器)&amp;lt;给IWDG的时钟频率进行分频的&amp;gt;&#10; 注意 : 在操作IWDG_PR寄存器之前需要先给IWDG_KR寄存器写入0x5555&#10; 开启IWDG_PR寄存器的写访问(关闭写保护)&#10; 000 4分频&#9;&#9;100 64分频&#10; 001 8分频&#9;&#9;101 128分频&#10; 010 16分频&#9;110 256分频&#10; 011 32分频&#9;111 256分频&#10;&#10; IWDG_RLR(重装载值寄存器)&amp;lt;是用来存储计数值的&amp;gt;&#10; 注意 : 在操作IWDG_RLR寄存器之前需要先给IWDG_KR寄存器写入0x5555&#10; 开启IWDG_RLR寄存器的写访问(关闭写保护)&#10; 该寄存器只有低12bit有效&#10; 可以存储的计数值是[12个0 - 12个1]&amp;lt;0 - 4095&amp;gt;&#10;&lt;/pre&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;div id="outline-container-headline-5" class="outline-3"&gt;&#10;&lt;h3 id="headline-5"&gt;&#10;四.传感器&#10;&lt;/h3&gt;&#10;&lt;div id="outline-text-headline-5" class="outline-text-3"&gt;&#10;&lt;pre class="example"&gt;&#10; 1.传感器的简介&#10; 在物联网嵌入式的项目框架中,需要使用嵌入式设备采集感知周围的数据&#10; 那么需要使用传感器进行采集和感知,在市面上的传感器的种类有很多&#10; 检测气体 : 温度、湿度、空气中的微颗粒物(PM2.5、PM1.0)&#10; 稀有气体的含量(一氧化碳、二氧化碳、氧气、甲烷、乙醇、甲醛)&#10; 检测液体 : 温度、浑浊度、PH值、液位&#10; 检测固体 : 土壤湿度、微量元素的含量&#10; 检测人体 : 体温、血压、血糖、心率&#10; ...&#10; 本身市面上的传感器的种类有很多很多种&#10; 2.传感器接口的简介&#10; GPIO接口、串口接口(USART/UART、IIC、SPI...)、并口接口&#10; 数字型的传感器 : 可以直接采集到数字量,可以直接交给CPU去处理&#10; 模拟型的传感器 : 采集到的是模拟量,需要经过AD转换,&#10; 转换成了数字量再交给CPU去处理&#10;&lt;/pre&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;div id="outline-container-headline-6" class="outline-3"&gt;&#10;&lt;h3 id="headline-6"&gt;&#10;五.DHT11传感器&#10;&lt;/h3&gt;&#10;&lt;div id="outline-text-headline-6" class="outline-text-3"&gt;&#10;&lt;pre class="example"&gt;&#10; DHT11传感器是一个温湿度的传感器(是专门用来检测温度和湿度的)&#10; 外观上来看是4引脚的封装形式&#10; 打开&amp;lt;STM32RBT6\DataSheet\传感器&amp;gt;目录下&#10; &amp;lt;DHT11说明书.pdf&amp;gt;和&amp;lt;DHT22.pdf&amp;gt;&#10; 1.DHT11是一个数字型的传感器&#10; 2.DHT11是用来采集温湿度的数据&#10; 3.DHT11是4引脚的封装形式&#10; 4.测量范围&#9;&#9;湿度:20%-90%&#9;温度:0℃-50℃&#10; 5.误差范围&#9;&#9;湿度:±5%&#9;&#9;温度:±2℃&#10; 6.分辨力为1&#9;DHT11只能检测到整数数据&#10; 7.1pin连接电源 2pin连接MCU 3pinNC(悬空&amp;lt;没有连接&amp;gt;) 4pin连接地&#10;&lt;/pre&gt;&#10;&lt;p&gt;&#10;上拉电阻&lt;br&gt;&#10;&lt;img src="resources/上拉电阻.png" alt="resources/上拉电阻.png" title="resources/上拉电阻.png" /&gt;&lt;br&gt;&#10;下拉电阻&lt;br&gt;&#10;&lt;img src="resources/下拉电阻.png" alt="resources/下拉电阻.png" title="resources/下拉电阻.png" /&gt;&lt;/p&gt;&#10;&lt;pre class="example"&gt;&#10; 8.DHT11是串行接口 : 指的是数据以串行的方式进行传输&#10; 串行的方式 : 指的是按顺序一位一位的传输数据&#10; 9.单线双向指的是半双工工作模式(发送的同时不能接收,接收的同时不能发送)&#10;&lt;/pre&gt;&#10;&lt;p&gt;&#10;串行传输&lt;br&gt;&#10;&lt;img src="resources/串行传输.png" alt="resources/串行传输.png" title="resources/串行传输.png" /&gt;&lt;/p&gt;&#10;&lt;pre class="example"&gt;&#10; A.一次完整的数据传输为40bit,高位先出.&#10; &#10; 例子 : DHT11的数据管脚连接到了STM32的PC10管脚&#10; 需要通过PC10管脚发送数据或者接收数据&#10; 1)通过PC10管脚发送数据(高位先出)&#10; data = 10110100;&#10; data&#9;&#9;&amp;amp;&#9;&#9;PCOut(10)&#10;第1次循环&#9;10110100&#9;10000000&#9;1&#10;第2次循环&#9;01101000&#9;10000000&#9;0&#10;第3次循环&#9;11010000&#9;10000000&#9;1&#10;第4次循环&#9;10100000&#9;10000000&#9;1&#10;第5次循环&#9;01000000&#9;10000000&#9;0&#10;第6次循环&#9;10000000&#9;10000000&#9;1&#10;第7次循环&#9;00000000&#9;10000000&#9;0&#10;第8次循环&#9;00000000&#9;10000000&#9;0&#10; void func(u8 data)//通过PC10管脚把形参data存储的数据发送&#10; {&#10; u8 i = 0;//循环变量&#10; for(i =0 ; i &amp;lt; 8; i++)&#10; {&#10; if(data &amp;amp; 0x80)&#10; PCOut(10) = 1;&#10; else&#10; PCOut(10) = 0;&#10; data &amp;lt;&amp;lt;= 1;&#10; }&#9;&#10; }&#10;&#10; 2)通过PC10管脚发送数据(低位先出)&#10; data&#9;&#9;&amp;amp;&#9;&#9;PCOut(10)&#10;第1次循环&#9;10110100&#9;00000001&#9;0&#10;第2次循环&#9;01011010&#9;00000001&#9;0&#10;第3次循环&#9;00101101&#9;00000001&#9;1&#10;第4次循环&#9;00010110&#9;00000001&#9;0&#10;第5次循环&#9;00001011&#9;00000001&#9;1&#10;第6次循环&#9;00000101&#9;00000001&#9;1&#10;第7次循环&#9;00000010&#9;00000001&#9;0&#10;第8次循环&#9;00000001&#9;00000001&#9;1&#10; void func(u8 data)&#10; {&#10; u8 i = 0;//循环变量&#10; for(i = 0; i &amp;lt; 8; i++)&#10; {&#10; if(data &amp;amp; 0x01)&#10; PCOut(10) = 1;&#10; else&#10; PCOut(10) = 0;&#10; data &amp;gt;&amp;gt;= 1;&#10; }&#10; }&#10; 3)通过PC10管脚读取数据(高位先出)&#10; DHT11要发送10110100&#10; PCIn(10)&#9;data &amp;lt;&amp;lt;=1&#9;data&#10;第1次循环&#9;1&#9;00000000&#9;00000001&#10;第2次循环&#9;0&#9;00000010&#9;00000010&#10;第3次循环&#9;1&#9;00000100&#9;00000101&#10;第4次循环&#9;1&#9;00001010&#9;00001011&#10;第5次循环&#9;0&#9;00010110&#9;00010110&#10;第6次循环&#9;1&#9;00101100&#9;00101101&#10;第7次循环&#9;0&#9;01011010&#9;01011010&#10;第8次循环&#9;0&#9;10110100&#9;10110100&#10; u8 func(void)&#10; {&#10; u8 data = 0;//保存读取到的数据&#10; u8 i = 0;//循环变量&#10; &#10; for(i = 0; i &amp;lt; 8; i++)&#10; {&#10; data &amp;lt;&amp;lt;= 1;&#10; if(PCIn(10) == 1)&#10; data |= 1;&#10; }&#10; &#10; return data;&#10; }&#10; 4))通过PC10管脚读取数据(低位先出)&#10; DHT11要发送10110100&#10; PCIn(10)&#9;data &amp;gt;&amp;gt;=1&#9;data&#10;第1次循环&#9;0&#9;00000000&#9;00000000&#10;第2次循环&#9;0&#9;00000000&#9;00000000&#10;第3次循环&#9;1&#9;00000000&#9;10000000&#10;第4次循环&#9;0&#9;01000000&#9;01000000&#10;第5次循环&#9;1&#9;00100000&#9;10100000&#10;第6次循环&#9;1&#9;01010000&#9;11010000&#10;第7次循环&#9;0&#9;01101000&#9;01101000&#10;第8次循环&#9;1&#9;00110100&#9;10110100&#10; u8 func(void)&#10; {&#10; u8 data = 0;//保存读取到的数据&#10; u8 i = 0;//循环变量&#10; &#10; for(i = 0; i &amp;lt; 8; i++)&#10; {&#10; data &amp;gt;&amp;gt;= 1;&#10; if(PCIn(10) == 1)&#10; data |= 0x80;&#10; }&#10; &#10; return data;&#10; }&#10;&#10;===========================&#10;作业&#10;1.把今天讲过的内容完完整整的复习一遍&#10;2.可以使用操作寄存器的方法驱动一下独立看门狗&#10;3.根据手册操作一下窗口看门狗&#10;4.在纸上写一遍串行接口发送数据和接收数据(高位先出和低位先出)&#10;===========================&#10;&lt;/pre&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;</description></item><item><title>stm32_note_08day</title><link>https://ynhugo.github.io/p/stm32_08day/</link><pubDate>Thu, 16 Feb 2023 08:03:05 +0800</pubDate><guid>https://ynhugo.github.io/p/stm32_08day/</guid><description>&#10;&lt;div id="outline-container-headline-1" class="outline-2"&gt;&#10;&lt;h2 id="headline-1"&gt;&#10;stm32_note_08day&#10;&lt;/h2&gt;&#10;&lt;div id="outline-text-headline-1" class="outline-text-2"&gt;&#10;&lt;p&gt;&#10;===========================&lt;br&gt;&#10;2022-8-24&lt;br&gt;&#10;===========================&lt;/p&gt;&#10;&lt;div id="outline-container-headline-2" class="outline-3"&gt;&#10;&lt;h3 id="headline-2"&gt;&#10;一.温故知新&#10;&lt;/h3&gt;&#10;&lt;div id="outline-text-headline-2" class="outline-text-3"&gt;&#10;&lt;pre class="example"&gt;&#10; 其他的定时器主要讲的是看门狗&#10; 1.通过最新选型手册了解-&amp;gt;有两个看门狗外设资源-&amp;gt;属于定时器外设&#10; 2.看门狗使用的环境&#10; 3.喂狗的操作&#10; 4.独立看门狗和窗口看门狗的区别&#10; 5.独立看门狗&#10; IWDG_KR(键寄存器)&#9;&amp;lt;接收特定的值,执行特定的操作&amp;gt;&#10; 0x5555&#9;开启(IWDG_PR和IWDG_RLR寄存器)写访问(关闭写保护)&#10; 0xCCCC&#9;开启看门狗&#10; 0xAAAA&#9;喂狗的操作&#10; IWDG_PR(预分频值寄存器) &amp;lt;用来给时钟频率分频的&amp;gt;&#10; 000 4分频&#9;&#9;100 64分频&#10; 001 8分频&#9;&#9;101 128分频&#10; 010 16分频&#9;110 256分频&#10; 011 32分频&#9;111 245分频&#10; IWDG_RLR(重装载值寄存器) &amp;lt;用来保存计数值的&amp;gt;&#10; 计数值范围[12个0 - 12个1]&amp;lt;0 - 4095&amp;gt;&#10; &#10; 传感器&#10; 市面上比较常见的传感器&#10; 传感器的接口&#10; 通过DHT11的手册分析DHT11传感器&#10; 1.温湿度的传感器&#10; 2.4管脚的封装形式&#10; 1PIN&#9;VCC&#10; 2PIN&#9;DATA&#10; 3PIN&#9;NC&#10; 4PIN&#9;GND&#10; 3.测量范围 : 湿度20 - 90% 温度0 - 50℃&#10; 4.误差范围 : 湿度±5% 温度±2℃&#10; 5.分辨力1 : 只能采集到整数的数据,采集不了小数数据&#10; 6.串行接口(单线双向)&#10; 串行接口 : 以串行的方式传输数据,数据按照顺序一位一位发送&#10; 单线双向 : 半双工的工作模式&#10; 7.高位先出&#10; 8.一次完整的数据需要40bit = 8bit湿度的整数数据 + 8bit湿度的小数数据&#10; + 8bit温度的整数数据 + 8bit温度的小数数据&#10; + 8bit校验和&#10; 9.分析读写时序&#10; 10.串行接口发送数据接收数据(高位先出、低位先出)&#10;&lt;/pre&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;div id="outline-container-headline-3" class="outline-3"&gt;&#10;&lt;h3 id="headline-3"&gt;&#10;二.驱动DHT11&#10;&lt;/h3&gt;&#10;&lt;/div&gt;&#10;&lt;div id="outline-container-headline-4" class="outline-3"&gt;&#10;&lt;h3 id="headline-4"&gt;&#10;三.DS18B20&#10;&lt;/h3&gt;&#10;&lt;div id="outline-text-headline-4" class="outline-text-3"&gt;&#10;&lt;pre class="example"&gt;&#10; 专门用来检测温度的传感器&#10; 打开&amp;lt;STM32RBT6\DataSheet\传感器&amp;gt;目录下&amp;lt;DS18B20.pdf&amp;gt;&#10; 1.DS18B20是3管脚的封装形式(VCC DQ GND)&#10; 2.DS18B20是一线传输的传感器(只有一条数据线&amp;lt;既需要输入也需要输出&amp;gt;)&#10; 3.电压范围&#9;&#9;3.0V - 5.5V&#10; 4.测量范围&#9;&#9;-55℃ - +125℃&#10; 5.误差范围(在-10℃ - +85℃)会有±0.5℃的误差&#10; 6.DS18B20既可以采集到整数数据也可以采集到小数数据&#10; 7.DS18B20采集到的数据会存放在9bit - 12bit的存储空间中&#10; 8.转换12bit的温度数据最多需要消耗750ms&#10; 9.在DS18B20传感器内部有9个字节的暂存器&#10; 第0个字节&#9;&#9;温度的低字节数据&#10; 第1个字节&#9;&#9;温度的高字节数据&#10; 第2个字节&#9;&#9;温度的上限&#10; 第3个字节&#9;&#9;温度的下限&#10; 第4个字节&#9;&#9;配置&#10; 第5 6 7字节&#9;保留&#10; 第8个字节&#9;&#9;校验&#10; A.通过配置暂存器的第4个字节(配置)来选择采集温度数据所占位数&#10; 0 R1 R0 1 1 1 1 1&#10; 第0-4位&#9;&#9;都是1&#10; 通过R1 R0选择温度所占位数&#10; 0 0&#9;&#9;9bit&#10; 0 1&#9;&#9;10bit&#10; 1 0&#9;&#9;11bit&#10; 1 1&#9;&#9;12bit&#10; 第7位&#9;&#9;是0&#10; B.用来存储温度的暂存器&#10; 温度的高字节的高5位是符号位(0代表正&#9;1代表负)&#10; DS18B20的分辨力是0.0625℃&#10; DS18B20的暂存器存储的也是补码数据&#10; 所以将来从DS18B20的暂存器中读出的数据是补码&#10; -0.5°C&#10; 原码&#9;11111000 00001000&#10; 补码&#9;11111111 11111000&#10; 注意 : 读取数据有一个特殊值&#10; 假如将来读到的数据是&#10; 11111111 00000000&#10; 补码&#9;11111111 00000000&#10; 原码&#9;11111001 00000000&#10; 因为高字节和低字节的数据都要+1&#10; 低字节的+1 : 补码转换成原码时候的+1&#10; 高字节的+1 : 是因为产生了进位所以要+1&#10; C.DS18B20内部支持很多的指令&#10; D.手册中给驱动工程师写了案例&#10; E.分析DS18B20的时序图&#10;&lt;/pre&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;div id="outline-container-headline-5" class="outline-3"&gt;&#10;&lt;h3 id="headline-5"&gt;&#10;四.数码管&#10;&lt;/h3&gt;&#10;&lt;div id="outline-text-headline-5" class="outline-text-3"&gt;&#10;&lt;pre class="example"&gt;&#10; 1.显示类的设备&#10; LCD显示屏、OLED屏幕、段码屏(需要厂家定制)、点阵屏、光立方、数码管&#10; 作用就是用来显示数据的&#10; 其中数码管可以显示数字0 - 9包括一些简单的英文字母&#10; 2.数码管&#10; 常见的数码管有七段数码管或者八段数码管&#10; 其中每一个段就相当于是一个LED灯&#10; 八段数码管要比七段数码管多一个用于显示小数的小数点&#10; 3.共阴极数码管和共阳极数码管&#10; 共阴极数码管 : 数码管中所有数据段的阴极都连接到了一起,接地&#10; 给数据段的阳极输出高电平,可以点亮数码管&#10; 共阳极数码管 : 数码管中所有数据段的阳极都连接到了一起,接电源&#10; 给数据段的阴极输出低电平,可以点亮数码管&#10; 各自的编码 : &#10; 共阳极数码管的编码&#10; uchar code table[]={0xc0,0xf9,0xa4,0xb0,//0 1 2 3&#10; 0x99,0x92,0x82,0xf8,//4 5 6 7&#10; 0x80,0x90,0x88,0x83,//8 9 A B&#10; 0xc6,0xa1,0x86,0x8e};//C D E F&#10; 共阴极数码管的编码：&#10; uchar code table[]={0x3f,0x06,0x5b,0x4f,//0 1 2 3&#10; 0x66,0x6d,0x7d,0x07,//4 5 6 7&#10; 0x7f,0x6f,0x77,0x7c,//8 9 A B&#10; 0x39,0x5e,0x79,0x71};//C D E F&#10; 4.四位共阴极数码管&#10; 我们的开发板上连接的是四位共阴极的数码管&#10; 产生的问题&#10; 如果四位数码管的所有数据段都连接到芯片的管脚上就会占用32个管脚&#10; 这样对于芯片的管脚太浪费了&#10; ------------------------------------------------------------------------&#10; 为了解决芯片管脚浪费的问题&#10; 把四位数码管的所有的A段都连接到了一起&#10; 把四位数码管的所有的B段都连接到了一起&#10; ...&#10; 把四位数码管的所有的DP段都连接到了一起&#10; 这样处理只会消耗芯片的8个管脚&#10; 产生的问题&#10; 给8个数据段写入编码,四个数码管会显示相同的数据&#10; ------------------------------------------------------------------------&#10; 四位数码管的公共端接到芯片的管脚上&#10; 将来想要让某个数码管显示数据,就让该数码管的公共端有效,&#10; 其他数码管的公共端无效即可&#10; 产生的问题&#10; 四位数码管不能同时显示数据(只能一个一个显示)&#10; ------------------------------------------------------------------------&#10; 可以利用人类眼睛的视觉暂留处理&#10;&#10;=============================&#10;作业&#10;1.把今天讲过的内容完完整整的复习一遍&#10;=============================&#10;&lt;/pre&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;</description></item><item><title>stm32_note_09day</title><link>https://ynhugo.github.io/p/stm32_09day/</link><pubDate>Thu, 16 Feb 2023 08:03:05 +0800</pubDate><guid>https://ynhugo.github.io/p/stm32_09day/</guid><description>&#10;&lt;div id="outline-container-headline-1" class="outline-2"&gt;&#10;&lt;h2 id="headline-1"&gt;&#10;stm32_note_09day&#10;&lt;/h2&gt;&#10;&lt;div id="outline-text-headline-1" class="outline-text-2"&gt;&#10;&lt;p&gt;&#10;===========================&lt;br&gt;&#10;2022-8-25&lt;br&gt;&#10;===========================&lt;/p&gt;&#10;&lt;div id="outline-container-headline-2" class="outline-3"&gt;&#10;&lt;h3 id="headline-2"&gt;&#10;一.温故知新&#10;&lt;/h3&gt;&#10;&lt;div id="outline-text-headline-2" class="outline-text-3"&gt;&#10;&lt;pre class="example"&gt;&#10; 1.根据分析的DHT11的读写时序来写DHT11传感器的驱动&#10; 2.分析DS18B20传感器的内容&#10; 1)三管脚的封装形式(VCC DQ GND)&#10; 2)一线传输(以串行的方式传输数据)&amp;lt;半双工的工作模式&amp;gt;&#10; 3)工作电压范围&#9;3.0V - 5.5V&#10; 4)测量范围&#9;-55℃ - +125℃&#10; 5)误差范围(在-10℃ - 85℃)会有±0.5℃的误差&#10; 6)可以采集到整数的数据和小数的数据&#10; 7)在DS18B20的内部会有9个字节的暂存器&#10; 第0个字节&#9;&#9;温度的低字节数据&#10; 第1个字节&#9;&#9;温度的高字节数据&#10; 高字节的高5位是符号位&#10; 存储的是温度的补码数据&#10; 第2个字节&#9;&#9;温度的上限&#10; 第3个字节&#9;&#9;温度的下限&#10; 第4个字节&#9;&#9;配置&#10; 是用来配置DS18B20采集温度所占位数&#10; 0 R1 R0 1 1 1 1 1&#10; 00&#9;9bit的温度数据&#10; 01&#9;10bit的温度数据&#10; 10&#9;11bit的温度数据&#10; 11&#9;12bit的温度数据&#10; 第5 6 7字节&#9;保留&#10; 第8个字节&#9;&#9;检验&#10; 8)在DS18B20传感器中支持很多的指令&#10; 9)DS18B20官方手册给了发送指令的案例&#10; A)分析DS18B20的读写时序&#10;&lt;/pre&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;div id="outline-container-headline-3" class="outline-3"&gt;&#10;&lt;h3 id="headline-3"&gt;&#10;二.数码管&#10;&lt;/h3&gt;&#10;&lt;div id="outline-text-headline-3" class="outline-text-3"&gt;&#10;&lt;pre class="example"&gt;&#10; 我们的开发板上使用的四位共阴极的数码管&#10; 1.显示类的设备&#10; 市面上的显示类型的设备有很多种&#10; LCD、OLED、数码管、段码屏、点阵屏、光立方...&#10; 2.数码管&#10; 数码管可以分为七段数码管和八段数码管&#10; 八段数码管要比七段数码管多一个用于显示小数的小数点&#10; 数码管中的每一个段就相当于是一个LED灯&#10; 3.共阴极数码管和共阳极数码管&#10; 共阴极数码管 : 数码管上所有的LED灯的阴极都连接到了一起,接地&#10; 共阳极数码管 : 数码管上所有的LED灯的阳极都连接到了一起,接电源&#10; 共阴极数码管的编码和共阳极数码管的编码正好相反&#10; 共阳极数码管的编码 :&#10; uchar code table[]={0xc0,0xf9,0xa4,0xb0,//0 1 2 3&#10; 0x99,0x92,0x82,0xf8,//4 5 6 7&#10; 0x80,0x90,0x88,0x83,//8 9 A B&#10; 0xc6,0xa1,0x86,0x8e};//C D E F&#10; 共阴极数码管的编码 :&#10; uchar code table[]={0x3f,0x06,0x5b,0x4f,//0 1 2 3&#10; 0x66,0x6d,0x7d,0x07,//4 5 6 7&#10; 0x7f,0x6f,0x77,0x7c,//8 9 A B&#10; 0x39,0x5e,0x79,0x71};//C D E F&#10; 如何获取数码管的编码&#10; 1)可以百度查找&#10; 2)可以通过转换软件直接转换&#10; 4.四位数码管&#10; 四位数码管可以分别显示千位 百位 十位 个位&#10; 已知一个数码管有8个LED灯需要8个数据段&#10; 四位数码管有32个LED灯需要32个数据段&#10; 如果直接连接到芯片的管脚上需要消耗芯片的32个管脚&#10; 这样的方式对于芯片的管脚来说太浪费了&#10; 5.四位数码管的问题&#10;&lt;/pre&gt;&#10;&lt;p&gt;&#10;原理图&lt;br&gt;&#10;&lt;img src="resources/7_原理图.png" alt="resources/7_原理图.png" title="resources/7_原理图.png" /&gt;&lt;/p&gt;&#10;&lt;pre class="example"&gt;&#10; 1)芯片管脚的浪费&#10; 把所有数码管的A段都连接到一起&#10; 把所有数码管的B段都连接到一起&#10; ...&#10; 把所有数码管的DP段都连接到一起&#10; 2)相同数据段都连接到了一起&#10; 给四位数码管一个数据编码,这4个数码管会显示相同的数据&#10; 3)把四位数码管的4个公共端也都连接到GPIO的管脚上&#10; 将来想要让某个数码管显示数据,就让给数码管的公共端输出低电平&#10; 其他数码管输出高电平&#10; 4)经过2) 3)的处理产生了一个问题,&#10; 四位数码管不能同时显示不同的数据&#10; 利用人眼睛的视觉暂留&#10; 6.分析开发板原理图&#10; 开发板上的四位共阴极的数码管&#10; 公共端连接到了74HC138模块上&#10; 数据段连接到了74HC595模块上&#10; 如果想要驱动数码管,首先需要驱动74HC138和74HC595&#10; 7.分析74HC138&#10;&lt;/pre&gt;&#10;&lt;p&gt;&#10;74HC138&lt;br&gt;&#10;&lt;img src="resources/5_74HC138.png" alt="resources/5_74HC138.png" title="resources/5_74HC138.png" /&gt;&lt;/p&gt;&#10;&lt;pre class="example"&gt;&#10; 74HC138是一个典型的三八译码器(是作为一个选择器来使用的)&#10; 三个输入,八个输出(给一定的输入就会用相应的输出)&#10; 打开&amp;lt;STM32RBT6\DataSheet\其他&amp;gt;目录下&amp;lt;74HC138.pdf&amp;gt;&#10; P3&#9;封装形式(了解管脚功能)&#10; P4&#9;真值表&#10; 查看开发板原理图&#10; &#10; 8.&#10;&lt;/pre&gt;&#10;&lt;p&gt;&#10;74HC595&lt;br&gt;&#10;&lt;img src="resources/6_74HC595.png" alt="resources/6_74HC595.png" title="resources/6_74HC595.png" /&gt;&lt;/p&gt;&#10;&lt;pre class="example"&gt;&#10; 74HC595是一个可以把串行数据转换成并行数据的模块&#10; 打开&amp;lt;STM32RBT6\DataSheet\其他&amp;gt;目录下&amp;lt;74HC595.pdf&amp;gt;&#10; P4&#9;封装形式(了解管脚功能)&#10; P5&#9;工作原理分析&#10; &#10; 9.根据开发板原理图把需要操作的管脚找到&#10; HC138_A0&#9;PC11&#9;74HC138中的控制&#9;推挽输出&#10; HC138_A1&#9;PC12&#9;74HC138中的控制&#9;推挽输出&#10; HC138_A2&#9;PD2&#9;74HC138中的控制&#9;推挽输出&#10; HC595_SCLK&#9;PB5&#9;移位寄存器的时钟&#9;推挽输出&#10; HC595_LCLK&#9;PB4&#9;存储寄存器的时钟&#9;推挽输出&#10; HC595_DATA&#9;PB3&#9;把串行数据存储到&#9;推挽输出&#10; 移位寄存器中&#10;&#10;==============================&#10;任务&#10;1.把9527显示到数码管上&#10;2.把DHT11采集的温湿度的数据显示到数码管上&#10;==============================&#10;作业&#10;1.把今天讲过的内容完整的复习一遍&#10;2.把开发板作为记秒表的设备&#10; KEY0&#9;开始记秒表&#10; KEY1&#9;暂停&#10; KEY2&#9;清零&#10; 00.00&#10; 秒数.&#10;==============================&#10;&lt;/pre&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;</description></item><item><title>stm32_note_10day</title><link>https://ynhugo.github.io/p/stm32_10day/</link><pubDate>Thu, 16 Feb 2023 08:03:05 +0800</pubDate><guid>https://ynhugo.github.io/p/stm32_10day/</guid><description>&#10;&lt;div id="outline-container-headline-1" class="outline-2"&gt;&#10;&lt;h2 id="headline-1"&gt;&#10;stm32_note_10day&#10;&lt;/h2&gt;&#10;&lt;div id="outline-text-headline-1" class="outline-text-2"&gt;&#10;&lt;p&gt;&#10;===========================&lt;br&gt;&#10;2022-8-26&lt;br&gt;&#10;===========================&lt;/p&gt;&#10;&lt;div id="outline-container-headline-2" class="outline-3"&gt;&#10;&lt;h3 id="headline-2"&gt;&#10;一.温故知新&#10;&lt;/h3&gt;&#10;&lt;div id="outline-text-headline-2" class="outline-text-3"&gt;&#10;&lt;pre class="example"&gt;&#10; 74HC138-&amp;gt;数码管的公共端&#10; 是一个三八译码器,功能是一个选择器&#10; 16管脚的封装形式&#10; VCC GND&#10; A0 A1 A2(三个输入)&#10; E1 E2 E3(控 模式)&#10; Y0 - Y7(8个输出)&#10; 74HC595-&amp;gt;数码管的数据段&#10; 是一个可以把串行数据转换成并行数据的模块&#10; 16管脚的封装形式&#10; VCC GND&#10; DS(串行数据的输入)&#10; Q0 - Q7(并行数据的输出)&#10; Q7’级联&#10; OE(输出使能)&#10; MR(主复位)&#10; SH_CP&#10; ST_CP&#10; 由三个部分组成&#10; (&amp;lt;8bit移位寄存器&amp;gt;&amp;lt;8bit存储寄存器&amp;gt;&amp;lt;状态输出&amp;gt;)&#10;&lt;/pre&gt;&#10;&lt;p&gt;&#10;选择器 &lt;br&gt;&#10;&lt;img src="resources/选择器.png" alt="resources/选择器.png" title="resources/选择器.png" /&gt;&lt;/p&gt;&#10;&lt;pre class="example"&gt;&#10; 派发STM32F407ZGT6开发板&#10;&lt;/pre&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;div id="outline-container-headline-3" class="outline-3"&gt;&#10;&lt;h3 id="headline-3"&gt;&#10;二.串行的接口&#10;&lt;/h3&gt;&#10;&lt;div id="outline-text-headline-3" class="outline-text-3"&gt;&#10;&lt;pre class="example"&gt;&#10; 1.串口的简介&#10; 串口也叫做串行的接口,串行的通讯接口或者串行的通信接口&#10; (在Windows系统环境中串口表现为COM接口)&#10; (在Linux系统环境中串口表现为tty设备&amp;lt;/dev/ttyxx&amp;gt;)&#10; 串行的通信指的是数据一位一位的按顺序(高位先出 | 低位先出)进行传输&#10; 串行的接口操作起来比较简单,只需要一条数据线就可以完成传输数据&#10; 注意 : 并口也叫做并行的接口.指的是数据多位多位进行传输&#10; 并不是说并口可以一次发送多位数据,就要比串口传输速度快,不一定&#10; 2.串口的工作模式&#10; 单工模式&#9;&#9;A----&amp;gt;------B&#10; A设备只发送数据,B设备只接收数据,数据线上只有一种传输方向&#10; 半双工模式&#9;A--&amp;gt;-----&amp;lt;--B&#10; A设备可以收发数据,B设备也可以收发数据&#10; 但是在同一时间,数据线上只能有一种传输方向&#10; 发送的同时不能接收,接收的同时不能发送&#10; 全双工模式&#9; ------&amp;gt;-----&#10; A&#9; B&#10; ------&amp;lt;-----&#10; A设备可以收发数据,B设备也可以收发数据&#10; 发送的同时可以接收,接收的同时可以发送&#10; 3.不同电平标准的串口&#10; 注意 : 如果两个设备需要通过串口进行通信,首先要确保电平标准一致&#10; 如果电平标准不一致,需要使用电平转换模块&#10; TTL电平标准的串口&#10; 0V代表数据0&#9;3.3V/5V代表数据1&#10; 传输距离差不多1米左右&#10; RS232电平标准的串口&#10; (3V - 12V)代表数据0&#9;(-3V - -12V)代表数据1&#10; 传输距离差不多15米左右&#10; RS485电平标准的串口(工业级的总线&amp;lt;抗干扰性极强&amp;gt;)&#10; 在单工模式或者半双工模式下最少需要两条数据线&#10; 在全双工模式下需要四条数据线&#10; 因为传输的是两条电线的电压差&#10; 传输距离差不多1000米左右&#10; 4.我们开发板上串口的分类&#10; 在STM32F103RBT6芯片中串口的分类&#10; SPI、I²C、I²S、USART/UART、CEC、USB、CAN、以太网接口、SDIO&#10; 本次主要讲的是USART/UART&#10; 5.USART/UART&#10; USART : 通用的同步异步收发器&#10; 既支持同步模式也支持异步模式&#10; UART : 通用的异步收发器&#10; 只支持异步模式&#10; 6.同步和异步&#10; 同步 : 发送方发出数据之后,需要等待接收方回复应答,接收到应答之后再发送&#10; 下一个数据包&#10; 同步是阻塞模式&#10; 比如说 : I²C、SPI属于同步的通信&#10; 异步 : 发送方发出数据之后,不需要等待接收方回复应答,直接发送下一个数据包&#10; 异步是非阻塞模式&#10; 比如说 : UART属于异步的通信&#10;&#10; 7.我们开发板上的USART/UART&#10; 我们使用的STM32F103RBT6芯片中一共有3个USART/UART&#10; USART1&#9;纽扣电池的上面&#10; USART2&#9;无线模块的接口位置&#10; USART3&#9;扩展IO&#10; 目的 : 带着大家把USART1的实验完成,自己搞定USART2/USART3的驱动&#10; &#10; 8.驱动USART1&#10; USART1_TX&#9;PA9&#9;推挽复用&#10; USART1_RX&#9;PA10&#9;浮空输入&#10;&#10; 在通讯之前需要规定好双方的波特率&#10; 115200 8N1&#10; 115200&#9;波特率&#10; 8&#9;8个数据位(1个字节数据)&#10; N&#9;没有奇偶校验&#10; 1&#9;1个停止位&#10;注意 : 上位机程序(串口调试助手)不要打开多个！！！&#10;&#10;=================================&#10;作业&#10;1.把本周讲过的内容完整的复习一遍&#10;2.举一反三(根据驱动USART1的程序把USART3搞定)&#10;3.封装函数&#10; extern void usart_1_send_data(char *buf);//可以发送多个字节数据&#10;4.通过USART1显示DHT11采集的数据&#10; &amp;#34;HUM:XX TEMP:XX&amp;#34;&#10;5.通过USART1把结构体类型的数据发送出去&#10; struct data&#10; {&#10; float Hum;//湿度&#10; float Temp;//温度&#10; int pm_value;//PM2.5&#10; char buf[16];//存储额外的数据&#10; };&#10; struct data d = {23.45, 34.56, 9527, &amp;#34;Hello World&amp;#34;};&#10;=================================&#10;&lt;/pre&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;</description></item><item><title>stm32_note_11day</title><link>https://ynhugo.github.io/p/stm32_11day/</link><pubDate>Thu, 16 Feb 2023 08:03:05 +0800</pubDate><guid>https://ynhugo.github.io/p/stm32_11day/</guid><description>&#10;&lt;div id="outline-container-headline-1" class="outline-2"&gt;&#10;&lt;h2 id="headline-1"&gt;&#10;stm32_note_11day&#10;&lt;/h2&gt;&#10;&lt;div id="outline-text-headline-1" class="outline-text-2"&gt;&#10;&lt;p&gt;&#10;=============================&lt;br&gt;&#10;2022-8-29&lt;br&gt;&#10;=============================&lt;/p&gt;&#10;&lt;div id="outline-container-headline-2" class="outline-3"&gt;&#10;&lt;h3 id="headline-2"&gt;&#10;一.温故知新&#10;&lt;/h3&gt;&#10;&lt;div id="outline-text-headline-2" class="outline-text-3"&gt;&#10;&lt;pre class="example"&gt;&#10; 串口&#10; 1.以串行的方式(数据按照顺序&amp;lt;高位先出|低位先出&amp;gt;一位一位的进行传输)&#10; 传输数据&#10; 2.串口的工作模式(单工模式 半双工模式 全双工模式 )&#10; 3.不同电平标准的串口(TTL、RS232、RS485)&#10; 4.在STM32F103RBT6芯片中,串口外设&#10; (IIC、SPI、USART/UART、USB、CAN)&#10; 5.研究USART/UART&#10; USART:通用的同步异步收发器&#10; UART:通用的异步收发器&#10; 在STM32F103RBT6芯片中有3个USART/UART&#10; 在开发板上的位置&#10; USART1&#9;纽扣电池的上面&#10; USART2&#9;无线模块的接口&#10; USART3&#9;扩展IO上&#10; 6.驱动USART1&#10; void usart_1_init(void)&#10; {&#10; 1)通过APB2总线使能GPIOA组和USART1的时钟&#10; 2)初始化GPIOA组的管脚&#10; 1&amp;gt;把PA9管脚配置为推挽的复用模式&#10; 2&amp;gt;把PA10管脚配置为浮空的输入模式&#10; 3)初始化USART1&#10; 1&amp;gt;选择115200的波特率&#10; 2&amp;gt;关闭硬件流控&#10; 3&amp;gt;选择发送和接收模式&#10; 4&amp;gt;选择没有奇偶校验&#10; 5&amp;gt;选择8个数据位&#10; 6&amp;gt;选择1个停止位&#10; 4)初始化NVIC&#10; 1&amp;gt;配置组优先级和子优先级的所占比例&#10; 2&amp;gt;初始化NVIC&#10; 选择USART1的中断号&#10; 使能该中断&#10; 选择组优先级的级别&#10; 选择子优先级的级别&#10; 5)选择由USART1的接收触发中断&#10; 6)使能USART1的功能&#10; }&#10; void usart_1_send_byte(u8 data)&#10; {&#10; 1)把形参数据通过官方固件进行发送&#10; 2)以死等的方式等待USART1的数据发送成功&#10; 3)清除USART1等待发送成功的标志状态&#10; }&#10; u8 usart_1_recv_byte(void)&#10; {&#10; 1)判断USART1是否接收到了数据&#10; 2)接收数据&#10; 3)清除USART1接收到数据的标志状态&#10; 4)把接收到的数据返回&#10; }&#10;&#10;3.封装函数&#10; extern void usart_1_send_data(char *buf);//可以发送多个字节数据&#10;4.通过USART1显示DHT11采集的数据(自己找张纸写一下itoa函数的实现)&#10; &amp;#34;HUM:XX TEMP:XX&amp;#34;&#10;5.通过USART1把结构体类型的数据发送出去&#10; struct data&#10; {&#10; float Hum;//湿度&#10; float Temp;//温度&#10; int pm_value;//PM2.5&#10; char buf[16];//存储额外的数据&#10; };&#10; struct data d = {23.45, 34.56, 9527, &amp;#34;Hello World&amp;#34;};&#10;&lt;/pre&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;div id="outline-container-headline-3" class="outline-3"&gt;&#10;&lt;h3 id="headline-3"&gt;&#10;二.串口附加的内容&#10;&lt;/h3&gt;&#10;&lt;div id="outline-text-headline-3" class="outline-text-3"&gt;&#10;&lt;pre class="example"&gt;&#10; int a = 100;&#10; printf(&amp;#34;a = %d\n&amp;#34;, a);&#10; printf(&amp;#34;%d-%c-%s-%f\n&amp;#34;, 9527, &amp;#39;A&amp;#39;, &amp;#34;Hello&amp;#34;, 3.14);&#10; int printf(const void *format, ...)//不定参的函数&#10; {&#10; int i = 0;&#10;&#10; for(i = 0; format[i] != &amp;#39;\0&amp;#39;; i++)&#10; {&#10; if(format[i] == &amp;#39;%&amp;#39;)&#10; {&#10; i++;&#10; switch(format[i])&#10; {&#10; case &amp;#39;d&amp;#39; : &#10; case &amp;#39;c&amp;#39; :&#10; case &amp;#39;s&amp;#39; :&#10; case &amp;#39;f&amp;#39; :&#10; }&#10; }&#10; else&#10; {&#10; fgetc();&#10; }&#10; }&#10; }&#10;&#10;&#10; 1.标准库中没有实现itoa函数,但是有sprintf函数&#10; printf一族的函数&#10; printf-&amp;gt;把双引号的内容打印输出到标准输出中&#10; sprintf-&amp;gt;把双引号的内容打印输出到字符数组中&#10; fprintf-&amp;gt;把双引号的内容打印输出到文件中&#10; 如果在默认环境中直接使用printf或者scanf函数,单片机的程序会直接跑飞&#10; 因为printf和scanf函数它的操作对象是标准输入和标准输出,&#10; 是有操作系统的环境下,但是单片机是裸板,没有操作系统&#10; 2.如果想要在STM32环境中使用printf和scanf函数,需要做一些特殊处理&#10; 需要把printf函数和scanf函数重定向到串口的发送和串口的接收&#10; 推荐两种方法&#10; 1)使用微库(Micro Lib)&#10; 可以使用微库来替代C语言的标准库,&#10; 微库主要是给容量比较小的芯片进行使用的,&#10; 但是如果芯片本身容量够用不建议使用微库,&#10; 因为微库实现的函数相较于C语言标准库来说不完整,&#10; 而且在使用一些大型功能的函数的时候,&#10; 微库的效率要比C语言标准库低&#10; 1&amp;gt;开启微库&#10; 第三行菜单栏-&amp;gt;Options for target-&amp;gt;target菜单中-&amp;gt;&#10; 在右边栏中-&amp;gt;选中USE Micro LIB&#10; 2&amp;gt;把printf和scanf函数的实现重定向到&#10; USART1的发送和接收,&#10; 把fgetc和fputc函数的功能重定向到&#10; USART1的发送和接收&#10; int fgetc(FILE *f);&#10; int fputc(int c, FILE *f);&#10; 2)禁用半主机模式&#10; 半主机模式是由ARM核心提供的一种机制&#10; 主要是因为ARM核心在研发的时候,ARM公司并不确定将来会和&#10; 哪家半导体厂商合作,也不确定将来半导体厂商会在芯片上连接&#10; 什么样的输入设备和输出设备&#10; 所以,ARM公司在研发核心的时候会启用一种半主机模式&#10; ARM平台会通过仿真器/调制器可以把ARM核心中的输入输出&#10; 重定向到X86平台&#10; 现在我们需要把输入输出重定向到USART1的发送和接收上&#10; 所以需要禁用半主机模式&#10;&lt;/pre&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;div id="outline-container-headline-4" class="outline-3"&gt;&#10;&lt;h3 id="headline-4"&gt;&#10;三.引出后续内容&#10;&lt;/h3&gt;&#10;&lt;div id="outline-text-headline-4" class="outline-text-3"&gt;&#10;&lt;pre class="example"&gt;&#10; 1.完成了发送字符和发送字符串的函数&#10; 将来操作无线模块可以发送AT指令&#10; AT指令是由&amp;#39;A&amp;#39;和&amp;#39;T&amp;#39;组成的字符串&#10; SSID是路由器的名称,password是路由器的密码&#10; AT+CWJAP=&amp;#34;SSID&amp;#34;,&amp;#34;password&amp;#34;&#10; &amp;#34;AT+CWJAP=&amp;#34;Easthome&amp;#34;,&amp;#34;123456&amp;#34;\r\n&amp;#34;&#10; usart_2_send_data(&amp;#34;AT+CWJAP=&amp;#34;Easthome&amp;#34;,&amp;#34;123456&amp;#34;\r\n&amp;#34;);&#10;&#10; usart_2_send_data(&amp;#34;AT+CWJAP=&amp;#34;);&#10; usart_2_send_byte(&amp;#39;&amp;#34;&amp;#39;);&#10; usart_2_send_data(&amp;#34;Easthome&amp;#34;);&#10; usart_2_send_byte(&amp;#39;&amp;#34;&amp;#39;);&#10; usart_2_send_byte(&amp;#39;,&amp;#39;);&#10; usart_2_send_byte(&amp;#39;&amp;#34;&amp;#39;);&#10; usart_2_send_data(&amp;#34;123456&amp;#34;);&#10; usart_2_send_byte(&amp;#39;&amp;#34;&amp;#39;);&#10; usart_2_send_data(&amp;#34;\r\n&amp;#34;);&#10;===========================================&#10;作业&#10; 1.复习&#10; 2.模拟工业物联网控制台指令收发器&#10; 在串口调试助手中发送&amp;#34;L0_ON&amp;#34;,开发板接收到之后点亮LED0&#10; 在串口调试助手中发送&amp;#34;L1_ON&amp;#34;,开发板接收到之后点亮LED1&#10; 在串口调试助手中发送&amp;#34;L2_ON&amp;#34;,开发板接收到之后点亮LED2&#10; 在串口调试助手中发送&amp;#34;BE_ON&amp;#34;,开发板接收到之后打开蜂鸣器&#10; 在串口调试助手中发送&amp;#34;L0_OFF&amp;#34;,开发板接收到之后关闭LED0&#10; 在串口调试助手中发送&amp;#34;L1_OFF&amp;#34;,开发板接收到之后关闭LED1&#10; 在串口调试助手中发送&amp;#34;L2_OFF&amp;#34;,开发板接收到之后关闭LED2&#10; 在串口调试助手中发送&amp;#34;BE_OFF&amp;#34;,开发板接收到之后关闭蜂鸣器&#10; 3.模拟ESP8266内部的AT指令操作&#10; 接收一个字符串-&amp;gt;驱动WiFi(内部支持AT指令)&#10; 在串口调试助手中发送&amp;#34;+IPD,10:0123456789&amp;#34;&#10; +IPD,XX:YYYYYYYYYY&#10; X部分是接收到的数据的字节数&#10; Y部分是真正的数据&#10; 4.根据开发板原理图找到USART3的管脚,和组内成员测试&#10;===========================================&#10;&lt;/pre&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;</description></item><item><title>stm32_note_12day</title><link>https://ynhugo.github.io/p/stm32_12day/</link><pubDate>Thu, 16 Feb 2023 08:03:05 +0800</pubDate><guid>https://ynhugo.github.io/p/stm32_12day/</guid><description>&#10;&lt;div id="outline-container-headline-1" class="outline-2"&gt;&#10;&lt;h2 id="headline-1"&gt;&#10;stm32_note_12day&#10;&lt;/h2&gt;&#10;&lt;div id="outline-text-headline-1" class="outline-text-2"&gt;&#10;&lt;p&gt;&#10;===========================&lt;br&gt;&#10;2022-8-30&lt;br&gt;&#10;===========================&lt;/p&gt;&#10;&lt;div id="outline-container-headline-2" class="outline-3"&gt;&#10;&lt;h3 id="headline-2"&gt;&#10;一.温故知新&#10;&lt;/h3&gt;&#10;&lt;div id="outline-text-headline-2" class="outline-text-3"&gt;&#10;&lt;pre class="example"&gt;&#10; USART1的驱动&#10; 初始化&#10; 发送数据&#10; 发送一个字节数据&#10; 发送多个字节数据&#10; 通过遍历有效数据&#10; 把数据按照一个字节一个字节的方式进行发送&#10; printf进行重定向(重定向到USART1的发送)&#10; 使用微库&#10; 禁用半主机模式&#10; 以上两种方法都需要重新实现fgetc以及fputc函数&#10; 接收数据&#10; 轮询接收数据&#10; 中断接收数据&#10; 使用有限状态机的方法解析字符串数据&#10;&#10; &amp;#34;+IPD,XX:YYYYYYY&amp;#34;&#10; XX指的是接收到数据的字节数&#10; YY指的是真实数据&#10; &amp;#34;+IPD,12:abcdefghijkl&amp;#34;&#10;&#10;#define A_FLAG 0&#10;#define I_FLAG 1&#10;#define P_FLAG 2&#10;#define D_FLAG 3&#10;#define H_FLAG 4&#10;#define M_FLAG 5&#10;#define S_FLAG 6&#10;int flag = A_FLAG;&#10;char bytes[4] = {0};//存储数据的字节数(字符串版本)&#10;int i = 0;//循环变量&#10;int length = 0;//存储数据的字节数(整数版本)&#10;char data[128] = {0};//存储数据&#10;&#10;void recv_handler(u8 c)&#10;{&#10; switch(flag)&#10; {&#10; case A_FLAG : &#9;if(c == &amp;#39;+&amp;#39;)&#10; flag = I_FLAG;&#10; break;&#10; case I_FLAG :&#9;if(c == &amp;#39;I&amp;#39;)&#10; flag = P_FLAG;&#10; else&#10; flag = A_FLAG;&#10; break;&#10; case P_FLAG :&#9;if(c == &amp;#39;P&amp;#39;)&#10; flag = D_FLAG;&#10; else&#10; flag = A_FLAG;&#10; break;&#10; case D_FLAG:&#9;if(c == &amp;#39;D&amp;#39;)&#10; flag = H_FLAG;&#10; else&#10; flag = A_FLAG;&#10; break;&#10; case H_FLAG :&#9;if(c == &amp;#39;,&amp;#39;)&#10; flag = M_FLAG;&#10; else&#10; flag = A_FLAG;&#10; break;&#10; case M_FLAG :&#9;if(c == &amp;#39;:&amp;#39;)&#10; flag = S_FLAG;&#10; else&#10; bytes[i++] = c;&#10; break;&#10; case S_FLAG :&#9;length = atoi(bytes);&#10; while(length--)&#10; data[] = c;&#10; }&#10;}&#10;&lt;/pre&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;div id="outline-container-headline-3" class="outline-3"&gt;&#10;&lt;h3 id="headline-3"&gt;&#10;二.串口之I²C&#10;&lt;/h3&gt;&#10;&lt;div id="outline-text-headline-3" class="outline-text-3"&gt;&#10;&lt;pre class="example"&gt;&#10; 1.I²C的简介&#10; IIC也称为I2C或者I²C(专业的写法就是I²C),属于串行总线中的一种,&#10; 也是数据按顺序一位一位进行发送&#10; I²C必须要有两条线(一条是数据线&amp;lt;SDA&amp;gt;、一条是时钟线&amp;lt;SCL&amp;gt;),是半双工的工作模式&#9;&#9;&#10; 2.I²C与USART的对比&#10; USART : 通用的同步异步收发器&#10; 两条数据线(一条是发送、一条是接收)&#10; 属于全双工的工作模式&#10; 由于没有时钟线,所以设备通过USART通信之前需要规定好双方的波特率&#10;&#10; I²C : 集成电路总线&#10; 两条线(一条是数据线&amp;lt;SDA&amp;gt;、一条是时钟线&amp;lt;SCL&amp;gt;)&#9;&#10; 属于半双工的工作模式&#10; 由于有时钟线,可以自行调节读写速率,所以不需要规定双方的比特率&#10;&#10; 3.I²C总线协议的目的&#10; 需要驱动开发板上的OLED屏幕、EEPROM、SHT30&#10; 1)需要带着大家把EEPROM的外设驱动起来&#10; 2)需要带着大家把OLED的驱动移植成功&#10; 3)自己想办法驱动SHT30&#10; &#10; 4.通过官方手册了解I²C的协议&#10; 打开&amp;lt;STM32RBT6\DataSheet\其他&amp;gt;目录下&amp;lt;IIC.pdf&amp;gt;P7 - P14中的图&#10; 1)I²C总线需要两条线(SDA/SCL),在I²C总线上可以连接很多的设备,&#10; 设备与设备之间是串联的关系&#10; 2)凡是连接到I²C总线上的设备都需要有一个设备地址&#10; 注意:一般来说设备地址是7bit的&#10; --------------------------------------------------------------------------&#10; 面试题&#10; 1.I²C总线理论上可以连接多少个设备?&#9;理论上128个设备(设备地址)&#10; --------------------------------------------------------------------------&#10; 3)I²C总线进行通信时会分为主设备和从设备&#10; 主设备是主动的,从设备是被动的&#10; I²C总线本身非常公平,任何连接到I²C总线上的设备都既可以做主也可以做从&#10; (注意:有些设备由于本身的原因只能做从设备做不了主设备)&#10; 如果两个设备同时都想要通信,会触发抢主的机制&#10; 抢到主的设备优先通信,没抢到主的设备等待通信完成之后,再重新抢主&#10; (注意:抢主的机制,就是谁先产生开始信号,谁就优先通信)&#10; 4)I²C总线在空闲状态时,SDA和SCL要呈现高电平的状态(需要外接上拉电阻)&#10; 5)开始信号和结束信号&#10; 开始信号 : 在SCL为高电平的时候,SDA由高电平拉到低电平&#10; 结束信号 : 在SCL为高电平的时候,SDA由低电平拉到高电平&#10; 6)传输数据&#10; 1&amp;gt;在SCL为低电平的时候,把数据放到SDA数据线上&#10; 2&amp;gt;拉高SCL,当SCL为高电平的时候,SDA的电平要保持不变&#10; 3&amp;gt;拉低SCL,在SCL为低电平的时候,切换下一位数据放到SDA数据线上&#10; 7)I²C总线是高位先出&#10; 8)I²C总线在传输一个字节数据时需要9个周期&#10; 9个周期 = 8个数据周期 + 1个ACK(应答)周期&#10; 9)I²C总线属于停等式的流控,每发送完一个字节数据都需要有一个ACK应答&#10; A)产生应答 : 在SCL的第9个周期,SCL拉低,从设备拉低SDA,拉高SCL.延时一段时间&#10; 把SCL拉低,从设备拉高SDA&#10; B)读取应答 : 在SCL的第9个周期,在SCL为高电平时读取SDA的电平&#10; 如果读取到了高电平代表没有ACK,如果读取到了低电平代表有ACK&#10; C)I²C总线产生开始信号之后,&#10; 发送的第一个字节内容是 = 7bit设备地址 + 1bit读写标志位&#10; D)主设备发送数据给从设备&#10; 1&amp;gt;主设备产生开始信号&#10; 2&amp;gt;主设备发送从设备的设备地址 + 写的标志(0)&#10; 3&amp;gt;主设备等待ACK&#10; 4&amp;gt;主设备发送一个字节数据&#10; 5&amp;gt;主设备等待ACK&#10; ...&#10; n&amp;gt;主设备发送最后一个字节数据&#10; n+1&amp;gt;主设备可以等待ACK或者不等待ACK&#10; n+2&amp;gt;主设备产生结束信号&#10; E)主设备读取从设备发送的数据&#10; 1&amp;gt;主设备产生开始信号&#10; 2&amp;gt;主设备发送从设备的设备地址 + 读的标志(1)&#10; 3&amp;gt;主设备等待ACK&#10; 4&amp;gt;主设备等待接收一个字节数据&#10; 5&amp;gt;主设备产生ACK&#10; ...&#10; n&amp;gt;主设备等待接收最后一个字节数据&#10; n+1&amp;gt;主设备不需要产生ACK&#10; n+2&amp;gt;主设备产生结束信号&#10;&lt;/pre&gt;&#10;&lt;p&gt;&#10;IIC&lt;br&gt;&#10;&lt;img src="resources/01.IIC.png" alt="resources/01.IIC.png" title="resources/01.IIC.png" /&gt;&lt;/p&gt;&#10;&lt;p&gt;&#10;02.IIC硬件连接&lt;br&gt;&#10;&lt;img src="resources/02.IIC硬件连接.png" alt="resources/02.IIC硬件连接.png" title="resources/02.IIC硬件连接.png" /&gt;&lt;/p&gt;&#10;&lt;p&gt;&#10;03.IIC协议要求&lt;br&gt;&#10;&lt;img src="resources/03.IIC协议要求.png" alt="resources/03.IIC协议要求.png" title="resources/03.IIC协议要求.png" /&gt;&lt;/p&gt;&#10;&lt;p&gt;&#10;04.IIC协议(开始信号结束信号)&lt;br&gt;&#10;&lt;img src="resources/04.IIC协议(开始信号结束信号).png" alt="resources/04.IIC协议(开始信号结束信号).png" title="resources/04.IIC协议(开始信号结束信号).png" /&gt;&lt;/p&gt;&#10;&lt;p&gt;&#10;05.IIC协议_详细&lt;br&gt;&#10;&lt;img src="resources/05.IIC协议_详细.png" alt="resources/05.IIC协议_详细.png" title="resources/05.IIC协议_详细.png" /&gt;&lt;/p&gt;&#10;&lt;p&gt;&#10;06.IIC协议_ACK产生&lt;br&gt;&#10;&lt;img src="resources/06.IIC协议_ACK产生.png" alt="resources/06.IIC协议_ACK产生.png" title="resources/06.IIC协议_ACK产生.png" /&gt;&lt;/p&gt;&#10;&lt;p&gt;&#10;07.IIC_主的编程&lt;br&gt;&#10;&lt;img src="resources/07.IIC_主的编程.png" alt="resources/07.IIC_主的编程.png" title="resources/07.IIC_主的编程.png" /&gt;&lt;/p&gt;&#10;&lt;p&gt;&#10;开发板上的IIC设备&lt;br&gt;&#10;&lt;img src="resources/开发板上的IIC设备.png" alt="resources/开发板上的IIC设备.png" title="resources/开发板上的IIC设备.png" /&gt;&lt;/p&gt;&#10;&lt;p&gt;&#10;学生发的笔试题&lt;br&gt;&#10;&lt;img src="resources/学生发的笔试题.jpg" alt="resources/学生发的笔试题.jpg" title="resources/学生发的笔试题.jpg" /&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;</description></item><item><title>stm32_note_13day</title><link>https://ynhugo.github.io/p/stm32_13day/</link><pubDate>Thu, 16 Feb 2023 08:03:05 +0800</pubDate><guid>https://ynhugo.github.io/p/stm32_13day/</guid><description>&#10;&lt;div id="outline-container-headline-1" class="outline-2"&gt;&#10;&lt;h2 id="headline-1"&gt;&#10;stm32_note_13day&#10;&lt;/h2&gt;&#10;&lt;div id="outline-text-headline-1" class="outline-text-2"&gt;&#10;&lt;p&gt;&#10;=============================&lt;br&gt;&#10;2022-8-31&lt;br&gt;&#10;=============================&lt;/p&gt;&#10;&lt;div id="outline-container-headline-2" class="outline-3"&gt;&#10;&lt;h3 id="headline-2"&gt;&#10;一.温故知新&#10;&lt;/h3&gt;&#10;&lt;div id="outline-text-headline-2" class="outline-text-3"&gt;&#10;&lt;pre class="example"&gt;&#10; 串口之I²C&#10; 1.I²C总线中包含两条线(SDA数据线 和 SCL时钟线)&#10; 2.I²C总线上可以连接很多的I²C接口的设备,设备与设备之间都串联起来的&#10; 3.I²C总线规定了,凡是连接到I²C总线上的设备都需要有一个设备地址&#10; 一般来说设备地址是7bit&#10; 4.I²C总线上的设备需要区分主设备和从设备&#10; 5.如果I²C总线上的两个设备都想要和另外的一个设备通信,会触发抢主机制&#10; 抢主机制 : 谁先产生开始信号,谁就优先通信&#10; 6.I²C总线规定了,在空闲状态下SDA和SCL要保持高电平的状态&#10; 所以I²C总线需要外接上拉电阻&#10; 7.开始信号和结束信号&#10; 开始信号 : 在SCL为高电平时,SDA由高电平拉到低电平&#10; 结束信号 : 在SCL为高电平时,SDA由低电平拉到高电平&#10; 8.传输数据&#10; 1)在SCL为低电平的时候,把数据放到SDA数据线上&#10; 2)拉高SCL,延时一段时间,(当SCL为高电平时,SDA保持不变)&#10; 3)拉低SCL,切换下一位数据放到SDA数据线上&#10; 9.传输一个字节数据需要9个周期 = 8个数据周期 + 1个ACK周期&#10; A.I²C总线属于停等式的流控,传输完一个字节数据需要有应答&#10; B.产生ACK和读取ACK&#10; 1)产生ACK : 在第9个周期,拉低SCL,把SDA也拉低,拉高SCL&#10; 2)读取ACK : 在第9个周期,当SCL为高电平时,读取SDA的电平&#10; C.I²C总线是高位先出&#10; D.主设备给从设备发送数据&#10; 1)主设备产生开始信号&#10; 2)主设备发送从设备的设备地址 + 写的标志(0)&#10; 3)主设备等待ACK&#10; 4)主设备发送一个字节数据&#10; 5)主设备等待ACK&#10; ...&#10; n)主设备发送最后一个字节数据&#10; n+1)主设备可以等待或者不等待ACK&#10; n+2)主设备产生结束信号&#10; E.主设备读取从设备的数据&#10; 1)主设备产生开始信号&#10; 2)主设备发送从设备的设备地址 + 读的标志(1)&#10; 3)主设备等待ACK&#10; 4)主设备等待读取一个字节数据&#10; 5)主设备产生ACK&#10; ...&#10; n)主设备读取最后一个字节数据&#10; n+1)主设备不产生ACK&#10; n+2)主设备产生结束信号&#10;&lt;/pre&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;div id="outline-container-headline-3" class="outline-3"&gt;&#10;&lt;h3 id="headline-3"&gt;&#10;二.I²C接口设备之E²PROM&#10;&lt;/h3&gt;&#10;&lt;div id="outline-text-headline-3" class="outline-text-3"&gt;&#10;&lt;pre class="example"&gt;&#10; 1.简单了解E²PROM&#10; E²PROM : 也叫做EEPROM,电可擦除可编程的只读存储器&#10; 作用 : 是一种存储类的设备&#10; 特点 : 存储到E²PROM中的数据,设备掉电之后,数据不会丢失&#10; 注意 : E²PROM并不是硬盘&#10; 应用 : 使用E²PROM存储特殊的数据&#10; (门禁打卡设备、测量设备、仪器仪表、用来存储BIOS或者BootLoader)&#10; &#10; 2.ROM的发展历史&#10; ROM 只读存储器 特点是内部存储的数据只能读取,不能写入或者修改&#10; PROM 可编程的只读存储器 特点是内部存储的数据可以通过编程方法修改一次&#10; EPROM 可擦除可编程的只读存储器 特点是内部存储的数据可以修改多次&#10; 修改方法有限制&#10; 需要通过紫外线照射存储介质&#10; EEPROM 电可擦除可编程的只读存储器 特点是内部存储的数据可以修改多次&#10; 通过电信号即可清除数据&#10; 3.通过手册了解E²PROM&#10; 打开&amp;lt;STM32RBT6\DataSheet\其他&amp;gt;目录下&#10; &amp;lt;AT24C02_ATMEL Corporation.pdf&amp;gt;&#10; 1)我们的开发板上使用的E²PROM是阿特梅尔公司的模块&#10; 2)使用的是8管脚的封装形式&#10; (A0 A1 A2&amp;lt;设备地址&amp;gt; GND&amp;lt;接地&amp;gt; SDA&amp;lt;数据线&amp;gt; SCL&amp;lt;时钟线&amp;gt;)&#10; (WP(写保护) VCC&amp;lt;接电源&amp;gt;)&#10; 3)使用的是I²C接口的E²PROM&#10; 4)规格&#10; 型号&#9;规格&#9;存储大小&#9;&#9;Page&#10; AT24C01&#9;1K&#9;128byte&#9;&#9;16个Page&#10; AT24C02&#9;2K&#9;256byte&#9;&#9;32个Page&#10; AT24C04&#9;4K&#9;512byte&#9;&#9;32个Page&#10; AT24C08&#9;8K&#9;1024byte&#9;&#9;64个Page&#10; AT24C16&#9;16K&#9;2048byte&#9;&#9;128个Page&#10;&lt;/pre&gt;&#10;&lt;p&gt;&#10;eeprom&lt;br&gt;&#10;&lt;img src="resources/eeprom.png" alt="resources/eeprom.png" title="resources/eeprom.png" /&gt;&lt;/p&gt;&#10;&lt;pre class="example"&gt;&#10; 5)任何规格的E²PROM的设备地址的高四位都是固定的了1010&#10; 1K/2K规格可以通过A2 A1 A0管脚选择设备地址&#10; 4K规格可以通过A2 A1管脚选择设备地址&#10; 8K规格可以通过A2管脚选择设备地址&#10; 16K规格没有管脚可以选择设备地址&#10; 6)通过开发板原理图的解析可以了解&#10; 我们开发板上的E²PROM的设备地址是&#10; 10100000(写操作的设备地址)0xA0&#10; 10100001(读操作的设备地址)0xA1&#10; 7)写操作&#10; 1&amp;gt;按字节来写&#10; a&amp;gt;产生开始信号&#10; b&amp;gt;发送设备地址 + 写的标志(10100000&amp;lt;0xA0&amp;gt;)&#10; c&amp;gt;等待ACK&#10; d&amp;gt;发送内部存储空间的地址(0x00 - 0xFF)&#10; e&amp;gt;等待ACK&#10; f&amp;gt;发送一个字节数据&#10; g&amp;gt;等待ACK&#10; h&amp;gt;产生结束信号&#10; 2&amp;gt;按页来写(注意:有页内回滚)&#10; a&amp;gt;产生开始信号&#10; b&amp;gt;发送设备地址 + 写的标志(10100000&amp;lt;0xA0&amp;gt;)&#10; c&amp;gt;等待ACK&#10; d&amp;gt;发送内部存储空间的地址(0x00 - 0xFF)&#10; e&amp;gt;等待ACK&#10; f&amp;gt;发送一个字节数据&#10; g&amp;gt;等待ACK&#10; ...&#10; n&amp;gt;发送最后一个字节数据&#10; n+1&amp;gt;等待ACK&#10; n+2&amp;gt;产生结束信号&#10;&lt;/pre&gt;&#10;&lt;p&gt;&#10;页内回滚&lt;br&gt;&#10;&lt;img src="resources/页内回滚.png" alt="resources/页内回滚.png" title="resources/页内回滚.png" /&gt;&lt;/p&gt;&#10;&lt;pre class="example"&gt;&#10; 8)读操作&#10; 1&amp;gt;当前地址读&#10; a&amp;gt;产生开始信号&#10; b&amp;gt;发送设备地址 + 读的标志(10100001&amp;lt;0xA1&amp;gt;)&#10; c&amp;gt;等待ACK&#10; d&amp;gt;读取一个字节数据&#10; e&amp;gt;不产生ACK&#10; f&amp;gt;产生结束信号&#10; 2&amp;gt;随机地址读&#10; a&amp;gt;产生开始信号&#10; b&amp;gt;发送设备地址 + 写的标志(10100000&amp;lt;0xA0&amp;gt;)&#10; c&amp;gt;等待ACK&#10; d&amp;gt;发送内部存储空间的地址&#10; e&amp;gt;等待ACK&#10; f&amp;gt;产生开始信号&#10; g&amp;gt;发送设备地址 + 读的标志(10100001&amp;lt;0xA1&amp;gt;)&#10; h&amp;gt;等待ACK&#10; i&amp;gt;读取一个字节数据&#10; j&amp;gt;不产生ACK&#10; k&amp;gt;产生结束信号&#10; 3&amp;gt;顺序读(整个存储空间的回滚)&#10; 可以直接拼接到当前地址读或者随机地址读的后面&#10;&lt;/pre&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;div id="outline-container-headline-4" class="outline-3"&gt;&#10;&lt;h3 id="headline-4"&gt;&#10;三.使用GPIO模拟I²C的协议的程序-&amp;gt;驱动E²PROM&#10;&lt;/h3&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;</description></item><item><title>stm32_note_14day</title><link>https://ynhugo.github.io/p/stm32_14day/</link><pubDate>Thu, 16 Feb 2023 08:03:05 +0800</pubDate><guid>https://ynhugo.github.io/p/stm32_14day/</guid><description>&#10;&lt;div id="outline-container-headline-1" class="outline-2"&gt;&#10;&lt;h2 id="headline-1"&gt;&#10;stm32_note_14day&#10;&lt;/h2&gt;&#10;&lt;div id="outline-text-headline-1" class="outline-text-2"&gt;&#10;&lt;p&gt;&#10;=============================&lt;br&gt;&#10;2022-9-1&lt;br&gt;&#10;=============================&lt;/p&gt;&#10;&lt;div id="outline-container-headline-2" class="outline-3"&gt;&#10;&lt;h3 id="headline-2"&gt;&#10;一.温故知新&#10;&lt;/h3&gt;&#10;&lt;div id="outline-text-headline-2" class="outline-text-3"&gt;&#10;&lt;pre class="example"&gt;&#10; 串行的接口&#10; 分类 : USART/UART、I²C、SPI、I²S、CAN、USB、SDI0、Eth&#10; USART/UART驱动起来了-&amp;gt;WiFi模块是USART的接口&#10; I²C总线-&amp;gt;使用GPIO模拟I²C的协议-&amp;gt;E²PROM、OLD、SHT30&#10; E²PROM&#10; 电可擦除可编程的只读存储器&#10; 通过官方手册了解E²PROM&#10; 1)E²PROM使用的是两线串行的接口(I²C的接口)&#10; 2)比较常见的是8管脚的封装形式&#10; (VCC&amp;lt;接电源&amp;gt; GND&amp;lt;接地&amp;gt; A2 A1 A0&amp;lt;设备地址的输入&amp;gt;)&#10; (SDA&amp;lt;数据线&amp;gt; SCL&amp;lt;时钟线&amp;gt; WP&amp;lt;写保护&amp;gt;)&#10; 3)规格&#10; 型号&#9;规格&#9;存储大小&#9;页&#10; AT24C01&#9;1K&#9;128byte&#9;16page&#10; AT24C02&#9;2K&#9;256byte&#9;32page&#10; AT24C04&#9;4K&#9;512byte&#9;32page&#10; AT24C08&#9;8K&#9;1024byte&#9;64page&#10; AT24C16&#9;16K&#9;2048byte&#9;128page&#10; 4)设备地址&#10; 所有规格的E²PROM的设备地址高四位是固定的1010&#10; 后三位设备地址通过A2 A1 A0进行选择&#10; 最低位是读写标志位&#10; 5)读写操作&#10; 两种写操作&#10; 按字节写和按页写&#10; &#10; 三种读操作&#10; 当前地址读和随机地址读和顺序读&#10;&lt;/pre&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;div id="outline-container-headline-3" class="outline-3"&gt;&#10;&lt;h3 id="headline-3"&gt;&#10;二.I²C设备之OLED&#10;&lt;/h3&gt;&#10;&lt;div id="outline-text-headline-3" class="outline-text-3"&gt;&#10;&lt;pre class="example"&gt;&#10; 1.OLED的简介&#10; OLED叫做有机发光二极管,在嵌入式领域中属于显示类型的设备&#10; 和LCD(液晶显示屏)显示的方法不同,&#10; LCD在显示时需要背光灯,OLED在显示时不需要背光灯&#10; 显示屏是显示屏,触摸屏是触摸屏,是两个设备&#10; 如果将来操作的设备既有显示屏也有触摸屏,就要写两份驱动程序&#10; 一个是显示屏驱动,一个是触摸屏驱动&#10; 2.屏幕的显示&#10; 屏幕上是由N多个像素点组成的,所以大家平常所说的屏幕分辨率&#10; 指的是像素点的个数&#10; 1024×768&#10; 1920×1080&#10; 之所以屏幕可以显示出各种颜色是因为像素点会在显存中占用存储空间&#10; 像素点会在显存中占用多大的存储空间?&#10; 和像素点的位色有关(位色可以分为16位色和32位色 )&#10; 比如说显示设备是16位色,说明一个像素点在显存中占用16位(2byte)&#10; 比如说显示设备是32位色,说明一个像素点在显存中占用32位(4byte)&#10; 配色方案&#10; 常用的显示设备的配色方案(RGB YUV)&#10; 16位色RGB配色方案&#9;XXXXX YYYYYY ZZZZZ&#10; R&#9;G&#9;B&#10; 0xF800&#9;全红&#10; 0x07E0&#9;全绿&#10; 0x001F&#9;全蓝&#10; 0xFFFF&#9;全白&#10; 0x0000&#9;全黑&#10; 32位色RGB配色方案&#9;RRRRRRRR XXXXXXXX YYYYYYYY ZZZZZZZZ&#10; 保留的&#9; R&#9; G&#9; B&#10; 0xFF0000&#9;全红&#10; 0xFF00&#9;全绿&#10; 0xFF&#9;全蓝&#10; 3.开发板上的显示屏&#10; STM32F103-&amp;gt;OLED屏幕-&amp;gt;0.96寸-&amp;gt;128×64-&amp;gt;I²C接口&#10; STM32F407-&amp;gt;LCD屏幕-&amp;gt;2.8寸-&amp;gt;320×240-&amp;gt;FSMC(内存)接口&#10; 4.从官网找资料&#10; OLED屏幕-&amp;gt;亿阳电子&#10;&lt;/pre&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;div id="outline-container-headline-4" class="outline-3"&gt;&#10;&lt;h3 id="headline-4"&gt;&#10;LCD(液晶显示器320 * 240)&#10;&lt;/h3&gt;&#10;&lt;div id="outline-text-headline-4" class="outline-text-3"&gt;&#10;&lt;div id="outline-container-headline-5" class="outline-4"&gt;&#10;&lt;h4 id="headline-5"&gt;&#10;接口&#10;&lt;/h4&gt;&#10;&lt;div id="outline-text-headline-5" class="outline-text-4"&gt;&#10;&lt;pre class="example"&gt;&#10; 单片机:&#10; uart(串口屏)&#10; 液晶显示器接的是串口,能通过串口把数据发送给LCD,就能够显示&#10; 例:通过串口把坐标发送过去,再把显示的字符(字的编码)发送过去&#10; (一般来说这种屏都是自带字库的)&#9;&#9;&#10; spi(SPI总线)&#10; 液晶显示器接的是SPI总线&#10; sram(内存接口)&#10; LCD连接到了主芯片的内存接口上的,访问LCD就和访问内存一样,&#10; 通过指针的方式去访问&#10;&#10; SOC : RGB LVDS HDMI VGA MIPI&#10;&#10; 我们的stm32开发板的液晶显示用的是sram接口,相当于接到了内存接口上&#10; 所以我们先看一下内存的访问&#10;&lt;/pre&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;div id="outline-container-headline-6" class="outline-4"&gt;&#10;&lt;h4 id="headline-6"&gt;&#10;内存的访问(通过三总线来访问)&amp;lt;01m4的总线和SRAM的总线&amp;gt;&#10;&lt;/h4&gt;&#10;&lt;div id="outline-text-headline-6" class="outline-text-4"&gt;&#10;&lt;p&gt;m4的总线和SRAM的总线&lt;br&gt;&#10;&lt;img src="resources/01m4的总线和SRAM的总线.png" alt="resources/01m4的总线和SRAM的总线.png" title="resources/01m4的总线和SRAM的总线.png" /&gt;&lt;/p&gt;&#10;&lt;pre class="example"&gt;&#10; addr&#9;传输地址&#10; --------------&#10; --------------&#10; --------------&#10; --------------&#10; data&#9;传输数据&#10; --------------&#10; --------------&#10; ctrl&#9;控制读写时序/片选...&#10;&#10; 例:&#10; 假如执行*(int *)0x4 = 1;&#10; 三总线的电平信号应该是这样的&#10; addr&#10; 第0位地址线--------------0&#10; 第1位地址线--------------0&#10; 第2位地址线--------------1&#10; 第3位地址线--------------0&#10; data&#10; 第0位数据线--------------1&#10; 第1位数据线--------------0&#10;&#10; 假如执行*(int *)0xC = 3;&#10; 三总线的电平信号应该是这样的&#10; addr&#10; 第0位地址线--------------0&#10; 第1位地址线--------------0&#10; 第2位地址线--------------1&#10; 第3位地址线--------------1&#10; data&#10; 第0位数据线--------------1&#10; 第1位数据线--------------1&#10;&#10; 看&amp;lt;02LCD电路图&amp;gt;&#10;&lt;/pre&gt;&#10;&lt;p&gt;&#10;02LCD电路图&lt;br&gt;&#10;&lt;img src="resources/02LCD电路图.png" alt="resources/02LCD电路图.png" title="resources/02LCD电路图.png" /&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;div id="outline-container-headline-7" class="outline-4"&gt;&#10;&lt;h4 id="headline-7"&gt;&#10;简介&#10;&lt;/h4&gt;&#10;&lt;div id="outline-text-headline-7" class="outline-text-4"&gt;&#10;&lt;pre class="example"&gt;&#10; 因为FSMC_A12这个管脚只区分地址线的第12位所以(1)和(2) | (3)和(4)执行效果一样&#10; (1)(*(int *)0x1000) = 2;&#10; (2)(*(int *)0x1001) = 2;&#10; (3)(*(int *)0x0000) = 2;&#10; (4)(*(int *)0x0001) = 2;&#10;&#10; 地址线只区分第12位是因为把这一位当作命令来使用,下面我们来区分&#10; (1)和(3) | (2)和(4)的区别&#10;&#10; LCD的背部是有一个控制芯片(LCD自带)的,&#10; LCD模块上的引脚是连接控制芯片的,&#10; 控制芯片在控制LCD的显示,&#10; 我们开发板上使用的LCD控制芯片是9341&#10; &#10; 9341内部有很多寄存器、显存&#10; 当想要在LCD上画点首先需要指定坐标、横屏显示|竖屏显示...&#10; -------------------------------&#10; (100, 100)&#9;竖 显示点(红色)&#10; 9341&#9;寄存器0x1234&#9;存储X轴坐标&#9;&#10; *(int *)0x1234 = 100;&#10; -------------------------------&#10; 这些信息都需要在9341中的寄存器里设置&#10; 我们之前操作GPIO知道,每一个寄存器都有一个地址,为了和我们的地址总线的地址区分,我们管寄存器的地址叫做[命令cmd]&#10; 当我们将来往寄存器里写数据,我们的LCD是这样规定的&#10; 1.先把命令写过来&#10; 2.再把数据写过来&#10; ---------------------------------------------------------------&#10; 例 : 假如寄存器的地址[命令]是0x10,想要给这个寄存器写数据2&#10; 0x10 &amp;lt;------- 2&#10; 不管是0x10还是数据2,都是要通过内存接口发送给LCD,走的都是数据线,对于STM32来说&amp;lt;0x10&amp;gt;和&amp;lt;2&amp;gt;都是数据,&#10; 所以发送时必须要区分开,发送的是命令还是数据(用的就是地址线的第12位来区分)&#10; 所以需要知道地址线的第12位是高电平表示命令,还是低电平表示命令&#10; 需要查看&amp;lt;LCD的手册&amp;gt;&#10; &#10; 地址线的第12位为1的时候表示数据&#10; 地址线的第12位为0的时候表示命令&#10; 1.先把命令写过来&#10; (*(int *)0x0000) = 0x10;&#10; 2.再把数据写过来&#10; (*(int *)0x1000) = 2&#10; 执行完这两步操作数据2就写到了&amp;lt;0x10&amp;gt;的那个寄存器中了&#10; ---------------------------------------------------------------&#10;&#10; 对于显存来说也是这样的方式,显存本身就是一段存储空间,内部就会有地址&amp;lt;命令&amp;gt;&#10; 如果在LCD上画一个点&#10; 1.首先把显存的&amp;lt;命令&amp;gt;发过去&#10; 2.再把数据发过去(点的坐标、颜色)&#10;&#10; 接下来我们来看看片选&#10;&lt;/pre&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;div id="outline-container-headline-8" class="outline-4"&gt;&#10;&lt;h4 id="headline-8"&gt;&#10;片选&#10;&lt;/h4&gt;&#10;&lt;div id="outline-text-headline-8" class="outline-text-4"&gt;&#10;&lt;p&gt;片选简介&lt;br&gt;&#10;&lt;img src="resources/04片选简介.png" alt="resources/04片选简介.png" title="resources/04片选简介.png" /&gt;&lt;/p&gt;&#10;&lt;pre class="example"&gt;&#10; 内存控制器可以支持多个设备(SRAM LCD DM9000...)&#10; 我们查看&amp;lt;STM32手册&amp;gt;中的FSMC来看看我们的内存控制器,可以支持哪些设备&#10;&#10; &amp;lt;P1191&amp;gt;-------PSRAM(4个存储区域)代表有4个片选&#10; &amp;lt;P1192&amp;gt;-------NOR/PSRAM(我们的LCD接的是这块)&#10; ---&amp;gt;FSMC_NE[4:1]4个片选&#10; ---&amp;gt;FSMC_NBL[1:0]控制访问位宽的&#10; (有可能接8位内存或者接16位内存)&#10; &amp;lt;P1194&amp;gt;-------NOR/PSRAM&#10; 4 x 64MB可以接4片内存,每片64MB大小&#10; 内存的范围是0x6000 0000 - 0x6FFF FFFF&#10; 每一片内存的地址不会重复,所以&#10; 0x6000 0000&#9;第一片内存起始地址&#10; &#10; 0x6400 0000&#9;第二片内存起始地址&#10; &#10; 0x6800 0000&#9;第三片内存起始地址&#10; &#10; 0x6C00 0000&#9;第四片内存起始地址&#10; -------------------------------&#10; 31&#9;30&#9;29&#9;28&#9;27&#9;26&#9;25&#9;24&#10; 0&#9;1&#9;1&#9;0&#9;0&#9;0&#9;X&#9;X&#10; 0&#9;1&#9;1&#9;0&#9;0&#9;1&#9;X&#9;X&#10; 0&#9;1&#9;1&#9;0&#9;1&#9;0&#9;X&#9;X&#10; 0&#9;1&#9;1&#9;0&#9;1&#9;1&#9;X&#9;X&#10; -------------------------------&#10;&#10; &#10; 其实当我们使用第一片内存的空间地址时,自动会让片选1有效(内部译码器已经规定好了)&#10; 我们通过LCD硬件原理图中得到 &amp;lt;FSMC_NE4&amp;gt;说明我们的LCD使用的是片选4&#10; 所以我们将来访问LCD就需要访问 0x6C00 0000 - 0x6FFF FFFF这个地址范围&#10;&#10; 通过上面一系列的信息(地址线 + 片选)我们知道了&#10; 往这个地址写的是 0x6C000000 命令&#10; 往这个地址写的是 0x6C001000 数据&#10;&#10;&#10; &amp;lt;P1194&amp;gt;表185说的也是片选如果第26和27位&#10; 00&#9;片选1&#10; 01&#9;片选2&#10; 10&#9;片选3&#10; 11&#9;片选4&#10; &#10; &amp;lt;P1195&amp;gt;表186说的是访问内存的位宽区别&#10; 当我们选择8位位宽来访问内存,会把地址线的0~25作为地址&#10; 如果选择16位的方式来访问，HADDR[25:1]&amp;gt;&amp;gt;1才是真实地址&#10; ---------------------------------------------------&#10; 原理:&#10; 我们在访问内存时,内存中有很多字节&#10; 如果按照8位(1字节)来访问内存&#10; 只看后四位&#10; 0x1000--------- 0000&#10; 0x1001--------- 0001&#10; 0x1002--------- 0010&#10; 0x1003--------- 0011&#10; 0x1004--------- 0100&#10; 0x1005--------- 0101&#10; 0x1006--------- 0110&#10; 0x1007--------- 0111&#10; 上面都是每一个字节的地址,如果按照16位(2字节)来访问就应该是&#10; 只看后四位&#10; 0x1000--------- 0000&#10; 0x1002--------- 0010&#10; 0x1004--------- 0100&#10; 0x1006--------- 0110&#10; 0x1008--------- 1000&#10; 0x100A--------- 1010&#10; 以16位方式来访问,最低位肯定是0,所以16位访问方式&#10; 地址线的[25:1]需要 右移 1位&#10; ---------------------------------------------------&#10; 所以经过上面位宽的选择我们之前分析的&#10; 往这个地址写的是 0x6C000000 命令&#10; 往这个地址写的是 0x6C001000 数据&#10; 有问题&#10; 写命令的没有问题,但是写数据的有问题&#10; 当我们选择16位的方式访问LCD时&#10; 把0x6C001000放到地址线的时候会变成0x6C000800&#10; 硬件会帮我们把[25：1]右移1位,所以就不符合我们的LCD了&#10; 所以我们在选择地址的时候应该选择0x6C002000&#10; 当我们写数据时这个地址右移1位就会变成0x6C001000&#10; &#10; 命令&#9;0x6C000000&#10; 数据&#9;0x6C002000&#10; ------------------------------------------&#10; (100, 100)&#9;&#9;0x1234&#10; 1.*(int *)0x6C000000 = 0x1234;&#10; 2.*(int *)0x6C002000 = 100;&#10; &#10; 把100写到0x1234&#10;&#10; LCD_CMD= 0x1234;&#10; LCD_DATA = 100;&#10; ------------------------------------------&#10;&lt;/pre&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;div id="outline-container-headline-9" class="outline-4"&gt;&#10;&lt;h4 id="headline-9"&gt;&#10;LCD显示&#10;&lt;/h4&gt;&#10;&lt;div id="outline-text-headline-9" class="outline-text-4"&gt;&#10;&lt;pre class="example"&gt;&#10; LCD固件&#10; 在LCD上画的任何东西,都是一个点一个点画的(点阵)&#10;&#10; 颜色&#9;RGB(通过三原色表示)&#9;YUV(通过分量来表示Y亮度 UV色度)&#10; 我们用的是RGB方式&#10; RGB888&#10; 一个像素点占24位&#10; 11111111 11111111 11111111&#9;白色&#10; 最红&#9; 最绿&#9; 最蓝&#10; RGB565&#10; 一个像素点占16位&#10; 11111 111111 11111&#9;&#9;白色&#10; 红&#9;绿&#9;蓝&#10; 我们的LCD(9341)用的是RGB565,分辨率是320 * 240&#10; 显存需要320 * 240 * 2(byte)字节&#10;&lt;/pre&gt;&#10;&lt;p&gt;&#10;LCD调节亮度&lt;br&gt;&#10;&lt;img src="resources/03LCD调节亮度.png" alt="resources/03LCD调节亮度.png" title="resources/03LCD调节亮度.png" /&gt;&lt;br&gt;&#10;lcd扫描&lt;br&gt;&#10;&lt;img src="resources/05lcd扫描.png" alt="resources/05lcd扫描.png" title="resources/05lcd扫描.png" /&gt;&lt;br&gt;&#10;开发板俯视图&lt;br&gt;&#10;&lt;img src="resources/06开发板俯视图.PNG" alt="resources/06开发板俯视图.PNG" title="resources/06开发板俯视图.PNG" /&gt;&lt;br&gt;&#10;cfont文件中显示A&lt;br&gt;&#10;&lt;img src="resources/cfont文件中显示A.png" alt="resources/cfont文件中显示A.png" title="resources/cfont文件中显示A.png" /&gt;&lt;br&gt;&#10;FSMC的配置&lt;br&gt;&#10;&lt;img src="resources/FSMC的配置.png" alt="resources/FSMC的配置.png" title="resources/FSMC的配置.png" /&gt;&lt;br&gt;&#10;俯视图&lt;br&gt;&#10;&lt;img src="resources/俯视图.png" alt="resources/俯视图.png" title="resources/俯视图.png" /&gt;&lt;br&gt;&#10;取字模&lt;br&gt;&#10;&lt;img src="resources/取字模.png" alt="resources/取字模.png" title="resources/取字模.png" /&gt;&lt;/p&gt;&#10;&lt;pre class="example"&gt;&#10; 固件分析&#9;lcd.h&#10;&lt;/pre&gt;&#10;&lt;div class="src src-c"&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 2&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 3&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 4&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 5&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 6&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 7&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 8&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 9&#10;&lt;/span&gt;&lt;span class="lnt"&gt;10&#10;&lt;/span&gt;&lt;span class="lnt"&gt;11&#10;&lt;/span&gt;&lt;span class="lnt"&gt;12&#10;&lt;/span&gt;&lt;span class="lnt"&gt;13&#10;&lt;/span&gt;&lt;span class="lnt"&gt;14&#10;&lt;/span&gt;&lt;span class="lnt"&gt;15&#10;&lt;/span&gt;&lt;span class="lnt"&gt;16&#10;&lt;/span&gt;&lt;span class="lnt"&gt;17&#10;&lt;/span&gt;&lt;span class="lnt"&gt;18&#10;&lt;/span&gt;&lt;span class="lnt"&gt;19&#10;&lt;/span&gt;&lt;span class="lnt"&gt;20&#10;&lt;/span&gt;&lt;span class="lnt"&gt;21&#10;&lt;/span&gt;&lt;span class="lnt"&gt;22&#10;&lt;/span&gt;&lt;span class="lnt"&gt;23&#10;&lt;/span&gt;&lt;span class="lnt"&gt;24&#10;&lt;/span&gt;&lt;span class="lnt"&gt;25&#10;&lt;/span&gt;&lt;span class="lnt"&gt;26&#10;&lt;/span&gt;&lt;span class="lnt"&gt;27&#10;&lt;/span&gt;&lt;span class="lnt"&gt;28&#10;&lt;/span&gt;&lt;span class="lnt"&gt;29&#10;&lt;/span&gt;&lt;span class="lnt"&gt;30&#10;&lt;/span&gt;&lt;span class="lnt"&gt;31&#10;&lt;/span&gt;&lt;span class="lnt"&gt;32&#10;&lt;/span&gt;&lt;span class="lnt"&gt;33&#10;&lt;/span&gt;&lt;span class="lnt"&gt;34&#10;&lt;/span&gt;&lt;span class="lnt"&gt;35&#10;&lt;/span&gt;&lt;span class="lnt"&gt;36&#10;&lt;/span&gt;&lt;span class="lnt"&gt;37&#10;&lt;/span&gt;&lt;span class="lnt"&gt;38&#10;&lt;/span&gt;&lt;span class="lnt"&gt;39&#10;&lt;/span&gt;&lt;span class="lnt"&gt;40&#10;&lt;/span&gt;&lt;span class="lnt"&gt;41&#10;&lt;/span&gt;&lt;span class="lnt"&gt;42&#10;&lt;/span&gt;&lt;span class="lnt"&gt;43&#10;&lt;/span&gt;&lt;span class="lnt"&gt;44&#10;&lt;/span&gt;&lt;span class="lnt"&gt;45&#10;&lt;/span&gt;&lt;span class="lnt"&gt;46&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-c" data-lang="c"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="kt"&gt;unsigned&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="n"&gt;shang&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;128&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="mh"&gt;0x00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="mh"&gt;0x00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x01&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x80&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0xFF&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0xF0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0xFF&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0xE0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x80&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="mh"&gt;0x00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0xC0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x80&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0xE0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x80&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x71&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x01&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x1C&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="mh"&gt;0x00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x01&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x1F&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x80&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x01&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x11&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x1F&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0xFF&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x11&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x1F&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0xFF&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x11&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="mh"&gt;0x00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x03&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x21&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x02&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x21&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x22&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x3F&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x42&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x3D&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="mh"&gt;0x00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0xC2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x03&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x82&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x20&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x07&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x02&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x30&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x03&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x06&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x1C&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="mh"&gt;0x00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x06&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x3C&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x07&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0xFF&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0xF8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x07&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0xFF&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0xF0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x03&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x80&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="mh"&gt;0x00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x00&lt;/span&gt;&lt;span class="p"&gt;};&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="kt"&gt;unsigned&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="n"&gt;guan&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;128&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="mh"&gt;0x00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x01&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x02&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="mh"&gt;0x00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x44&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x04&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x42&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x18&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0xC3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x30&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x81&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0xE0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="mh"&gt;0x00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x83&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0xE0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x01&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0xFE&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x70&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x01&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0xF0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x3C&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x20&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0xC0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x40&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="mh"&gt;0x00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x40&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x80&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x03&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0xFF&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0xE1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x80&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x03&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0xFF&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x83&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="mh"&gt;0x02&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x0E&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x02&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x3C&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x02&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x7F&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0xF0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x04&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x7F&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x1F&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0xE0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="mh"&gt;0x04&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x1E&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x70&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x04&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x06&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x01&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0xE0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x18&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x07&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0xFF&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0xF0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x18&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="mh"&gt;0x03&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x18&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x18&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x18&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x38&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="mh"&gt;0x00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x70&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x03&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0xF0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mh"&gt;0x00&lt;/span&gt;&lt;span class="p"&gt;};&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;move&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="err"&gt;参数&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&lt;span class="err"&gt;圆心坐标&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&lt;span class="n"&gt;dir&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&lt;span class="k"&gt;switch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dir&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;240&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;&#9;&lt;span class="n"&gt;dir&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;&lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;320&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;&#9;&lt;span class="n"&gt;dir&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;&lt;span class="k"&gt;else&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;&#9;&lt;span class="n"&gt;dir&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;&lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&lt;span class="k"&gt;switch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dir&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&lt;span class="nf"&gt;lcd_draw_cir&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;</description></item><item><title>stm32_note_15day</title><link>https://ynhugo.github.io/p/stm32_15day/</link><pubDate>Thu, 16 Feb 2023 08:03:05 +0800</pubDate><guid>https://ynhugo.github.io/p/stm32_15day/</guid><description>&#10;&lt;div id="outline-container-headline-1" class="outline-2"&gt;&#10;&lt;h2 id="headline-1"&gt;&#10;stm32_note_15day&#10;&lt;/h2&gt;&#10;&lt;div id="outline-text-headline-1" class="outline-text-2"&gt;&#10;&lt;p&gt;&#10;=============================&lt;br&gt;&#10;2022-9-2&lt;br&gt;&#10;=============================&lt;/p&gt;&#10;&lt;pre class="example"&gt;&#10;一.I²C接口设备之SHT30&#10; 1.SHT30传感器的简介&#10; 在我们使用的STM32F103开发板上有两个用来采集温湿度的传感器&#10; DHT11和SHT30&#10; DHT11传感器属于入门级别的传感器(做实验时会经常使用的传感器)&#10; SHT30传感器属于工业级传感器(做产品时会经常使用的传感器)&#10; 2.从官网中查找资料&#10; 1)测量范围 湿度:0%-100%&#9;温度:-40℃ - 125℃&#10; 2)误差范围 湿度:±2%&#9;&#9;温度:±0.2℃&#10; 3)通过温度的误差发现&#10; SHT30传感器,既可以采集到整数数据,也可以采集到小数数据&#10; 4)SHT30传感器是I²C的接口&#10; 3.通过手册了解SHT30&#10; 打开&amp;lt;STM32RBT6\DataSheet\传感器&amp;gt;目录下&amp;lt;sht30_datasheet.pdf&amp;gt;&#10; 1)8管脚的封装形式&#10; 2)SHT30传感器本身是模拟型的传感器,&#10; 内部自带AD转换,可以自行转换&#10; 3)两种设备地址&#10; ---------------------------------------------&#10; 手册中的描述&#10; 如果ADDR管脚接VSS(接地)&#9;使用的是设备地址A&#9;0x44&#10; 如果ADDR管脚接VDD(接电)&#9;使用的是设备地址B&#9;0x45&#10; ---------------------------------------------&#10; 分析内容&#10; 设备地址A&#9;0x44&#9;转换成二进制&#9;01000100&#10; 设备地址B&#9;0x45&#9;转换成二进制&#9;01000101&#10; 因为I²C总线规定设备地址是7bit的,最低位是读写标志位&#10; 但是手册中说的设备地址A和设备地址B最低位被占用了&#10; 所以0x44和0x45并不是最终的设备地址&#10; 因为0x44和0x45最低位被占用了,&#10; 用来区分设备地址A和设备地址B的,但是最高位没有被占用&#10; 需要把设备地址A和设备地址B都左移一位&#10; 设备地址A&#9;01000100 &amp;lt;&amp;lt; 1 10001000&#9;0x88&#10; 设备地址B&#9;01000101 &amp;lt;&amp;lt; 1 10001010&#9;0x8A&#10; 所以最终的设备地址是&#10; 设备地址A&#9;0x88&#10; 设备地址B&#9;0x8A&#10; ---------------------------------------------&#10; 上述的内容将来在很多的嵌入式设备中都会碰到,要多留一个心眼!&#10; ---------------------------------------------&#10; 4)经过开发板原理图的分析&#10; ADDR管脚连接了GND,所以我们开发板上的SHT30的设备地址是&#10; 0x88&#10; 5)设置采样频率&#10; 需要发送采样的指令&#9;0x2737&#10; 1&amp;gt;产生开始信号&#10; 2&amp;gt;发送设备地址 + 写的标志(0x88)&#10; 3&amp;gt;等待ACK&#10; 4&amp;gt;发送采样指令的高字节(0x27)&#10; 5&amp;gt;等待ACK&#10; 6&amp;gt;发送采样指令的低字节(0x37)&#10; 7&amp;gt;等待ACK&#10; 8&amp;gt;产生结束信号&#10; 6)发送读取数据的指令&#10; 读取数据的指令&#9;0xE000&#10; 1&amp;gt;产生开始信号&#10; 2&amp;gt;发送设备地址 + 写的标志(0x88)&#10; 3&amp;gt;等待ACK&#10; 4&amp;gt;发送读取数据指令的高字节(0xE0)&#10; 5&amp;gt;等待ACK&#10; 6&amp;gt;发送读取数据指令的低字节(0x00)&#10; 7&amp;gt;等待ACK&#10; 7)读取数据&#10; 1&amp;gt;产生开始信号&#10; 2&amp;gt;发送设备地址 + 读的标志(0x89)&#10; 3&amp;gt;等待ACK&#10; 4&amp;gt;读取温度的高字节数据&#10; 5&amp;gt;产生ACK&#10; 6&amp;gt;读取温度的低字节数据&#10; 7&amp;gt;产生ACK&#10; 8&amp;gt;读取校验字节&#10; 9&amp;gt;产生ACK&#10; A&amp;gt;读取湿度的高字节数据&#10; B&amp;gt;产生ACK&#10; C&amp;gt;读取湿度的低字节数据&#10; D&amp;gt;产生ACK&#10; E&amp;gt;读取检验字节&#10; F&amp;gt;不产生ACK&#10; G&amp;gt;产生结束信号&#10; 8)读取出的数据不能直接使用,需要转换&#10; 需要把温度的高字节和低字节的数据拼成一个2byte的数据&#10; 需要把湿度的高字节和低字节的数据拼成一个2byte的数据&#10; 代入公式转换&#10; 湿度 = 100 * (double)(2byte湿度数据) / 65535;&#10; 温度 = -45 + 175 * (double)(2byte温度数据) / 65535;&#10; 9)最终结果的显示&#10; 可以通过USART1或者OLED显示出来&#10;==============================&#10;任务&#10;1.和同组的同学串一遍手册分析出的内容&#10;2.搞一个新的项目工程,写SHT30的驱动程序&#10;==============================&#10;&lt;/pre&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;</description></item><item><title>stm32_note_16day</title><link>https://ynhugo.github.io/p/stm32_16day/</link><pubDate>Thu, 16 Feb 2023 08:03:05 +0800</pubDate><guid>https://ynhugo.github.io/p/stm32_16day/</guid><description>&#10;&lt;div id="outline-container-headline-1" class="outline-2"&gt;&#10;&lt;h2 id="headline-1"&gt;&#10;stm32_note_16day&#10;&lt;/h2&gt;&#10;&lt;div id="outline-text-headline-1" class="outline-text-2"&gt;&#10;&lt;p&gt;&#10;==========================&lt;br&gt;&#10;2022-9-5&lt;br&gt;&#10;==========================&lt;/p&gt;&#10;&lt;div id="outline-container-headline-2" class="outline-3"&gt;&#10;&lt;h3 id="headline-2"&gt;&#10;一.温故知新&#10;&lt;/h3&gt;&#10;&lt;div id="outline-text-headline-2" class="outline-text-3"&gt;&#10;&lt;pre class="example"&gt;&#10; 串行的接口&#10; USART/UART&#10; USART:通用的同步异步收发器&#10; UART:通用的异步收发器&#10; STM32F103RBT6中有3个USART/UART&#10; 目标 : &#10; 1.把USART1的所有项目实验调通&#10; USART1的发送一个字节&#10; USART1的发送多个字节&#10; USART1接收(轮询和中断)一个字节数据&#10; USART1解析接收到的字符串数据&#10; 把标准输入和标准输出重定向到USART1中&#10; 1)使用Micro Lib 2)禁用半主机模式&#10; 2.举一反三&#10; 把USART1的项目实验移植到USART2/USART3&#10; I²C&#10; 1.分析I²C的协议&#10; 2. 驱动E²PROM OLED SHT30&#10; 3.带着大家把E²PROM驱动起来&#10; 4.大家把官方提供的OLED的案例移植到项目工程中&#10; 5.大家自己搞定SHT30&#10;================================&#10;任务&#10;1.把USART1的项目实验移植到USART3上&#10;2.工业物联网的控制终端的发送器(把相应的指令发送给设备,设备进行解析)&#10;3.所有同学以组为单位,两两之间串一遍I²C的协议&#10;4.系统中的界面&#10; 1)公司的LoGo&#10; 2)DHT11的数据(客厅的数据).&#10; 3)SHT30的数据(卧室的数据)&#10; 4)高精度可调电阻-&amp;gt;虚拟成任意类型的传感器-&amp;gt;可燃气的含量(厨房的数据)&#10; 5)额外的传感器&#10; 6)日历&#10; 7)时间&#10; -------------------------------------------&#10; 计秒表 + 看门狗监测系统 + 界面可以通过按键切换&#10;================================&#10;&lt;/pre&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;div id="outline-container-headline-3" class="outline-3"&gt;&#10;&lt;h3 id="headline-3"&gt;&#10;二.ADC&#10;&lt;/h3&gt;&#10;&lt;div id="outline-text-headline-3" class="outline-text-3"&gt;&#10;&lt;pre class="example"&gt;&#10; 1.ADC的实验&#10; 1)STM32F103RBT6开发板-&amp;gt;高精度可调电阻-&amp;gt;可以当做任意类似的传感器&#10; -&amp;gt;在扩展IO中可以连接其他的模拟型传感器&#10; 2)STM32F407ZGT6开发板-&amp;gt;PM2.5-&amp;gt;CO传感器&#10; -&amp;gt;在扩展IO中可以连接其他的模拟型传感器&#10; 3)在STM32F407开发板上查找扩展IO中有没有DAC功能的管脚,尝试驱动DAC&#10; &#10; 2.ADC的简介&#10; 在市面上有很多种类的传感器,可以分为数字型的传感器和模拟型的传感器&#10; 数字型的传感器:采集到的就是数字量,可以直接交给CPU来处理&#10; 模拟型的传感器:采集到的是模拟量,需要通过AD转换,&#10; 转换成了数字量,再交给CPU来处理&#10; ADC : 模数转换器(可以把模拟量转换成数字量)&#10; 很多的工程师会把ADC当作电压表进行使用&#10; &#10; 3.了解STM32F103RBT6芯片上的ADC&#10; 打开&amp;lt;STM32RBT6\DataSheet\STM32&amp;gt;目录下&#10; &amp;lt;ST_MCU最新选型手册.pdf&amp;gt;&#9;P22&#10; 通过最新选型手册的了解&#10; 1)STM32F103RBT6芯片内部已经集成了ADC&#10; 2)ADC的资源&#9;16 x 12bit&#10; 打开&amp;lt;STM32RBT6\DataSheet\STM32&amp;gt;目录下&#10; &amp;lt;STM32F103RB.pdf&amp;gt;&#9;P19&#10; 通过讲硬件的手册了解&#10; 1)STM32F103RBT6芯片中只有2个ADC的外设(ADC1和ADC2)&#10; 2)这两个ADC都连接到了APB2总线上&#10; 3)这两个ADC都可以使用这16个转换通道&#10; ※打开&amp;lt;STM32课程SDK\DataSheet\STM32&amp;gt;目录下&#10;&amp;lt;STM32F405OE_STM32F405OEY6TR_STM32F405OG_STM32F405OGY6TR_to_STM32F407ZGT7.pdf&amp;gt;&#9;&#9;&#9;P18&#10; 通过讲硬件的手册了解&#10; 1)STM32F407芯片中只有3个ADC的外设(ADC1 ADC2 ADC3)&#10; 2)这三个ADC都连接到了APB2总线上&#10; 3)24个通道中其中有8个通道是ADC1 ADC2 ADC3共用&#10; 4)24个通道中其中有8个通道是ADC1 ADC2共用&#10; 5)24个通道中其中有8个通道是ADC3使用&#10; 12bit指的是量化位&#10; 把模拟量转换成数字量所占用的位数就是量化位&#10; 将来转换之后最小值是 : 0000 0000 0000&#9;0&#10; 将来转换之后最大值是 : 1111 1111 1111&#9;4095&#10; ※在ADC中也有LSB的概念&#10; LSB-&amp;gt;指的是一个量化位代表的模拟量&#10; ----------------------------------------&#10; 例子&#10; 4bit的量化位可以转换0V - 3.3V&#10; 0000&#9;代表&#9;0V&#10; 1111&#9;代表&#9;3.3V&#10; LSB(一个量化位)0001,代表的电压值是多少?&#10; LSB = 0.22V&#10; ----------------------------------------&#10;&#10; 4.通过芯片的手册了解ADC&#10; 打开&amp;lt;STM32RBT6\DataSheet\STM32&amp;gt;目录下&#10; &amp;lt;STM32F10x中文参考手册.pdf&amp;gt;&#9;P113&#10; &#10; 5.开发板原理图中高精度可调电阻的连接&#10; ADC_VOL&#9;&#9;PC0/ADC_IN10&#10; PC0管脚将来配置为模拟输入功能&#10;&lt;/pre&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;</description></item><item><title>stm32_note_17day</title><link>https://ynhugo.github.io/p/stm32_17day/</link><pubDate>Thu, 16 Feb 2023 08:03:05 +0800</pubDate><guid>https://ynhugo.github.io/p/stm32_17day/</guid><description>&#10;&lt;div id="outline-container-headline-1" class="outline-2"&gt;&#10;&lt;h2 id="headline-1"&gt;&#10;stm32_note_17day&#10;&lt;/h2&gt;&#10;&lt;div id="outline-text-headline-1" class="outline-text-2"&gt;&#10;&lt;p&gt;&#10;&lt;a href="resources/毕业论文.pptx"&gt;点击下载 毕业论文.pptx&lt;/a&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;</description></item><item><title>stm32_note_18day</title><link>https://ynhugo.github.io/p/stm32_18day/</link><pubDate>Thu, 16 Feb 2023 08:03:05 +0800</pubDate><guid>https://ynhugo.github.io/p/stm32_18day/</guid><description>&#10;&lt;div id="outline-container-headline-1" class="outline-2"&gt;&#10;&lt;h2 id="headline-1"&gt;&#10;stm32_note_18day&#10;&lt;/h2&gt;&#10;&lt;div id="outline-text-headline-1" class="outline-text-2"&gt;&#10;&lt;p&gt;&#10;============================&lt;br&gt;&#10;2022-9-7&lt;br&gt;&#10;============================&lt;/p&gt;&#10;&lt;pre class="example"&gt;&#10;一.RTC&#10; 1.RTC的简介&#10; RTC叫做Real Time Clock,也叫做实时时钟&#10; 在市面上的芯片中,有些芯片内部集成了RTC的外设功能,有些芯片没有集成&#10; 我们使用的STM32F103RBT6芯片中集成了RTC的外设功能&#10; (STM32F407ZGT6芯片中集成了RTC的外设功能)&#10; &#10; RTC在STM32F103RBT6芯片中属于定时器的外设资源(属于其他定时器)&#10; RTC可以为程序员提供万年历的功能(可以提供年 月 日 星期 时 分 秒的数据)&#10; &#10; 既然RTC属于定时器的资源&#10; 无论何种定时器,都是由 时钟频率 和 计数值 决定定时长短的&#10;&#10; 2.查找RTC的时钟频率&#10; 1)通过时钟树的分析可以了解到&#10; 可以为RTC提供时钟频率的时钟源一共有三种&#10; (LSE LSI 和 HSE/128)&#10; 但是已知LSI是给独立看门狗(IWDG)提供时钟频率的&#10; HSE是给锁相环(PLL)提供基础时钟频率的&#10; 所以会选择LSE为RTC提供时钟频率的&#10; 2)通过芯片手册中有关RTC的介绍&#10; RTC选择了有LSE提供时钟频率,会把LSE先进过分频再进行使用&#10; 需要经过0x7FFF(32767)分频&#10; ---------------------------------------------------------------&#10; 问题 : 为什么不是32768分频&#10; 因为硬件默认会把分频系数加1,目的是为了防止程序员写0分频&#10; ---------------------------------------------------------------&#10; &#10; 3.查找RTC的计数值范围&#10; 1)通过芯片手册中有关RTC的介绍&#10; RTC使用了两个16位的寄存器来存储RTC的计数值&#10; 存储的计数值是从当前时间到基准时间的秒数&#10; ----------------------------------------------------&#10; 例如 : 当前时间是2022年9月7日 星期三 10:05:20&#10; RTC的计数值是&#10; 从1970年1月1日 00:00:00到当前时间的秒数&#10; 从1970年 - 2021年所有的秒数(平年 闰年)&#10; 从2022年1月 - 2022年8月所有的秒数(平年 闰年)&#10; 2022年9月1日 - 2022年9月6日所有的秒数&#10; 2022年9月7日00时 - 2022年9月7日10时所有的秒数&#10; 2022年9月7日10时0分 - 2022年9月7日10时5分所有的秒数&#10; 2022年9月7日10时5分0秒-2022年9月7日10时5分20秒所有秒数&#10; ----------------------------------------------------&#10; STM32F103的官方固件只提供了&#10; RTC_SetCounter : 设置计数值(秒数)&#10; 需要先把当前时间到基准时间的秒数求出&#10; RTC_GetCounter : 获取计数值(秒数)&#10; 需要把读出的计数值根据基准时间转换成年月日时分秒&#10; ----------------------------------------------------&#10; struct time_st&#10; {&#10; int Y;&#10; int M;&#10; int D;&#10; int W;&#10; int h;&#10; int m;&#10; int s;&#10; };&#10;&#10; 4)通过芯片的手册了解RTC&#10; 为了保证RTC在主设备断电的情况下仍然可以正常工作&#10; 需要连接纽扣电池&#10; 问题1.怎么判断是第一次操作RTC?&#10; 可以在备份寄存器中存储特定的数据进行判断&#10;&#10;============================&#10;作业&#10;1.把今天讲过的内容完整的复习一遍&#10;2.把STM32F407开发板的RTC搞定&#10;3.推进STM32F407开发板的项目工程&#10;4.推进最终项目&#10;============================&#10;&lt;/pre&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;</description></item><item><title>stm32_note_19day</title><link>https://ynhugo.github.io/p/stm32_19day/</link><pubDate>Thu, 16 Feb 2023 08:03:05 +0800</pubDate><guid>https://ynhugo.github.io/p/stm32_19day/</guid><description>&#10;&lt;div id="outline-container-headline-1" class="outline-2"&gt;&#10;&lt;h2 id="headline-1"&gt;&#10;stm32_note_19day&#10;&lt;/h2&gt;&#10;&lt;div id="outline-text-headline-1" class="outline-text-2"&gt;&#10;&lt;p&gt;&#10;===========================&lt;br&gt;&#10;2022-9-8&lt;br&gt;&#10;===========================&lt;/p&gt;&#10;&lt;div id="outline-container-headline-2" class="outline-3"&gt;&#10;&lt;h3 id="headline-2"&gt;&#10;这一天没有看到老师发布日记&#10;&lt;/h3&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;</description></item><item><title>stm32_note_20day</title><link>https://ynhugo.github.io/p/stm32_20day/</link><pubDate>Thu, 16 Feb 2023 08:03:05 +0800</pubDate><guid>https://ynhugo.github.io/p/stm32_20day/</guid><description>&#10;&lt;div id="outline-container-headline-1" class="outline-2"&gt;&#10;&lt;h2 id="headline-1"&gt;&#10;stm32_note_20day&#10;&lt;/h2&gt;&#10;&lt;div id="outline-text-headline-1" class="outline-text-2"&gt;&#10;&lt;p&gt;&#10;===========================&lt;br&gt;&#10;2022-9-9&lt;br&gt;&#10;===========================&lt;/p&gt;&#10;&lt;p&gt;&#10;开发板俯视图&lt;br&gt;&#10;&lt;img src="resources/01.开发板俯视图.PNG" alt="resources/01.开发板俯视图.PNG" title="resources/01.开发板俯视图.PNG" /&gt;&lt;/p&gt;&#10;&lt;p&gt;&#10;Nrf通信框架&lt;br&gt;&#10;&lt;img src="resources/02.Nrf通信框架.png" alt="resources/02.Nrf通信框架.png" title="resources/02.Nrf通信框架.png" /&gt;&lt;/p&gt;&#10;&lt;p&gt;&#10;Nrf硬件图&lt;br&gt;&#10;&lt;img src="resources/03Nrf硬件图.png" alt="resources/03Nrf硬件图.png" title="resources/03Nrf硬件图.png" /&gt;&lt;/p&gt;&#10;&lt;p&gt;&#10;Nrf的工作模式&lt;br&gt;&#10;&lt;img src="resources/04.Nrf的工作模式.png" alt="resources/04.Nrf的工作模式.png" title="resources/04.Nrf的工作模式.png" /&gt;&lt;/p&gt;&#10;&lt;p&gt;&#10;SPI协议&lt;br&gt;&#10;&lt;img src="resources/05.SPI协议.png" alt="resources/05.SPI协议.png" title="resources/05.SPI协议.png" /&gt;&lt;/p&gt;&#10;&lt;p&gt;&#10;Nrf硬件原理图&lt;br&gt;&#10;&lt;img src="resources/06.Nrf硬件原理图.png" alt="resources/06.Nrf硬件原理图.png" title="resources/06.Nrf硬件原理图.png" /&gt;&lt;/p&gt;&#10;&lt;p&gt;&#10;带边缘计算的项目框架&lt;br&gt;&#10;&lt;img src="resources/带边缘计算的项目框架.png" alt="resources/带边缘计算的项目框架.png" title="resources/带边缘计算的项目框架.png" /&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;</description></item><item><title>stm32_note_21day</title><link>https://ynhugo.github.io/p/stm32_21day/</link><pubDate>Thu, 16 Feb 2023 08:03:05 +0800</pubDate><guid>https://ynhugo.github.io/p/stm32_21day/</guid><description>&#10;&lt;div id="outline-container-headline-1" class="outline-2"&gt;&#10;&lt;h2 id="headline-1"&gt;&#10;stm32_note_21day&#10;&lt;/h2&gt;&#10;&lt;div id="outline-text-headline-1" class="outline-text-2"&gt;&#10;&lt;p&gt;&#10;============================&lt;br&gt;&#10;2022-9-13&lt;br&gt;&#10;============================&lt;/p&gt;&#10;&lt;div id="outline-container-headline-2" class="outline-3"&gt;&#10;&lt;h3 id="headline-2"&gt;&#10;一.温故知新&#10;&lt;/h3&gt;&#10;&lt;div id="outline-text-headline-2" class="outline-text-3"&gt;&#10;&lt;pre class="example"&gt;&#10; 短距无线通信模块-&amp;gt;nRF24L01&#10; 接口-&amp;gt;SPI接口&#10; SPI一共有4条线&#10; (CSN&amp;lt;片选&amp;gt;\SCK&amp;lt;时钟线&amp;gt;\MOSI&amp;lt;主出从入&amp;gt;\MISO&amp;lt;主入从出&amp;gt;)&#10; 全双工的工作模式&#10; nRF可以实现一对一的通信,也可以实现一对多的通信&#10; 最多是一对六的通信-&amp;gt;有6个接收数据的通道&#10; 在不同的频道下可以实现多对多的通信&#10;&lt;/pre&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;div id="outline-container-headline-3" class="outline-3"&gt;&#10;&lt;h3 id="headline-3"&gt;&#10;二.短距无线通信模块&#10;&lt;/h3&gt;&#10;&lt;div id="outline-text-headline-3" class="outline-text-3"&gt;&#10;&lt;pre class="example"&gt;&#10; WiFi模块-&amp;gt;使用的芯片型号是ESP8266(是乐鑫公司的芯片)&#10; 本身也是一个32bit的单片机芯片&#10; 只不过乐鑫公司在生产ESP8266芯片时在内部已经烧写了TCP/UDP的协议栈&#10; ESP8266的接口是USART/UART的接口需要连接到我们开发板的USART2上&#10; USART2_TX&#9;PA2&#10; USART2_RX&#9;PA3&#10;需要通过STM32的USART2为ESP8266模块发送AT指令(WiFi\GPRS\NB-IoT)&#10;&lt;/pre&gt;&#10;&lt;p&gt;&#10;AT指令集&lt;br&gt;&#10;&lt;img src="resources/01AT指令集01.png" alt="resources/01AT指令集01.png" title="resources/01AT指令集01.png" /&gt;&lt;/p&gt;&#10;&lt;p&gt;&#10;&lt;img src="resources/01AT指令集02.png" alt="resources/01AT指令集02.png" title="resources/01AT指令集02.png" /&gt;&lt;/p&gt;&#10;&lt;p&gt;&#10;AT指令使用示例&lt;br&gt;&#10;&lt;img src="resources/02AT指令使用示例.png" alt="resources/02AT指令使用示例.png" title="resources/02AT指令使用示例.png" /&gt;&lt;/p&gt;&#10;&lt;div id="outline-container-headline-4" class="outline-4"&gt;&#10;&lt;h4 id="headline-4"&gt;&#10;单连接 TCP Client&#10;&lt;/h4&gt;&#10;&lt;div id="outline-text-headline-4" class="outline-text-4"&gt;&#10;&lt;p&gt;ESP8266单连接&lt;br&gt;&#10;&lt;img src="resources/03ESP8266单连接01.png" alt="resources/03ESP8266单连接01.png" title="resources/03ESP8266单连接01.png" /&gt;&lt;/p&gt;&#10;&lt;p&gt;&#10;&lt;img src="resources/03ESP8266单连接02.png" alt="resources/03ESP8266单连接02.png" title="resources/03ESP8266单连接02.png" /&gt;&lt;/p&gt;&#10;&lt;pre class="example"&gt;&#10; 1.设置WiFi模式&#10; &amp;#34;AT+CWMODE=1\r\n&amp;#34;&#10; 需要接收&amp;#34;OK&amp;#34;&#10; 如果设置成单连接 TCP Client可以修改成=1&#10; 注意 :&#10; =1&#9;softAP模式&#10; =2&#9;station模式&#10; =3&#9;softAP+station模式&#10; &#10; 2.连接路由&#10; &amp;#34;AT+CWJAP=&amp;#34;SSID&amp;#34;,&amp;#34;password&amp;#34;\r\n&amp;#34;&#10; 需要接收&amp;#34;OK&amp;#34;&#10; 注意 :&#10; 1)&#10; SSID&#9;是路由器的名称&#10; password&#9;是路由器的密码&#10; 2)&#10; 路由器的名称不能是中文,也不能有空格&#10; 尽量是大小写英文字母&#10; 3)&#10; 路由器的密码必须要有&#10; 4)&#10; 在小范围之内WiFi信号会有干扰,有可能会影响实验&#10;&#10; 3.查询设备 IP 地址&#10; &amp;#34;AT+CIFSR\r\n&amp;#34;&#10; 注意 :&#10; 1)只需要有查询的指令发送即可,不需要接收查询的结果&#10;&#10; 4.ESP8266 作为 client 连接到 TCP server&#10; &amp;#34;AT+CIPSTART=&amp;#34;TCP&amp;#34;,&amp;#34;IP&amp;#34;,PORT\r\n&amp;#34;&#10; 需要接收&amp;#34;OK&amp;#34;&#10; 注意 :&#10; 1)&#10; IP&#9;指的是Server端的IP地址(PC机获取的IP)&#10; PORT&#9;指的是Server端的端口号(可以自己设置)&#10;&#10; 5.发送数据&#10; &amp;#34;AT+CIPSEND=4\r\n&amp;#34;&#10; 首先需要接收&amp;#34;OK&amp;#34;&#10; 然后需要接收&amp;#39;&amp;gt;&amp;#39;&#10; 在&amp;#39;&amp;gt;&amp;#39;之后写上你要发送的数据&#10; 发送完数据之后,需要接收&amp;#34;SEND OK&amp;#34;&#10; 注意 :&#10; 1)&#10; =4&#9;代表将来要发送4bytes数据(不算&amp;#39;\0&amp;#39;)&#10; 2)&#10; 如果算上&amp;#39;\0&amp;#39;&#10; =6&#9;&amp;#34;Hello&amp;#34;会造成忙等&#10;&#10; 6.接收数据&#10; &amp;#34;+IPD,n:xxxxxxxxxx&amp;#34;&#10; 注意 : &#10; 1)&#10; n&#9;代表的是接收到数据的字节数&#10; 2)&#10; xxxx&#9;代表的是接收到的数据&#10;&#10; 7.断开 TCP 连接&#10; &amp;#34;AT+CIPCLOSE\r\n&amp;#34;&#10; 注意 :&#10; 1)只需要发送断开连接的指令,不需要接收应答&#10;&lt;/pre&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;div id="outline-container-headline-5" class="outline-4"&gt;&#10;&lt;h4 id="headline-5"&gt;&#10;透传模式&#10;&lt;/h4&gt;&#10;&lt;div id="outline-text-headline-5" class="outline-text-4"&gt;&#10;&lt;p&gt;ESP8266透传&lt;br&gt;&#10;&lt;img src="resources/04ESP8266透传.png" alt="resources/04ESP8266透传.png" title="resources/04ESP8266透传.png" /&gt;&lt;/p&gt;&#10;&lt;pre class="example"&gt;&#10; 1.在连接完TCP Server端之后需要使能透传模式&#10; &amp;#34;AT+CIPMODE=1\r\n&amp;#34;&#10; 需要接收&amp;#34;OK&amp;#34;&#10; &#10; 2.发送数据&#10; &amp;#34;AT+CIPSEND\r\n&amp;#34;&#10; 首先需要接收&amp;#34;OK&amp;#34;&#10; 然后需要接收&amp;#39;&amp;gt;&amp;#39;&#10; 在&amp;#39;&amp;gt;&amp;#39;之后写上你要发送的数据&#10; 注意 : &#10; 1)在透传模式下不需要指定发送数据的字节数&#10; &#10; 3.退出发送数据&#10; &amp;#34;+++&amp;#34;&#10; 代表要退出发送数据&#10;&#10; 4.断开 TCP 连接&#10; &amp;#34;AT+CIPCLOSE\r\n&amp;#34;&#10; 注意 :&#10; 1)只需要发送断开连接的指令,不需要接收应答&#10;&#10;=============================&#10;任务&#10;1.把STM32F103开发板上的TCP client连接调通&#10;2.组内找同学把STM32F103开发板上的固定远端的UDP通信调通&#10;3.组内找同学把STM32F407开发板上的TCP client连接调通&#10;=============================&#10;&lt;/pre&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;div id="outline-container-headline-6" class="outline-3"&gt;&#10;&lt;h3 id="headline-6"&gt;&#10;esp8266.h&#10;&lt;/h3&gt;&#10;&lt;div id="outline-text-headline-6" class="outline-text-3"&gt;&#10;&lt;div class="src src-c"&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 2&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 3&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 4&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 5&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 6&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 7&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 8&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 9&#10;&lt;/span&gt;&lt;span class="lnt"&gt;10&#10;&lt;/span&gt;&lt;span class="lnt"&gt;11&#10;&lt;/span&gt;&lt;span class="lnt"&gt;12&#10;&lt;/span&gt;&lt;span class="lnt"&gt;13&#10;&lt;/span&gt;&lt;span class="lnt"&gt;14&#10;&lt;/span&gt;&lt;span class="lnt"&gt;15&#10;&lt;/span&gt;&lt;span class="lnt"&gt;16&#10;&lt;/span&gt;&lt;span class="lnt"&gt;17&#10;&lt;/span&gt;&lt;span class="lnt"&gt;18&#10;&lt;/span&gt;&lt;span class="lnt"&gt;19&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-c" data-lang="c"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#ifndef __ESP8266_H&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#define __ESP8266_H&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cm"&gt;/*&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cm"&gt;ESP8266模块是WIFI无线通讯模块,该模块是串口接口&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cm"&gt;连接到了我们开发板上的USART2&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cm"&gt;*/&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;#34;stm32f10x_conf.h&amp;#34;//包含该头文件所有的外设头文件均已包含&lt;/span&gt;&lt;span class="cp"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;typedef&lt;/span&gt; &lt;span class="nf"&gt;void&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;wifi_recv_handler&lt;/span&gt;&lt;span class="p"&gt;)(&lt;/span&gt;&lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;buf&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;len&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="c1"&gt;//通过typedef定义函数指针类型&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;extern&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;set_wifi_recv_handler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;wifi_recv_handler&lt;/span&gt; &lt;span class="n"&gt;h&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="c1"&gt;//设置wifi接收到数据的回调函数&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;extern&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;esp8266_init&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="c1"&gt;//初始化的函数(初始化串口)&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;extern&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;esp8266_link_wifi&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;ssid&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;passwd&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="c1"&gt;//连接路由(需要路由的名称和路由的密码)&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;extern&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;esp8266_connect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;ip&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;port&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="c1"&gt;//连接TCP server&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;extern&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;esp8266_disconnect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="c1"&gt;//断开TCP连接&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;extern&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;esp8266_send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;len&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="c1"&gt;//发送数据&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;extern&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;dataHandler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;unsigned&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="c1"&gt;//处理接收到的数据&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#endif&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;div id="outline-container-headline-7" class="outline-3"&gt;&#10;&lt;h3 id="headline-7"&gt;&#10;esp8966.c&#10;&lt;/h3&gt;&#10;&lt;div id="outline-text-headline-7" class="outline-text-3"&gt;&#10;&lt;div class="src src-c"&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 2&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 3&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 4&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 5&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 6&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 7&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 8&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 9&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 10&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 11&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 12&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 13&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 14&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 15&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 16&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 17&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 18&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 19&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 20&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 21&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 22&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 23&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 24&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 25&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 26&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 27&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 28&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 29&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 30&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 31&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 32&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 33&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 34&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 35&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 36&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 37&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 38&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 39&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 40&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 41&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 42&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 43&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 44&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 45&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 46&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 47&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 48&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 49&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 50&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 51&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 52&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 53&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 54&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 55&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 56&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 57&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 58&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 59&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 60&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 61&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 62&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 63&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 64&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 65&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 66&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 67&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 68&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 69&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 70&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 71&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 72&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 73&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 74&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 75&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 76&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 77&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 78&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 79&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 80&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 81&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 82&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 83&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 84&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 85&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 86&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 87&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 88&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 89&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 90&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 91&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 92&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 93&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 94&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 95&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 96&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 97&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 98&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 99&#10;&lt;/span&gt;&lt;span class="lnt"&gt;100&#10;&lt;/span&gt;&lt;span class="lnt"&gt;101&#10;&lt;/span&gt;&lt;span class="lnt"&gt;102&#10;&lt;/span&gt;&lt;span class="lnt"&gt;103&#10;&lt;/span&gt;&lt;span class="lnt"&gt;104&#10;&lt;/span&gt;&lt;span class="lnt"&gt;105&#10;&lt;/span&gt;&lt;span class="lnt"&gt;106&#10;&lt;/span&gt;&lt;span class="lnt"&gt;107&#10;&lt;/span&gt;&lt;span class="lnt"&gt;108&#10;&lt;/span&gt;&lt;span class="lnt"&gt;109&#10;&lt;/span&gt;&lt;span class="lnt"&gt;110&#10;&lt;/span&gt;&lt;span class="lnt"&gt;111&#10;&lt;/span&gt;&lt;span class="lnt"&gt;112&#10;&lt;/span&gt;&lt;span class="lnt"&gt;113&#10;&lt;/span&gt;&lt;span class="lnt"&gt;114&#10;&lt;/span&gt;&lt;span class="lnt"&gt;115&#10;&lt;/span&gt;&lt;span class="lnt"&gt;116&#10;&lt;/span&gt;&lt;span class="lnt"&gt;117&#10;&lt;/span&gt;&lt;span class="lnt"&gt;118&#10;&lt;/span&gt;&lt;span class="lnt"&gt;119&#10;&lt;/span&gt;&lt;span class="lnt"&gt;120&#10;&lt;/span&gt;&lt;span class="lnt"&gt;121&#10;&lt;/span&gt;&lt;span class="lnt"&gt;122&#10;&lt;/span&gt;&lt;span class="lnt"&gt;123&#10;&lt;/span&gt;&lt;span class="lnt"&gt;124&#10;&lt;/span&gt;&lt;span class="lnt"&gt;125&#10;&lt;/span&gt;&lt;span class="lnt"&gt;126&#10;&lt;/span&gt;&lt;span class="lnt"&gt;127&#10;&lt;/span&gt;&lt;span class="lnt"&gt;128&#10;&lt;/span&gt;&lt;span class="lnt"&gt;129&#10;&lt;/span&gt;&lt;span class="lnt"&gt;130&#10;&lt;/span&gt;&lt;span class="lnt"&gt;131&#10;&lt;/span&gt;&lt;span class="lnt"&gt;132&#10;&lt;/span&gt;&lt;span class="lnt"&gt;133&#10;&lt;/span&gt;&lt;span class="lnt"&gt;134&#10;&lt;/span&gt;&lt;span class="lnt"&gt;135&#10;&lt;/span&gt;&lt;span class="lnt"&gt;136&#10;&lt;/span&gt;&lt;span class="lnt"&gt;137&#10;&lt;/span&gt;&lt;span class="lnt"&gt;138&#10;&lt;/span&gt;&lt;span class="lnt"&gt;139&#10;&lt;/span&gt;&lt;span class="lnt"&gt;140&#10;&lt;/span&gt;&lt;span class="lnt"&gt;141&#10;&lt;/span&gt;&lt;span class="lnt"&gt;142&#10;&lt;/span&gt;&lt;span class="lnt"&gt;143&#10;&lt;/span&gt;&lt;span class="lnt"&gt;144&#10;&lt;/span&gt;&lt;span class="lnt"&gt;145&#10;&lt;/span&gt;&lt;span class="lnt"&gt;146&#10;&lt;/span&gt;&lt;span class="lnt"&gt;147&#10;&lt;/span&gt;&lt;span class="lnt"&gt;148&#10;&lt;/span&gt;&lt;span class="lnt"&gt;149&#10;&lt;/span&gt;&lt;span class="lnt"&gt;150&#10;&lt;/span&gt;&lt;span class="lnt"&gt;151&#10;&lt;/span&gt;&lt;span class="lnt"&gt;152&#10;&lt;/span&gt;&lt;span class="lnt"&gt;153&#10;&lt;/span&gt;&lt;span class="lnt"&gt;154&#10;&lt;/span&gt;&lt;span class="lnt"&gt;155&#10;&lt;/span&gt;&lt;span class="lnt"&gt;156&#10;&lt;/span&gt;&lt;span class="lnt"&gt;157&#10;&lt;/span&gt;&lt;span class="lnt"&gt;158&#10;&lt;/span&gt;&lt;span class="lnt"&gt;159&#10;&lt;/span&gt;&lt;span class="lnt"&gt;160&#10;&lt;/span&gt;&lt;span class="lnt"&gt;161&#10;&lt;/span&gt;&lt;span class="lnt"&gt;162&#10;&lt;/span&gt;&lt;span class="lnt"&gt;163&#10;&lt;/span&gt;&lt;span class="lnt"&gt;164&#10;&lt;/span&gt;&lt;span class="lnt"&gt;165&#10;&lt;/span&gt;&lt;span class="lnt"&gt;166&#10;&lt;/span&gt;&lt;span class="lnt"&gt;167&#10;&lt;/span&gt;&lt;span class="lnt"&gt;168&#10;&lt;/span&gt;&lt;span class="lnt"&gt;169&#10;&lt;/span&gt;&lt;span class="lnt"&gt;170&#10;&lt;/span&gt;&lt;span class="lnt"&gt;171&#10;&lt;/span&gt;&lt;span class="lnt"&gt;172&#10;&lt;/span&gt;&lt;span class="lnt"&gt;173&#10;&lt;/span&gt;&lt;span class="lnt"&gt;174&#10;&lt;/span&gt;&lt;span class="lnt"&gt;175&#10;&lt;/span&gt;&lt;span class="lnt"&gt;176&#10;&lt;/span&gt;&lt;span class="lnt"&gt;177&#10;&lt;/span&gt;&lt;span class="lnt"&gt;178&#10;&lt;/span&gt;&lt;span class="lnt"&gt;179&#10;&lt;/span&gt;&lt;span class="lnt"&gt;180&#10;&lt;/span&gt;&lt;span class="lnt"&gt;181&#10;&lt;/span&gt;&lt;span class="lnt"&gt;182&#10;&lt;/span&gt;&lt;span class="lnt"&gt;183&#10;&lt;/span&gt;&lt;span class="lnt"&gt;184&#10;&lt;/span&gt;&lt;span class="lnt"&gt;185&#10;&lt;/span&gt;&lt;span class="lnt"&gt;186&#10;&lt;/span&gt;&lt;span class="lnt"&gt;187&#10;&lt;/span&gt;&lt;span class="lnt"&gt;188&#10;&lt;/span&gt;&lt;span class="lnt"&gt;189&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-c" data-lang="c"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;#34;esp8266.h&amp;#34;&lt;/span&gt;&lt;span class="cp"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;#34;usart2.h&amp;#34;&lt;/span&gt;&lt;span class="cp"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;#34;delay.h&amp;#34;&lt;/span&gt;&lt;span class="cp"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;#34;stdio.h&amp;#34;&lt;/span&gt;&lt;span class="cp"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;#34;stdlib.h&amp;#34;&lt;/span&gt;&lt;span class="cp"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#define O_F&#9;1&lt;/span&gt;&lt;span class="c1"&gt;//O的状态&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#define K_F&#9;2&lt;/span&gt;&lt;span class="c1"&gt;//K的状态&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;flag&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;O_F&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;ok_flag&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;len&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="c1"&gt;//保存数据长度的整数&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;//&amp;#34;+IPD,13:1234567890ABC&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#define ADD_S &#9;0&lt;/span&gt;&lt;span class="c1"&gt;//+的状态&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#define I_S&#9;&#9;&#9;1&lt;/span&gt;&lt;span class="c1"&gt;//I的状态&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#define P_S&#9;&#9;&#9;2&lt;/span&gt;&lt;span class="c1"&gt;//P的状态&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#define D_S&#9;&#9;&#9;3&lt;/span&gt;&lt;span class="c1"&gt;//D的状态&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#define H_S&#9;&#9;&#9;4&lt;/span&gt;&lt;span class="c1"&gt;//,的状态&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#define LEN_S&#9;&#9;5&lt;/span&gt;&lt;span class="c1"&gt;//长度的状态&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#define DATA_S&#9;6&lt;/span&gt;&lt;span class="c1"&gt;//数据的状态&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;data_flag&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ADD_S&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="c1"&gt;//默认是+的状态&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;wifi_recv_handler&lt;/span&gt; &lt;span class="n"&gt;wifi_handler&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;set_wifi_recv_handler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;wifi_recv_handler&lt;/span&gt; &lt;span class="n"&gt;h&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="c1"&gt;//设置wifi接收到数据的回调函数&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&lt;span class="n"&gt;wifi_handler&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;h&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;dataHandler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;unsigned&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="c1"&gt;//处理接收到的数据&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="n"&gt;len_buf&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;&lt;span class="c1"&gt;//接收到数据的字节数&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="c1"&gt;//循环变量&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="n"&gt;data_buf&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;512&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;&lt;span class="c1"&gt;//存储接收到的数据&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&lt;span class="k"&gt;switch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data_flag&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="nl"&gt;ADD_S&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sc"&gt;&amp;#39;+&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&lt;span class="n"&gt;data_flag&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;I_S&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="nl"&gt;I_S&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sc"&gt;&amp;#39;I&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&lt;span class="n"&gt;data_flag&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;P_S&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&lt;span class="k"&gt;else&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&lt;span class="n"&gt;data_flag&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ADD_S&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="nl"&gt;P_S&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sc"&gt;&amp;#39;P&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&lt;span class="n"&gt;data_flag&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;D_S&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&lt;span class="k"&gt;else&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&lt;span class="n"&gt;data_flag&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ADD_S&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="nl"&gt;D_S&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sc"&gt;&amp;#39;D&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&lt;span class="n"&gt;data_flag&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;H_S&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&lt;span class="k"&gt;else&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&lt;span class="n"&gt;data_flag&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ADD_S&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="nl"&gt;H_S&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sc"&gt;&amp;#39;,&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&lt;span class="n"&gt;data_flag&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;LEN_S&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&lt;span class="k"&gt;else&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&lt;span class="n"&gt;data_flag&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ADD_S&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="nl"&gt;LEN_S&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="c1"&gt;//+IPD,13:1234567890ABC&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sc"&gt;&amp;#39;:&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&lt;span class="n"&gt;len_buf&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sc"&gt;&amp;#39;\0&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&lt;span class="n"&gt;len&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;atoi&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;len_buf&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&lt;span class="n"&gt;data_flag&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;DATA_S&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&lt;span class="k"&gt;else&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&lt;span class="n"&gt;len_buf&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="nl"&gt;DATA_S&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&lt;span class="n"&gt;data_buf&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;len&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&lt;span class="n"&gt;data_flag&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ADD_S&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;wifi_handler&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&lt;span class="nf"&gt;wifi_handler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data_buf&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;len&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sc"&gt;&amp;#39;&amp;gt;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&lt;span class="n"&gt;ok_flag&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ok_flag&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&lt;span class="k"&gt;switch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;flag&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;&lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="nl"&gt;O_F&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sc"&gt;&amp;#39;O&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&lt;span class="n"&gt;flag&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;K_F&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;&lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="nl"&gt;K_F&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sc"&gt;&amp;#39;K&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&lt;span class="n"&gt;flag&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;O_F&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&lt;span class="n"&gt;ok_flag&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&lt;span class="k"&gt;else&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&lt;span class="n"&gt;flag&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;O_F&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#9;&lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;esp8266_init&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="c1"&gt;//初始化的函数(初始化串口)&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&lt;span class="nf"&gt;usart_2_init&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;esp8266_link_wifi&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;ssid&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;passwd&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="c1"&gt;//连接路由(需要路由的名称和路由的密码)&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&lt;span class="c1"&gt;//AT+RST\r\n 重启无线模块&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&lt;span class="nf"&gt;usart_2_send_data&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;AT+RST&lt;/span&gt;&lt;span class="se"&gt;\r\n&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&lt;span class="nf"&gt;delay_ms&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="c1"&gt;//重启之后延时两秒&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&lt;span class="c1"&gt;//AT+CWMODE=1\r\n 选择wifi模式&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&lt;span class="n"&gt;ok_flag&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&lt;span class="nf"&gt;usart_2_send_data&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;AT+CWMODE=1&lt;/span&gt;&lt;span class="se"&gt;\r\n&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="c1"&gt;//选择模式&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&lt;span class="k"&gt;while&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ok_flag&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="c1"&gt;//等待esp8266的OK&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&lt;span class="c1"&gt;//AT+CWJAP=&amp;#34;SSID&amp;#34;,&amp;#34;password&amp;#34;\r\n 连接路由&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&lt;span class="n"&gt;ok_flag&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&lt;span class="nf"&gt;usart_2_send_data&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;AT+CWJAP=&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&lt;span class="nf"&gt;usart_2_send_byte&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sc"&gt;&amp;#39;&amp;#34;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&lt;span class="nf"&gt;usart_2_send_data&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ssid&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&lt;span class="nf"&gt;usart_2_send_byte&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sc"&gt;&amp;#39;&amp;#34;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&lt;span class="nf"&gt;usart_2_send_byte&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sc"&gt;&amp;#39;,&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&lt;span class="nf"&gt;usart_2_send_byte&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sc"&gt;&amp;#39;&amp;#34;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&lt;span class="nf"&gt;usart_2_send_data&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;passwd&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&lt;span class="nf"&gt;usart_2_send_byte&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sc"&gt;&amp;#39;&amp;#34;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&lt;span class="nf"&gt;usart_2_send_data&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;&lt;/span&gt;&lt;span class="se"&gt;\r\n&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&lt;span class="k"&gt;while&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ok_flag&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&lt;span class="c1"&gt;//AT+CIFSR\r\n 查询分配到的IP地址(必须要查一下,否则无法建立连接)&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&lt;span class="nf"&gt;usart_2_send_data&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;AT+CIFSR&lt;/span&gt;&lt;span class="se"&gt;\r\n&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;esp8266_connect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;ip&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;port&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="c1"&gt;//连接TCP server&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&lt;span class="c1"&gt;//AT+CIPSTART=&amp;#34;TCP&amp;#34;,&amp;#34;192.168.3.116&amp;#34;,8080\r\n 建立TCP连接&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&lt;span class="n"&gt;ok_flag&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&lt;span class="nf"&gt;usart_2_send_data&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;AT+CIPSTART=&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&lt;span class="nf"&gt;usart_2_send_byte&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sc"&gt;&amp;#39;&amp;#34;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&lt;span class="nf"&gt;usart_2_send_data&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;TCP&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&lt;span class="nf"&gt;usart_2_send_byte&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sc"&gt;&amp;#39;&amp;#34;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&lt;span class="nf"&gt;usart_2_send_byte&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sc"&gt;&amp;#39;,&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&lt;span class="nf"&gt;usart_2_send_byte&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sc"&gt;&amp;#39;&amp;#34;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&lt;span class="nf"&gt;usart_2_send_data&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ip&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&lt;span class="nf"&gt;usart_2_send_byte&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sc"&gt;&amp;#39;&amp;#34;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&lt;span class="nf"&gt;usart_2_send_byte&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sc"&gt;&amp;#39;,&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&lt;span class="nf"&gt;usart_2_send_data&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;port&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&lt;span class="nf"&gt;usart_2_send_data&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;&lt;/span&gt;&lt;span class="se"&gt;\r\n&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&lt;span class="k"&gt;while&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ok_flag&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;esp8266_disconnect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="c1"&gt;//断开TCP连接&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&lt;span class="c1"&gt;//AT+CIPCLOSE\r\n 断开TCP连接&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&lt;span class="nf"&gt;usart_2_send_data&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;AT+CIPCLOSE&lt;/span&gt;&lt;span class="se"&gt;\r\n&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&lt;span class="c1"&gt;//注意:有可能回复有可能不回复,所以不检测closed ok&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;esp8266_send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;len&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="c1"&gt;//发送数据&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&lt;span class="c1"&gt;//AT+CIPSEND=4\r\n 发送数据&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&lt;span class="n"&gt;ok_flag&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&lt;span class="nf"&gt;usart_2_send_data&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;AT+CIPSEND=&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&lt;span class="nf"&gt;usart_2_send_data&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;len&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&lt;span class="nf"&gt;usart_2_send_data&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;&lt;/span&gt;&lt;span class="se"&gt;\r\n&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&lt;span class="k"&gt;while&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ok_flag&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="c1"&gt;//等待 OK&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&lt;span class="n"&gt;ok_flag&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&lt;span class="k"&gt;while&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ok_flag&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="c1"&gt;//等待 &amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&lt;span class="n"&gt;ok_flag&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&lt;span class="nf"&gt;usart_2_send_data&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;&lt;span class="k"&gt;while&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ok_flag&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="c1"&gt;//等待 SEND OK&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;</description></item><item><title>stm32_note_22day</title><link>https://ynhugo.github.io/p/stm32_22day/</link><pubDate>Thu, 16 Feb 2023 08:03:05 +0800</pubDate><guid>https://ynhugo.github.io/p/stm32_22day/</guid><description>&#10;&lt;div id="outline-container-headline-1" class="outline-2"&gt;&#10;&lt;h2 id="headline-1"&gt;&#10;stm32_note_22day&#10;&lt;/h2&gt;&#10;&lt;div id="outline-text-headline-1" class="outline-text-2"&gt;&#10;&lt;p&gt;&#10;============================&lt;br&gt;&#10;2022-9-15&lt;br&gt;&#10;============================&lt;/p&gt;&#10;&lt;div id="outline-container-headline-2" class="outline-3"&gt;&#10;&lt;h3 id="headline-2"&gt;&#10;一.物联网云服务器&#10;&lt;/h3&gt;&#10;&lt;div id="outline-text-headline-2" class="outline-text-3"&gt;&#10;&lt;pre class="example"&gt;&#10; 短距无线通信的模块-&amp;gt;nRF模块、WiFi&#10; 华为物联网中-&amp;gt;云、管、端&#10; 物联网云服务器&#10; YeeLink&#9;&#9;出现比较早的物联网云服务器&#10; ESLink&#9;&#9;东方瑞通自己的物联网云服务器&#10; 企业用户(各大公司、医院、高校)&#10; Ocean Connect&#9;华为物联网云服务器&#10; 小米IoT&#9;&#9;小米物联网云服务器&#10; AIoT&#9;&#9;阿里物联网云服务器&#10; 百度天工&#9;&#9;百度物联网云服务器&#10; &#9;&#9;移动物联网云服务器&#10; ...&#10; ESLink&#10;&lt;/pre&gt;&#10;&lt;p&gt;&#10;ESLink&lt;br&gt;&#10;&lt;img src="resources/ESLink.png" alt="resources/ESLink.png" title="resources/ESLink.png" /&gt;&lt;/p&gt;&#10;&lt;p&gt;&#10;&lt;a href="resources/mqtt.apk"&gt;点击下载 mqtt.apk&lt;/a&gt;&lt;/p&gt;&#10;&lt;pre class="example"&gt;&#10; 私有的物联网云服务器&#10; iot.embsky.com&#10;&lt;/pre&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;</description></item><item><title>stm32_note_阎同学的窗口看门狗</title><link>https://ynhugo.github.io/p/stm32_%E9%98%8E%E5%90%8C%E5%AD%A6%E7%9A%84%E7%AA%97%E5%8F%A3%E7%9C%8B%E9%97%A8%E7%8B%97/</link><pubDate>Thu, 16 Feb 2023 08:03:05 +0800</pubDate><guid>https://ynhugo.github.io/p/stm32_%E9%98%8E%E5%90%8C%E5%AD%A6%E7%9A%84%E7%AA%97%E5%8F%A3%E7%9C%8B%E9%97%A8%E7%8B%97/</guid><description>&#10;&lt;div id="outline-container-headline-1" class="outline-2"&gt;&#10;&lt;h2 id="headline-1"&gt;&#10;stm32_note_阎同学的窗口看门狗&#10;&lt;/h2&gt;&#10;&lt;div id="outline-text-headline-1" class="outline-text-2"&gt;&#10;&lt;pre class="example"&gt;&#10;除非递减计数器的值在T6位变成0前被刷新，看门狗电路在达到预置的时间周期时，&#10;会产生一个MCU复位。在递减计数器达到窗口寄存器数值之前，如果7位的递减计&#10;数器数值(在控制寄存器中)被刷新， 那么也将产生一个MCU复位。这表明递减计数器需要在一&#10;个有限的时间窗口中被刷新&#10;========================================================&#10;递减计数器T6位变成0前刷新——当递减计数器的值小于 0x40产生复位。&#10;递减计数器达到窗口寄存器数值之前不能被刷新&#10;如果启动了看门狗并且允许中断，当递减计数器等于0x40时产生早期唤醒中断(EWI)，&#10; 它可以被用于重装载计数器以避免WWDG复位&#10;========================================================&#10;&#10;&#10;如果看门狗被启动(WWDG_CR寄存器中的WDGA位被置’1’)， 并且当7位(T[6:0])递减计数器从&#10;0x40翻转到0x3F(T6位清零)时，则产生一个复位。如果软件在计数器值大于窗口寄存器中的数&#10;值时重新装载计数器，将产生一个复位。&#10;==========================================================&#10;WWDG_CR寄存器中的WDGA位被置’1’启动看门狗&#10;递减计数器从0100 0000--&amp;gt;0011 1111会产生一个复位&#10;计数器值大于窗口寄存器中的数值时重新装载计数器会产生一个复位&#10;必须定期地写入WWDG_CR寄存器,必须在1111 1111(0XFF)和1100 0000(0XC0)之间&#10;只有当计数器值小于窗口寄存器的值时，才能进行写操作。&#10;==========================================================&#10;&#10;&#10;递减计数器处于自由运行状态，即使看门狗被禁止，递减计数器仍继续递减计数。当看门&#10;狗被启用时，T6位必须被设置，以防止立即产生一个复位。&#10;T[5:0]位包含了看门狗产生复位之前的计时数目；复位前的延时时间在一个最小值和一个最&#10;大值之间变化，这是因为写入WWDG_CR寄存器时，预分频值是未知的。&#10;配置寄存器(WWDG_CFR) 中包含窗口的上限值：要避免产生复位，递减计数器必须在其值&#10;小于窗口寄存器的数值并且大于0x3F时被重新装载，图155描述了窗口寄存器的工作过程。&#10;另一个重装载计数器的方法是利用早期唤醒中断(EWI)。设置WWDG_CFR寄存器中的WEI&#10;位开启该中断。当递减计数器到达0x40时，则产生此中断，相应的中断服务程序(ISR)可以&#10;用来加载计数器以防止WWDG复位。在WWDG_SR寄存器中写’0’可以清除该中断。&#10;注： T6位可以被用来产生一个软件复位(WDGA位被置位，T6位清零)&#10;==========================================================&#10;看门狗被启用时，T6位必须被设置&#10;寄存器(WWDG_CFR) 中包含窗口的上限值递减计数器必须在&#10; 其值小于窗口寄存器的数值并且大于0x3F时被重新装载&#10;WWDG_CFR寄存器中的WEI位开启该中断，到达0x40时产生中断(ISR)可以用来加载计数器&#10; 在WWDG_SR寄存器中写’0’可以清除该中断。&#10;控制寄存器(WWDG_CR) &#10; 0~7位有效&#10; 7号位控制看门狗的开启与关闭&#10; 0：禁止看门狗&#10; 1：启用看门狗&#10; 6号位至0时产生中断&#10;配置寄存器(WWDG_CFR) &#10; 0~9位有效&#10; 9: 提前唤醒中断&#10; 此位若置1，则当计数器值达到40h，即产生中断。&#10; 此中断只能由硬件在复位后清除。&#10; 7、8；时基预分频器的时基可根据如下修改：&#10; 00: CK计时器时钟(PCLK1除以4096)除以1 &#10; 01: CK计时器时钟(PCLK1除以4096)除以2 &#10; 10: CK计时器时钟(PCLK1除以4096)除以4 &#10; 11: CK计时器时钟(PCLK1除以4096)除以8 &#10; 0~6: 7位窗口值&#10; 这些位包含了用来与递减计数器进行比较用的窗口值。&#10;状态寄存器(WWDG_SR) &#10; 0位有效&#10; 0: 提前唤醒中断标志&#10; 当计数器值达到40h时，此位由硬件置1。&#10; 它必须通过软件写’0’来清除。对此位写’1’无效。&#10; 若中断未被使能，此位也会被置’1’。&#10;&#10;在总线图里知WWDG的时钟频率位36MHz&#10;&lt;/pre&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;</description></item></channel></rss>