51 32 学习记录

STM32的时钟选择
(103)
APB2总线时钟:最大72MHz,挂载了高级定时器
APB1总线时钟:最大36MHZ,挂在了通用定时器
定时器的时钟选择:
1.内部时钟,
2.外部时钟模式1(TIX)
3,外部时钟模式2(ETR)
各自定时器的外部时钟输入引脚(必须是对应的引脚)
TIM1:PA12
TIM2:PA0
TIM3:PD2首选
TIM4:PE0
TIM8:PA0
TIM_ETRClockMode2Config (TIM3,TIM_ExtTRGPSC_OFF,TIM_ExtTRGPolarity_NonInverted,0);
4.内部触发输入(ITRX)
APB2负责AD,I/O,高级TIM,串口1。
APB1负责DA,USB,SPI,I2C,CAN,串口2345,普通TIM
普通定时器时钟源来自于APB1总线,为何时钟是72MHZ那?
定时器的时钟不是直接来自APB1或APB2,而是来自于输入为APB1或APB2的一个倍频器,
当APB1的预分频系数为1时,这个倍频器不起作用,定时器的时钟频率等于APB1的频率;当APB1的预分频系数为其值(即预分频系数为2、4、8或16)时,这个倍频器起作用,定时器的时钟频率等于APB1的频率两倍。
假定AHB=36MHz,因为APB1允许的最大频率为36MHz,所以APB1的预分频系数可以取任意数值;当预分频系数=1时,APB1=36MHz,TIM27的时钟频率=36MHz(倍频器不起作用);当预分频系数=2时,APB1=18MHz,在倍频器的作用下,TIM27的时钟频率=36MHz。
设置这个倍可以在保证其它外设使用较低时钟频率时,TIM2~7仍能得到较高的时钟频率。

51单片机之串口
一般用到的寄存器,
1:SCON(串口配置寄存器),
2,PCON的位7(SMOD)设置串口的波特是否倍增,
3.AUXR(独立波特·发生器的设置与选择)以及溢出,BRBX12(设置计数), BRBR(独立波特·发生器的使能), SIBRS(串口1的波特选择是否为独立波特率发生器)
4.串口数据的发送与接收:
发送,将数据写入SBUF.寄存器
接收,从SBUF寄存器中读取即可
串口配置的步骤:
1,串口初始化,SCON
2.计算溢出BRT
3.设置独立波特发生器的相关位,
4.使能接收或者不接收,
5.使能波特发生器
6.开启或不开启中断,在中断服务函数中清除发送接收中断标志位

STM32之串口
接收:uint16_t USART_ReceiveData(USART_TypeDef* USARTx);
该函数是读取串口已经接受到的数据,而不是启动一次接收,串口会主动将接受的数据存储到USART—>DR 寄存器
发送:void USART_SendData(USART_TypeDef* USARTx, uint16_t Data);
该函数会主动触发一次数据的传输,通过向USART—>DRj寄存器写入数据
硬件SPI 的原理也是如此,接收函数读取到的是已经接收到的数据,而非触发一次接收,接收都是被动的,当有数据输入,接收状态标志位为0的时候,会将该数据存入接收寄存器中去

     宏定义的一些变量函数有错误时,预编译一遍,然后重新调用中断优先级管理:NVIC INIT()  该函数设置相应中断使能,配置抢占优先级和响应优先级NVIC_PriorityGroupConfig    设置中断优先级分组       01234  配置的是AIRCR 寄存器抢占优先级和响应优先级32定时器中断:Tout=(ARR+1)(PSC+1)/TclkARR:自动重装载值    PSC:预分频系数    Tclk:定时器时钟频率,CK_INT==CK_PSC

IIC通信:
SCL处于高电平期间,这时对数据进行操作,数据线上的数据必须保持稳定。只有SCL处于低电平期间,SDA状态才能变化
SPI 通信:
主从设备:各自有移位寄存器,主设备需要读取从设备的数据,必须发送一个字节,作为数据交换
由主设备提供时钟
CPOL:时钟极性,决定数据传输时的时钟状态
CPOH:时钟相位,决定数据在哪个跳变沿数据被采样
主从设备必须具有相同的时钟极性,时钟相位
主设备的时钟极性,相位,由从设备决定
STM32 103 ; 硬件SPI的时钟来源于APB1 总线,时钟最快18MHZ

