当前位置:首页 >> 单片机入门 >> STM32学习经验总结

STM32学习经验总结

STM32 作者:admin 来源:不详 发布时间:2018-05-18 21:10:28   浏览:2

 1. 今天把普中开发板上的RS232芯片烧坏了,所以接下来要完成stlink的使用,来下载程序,同时也尝试调试程序,也算是被逼的去学一个很有用的工具,本来我都不想学stlink的。

2. 先学习一下STM32的定时器,过程中,加入stlink的下载和调试。

3. 定时器:STM32分高级定时器(TIM1和TIM8),通用定时器(TIM2-5),基本定时器(TIM6,7)。

4. 通用定时器(TIM2-5):1)位于低速APB1总线上。2)预分频:将计数器时钟频率降低。3)各个通用定时器之间是完全独立的。4)向上计数:从0到加载值,其他类似。5)定时器的时钟来源,可以来源于内部的APB1时钟倍频提供,这是时钟来源之一,但是用的比较多,也比较简单。

5. 通用定时器工作过程,只要有印象就可以,在配置的时候知道在配置什么。

6. 这是时钟的计算方法,其中APB1的时钟来源于AHB,如果APB1 = AHB,也就是APB1 = 1 * AHB,那么,此时的CK_INT = APB1,而如果APB1 = AHB / 2,那么这时候CK_INT = 2 * APB1的时钟,得到定时器的原始时钟。

7. 溢出时间 Tout = (ARR + 1)*(PSC+1) / TCLK,就是Tclk /(PSC+1)的倒数,得到原始时钟被分频后的频率,倒数就是时钟周期,那么再乘以重装值,就得到了溢出时间。一般时钟TCLK为72MHz。

8. 现在为战舰开发板,LED0->PB5红色 LED1->PE5蓝色

9. 注意:在要使用相应的库函数的时候,需要添加库函数的.c文件到FWLIB中,但是在使用template工程模板的时候不用考虑,已经全部加载进去了,我们只要写自己的功能函数就可以。

10. 定时器初始化步骤:1)使能定时器时钟APB1。2)初始化定时器,配置ARR,PSC,以及计数方式。3)使能定时器中断,配置NVIC,不要忘了在主函数中加入设置中断优先级分组的一句!4)使能定时器自身。5)编写中断服务函数。具体参数配置见功能函数中注释。

11. 注:电平的翻转,好像可以使用~ 或者 !实现。

————————————

1. 在学习定时器PWM波之前,先学一下stlink如何调试程序的。

2. stlink调试:1)首先关于引脚,PA13-15 以及 PB3 PB4都被默认为JTAG的引脚,所以工程中尽量不要使用这些引脚。2)在debug窗口查看变量的变化,可以选中程序中的变量,右击,然后add towatch1,就可以了。

3. 注:仿真分软件仿真和硬件仿真,那么软件仿真时,会有串口数据输出,但是硬件仿真的时候必须使用串口调试软件才能看到串口打印的数据,同理,逻辑分析也是这样的,可以使用逻辑分析仪采集板子引脚,做逻辑分析,那么keil上的debug的用处是观察变量,以及寄存器的变化,并且可以通过单步调试查看硬件执行情况。好像并不是很有用。但是keil的load的确方便,直接就可以下到板子里,不用我另外使用软件下载。

4. 定时器PWM:ARR值确定频率,CCRx确定占空比信号,可以理解为一个临界值。

6. 关于通道重映射问题:通道的重映射根据上图,可以看到,定时器三的通道二的部分重映射正好可以映射到PB5,led灯输出端,便于显示。注:一旦设置TIM3为部分重映射,那么四个通道都重映射了,也就是现在CH1->PB4了,没有专门单独设置CH2的映射。

7. 关于PWM的工作过程设置问题:

8. 关于PWM工作模式问题:CCMR1控制的是PWM模式1还是2。模式1的话,当CNT < CCR时,输出有效电平(有效电平到底是低电平还是高电平时根据CCER确定的),其余为无效电平;那么PWM模式2就和模式1相反。

9. 第7点,其中的CC1P为高极性,那么就是高电平有效。

10. //设置占空比,占空比=(CCRx/ARR)*100%或(TIM_Pulse/TIM_Period)*100%

TimOCInitStructure.TIM_Pulse= 400-1; 这里我理解的是,这个值就是被放入捕获比较寄存器中,即CCRx中,用于输出固定的占空比的PWM波。

————————————

1. 关于6050陀螺仪模块问题

