STM32F100xx学习.docx
《STM32F100xx学习.docx》由会员分享,可在线阅读,更多相关《STM32F100xx学习.docx(15页珍藏版)》请在冰豆网上搜索。
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的操作