STM总结.docx
《STM总结.docx》由会员分享,可在线阅读,更多相关《STM总结.docx(14页珍藏版)》请在冰点文库上搜索。
STM总结
固件函数库
VoidRCC_Configuration(void)时钟设置函数
VoidGPIO_Configuration(void)GPIO引脚初始化设置
VoidSystick_Configuration(void)系统定时器设置函数
voidUSART_Configuration(void)USART收发器设置
ErrorStatus枚举值
RCC_DeInit();将外设RCC寄存器重设为缺省值
RCC_HSEConfig();设置外部高速晶振
RCC_WaitForHSEStartUp();等待HSE起振
RCC_HCLKConfig();设置AHB时钟
RCC_PCLK1Config();设置低速AHB时钟
RCC_PCLK2Config();设置高速AHB时钟
RCC_SYSCLK_DivnAHB时钟=系统时钟/n
RCC_PLLConfig();设置PLL时钟源及倍频系数
RCC_PLLCmd();使能或失能PLL
RCC_GetSYSCLKSource();返回用作系统时钟的时钟源
RCC_GetFlagStatus();检查指定的RCC标志位设置与否
RCC_AHBPeriphClockCmd();使能或失能AHB外设时钟
RCC_APB1PeriphClockCmd();使能或失能APB1外设时钟
RCC_APB2PeriphClockCmd();使能或失能APB2外设时钟
RCC_PLLSource_HSE_Div1PLL的输入时钟=HSE时钟频率
RCC_PLLSource_HSE_Div2PLL的输入时钟=HSE时钟频率/2
RCC_PLLSource_HSI_Div2PLL的输入时钟=HSI时钟频率/2
RCC_PLLMul_nPLL输入时钟*n
RCC_FLAG_PLLRDYPLL就绪
RCC_APB2Periph_GPIOAGPIOA时钟
RCC_APB2Periph_GPIOBGPIOB时钟
RCC_APB2Periph_GPIOCGPIOC时钟
RCC_APB2Periph_GPIODGPIOD时钟
RCC_APB2Periph_GPIOEGPIOE时钟
RCC_APB2Periph_ALL全部APB2外设时钟
RESE重置
GPIO_InitTypeDefGPIO结构体
GPIO_InitStructure指向结构体GPIO_InitTypeDef的指针
GPIO_Pin_n选择待设置的GPIO管脚使用“|”可以一次选中多个
GPIO_Speed设置选中管脚的速率
GPIO_Speed_10MHz最多输出速率10MHz
GPIO_Speed_2MHz最多输出速率2MHz
GPIO_Speed_50MHz最多输出速率50MHz
GPIO_Mode设置管脚的工作状态
GPIO_Mode_AIN模拟输入
GPIO_Mode_IN_FLOATING浮空输入
GPIO_Mode_IPD下拉输入
GPIO_Mode_IPU上拉输入
GPIO_Mode_Out_PP推挽输出
GPIO_Mode_Out_OD开漏输出
GPIO_Mode_AF_OD复用开漏输出
GPIO_Mode_AF_PP复用推挽输出
GPIO_Init();根据GPIO_InitStruct中指定的参数初始化外设GPIO_x寄存器
SysTick_CounterCmd();使能或失能SysTick计数器
SysTick_Counter_Disable失能计数器
SysTick_Counter_Enable使能计数器
SysTick_Counter_Clear清除计数器的值为0
SysTick_CLKSourceConfig();设置SysTick时钟源
SysTick_CLKSource_HCLK_Div8SysTick时钟源为AHB时钟/8
SysTick_CLKSource_HCLKSysTick时钟源为AHB时钟
SysTick_SetReload();设置SysTick重装载值
FLASH_SetLatency();设置代码延时值
FLASH_PrefetchBufferCmd();使能或失能预取指缓存
FLASH_PrefetchBuffer_Enable预取指缓存使能
FLASH_PrefetchBuffer_Disable预取指缓存失能
FLASH_Latency用来设置FLASH储存器延时时钟周期数
FLASH_Latency_00延时周期
FLASH_Latency_11延时周期
FLASH_Latency_22延时周期
位绑定公式(BitBanding)
SARM区0x20000000~0x200FFFFF1M
AliasAddr=0x22000000+((A-0x20000000)*8+n)*4//可以用左移代替乘法
=0x22000000+(A-0x20000000)*32+4*n
SARM区0x40000000~0x400FFFFF1M
AliasAddr=0x42000000+((A-0x40000000)*8+n)*4
=0x42000000+(A-0x40000000)*32+4*n
AliasAddr=(A&0xF0000000)+0x2000000+((A&0xFFFFF)*32+4*n)
bit_word_offset=(byte_offsetx32)+(bit_number×4)
bit_word_addr=bit_band_base+bit_word_offset
其中:
bit_word_offset是目标位在存取器位段区中的位置
bit_word_addr是别名存储器区中字的地址,它映射到某个目标位。
bit_band_base是别名区的起始地址。
byte_offset是包含目标位的字节在位段里的序号
bit_number是目标位所在位置(0-31)
voidRCC_Configuration(void)
{
ErrorStatusHSEStartUpStatus;
RCC_DeInit();
RCC_HSEConfig(RCC_HSE_ON);
HSEStartUpStatus=RCC_WaitForHSEStartUp();
if(HSEStartUpStatus==SUCCESS)
{
RCC_HCLKConfig(RCC_SYSCLK_Div1);
RCC_PCLK2Config(RCC_HCLK_Div1);
RCC_PCLK1Config(RCC_HCLK_Div2);
FLASH_SetLatency(FLASH_Latency_2);
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9);
RCC_PLLCmd(ENABLE);
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==RESET);
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
while(RCC_GetSYSCLKSource()!
=0x08);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
}
}
voidGPIO_Configuration(void)
{
GPIO_InitTypeDefGPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_4;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_Init(GPIOA,&GPIO_InitStructure);
}
voidSystick_Configuration(void)
{
SysTick_CounterCmd(SysTick_Counter_Disable);
SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);
SysTick_CounterCmd(SysTick_Counter_Clear);
SysTick_SetReload(9000*1000);
}
voidDelay_Second(void)
{
SysTick_CounterCmd(SysTick_Counter_Enable);
while(SysTick_GetFlagStatus(SysTick_FLAG_COUNT)==0);
SysTick_CounterCmd(SysTick_Counter_Disable);
SysTick_SetReload(9000*1000);
//SysTick_CounterCmd(SysTick_Counter_Clear);
}
voidUSART_Configuration(void)
{
USART_InitTypeDefUSART_InitStructure;
USART_InitStructure.USART_BaudRate=9600;
USART_InitStructure.USART_WordLength=USART_WordLength_8b;
USART_InitStructure.USART_StopBits=USART_StopBits_1;
USART_InitStructure.USART_Parity=USART_Parity_No;
USART_InitStructure.USART_HardwareFlowControl=USART_Hardware
FlowControl_None;
USART_InitStructure.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;
USART_Init(USART1,&USART_InitStructure);
USART_Cmd(USART1,ENABLE);
}
程序下载与调试
1.FLASH(ROM)(0x08000000)
只能烧写1000次
2.RAM(0x20000000)
通信的分类
异步:
同步:
串行通信:
使用一条数据线,将数据一位一位的依次传输,每一位数据占据一个固定的
通信制式:
单工:
数据只能从发送站向接收站传送
半双工:
数据能双向传送,但是不能同时在两个方向上传送
全双工:
接收数据和发送数据占用不同的线路,可以同时发送和接收数据
并行通信:
USART通用同步异步收发器(双全共)
TXD(发送端)RXD(接收端)GND
使用工业标准NRZ异步串行格式分数波特率发生器
支持同步单项通信和半双工单线通信LIN(局部互联网)智能卡协议和irDA(红外数据组织)SIRENDEC规范调制解调器(CTX/RTS)还允许多处理器通信
用于多缓冲器配置的DMA方式可实现高速数据通信
任何USART通信,需要用到2个对外连接的引脚:
RxDTxD
RxD是输入引脚,用于串行数据接收
TxD是输出引脚,用于串行数据发送
SCLK:
发送器时钟输出(同步模式用到)
在IrDA模式中需要用到下列引脚:
IrDA_RDI:
IrDA模式下的数据输入
IrDA_TDI:
IrDA模式下的数据输出
调制解调器模式中需要:
nCTS:
清除发送
nRTS:
发送请求
异步串行通信协议需要定义的5个内容(通信双方协议需要一致)
1.起始位
2.数据(8、9)
3.奇偶校验(9位包括)(防止外部的干扰)
4.停止位
5.波特率的设置(通信的速度)
异步通信应用场合:
1.芯片间近距离通信
2.与PC机间通信
3.模块之间远距离通信(RS232RS485)
数据发送过程:
1.通过在USART_CR1寄存器上置位UE位来激活USART
2.编程USART_CR1的M位来定义字长
3.在USART_CR2中编程停止位的位数
4.*如果采用多缓冲器通信,配置USART_CR3中的DMA是能位(DMAT)。
按多缓冲器通
信中的描述配置DMA寄存器
5.设置USART_CR1中的TE位,发送一个空闲帧数为第一次数据发送
6.利用USART_BRR寄存器选择需要的波特率
7.把要发送的数据写进USART_DR寄存器(此动作清除TXE位)
在只有一个缓冲器的情况下,对每个待发送的数据重复步骤7
数据接收过程:
1.通过在USART_CR1寄存器上置位UE位来激活USART
2.编程USART_CR1的M位来定义字长
3.在USART_CR2中编程停止位的位数
4.*如果采用多缓冲器通信,配置USART_CR3中的DMA是能位(DMAT)。
按多缓冲器通
信中的描述配置DMA寄存器
5.利用USART_BRR寄存器选择需要的波特率
6.设置USART_CR1的RE位。
激活接收器,使它开始寻找起始位
当一个字符被接收到时:
RXNE位被置位。
它表明移位寄存器的内容被转移到RDR。
如果RXNEIE位被置位,产生中断
在接收期间如果检测到帧错误,噪音或溢出错误,错误标志将被置起
Systick的作用
1.产生精准的延时
2.为操作系统提供一个单独的心跳节拍
使用Systick的方法
1.调用SysTick_CounterCmd()失能SysTick计数器
2.调用SysTick_ITConfig()失能SysTick中断
3.调用SysTick_CLKSourceConfig()设置SysTick时钟源
4.调用SysTick_SetReload()设置SysTick重装载值
5.调用SysTick_ITConfig()使能SysTick中断
6.调用SysTick_CounterCmd()开启SysTick计数器
VoidSysTick_Configuration(void)
{
SysTick_CounterCmd(SysTick_Counter_Disable);
SysTick_ITConfig(DISABLE);
SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);
SysTick_SetReload(9000*1000);
SysTick_ITConfig(ENABLE);
SysTick_CounterCmd(SysTick_Counter_Enable);
}
SPI通信(同步全双工)
SCK(同步时钟)MISO(主机输入,从机输出)MOSI(从机输入,主机输出)SS(从机选择信号,低电平有效)
SPI通信:
SPI的基本通信结构相当于两个8位移位寄存器的首尾相连,构成16位的环形移位寄存器,从而实现主机与从机的数据变换
配置步骤
1.通过SPI_CR1寄存器的BR[2:
0]位定义串行时钟波特率
2.选择CPOL和CPHA位,定义数据传输和串行时钟间的相位关系
3.设置DFF位来定义8和16位数据帧格式
4.配置SPI_CR1寄存器的LSBFIRST位定义帧格式
5.如果NSS引脚需要工作在输入模式,硬件模式中在整个数据帧传输期间应把NSS引脚连接到高电平;在软件模式中,需设置SPI_CR1寄存器的SSM和SSI位。
如果NSS引脚工作在输出模式,则只需设置SSOE位
6.必须设置MSTR和SPE位(只当NSS脚被连接高电平,这些位才能保持置位)
数据发送过程
1、当一字节写进发送缓冲器时,发送过程开始
2、在发送第一个数据位时,数据字被并行的(通过内部总线)传入移位寄存器,而后串行
的移除到MOSI脚上;MSB在先还是LSB在先,取决于SPI_CR1寄存器的LSBFIRST位。
数据从发送缓冲器传输到移位寄存器是TXE标志将被置位,如果设置SPI_CR1寄存器中的TXEIE位,将产生中断
3、在试图写发送缓冲器之前,需确定TXE标志位应该是1
数据接收过程,当数据传输完成时
1、移位寄存器里的数据传送到接收缓冲器,并且RXNE标志被置位
如果SPI_CR2寄存器中的RXEIE位被设置,则产生中断
2、读SPI_DR寄存器时,SPI设备返回接收到的数据字。
读SPI_DR寄存器将清除RXNE位
SPI库函数的配置
voidSPI1_Configuration(void)
{
SPI_InitTypeDefSPI_InitStructure;
SPI_InitStructure.SPI_Direction=SPI_Direction_2Lines_FullDuplex;//SPI设置为双线双向全双工
SPI_InitStructure.SPI_Mode=SPI_Mode_Master;//设置为主SPI
SPI_InitStructure.SPI_DataSize=SPI_DataSize_8b;//CPOL=1
SPI_InitStructure.SPI_CPOL=SPI_CPOL_High;//CPOL=1
SPI_InitStructure.SPI_CPHA=SPI_CPHA_1Edge;//CPHA=0
SPI_InitStructure.SPI_NSS=SPI_NSS_Hard;//NSS由外部管脚
SPI_InitStructure.SPI_BaudRatePrescaler=SPI_BaudRatePrescaler_64;//分频值为64
SPI_InitStructure.SPI_FirstBit=SPI_FirstBit_LSB;//数据传输LSB(低位)开始
SPI_InitStructure.SPI_CRCPolynomial=7;
SPI_I2S_DeInit(SPI1);//将外设SPI1寄存器重设为缺省值
SPI_Init(SPI1,&SPI_InitStructure);//初始化外设SPI1寄存器
SPI_Cmd(SPI1,ENABLE);//使能外设SPI1
}
SPI_I2S_SendData(SPI1,0xA5);//发送数据
164通信(串转并)
A、B串行数据输入端
Clock:
时钟输入端
Clear:
清零端低电平有效
QA~QH:
数据输出引脚
PA.0——ABPA.1——ClockPB.0——Clear
使得164的QA~QH输出11000100
1.设置引脚为推挽输出
2.进行通信
date=0xC4;
for(i=0;i<8;i++)
{
PAout
(1)=0;
if((date&0x01)==0x01)
PAout(0)=1
else
PAout(0)=0;
PAout
(1)=1;
Date>>=1;
Delay_Ms
(1);
}
595通信
RCK——PA.1SCK——SPI1_SCK—PA.5MISO——PA.6MOSI——PA.7595_nCS——PA0
1、595_nCS=0
2、SCK上升沿MOSI数据输入完成数据通信00100101
3、RCK上升沿进行锁存
u8date=0x25;
PAout(0)=0;
for(i=0;i<8;i++)
{
PAout(5)=0;
PAout(7)=date&0x01;
PAout(5)=1;
data>>=1;
Delay_Ms
(1);
}
PAout
(1)=0;
Delay_Ms
(1);
PAout
(1)=1;
I2C通信(同步半双工)
SCL(同步时钟)SDA(数据输入/输出端)开漏输出
I2C是飞利浦推出的一种基于两线的芯片间的串行传输总线,I2C总线采用了器件地址的硬件设置方法,通过软件寻址完全避免了器件的片选线寻址方法,从而使硬件系统具有最简单而灵活的扩展。
在I2C总线上只需要串行数据SDA线和串行时钟SCL线两条线
每个器件都有一个唯一的地址以供识别,并工作在主模式或者从模式下,而且各器件都可以作为一个发送器或接收器
微控制器包括的I2C发送/接收器都可以选择为主模式或从模式下工作。
但任意时刻I2C总线上只允许一个微控制器工作在主模式下,作为主控器;而另一个微控制器必须工作在从模式下,作为被控器
特点
1、二线传输
2、无中心主机
3、软件寻址
4、应答式数据传输过程
5、节点可以带点接入或撤出
通信过程:
传输的第一个8位数据为寻址字节,包括7位的被控器地址和1位方向位,接着被控器发出A(应答位),紧接着是主控器与被控器之间数据传输与应答。
在数据传输完成后,主控制器发出停止信号。
1—Wire通信(异步半双工)
DQ(发送/接收端)