**51 32 学习记录**

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)/Tclk
		ARR:自动重装载值    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,执行函数找到上位机发送的函数,执行该函数的所有部分代码段,并将函数的信息(函数名,入口参数,,返回值)打印在上位机上,实现了上位机对函数的调用;大大提高了单片机的寿命
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值