STM32之串口通信
STM32之串口通信1. 背景知识一般情况下,设备之间的通信方式可以分成并行通信和串行通信两种。
并行通信
传输原理:数据各个位同时传输。
优点:速度快
缺点:占用引脚资源多
串行通信
传输原理:数据按位顺序传输。
优点:占用引脚资源少
缺点:速度相对较慢
2. 串行通信按照数据传送方向分类
单工:数据传输只支持数据在一个方向上传输
半双工:允许数据在两个方向上传输。但是,在某一时刻,只允许数据在一个方向上传输,它实际上是一种切换方向的单工通信,它不需要独立的接收端和发送端,两者可以合并一起使用一个端口。
全双工:允许数据同时在两个方向上传输。因此,全双工通信是两个单工通信方式的结合,需要独立的接收端和发送端
按照通信方式分类
同步通信:带时钟同步信号传输,比如SPI,I2C通信接口
异步通信:不带时钟同步信号,比如UART(通用异步收发器),单总线
在同步通信中,收发设备上方会用一根信号线传输信号,在时钟信号的驱动下双方进行协调,同步数据。例如,通信中通常双方会统一规定在时钟信号的上升沿或者下降沿对数据线进行采样,
在异步通信中不使用时钟信号进行数据同步, ...
STM32之OLED显示
STM32之OLED显示
本篇纯属记录代码
1.OLED.h12345678910111213#ifndef __OLED_H#define __OLED_Hvoid OLED_Init(void);void OLED_Clear(void);void OLED_ShowChar(uint8_t Line, uint8_t Column, char Char);void OLED_ShowString(uint8_t Line, uint8_t Column, char *String);void OLED_ShowNum(uint8_t Line, uint8_t Column, uint32_t Number, uint8_t Length);void OLED_ShowSignedNum(uint8_t Line, uint8_t Column, int32_t Number, uint8_t Length);void OLED_ShowHexNum(uint8_t Line, uint8_t Column, uint32_t Number, uint8_t Length);v ...
数字图像处理之形态学处理
数字图像处理之形态学处理1.概述形态学操作是根据图像形状进行的简单操作。一般情况下对二值化图像进行的操作。需要输入两个参数,一个是原始图像,第二个被称为结构化元素或核,它是用来决定操作的性质的。两个基本的形态学操作是腐蚀和膨胀。他们的变体构成了开运算,闭运算,梯度等。
通用函数
1morphologyEx(Mat src, Mat dst, int op, Mat kernel)
src:输入图像
dst:输出图像
op:模式
kernel:卷积核(和上一篇一样的获取方法)
模式
MORPH_ERODE = 0:腐蚀
MORPH_DILATE = 1:膨胀
MORPH_OPEN = 2:开造作
MORPH_CLOSE = 3:闭操作
MORPH_GRADIENT = 4:基本梯度
MORPH_TOPHAT = 5:顶帽
MORPH_BLACKHAT = 6:黑帽
2.腐蚀这个操作会把前景物体的边界腐蚀掉(但是前景仍然是白色)。
根据卷积核的大小靠近前景的所有像素都会被腐蚀掉(变为 0),所以前景物体会变小,整幅图像的白色区域会减少。这对于去除白噪声很有用,也可以用来断开两个连在 ...
数字图像处理之阈值分割
数字图像处理之阈值分割1.直方图阈值分割算法描述:根据图像灰度直方图,人工寻找阈值
算法特点:适用于双峰直方图
代码
1234567891011plt.hist(img.ravel(), 256, [0, 256])plt.show()plt.hist(img.flatten(), np.arange(-0.5, 256, 1), color='g')plt.show()_, img_bin = cv.threshold(img, 125, 255, cv.THRESH_BINARY) #二值化_, img_bin = cv.threshold(img, 125, 255, cv.THRESH_BINARY_INV) #inverseshow(img_bin)#使用白色背景inverseshow(img_bin)
2.三角法阈值分割算法思想:几何法,适用单峰图像
123th, img_bin = cv.threshold(img, 0, 255, cv.THRESH_TRIANGLE)print(th) #自动找到的阈值分割点show(np.hstack([i ...
数字图像处理之图像边缘
数字图像处理之图像边缘1.Prewitt、Roberts算子Prewitt算子检测水平或者竖直方向的梯度
特点:有正有负,和为0,有水平竖直两种
效果:均匀的部分接近零,变化大的部分数值大。可以描绘边缘
竖直与水平两种算子
\left[
\begin{array}{c}
-1&-1&-1\\
0&0&0\\
1&1&1\\
\end{array}
\right]
\quad
\left[
\begin{array}{c}
-1&0&1\\
-1&0&1\\
-1&0&1\\
\end{array}
\right]效果
合成梯度为绝对值相加,或者平方和开根号,前者运算更快
锐化:将原图加上边缘,突出边缘
代码实现
123456789101112kx = np.array([[-1, 0, 1], [-1, 0, 1], [-1, 0, 1]], dtype=np.float32)ky = np.array([[-1, -1, -1], [0, 0, 0], [1, 1, 1]], dtype=np.float32) #两个算子imgX = cv.filter2D(img, cv.C ...
数字图像处理之图像模糊
数字图像处理之图像模糊减弱或消除噪声
卷积卷积是两个变量在某范围内相乘后求和的结果。
使用的较小的矩阵叫卷积核,也叫滤波器、算子
卷积后矩阵会缩小,即缺少边缘,可通过一定方法填充
123456img = np.ones((5,5)) #图像kernel = np.ones((3,3)) #卷积核img2 = cv.filter2D(img, -1, kernel) #进行卷积 #(原图像,数据类型,卷积核) -1代表与原图相同数据类型print(img2)
均值模糊均值卷积核
\frac 1{M*N}
\left[
\begin{array}{c}
1&1&\cdots&1\\
1&1&\cdots&1\\
\vdots&\vdots&\ddots&\vdots\\
1&1&\cdots&1
\end{array}
\right]1234567891011#使用卷积核K = np.ones((3,3)) / 9 #1/9的滤波器img1 = cv.filter2D(img, -1, K)#使用blur函数img2 = cv.blur(img, (3,3)) #(3,3)为卷积核 ...
数字图像处理之图像几何变换
数字图像处理之图像几何变换1.裁剪、放大、缩小裁剪实现:数组选择方法(冒号)
123img = cv.imread('pic/rabbit500x333.jpg')rabbit = img[150:450, 50:300, :] #选取范围,行列层,即yxshow(rabbit)
放大缩小实现:resize( ) 函数
12345# opencv x, y 在openCV中顺序是xyimg2 = cv.resize(img, (500, 400))show(img2)img3 = cv.resize(img, (500, 400), interpolation=cv.INTER_NEAREST) #使用特定差值方法
不同插值方式差距不大
放大选用 cv.INTER_LINEAR
缩小选用 cv.INTER_AREA
2.平移变换实现:平移矩阵
\left\{
\begin{aligned}
x & = x_0 +Δx \\
y & = y_0 +Δy
\end{aligned}
\right.
\left[
\begin{array}{c}
x \\
y ...
数字图像处理之图像基础
数字图像处理之图像基础1.二值图、灰度图、彩色图二值图:只有两种取值,黑白
灰度:对8位灰度图,有256中取值,0为黑色、255为白色
彩色:真彩色:RGB通道各有8位
假彩色:8位表示256种颜色
通常用8位表示图像,是无符号的,负数或者大于255的数将会通过运算循环到0~255范围内
2.图像的矩阵表示灰度图用二维矩阵表示,RGB彩色图用三维矩阵表示。
分辨率概念:下图为4x2的分辨率
下为灰度图的矩阵和图像
[ [ 0 50 100 200 ]
[ 255 200 150 20 ] ]
下为RGB的矩阵和图像
[[[255,127,255,255],
[127,255,0,255]],
[[127,0,0,255],
[127,255,127,0]],
[[127,255,127,0],
[255,127,127,255]]]
代码函数
12345678910import numpy as npimport matplotlib.pyplot as plti ...
STM32之定时器PWM
STM32之定时器PWM1.TIM定时器简介
TIM(Timer)定时器
定时器可以对输入的时钟进行计数,并在计数值达到设定值时触发中断
16位计数器、预分频器、自动重装寄存器的计时单元,在72MHz计数时钟下可以实现最大59.65s的定时(STM32支持级联的功能,即将输出接入下一个的输入)
不仅具备基本定时中断功能,而且包含内外时钟选择、输入捕获、输出比较、编码器接口、主从触发模式等多种功能
根据复杂度和应用场景分为了高级定时器、通用定时器、基本定时器三种类型
定时器类型
类型
编号
总线
功能
高级定时器
TIM1、TIM8
APB2
拥有通用定时器全部功能,并额外具有重复计数器、死区生成、互补输出、刹车输入等功能(这些功能主要用于三相无刷电机驱动)
通用定时器
TIM2、TIM3、TIM4、TIM5
APB1
拥有基本定时全部功能,并额外具有内外时钟源选择、输入捕获、输出比较、编码器接口、主从触发模式等功能
基本定时器
TIM6、TIM7
APB1
拥有定时中断、主模式触发DAC的功能
STM32F103C8T6定时器资源:TIM1、TIM2、 ...
python数字图像处理基础
基础知识一、numpy1.简介NumPy(Numerical Python) 是 Python 语言的一个扩展程序库,支持大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库。
一个强大的N维数组对象 ndarray
广播功能函数
整合 C/C++/Fortran 代码的工具
线性代数、傅里叶变换、随机数生成等功能
2.数组创建数组类型Numpy中的数组的使用和python中列表非常类似,区别如下:
列表可以存储多种数据类型,numpy只能存储相同数据类型。
数组可以是多维的,当数据类型是数值类型时,相当于线性代数中的矩阵,是可以进行相互间的运算的。
三个属性
数据类型 dtype
维度 ndim 有几个方括号,就有几个维度
形状 shape
创建数组12345678910111213import numpy as np#1.列表转化a=np.array([1,2,3,4])#如果列表中有非数值类型,所有类型转化为相同类型b=np.arange(2,21,2) #和range函数相同(起始,结束,步长)c=np.random.random((2,2 ...