51单片机中断标志位:
(中断标志位置位时1,申请相应的中断,中断开启时,执行到相应的中断,如果标志位不清零,就会一直执行中断)
外部中断,当设置为边沿触发方式时,进入中断函数后,硬件自动清零,当设置为电平触发方式时,必须由软件清零
定时器中断,当中断标志位置1时,进入中断服务函数,硬件自动清零
串口中断,发送与接收中断,共用一个中断服务函数,进入中断服务函数时,先判断是那种中断,中断标志位必须由软件清零
stm32单片机中断标志位;
对于103系列的单片机:
59共用一个中断服务函数,1015共用一个中断服务函数,共7个中断服务函数
32的高级定时器的时钟来源于APB2
定时器的TIMX_SR寄存器中断标记位置位后。由软件清零
串口中断标志位有两种清除方式,
1:向相应的标志位写零,
2;读SR(串口状态寄存器),写DR(串口数据寄存器)。
TIMX_CNT,存放计数器的值
外部中断EXTI标志位需要软件清零

编码器:
1.由许多的光栅组成,电机转动过程中,通过光栅的光,输出高电平,没有通过的光,输出为低电平,AB相相位差90度,四倍频即每个光栅倍检测4次,即一个光栅使计数器加4次
2.STM32的TIM123458都可以用于编码器,而其他通用定时器没有,编码器输入信号TI1,TI2,经过输入,边沿检测产生TI1FP!,TI2FP2,接到编码器模块。STM32编码器接口模式基本上相当于使用了一个带有方向选择的外部时钟。编码器模式和外部时钟模式2不兼容,因此不能同时操作。
计数脉冲有两个来源,
1:定时功能,在单片机内部对机器周期或者其·分频进行计数,即没来一个机器周期,计时器加1
2:在单片机T0,T1引脚一事假一个正跳变信号,即计数器的值由外部信号触发

STM32定时器:
1.定时,输入捕获。输出比较,PWM,计数脉冲由机器周期或其分频决定。
2.编码器模式的计数脉冲由AB相得跳变信号决定
在单片机遇到DATA SEGMENT TOO LARGE 说明128字节的data数据空间已满
解决方法1:在数组前加code(静态,只读)

         字符与字符串:在内存中同样以ASCII码存储,一个用双引号,一个用单引号。字符与数字:  字符在内存中以ASCII存储,数字以数字存储,显示时字符有引号

STM32_PWM:
1.pwm工作模式1,TIM—>CNT<compareyouxiao1
2.pwm工作模式2,TIM—>CNT>compareyouxiao1
3.pwm工作周期的计算(ARR+1)*(psc+1)/CLK
/***********************************************************************
摄像头学习
图像:灰度,二值化,灰度,RGR565,888,等格式的·,是根据每个像素点的数值区分
二值化: 0 1
RGB565: 红绿蓝5bit,6bit,6bit
灰度: 一个字节
************************************************************************/
RGB转灰度值
Gray = (R
299 + G
587 + B
114 + 500) / 1000
灰度处理的方法:
方法1:
灰度化后的R=(处理前的R + 处理前的G +处理前的B)/ 3
灰度化后的G=(处理前的R + 处理前的G +处理前的B)/ 3
灰度化后的B=(处理前的R + 处理前的G +处理前的B)/ 3
方法2:该·方法比较好
灰度化后的R = 处理前的R * 0.3+ 处理前的G * 0.59 +处理前的B * 0.11
灰度化后的G = 处理前的R * 0.3+ 处理前的G * 0.59 +处理前的B * 0.11
灰度化后的B = 处理前的R * 0.3+ 处理前的G * 0.59 +处理前的B * 0.11
一个像素点在灰度化之后的灰度值怎么转化为0或者255?比如灰度值为100,那么在二值化后到底是0还是255?这就涉及到取一个阀值的问题。
常用的二值化方法:
方法1:
取阀值为127(相当于0~255的中数,(0+255)/2=127),让灰度值小于等于127的变为0(黑色),灰度值大于127的变为255(白色),这样做的好处是计算量小速度快,但是缺点也是很明显的,因为这个阀值在不同的图片中均为127,但是不同的图片,他们的颜色分布差别很大,所以用127做阀值,白菜萝卜一刀切,效果肯定是不好的。
方法2:
计算像素点矩阵中的所有像素点的灰度值的平均值avg
(像素点1灰度值+…+像素点n灰度值)/ n = 像素点平均值avg
然后让每一个像素点与avg一 一比较,小于等于avg的像素点就为0(黑色),大于avg的 像 素点为255(白色),这样做比方法1好一些。
方法3:
使用直方图方法(也叫双峰法)来寻找二值化阀值,直方图是图像的重要特质。直方图方法认为图像由前景和背景组成,在灰度直方图上,前景和背景都形成高峰,在双峰之间的最低谷处就是阀值所在。取到阀值之后再一 一比较就可以了

