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

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

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

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

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

  • 正点原子资料网站
  • 正点原子论坛(解决遇到的问题)
  • ST社区(解决问题用)
  • 推荐的B站stm32教学视频.1   (从软件安装,基本单片机知识介绍开始)
  • 推荐的B站stm32教学视频.2   (正点官方,从资料介绍,环境安装开始)
  • 推荐的B站stm32教学视频.3   (直接进行案例实操)
  • 推荐的B站stm32教学视频.4   (从学习方法,板子介绍,环境安装开始)

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

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


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

STM32之学习总结(正点原子精英版V1,不定时更新)_第1张图片


  •  供电注意事项

STM32之学习总结(正点原子精英版V1,不定时更新)_第2张图片


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

STM32之学习总结(正点原子精英版V1,不定时更新)_第3张图片


  • 开发板遇到问题


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


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


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

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

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

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

注意事项 

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

STM32之学习总结(正点原子精英版V1,不定时更新)_第4张图片

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

STM32之学习总结(正点原子精英版V1,不定时更新)_第5张图片

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

1.点击魔术棒后

STM32之学习总结(正点原子精英版V1,不定时更新)_第6张图片

2.勾选后选择Settings

STM32之学习总结(正点原子精英版V1,不定时更新)_第7张图片

3.然后选择Flash Download

STM32之学习总结(正点原子精英版V1,不定时更新)_第8张图片

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

STM32之学习总结(正点原子精英版V1,不定时更新)_第9张图片

到此st-link配置完成。 

四、工程建立

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

STM32之学习总结(正点原子精英版V1,不定时更新)_第10张图片

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

STM32之学习总结(正点原子精英版V1,不定时更新)_第11张图片

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

STM32之学习总结(正点原子精英版V1,不定时更新)_第13张图片

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

五、GPIO

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

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

STM32之学习总结(正点原子精英版V1,不定时更新)_第14张图片

  •  从右往左从上到下分析,保护二极管的作用是防止电信号过高或者过低,如果过高(大于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种模式

STM32之学习总结(正点原子精英版V1,不定时更新)_第15张图片

  • 输入 

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口,其中四位中的低两位选择输入或输出模式和速度,四位中的高两位选择具体输入输出模式。STM32之学习总结(正点原子精英版V1,不定时更新)_第16张图片 
  • GPIOx_IDR的低16位用作高低电平的信号存放(只能以16位字的形式读出),高16位保留不用。 STM32之学习总结(正点原子精英版V1,不定时更新)_第17张图片 
  • GPIOx_ODR的低16位用作高低电平的信号存放(以16位字的形式写入读出),高16位保留不用,GPIOx_BSRR可以单独对其进行位操作。STM32之学习总结(正点原子精英版V1,不定时更新)_第18张图片 
  •   当一个io口做输入用,CRL配置位1000,它选择的是上拉/下拉输入,但没确定到底是上还是下,这时候可以用ODR来配置0/1来确定到底是上还是下。STM32之学习总结(正点原子精英版V1,不定时更新)_第19张图片

  •  GPIOx_BSRR只能进行字操作,是用来改变寄存器ODR上的信息,修改规则如下红体字。STM32之学习总结(正点原子精英版V1,不定时更新)_第20张图片 
  • GPIOx_BRR只能字操作,也是用来改变ODR的信息 ,规则如下。STM32之学习总结(正点原子精英版V1,不定时更新)_第21张图片 

六、跑马灯程序教学

  • 概述:要学会新建工程,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口,和这组的哪一个引脚,并且配置好相关参数。 STM32之学习总结(正点原子精英版V1,不定时更新)_第22张图片
  • 上面的图片有一个参数是结构体指针,该结构体是GPIO_InitTypeDef,里面配置的就是单个引脚的信息,下面的图片就是用typedef过后的结构体新建一个结构体来存放信息再传地址过去。STM32之学习总结(正点原子精英版V1,不定时更新)_第23张图片

STM32之学习总结(正点原子精英版V1,不定时更新)_第24张图片 STM32之学习总结(正点原子精英版V1,不定时更新)_第25张图片

STM32之学习总结(正点原子精英版V1,不定时更新)_第26张图片

3.编程步骤

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

STM32之学习总结(正点原子精英版V1,不定时更新)_第27张图片

  •  .h头文件写法

STM32之学习总结(正点原子精英版V1,不定时更新)_第28张图片

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

STM32之学习总结(正点原子精英版V1,不定时更新)_第29张图片 

  • 设置IO口的几种模式 

STM32之学习总结(正点原子精英版V1,不定时更新)_第30张图片

  • GPIO_init函数内容 

STM32之学习总结(正点原子精英版V1,不定时更新)_第31张图片

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

STM32之学习总结(正点原子精英版V1,不定时更新)_第32张图片

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

STM32之学习总结(正点原子精英版V1,不定时更新)_第33张图片

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

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

  • 编程的逻辑步骤

STM32之学习总结(正点原子精英版V1,不定时更新)_第34张图片 

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

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

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

  •  时钟的寄存器

STM32之学习总结(正点原子精英版V1,不定时更新)_第35张图片 

  •  寄存器初始化代码解读

STM32之学习总结(正点原子精英版V1,不定时更新)_第36张图片

 支持包里面给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函数主逻辑

STM32之学习总结(正点原子精英版V1,不定时更新)_第37张图片

 5.位操作实现跑马灯

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

  • 位操作原理

 具体实现过程:我的理解是,在SRAM区8位用一个地址表示,所以是按字编址,但是如果想扩展到每一个bit位都能有自己的地址,就需要8MB,但是它扩展到32MB,那就一个位要隔4个地址,4x8=32,也就是看到的Ox22000000下一个就是Ox22000004,至于提到的32位地址,如果32位全部拿来编址用,些许有点恐怖,2^32=4x2^10x2^10x2^10=4G的容量,这里1MB其实按字编址20位够矣。STM32之学习总结(正点原子精英版V1,不定时更新)_第38张图片

  •  位操作之好处

STM32之学习总结(正点原子精英版V1,不定时更新)_第39张图片

STM32之学习总结(正点原子精英版V1,不定时更新)_第40张图片

 位操作代码逻辑

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

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

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

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

STM32之学习总结(正点原子精英版V1,不定时更新)_第41张图片

STM32之学习总结(正点原子精英版V1,不定时更新)_第42张图片

你可能感兴趣的:(stm32学习之路,单片机,stm32,单片机,学习,嵌入式硬件)