STM32F100xx学习.docx

上传人:b****8 文档编号:10495527 上传时间:2023-02-14 格式:DOCX 页数:15 大小:414.14KB
下载 相关 举报
STM32F100xx学习.docx_第1页
第1页 / 共15页
STM32F100xx学习.docx_第2页
第2页 / 共15页
STM32F100xx学习.docx_第3页
第3页 / 共15页
STM32F100xx学习.docx_第4页
第4页 / 共15页
STM32F100xx学习.docx_第5页
第5页 / 共15页
点击查看更多>>
下载资源
资源描述

STM32F100xx学习.docx

《STM32F100xx学习.docx》由会员分享,可在线阅读,更多相关《STM32F100xx学习.docx(15页珍藏版)》请在冰豆网上搜索。

STM32F100xx学习.docx

STM32F100xx学习

STM100xx学习笔记

学习背景介绍

本人现在从事的工作是:

基于国家电网抄表系统的设计,本人所负责的工作是GPRS远程抄表部分的设计和维护。

声明:

本人就是一菜鸟。

希望一起学习。

学习硬件介绍

硬件是基于STM32F100VCT6和STM32F100VET6芯片之上,外围扩展了dataflash(W25Q64BVSSIG)、E2PROM(AT24LC256)、GPRS模块西门子的MC52i或广和通G600、红外接收和红外发送这些外转设备。

具有JTAG调试,JTAG工具是淘宝上买的65元,串口输出。

需要原理图,发邮箱至kikimimi@

学习软件介绍

软件是基于IAR4.42,开发语言是C语言

STM的固件库。

1、认识STM32系列芯片

对于此系列的芯片网上资料还是比较多,如果英文水平不是很好的,还可以下载中文版。

1.1、STM32系列产品命名规则

STM32F100VET6

产品系列

STM32=基于ARM®的32位微控制器

产品类型

F=通用类型

产品子系列

100=超值型

101=基本型

102=USB基本型,USB2.0全速设备

103=增强型

105或107=互联型

引脚数目

T=36脚

C=48脚

R=64脚

V=100脚

Z=144脚

闪存存储器容量

4=16K字节的闪存存储器

6=32K字节的闪存存储器

8=64K字节的闪存存储器

B=128K字节的闪存存储器

C=256K字节的闪存存储器

D=384K字节的闪存存储器

E=512K字节的闪存存储器

封装

H=BGA

T=LQFP

U=VFQFPN

Y=WLCSP64

温度范围

6=工业级温度范围,-40°C~85°C

7=工业级温度范围,-40°C~105°C

注:

本人只用过100超值型的芯片。

1.2、了解100型的内部资源

内核:

ARM32位的Cortex™-M3CPU

−最高24MHz工作频率(101、102、103可以达到72Mhz),在存储器的0等待周期访问时可达1.25DMips/MHz(Dhrystone2.1)

−单周期乘法和硬件除法

存储器

−从256K至512K字节的闪存程序存储器

−24K至32K字节的SRAM

−带4个片选的静态存储器控制器。

支持SRAM、PSRAM、NOR存储器

−并行LCD接口,兼容8080/6800模式

时钟、复位和电源管理

−2.0~3.6伏供电和I/O引脚

−上电/断电复位(POR/PDR)、可编程电压监测器(PVD)

−4~24MHz晶体振荡器

−内嵌经出厂调校的8MHz的RC振荡器

−内嵌带校准的40kHz的RC振荡器

−带校准功能的32kHzRTC振荡器

低功耗

−睡眠、停机和待机模式

−VBAT为RTC和后备寄存器供电

1个12位模数转换器,1.2μs转换时间(多达16个输入通道)

−转换范围:

0至3.6V

−三倍采样和保持功能

−温度传感器

2通道12位D/A转换器

多达112个快速I/O端口

−51/80/112个多功能双向的I/O口,所有I/O口可以映像到16个外部中断;几乎所有端口均可容忍5V信号

调试模式

−串行单线调试(SWD)和JTAG接口

多达16个定时器

−多达7个16位定时器,每个定时器有多达4个用于输入捕获/输出比较/PWM或脉冲计数的通道和增量编码器输入

−1个16位带死区控制和紧急刹车,用于电机控制的PWM高级控制定时器

–One16-bittimer,with2IC/OC,1OCN/PWM,dead-timegenerationandemergencystop

–Two16-bittimers,eachwithIC/OC/OCN/PWM,dead-timegenerationandemergencystop

−2个看门狗定时器(独立的和窗口型的)

−系统时间定时器:

24位自减型计数器

−2个16位基本定时器用于驱动DAC

多达11个通信接口

−多达2个I2C接口(支持SMBus/PMBus)

−多达5个USART接口(支持ISO7816,LIN,IrDA接口和调制解调控制)

