STM32之学习总结(正点原子精英版V1,不定时更新)

前言:保姆级教程,帮你在学习路上畅通无阻,从学习资源整合到板子使用开发注意事项,到环境搭载,单片机基本知识介绍,有AD的设计功底,有51单片机的基础,有15单片机的项目开发经验,案例代码模块学习记录,开发过程中的实操经验,我都会一 一介绍,分享自己从小白开始的学习心得,希望能帮助到每一个在变优秀路上的小伙伴,客官可以收藏+订阅,我都会在这篇文章里面不停加料更新直到完结,完结后添加目录,如果喜欢可以点个小赞,你们的喜欢是最直接的动力,有什么好的建议,或者不对的地方欢迎评论留言。

一、正点原子资料的使用事项和资源整合

  • 在数据手册中(datasheet)的引脚描述表中 带有 FT 说明该引脚兼容5V
  • 原理图中的引脚注释带ADC字样的都不兼容5V
  • 拿到正点原子A盘资料后,这些都是学习过程中要经常查阅的。
  1. 《开发板入门资料》(有板子验收步骤(FAQ),开发板使用的常见问题,部分模块的常见问题)
  2. 《程序源码》里面除了有代码外,还有这个案例在实现的时候需要注意的事项(可解决bug)在redeme.txt里面,一个例程可以由三个方式版本实现,扩展例程就是一些模块的软件代码的使用教程和注意事项。
  3. 《STM32参考资料》里面有数据手册(开发板数据),参考手册(开发板功能教程),和一些技术学习资料。
  4. 《增值资料》有模块的硬件,软件代码的详细教程使用说明,和其他更多资料的链接方式。
  5. 其他PDF形式的开发指南就是 实验例程的详细介绍和教程。
  6. 其他没说的就是一看名字就知道里面装的什么东西了。

下面是几个网站资源的链接。

二、学之前需要了解的几个问题

  •  I/O口的选择方式(IO引脚分配表在开发板原理图里面,用来查看IO引脚的基本信息)


  •  I/O使用注意事项(电机,电磁阀等里面有线圈,断电的时候容易产生感应电动势返流回IO口,烧坏开发板)


  •  供电注意事项


  •  例程测试遇到问题解决办法


  • 开发板遇到问题


  •  标准例程(官方代码源)遇到问题


  • 模块使用遇到问题
  1. 先读模块教程(在《开发板入门资料》《程序源码》中,这是模块软件代码的注意事项)下面的readme.txt
  2. 不能解决就再读《增值资料》中的ALIENTEK 产品资料来看模块的具体硬件,代码,常见问题的详细信息,全部模块资料的下载地址


  • 根据自己的项目经验,觉得在一些代码逻辑设计和单片机资源分配上多读datasheet 

  • 可以根据STM32F1开发者指南-库函数版本资料来学习
  • 学会用JTAG调试代码

 三、环境安装程序下载烧写及注意事项

  • 下载的是MDK5和串口助手FlyMcu和ST-link,主要是利用给的包安装就好了,学习过程中多读手册和指南。
  • usb的程序下载利用的是CH340芯片进行电路转换再将usb连接到stm32上,其本质是连接stm32的TXD和RXD进行信号传输。
  • 在安装下载软件之前要把ch340和st-link的驱动给电脑装上

注意事项 

  •  按下面的选择配置flymcu,Port口按电脑实际安装的驱动来选择(一般自动选择)

  • 关于为什么BOOT0和BOOT1要接地

  • st-link不需要下载软件,需要在mdk里面进行配置

1.点击魔术棒后

2.勾选后选择Settings

3.然后选择Flash Download

4.然后返回到魔术棒界面

到此st-link配置完成。 

