一天入门STM32
零基础学习STM32之入门学习路线

零基础学习STM32之⼊门学习路线 可以说就⽬前的市场需求来看,stm32在单⽚机领域已经拥有了绝对的地位,51什么的已经过时了也只能拿来打基础了,最后依然会转到stm32来,也正是因为这样stm32的学习者越来越多,其中不难发现绝⼤部分的stm32的学习者是在⼊门阶段的,所以今天我们就来聊聊stm32的⼊门学习路线。
先来看个图,相信会有所了解。
⾸先学习stm32 不管是C语⾔还是汇编肯定跑不了的所以C语⾔⼀样要打好基础,尤其是C语⾔中的指针,结构体,循环等等⼀些最基础的知识你要能够熟练应⽤,要不然对于从事stm32开发的难度是⾮常⼤的。
针对C语⾔我给⼤家推荐⼀个视频资料虽然是某某机构录的资料不过讲的倒是很详细值得⼀看 C语⾔⼊门视频教程_9天精通Linux C语⾔ 书籍的话其实不⽤买纸质的现在晚上电⼦版的pdf很多可以搜⼀下,我推荐两本《C和指针》《C语⾔核⼼技术》看着都还可以,⽹上就有我就不上传了。
然后就是要学会读stm32⼿册,不要⼩看这个现在市⾯上stm32的本⼦很多,原⼦,野⽕等等每⼀个公司的板⼦多少有些不同,没必要都去学会如果是那样我们的学习成本会成倍增长,毕竟每学习⼀个板⼦就要买⼀块板⼦,所以学会⼀个板⼦之后其他板⼦也是有很多相同的不同的那⼀部分我们学会读⼿册和⽂档就OK了。
⾄于其中的⼀些细节只是像什么中断,时钟,外设,ADC,DMA就不给⼤家⼀⼀介绍了⾃⼰找⼀套系统的学习资料就OK了,现在免费的多的是就算⾃⼰找个群进去要⼀套,遇到好⼼的⽹友给你⼀套也是有可能的,实在不⾏花个⼏⼗块钱⾃⼰去买⼀套,为了学习投⼊,这个⽆可厚⾮。
最后我再给⼤家推荐⼀个串⼝和⼀个直流电机驱动与测速的资料,玩⼩车和四轴想⾃⼰搞点⼩玩意的可以看看 ------------------------------------------ (stm32串⼝应⽤) 概念这么多,我该如何学 ------------------------------------------ 对于⼊门的朋友希望能够看在学成之后的薪资的⾯⼉上坚持住,其实只要坚持努⼒学习,总会等到苦尽⽢来的那⼀天。
STM32使用说明

STM32使用说明STM32是一系列由STMicroelectronics公司开发的32位微控制器,它们集成了处理器核、存储器和外设,并能够在嵌入式系统中控制硬件设备。
STM32系列芯片为工业控制、汽车电子、消费电子等领域的各种应用提供了高性能和低功耗的解决方案。
下面将介绍STM32的使用说明,包括其主要特性、开发工具和开发流程。
首先,STM32微控制器的主要特性如下:1. 32位核心处理器:STM32系列采用ARM Cortex-M处理器,具有高性能和低功耗的特点。
2.多种型号选择:STM32微控制器有多种不同型号可供选择,包括主频、封装、存储容量等方面的差异,以满足不同应用的需求。
3.丰富的外设:STM32集成了丰富的外设,包括通用输入输出(GPIO)、通用串行接口(USART)、SPI接口、I2C接口、定时器和PWM 生成器等,可用于连接各种外部传感器和执行器。
4.低功耗模式:STM32支持多种低功耗模式,通过灵活地控制功耗,可以延长电池寿命或减少功耗。
5. 丰富的开发生态系统:STMicroelectronics为STM32提供了完整的开发工具链和开发文档,包括编译器、调试器、开发板和软件库等,方便开发者进行应用开发和调试。
其次,STM32的开发工具包括以下几个方面:1. STM32Cube软件套件:这是STMicroelectronics提供的一套软件工具,用于开发和配置STM32芯片。
它包括STM32CubeMX配置工具和STM32Cube库,可以帮助开发者生成初始化代码、配置外设和生成项目模板。
2. Keil MDK:Keil是ARM公司提供的一套开发工具,包括C编译器、调试器和集成开发环境(IDE),可以用于编写、编译和调试STM32的应用程序。
3. IAR Embedded Workbench:IAR是一家瑞典公司开发的嵌入式开发工具,包括C编译器、调试器和IDE,在STM32的开发中也有广泛应用。
STM32入门教程