KEA128对ICM20602的调试:
飞思卡尔智能车:
电感传感器的原理:在导线中通入变化的电流(如按正弦规律变化的电流),则导线周围会产生变化的磁场,磁场与电流的变化规律具有一致性。如果在此磁场中置一由线圈组成的电感,则该电感上会产生感应电动势,且该感应电动势的大小和通过线圈回路的磁通量的变化率成正比。由于在导线周围不同位置,磁感应强度的大小和方向不同,所以不同位置上的电感产生的感应电动势也应该是不同。据此,则可以确定电感的大致位置。

对定时器周期公式的理解:
T=(arr+1)(PSC+1)/Tck 其中TCK为时钟频率,PSC为时钟预分频系数,arr为自动重装载值。
f=Tck/(psc+1)
(arr+1)
Tck/(psc+1)即为时钟频率,1/f为机器周期,乘以(arr+1)即可得出定时器周期。
例子:TCK=72MHZ,psc=71.时钟周期=1us.(arr+1)值为多少,定时器周期就为多少毫秒。
例子:
TIM_TimeBaseStructure.TIM_Period = 5; // 2.5ms
TIM_TimeBaseStructure.TIM_Prescaler = 36000; // 分频36000
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; // 时钟分频
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //计数方向向上计数
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);

STM32的复用功能:
只有使用了AFIO的事件控制寄存器(AFIO_EVCR)、AFIO的重映射功能(AFIO_MAPR)以及外部中断(AFIO_EXTICRx)控制寄存器才需要开启AFIO的时钟,STM32参考手册从来没说过使用IO的复用功能就一定要开启AFIO时钟,这是个误区。

按键的引脚选择:
当选用某个引脚作为按键的输入引脚时,首先应该测试一下该引脚的默认引脚的电平,若为低,则外部按键接VCC,若为高,则外部按键接低电平
,且当外部接电源时,不能过大,烧坏单片机

STM32调试心得体会:
当使用32自带的TFTLCD时,在初始化之前,首先初始化延时函数
32自带的外部中断例程,在外部中断的初始化中,使用了多个外部中断,但是在中断的选择上,只调用了一次,为了不必要的麻烦,在初始化的时候,各自调用各自的 ,(EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; )
对IO口的配置,在配置之前一定要先使能时钟,否则配置无效
STM32引脚分配:
ADC输入引脚必须配置为模拟输入

定时器:
输入捕获: 浮空输入
外部触发时钟输入:浮空输入

串口:
TXD:复用推挽
RXD:浮空或上拉输入

使用按输入时(或者外部中断):
输入上拉或输入下拉

软件模拟IIC:
输出(以及时钟):推完输出3
输入: 输入上拉8

硬件IIC:
SCL:SDA:开漏复用

串口调试助手心得;
在不使用printf()函数的前提之下,想直接输出数值是不可行,因为上位机软件,显示的只是对应的字符,而通过串口发送的数据除字符外的数据按原样输出之外,其他的数据的输出是该数据(十进制)对应的ASCll的字符

AGC–自动增益控制:
**实际就是对放大器A的放大倍数进行自动控制(调节),利用负反馈的原理,对输出信号的幅值进行采样,得到一个控制电压,去反向调节A的放大倍数。

STM32自带ADC的多通道使用:
初始化基本参数:
工作模式:ADC_Mode = ADC_Mode_Independent;
总共有10种,主要都是针对双ADC下使用。
浏览模式:ADC_ScanConvMode = ENABLE;
主要是针对多条通道而言,也就是说你是否有多条通道。
多通道:ENABLE;
单通道:DISABLE;
转换模式:ADC_ContinuousConvMode = DISABLE;
配置是否需要连续转换。
连续转换ENABLE:也就是只需要启动(触发)转换一次,后面就不用再次启动(触发)就可以连续工作了。
单次转换DISABLE:也就是根据一次转换完后需要再次启动(触发)才能工作。
触发方式:ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
触发方式也就是使用什么方法触发ADC转换。哟定时器、外部触发、软件触发,一般常用软件触发。这里有很多种触发方式,详情可以参考其参数。
对其方式:ADC_DataAlign = ADC_DataAlign_Right;
右对其:低12位数据为有效位(常用);
左对其:高12为数据为有效位;
通道数:ADC_NbrOfChannel = 3;
这个参数比较简单,我们定义工作的通道数量。
ADC_RegularChannelConfig(ADC1, ch, 3, ADC_SampleTime_239Cycles5 );//ADC1,ADCͨµÀ,²ÉÑùʱ¼äΪ239.5ÖÜÆÚ //数字对应通道的个数;