2. 今天开始着手平衡小车项目,蓝牙模块不用关心,只要知道可以连接,再判断串口发来的指令即可。

3. 好像比较简单的是使用DMP,通过结合DMP,可以将我们的原始数据转换成四元素输出,再通过四元素算出欧拉角,从而得到yawroll 和 pitch。

4. 因为做的是平衡小车,那么就不需要roll 和 yaw,直接通过pitch即可。

2016/4/1

1. 昨天卡在一个比较愚蠢的问题上,就是我很少自己配置工程什么的,所以当测试卖家发来的例程的时候,编译不通过,最后发现是要在keil4下打开才可以用,期中涉及的问题我也不想深究,毕竟配置工程什么的不是我学习的重点。

2. 今天总结了一条经验:解决问题,一定要善于使用最简单的方法!不做无用功,也不能浪费宝贵的时间!比如我发现他们的例程下进去,小车根本就不能动,排查问题,肯定是资料问题,我问了卖家以后,他们发了新的资料,成了!工程编译错误,网上百度一下,好像keil4下可以正常使用,那就装一个keil4,成了!这就是最简单的解决问题方法,不要自己死磕,不能转牛角尖。

3. MPU6050:首先我要做的就是能够使用例程,将MPU获取的数据打印出来,这样便于调试,也便于我接下来的学习;然后深入理解6050的工作方式和通信方式(IIC通信);再学习6050在DMP方法下,输出的数据怎么可以整定成小车的姿态,那么平衡小车中比较关键的内容就结束了!

因为还是写成项目日志比较清楚,所以准备写项目日志,暂停写直至平衡小车项目结束,重新开始学战舰开发板的其他模块。

————————————

 TFTLCD

1. 今天是平衡小车结束后,开始继续学习STM32的第一天,上次老师提出来要在mini2440上做摄像头循迹小车,又是小车!天呐~反正我已经快受不了了,而且arm的裸机开发和STM很相似,根本就没什么大的差别,而且arm是mini板,外设很少,学习模块的机会很少,所以我觉得,以后再STM32上做裸机开发,也可以尝试移植uC/OS系统,这样配套的学习,肯定比arm上裸机开发要好!

2. 我现在用的是战舰的3.5寸屏幕,IC为NT35310,电阻屏,16位并口驱动,分辨率为320*480,挺高的分辨率了已经算是。

3. 我现在想采用的是16位模式下,RGB565存储数据,这个型号的驱动芯片是NT35310(ID5310)。通过一些命令,我们可以设置GRAM(LCD的显存)的指针的增长方向,也就是一个个像素点的填写方向,所以只要设置一次开始写的位置,就可以把数据连续的填写,在SC++(X坐标起始位置)碰到EC(X坐标终止位置),这时候EC会返回SC,但同时SP++,从下一行开始填写像素点(在设置了指针增长方式为从左向右,从上往下模式时),而不需要关心位置,极大的方便了我们编程,速度也比每次都指定坐标的LCD屏要快。

4. 填写像素时,步骤为:设置起始位置---发送写GRAM命令---写入GRAM。

5. FSMC:灵活的静态存储控制器。这是STM32板子上带有的对SRAM、NAND Flash、NOR Flash等进行操作的控制器,那么现在对LCD的操作就相当于FSMC对一个SRAM在进行操作。

6. 直接切入LCD使用吧,反正原理大差不差的理解了,然后就观察他们是如何使用的就可以。

2016/4/20 IIC总线 由飞利浦公司提出

1. 因为IIC总线是一种非常常见而且普及的总线协议,用来对各种模块的寄存器读写从而进行配置,类似的还有SPI总线协议,虽然单片机里学过了,但是也差不多忘了,所以今天再温习一下。

2. 今天测试的也是例程上的,使用IIC对24C02进行读写操作,通过LCD屏幕显示。

3. IIC:有起始信号,停止信号,应答信号。

4. 硬件上已经将PB6接到了IIC_SCL上,将PB7接到了IIC_SDA上,这是因为这两个端口可以端口复用成IIC总线的两根线,模式时推挽输出。

5. GPIO:关于灵活控制某个端口为输入输出模式:

SDA也就是PB7作为输出的时候,使用50MHz的输出速度,做普通输出(CNF1 CNF0 MODE1 MODE0 =0011);当SDA作为输入时,使用复用功能,MODE保留(CNF1 CNF0 MODE1 MODE0 = 1000)