前言一天入门STM32,仅一天的时间,是否有真的这么快。
不同的人对入门的理解不一样,这篇一天入门STM32的教程,我们先对入门达成一个共识,如果你有异议,一天入门不了,请不要较真,不要骂街,保持一个工程师该有的修养,默默潜心学习,因为你还有很大的上升空间。
我眼中的入门:(前提是你学过51单片机和C语言)1、知道参考官方的什么资料来学习,而不是陷入一大堆资料中无从下手。
2、知道如何参考官方的手册和官方的代码来独立写自己的程序,而不是一味的看到人家写的代码就觉得人家很牛逼。
3、消除对STM32的恐惧,消除对库开发的恐惧,学习是一个快乐而富有成就感的过程。
第1章一天入门STM32本章参考资料:《STM32中文参考手册》《CM3权威指南CnR2》学习本章时,配合《STM32中文参考手册》GPIO章节一起阅读,效果会更佳,特别是涉及到寄存器说明的部分。
1.151与STM32简介51是嵌入式学习中一款入门级的精典MCU,因其结构简单,易于教学,且可以通过串口编程而不需要额外的仿真器,所以在教学时被大量采用,至今很多大学在嵌入式教学中用的还是51。
51诞生于70年代,属于传统的8位单片机,如今,久经岁月的洗礼,既有其辉煌又有其不足。
现在的市场产品竞争激烈,对成本极其敏感,相应地对MCU的要求也更苛刻:功能更多,功耗更低,易用界面和多任务。
面对这些要求,51现有的资源就显得得抓襟见肘了。
所以无论是高校教学还是市场需求,都急需一款新的MCU来为这个领域注入新的活力。
基于这市场的需求,ARM公司推出了其全新的基于ARMv7架构的32位Cortex-M3微控制器内核。
紧随其后,ST(意法半导体)公司就推出了基于Cortex-M3内核的MCU—STM32。
STM32凭借其产品线的多样化、极高的性价比、简单易用的库开发方式,迅速在众多Cortex-M3MCU中脱颖而出,成为最闪亮的一颗新星。
STM32一上市就迅速占领了中低端MCU市场,受到了市场和工程师的无比青睐,颇有星火燎原之势。
stm32自学笔记共20页

•
LED0=1;
•
LED1=0;
•
delay_ms(300);
•
}
•}
第二章 跑马灯实验
• Led.c函数
• void LED_Init(void)
•{
•
RCC->APB2ENR|=1<<2; //使能PORTA时钟
•
GPIOA->CRH|=0XFFFFFFFF3;//PA8 推挽输出
•
GPIOA->ODR|=1<<8; //PA8 输出高
• JTAG_Set(JTAG_SWD_DISABLE);//关闭JTAG和SWD,在原理图上可以看 到PA13和PA15为键盘和JTAG与SWD所共用,而这两种方针接口,他们 和普通的IO口公用,当想使用普通IO口时,必须先把他们关闭。在这 个函数里面设置参数,如果为二进制数00,则代表全部使能,如果是 二进制数01,则是能SWD,如果是10,则表示全部关闭。JTAG是一种 国际标准测试协议,主要用于芯片内部的测试。
• }要想实现一个点亮led小灯的功能,最少只需对3个寄存器进行设 置,第一步是设置外设时钟使能先把PORTA时钟使能,接下来把IO
口设置为输出,在接下来设置输出为高电平还是低电平,这里使用 推挽输出(3.3v),推挽输出主要是增强驱动能力,为外部提供大电 流。
第二章 跑马灯实验
• #ifndef __LED_H • #define __LED_H • #include "sys.h" • #define LED0 PAout(8)// PA8 • #define LED1 PDout(2)// PD2 • void LED_Init(void);//初始化
STM32通俗介绍

