搜档网
当前位置:搜档网 › STM32总结

STM32总结

STM32总结
STM32总结

固件函数库

V oid RCC_Configuration(void) 时钟设置函数

V oid GPIO_Configuration(void) GPIO引脚初始化设置

V oid Systick_Configuration(void) 系统定时器设置函数

void USART_Configuration(void) USART收发器设置

ErrorStatus 枚举值

RCC_DeInit(); 将外设RCC寄存器重设为缺省值

RCC_HSEConfig(); 设置外部高速晶振

RCC_WaitForHSEStartUp(); 等待HSE起振

RCC_HCLKConfig(); 设置AHB时钟

RCC_PCLK1Config(); 设置低速AHB时钟

RCC_PCLK2Config(); 设置高速AHB时钟

RCC_SYSCLK_Divn AHB时钟= 系统时钟/n

RCC_PLLConfig(); 设置PLL时钟源及倍频系数

RCC_PLLCmd(); 使能或失能PLL

RCC_GetSYSCLKSource(); 返回用作系统时钟的时钟源

RCC_GetFlagStatus(); 检查指定的RCC标志位设置与否

RCC_AHBPeriphClockCmd(); 使能或失能AHB外设时钟

RCC_APB1PeriphClockCmd(); 使能或失能APB1外设时钟

RCC_APB2PeriphClockCmd(); 使能或失能APB2外设时钟

RCC_PLLSource_HSE_Div1 PLL的输入时钟= HSE时钟频率

RCC_PLLSource_HSE_Div2 PLL的输入时钟= HSE时钟频率/2

RCC_PLLSource_HSI_Div2 PLL的输入时钟= HSI时钟频率/2

RCC_PLLMul_n PLL输入时钟* n

RCC_FLAG_PLLRDY PLL就绪

RCC_APB2Periph_GPIOA GPIOA时钟

RCC_APB2Periph_GPIOB GPIOB时钟

RCC_APB2Periph_GPIOC GPIOC时钟

RCC_APB2Periph_GPIOD GPIOD时钟

RCC_APB2Periph_GPIOE GPIOE时钟

RCC_APB2Periph_ALL 全部APB2外设时钟

RESE 重置

GPIO_InitTypeDef GPIO结构体

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_Div8 SysTick时钟源为AHB时钟/8

SysTick_CLKSource_HCLK SysTick时钟源为AHB时钟

SysTick_SetReload(); 设置SysTick重装载值

FLASH_SetLatency(); 设置代码延时值

FLASH_PrefetchBufferCmd(); 使能或失能预取指缓存

FLASH_PrefetchBuffer_Enable 预取指缓存使能

FLASH_PrefetchBuffer_Disable 预取指缓存失能

FLASH_Latency 用来设置FLASH储存器延时时钟周期数FLASH_Latency_0 0延时周期

FLASH_Latency_1 1延时周期

FLASH_Latency_2 2延时周期

位绑定公式(BitBanding)

SARM区0x20000000 ~ 0x200FFFFF 1M

AliasAddr = 0x22000000 + ((A - 0x20000000)*8 + n)*4 //可以用左移代替乘法= 0x22000000 + (A - 0x20000000)*32 + 4*n

SARM区0x40000000 ~ 0x400FFFFF 1M

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_offset x 32) + (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)

void RCC_Configuration(void)

{

ErrorStatus HSEStartUpStatus;

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);

}

}

void GPIO_Configuration(void)

{

GPIO_InitTypeDef GPIO_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);

}

void Systick_Configuration(void)

{

SysTick_CounterCmd(SysTick_Counter_Disable);

SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);

SysTick_CounterCmd(SysTick_Counter_Clear);

SysTick_SetReload(9000 * 1000);

}

void Delay_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);

}

void USART_Configuration(void)

{

USART_InitTypeDef USART_InitStructure;

USART_https://www.sodocs.net/doc/4c18430304.html,ART_BaudRate = 9600;

USART_https://www.sodocs.net/doc/4c18430304.html,ART_WordLength = USART_WordLength_8b;

USART_https://www.sodocs.net/doc/4c18430304.html,ART_StopBits = USART_StopBits_1;

USART_https://www.sodocs.net/doc/4c18430304.html,ART_Parity = USART_Parity_No;

USART_https://www.sodocs.net/doc/4c18430304.html,ART_HardwareFlowControl=USART_Hardware

FlowControl_None;

USART_https://www.sodocs.net/doc/4c18430304.html,ART_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(红外数据组织)SIR ENDEC规范调制解调器(CTX/RTS)还允许多处理器通信用于多缓冲器配置的DMA方式可实现高速数据通信

任何USART通信,需要用到2个对外连接的引脚:RxD TxD

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.模块之间远距离通信(RS232 RS485)

数据发送过程:

1. 通过在USART_CR1寄存器上置位UE位来激活USART

2. 编程USART_CR1的M位来定义字长

3. 在USART_CR2中编程停止位的位数

4. *如果采用多缓冲器通信,配置USART_CR3中的DMA是能位(DMA T)。按多缓冲器通

信中的描述配置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是能位(DMA T)。按多缓冲器通

信中的描述配置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计数器

V oid SysTick_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库函数的配置

void SPI1_Configuration(void)

{

SPI_InitTypeDef SPI_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——AB PA.1——Clock PB.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.1 SCK——SPI1_SCK—PA.5 MISO——PA.6 MOSI——PA.7 595_nCS——PA0

1、595_nCS=0

2、SCK上升沿MOSI数据输入完成数据通信00100101

3、RCK上升沿进行锁存

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

相关主题