−多达3个SPI接口(12M位/秒)

−CEC消费类电子产品控制Consumerelectronicscontrol(CEC)I/F

CRC计算单元,96位的芯片唯一代码

DMA:

12通道DMA控制器

−支持的外设:

定时器、ADC、DAC、SPI、I2C和USART

内部资源图

1.3、了解100型的内部框图

如何去看这个框图,首先我们应该了解几个总线:

Ibus:

该总线将Cortex™-M3内核的指令总线与闪存指令接口相连接。

指令预取在此总线上完成。

Dbus:

该总线将Cortex™-M3内核的DCode总线与闪存存储器的数据接口相连接(常量加载和调试访

问)。

系统总线:

此总线连接Cortex™-M3内核的系统总线(外设总线)到总线矩阵,总线矩阵协调着内核和DMA间的访问。

DMA总线:

此总线将DMA的AHB主控接口与总线矩阵相联,总线矩阵协调着CPU的DCode和DMA到SRAM、闪存和外设的访问。

总线矩阵:

总线矩阵协调内核系统总线和DMA主控总线之间的访问仲裁,仲裁利用轮换算法。

总线

矩阵包含4个驱动部件(CPU的DCode、系统总线、DMA总线)和4个被动部件(闪存存储器接口(FLITF)、SRAM、FSMC和AHBtoAPB桥)。

AHB外设通过总线矩阵与系统总线相连,允许DMA访问。

AHB/APB桥(APB):

两个AHB/APB桥在AHB和2个APB总线间提供同步连接。

APB1操作速度限于12MHz,APB2操作于全速(最高24MHz)。

表1有关连接到每个桥的不同外设的地址映射请参考。

在每一次复位以后,所有除SRAM和FLITF以外的外设都被关闭,在使用一个外设之前,必须设置寄存器RCC_AHBENR来打开该外设的时钟。

注意:

当对APB寄存器进行8位或者16位访问时,该访问会被自动转换成32位的访问:

桥会自动将8位或者32位的数据扩展以配合32位的向量。

AHB简介

AHB主要用于高性能模块(如CPU、DMA和DSP等)之间的连接,作为SoC的片上系统总线。

APB简介

APB主要用于低带宽的周边外设之间的连接,例如UART、1284等。

再了解几个时钟:

在STM32中,有五个时钟源,为HSI、HSE、LSI、LSE、PLL

①、HSI是高速内部时钟,RC振荡器,频率为8MHz。

②、HSE是高速外部时钟,可接石英/陶瓷谐振器,或者接外部时钟源,频率范围为4MHz~24MHz。

③、LSI是低速内部时钟,RC振荡器,频率为40kHz。

④、LSE是低速外部时钟,接频率为32.768kHz的石英晶体。

⑤、PLL为锁相环倍频输出,其时钟输入源可选择为HSI/2、HSE或者HSE/2。

倍频可选择为2~16倍,但是其输出频率最大不得超过24MHz。

PCLK1:

APB1的时钟

PCLK2:

APB2的时钟

HCLK:

AHB的时钟

FCLK:

是Cortex™-M3的自由运行时钟。

知道以上的概念之后此图就比较容易看懂了,此图其实就可以看成一个内核挂了很多外设包括闪存和SRAM这部分,维持内核的运行需要时钟,内核与外设的通信需要总线,总线就是AHB,AHB下面又可以挂高速的外设和低速的外设,这样就通过AHB桥转换成了APB1(低速)和APB2(高速)。

任何一款芯片时钟是一个主体,就像人的心脏一样,与人心脏不同的是,他可以倍频和分频,下面来看一下时钟树。

此外我们就以一个外部的8Mhz的晶振用PLL倍频到20MHz来举例。

当然内部也有一个8MHz的,偏差比较大,一般不用内部的。

通过寄存器可以选择是内部的还是外部的。

8MHz的外部晶振要达到20MHz的主频我们的方法是这样的:

首用高速外部时钟2分频为4MHz,再进行5倍频到20MHz。

CSS:

时钟安全系统

了解了STM32100的内部资源和框图之后我们就可以一部分一部分来学习了

2、系统时钟和复位

复位电路

时钟电路

2.1、复位

STM32F10xxx支持三种复位形式,分别为系统复位、上电复位和备份区域复位。

这里只讲系统复位,其它看参考手册

除了时钟控制器的RCC_CSR寄存器中的复位标志位和备份区域中的寄存器以外,系统复位将复位所有寄存器至它们的复位状态。

当发生以下任一事件时,产生一个系统复位:

1.NRST引脚上的低电平(外部复位)

2.窗口看门狗计数终止(WWDG复位)

3.独立看门狗计数终止(IWDG复位)

4.软件复位(SW复位)

5.低功耗管理复位