简述1STM32的输入输出管脚有下面8种可能的配置:(4输入+2输出+2复用输出)①浮空输入_IN_FLOATING②带上拉输入_IPU③带下拉输入_IPD(所谓上拉就是接一电阻到电源;下拉就是接一电阻到地。
也就是说带上拉就是口初始的时候是高电平,下拉就是低电平。
)④模拟输入_AIN⑤开漏输出_OUT_OD⑥推挽输出_OUT_PP⑦复用功能的推挽输出_AF_PP⑧复用功能的开漏输出_AF_OD1.1 I/O口的输出模式下,有3种输出速度可选(2MHz、10MHz和50MHz),这个速度是指I/O口驱动电路的响应速度而不是输出信号的速度,输出信号的速度与程序有关(芯片内部在I/O口的输出部分安排了多个响应速度不同的输出驱动电路,用户可以根据自己的需要选择合适的驱动电路)。
通过选择速度来选择不同的输出驱动模块,达到最佳的噪声控制和降低功耗的目的。
高频的驱动电路,噪声也高,当不需要高的输出频率时,请选用低频驱动电路,这样非常有利于提高系统的EMI性能。
当然如果要输出较高频率的信号,但却选用了较低频率的驱动模块,很可能会得到失真的输出信号。
关键是GPIO的引脚速度跟应用匹配(推荐10倍以上?)。
比如:1.1.1 对于串口,假如最大波特率只需115.2k,那么用2M的GPIO的引脚速度就够了,既省电也噪声小。
1.1.2 对于I2C接口,假如使用400k波特率,若想把余量留大些,那么用2M的GPIO的引脚速度或许不够,这时可以选用10M的GPIO引脚速度。
1.1.3 对于SPI接口,假如使用18M或9M波特率,用10M的GPIO的引脚速度显然不够了,需要选用50M的GPIO的引脚速度。
输入模式。
1.4 所有端口都有外部中断能力。
为了使用外部中断线,端口必须配置成输入模式。
1.5 GPIO口的配置具有上锁功能,当配置好GPIO口后,可以通过程序锁住配置组合,直到下次芯片复位才能解锁。
2 在STM32中如何配置片内外设使用的IO端口首先,一个外设经过①配置输入的时钟和②初始化后即被激活(开启);③如果使用该外设的输入输出管脚,则需要配置相应的GPIO端口(否则该外设对应的输入输出管脚可以做普通GPIO管脚使用);④再对外设进行详细配置。
最简单的STM32入门教程

最简单的STM32入门教程展开全文本文讲述的是如何从零开始,使用keil建立一个简单的STM32的工程,并闪烁LED灯,给小白看。
第零步,当然首先你得有一个STM32的板子,其IO口上接了一个LED。
第一步,建立一个文件夹0.0第二步,打开keil,建立工程在弹出来的对话框中选择你所用的STM32的芯片。
在接下来弹出来的对话框中选择是,这样keil就帮我们建立好了启动文件。
第三步,新建一个main.c文件,并添加到工程中。
点击New按钮,建立一个文本文件。
在建立的文本文件中输入C中的main函数点击保存保存后,将文件添加到工程中第四步,点击编译可以看到keil有报错错误信息为:没有定义的符号SystemInit ,这是因为在启动文件中有调用SystemInit 函数,但是我们没有定义它,如下图:暂时不用理会上述启动文件中汇编的含义,只需在main.c 中添加该函数即可消除该错误。
修改后再编译,程序没有报错了。
至此,一个STM32的工程就建立完成了。
第五步,将下面的代码复制粘贴1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 #define PERIPH_BASE ((unsigned int)0x40000000) #define APB2PERIPH_BASE (PERIPH_BASE + 0x10000)#define GPIOA_BASE (APB2PERIPH_BASE + 0x0800) #define GPIOB_BASE (APB2PERIPH_BASE + 0x0C00) #define GPIOC_BASE (APB2PERIPH_BASE + 0x1000) #define GPIOD_BASE (APB2PERIPH_BASE + 0x1400) #define GPIOE_BASE (APB2PERIPH_BASE + 0x1800) #define GPIOF_BASE (APB2PERIPH_BASE + 0x1C00) #define GPIOG_BASE (APB2PERIPH_BASE + 0x2000) #define GPIOA_ODR_Addr (GPIOA_BASE+12) //0x4001080C #define GPIOB_ODR_Addr (GPIOB_BASE+12) //0x40010C0C #define GPIOC_ODR_Addr (GPIOC_BASE+12) //0x4001100C #define GPIOD_ODR_Addr (GPIOD_BASE+12) //0x4001140C #define GPIOE_ODR_Addr (GPIOE_BASE+12) //0x4001180C#define GPIOF_ODR_Addr (GPIOF_BASE+12) //0x40011A0C #define GPIOG_ODR_Addr (GPIOG_BASE+12) //0x40011E0C#define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x2000000+((addr&0xFFFFF)<<5)+(bitnum<<2))19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 #define MEM_ADDR(addr) *((volatile unsigned long *)(addr)) #define LED0 MEM_ADDR(BITBAND(GPIOA_ODR_Addr,8))//#define LED0 *((volatile unsigned long *)(0x422101a0)) //PA8 typedef struct{volatile unsigned int CR;volatile unsigned int CFGR;volatile unsigned int CIR;volatile unsigned int APB2RSTR;volatile unsigned int APB1RSTR;volatile unsigned int AHBENR;volatile unsigned int APB2ENR;volatile unsigned int APB1ENR;volatile unsigned int BDCR;volatile unsigned int CSR;} RCC_TypeDef;#define RCC ((RCC_TypeDef *)0x40021000)typedef struct{volatile unsigned int CRL;volatile unsigned int CRH;volatile unsigned int IDR;volatile unsigned int ODR;volatile unsigned int BSRR;volatile unsigned int BRR;volatile unsigned int LCKR;} GPIO_TypeDef;#define GPIOA ((GPIO_TypeDef *)GPIOA_BASE)void LEDInit(void){RCC->APB2ENR|=1<<2; //GPIOA 时钟开启GPIOA->CRH&=0XFFFFFFF0;GPIOA->CRH|=0X00000003;}//粗略延时void Delay_ms(volatile unsigned int t){unsigned int i,n;for(n=0;n<t;n++)for(i=0;i<800;i++);}int main(void){LEDInit();636465666768697071727374757677787980818283 while(1){LED0=0;Delay_ms(500);LED0=1;Delay_ms(500); }}void SystemInit(void){}下面一段是对代码的简单讲解,可不用太深入。
stm32 cube programmer 使用说明