四、工程建立

  • 详细建立流程请参考STM32F1开发指南(库函数版)-第三章-第3.3小节,我挑有意义的说一下。
  • mdk5用芯片支持包的形式,F1或者F4的包直接在资料的软件资料-MDK5里面找到并双击打开就好,会自动下载,以下是查看支持包的位置。

  • 整个工程建立下来主要是自己新建文件夹然后往不同的文件夹里面放不同的源文件,其中USER放程序文件,包括main函数,OJB里面放程序在编译过程中产生的文件,包括.hex
  • 在mdk5中左栏,右击选中Manage进行文件名修改和文件的添加
  • .hex文件的产生位置选择:魔术棒-output-select folder.....(然后选择obj文件夹)

  •  有时候会遇到头文件报错,一般是没有设置头文件路径导致的,设置方法如下:魔术棒-c/c++-include path (注意在添加的时候添加到最后一级)
  • 必须配置的全局宏定义,把STM32F10X_HD,USE_STDPERIPH_DRIVER输入到c/c++的Define选项框中
  • 到这一步后可以复制示例代码来看看有没有建立成功工程,如果复制遇到乱码,选择Edit-configura-Encoding-GB2312
  • 想加载已有源代码到自己的项目中(比如正点在代码示例中SYSTEM文件夹下自带的源代码),用刚刚说过的加载文件方法新建文件夹再把.c文件加进去
  •  如果想用还得把头文件的路径包含进去,include path里面加进去。

  • 使用的时候再程序里面加上 include“xxxxx.h”   

五、GPIO

概述:GPIO就是输入与输出的端口,用来和外设连接传输实现相应功能,stm32中使用寄存器来配置IO口的状态和电平,16个IO口(编号0-15)为一组,一组IO口由7个寄存器来配置,有4种输入(外设给引脚信号,芯片读取)和4种输出方式(芯片给引脚信号,外设读取) 

1.IO口内部电路及相关知识

  •  从右往左从上到下分析,保护二极管的作用是防止电信号过高或者过低,如果过高(大于VDD)则于VDD导通,而不会让过高的电压进入内部电路造成伤害,会用VDD的电压,同理如果过低则与VSS导通,用VSS的电压。
  • 上拉下拉电阻:电阻用来保护电路不过载,上拉开关打开相当于接入VDD为高电平,下拉开关打开相当于接入VSS为低电平。
  • TTL施密特触发器:当输入的电平高于设定最大值或者低于设定最小值时,电平才会发生相应跳变,讲一个例子来理解,规定两个值:0.2 和0.5,设输入电平为0.1,通过施密特触发器,因为0.1小于0.2,电平就为低电平,现在如果电平变为了0.4,但是因为只有高于设定最大值时,电平才会发生改变,所以现在依然为低电平,当电平变为0.7时,此时大于了0.5,电平才会变为高电平,这样一来原本电平不稳定的输入,在经过施密特触发器时,只有0和1两种结果,有模数转换的味道。
  • 所谓复用功能就是指外设模块信号再传输到其他外设模块上,不是给芯片的。
  • 你所看到的图片上的寄存器就是接下来要讲的配置GPIO要用到的寄存器。
  • P-MOS管和N-MOS管:
    上方的P-MOS导通,下方的N-MOS关闭,对外输出高电平
    下方的N-MOS导通,上方的P-MOS关闭,对外输出低电平

2.输入输出的8种模式

  • 输入 

1.模拟输入
        当IO引脚用作于ADC采集电压的输入通道时,用作“模拟输入功能”,此时不经过施密特触发器,因为需要最原始的电平信号,此外当模拟输入时,上下拉电阻是不会起作用的。
2.复用功能输入
        先需要设置引脚的复用功能,stm32其他片上外设的信号传到stm32上,由单片机读取外设的信息,例如串口通讯时,stm32接受信号
3.浮空输入
        上下拉电阻为关闭状态,没有默认输入
4.上拉输入
        上拉电阻开启,下拉电阻关闭,默认输入为高电平
5.下拉输入
        下拉电阻关闭,下拉电阻开启,默认输入为低电平

  • 输出

1.推挽输出
        两个MOS管均有效,可以输出强高电平和强低电平
2.开漏输出
        上方的P-MOS无效,只可以输出强低电平,如果要高电平需要接上拉电阻来拉高电平。
3.复用推挽输出,复用开漏输出
        stm32的引脚功能不唯一,有的引脚有复用功能,通过程序配置实现复用,此时走的是复用功能输出。