6. IIC使用流程,我个人总结是这样的:1)配置IIC服用端口;2)检测IIC器件是否存在;3)由IIC发出起始信号,同时发送器件地址,接着就等待应答信号的产生;4)等待到了应答信号就可以发送数据出去,同样也需要进行应答信号的检测;5)那么读取其实也是类似的,具体的时序方面,其实就是根据手册上的时序图模拟一遍,注意位操作的正确性就可以了。

7. SPI协议:接着温习SPI协议,这个协议其实在我用单片机接NRF24L01射频通信模块的时候已经有了比较深刻的理解了,为什么说深刻,因为那时候还不想现在这么浮躁,会耐下性子,一步一步的从通信协议,配置寄存器开始做起,最后花了五六天才基本搞通互发,第一个煎熬的模块。

8. SPI是摩托罗拉公司提出的总线协议,这是一种同步,高速,全双工的串行通信协议。

9. 关于两个设置值,用来决定时钟的空闲信号和采样时机的CPOL和CPHA。

10. CPOL=0,串行时钟的空闲状态为低电平,反之为高电平;CPHA=0,则在第一个时钟跳变时做采样,CPHA=1,则在第二个时钟跳变时做采样。

11. 如何记忆MISO和MOSI,可以拆开理解为Master In Slave Out和 Master Out Slave In。

12. 根据我之前的理解,通俗的讲,SPI协议就是,小时候玩儿的你拍一我拍一,这种节奏就是时钟,这种击掌的过程就是数据线的传输,其实也还是不够贴切。应该是像两个小朋友交换同样个数的玩具,但是他们选择一换一的节奏逐个交换,直至他们的玩具全部交换完成,那么一个小朋友就有了原来属于另一个小朋友的玩具,那么这些玩具就是数据,用来装玩具的就是寄存器,用来以一定节奏交换就是时钟。

13. 现在例程上使用的是PB12做W25Q128的CS片选,PB13做SCK,PB14做MISO,PB15做MOSI。

——————————————

485协议

1. 485协议:处于物理层,半双工,多点通信,它类似于RS232,但是它更加稳定可靠,传输距离比RS232要长,抗干扰性也不错,所以这个协议还是有必要做一些了解的。

2. 战舰上使用的是SP3485芯片,该芯片的原理图清楚的说明,当RE信号为低的时候,为接收模式,当RE信号为高时,设为了发送模式。

3. 好吧,其实和串口的模式非常相似,只是两者采用了不同的电压作为高低电平,其余实在是没多大差别。

————————————————————

1. CAN总线:也是一种串行通信协议,为现在欧洲汽车网络的标准协议,可以实现在汽车的LAN中的高速、高质量的数据传输,已经经过ISO国际标准化的串行通信协议。它通过两根线上的电位差来判断电平,总线电平分为显性电平和隐性电平,二者必有其一。

2. CAN总线的特点:可以根据优先级来决裁;不需要“地址”这个概念,加入模块方便;通信速度较快,也比较远,在现场控制中足够了;还有错误检测反馈等功能,使之成为公认的最有前途的现场总线之一

3. CAN总线电平判断:隐性电平是指CAN_L与CAN_H之间的电压差为0V,而显性电平为CAN_H与CAN_L之间的电压差为2.5V左右。

4. CAN总线通过五个帧实现:数据帧,遥控帧,错误帧,过载帧,帧间隔。

5. D:显性电平,也就是0,这时压差为2V左右;R:隐性电平,也就是1,这时的压差为0V。那么优先级仲裁就是通过显性电平的多少判断的,输出的显性电平多的优先级高;一般先发起总线请求的优先级要高于后来的,而且不能被打断。

6. CAN控制器:有三个邮箱,用于发送!发送过程:空闲邮箱(存在空闲邮箱时)----挂号(等待邮箱成为最高优先级)------预定(邮箱成为了最高优先级)------发送(一旦总线空闲了,就可以进行发送)----空闲(发送完成以后,再次把总线变为空闲)。

7. CAN控制器:有三级FIFO用来缓存数据!接收过程:FIFO中有一个为空时,接收到有效数据----挂号一-----又一次收到有效数据-----挂号二------。。。。超过三次收到有效数据但是没有被读走的话,就会产生溢出,所以需要及时的读取FIFO中的数据。

2016/4/24 摄像头OV7670

1. OV7670是CMOS VGA图像传感器,通过类IIC的SCCB总线控制,VGA可高达30帧/秒。

2. VGA,即分辨率为640*480的输出模式。QVGA,即分辨率为320*240的输出模式,一般用这种,因为OV7670的FIFO也只够存储一帧的QVGA。

