BUG从入门到精通

私信 关注
BUG从入门到精通
码龄4年

业精于勤,荒于嬉;行成于思,毁于随。

  • 143,052
    被访问量
  • 121
    原创文章
  • 48,351
    作者排名
  • 83
    粉丝数量
  • 于 2017-07-17 加入CSDN
获得成就
  • 获得106次点赞
  • 内容获得51次评论
  • 获得379次收藏
荣誉勋章
兴趣领域
  • #人工智能
    #Python
TA的专栏
  • RTOS
    2篇
  • STM32
    30篇
  • git
    3篇
  • 零碎知识补充
    10篇
  • C/C++
    10篇
  • python
    37篇
  • 灵感与感悟随笔
    4篇
  • 数据结构与算法
    23篇
  • 通信协议
    5篇
  • QT
    1篇
  • Linux
    4篇
  • SQL
    1篇
  • 眼界
    1篇
  • 计算机原理
    1篇
  • 51单片机
    2篇
  • 硬件理论与设计
    5篇
  • 最近
  • 文章
  • 资源
  • 问答
  • 课程
  • 帖子
  • 收藏
  • 关注/订阅

rtthread的添加shell组件后shell线程一直占用cpu

shell线程代码如下,可以发现while(1)中并没有将线程挂起或者让出cpu的操作,因此,当引入shell组件后shell线程就相当于空闲线程,任何优先级低于shell线程的线程都将得不到执行。出于优先级资源的最大化,可以将shell优先级降低,但注意不要低于idle线程优先级。void finsh_thread_entry(void *parameter){ int ch; /* normal is echo mode */#ifndef FINSH_ECHO_DISABL
原创
5阅读
0评论
0点赞
发布博客于 昨天

cubemx生成rtt-nano+usb的问题

cubemx配置rtt系统和usb,出现死机问题,调试发现,cubemx使用的usb驱动中有很多调用HAL_Delay()函数的地方,而cubemx配置的工程中默认是使用systick作为延时定时器,当引入操作系统后,systick被也被操作系统作为系统时钟占用。解决办法:配置cubemx时使用其他定时器作为延时定时器。或者完全使用系统的延时函数代替HAL_Delay()函数。此外应当注意,HAL_Delay()函数是死等的,完成外设初始化后,在主线程的循环中不要在使用该函数。...
原创
8阅读
0评论
0点赞
发布博客于 5 天前

void与void*

void与void *void关键字的使用规则:1. 如果函数没有返回值,那么应声明为void类型2. 如果函数无参数,那么应声明其参数为void3. 如果函数的参数可以是任意类型指针,那么应声明其参数为void *4. void不能代表一个真实的变量void真正发挥的作用在于:对函数返回的限定 对函数参数的限定规则一:如果函数没有返回值,那么应声明为void类型我们在编写C/C++程序时,对于任何函数都必须一个不漏地指定其类型。如果函数没有返回值,一定要声明为...
转载
3阅读
0评论
0点赞
发布博客于 7 天前

ISP、IAP、DFU和bootloader

这是嵌入式开发中常用的几个专业术语,其诞生的背景和其具体作用大概如下在很久很久以前,那是8051单片机流行的时代,做单片机开发都需要一个专用工具,就是单片机的编程器,或者叫烧写器。说“烧”写一点不为过,当年的经典芯片AT89C51在编程时需要十几伏的高电压,加在一个特定的引脚上,才能进入编程。对于某款芯片的编程,都有一个特定的时序,这个时序通常在芯片的datasheet里进行描述并以硬件实现。另外在编程器里的也有一个MCU,这其中使用软件产生这个时序,从而对目标芯片进行编程。电脑通过串口把程序发到编程器
转载
79阅读
0评论
0点赞
发布博客于 4 月前

秒懂MOS管选型技巧

目录MOS管选型技巧首先是确定N、P沟道的选择第二步是确定电压第三步为确定电流第四步是确定热要求第五步是确定开关性能第六步为封装因素考量第七步要选择好品牌总结MOS管选型表MOS管选型技巧选择到一款正确的MOS管,可以很好地控制生产制造成本,最为重要的是,为产品匹配了一款最恰当的元器件,这在产品未来的使用过程中,将会充分发挥其“螺丝钉”的作用,确保设备得到最高效、最稳定、最持久的应用效果。那么面对市面上琳琅满目的MOS管,该如何选择呢?下面,我们就分7个步骤来
转载
204阅读
2评论
2点赞
发布博客于 4 月前

【STM32】条件编译不起作用是什么原因

在工程中定义了几个条件编译,用来适应不同的硬件设备,但是好像不起作用似的。这种情况可能是在多个文件中使用了条件编译,但是编译工程的时候又只是编译了部分文件,即使有部分使用了条件编译的文件没有被重新编译。解决办法:1.把所有使用了条件编译的文档全部编译一遍;2.把工程全部编译一遍。...
原创
86阅读
0评论
0点赞
发布博客于 4 月前

SVN快速上手【转载】

选择SVN客户端TortoiseSVN也叫乌龟SVN,Windows上最流行的SVN客户端,安装后你的右键就会多了几个SVN相关的菜单,非常方便Eclipse插件在Eclipse中集成SVN插件,适合使用Eclipse开发的用户,查看使用教程CornerStoneMac上最流行的SVN客户端之一,查看使用教程Versions:Mac上最流行的SVN客户端之一以下教程以TortoiseSVN为例如需视频教程,请访问:视频教程Checkout同步代码项目详情-
转载
43阅读
0评论
0点赞
发布博客于 4 月前

【数据结构】二叉树的构造

所谓构造是指能唯一确定一颗二叉树。任何n(n>0)个不同节点的二叉树,都可由它的(中序序列和先序序列)或(中序序列和后序序列)唯一地确定。先序序列:AB D G C E F中序序列:D G BAE C F后序序列:G D B E F CA我们要知道,中序序列的任何一个节点的左子树和右子树也都是中序序列;前序序列的任何一个节点的左子树和右子树也都是前序序列;后序序列的任何一个节点的左子树和右子树也都是后序序列。为什么必须要有中序序列才能构造二叉树呢?看一下这个过程:...
原创
40阅读
0评论
0点赞
发布博客于 4 月前

有没有简单的PCB设计软件?Altium Designer的替代方案来了!

AD是收费的大型软件,有时候会有版权问题,KiCad是一个开源的EDA软件,且功能强大,简单易用,码上。我为什么将KiCad作为主力EDA软件。PCB设计不要再用AD了,KiCAD更好用。下载链接:这里。新手指引(英文):这里。KiCad介绍 - 跟我学KiCad(免费开源的PCB设计工具)1...
原创
543阅读
0评论
0点赞
发布博客于 4 月前

Java vs. Python:你应该选择哪一个?

This article is how I compare thetwo most popular and powerful programming languages in the world: Java and Python! Both languages have huge community support and libraries to perform almost any programming task, although selecting a programming language .
转载
41阅读
0评论
0点赞
发布博客于 4 月前

【数据结构】二叉树基本概念与代码

目录基本概念树基本术语树的性质二叉树二叉树的性质代码基本概念树基本术语节点的度与树的度:树中一个节点的子树的个数称为该节点的度。树中各节点的度的最大值称为树的度,通常将度为m的树称为m次树或者m叉树。分支节点与叶节点:度不为零的节点称为非终端节点,又叫分支节点。度为零的节点称为终端节点或叶节点(或叶子节点)。孩子节点、双亲节点和兄弟节点:在一棵树中,每个节点的后继节点,被称作该机诶单的孩子节点。响应地,该节点被称作孩子节点的双亲节点(父母节点)。具
原创
74阅读
0评论
0点赞
发布博客于 4 月前

【二次转载】C++前置声明的应用与缺陷

前置声明的使用 有一定C++开发经验的朋友可能会遇到这样的场景:两个类A与B是强耦合关系,类A要引用B的对象,类B也要引用类A的对象。好的,不难,我的第一直觉让我写出这样的代码:// A.h#include "B.h"class A{ B b;public: A(void); virtual ~A(void);}; //A.cpp#include "A.h"A::A(void){} A::~A(void){} // B.h#includ.
转载
40阅读
0评论
0点赞
发布博客于 4 月前

【笔记】python序列化和反序列化-JSON模块

要在不同的编程语言之间传递对象,就必须把对象序列化为标准格式。JSON表示出来就是一个字符串,可以被所有语言读取,也可以方便地存储到磁盘或者通过网络传输。dumps()方法返回一个str,内容就是标准的JSONimport jsond = {'name':'forest','age':23,'score':88}d = dict(name='forest',age=23,score=88)# second method for creating dicta = json.dumps(d)p
原创
40阅读
0评论
0点赞
发布博客于 4 月前

【笔记】python操作文件与目录

Python内置的os模块也可以直接调用操作系统提供的接口函数。
原创
32阅读
0评论
0点赞
发布博客于 4 月前

QT第一个程序

QT的安装,点这里。
原创
42阅读
0评论
0点赞
发布博客于 4 月前

【一天从C到C++】高级篇

目录1.文件和流2.异常处理3.动态内存分配4.命名空间5.模板6.预处理器7.信号处理1.文件和流在头文件<fstream>中打开文件:void open(const char *filename, ios::openmode mode); 其中打开模式如下:模式标志 描述 ios::app 追加模式。所有写入都追加到文件末尾。 ios::ate 文件打开后定位到文件末尾。 ios::in 打开文件用于读取。..
原创
47阅读
0评论
0点赞
发布博客于 4 月前

【一天从C到C++】基础篇

快速入门Hello C++C++标准程序库中的所有标识符都被定义于一个名为std的namespace中,因此要使用using namespace std;输出使用cout#include <iostream>using namespace std;int main(){ cout << "hello C++" << endl; return 0;}输入用cin#include <iostream>using na.
原创
52阅读
0评论
0点赞
发布博客于 4 月前

【转载】C++ 多态的实现及原理

C++的多态性用一句话概括就是:在基类的函数前加上virtual关键字,在派生类中重写该函数,运行时将会根据对象的实际类型来调用相应的函数。如果对象类型是派生类,就调用派生类的函数;如果对象类型是基类,就调用基类的函数 1:用virtual关键字申明的函数叫做虚函数,虚函数肯定是类的成员函数。 2:存在虚函数的类都有一个一维的虚函数表叫做虚表,类的对象有一个指向虚表开始的虚指针。虚表是和类对应的,虚表指针是和对象对应的。 3:多态性是一个接口多种实现,是面向对象的核心,分为类的多态...
转载
30阅读
0评论
0点赞
发布博客于 4 月前

git&github全解

目录本地仓库版本追踪回退版本远程仓库添加秘钥SSH添加远程仓库分支管理标签管理其他git原理:本地包含三个部分:工作区、缓存区、版本库。工作区就是我们操作的文件,修改后的文件add到缓存取,也就是将修改保存到缓存区,缓存区确认无误的话可以commi到版本库,成为一个新的版本。不过这个版本是保存在本地的,怎么协同工作呢?还需要一个远程仓库,可以将本地仓库的内容push到远程仓库,也可以从远程仓库获取,fetch和clone命令拉取到本地仓库,pull命令直接
原创
75阅读
0评论
1点赞
发布博客于 5 月前

ubuntu中MySql环境配置

检查是否有MySQl:sudo netstat -tap | grep mysql安装:sudo apt-get install mysql-server mysql-client安装后是什么什么都没有的,启动和关闭需要通过一下命令来执行:# 启动MySQL$ sudo service mysql start# 关闭MySQL$ sudo service mysql stop# 重启MySQL$ sudo service mysql restart怎么确定打开或者关闭
原创
44阅读
0评论
0点赞
发布博客于 5 月前

ubuntu下python环境搭建

1.安装python环境ubuntu一般是自带python的输入python或python3看有没有相关信息,其中python是python2的版本。有时候可能不是我们想要的版本,我们需要更新一下python版本在 Ubuntu 终端执行以下两条命令即可更新 Python 版本:$sudo apt-get update$sudo apt-get install python3.8对命令的说明:第一条命令用来指定更新 /etc/apt/sources.list 和 /etc/
原创
40阅读
0评论
0点赞
发布博客于 5 月前

【二次转载】ubuntu快捷键

Ubuntu下常用的快捷键Ubuntu中的许多操作在终端(Terminal)中十分的快捷,记住一些快捷键的操作更得心应手。在Ubuntu中打开终端的快捷键是Ctrl+Alt+T。其他的一些常用的快捷键如下:快捷键 功能 Tab 自动补全 Ctrl+a 光标移动到开始位置 Ctrl+e 光标移动到最末尾 Ctrl+k 删除此处至末尾的所有内容 Ctrl+u 删除此处至开始的所有内容 Ctrl+d 删除当前字符 Ctrl+h
转载
43阅读
0评论
0点赞
发布博客于 5 月前

ubuntu常用设置

0.设置界面1.中文输入法下载安装一个搜狗输入法即可,官网下载后有教程,或者搜其他教程也行。2.安装git安装:sudo apt-get install git配置信息:git config --global user.name "Your Name"git config --global user.email "your Email Address"3.显示隐藏文件 ctrl+h4.截图4.1系统自带截图打开但是系统自带的有个问题就是不能编辑.
原创
60阅读
0评论
0点赞
发布博客于 5 月前

【笔记】了解python的Web开发

在Web应用中,服务器把网页传给浏览器,实际上就是把网页的HTML代码发送给浏览器,让浏览器显示出来。而浏览器和服务器之间的传输协议是HTTP。Chrome提供了一套完整地调试工具,非常适合Web开发:更多工具->开发者工具;快捷键ctrl+shift+i。Elements显示网页的结构,Network显示浏览器和服务器的通信(红灯亮着)。HTTP格式POST请求格式POST /path HTTP/1.1Header1: Value1Header2: Value2Heade
原创
47阅读
0评论
0点赞
发布博客于 5 月前

控制台输python却打开windows store:修改windows环境变量或重装

解决办法此电脑->属性->左上侧的高级系统设置->高级->环境变量
原创
55阅读
0评论
0点赞
发布博客于 5 月前

【数据结构】稀疏矩阵的压缩存储

目录关于矩阵稀疏矩阵行优先和列优先稀疏矩阵的压缩存储关于矩阵稀疏矩阵在矩阵中,若数值为0的元素数目远远多于非0元素的数目,并且非0元素分布没有规律时,则称该矩阵为稀疏矩阵;与之相反,若非0元素数目占大多数时,则称该矩阵为稠密矩阵。如这个稀疏矩阵,这个矩阵占用了6*7的元素类型大小,但是里边有大量的0,,即有用信息很有限,因此我们可以只提取其有用信息来对其进行压缩。得到一个坐标及其元素值的表行优先和列优先举例说明:这里有一个数组行优先排列是这样的
原创
140阅读
0评论
0点赞
发布博客于 5 月前

C/C++函数传递二维数组

目录函数参数传递二维数组的问题解决方案1.传递第二维和更高维的大小2.根据数组的存储原理把二位数组当作一维数组来操作(降维处理)函数参数传递二维数组的问题将二维数组当作参数的时候,必须指明所有维数大小或者省略第一维的,但是不能省略第二维或者更高维的大小,这是由编译器原理限制的。在学编译原理的时候知道编译器是这样处理数组的:对于数组 int p[m][n];如果要取p[i][j]的值(i>=0 && i<m && 0<=j &a
原创
425阅读
0评论
3点赞
发布博客于 5 月前

【数据结构】带动画显示过程的递归求解迷宫问题

采用递归算法求解迷宫问题,输出从入口到出口的所有路径。递归求解我真的也不是理解的很透,但是明显感觉到递归和栈、队列求解很像,都是树形的搜索过程。void f(){ //由外到内 f();//递归体 //由内到外}为了直观地观察过程,补充了一个动画过程,可以用来观察算法的搜索过程。从(1,1)走到(8,8),实心圆是不允许走的,空心圆是可以走的部分,星星是走过的路径。#include <stdio.h>#include <stdlib.h>#.
原创
85阅读
0评论
0点赞
发布博客于 5 月前

【数据结构】单链表的递归算法

设计递归算法的方法主要是求递归模型,递归模型的求解类似于(其实就是)数学中的归纳法。递归模型中应该包含递归体和递归出口两部分。代码如下:#include <stdio.h>#define NUM 8int A[NUM] = { 102,102,32,44,202,32,61,56 };int min(int a,int b){ if (a < b)return a; else return b;}int F(int A[], int
原创
75阅读
0评论
0点赞
发布博客于 5 月前

【数据结构】递归和尾递归

目录概念递归什么时候用递归递归和尾递归一般递归尾递归概念递归在定义一个过程或函数时,直接或者间接调用自己的成分,称为(直接/间接)递归。直接递归就不用说了,间接递归如下。间接递归都可以转化为直接递归,因此一般只研究直接递归。什么时候用递归1.定义是递归的许多数学公式、数列的定义是递归的,例如阶乘、Fibonacci数列。2.数据结构是递归的比如不带头结点的单链表3.问题的求解方法是递归的比如Hanoi问题递归和尾递归一般递归
原创
71阅读
0评论
0点赞
发布博客于 5 月前

【数据结构】串的模式匹配-KMP算法

目录概念简述KMP算法原理代码计算next数组KMP算法测试概念简述从s中匹配t串,在BF算法中,通过指针回溯不断进行匹配,其思想是穷举。效率很低,但有些串有一定的规律,不需要回溯s串的指针,这就是KMP算法。比如 s:aaaaaab t: aaab在进行比较时,如果按照BF算法,需要进行最后一次才能匹配成功。但是我们发现s和t串前几位是相同的,不需要重复比较。当然,计算机不会像人这么敏感,但是能否设计出一种算法,提高类似这种模式匹配的...
原创
90阅读
0评论
1点赞
发布博客于 5 月前

一语道破KMP算法计算next数组中k=next[k]的理解

先上定义:主串和模式串免得后面的沟通理解有出入。首先,要理解KMP算法的核心思想:为什么要算next[]数组?数组中每个元素表示什么意思?核心思想就是模式串的某个元素(设为t[i])前的k个元素和该串开头k个元素分别相同,因此如果在模式串的t[i]处匹配失败,模式串的指针没必要完全回溯,只需要回溯到t[k]即可,这样一来主串指针也不用回溯了。而我们用数组就是要记录t[i]位置对应的k值,next数组中每个元素就表示模式串对应位置的前面有k个元素与开头元素分别相等。如果理解了上边这个(.
原创
137阅读
0评论
0点赞
发布博客于 5 月前

【数据结构】串的模式匹配-BF算法

串(或字符串)是由零个或多个字符组成的有限序列。
原创
106阅读
0评论
0点赞
发布博客于 5 月前

keil5配置主题配置文件

修改keill5主题为暗黑主题,很漂亮。
zip
发布资源于 5 月前

顺序队列求解迷宫问题

队头指针:走队尾走过的路——一个一个指向队里的点。队尾指针:探队头四周的可走的路——将队头指向的点的附近的可走的点全部入队。对头指针的作用——保证入队的点的四周都会被扫描一遍。队尾指针——将可走的点入队。他们相辅相成,可以将所有的点都扫描一遍。下代码中,####部分是队头指向一个待扫描四周的点,****部分是队尾扫描四周并将可走的点入队。 /*###############################################################*/ whi
原创
62阅读
0评论
0点赞
发布博客于 5 月前

顺序栈求解迷宫问题

下图所示的迷宫,从(1,1)走到(8,8)int mg[10][10] = { //迷宫 {1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, {1, 0, 0, 1, 0, 0, 0, 1, 0, 1}, {1, 0, 0, 1, 0, 0, 0, 1, 0, 1}, {1, 0, 0, 0, 0, 1, 1, 0, 0, 1}, {1, 0, 1, 1, 1, 0, 0, 0, 0, 1}, {1, 0, 0, 0, 1,.
原创
85阅读
0评论
0点赞
发布博客于 5 月前

【数据结构】循环链表实现环形队列

概念循环链表写循环队列,只用一个队尾指针就够了,因为循环链表中队尾节点的下一个节点就是队首节点。队空条件:队满条件:不考虑进队操作:将新的节点插入到队尾,称为队尾节点,然后队尾指针指向这个新的节点。出队操作:将队尾节点的下一个节点数据取出,并绕过该节点。代码#include <stdio.h>#include <stdlib.h>#include <malloc.h>#define ERROR 0#define OK 1typ
原创
82阅读
0评论
0点赞
发布博客于 5 月前

visual studio操作技巧

1. 【VS2019】按住ctrl+双击:快速转到变量、函数的定义处或声明处。
原创
48阅读
0评论
0点赞
发布博客于 5 月前

【数据结构】单链表实现线性队列

概念队空条件:fron=rear=NULL队满条件:不考虑进队操作:将新的节点插入到链表尾。出队操作:删除链表第一个节点。代码注意出队和入队操作入队操作要考虑到两种情况:1入队前,队为空时,队首和队尾指针都指向新的节点。2.入队后,队不为空,只动队尾指针就行。出队操作要考虑三种情况:1.原队为空,则返回异常。2.原队为只有一个节点,则删除节点后,都指向NULL;3.其他情况,则只操作队尾就行。#include <stdio.h>.
原创
35阅读
0评论
0点赞
发布博客于 5 月前

【数据结构】非循环队列-顺序存储

队列概念队列是对头出、队尾入的先进先出线性表。需要两个指针front和rear分别来指向队头和队尾。front指向队头元素的前一个位置,rear总是指向队尾元素。进队:rear+1出队:front+1队空条件:front=rear队满条件:rear = MaxSize - 1代码#include <stdio.h>#include <stdlib.h>#include <malloc.h>#define E...
原创
44阅读
0评论
0点赞
发布博客于 5 月前

【数据结构】环形队列/循环队列-顺序存储

队列是对头出、队尾入的先进先出线性表。需要两个指针front和rear分别来指向队头和队尾。front指向队头的前一个位置,rear总是指向队尾元素。队空条件:front=rear队满条件:rear = MaxSize - 1进队:rear+1出队:front+1...
原创
107阅读
0评论
0点赞
发布博客于 5 月前

【数据结构】入栈出栈代码-栈的链式存储

基本概念使用带头结点的单链表表示栈,头结点指向的即为栈顶,也就是说入栈就是所谓的头插法入栈,出栈也是从头结点的下一个节点出。空栈条件s->next==NULL栈满条件:由于链表的内存是随时申请和释放的,所以在内存允许的范围内是没有栈满条件的。进栈:将包含数据的节点插入到头结点之后。退栈:将头节点之后的节点删除,并释放其所占内存。代码stack.c/*********************栈的链式存储结构******************************
原创
77阅读
0评论
0点赞
发布博客于 5 月前

【数据结构】入栈、出栈代码-栈的顺序存储

基本概念栈是一种只能在一端进行插入和删除操作的线性表允许进行插入和删除操作的一端称为栈顶,另一端称为栈底。当栈中没有元素时,称为空栈。栈的插入操作称为进栈或入栈;栈的删除操作称为退栈或出栈。栈是先进后出的线性表,即先进展的元素先出栈,比如一个狭窄(只有一个人宽度)的死胡同就类似一个栈,先进去的人只能等最后才能出,这就是先进后出。一个栈应该包括数据部分和栈顶指针,数据部分用来存放数据,栈顶指针用来始终指向栈顶。空栈时,栈顶指针指向-1;当发生入栈时,先栈顶指针加一指向一个新的元素空间,然后
原创
136阅读
0评论
0点赞
发布博客于 5 月前

【眼界】原来数据分析是这么回事

电商平台数据分析方法数据驱动:AB测试AB测试是为Web或App界面或流程制作两个(A/B)或多个(A/B/n)版本,在同一时间维度,分别让组成成分相同(相似)的访客群组(目标人群)随机的访问这些版本,收集各群组的用户体验数据和业务数据,最后分析、评估出最好版本,正式采用。数字化转型(线下->线上)把线下业务放线上,来搜集数据,根据数据进而调整线下业务。数据分析人才缺口大数据分析是工作内容数据分析师分类人货场概念人:客户货:产品场:人货交易平
原创
88阅读
0评论
0点赞
发布博客于 5 月前

【笔记】python网络编程,本地网络通信和访问CSDN首页

网络编程就是如何在程序中实现两台计算机的通信,更确切地说,网络通信是两台计算机上的两个进程之间的通信。TCP/IP协议简介IP协议负责把数据从一台计算机通过网络发送到另一台计算机。数据被分割成一小块一小块,然后通过IP包发送出去。IP协议按块发送,途径多个路由,但不保证能到达,也不保证顺序到达。IP地址的IPV4地址实际上是一个32位整数,IPV6是128位整数。TCP协议则是建立在IP协议之上的。TCP协议负责在两台计算机之间建立可靠连接,保证数据包按顺序到达。TCP协议会通过握手建立连接,然
原创
54阅读
0评论
0点赞
发布博客于 5 月前

【笔记】python海龟绘图

海龟绘图不是画一个海龟是用一个叫海龟的库绘图,而是Python内置了turtle库,turtle是海龟的意思。turtle包本身只是一个绘图库,但是配合Python代码,就可以绘制各种复杂的图形。turtle的坐标体系:乌龟默认在零点,龟头朝向X轴。方法可见turtle库。从这个博文搬过来吧。想玩有意思的,这里有绘图题目可以练习。目录(1)海龟的动作(2)画笔控制(3)海龟状态(4)使用事件(5)特殊海龟方法画几个简单图案吧(1)海龟的动作移动和绘制方法
原创
126阅读
0评论
0点赞
发布博客于 5 月前

【笔记】python图形界面

Python自带图形界面库Tkinter,可以直接使用。Tkinter封装了访问Tk的接口,Tk是一个图形库,支持多个操作系统,使用Tcl语言开发;Tk会调用操作系统提供的本地GUI接口,完成最终的GUI。Hello PythonGUI使用步骤:导入Tkinter包。从Frame派生一个Application类。pack()方法把Widget加入到父容器中,并实现布局。from tkinter import *import tkinter.messagebox as me
原创
115阅读
0评论
0点赞
发布博客于 5 月前

【笔记】python模块速览

有些东西,可能不经常用,尤其对于像我这种刚学的小伙伴来说更是如此。对于这部分内容可以不会用,但是一定要了解有这个东西,知道这个东西是什么,能干什么,当我需要的时候可以想到,这个东西可以派上用场,到时再深入学习也为时不晚。目录常用内建模块Datetimecollectionsbase64structhashlibhmacitertoolscontextliburllibXMLHTMLParser常用第三方模块Pillowrequestscha
原创
43阅读
0评论
0点赞
发布博客于 5 月前

【笔记】python正则表达式

目录有啥用?怎么用?基本语法re模块匹配字符串re.match切割字符串re.split提取子串(分组)贪婪匹配和非贪婪匹配后言有啥用?方便的检查一个字符串是否与某种模式匹配。正则表达式是一种用来匹配字符串的强有力的武器。它的设计思想是用一种描述性的语言来给字符串定义一个规则,凡是符合规则的字符串,我们就认为它“匹配”了,否则,该字符串就是不合法的。比如判断一个字符串是否是合法的Email地址。我们判断一个字符串是否是合法的Email的方法是: 创建
原创
56阅读
0评论
0点赞
发布博客于 5 月前

【python笔记】进程和线程

一、概述每个进程都有自己独立的一块内存空间,一个进程可以有多个线程,进程中的一个执行任务(控制单元),负责当前进程中程序的执行。一个进程至少有一个线程,一个进程可以运行多个线程,多个线程可共享数据。与进程不同的是,同类的多个线程共享进程的堆和方法区资源,但每个线程有自己的程序计数器、虚拟机栈和本地方法栈,所以系统在产生一个线程,或是在各个线程之间作切换工作时,负担要比进程小得多,也正因为如此,线程也被称为轻量级进程。总之,线程是最小的执行单元,而进程由至少一个线程组成。如何调度进程和线程,完全由
原创
16阅读
0评论
0点赞
发布博客于 5 月前

【笔记】文件读写、IO操作

文件读写open() 方法用于打开一个文件,并返回文件对象,在对文件进行处理过程都需要使用到这个函数,如果该文件无法被打开,会抛出 OSError。open() 函数常用形式是接收两个参数:文件名(file)和模式(mode)。使用 open() 方法一定要保证关闭文件对象,即调用 close() 方法。Python引入了with语句来自动帮我们调用close()方法。下边这个代码,并不需要调用f.close()方法。with open('1.txt','r') as f: print
原创
43阅读
0评论
0点赞
发布博客于 5 月前

【笔记】python调试,logging、assert、pdb、pycharm调试

调试少不了最常用的print大法,可以通过打印变量来监控变量在哪里出的问题。python还有其他调试方式。目录loggingassertpdbpdb.set_trace()logging该函数用于输出调试日志到控制到户或者文件(文件用的多),和printf非常相似,最大的不同是该函数可以设置调试信息等级。有debug,info,warning,error等几个级别,右边的级别越高,会将设置的等级及其以上等级的log打印出来。比如设置等级为warining,则只会打印log.e
原创
66阅读
0评论
0点赞
发布博客于 5 月前

【笔记】python异常处理

目录异常异常演示异常类型异常什么是异常?语法是正确的,但在运行它的时候,也有可能发生错误,这种运行期检测到的错误被称为异常。为什么要对异常进行处理?当我们预知当代码运行期间可能发生的错误,就可以在代码中对可能发生的错误进行处理。比如,代码中要求用户输入一个数字作为一个公式的分母,但用户输入了一个0或者输入了一个字母,就会导致异常发生。对于这种可预见的异常进行的处理就叫异常处理。当我们认为某些代码可能会出错时,就可以用try来运行这段代码如果执行出错,则后...
原创
27阅读
0评论
0点赞
发布博客于 5 月前

【数据结构】尾插法和头插法-单链表的创建和销毁

前文《【数据结构】链表元素查找、插入和删除-线性表的链式存储》记过了链表的元素查找、插入和删除,本文记链表的创建。目录头插法和尾插法概述代码头插法尾插法其他测试代码头插法和尾插法概述链表的创建有两种方法,一种是头插法(下图),另一种是尾插法。头插法是直接将头结点的下一个节点交给新节点,然后头结点指向新节点。尾插法是直接让单链表的最后一个节点的指向新节点,然后让新节点指向NULL。尾插法时,千万不要忘了最后一个节点指向NULL,否则会出大错!无论什么...
原创
146阅读
0评论
0点赞
发布博客于 5 月前

【数据结构】链表元素查找、插入和删除-线性表的链式存储

目录头指针和头结点代码查找元素插入元素删除元素头指针和头结点线性链表的存储结构,整个链表的存取必须从头结点开始。头指针指向头结点,头结点的数据域不存放任何数据,也可以存储线性表长度等信息,头结点的指针域存储指向第一个节点的指针。头结点的作用:防止单链表是空的而设的,当链表为空的时候,带头结点的头指针就指向头结点,如果当链表为空的时候,单链表没有带头结点,那么它的头指针就为NULL。 是为了方便单链表的特殊操作,能有效减少代码量,在插入在表头或者删除第一个结点时不
原创
226阅读
0评论
0点赞
发布博客于 5 月前

visual studio 多文件工程【源码目录】

工程打了之后要把代码模块化分的很清楚。一下以visual studio2019示例一个多代码文件组织方法。在解决方案资源管理器中,有我们的工程代码。右击工程名,新建一个filter(其实就是一个文件夹)program。然后在这个文件夹下面再建两个文件夹,一个main一个drive,然后把含有主函数的C文件挪到main文件中。在drive中一个source文件夹一个include文件夹,分别用来放其他代码的C文件和h文件,我这里放了一个顺序表的sqlist.c和sqlist.h文件。
原创
97阅读
0评论
0点赞
发布博客于 5 月前

【数据结构】线性表的顺序表

拖延了好久了,终于开始动手了....大二就想要学数据结构,还为此专门找了计科专业的同学借了他们的课本,但是看了一些然后太枯燥(没找对方法)没看的下去。一转眼,两年多过去了,我今年已经毕业了,我还在原地踏步,呵呵。目录线性表基本概念代码创建顺序表插入元素删除元素定位查找元素其他函数测试代码线性表基本概念定义:线性表是一个具有相同特性的数据元素的有限序列。(相同特性:所有元素数据属于同一数据类型)线性表的存储结构:顺序存储结构、链式存储结构(单链表、双链表、循环链
原创
61阅读
0评论
0点赞
发布博客于 5 月前

malloc、calloc、realloc的区别

(1)C语言跟内存分配方式<1>从静态存储区域分配. 内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在.例如全局变量、static变量.<2>在栈上创建 在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放.栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限.<3>从堆上分配,亦称动态内存分配. 程序在运行的时候用malloc或new申请任意...
转载
16阅读
0评论
0点赞
发布博客于 5 月前

【笔记】python枚举类和元类

目录枚举枚举的定义和遍历枚举的别名和unique元类type()metaclass枚举Python中的枚举是作为一个类存在的,这是与其他语言的一个较为鲜明的特征,总结它的用法特点如下:1. Python枚举作为一个类存在,使用它需要首先导入枚举模块,然后继承并自定义需要的枚举类; 2. 导入枚举模块可以是Enum(枚举值可以是字符串或整型),也可以是IntEnum(枚举值只能是整型); 3. 枚举类不允许存在相同的标签;但是允许不同标签的枚举值相同,这样后者相当于..
原创
100阅读
0评论
0点赞
发布博客于 5 月前

IoT开发学习指导

物联网,英文为 “Internet of Things”,顾名思义物物相连的互联网。本质上,物联网的核心及基础仍然是互联网,只是终端不再是计算机,而是嵌入式计算机系统及其配套的传感器,其用户端延伸和扩展到了物品与物品之间,进行信息交换和通信,也就是物物相息。对于标准的物联网系统,可以分为四层:感知识别层、网络构建层、管理服务层和综合应用层。对于以下知识点总结,如果你有好的总结及优化建议,欢迎发送邮件至mobilehub@csdn.net,技术之路,我们共同进步。###感知识别层:采集信息感知
转载
144阅读
1评论
0点赞
发布博客于 5 月前

【笔记】python多重继承和定制类

目录多重继承定制类__str____iter____getitem____getattr____call__多重继承什么是多重继承?所谓多重继承,就是一个子类可以同时继承多个父类。为什么需要多重继承?使用不同的分类方法,一个子类可能属于不同的父类,那么这个子类就可以继承多个父类。在设计类的继承关系时,通常,主线都是单一继承下来的,如果需要“混入”额外的功能,通过多重继承就可以实现,这种设计通常称之为MixIn。比如,一只狗,按照动物分类,它属于哺.
原创
29阅读
0评论
0点赞
发布博客于 5 月前

【笔记】python面向对象搞基编程(__slots__,property)

在前文《【笔记】python面向对象-类和实例(详述类和实例属性和方法的绑定)》的数据封装那节写过如何给类和实例动态绑定属性和方法。那如果我们想要限制实例的属性怎么办?比如,只允许对Student实例添加name和age属性。在定义class的时候,定义一个特殊的__slots__变量,来限制该class实例能添加的属性。目录__slots__@property练习__slots____slots__接收一个元组,元组中的字符串表示的属性为允许添加的属性。如果添加了未被允许的属性
原创
32阅读
0评论
0点赞
发布博客于 5 月前

python中_, __ 和 __xx__的区别

When learning Python many people don't really understand why so much underlines in the beginning of the methods, sometimes even in the end like__this__! I've already had to explain it so many times, it's time to document it.One underline in the beginnin.
转载
40阅读
0评论
0点赞
发布博客于 5 月前

【笔记】python装饰器超全详解

由于函数也是一个对象,而且函数对象可以被赋值给变量,所以,通过变量也能调用该函数。函数可以被赋值给其他变量 函数可以被删除 可以在函数里面再定义函数,函数嵌套。 函数可以作为参数传递给另外一个函数 函数可以作为另一个函数的返回值所谓装饰,就是接收一个东西,然后加上一些东西后还回去。装饰器就是干这种事的。目录1.最简单的装饰器2.使用@符号代替装饰语句3.使用多个装饰器4.带参数的装饰器5.类装饰器6.带参数的类装饰器1.最简单的装饰器def decorat
原创
75阅读
0评论
0点赞
发布博客于 5 月前

pycharm进入和退出控制台console

PyCharm是有交互式界面的进入PyCharm console在代码页面右击,选择如下然后就可以再python控制台进行编程了(和matlab很像哈哈)退出PyCharm consolePyCharm console适合控制台编写代码,但是不适合运行脚本代码,因为每次运行他都会跳出来一个界面,有时候不小心进入了PyCharm console还很尴尬。退出步骤如下取消掉run with Pychon Console 并勾选Emulata terminal in o
原创
515阅读
0评论
0点赞
发布博客于 5 月前

【笔记】python获取对象信息

拿到一个对象的引用时,如何知道这个对象是什么类型、有哪些方法?目录type()isinstance()dir()type()type()函数返回对应的Class类型。判断一个对象是否是函数用types模块中的各种类型作对比。>>> import types>>> def fn():... pass...>>> type(fn)==types.FunctionTypeTrue>>> typ
原创
70阅读
0评论
0点赞
发布博客于 5 月前

【笔记】python继承和多态

目录继承多态静态语言和动态语言继承我们定义一个class的时候,可以从某个现有的class继承,新的class称为子类(Subclass),而被继承的class称为基类、父类或超类(Base class、Super class)子类继承了父类的的属性和方法。继承可以把父类的所有功能都直接拿过来,这样就不必重零做起,子类只需要新增自己特有的方法,也可以把父类不适合的方法覆盖重写。比如下方这个代码,Student类继承了Person类,通过Student实例化的对象中包含了Perso
原创
105阅读
0评论
0点赞
发布博客于 5 月前

【笔记】python面向对象-类和实例(详述类和实例属性和方法的绑定)

面向对象的设计思想是抽象出Class,根据Class创建Instance。面向对象的抽象程度比函数要高,因为一个Class既包含数据,又包含操作数据的方法。数据封装、继承和多态是面向对象的三大特点。目录类和实例创建类创建实例数据封装小结访问限制私有属性私有属性的管理练习类和实例类是一个抽象的模板,可以根据类创建实例。创建类定义类是通过class关键字,类名首字母大写,紧接着是(object),表示该类是从哪个类继承下来的,如果没有继承的类,就写obj.
原创
91阅读
0评论
0点赞
发布博客于 5 月前

【笔记】python模块

在Python中,一个.py文件就称之为一个模块(Module)。目录创建一个hello.py文档作用域安装第三方模块模块搜索路径创建一个hello.py文档hello.py :#!/usr/bin/env python3# -*- coding: utf-8 -*-' a test module '__author__ = 'Forest Li'import sysdef test(): args = sys.argv if len(ar
原创
49阅读
0评论
0点赞
发布博客于 5 月前

【笔记】python高阶函数(返回函数、匿名函数、装饰器、偏函数)

返回函数函数作为返回值python的函数可以作为返回值,def sum(*args): def f(): sum = 0 for x in args: sum += x return sum return ff1 = sum(1,2.3,5,8,5)f2 = sum(2,5,6,74,8,5,5,6,41)print(f1())print(f2())内部函数可以调用外部函数的参数和局部变量,当
原创
21阅读
0评论
0点赞
发布博客于 5 月前

【笔记】python高阶函数(map/reduce,filter,sorted)

map函数接收两个参数,一个是函数,一个是Iterable(可迭代对象),它将传入的函数依次作用到序列的每个元素,并把结果作为新的Iterator(迭代器)返回。l其实本质上就是一个映射函数,需要输入映射关系以及输入的参数。什么是可迭代对象?一类是集合数据类型,如list、tuple、dict、set、str等;一类是generator,包括生成器和带yield的generator function。注意返回值是一个迭代器!...
原创
29阅读
0评论
0点赞
发布博客于 5 月前

【笔记】python迭代和生成,杨辉三角

目录迭代迭代列表和元组迭代字典迭代字符串索引下标练习列表生成式列表生成式练习迭代遍历我们称为迭代。迭代列表和元组list1 = [1,2,2,3,54,'forest',45]tupl1 = (2,3,5,6,45,'li',87)for x in list1: print(x,end = ' ')print()for x in tupl1: print(x,end = ' ')迭代字典对于字典(dict),默认情况下
原创
75阅读
0评论
0点赞
发布博客于 5 月前

【MCP3208/MCP3204】STM32多通道AD采集,有源码

芯片简介MCP3208/MCP3204是一种片外12位精度的AD采集芯片,前者是8通道,后者是4通道,其他的都一样。找不到该芯片的中文手册的点这里。引脚定义时序结合手册5.0章节的说明看时序图。电平状态稳定时间可以看到,最短稳定时间的最长的为500ns(0.5us),均小于1us,只要在程序中保证引脚的电平稳定时间至少超过1us即可。控制位第一个CS拉低且Din拉高的信号为起始位。紧跟着其实位的是Single/Diff位、以及D0 D1 D2位。起
原创
371阅读
0评论
0点赞
发布博客于 5 月前

【笔记】python函数

python函数创建一个函数在Python中,定义一个函数要使用def语句,依次写出函数名、括号、括号中的参数和冒号:,然后,在缩进块中编写函数体,函数的返回值用return语句返回。例如定义一个求绝对值的函数def my_abs(x): if x<0 : return -x else : return x空函数如果想定义一个什么事也不做的空函数,可以用pass语句:def nop(): passpass语句什么都
原创
688阅读
0评论
0点赞
发布博客于 5 月前

【笔记】python控制语句

赋值号右边的表达式会在赋值变动之前执行,右边表达式的执行顺序是从左往右的。如下是生成一个斐波纳契数列a,b=0,1while b < 10 : print(b) b,a = a+b,b1. 条件语句if condition_1: statement_block_1elif condition_2: statement_block_2else: statement_block_3注意:1、每个条件后面要使用冒号:,表...
原创
66阅读
0评论
0点赞
发布博客于 5 月前

【笔记】python集合set

集合的基本概念集合(set)是一个无序的不重复元素序列,与数学的集合思想相似,当创建的元素中有重复时,会去掉重复。可以使用大括号{ }或者set()函数创建集合,注意:创建一个空集合必须用set()而不是{ },因为{ }是用来创建一个空字典。创建之后的集合并不是一定按照代码里的顺序排列的,集合是无序序列。set1={23,43,'good','Tom',23,'Tom'} #创建集合print(set1)if 23 in set1 : #快速判断元素是否...
原创
53阅读
0评论
0点赞
发布博客于 5 月前

【笔记】python字典

字典是另一种可变容器模型,且可存储任意类型对象。格式如下d = {key1 : value1, key2 : value2, key3 : value3 }键必须是唯一的,但值则不必。字典值可以是任何的 python 对象,既可以是标准的对象,也可以是用户定义的,但键不行。值可以取任何数据类型,但键必须是不可变的,如字符串,数字。字典的创建、访问、修改、删除如下dict1 = {'name':'forest','years':24} #创建字典。print("dict1['nam.
原创
20阅读
0评论
0点赞
发布博客于 5 月前

【笔记】python列表和元组

1 概念列表是一种序列,序列是Python 中最基本的数据结构。序列中的每个值都有对应的位置值,称之为索引,第一个索引是 0,第二个索引是 1,依此类推。Python 有 6 个序列的内置类型(字符串、列表、元组、字典、集合等),但最常见的是列表和元组(不可修改的列表)。列表都可以进行的操作包括索引,切片,加,乘,检查成员。列表是一些变量组成的序列,这些变量可以是数字、字符串、列表、集合等等,一且皆可列,如下。set1={1,2,3.5,3}#集合list1=[1,2,'nihao',45]
原创
71阅读
0评论
0点赞
发布博客于 5 月前

【笔记】python字符串

python中单引号和双引号相同。在Python3中,所有的字符串都是Unicode字符串。访问字符串中的值变量[头下标:尾下标:步长] 默认是1转义字符转义字符 描述 \(在行尾时) 续行符 \\ 反斜杠符号 \' 单引号 \" 双引号 \a 响铃 \b 退格(Backspace) \000 空
换行 \v 纵向制表符 \t 横向制表符 \r 回车 \f ..
原创
32阅读
0评论
0点赞
发布博客于 5 月前

【笔记】python数字及运算

数字类型整型 没有大小限制浮点型 也可以用科学计数法表示,如 2.5e+2 = 2.5 x 102= 250 (正号可以省略,负号不可以)复数复数的实部a和虚部b都是浮点型数学常量 pi 圆周率 e 自然常熟数字类型转换 int(x)将x转换为一个整数。 float(x)将x转换到一个浮点数。 complex(x)将x转换到一个复数,实数部分为 x,虚数部分为 0。 complex(x...
原创
81阅读
0评论
0点赞
发布博客于 5 月前

【笔记】python运算符

很多都是通的,这里只记比较特殊的。算数运算符+、-、*、/、%、**、/// 表示一般除法(结果可以为浮点型)// 表示整除,向下取整** 表示幂运算 a**b类似于C语言的a^b比较运算符==、!=、>、<、>=、<=赋值运算符=、+=、-=、*=、/=、%=、**=、//=、:=:= 海象运算符,可在表达式内为变量赋值。位运算符位与 &、位或 |、位异或 ^、位取反 ~、左移 <<、右移 >>逻.
原创
63阅读
0评论
0点赞
发布博客于 5 月前

【python笔记】python数据类型速览

基本数据类型Python 中的变量不需要声明,也不需要声明类型,使用前都必须赋值。允许同时为多个变量赋值a,b,c=1,2.3,'forest'd=e=f=5+4jprint(a,b,c,d,e,f)标准数据类型Python3 中有六个标准的数据类型:不可变数据(3 个):Number(数字)、String(字符串)、Tuple(元组);可变数据(3 个):List(列表)、Dictionary(字典)、Set(集合)。Number(数字) int、float、b
原创
55阅读
0评论
0点赞
发布博客于 5 月前

【python笔记】基本语法速览

一、基本环境1.标识符不允许首字母是数字2.保留字不能作为标识符,如下查看保留字import keyword keyword.kwlist3.注释符为 #
原创
31阅读
0评论
0点赞
发布博客于 5 月前

STM32-快速上手SPI

1 概述基本的部分前文《STM32-SPI》已经介绍过了,这里只记怎么用。1.1 引脚映射STM32F103ZET6的三个SPI的引脚分别为SPI1_SCK PA5(21) SPI1_MISO PA6 (22) SPI1_MOSI PA7 (23) SPI1_NSS PA4(20)SPI2_SCK PB13(34) SPI2_MISO PB14(35) SPI2_MOSI PB15(36) SPI2_NSS PB12(33)SPI3...
原创
58阅读
0评论
0点赞
发布博客于 5 月前

【CRC简记式】x8 + x2 + x + 1的多项式为什么是07

下面是常用的CRC多项式表,其中这里的多项式一列又称简记式。可以发现比如第一个x4+ x + 1似乎应该表示为10011,即为0x13,这里为什么写0x03呢?这是因为生成多项式的最高幂次项系数是固定的1,故在简记式中,将最高的1统一去掉了!CRC算法名称 多项式公式 宽度 多项式 初始值 结果异或值 输入反转 输出反转 CRC-4/ITU x4+ x + 1 4 03 00 00 true true CRC..
原创
300阅读
0评论
0点赞
发布博客于 5 月前

STM32-SPI

1 SPI概述SPI是高速全双工同步串行通信接口,主要应用在EEPROM,FLASH,实时时钟,AD 转换器,还有数字信号处理器和数字信号解码器之间。1.1 接口SPI主要有四根线MOSI、MISO、SCK、CS。MISO:主设备输入/从设备输出引脚。该引脚在从模式下发送数据,在主模式下接收数据。 MOSI:主设备输出/从设备输入引脚。该引脚在主模式下发送数据,在从模式下接收数据。 SCK:串口时钟,作为主设备的输出,从设备的输入 CS:片选引脚,一般由主设备控制。1.2 通信.
原创
187阅读
0评论
0点赞
发布博客于 5 月前

STM32-SPI的NSS详解

区分开内部NSS和NSS外部引脚的区别,内部NSS的电平状态决定了设备的主从模式,内部NSS状态可以由NSS外部引脚控制,也可以由控制寄存器的SSI位控制。内部NSS决定了主模式还是从模式,它可以通过设置SSM位选择硬件管理或是软件管理,如下图。NSS外部引脚,主要作为输入引脚。如果是硬件管理(SSM=0),则当NSS引脚为低电平的时候,NSS状态为从模式,否则为主模式;如果是软件管理(SSM=1),内部NSS则由SSI位决定,STM设置NSS引脚的软件管理是为了可以将NSS引脚空出来,像.
原创
225阅读
0评论
0点赞
发布博客于 5 月前

【python】Hello python

努力拥抱新事物!编译环境下载https://www.python.org/编辑器python自带IDLE编辑和运行Visual Studio Code文本编辑 + 控制台命令运行Hello python1.直接shell环境编辑运行。输入python就进入python环境,可以输入代码运行。进入和退出环境如下图。windows控制台进入和退出pthon环境2.脚本编辑运行。创建.py文件并编写代码,进入到代码路径下(代码路径最好不要放的太深,直接放在盘符下边就行),.
原创
82阅读
0评论
0点赞
发布博客于 5 月前

【随手记】Windows控制台常用命令

切换目录切换盘符: 盘符加冒号查看路径下文件夹和子文件 dir切换目录 cd
原创
20阅读
0评论
0点赞
发布博客于 5 月前

【通信协议】IIC通信

1 IIC总线概述IIC总线是由数据线SDA和时钟线SCL构成的串行总线,可发送和接收数据。在总线上一般有几个主机(也可以多个),和多个从机。从机一般不主动发送数据,主机发送数据,数据包中包含有从机地址,主机通过从机地址对从机进行操作。2 IIC通信协议1.空闲状态时钟线和数据线都为高电平(称为释放总线)。时钟线SCL由主机控制。2.起始信号在SCL高电平期间SDA下降沿,前后应该保持数据线和时钟线稳定超过4.7us。3.停止信号在SCL高电平期间SDA上升沿,前后应
原创
33阅读
0评论
0点赞
发布博客于 5 月前

STM32-DAC生成1Hz三角波【DAC触发方式深入理解】

前文《STM32-一文搞懂DAC》的1.2节对触发方式进行了详细的说明,也简单介绍了三角波的生成原理。本文记如何配置一定频率的三角波以及为什么这么配置。1 概述三角波的数据生成是由一个单独的计数器往复加减生成的,每次触发之后该计数器会加1/减1。在每个周期过峰值之前,每次触发条件之后加1;过峰值之后,每次触发条件之后减1。但是要先想生成三角波必须以固定的周期加减其输出幅度!也就是以固定的周期触发转换!怎么办呢?谁可以让它以固定的周期?哈哈蛤,定时器!通过设定三角波计数器最大值、定时器触发周期,就可以
原创
516阅读
7评论
4点赞
发布博客于 5 月前

DAC输出1Hz三角波【STM32】

利用STM32的DAC模块1,生成一个1Hz的三角波。代码简洁不冗杂,一看就懂!代码简洁不冗杂,一看就懂!代码简洁不冗杂,一看就懂!
zip
发布资源于 5 月前

STM32-快速上手DAC

关于DAC的模块分析在《STM32-一文搞懂DAC》已经记过了,这里只记快速使用。1 概述STM32的DAC模块只存在于大容量产品中,是12位数字输入,电压输出的数字/模拟转换器,2个输出通道,每个通道都有单独的转换器,支持双DAC模式。DAC可以通过引脚输入参考电压VREF+以获得更精确的转换结果。DAC模块在APB1时钟下!2 配置步骤(1)DAC模块时钟使能(在APB1下)、输出IO端口时钟使能(APB2下)。 void RCC_APB1PeriphClockCmd(uint32_
原创
70阅读
0评论
0点赞
发布博客于 5 月前

STM32-一文搞懂DAC

所谓DAC,就是数(Digital)模(Analog)转换,将数字信号转换为模拟信号。1.STM32的DAC概述STM32的DAC模块是12位数字输入,电压输出的数字/模拟转换器,2个输出通道,每个通道都有单独的转换器。在双DAC模式下,2个通道可以独立地进行转换,也可以同时进行转换并同步地更新2个通道的输出。DAC可以通过引脚输入参考电压VREF+以获得更精确的转换结果。注意:STM32的DAC模块只存在于大容量产品中(FLASH容量在256K~512K之间的)。1.1主要特性2个D.
原创
431阅读
0评论
2点赞
发布博客于 5 月前

STM32-快速上手DMA

关于STM32的DMA的详细介绍见前文,另外可以参考这篇通俗易懂的文章。1.概述DMA传输是内核授权总线给DMA控制器,把数据传输的工作交给DMA控制器来进行管理的一种数据传输方式。关键的参数是需要指定数据源地址、目标地址、传输的数据个数。2. 配置步骤2.1 抽象的配置过程DMA通道x的配置步骤如下:1. 在DMA_CPARx寄存器中设置外设寄存器的地址。发生外设数据传输请求时,这个地址将是数据传输的源或目标。2. 在DMA_CMARx寄存器中设置数据存储器的地址。发生外设数据
原创
63阅读
0评论
1点赞
发布博客于 5 月前

STM32-一文搞懂DMA

1. DMA简介直接存储器存取(DMA,Direct Memory Access)用来提供在外设和存储器之间或者存储器和存储器之间的高速数据传输。无须CPU干预,数据可以通过DMA快速地移动,节省CPU资源。DMA传输本质上是一种CPU进行权力下放的方式,将一些本来需要CPU处理的繁琐事务经过交代(配置DMA)之后全权交给DMA控制器处理。DMA 传输对于高效能嵌入式系统算法和网络是很重要的。在实现DMA传输时,是由DMA控制器直接接管总线,因此,存在着一个总线控制权转移问题。即DMA传输前,CPU
原创
104阅读
0评论
0点赞
发布博客于 5 月前

STM32-快速上手ADC

STM32的ADC模块的架构分析在这里,这里只怎么用。
原创
114阅读
1评论
0点赞
发布博客于 5 月前

STM32-一文搞懂ADC

STM32 拥有 1~3 个 ADC(STM32F101/102 系列只有 1 个 ADC,F103系列至少有两个ADC),这些 ADC 可以独立使用,也可以使用双重模式(提高采样率)。STM32 的12位ADC是一种逐次逼近型模拟数字转换器,它有多达18个通道,可测量16个外部和2个内部信号源。各通道的A/D转换可以单次、连续、扫描或间断模式执行。ADC的结果可以左对齐或右对齐方式存储在16位数据寄存器中。模拟看门狗特性允许应用程序检测输入电压是否超出用户定义的高/低阀值。ADC的输入时钟不得超过14MH
原创
475阅读
0评论
0点赞
发布博客于 5 月前

STM32-电源【ADC供电、VDDA、VSSA、VREF、VBAT等】

了解电源之前,先来简单了解一下各种电源端口的命名VCC:C=circuit表示电路的意思,即接入电路的电压。VDD:D=device表示器件的意思,即器件内部的工作电压。VSS:S=series表示公共连接的意思,通常指电路公共接地端电压。GND:在电路里常被定为电压参考基点。VEE:负电压供电;场效应管的源极(S)VPP:编程/擦除电压。V*与V*A的区别是:数字与模拟的区别数字电路供电VCC模拟电路供电VCCA更多的(点这里)。目录STM32供电方案一览...
原创
2275阅读
0评论
2点赞
发布博客于 6 月前

VCC、VDD、VSS、VDDA等区别

VCC:C=circuit表示电路的意思,即接入电路的电压;VDD:D=device表示器件的意思,即器件内部的工作电压;VSS:S=series表示公共连接的意思,通常指电路公共接地端电压。GND:在电路里常被定为电压参考基点。VEE:负电压供电;场效应管的源极(S)VPP:编程/擦除电压。V*与V*A的区别是:数字与模拟的区别数字电路供电VCC模拟电路供电VCCACC与DD的区别是:供电电压与工作电压的区别(通常VCC>VDD)VDD是指工作电...
转载
1000阅读
0评论
0点赞
发布博客于 6 月前