http://www.openedv.com/posts/list/21980.htm

 3.寄存器配置

  • 每个寄存器一般是32位
  •  GPIOx_CRL一共32位,每四位配置一个io口,其中四位中的低两位选择输入或输出模式和速度,四位中的高两位选择具体输入输出模式。 
  • GPIOx_IDR的低16位用作高低电平的信号存放(只能以16位字的形式读出),高16位保留不用。  
  • GPIOx_ODR的低16位用作高低电平的信号存放(以16位字的形式写入读出),高16位保留不用,GPIOx_BSRR可以单独对其进行位操作。 
  •   当一个io口做输入用,CRL配置位1000,它选择的是上拉/下拉输入,但没确定到底是上还是下,这时候可以用ODR来配置0/1来确定到底是上还是下。

  •  GPIOx_BSRR只能进行字操作,是用来改变寄存器ODR上的信息,修改规则如下红体字。 
  • GPIOx_BRR只能字操作,也是用来改变ODR的信息 ,规则如下。 

六、跑马灯程序教学

  • 概述:要学会新建工程,stm32不同于之前的项目,它利用了大量的包,而不是从头到尾的代码全部都要自己写,只需要学会调用函数,写好参数和main和基本逻辑就好了,整个编程是模块化编程的思想,掌握之前讲过的工程建立步骤很重要,在写代码的过程中要不停的查看函数包,利用右键的go to定位查看就好了,前提是在output选项卡里面要勾选Browse Information,跑马灯用到了rcc的时钟使能函数和GPIO的init初始化函数,最后利用之前讲过的寄存器和delay函数实现跑马灯的功能。

1.工程建立 

  1. 利用给好的Template模板去建立,在USER中进入并打开工程项目。
  2. 在USER同级目录下新建文件夹HAREWARE(硬件的意思),这个文件用于写自己的外设包代码。
  3. 在HAREWARE里面添加一个文件夹,用于写特定外设的代码(比如命名LED),然后在LED这个文件夹里面添加两个文件.c和.h
  4. 在从mdk5里面的左栏把HAREWARE新建并且添加LED文件夹的.c进去。
  5. 然后把.h的头文件路径添加进去。
  6. 完全仔细的配置看该博客的第四大点

2.函数介绍 

  • 指定哪一组IO口,和这组的哪一个引脚,并且配置好相关参数。 
  • 上面的图片有一个参数是结构体指针,该结构体是GPIO_InitTypeDef,里面配置的就是单个引脚的信息,下面的图片就是用typedef过后的结构体新建一个结构体来存放信息再传地址过去。

 

3.编程步骤

  • 调用rcc函数初始化IO口时钟
  • 找到要使用的IO口,调用GPIO_Init函数初始化IO口
  • 调用寄存器的库函数操作IO口的电平来达到效果,配合delay或其他函数使用效果更佳

  •  .h头文件写法

  •  查看函数具体内容,右击函数选择go to

  • 设置IO口的几种模式 

  • GPIO_init函数内容 

  • 对于本跑马灯实验用到的LED外设,对其所初始化的代码 

  •  在主函数main里面写的主体逻辑代码,此后编译烧写即可。 

4.寄存器操作实现跑马灯

和库函数的操作逻辑一样,直不过更加深入到寄存器,库函数是写入参数就完事,其实函数也得去配置寄存器才能实现相应的功能,这一小节就讲一讲怎么配置怎么利用寄存器来完成跑马灯程序。

  • 编程的逻辑步骤

时钟的初始化是必须要做的,库函数就写了两个参数,实际上这两个参数去配置了RCC_APB2ENR寄存器

之前的GPIO_Init函数初始化就是去配置了GPIOx_CRH/CRL寄存器

然后setbit和resetbit函数实现的电平输出功能属于GPIOx_ODR寄存器里面的内容

  •  时钟的寄存器

  •  寄存器初始化代码解读

 支持包里面给RCC做了定义,给了一个RCC的地址,而寄存器APB2ENR只是RCC时钟其中寄存器的一个,所以用->来找到APB2ENR,|= 的意思是或等于,a|=b的全写法就是:a=a|b,或运算的好处就是防止其他信息被改变,只有当或1的时候结果才是1,或0的话保持原来的数据,1<<3就是1左移三位从0001变成1000,而对于其他位来说都是0。