STM 32的DMA传输:
直接存储器访问
CPU初始化这个传输动作,传输动作本身是有DMA控制器来完成的,
该操作并没有让处理器工作拖延,反而可以被重新排程去处理其他的工作
STM32ZET6具有2个DMA,DMA1有七个传输通道
DMA 传输方式无需 CPU 直接控制传输,也没有中断处理方式那样保留现场和恢复现场的过程,通过硬件为 RAM 与 I/O 设备 开辟一条直接传送数据的通路,能使 CPU 的效率大为提高。
DMA常用寄存器:
DMA中断状态寄存器:
(DMA_ISR):只读寄存器32位
可以判断DMA相应通道传输的状态:
主要用到位25 22 18 14 10 6 2(通道7-1)判断是否完成的状态
DMA中断标志清除寄存器:
(DMA_IFCR):32位
用来清除DMA_ISR的对应位的,通过写1清除
DMA通道配置寄存器:核心部分
(DMA_CCRx)x=1-7
DMA通道X传输数据量寄存器:
(DMA_CNDTRX)
这个寄存器控制 DMA 通道 x 的每次 传输所要传输的数据量。其设置 范围为 0~65535。并且该寄存器的值会随着传输的进行而减少, 当该寄存器的值为 0 的时候就代表此次数据传输已经全部发送完成了。所以可以通过这个寄存 器的值来知道当前 DMA 传输的进度。
DMA通道X外设地址寄存器
(DMA_CPARX)
该寄存器用来存储 STM32 外设的地 址,比如我们使用串口 1,那么该寄存器必须写入 0x40013804(其实就是_DR)。如果使 用其他外设,就修改成相应外设的地址就行了。

DMA 通道 x 的存储器地址寄存器
(DMA_CMARx)
该寄存器和 DMA_CPARx 差不多, 但是是用来放存储器的地址的。比如我们使用 SendBuf[5200]数组来做存储器,那么我们在 DMA_CMARx 中写入 就可以了。

STM32; USMART:

   修改参数十分方便,不需要编译、不需要下载、不会让单片机折寿,串口调试助手直接调用函数USMART 的实现流程简单概括就是:第一步,添加需要调用的函数(在 usmart_config.c 里 面的 usmart_nametab 数组里面添加);第二步,初始化串口;第三步,初始化 USMART(通过 usmart_init 函数实现);第四步,轮询 usmart_scan 函数,处理串口数据。 扫描**用串口发送数据到单片机:**list、id、?、help、hex、dec runtime都属于 usmart 自带的系统命令。                               hex 和 dec,这两个指令可以带参数,也可以不带参数。当不带参数的时候,hex 和 dec 分 别用于设置串口显示数据格式为 16 进制/10 进制。list,该命令用于打印所有 usmart 可调用函数。runtime 指令,用于函数执行时间统计功能的开启和关闭,发送:runtime 1,可以开启函数 执行时间统计功能;发送:runtime 0,可以关闭函数执行时间统计功能。函数执行时间统计功 能,默认是关  闭的。id :得到函数的入口地址,要调用带有函数参数的函数,就必须先得到函数参 数的入口地址(id),通过输入 id 指令,我们可以得到函数入口地址USMART:串口接收上位机的数据,开启定时器中断间隔的调用扫描函数判断是否接受完成,接收完成就调用相应的执行函数exe,执行函数找到上位机发送的函数,执行该函数的所有部分代码段,并将函数的信息(函数名,入口参数,,返回值)打印在上位机上,实现了上位机对函数的调用;大大提高了单片机的寿命