可通过查看RCC_CSR控制状态寄存器中的复位状态标志位识别复位事件来源。

2.2、时钟

三种不同的时钟源可被用来驱动系统时钟(SYSCLK):

●HSI振荡器时钟

●HSE振荡器时钟

●PLL时钟

这些设备有以下2种二级时钟源:

●40kHz低速内部RC,可以用于驱动独立看门狗和通过程序选择驱动RTC。

RTC用于从停机/

待机模式下自动唤醒系统。

●32.768kHz低速外部晶体也可用来通过程序选择驱动RTC(RTCCLK)。

当不被使用时,任一个时钟源都可被独立地启动或关闭,由此优化系统功耗。

3、让STM32运行起来

让STM32运行起来的首要条件就是硬件没有问题,电源、复位、晶振,当确定硬件没有问题的前提下,那就是如何是配置时钟的问题了。

配置时钟的思想是这样的:

一开始让内部高速时钟HSI运行起来(将外设RCC寄存器重设为缺省值)-->开启外部振荡器HSE等待HSE运行稳定–->HSE运行稳定之后对各个时钟进行分频–>如果用PLL倍频后的频率作为系统频率的话就开启PLL等待PLL稳定选择PLL作为系统时钟再使能各个外设的时钟

3.1阅读RCC的寄存器

暂时就看三个寄存器

第一个:

时钟控制寄存器(RCC_CR)

这个寄存器的作用是选择哪个时钟源作为系统频率的时钟源。

第二个:

时钟配置寄存器(RCC_CFGR)

这个寄存器的作用是选择分频的系数和倍频的系统。

第三个:

时钟中断寄存器(RCC_CIR)

这个寄存器的作用是开启和关闭所有时钟源的中断。

3.2时钟配置程序可以参照

/*******************************************************************************

*FunctionName:

RCC_Configuration

*Description:

Configuresthedifferentsystemclocks.

*Input:

None

*Output:

None

*Return:

None

*******************************************************************************/

voidRCC_Configuration(void)

{

/*RCCsystemreset(fordebugpurpose)*/

RCC_DeInit();//将外设RCC寄存器重设为缺省值,内部不需要去修改

/*EnableHSE*/

RCC_HSEConfig(RCC_HSE_ON);//HSE振荡器开启

/*WaittillHSEisready*/

HSEStartUpStatus=RCC_WaitForHSEStartUp();//等待HSE运行稳定

if(HSEStartUpStatus==SUCCESS)//如果HSE运行稳定了

{

/*EnablePrefetchBufferPRFTBE*/

FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);//使能预取指缓存

/*Flash2waitstate*/

//FLASH_SetLatency(FLASH_Latency_2);//设置代码延时值,2延时周期

FLASH_SetLatency(FLASH_Latency_0);//设置代码延时值,0延时周期xlg_change

//上面的这两句不明白什么意思,不过现在不管他,以后再理它

/*HCLK=SYSCLK*/

RCC_HCLKConfig(RCC_SYSCLK_Div1);//AHB总线时序不分频

/*PCLK2=HCLK*/

RCC_PCLK2Config(RCC_HCLK_Div1);//APB2时钟不分频(高速)

/*PCLK1=HCLK/2*/

RCC_PCLK1Config(RCC_HCLK_Div2);//APB1时钟2分频(低速)

/*PLLCLK=8MHz*9=72MHz*/

/*PLLCKLK=8MHz/2*5=20MHz//LeoZhang@Willas-Array

TheSTM32F100maxspeedis20MHz,其实是可以到达24M*/

RCC_PLLConfig(RCC_PLLSource_HSE_Div2,RCC_PLLMul_5);

//高速外部时钟2分频为4MHz,再进行5倍频20MHz

/*EnablePLL*/

RCC_PLLCmd(ENABLE);//开启PLL

/*WaittillPLLisready等待PLL运行稳定*/

while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==RESET)

{

}

/*SelectPLLassystemclocksource*/

RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);//选择PLL作为系统时钟

/*WaittillPLLisusedassystemclocksource*/

while(RCC_GetSYSCLKSource()!

=0x08)返回用作系统时钟的时钟源

{

}

}

//下面就是需要使用哪个外设就使能哪个外设

/*GPIOCclockenable*/

//RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC\

|RCC_APB2Periph_GPIOD|RCC_APB2Periph_GPIOE|RCC_APB2Periph_AFIO,ENABLE);//使能或者失能APB2外设时钟

RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);

//adc

RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);

/*TIM2clockenable*/

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);

/*TIM3clockenable*/

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);

/*EnableUSART2clock*/

RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);

RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE);

RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART4,ENABLE);

RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART5,ENABLE);

}

到上面为止我们就对RCC配置完成了,后面的工作就是需要应用外设的操作了。

4、GPIO的操作

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 法律文书 > 辩护词

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1