同理找到GPIOB的寄存器CRL,因为只需要控制第5个引脚,&=的目的是对控制5脚的寄存器做一个初始化但是不能改变其他寄存器位的信息,最后把想要配置的信息|=进去就好,ODR寄存器是控制信号输出的,先初始化给高电平,让它不要亮。

~(1<<5),1左移5位取反,变成1111...11011111,默认进行与运算。

  • main函数主逻辑

 5.位操作实现跑马灯

这个知识用起来很简单,但是想要理解其原理还是得有点计算机基础的,其思想就是把每个寄存器的每一个bit位用32位的地址表示,可以通过特定地址来找到特定的寄存器位,来对这个位进行操作,其中得用到编址,按字编址还是按位编址,下面细讲。

  • 位操作原理

 具体实现过程:我的理解是,在SRAM区8位用一个地址表示,所以是按字编址,但是如果想扩展到每一个bit位都能有自己的地址,就需要8MB,但是它扩展到32MB,那就一个位要隔4个地址,4x8=32,也就是看到的Ox22000000下一个就是Ox22000004,至于提到的32位地址,如果32位全部拿来编址用,些许有点恐怖,2^32=4x2^10x2^10x2^10=4G的容量,这里1MB其实按字编址20位够矣。

  •  位操作之好处

 位操作代码逻辑

虽然是位操作,但是该初始化的必不可少。

主函数实现逻辑用位操作。

PBout()看似函数,实则做过封装,里面有指向ODR寄存器的地址,填写的参数用来操作具体的指定位 。

尽管是位操作也是在调用函数,但是函数的封装由来得清楚,知道函数里面到底干了些什么事情,涉及到的地址映射稍微了解知道即可。

七、ADC模数转换 

八、USART IIC SPI 485通信协议

1.串口USART:全双工异步通信,规定波特率。

  • 运作模式:通过USB232硬件接口连接到CH340G芯片进行USB转TTL信号给单片机,CH340G会引出TXD和RXD给STM32连接,TXD是输出,RXD是输入,代码也可通过USB232进行烧写,其中就是用的串口一进行的烧写,串口和引脚的时钟和初始化做好了后就可以进行数据传输,我们利用串口助手进行串口一的数据传输与接受,实际上用串口助手发送的信息会通过USB232,CH340G的TXD发送到串口一的DR寄存器,电脑和单片机通过USB连接,USART1->DR,在经过软件硬件处理后会自动通过单片机一方的TXD和CH340G的RXD相连,再传给电脑打印到屏幕上。
  • 流程及相关知识:先进行GPIOA和串口一的时钟初始化,再配置引脚工作模式,复位串口一,配置串口一的CR1寄存器用于串口使能,设置中断,规定通信协议等,然后BRR寄存器设置波特率,再设置中断初始化和中断函数。
  • 我用过ADC通过窗口二与电脑实现数据通信,无非就是改变一下引脚和寄存器的初始化配置,代码还是通过串口一进行烧写,然后杜邦线把CH340G的RDX接到USART2的TXD上就好了。

2.IIC协议:半双工同步通信,用CLK时钟信号线。

  • 运作模式:USART两根线一送一收,IIC也是两根线,一个SDA传输数据,一个CLK传输时钟信号,PB6做SCL和PB7做SDA,数据通过SDA进行传输,通信对象是STM32和EEPROM存储器AT24C02,通过读写的特定规则时序进行数据传输。

3.SPI协议:全双工同步通信,用CLK时钟信号线。

  • 运作模式:SCK用于时钟信号,MISO主机输入从机输出,MOSI相反,和SS片选信号线,因为SPI支持挂载多个设备,PB12-15用作SPI通信的接口,通信对象是STM32和W25Q128,一种flash存储芯片,通信模式是通过写指令+数据和片选进行通信。

4.485协议:全双工异步通信,依托于USART2。

5.对比总结:

  • 11
    点赞
  • 77
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值