stm32 cube programmer 使用说明STM32 Cube Programmer 是一款用于编程和调试ST微电子公司的STM32微控制器的软件工具。
本文将为您提供使用STM32 Cube Programmer的详细说明,以帮助您快速上手。
1. 软件安装:您需要从ST微电子公司的官方网站上下载并安装STM32 Cube Programmer软件。
安装完成后,您可以在开始菜单中找到并启动该软件。
2. 连接硬件:在开始使用STM32 Cube Programmer之前,您需要确保您的STM32微控制器板卡已经正确连接到计算机。
请使用USB线缆将STM32板卡连接到计算机的USB端口。
3. 打开工程:在STM32 Cube Programmer的主界面上,点击“File”并选择“Open Project”选项,然后导航到您的工程文件所在的位置。
选择并打开您要进行编程的工程文件。
4. 配置目标设置:在左侧"Target"选项卡中,选择与您所使用的STM32微控制器主板对应的型号。
您还可以选择烧录器件的存储器类型和起始地址。
5. 配置编程操作:在"Read & Write"选项卡中,您可以选择读取或编写操作。
选择“Read”以读取目标设备的存储器数据,或选择“Write”以将编程文件烧录到目标设备。
6. 选择编程文件:在"File"选项卡中,点击“Browse”按钮以导航到您的编程文件所在的位置。
选择正确的文件并点击“打开”将其载入STM32 Cube Programmer。
7. 开始编程:确保您已经正确连接了目标设备并选择了正确的编程文件后,点击"Run"选项卡中的“Start”按钮以开始编程操作。
软件将自动执行编程过程并显示进度和结果。
8. 调试功能:STM32 Cube Programmer还提供了调试功能,您可以使用该工具进行调试操作以检查程序的运行状态。
stm32编程流程