**51 32 学习记录**相关推荐

  1. 51单片机学习记录(五)矩阵按键

    文章目录 1.矩阵按键的控制原理 2.矩阵按键实现 1.行列式法实现矩阵按键 2.线翻转法实现矩阵按键 3.按键实战 1.矩阵按键的控制原理 独立按键与单片机连接时, 每一个按键都需要单片机的一个 I ...

  2. 使用51单片机采用中断方式进行串口通信的学习记录:

    使用51单片机进行串口通信的学习记录之中断方式: 1.51单片机采用中断方式的串口通信过程及程序分析: 所谓中断方式,就是串口收/发标志位出发中断后,在中断中执行既定操作,可通过函数调用来实现. 接收 ...

  3. leveldb 学习记录(四)Log文件

    前文记录 leveldb 学习记录(一) skiplist leveldb 学习记录(二) Slice leveldb 学习记录(三) MemTable 与 Immutable Memtable le ...

  4. Matlab学习记录 1

    文章目录 Matlab学习记录 使用帮助文档 Matlab读取CSV文件 MATLAB查看变量的类型 Matlab 提取矩阵 某一行 或者 某一列 的方法 mic的计算 矩阵下标从1开始 矩阵转置 获 ...

  5. R语言基础学习记录4:重要函数

    时间: 2018-07-18(学习) 2018-07-22(学习记录) 教程:慕课网 <R语言基础> 讲师:Angelayuan 补充内容: R语言常用函数总结大全.gl()函数 学习内容 ...

  6. 前端技术学习记录:react+dvajs+ant design实现暴走计算器的页面重构(二)

    前端技术学习记录:react+dvajs+ant design实现暴走计算器的页面重构(二) 前言 定义 Model connect 起来 更新state 拥抱变化 主题切换 更换页面 获取当前设备类 ...

  7. linux个人学习记录

    linux学习记录 资料: Linux 黑马程序员_bilibili AcWing Linux基础课 可能是东半球最全面易懂的 Tmux 使用教程! Shell 教程 | 菜鸟教程 (runoob.c ...

  8. plink质控及转换文件、admixture软件学习记录

    plink质控及转换文件.admixture软件学习记录 目的:自定义ped文件和map文件,用plink质控及转换文件,使用admixture做群体结构学分析. ped文件和map文件根据格式用pa ...

  9. 海思3518ev200学习记录(2) - 交叉编译官方webRTC

    系列文章目录 海思3518ev200学习记录(1)- 根据用户手册烧录系统镜像 海思3518ev200学习记录(2) - 交叉编译官方webRTC 海思3518ev200学习记录(3) - 编译 am ...

最新文章

  1. 创建Vue实例传入的options||Vue的生命周期
  2. 创建QT项目只有一个pro文件
  3. IOS沙盒中的Documents、Library、tmp区别
  4. ios(safar/微信)返回不执行js
  5. thinkpad bios联想logo_最强12吋ThinkPad,X201终极改造:8代酷睿+双内存+NVMe
  6. 开源机器人操作系统—ros_九美元计算机,机器人操作系统和更多开源新闻
  7. Google Test(Primer)(三)——断言
  8. visionpro图片读取、写入
  9. NSRunLoop NSTimer
  10. 机器学习傻瓜的深入研究
  11. ADSL桥接模式和路由模式的区别(转)
  12. Abp框架 Abp中使用Redis
  13. Linux 使用 iptables屏蔽IP段
  14. 载波同步matlab程序,Gardner算法实现基带信号位同步的原理和MATLAB程序讲解
  15. 简述Android模拟机和真机的区别,详解android模拟器emulator
  16. Matlab 生成方波信号
  17. 数学界再出变态神人!竟用一个比基尼方程,暴力吊打美国数学家!看完我惊了......
  18. ROM制作图文教程(详细)
  19. CAD碎片化学习教程 @3. 设置当前字体
  20. 中软国际(深圳)招聘FPGA开发工程师

热门文章

  1. python基础编程:Python实现FLV视频拼接功能
  2. Vmware 虚拟机联网
  3. ubuntu16.04 系统下用Devstack部署OpenStack
  4. WPF 截图控件之伸缩(三) 「仿微信」
  5. 51单片机串口7位偶校验
  6. 大专计算机在线赚钱,1.计算机基础知识题(大专).doc
  7. linux系统无法识别固态硬盘_常见的Linux发行版是不是只能识别一个nvme固态硬盘 还是主板支持的问题?...
  8. php iconv 报错,如何解决php iconv报错问题
  9. 基于建木CI部署maven项目
  10. python VTK(十三) ----图像边缘检测 梯度算子 sobel算子