STM总结.docx

上传人:b****1 文档编号:2351180 上传时间:2023-05-03 格式:DOCX 页数:14 大小:19.82KB
下载 相关 举报
STM总结.docx_第1页
第1页 / 共14页
STM总结.docx_第2页
第2页 / 共14页
STM总结.docx_第3页
第3页 / 共14页
STM总结.docx_第4页
第4页 / 共14页
STM总结.docx_第5页
第5页 / 共14页
STM总结.docx_第6页
第6页 / 共14页
STM总结.docx_第7页
第7页 / 共14页
STM总结.docx_第8页
第8页 / 共14页
STM总结.docx_第9页
第9页 / 共14页
STM总结.docx_第10页
第10页 / 共14页
STM总结.docx_第11页
第11页 / 共14页
STM总结.docx_第12页
第12页 / 共14页
STM总结.docx_第13页
第13页 / 共14页
STM总结.docx_第14页
第14页 / 共14页
亲,该文档总共14页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

STM总结.docx

《STM总结.docx》由会员分享,可在线阅读,更多相关《STM总结.docx(14页珍藏版)》请在冰点文库上搜索。

STM总结.docx

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(发送/接收端)

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

当前位置:首页 > 工程科技 > 能源化工

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2