stm32编程流程一、准备工作在开始进行STM32编程之前,我们需要进行一些准备工作,包括以下几个方面:1. 硬件准备:选择适合的STM32开发板或芯片,确保其具备所需的功能和性能。
2. 软件准备:下载安装相应的开发工具,如Keil MDK或IAR Embedded Workbench,并确保其与所选硬件兼容。
3. 学习资料:阅读有关STM32系列微控制器的相关文档和参考手册,熟悉其架构、功能和寄存器设置等信息。
二、编程环境设置在进行STM32编程之前,我们需要进行编程环境的设置,包括以下几个方面:1. 创建工程:在开发工具中创建一个新的工程,选择适合的目标芯片,并设置工程的名称和保存路径。
2. 配置工程:对工程进行一些基本设置,如选择编译器、设置编译选项、配置调试器等。
3. 导入库文件:根据需要,导入相应的库文件,以便在编程过程中使用已封装好的函数和驱动程序。
三、编写代码在编程环境设置完成后,我们可以开始编写代码,包括以下几个步骤:1. 初始化系统:配置系统时钟、中断向量表、外设时钟等,以确保系统正常运行。
2. 配置外设:根据实际需求,配置各个外设的工作模式、时钟源、中断使能等参数。
3. 编写主程序:编写主程序的逻辑,包括数据处理、控制算法、通信协议等。
4. 编写中断服务程序:根据需要,编写中断服务程序来处理外部中断、定时器中断等事件。
四、编译和调试在代码编写完成后,我们需要进行编译和调试,以确保代码的正确性和可靠性,包括以下几个步骤:1. 编译代码:使用开发工具提供的编译器对代码进行编译,检查是否有语法错误和警告信息。
2. 烧录程序:将编译生成的可执行文件烧录到目标芯片中,以便在硬件上运行和测试。
3. 调试程序:使用调试器和仿真器等工具,对程序进行单步调试、观察变量值和寄存器状态等。
五、测试和优化在完成编译和调试后,我们需要对程序进行测试和优化,以确保其性能和稳定性,包括以下几个步骤:1. 功能测试:对程序的各个功能进行测试,确保其符合预期的行为和结果。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
前言一天入门STM32,仅一天的时间,是否有真的这么快。
不同的人对入门的理解不一样,这篇一天入门STM32的教程,我们先对入门达成一个共识,如果你有异议,一天入门不了,请不要较真,不要骂街,保持一个工程师该有的修养,默默潜心学习,因为你还有很大的上升空间。
我眼中的入门:(前提是你学过51单片机和C语言)1、知道参考官方的什么资料来学习,而不是陷入一大堆资料中无从下手。
2、知道如何参考官方的手册和官方的代码来独立写自己的程序,而不是一味的看到人家写的代码就觉得人家很牛逼。
3、消除对STM32的恐惧,消除对库开发的恐惧,学习是一个快乐而富有成就感的过程。
第1章一天入门STM32本章参考资料:《STM32中文参考手册》《CM3权威指南CnR2》学习本章时,配合《STM32中文参考手册》GPIO章节一起阅读,效果会更佳,特别是涉及到寄存器说明的部分。
1.151与STM32简介51是嵌入式学习中一款入门级的精典MCU,因其结构简单,易于教学,且可以通过串口编程而不需要额外的仿真器,所以在教学时被大量采用,至今很多大学在嵌入式教学中用的还是51。
51诞生于70年代,属于传统的8位单片机,如今,久经岁月的洗礼,既有其辉煌又有其不足。
现在的市场产品竞争激烈,对成本极其敏感,相应地对MCU的要求也更苛刻:功能更多,功耗更低,易用界面和多任务。
面对这些要求,51现有的资源就显得得抓襟见肘了。
所以无论是高校教学还是市场需求,都急需一款新的MCU来为这个领域注入新的活力。
基于这市场的需求,ARM公司推出了其全新的基于ARMv7架构的32位Cortex-M3微控制器内核。
紧随其后,ST(意法半导体)公司就推出了基于Cortex-M3内核的MCU—STM32。
STM32凭借其产品线的多样化、极高的性价比、简单易用的库开发方式,迅速在众多Cortex-M3MCU中脱颖而出,成为最闪亮的一颗新星。
STM32一上市就迅速占领了中低端MCU市场,受到了市场和工程师的无比青睐,颇有星火燎原之势。
作为一名合格的嵌入式工程师,面对新出现的技术,我们不是充耳不闻,而是要尽快吻合市场的需要,跟上技术的潮流。
如今STM32的出现就是一种趋势,一种潮流,我们要做的就是搭上这趟快车,让自己的技术更有竞争力。
1.1.151与STM32架构的区别我们先普及一个概念,单片机(即MCU)里面有什么。
一个人最重要的是大脑,身体的各个部分都在大脑的指挥下工作。
MCU跟人体很像,简单来说是由一个最重要的内核加其他外设组成,内核就相当于人的大脑,外设就如人体的各个功能器官。
下面我们来简单介绍下51和STM32的结构。
1.51系统结构51系统结构框图图151系统结构框图我们说的51一般是指51系列的单片机,型号有很多,常见的有STC89C51、AT89S51,其中国内用的最多的是STC89C51/2,下面我们就以STC89C51来讲解,并以51简称。
内核51由一个IP核和片上外设组成,IP核就是上图中的CPU,片上外设就是上图中的:时钟电路、SFR和RAM、ROM、定时/计数器、并行I/O口、串行I/O口、中断系统。
IP 核跟外设之间由系统总线连接,且是8bit的,速度有限。
51内核是上个世纪70年代intel公司设计的,速度只有12M,外设是IC厂商(STC)在内核的基础上添加的,不同的IC厂商会在内核上添加不同的外设,从而设计出各具特色的单片机。
这里intel属于IP核厂商,STC属于IC厂商。
我们后面要讲的STM32也一样,ARM属于IP核厂商,ARM给ST授权,ST公司在Cortex-M3内核的基础上设计出STM32单片机。
外设我们在学习51的时候,关于内核部分接触的比较少,使用的最多的是片上外设,我们在编程的时候操作的也就是这些外设。
编程的时候操作的寄存器位于SFR和RAM这个部分,其中SFR(特殊功能寄存器)占有128字节(实际上只用了26个字节,只有26个寄存器,其他都属于保留区),RAM 占有128字节,我们在程序中定义的变量就是放在RAM中。
其中SFR和RAM在地址上是重合的,都是在80~FF这个地址区间,但在物理区间上是分开的,所以51的RAM是有256个字节。
编写好的程序是烧写到ROM区。
剩下的外设都是我们非常熟悉的IO口,串口、定时器、中断这几个外设。
2.STM32系统结构STM32系统结构框图图2STM32系统结构框图内核在系统结构上,STM32和51都属于单片机,都是由内核和片上外设组成。
只是STM32使用的Cortex-M3内核比51复杂得多,优秀得多,支持的外设也比51多得多,同时总线宽度也上升到32bit,无论速度、功耗、外设都强与51。
从结构框图上看,对比51内核只有一种总线,取指和取数共用。
Cortex-M3内部有若干个总线接口,以使CM3能同时取址和访内(访问内存),它们是:指令存储区总线(两条)、系统总线、私有外设总线。
有两条代码存储区总线负责对代码存储区(即FLASH外设)的访问,分别是I-Code总线和D-Code总线。
I-Code用于取指,D-Code用于查表等操作,它们按最佳执行速度进行优化。
系统总线(System)用于访问内存和外设,覆盖的区域包括SRAM,片上外设,片外RAM,片外扩展设备,以及系统级存储区的部分空间。
私有外设总线负责一部分私有外设的访问,主要就是访问调试组件。
它们也在系统级存储区。
还有一个MDA总线,从字面上看,DMA是data memory access的意思,是一种连接内核和外设的桥梁,它可以访问外设、内存,传输不受CPU的控制,并且是双向通信。
简而言之,这个家伙就是一个速度很快的且不受老大控制的数据搬运工,这个在51里面是没有的。
外设从结构框图上看,STM32比51的外设多得多,51有的串口、定时器、IO口等外设STM32都有。
STM32还多了很多特色外设:如FSMC、SDIO、SPI、I2C等,这些外设按照速度的不同,分别挂载到AHB、APB2、APB1这三条总线上。
3.小结从内核和外设这两大方面来比较,STM32之于51就是一个升级版的单片机。
它适应市场,引流潮流,在中低端的微控制器中流光溢彩。
1.2学习方法的区别学习51用寄存器,学习STM32用库。
以前我们在学习51的时候,用的是寄存器编程的方法,想要实现什么效果,直接往寄存器里面赋值,优点是直观,简单粗暴,知道自己具体干了啥,心里踏实。
直接操作寄存器之所以在51上可行,究其原因,我想有两点:1、51主频不高,资源有限,必须注重程序执行的效率,只能直接操作寄存器。
关键的地方还得用汇编,不适合用固件库。
要知道当初我们学习51单片机的时候用的还是汇编,连现在的C编程都不是,就更别说什么库函数编程。
2、51功能简单,寄存器不多。
以国内普及最广的STC89C52为例,寄存器全部加起来不到30个。
按照功能区分来记的话,可以把每个寄存器背的滚瓜烂熟,并且寄存器每一位的功能都可以记得住,在编程的时候做到了然于胸。
现在从51过度到STM32的学习,很多人还是喜欢沿用51的学习方法。
接受不了库,在学习库的时候陷入迷糊之中,来回几个月下来,都不知道到底有没学会STM32,因为在这一路的学习中都是在调用库函数,压根就没有操作过寄存器,心里面很不踏实。
其实大家在调用库函数的时候心中难道就没有疑问,库的底层是怎么实现的?难道就没有勇气对库的底层一探究竟。
可最后当我们开始跟踪库函数底层的时候,看到一堆的宏定义、结构体、指针、各种的文件包含,而且注释全部都是英文的,是不是又心生忌惮。
鉴于此,我想用两个原因来总结下很多初学者畏惧库不愿意用库的原因。
1、C语言知识点的欠缺库在实现寄存器映像时使用的宏定义,强制类型转换,在定义寄存器时使用的结构体,在外设初始化函数时使用的指针,在组织头文件时使用的条件编译等C语言知识,在大学课程中很少涉及,大多数老师也基本是不讲。
在一些简单的51单片机编程中又很少会用到这些知识。
学单片机,做嵌入式开发其实80%的工作都跟C语言编程相关,剩下的20%的工作就是阅读各种数据手册,熟悉各种硬件外设。
所以掌握这些基本的C语言知识,是嵌入式学习中一道迈不过去的坎,STM32的库则给了我们一次提升C的机会。
凡是可以从书本中找到的,相信我们基本都可以学会,很多初学者并不是不够聪明或者勤奋,只是缺少方向性的指导罢了。
对于这欠缺的知识点我们稍微花点时间就可以掌握,剩下的就是不断地实践调试。
这里我为大家推荐一本C语言的书籍《C和指针》。
2、程序架构设计思想的欠缺这个比较难搞,很多C语言学习得挺好好的人,也比较难掌握。
还好我们遇到了STM32的库,这给了我们一个学习和提升C语言绝佳的机会。
库的整个架构是如何搭建起来的,代码上是如何如何一步一步写出来的:从寄存器映像开始,到寄存器的封装,然后到函数的编写,到每个外设函数对应的驱动文件,这里面涉及到了大量的条件编译,文件包含的思想,对应刚写过几行51单片机的初学者来说简直就是噩梦。
但是,如果你把这一系列的关系弄明白了,那么对库的整个架构也了解的差不多了,以后你就不用嚷嚷着说要操作寄存器了。
如果你一开始不喜欢用库,对库开发很忌惮,那么请自问:是不是我的C语学得不够好。
库是一种全新的学习方法,是一种潮流,我更把它看做是与C语言的又一次历练和提升。
是否用库,只差你一个闪亮的回眸。
1.3用寄存器点亮LED为了顺利过渡到库开发,在STM32编程的开始,我们对照51点亮一个LED的方法,给大家演示一下STM32如何用操作寄存器的方法点亮一个LED,然后再慢慢讲解到底什么是库,让大家知道库跟寄存器的关系。
1.3.1用51点亮一个LED在用STM32点亮一个LED之前,我们先来复习下用51如何点亮一个LED。
硬件上我们假设51单片机的P0口的第0位接了一个LED,负逻辑亮。
如果我们要点亮这个LED,代码上我们会这么写:1P0=0XFE;//总线操作点亮LED这时候我们就把LED点亮了,如果要关掉LED,则是:1P0=0XFF;//总线操作关闭LED这里面我们用的是总线操作的方法,即是对P0口的8个IO同时操作,但起作用的只是P0^0。
除了这种总线操作的方法,我们还学习过位操作,利用51编译器的关键字sbit,我们可以定义一个位变量:1sbit LED=P0^0;那么LED=0;就点亮了LED,LED=1;就关闭了LED。
为了让程序看起来见名知义,我们定义两个宏:1#define ON02#define OFF1点亮和关闭LED的代码就变成了:1LED=ON;//位操作点亮LED2LED=OFF;//位操作关闭LED稍微整理下代码,整体的效果就是:1//假设51单片机的P0^0口接LED,负逻辑点亮23#define ON04#define OFF156sbit LED=P0^0;78void main(void)9{10P0=0XFE;//总线操作点亮LED11P0=0XFF;//总线操作关闭LED1213LED=ON;//位操作点亮LED14LED=OFF;//位操作关闭LED15}上面总线和位操作的的方法,学过51的朋友是非常熟悉的,也很容易理解。