在使用STM32F系列8002功放芯片引脚功能的复用功能时硬件电路上需要进行一些配置吗?

【图文】STM32F-ARM Cotrex-M3核开发板硬件结构()_百度文库
您的浏览器Javascript被禁用,需开启后体验完整功能,
享专业文档下载特权
&赠共享文档下载特权
&10W篇文档免费专享
&每天抽奖多种福利
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
STM32F-ARM Cotrex-M3核开发板硬件结构()
阅读已结束,下载本文到电脑
想免费下载本文?
登录百度文库,专享文档复制特权,积分每天免费拿!
你可能喜欢STM32F103引脚功能定义_百度文库
您的浏览器Javascript被禁用,需开启后体验完整功能,
享专业文档下载特权
&赠共享文档下载特权
&10W篇文档免费专享
&每天抽奖多种福利
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
STM32F103引脚功能定义
阅读已结束,下载本文需要
想免费下载本文?
定制HR最喜欢的简历
下载文档到电脑,同时保存到云知识,更方便管理
加入VIP
还剩9页未读,
定制HR最喜欢的简历
你可能喜欢那些年你在STM32上被困住的难题,今天我们给你总结了
此处有硬广,反正是福利就对了——我们创易栈已专门设立STM32在线技术支持平台啦!各位电子攻城狮们可上创易栈平台自由发问,有专门的技术人员帮您解答哦!(不要问我创易栈是谁了,我是不会说的,自己关注我们公众号去看啊)
Q1:STM32GPIO口如果既要输入又要输出怎么办?STM32 GPIO口8种模式如何准 确的分析?
Q1:1、浮空输入模式
上图红色的表示便是浮空输入的过程,外部输入时0读出的就是0,外部输入时1读出的就是1,外部没有输入IO处于阻塞读不出电平状态。用处:感觉在信号处理方面用的比较好,比如在读取一段一段的波形,可以清晰的知道什么时候是0信号,什么时候是1信号,什么时候是没有信号的。类比:51单片机找不到类似的输入模式
2、上拉输入
上拉输入和浮空输入的区别是,上拉电阻的开关关闭了,如上图所示。IO没有输入的时候,IO电平等于VDD即1电平,当然IO输入低电平的事就是VDD和IO口形成一个闭环电路,根据分压法IO口出分担的电压为0。当然IO输入为1时,IO口电压和VDD相等,上拉电阻好比断开了,IO口的电压还是0。用处:在按键使用的时候特别适用,按键的一端接地,一端接IO口,当按键没有按下的时候电平为高电平,当按键按下的时候IO是低电平。类比:51单片机P1 P2 P3口就是上拉输入的,大家可以回忆一下51单片机的按键操作,我们应该知道51单片机除了P0口内部没有上拉电阻其他的IO都有上拉电阻。大家应该明白了51单片机没有按键的时候,我们读到的事高电平了吧!!小计:上拉输入,不管输入1还是不输入IO的电平都是1,输入0是IO口的电平是0 PS:按键是共地还是共VCC选择的时候要慎重
3、下拉输入
下拉输入和上拉输入的区别是,上拉电阻的开关打开了了,下拉电阻的开关关闭;了。如上图所示。IO没有输入的时候,IO电平等于VSS即0电平,当IO输入高电平的时候IO口就和VSS组成一个闭合电路,根据分压法,电压都分担到了电阻上,所以IO口电平为高电平。当然IO输入为低电平的时候,IO口肯定是低电平。
用处:在按键使用的时候特别适用,按键的一端接VCC,一端接IO口,当按键没有按下的时候电平为低电平,当按键按下的时候IO是高电平电平。
类比:51单片机没有类似的IO口
PS:按键是共地还是共VCC选择的时候要慎重
4、模拟输入
模拟输入,大家看上图的红色的标示。模拟输入和其他输入最大的区别
1、 没有连接TTL触发器,这样保留最原始的电压值,不是转换过后的0和1信号
2、 数据连接的终点不一样,其他的输入我们都是读取输入寄存器的值,而模拟输入,数据直接送到片上外设,一般是ADC。
下面就是输出类型了
1、 推挽输出,2、 开漏输出,3、 复用推挽输出,4、 复用开漏输出
1、推挽输出
上图就是就是推挽输出的过程。上图标示的“2”便是我们的输出寄存器,我们可以写入1或者0,如果写入1,图上的“3”上面的P-mos导通,N-mos截止,IO口等价直接连接在VDD上,所以IO口电平是高电平。同理输出寄存器的值为0时,P-mos截止,N-mos导通。IO口直接连接在VSS上,所有IO口电平为低电平。
用处:适合做一些开关控制,应为推挽输出可以快速的切换0和1,例如继电器,led等
类比:51单片机没有类似的IO口
3、 开漏输出
上图红色标示便是开漏输出的过程图,图上1和2的标示已经在推挽输出中介绍了,此处不再说明。开漏输出与推挽输出唯一的区别就是开漏输出只有一个N-mos管。当输出寄存器的值为0的时候,n-mos导通,IO口直接连接VSS,输出为低电平。当输出寄存器为1的时候,n-mos截止,IO口直接和输出端断开了,处于浮空状态。电平状态不可控制。
我们都知道51单片机PO口,是不是想到什么了?对PO口就是类似的开漏输出, PO口作为输出的时候一定要加上拉电阻,加上上拉电阻后,输入寄存器为1的时候,n-mos截止截止了,好比IO和输出端断开,这是IO口点压就等于上拉电阻的电压。这样变输出了高电平,如果IO口的高电平,连接到了外设低电平的,就会产生电流,电流不会流到IO口,(N-mos管截止了)直接流到外设。是不是增大了驱动能力了。(IO口的驱动能力有限,不能容忍大电流)。
通过改变上拉电阻的大小和电压就能完成很多功能。
4、 复用(推挽和开漏)输出
复用推挽\开漏和(推挽\开漏输出)区别在于起点不一样,复用输出来源片上外设,比如IIC,SPI等。大家是不是觉得8中模式都会了呢?我一开始的问题GPIO输入和输出之间的影响?
当我们设置为输入模式的时候,看上图“1”和“2”是线与的关系,如何你想要“1”对我们的输入没有影响,要么要“1”断开,要么让“1”高电平。比如键盘检测的时候,如何“1”是低电平的话。那么输入端会一直是低电平。我的开开发板PC5是键盘,如何我对输出端不做任何处理的话,即使我PC5输入设为上拉输入,输入寄存器一直是0。如果直接给ODR寄存器置1我的问题就解决了。
问题1 我没有设置PC5的输出模式,直接给输出寄存器置1,IO口的输出端是什么情况?STM32有没有默认的输出方式,这个要看输出寄存器复位的时候的值,来判断他的工作模式。。总之为了保险起见,应把输出寄存器置1。就和我们用51单片机IO作为输入的时候一定要先置一,一般系统复位后都是一。
当我们设置为输出模式的时候,我们能不能读取数据(不设置输入模式),当我们设置为开漏模式的时候,外接上拉电阻过后,我们不用设置输入模式就可以读取IO的电平了。这个是唯一的全双工的方式,除了复用功能外。我猜想默认输入应该是浮空输入。
其实GPIOx_CRX复位后值是0x,即默认的输入是浮空输入模式,输出是推挽输出!!
Q2:如何在STM32上面写一个标准的PID算法?
A2:在过程控制中,按偏差的比例(P)、积分(I)和微分(D)进行控制的PID控制器(亦称PID调节器)是应用最为广泛的一种自动控制器。它具有原理简单,易于实现,适用面广,控制参数相互独立,参数的选定比较简单等优点;而且在理论上可以证明,对于过程控制的典型对象──“一阶滞后+纯滞后”与“二阶滞后+纯滞后”的控制对象,PID控制器是一种最优控制。PID调节规律是连续系统动态品质校正的一种有效方法,它的参数整定方式简便,结构改变灵活(PI、PD、…)。
使用不同的MCU的时候,需要进行相应的简化和改写。而且由于单片机的处理速度和ram资源的限制,一般不采用浮点数运算。而将所有参数全部用整数,运算到最后再除以一个2的N次方数据(相当于移位),作类似定点数运算。这样可大大提高运算速度,根据控制精度的不同要求,当精度要求很高时,注意保留移位引起的“余数”,做好余数补偿就好了。
下面是程序:
typedef struct PID
intSetP //设定目标 DesiredValue
longSumE //误差累计
doubleP //比例常数Proportional Const
doubleI //积分常数 IntegralConst
doubleD //微分常数Derivative Const
intLastE //Error[-1]
intPrevE //Error[-2]
static PID sPID;
static PID *sptr = &sPID;
/*====================================================================
InitializePID Structure PID参数初始化
===================================================================*/
void IncPIDInit(void)
sptr-&SumError= 0;
sptr-&LastError= 0; //Error[-1]
sptr-&PrevError= 0; //Error[-2]
sptr-&Proportion= 0; //比例常数Proportional Const
sptr-&Integral= 0; //积分常数IntegralConst
sptr-&Derivative= 0; //微分常数Derivative Const
sptr-&SetPoint= 0;
/*==================================================================== 增量式PID计算部分
====================================================================*/
int IncPIDCalc(int NextPoint)
registerint iError, iI //当前误差
iError= sptr-&SetPoint - NextP //增量计算
iIncpid= sptr-&Proportion * iError //E[k]项
-sptr-&Integral * sptr-&LastError //E[k-1]项
+sptr-&Derivative * sptr-&PrevE //E[k-2]项
//存储误差,用于下次计算
sptr-&PrevError= sptr-&LastE
sptr-&LastError= iE
//返回增量值
return(iIncpid);
Q3:STM32将外部引脚配置成外部中断,触发后没有进入到中断处理程序当中,STM32的外部中断具体怎么回事?
一:触发方式
STM32 的外部中断是通过边沿来触发的,不支持电平触发;
二:外部中断分组
STM32 的每一个GPIO都能配置成一个外部中断触发源,STM32 通过根据引脚的序号不同将众多中断触发源分成不同的组,比如:PA0,PB0,PC0,PD0,PE0,PF0,PG0为第一组,那么依此类推,我们能得出一共有16 组,STM32 规定,每一组中同时只能有一个中断触发源工作,那么,最多工作的也就是16个外部中断。
STM32 分组和对应中断处理函数分配:
管脚 中断标志 中断处理函数分配
PA0~PG0 EXTI0 EXTI0_IRQHandler
PA1~PG1 EXTI1 EXTI1_IRQHandler
PA2~PG2 EXTI2 EXTI2_IRQHandler
PA3~PG3 EXTI3 EXTI3_IRQHandler
PA4~PG4 EXTI4 EXTI4_IRQHandler
PA5~PG5 EXTI5
PA6~PG6 EXTI6 EXTI9_5_IRQHandler
PA7~PG7 EXTI7
PA8~PG8 EXTI8
PA9~PG9 EXTI9
PA10~PG10 EXTI10
PA11~PG11 EXTI11 EXTI15_10_IRQHandler
PA12~PG12 EXTI12
PA13~PG13 EXTI13
PA14~PG14 EXTI14
PA15~PG15 EXTI15
三:外部中断的配置过程
l 配置触发源 -GPIO
触发源为通过GPIO端口输入,所以,要配置GPIO的模式,输入方式,输入方式有以下几种:
1.GPIO_Mode_AIN ,模拟输入(ADC模拟输入,或者低功耗下省电)
2.GPIO_Mode_IN_FLOATING ,浮空输入
3.GPIO_Mode_IPD = 0x28,带下拉输入
4.GPIO_Mode_IPU = 0x48,带上拉输入
l 引脚与外部中断关联
l 外部中断AFIO时钟开启
l 外部中断配置
这个主要是中断线路选择,中断触发方式,中断使能。
l 中断优先级配置 NVIC
l 中断处理函数的编写。
四:外部中断函数不能进入的原因分析
结合遇到的问题可以分为:
1)GPIO或者AFIO的时钟没有开启;
2)GPIO和配置的中断线路不匹配;
3)中断触发方式和实际不相符合;
4)中断处理函数用库函数时,写错,经常可能出现数字和字母之间没有下划线;
5)外部中断是沿触发,有可能不能检测到沿,比如 中断线是低电平(浮空输入),触发是下降沿触发,可能会出现一直是低电平,高电平的时候是一样的情况,电平持续为高电平;
6)没有用软件中断来触发外部中断,调用函数EXTI_GenerateSWInterrupt;,因为软件中断先于边沿中断处理。
Q4:用两块一样的STM32板子进行CAN通信,但是一直接收不到,从keil的寄存器中观察发现发送时会出现填充错误stuff error,如果不发送的话会出现格式错误form error。请问该如何排查这些问题,怎么解决。
A4:首先介绍下CAN:CAN是控制器局域网络(Controller Area Network, CAN)的简称,是由研发和生产汽车电子产品著称的德国BOSCH公司开发了的,并最终成为国际标准(ISO11898)。是国际上应用最广泛的现场总线之一。 在北美和西欧,CAN总线协议已经成为汽车计算机控制系统和嵌入式工业控制局域网的标准总线,并且拥有以CAN为底层协议专为大型货车和重工机械车辆设计的J1939协议。近年来,其所具有的高可靠性和良好的错误检测能力受到重视,被广泛应用于汽车计算机控制系统和环境温度恶劣、电磁辐射强和振动大的工业环境。
CAN协议经过ISO标准化后有两个标准:ISO11898标准和ISO11519-2标准。其中ISO11898是针对通信速率为125Kbps~1Mbps的高速通信标准,而ISO11519-2是针对通信速率为125Kbps以下的低速通信标准。
对于描述的问题,大概着重需要注意几点:
1.是不是所有功能都开了
2.过滤有没有问题
3.我们用过一个can转usb不灵,换can转网络,调试通过
4.程序可以试试环回模式,如果自发自收没问题,程序大部分都是好的
Q5:移植modbus协议到STM32?
A5:首先简单介绍下freemodbus:
FreeMODBUS一个奥地利人写的Modbus协议。它是一个针对嵌入式应用的一个免费(自由)的通用MODBUS协议的移植。Modbus是一个工业制造环境中应用的一个通用协议。Modbus通信协议栈包括两层:Modbus应用层协议,该层定义了数据模式和功能;另外一层是网络层。FreeMODBUS 提供了RTU/ASCII 传输模式及TCP协议支持。FreeModbus遵循BSD许可证,这意味着用户可以将FreeModbus应用于商业环境中。
移植freemodbus的话,主要有以下几个步骤:
首先,当然是要下载一个freemodbus了。自己写的modbus协议也可以,但考虑到时间和可扩展性还是选择开源的比较妥当些。这个协议最核心部分我感觉就是对寄存器的读写,当然如果涉及到PLC当然还有继电器等,其他部分已经把接口给你了,然后自己就按照说明去添加就可以。
然后,改动部分函数,包括有:
eMBRegInputCB(UCHAR * pucRegBuffer,USHORT usAddress,USHORT usNRegs)、
eMBRegHoldingCB(UCHAR * pucRegBuffer,USHORT usAddress,USHORT usNRegs,
eMBRegisterMode eMode)、
eMBRegCoilstCB(UCHAR * pucRegBuffer,USHORT usAddress,USHORT usNCoils,
eMBRegisterMode eMode)、
eMBRegInputCB(UCHAR * pucRegBuffer,USHORT usAddress,USHORT usNDiscrete)
这四个函数。
紧接着,主要是对portserial.c和porttimer.c这两个文件(相对于你下载的freemodbus-v1.5.0)的改动。
最后,main函数可以把下载的freemodbus文件中的demo文件下有一个BARE文件,这个文件夹有一个demo.c程序直接把main函数copy过来就大功告成了。。
Q6:STM32有硬件IIC,为什么很多应用,还要模拟IIC?
A6:STM32 的硬件IIC并没有问题,而是ST提供的库函数在设置IIC的API函数有纰漏。
在挂载小数量的外设情况下,STM32 的硬件IIC并不会出现太大的错误,不过如果数量多了,就很容易会出现死机。具体的原因在于:硬件IIC的时序不能出差错,如果你在读写IIC时,此时若正好碰上两根线上有了干扰,时序就不对了,它等不到回信也就卡在了哪里。
而很多人喜欢使用模拟的IIC,一方面是出于移植方便的考虑,另一方面是因为模拟IIC即使出了干扰,也只是此时读写出错,数据都不出来或写不进去,但程序还会继续运行,待下次轮到时再读写,最大的好处是不影响整个程序运行。
在运行时间上,软件模拟的IIC要明显比硬件IIC要慢。
Q7:谈一谈 STM32 中MPU6050 姿态融合
A7:首先要明确MPU6050 是一款姿态传感器,使用它就是为了得到待测物体(如四轴、平衡小车) x、y、z 轴的倾角(俯仰角 Pitch、滚转角 Roll、偏航角 Yaw) 。我们通过 I2C 读取到 MPU6050 的六个数据(三轴加速度 AD 值、三轴角速度 AD 值)经过姿态融合后就可以得到 Pitch、Roll、Yaw 角。
本次主要介绍三种姿态融合算法:四元数法、一阶互补算法和卡尔曼滤波算法。
一、四元数法
四元数可以通过一定的算法,把六个数据转化成四元数(q0、q1、q2、q3),然后四元数转化成欧拉角(P、R、Y 角)。
在STM32中,通常 MPU6050 自带的 DMP库就可以直接输出四元数,减轻 STM32的运算负担。
要注意的的是,四元数算法输出的是三个量 Pitch、Roll 和 Yaw,运算量很大。而像平衡小车这样的例子只需要一个角(Pitch 或 Roll )就可以满足工作要求,因此如果是做平衡小车的话不推荐用四元数法。
二、一阶互补算法
MPU6050 可以输出三轴的加速度和角速度。通过加速度和角速度都可以得到 Pitch 和 Roll 角(加速度不能得到 Yaw 角),就是说有两组 Pitch、Roll 角,到底应该选哪组呢?别急,先分析一下。MPU6050 的加速度计和陀螺仪各有优缺点,三轴的加速度值没有累积误差,且通过算 tan() 可以得到倾角,但是它包含的噪声太多(因为待测物运动时会产生加速度,电机运行时振动会产生加速度等),不能直接使用;陀螺仪对外界振动影响小,精度高,通过对角速度积分可以得到倾角,但是会产生累积误差。所以,不能单独使用 MPU6050 的加速度计或陀螺仪来得到倾角,需要互补。一阶互补算法的思想就是给加速度和陀螺仪不同的权值,把它们结合到一起,进行修正。
三、卡尔曼滤波
卡尔曼滤波和一阶互补有些相似,输入也是一样的。卡尔曼滤波(Kalman filtering)一种利用线性系统状态方程,通过系统输入输出观测数据,对系统状态进行最优估计的算法。由于观测数据中包括系统中的噪声和干扰的影响,所以最优估计也可看作是滤波过程。数据滤波是去除噪声还原真实数据的一种数据处理技术, Kalman滤波在测量方差已知的情况下能够从一系列存在测量噪声的数据中,估计动态系统的状态. 由于, 它便于计算机编程实现, 并能够对现场采集的数据进行实时的更新和处理。
给出具体程序,和一阶互补算法一样,每次卡尔曼滤波只能得到一个方向的角度。
float Kalman_Filter(float angle_m, float gyro_m)//angleAx 和 gyroGy
angle+=(gyro_m-q_bias) *
angle_err = angle_m -
Pdot[0]=Q_angle - P[0][1] - P[1][0];
Pdot[1]=- P[1][1];
Pdot[2]=- P[1][1];
Pdot[3]=Q_
P[0][0] += Pdot[0] *
P[0][1] += Pdot[1] *
P[1][0] += Pdot[2] *
P[1][1] += Pdot[3] *
PCt_0 = C_0 * P[0][0];
PCt_1 = C_0 * P[1][0];
E = R_angle + C_0 * PCt_0;
K_0 = PCt_0 / E;
K_1 = PCt_1 / E;
t_0 = PCt_0;
t_1 = C_0 * P[0][1];
P[0][0] -= K_0 * t_0;
P[0][1] -= K_0 * t_1;
P[1][0] -= K_1 * t_0;
P[1][1] -= K_1 * t_1;
angle += K_0 * angle_ //最优角度
q_bias += K_1 * angle_
angle_dot = gyro_m-q_//最优角速度
return angle;
最后:作个总结:三种融合算法都能够输出姿态角(Pitch 和 Roll ),一次四元数法可以输出 P、R、Y 三个倾角,计算量比较大。一阶互补和卡尔曼滤波每次只能输出一个轴的姿态角。
Q8:通俗的教你如何用C语言实现卡尔曼滤波
A8:1. 首先,kalman是一个数字滤波器。
我们将叠加了噪声的模拟信号输入到滤波器中,滤波器给出一个响应。这个响应就是输入信号去掉噪声之后的真值。当然,我们可以通过调整滤波器参数,使得响应尽可能接近客观真值。
当然,在使用中我们用AD将模拟信号数字化之,但是因为模拟信号本身包含了噪声,即使AD没有误差,数字化之后的数字量也是含有噪声的。况且,不可避免的,还要考虑AD的误差。我们把这种误差就叫做测量误差。
数字化之后,是最简单的。我们可以测100组数据,排序,删掉前20个,删掉后20个,剩下60个取均值。这样会排除了一些偶然误差。
kalman滤波器和上面的均值方法工作模式类似,只不过他的工作过程比较复杂,通过算法里面的五条公式过后,会很好的给出真值。
网上很多的是关于多维kalman实现。理解多维的比较费劲。参照网上的一些代码,实现了一个一维地滤波,对于有C语言基础的同学来讲,理解起来应该很容易了。
附上代码分析:
/*-------------------------------------------------------------------------------------------------------------*/
Q:过程噪声,Q增大,动态响应变快,收敛稳定性变坏
R:测量噪声,R增大,动态响应变慢,收敛稳定性变好
double KalmanFilter(const double ResrcData,
double ProcessNiose_Q,double MeasureNoise_R,double InitialPrediction)
double R = MeasureNoise_R;
double Q = ProcessNiose_Q;
static double x_
double x_mid = x_
static double p_
x_mid=x_ //x_last=x(k-1|k-1),x_mid=x(k|k-1)
p_mid=p_last+Q; //p_mid=p(k|k-1),p_last=p(k-1|k-1),Q=噪声
kg=p_mid/(p_mid+R); //kg为kalman filter,R为噪声
x_now=x_mid+kg*(ResrcData-x_mid);//估计出的最优值
p_now=(1-kg)*p_//最优值对应的covariance
p_last = p_ //更新covariance值
x_last = x_ //更新系统状态值
/*-------------------------------------------------------------------------------------------------------------*/
Q9:在STM32里面感受下FSMC功能的强大
A9:FSMC在很多场合当中都会被运用到,很多人对这个名称也很熟悉。这里先简单介绍一下FSMC,详细的功能说明还请参照官方的使用说明及其它文章参考。
FSMC全称“静态存储器控制器”。
使用FSMC控制器后,可以把FSMC提供的FSMC_A[25:0]作为地址线,而把FSMC提供的FSMC_D[15:0]作为数据总线。
说得简单一点,使用FSMC外设后,对于操作数据线与地址线的工作全与STM32内部自行完成了,不再需要我们自己加一个延时来处理哪个引脚先高,哪个引脚再低的麻烦工作了。配置完成之后,我们仅需要将要发送的指令或是数据写到对应寄存器后,数据线与地址线的时序就会自动完成了。对于我们编写程序省了不少的时间与精力。
正点原子对LCD的操作,便是以FSMC的形式进行的,在这里我们以外设nucleo-f412作为例子了解下FSMC的工作。
在硬件上,我们需要对目前的nucleo-f412进行修改,首先,需要焊掉SB5与SB6两个锡桥,因为PD8,PD9占用了FSMC的数据线。其实,PB14引脚驱动LD3灯也是与FSMC的D0位冲突的,但是其被不影响数据的输出,因此我们保留这个LED灯,只是在操作的时候会看到LD3红色小灯有时会闪一下。
接下来我们按照Cube提示的FSMC_D的数据线引脚,对液晶屏连接——直连方式。具体连接如下:
FSMC_D[16:0]-&16bit地址总线
FSMC NEx:本次使用FSMC NE1,对应SRAM操作方式;
FSMC NOE:输出使能,连接LCD的RD脚
FSMC NWE:写使能,连接LCD的RW脚
FSMC_Ax:本次考虑引脚占用的问题,因此使用A6,即PF12引脚。对应的指令地址为0x,算法就是A6左移 6 + 1位,具体原理请参照官方说明文档了。
连接好硬件之后,在软件上首先要做的是进行时序上的匹配,根据外设具体的时序修改FSMC对应信号脚上的时序时间。
完成时序的匹配之后,便可以根据芯片手册上的访问流程完成对外设的操作,包括:芯片初始化、对芯片内部寄存器的操作等等了。
Q10:使用STM32调平衡车,不停地下程序测试,然后突然就发现32发烫了,3.3v短路了,但是不知道是因为啥,烧了两块了,之前也炸了驱动上的电容。别人的却没发生过这种情况,板子一起买的,接线方法也是一样的。因为找不出原因,现在都不敢调了,苦恼!!!!
A10:首先从描述上分析,是软件上的问题的可能性不大。应该是硬件上电源部分存在的问题。
电源电压不稳或超高甚至接反的可能性很大,如某处短路只会造成电源电压下降,损坏电源或与短路直接相关的元器件,不会导致其他元器件损坏,半导体器件在5V以下自然损坏概率极低。经常炸电容更证明电源电压不正常,极性电容自然损坏往往是容量下降、漏电、漏液,不会炸,只有电压超高或接反才有可能炸。无极性电容耐压至少30V以上,在低压电路中不可能炸。
电机转动的时候由于内部的电感线圈会引起反向电动势,如果在电机和芯片之间没有做好隔离,反向的浪涌很容易就会烧坏掉主控芯片。对于这点,你可以直接拿电压源驱动电机,再用示波器观察电压就可以很清楚的看到原本稳定的直流电压在电机转动之后,出现了正弦波似的波动。
此外还需注意的一点是,在芯片下载的过程中,最好把重负载的外设断开,像电机这一类的,这样有利于保护芯片不被损坏。
Q11:stm32移植fatfs,f_open函数返回FR_OK,f_write函数也返回FR_OK,说明文件建立成功了啊,为什么在电脑上看不到建立的文件呢?
A11:首先硬件上:
1、对照原理图检查硬件的连接是否有误;
2、用示波器抓取关键引脚的波形,包括时钟引脚,数据和命令引脚上的波形,这里需要格外提到的是对于SD卡时钟的频率有两种,一种是SD卡在等待被读取,此时的时钟频率为低速状态,百十K等级;另外一种时钟频率是在SD卡工作时候的高速状态,通常为M级状态,低速的时钟为了降低功耗,高速的时钟用于加快对数据的操作。
3、检查SD卡的卡槽接触是否正常,之前就因为买了假的卡槽出现了一堆莫名其妙的问题;
其次在软件上:对于软件上的排除办法最好的就是使用硬件在线仿真功能,方便对于问题所在的查找。
1、检查自己的f_open函数,包括对于文件的打开方式,以及如果当前目录下没有该文件的时候的处理,是否要创建,其次检查函数体内对于错误情况的检查。
2、检查f_write函数,检查的内容包括函数的参数、函数体内部的查错机制等。
Q12:做了一批pcb,焊接好测试,发现有一半pcb的usb电脑识别不了,有一半电脑可以识别,大家有遇到过吗?弄了好久也没找到问题。请大家赐教。
A12:首先有一部分可以使用的话,排除软件上的问题;
在硬件上:PCB是一样的话,可以排除是布线的问题,因此最有可能出现问题的就是在元器件上了。
分析USB下载电路的原理图(以PL2303为例)
从原理图上可以看到,能够影响到USB识别的元器件主要有以下几个:
1、USB芯片;
3、USB接口;
检查方法:拿一块不能用的板子和一块能够识别的板子,将好板子上的USB芯片、晶振、USB接口分别拆下来换到坏的板子上进行测试。
补充一点:如果换过去都不能使用的话,还需要额外考虑两点:①焊接是否良好;②拆元器件的时候是否有损坏了器件。
Q13:stm32复位电路需不需要加上拉电阻?官方手册上是不要加的,但是很多网上电路图还有淘宝卖的板子上都加10k电阻,到底为什么?
A13:首先了解下上下拉电阻的作用
数字电路有三种状态:高电平、低电平和高阻状态。但有些场合却不希望出现高阻状态,通过上拉电阻或者下拉电阻就可以使电路处于稳定的状态,具体视设计要求而定。输出高电平是要有足够的电流给后面的输入口,输出低电平要限制住吸入电流的大小
上下拉电阻的应用道理类似,下面就以上拉电阻为例说明:
1.上拉电阻的作用
① 当前端逻辑输出驱动输出的高电平低于后级逻辑电路输入的最低高电平时,就需要在前级的输入端接上拉电阻,以提高输出高电平的值;同时提高芯片输入信号的噪声容限,以增强抗干扰能力。
②为加大高电平输出时引脚的驱动能力,有的单片机引脚上也常使用上拉电阻。
③OC门必须加上上拉电阻是引脚悬空有确定的状态,实现“线与”功能。
④在CMOS芯片上,为了防止静电造成损坏,不用的引脚不能悬空,一般都要接上上拉电阻降低输入阻抗,提供泄荷通路。
⑤引脚悬空比较容易受到外界电磁干扰,加上拉电阻可以提高总线的抗电磁干扰能力。
⑥长线传输中电阻不匹配容易引起反射波阻抗,加上下拉电阻是电阻匹配,有效的抑制反射波干扰
下拉电阻:和上拉电阻的原理差不多,只是拉到GND去而已,那样电平就会被拉低。 下拉电阻一般用于设定低电平或者是阻抗匹配(抗回波干扰)。
拉电阻是用来解决总线驱动能力不足时提供电流的。一般说法是拉电流,下拉电阻是用来吸收电流的,也就是灌电流。
对STM32的复位电路加了之后是强上拉,抗电磁干扰能强点。按照datasheet对地接100nF或者不接也行。
Q14:详解STM32命名规则
A14:STM32型号的说明:以STM32F103RBT6这个型号的芯片为例,该型号的组成为7个部分,其命名规则如下:
Q15:STM32有硬件IIC,为什么很多应用,还要模拟IIC?
A15:STM32 的硬件IIC并没有问题,而是ST提供的库函数在设置IIC的API函数有纰漏。
在挂载小数量的外设情况下,STM32 的硬件IIC并不会出现太大的错误,不过如果数量多了,就很容易会出现死机。具体的原因在于:硬件IIC的时序不能出差错,如果你在读写IIC时,此时若正好碰上两根线上有了干扰,时序就不对了,它等不到回信也就卡在了哪里。
而很多人喜欢使用模拟的IIC,一方面是出于移植方便的考虑,另一方面是因为模拟IIC即使出了干扰,也只是此时读写出错,数据都不出来或写不进去,但程序还会继续运行,待下次轮到时再读写,最大的好处是不影响整个程序运行。
在运行时间上,软件模拟的IIC要明显比硬件IIC要慢。
Q16:如何使用STM32输出时钟给外设使用
A16:像STM32F103系列芯片支持正常运行的系统最大时钟频率为72MHz,芯片还有有一个MCO时钟输出引脚,可以配置输出高频率时钟,给外部模块使用或达到同步效果。该引脚固定为PA8引脚。要求小于50MHz的频率,因为GPIO的最高频率就是50MHz。
具体的操作流程以及代码如下:
操作流程:
1)、设置PA.8为复用Push-Pull模式。
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
2)、选择输出时钟源。
时钟的选择由时钟配置寄存器(RCC_CFGR)中的MCO[2:0]位控制。
RCC_MCOConfig(RCC_MCO);
参数RCC_MCO为要输出的内部时钟:
RCC_MCO_NoClock --- 无时钟输出
RCC_MCO_SYSCLK --- 输出系统时钟(SysCLK)
RCC_MCO_HSI --- 输出内部高速8MHz的RC振荡器的时钟(HSI)
RCC_MCO_HSE --- 输出高速外部时钟信号(HSE)
RCC_MCO_PLLCLK_Div2 --- 输出PLL倍频后的二分频时钟(PLLCLK/2)
注:由于STM32 GPIO输出管脚的最大响应频率为50MHz,如果输出频率超过50MHz,则输出的波形会失真。
Q17:调试器不能连接到STM32的问题与解决办法
A17:很多人都碰到过调试器不能连接到STM32的问题,不管是IAR的J-Link还是Keil的ULink,或者是ST的ST-Link。出现这个问题时,调试软件会提示不能建立与Cortex-M3的连接,或提示不能下载程序,或提示找不到要调试的设备等。
这样的问题都是发生在调试那些可以在CPU不干预的时候自动运行的模块、或在调试低功耗模式的程序的时候。所谓“可以在CPU不干预的时候自动运行的模块”包括:DMA、定时器、连续转换模式下的ADC、看门狗等模块。
这个问题的根源是:
1. 调试器需要在RAM内执行一段程序,对Flash进行擦写操作,如果不停止这些自动运行的模块,它们会干扰程序在RAM中的执行,致使下载失败。比如DMA模块被配置为不停地拷贝一段数据区,而调试器刚好需要使用DMA数据传输的目标区域,这时DMA的操作将会与调试器的操作发生冲突。再比如,如果启动了看门狗而没有执行硬件复位,则在下次调试器需要下载程序时,看门狗超时将触发芯片复位,导致下载操作失败。
2. 低功耗是通过停止CPU的时钟而实现,JTAG调试是通过与CPU的通信实现,停止了
CPU的时钟致使调试器会失去与CPU的通信。
Q18:为什么在利用STM32 SPI固件库驱动串行SPI FLASH时,STM32开发板与FLASH芯片相连接的MOSI MISO引脚都配置成 复用推挽输出模式呢?FLASH芯片不也有数据通过MISO传到STM32吗,此时GPIO应该是输入模式啊??
A18:在复用模式下,gpio方向完全由内部控制,不需要程序干预。如果看看GPIO配置为Alternate function时的框图,你就明白了。
当MISO的GPIO模式配置为复用推挽输出时,因为SPI模块的MISO信号在主模式时是输入而没有输出,因此下图中的Alternate Function Output信号线上没有信号,所以推挽输出的2个MOS管都是处于关闭状态,不会影响外部信号。
GPIO配置为复用推挽输出时,Alternate Function Input始终是有效的,所以SPI模块的MISO信号可以正确收到外来的信号。
更详细的可以参考http://bbs.eeworld.com.cn/thread--1.html
Q19:调试器不能连接到STM32的问题与解决办法?
A19:很多人都碰到过调试器不能连接到STM32的问题,不管是IAR的J-Link还是Keil的ULink,或者是ST的ST-Link。出现这个问题时,调试软件会提示不能建立与Cortex-M3的连接,或提示不能下载程序,或提示找不到要调试的设备等。
这样的问题都是发生在调试那些可以在CPU不干预的时候自动运行的模块、或在调试低功耗模式的程序的时候。所谓“可以在CPU不干预的时候自动运行的模块”包括:DMA、定时器、连续转换模式下的ADC、看门狗等模块。
这个问题的根源是:
1. 调试器需要在RAM内执行一段程序,对Flash进行擦写操作,如果不停止这些自动运行的模块,它们会干扰程序在RAM中的执行,致使下载失败。比如DMA模块被配置为不停地拷贝一段数据区,而调试器刚好需要使用DMA数据传输的目标区域,这时DMA的操作将会与调试器的操作发生冲突。再比如,如果启动了看门狗而没有执行硬件复位,则在下次调试器需要下载程序时,看门狗超时将触发芯片复位,导致下载操作失败。
2. 低功耗是通过停止CPU的时钟而实现,JTAG调试是通过与CPU的通信实现,停止了
CPU的时钟致使调试器会失去与CPU的通信。
Q20:STM32芯片的三种启动模式有什么区别?
A20:STM32通过BOOT0 和BOOT1的配置,可以支持三种启动方式:
1、BOOT1=x BOOT0=0 从用户闪存启动,这是正常的工作模式。
2、BOOT1=0 BOOT0=1 从系统存储器启动,这种模式启动的程序功能由厂家设置。ISP
3、BOOT1=1 BOOT0=1 从内置SRAM启动,这种模式可以用于调试。
具体的流程为:
在系统复位后,SYSCLK的第4个上升沿,BOOT管脚的值江北锁存。用户可以通过上设置BOO0 和 BOO1引脚的状态,来选择在复位之后的启动方式。
在从待机模式退出后,BOOT管脚的值将被重新锁存;因此,在待机模式下BOOT管脚应保持为需要的启动配置。在启动延迟之后,CPU从地址0x 获取堆栈顶的地址,并从启动存储器的0x指示的地址开始执行代码。
因为固定的存储器映像,代码区从0地址启动,而数据区始终从地址0x开始。M3的CPU时钟从ICode总线获取复位向量,即启动仅适合从代码区开始(典型的从Flash启动)。
根据选定的启动模式,主闪存存储器、系统存储器或SRAM可以按照以下方式访问:
从主闪存存储器启动:主闪存存储器被映射到启动空间(0地址处),但仍然能够在它原有地址访问它,即闪存存储器的内容可以在两个地址空间域访问到;
从系统存储器启动:系统存储器被映射到启动空间,但仍然能在原有的地址访问到;
从内置SRAM启动:只能从0x开始的地址区域访问SRAM.
------------------------------------------------------------------------------------------------------------
本文由创易栈编写,转载请联系创易栈
创易栈原文链接:(http://www.emakerzone.com/test_comment_info/167)
创易栈,半导体圈的知识共享平台!电子工程师的移动分享社区!快来关注我们吧
责任编辑:
声明:该文观点仅代表作者本人,搜狐号系信息发布平台,搜狐仅提供信息存储空间服务。
打破传统的论坛模式,集结了半导体原厂代理商500+ 以及各行业1000+实战派技术大牛
创易栈作为TI和ST的第三方合作伙伴,全程参与其全国研讨会。
今日搜狐热点

我要回帖

更多关于 4435芯片引脚图及功能 的文章

 

随机推荐