2016/6/11

时隔近两个月,我又开始玩儿这个板子上的摄像头了,因为参加比赛的需要,必须要把摄像头原理和例程都消化,然后将摄像头改为可以采集灰度图像,并且可以灵活的设置图像阀值。

1. 使用类似IIC的SCCB(串行摄像头控制总线)控制总线,主要使用这个总线协议来对7670状态配置。

——————————————————————————

上次又被考试打乱了,今天要搞一天。

1. 首先,OV7670正好可以存储一帧的分辨率大小为320*240,即QVGA格式。

2. PCLK为像素时钟,一般一个PCLK时钟输出一个像素,但要是一个像素为两个字节大小,那么就需要两个PCLK时钟才能输出一个完整的像素,例:RGB565。

3. VSYNC为帧同步信号,一帧出现一次。

4. HREF为行同步信号,这是根据分辨率中的多少行确定的,例如640*480的分辨率,那么一帧中就出现480次的这个行同步信号。

5. 图像数据就是通过D[7-0]八根数据线输出。

6. 根据时序图可以看出,当行同步信号为高电平有效的时候,数据的输出才为有效,那么再根据PCLK的上升沿MCU采集,下降沿数据改变,就可以实现图像数据的读取。(两个字节的话,高字节在前)

7. 7670工作流程:首先摄像头采集图像数据,然后存储到FIFO芯片AL224B(384K),一般我们只要存储一帧就够了,再通过接口,使用MCU从这个FIFO芯片中读取摄像头之前采集的数据。

8.这是针对FIFO操作的对外接口,也就是摄像头下面引出来的引脚。

9.从第一个帧同步信号开始,说明开始采集到了一帧,那么这时候让写指针复位,也就是从0地址开始写入,再把写使能使能,这时候FIFO中就会开始接收7670输入的图像数据,在等待到第二个帧同步信号以后,说明一帧图像采集完毕,这时候把写使能禁止,然后让MCU去读取FIFO中的数据,也不会让新的数据冲掉之前的数据,保证读取的正确。

11. 注:PB3 4 为JTAG中使用到的接口,如果要把这两个引脚作为普通的IO口,那么必须禁止JTAG,才能使得这两个引脚作为普通IO使用。

12. 采用中断获取帧同步信号,然后在OV7670往FIFO中写数据的同时,MCU也开始从FIFO中读取数据,这样可以加快数据的采集。

2016/6/16

1. "Y"表示明亮度(Luminance或Luma),也就是灰阶值;而"U"和"V" 表示的则是色度(Chrominance或Chroma),作用是描述影像色彩及饱和度,用于指定像素的颜色。

2. 也就是说,我主要用到的就是Y分量。

3. 几个重要的设置灰度图像输出的寄存器,需要进行了解。

寄存器地址

寄存器设置的值

       7654 3210

解释

0x12

0x10 (0001 0000B)

通用控制寄存器,还是设置为QVGA格式输出,输出YUV编码方式的图像数据

0x3a

0x14 (0001 0100B)

行缓冲测试选项,使用固定的UV输出,这两个值就是0x67和0x68两个寄存器的值。行缓冲输出顺序,由这个寄存器的【3】(0)和0x3d的【0】(0)两位决定,对照发现为使用YUYV输出,也就是Y:U:V=4:2:2。

0x3d

0x80 (1000 0000B)

普通控制寄存器,伽马使能,同时和0x3a相互配合。

0x67

0x11 (0001 0001B)

填充U值的寄存器,值为0x11

0x68

0xff  (1111 1111B)

填充V值的寄存器,值为0xff

0x40

0xc0 (1100 0000B)

数据的输出范围为0x00-0xff。

4. 注:还是不是很理解输出顺序YUYV输出,也就是Y:U:V=4:2:2。这个意思。

 

1. 设置完成以后,基本就可以实现灰度图像的采集了,速度也挺快的。

2. 从网上了解了OV7670的特点以后,才明白之前的YUYV输出顺序的真正意义,其实不论Y还是U还是V都是八位二进制表示,也就是一个字节。那么YUYV输出格式表明,我们在使用的时候,只要读取第一个字节就可以获取Y(亮度),这个亮度可以进一步的处理判断,就可以通过阀值获得二值图像,也就是黑白图像。

3.

4. 这是我衣服上的标志,我还添加了手动设置阀值的按键操作,便于以后的调试,在不同的光线条件下可以进行调整。

编辑:admin  最后修改时间:2018-05-18