一. 硬件设计
USART:同步和异步通信
UART:异步通信·
SPI 、I2C为同步通信 UART为异步通信, usart为同步和异步通信。
二. 同步发送和异步发送的区别:
同步是指:发送方发出数据后,接收方发回响应以后,才可以发下一个数据包的通讯方式。
异步是指:发送方发出数据后,不等接收方发回响应,可以接着发送下个数据包的通讯方。
三. 单工\半双工\全双工
1、单工数据传输只支持数据在一个方向上传输;
2、半双工数据传输允许数据在两个方向上传输,在某一时刻,只允许数据在一个方向上传输,它实际上是一种切换方向的单工通信;
3、全双工数据通信允许数据同时在两个方向上传输,所以全双工通信是两个单工通信方式的结合,它要求发送设备和接收设备都有独立的接收和发送能力。
I2C是半双工,SPI的全双工,uart是全双工。
四.USART结构体配置
USART初始化
typedef struct {
uint32_t USART BaudRate; // 波特率
uint16_t USART WordLength; // 字长
uint16 t USART StopBits; // 停止位
uint16 t USART Parity; // 校验位
uint16 t USART Mode; // USART 收发模式
uint16 t USART HardwareFlowControl; // 硬件流控制
uint16_t USART_Clock; //同步时钟 配置是否打开
uint16_t USART_CPOL; //极性 配置串口空闲为低电平,高电平
uint16_t USART_CPHA; //相位 配置选择边沿
uint16_t USART_LastBit; //最后一位时钟 配置使能还是关闭
} USART InitTypeDef;
1、配置有波特率 2400 9600 19200 115200
编辑 编辑
2、字长8 9
3、停止位有 0.5 、1、 1.5 、2
4、奇偶校验位
USART_Parity_No 奇偶失能
USART_Parity_Even 偶模式
USART_Parity_Odd 奇模式
注意:奇偶校验一旦使能,在发送数据的 MSB 位插入经计算的奇偶位(字长 9 位时的第 9 位,字长 8 位 时的第 8 位)
5、usart收发模式
USART_Mode_Tx 发送使能
USART_Mode_Rx接收使能
6、硬件流
USART_HardwareFlowControl_None 硬件流控制失能
USART_HardwareFlowControl_RTS 发送请求 RTS 使能
USART_HardwareFlowControl_CTS 清除发送 CTS 使能 USART_HardwareFlowControl_RTS_CTS RTS 和 CTS 使能
五.代码
//初始化
void usar_Init(void)
{
USART_InitTypeDef Usar_Init;
GPIO_InitTypeDef Gpio_Initstruct;
NVIC_InitTypeDef Nvic_Init;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2 );
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA, ENABLE);//引脚
RCC_APB2PeriphClockCmd( RCC_APB2Periph_AFIO, ENABLE);//引脚复用
RCC_APB2PeriphClockCmd( RCC_APB2Periph_USART1, ENABLE);//串口
//配置TX输出
Gpio_Initstruct.GPIO_Mode=GPIO_Mode_Out_PP;
Gpio_Initstruct.GPIO_Pin=GPIO_Pin_9;
Gpio_Initstruct.GPIO_Speed=GPIO_Speed_10MHz;
GPIO_Init( GPIOA, &Gpio_Initstruct);
//配置RX输入
Gpio_Initstruct.GPIO_Mode=GPIO_Mode_IN_FLOATING;
Gpio_Initstruct.GPIO_Pin=GPIO_Pin_10;
GPIO_Init( GPIOA, &Gpio_Initstruct);
//配置串口
Usar_Init.USART_BaudRate=115200;
Usar_Init.USART_HardwareFlowControl=USART_HardwareFlowControl_None;
Usar_Init.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;
Usar_Init.USART_Parity=USART_Parity_No;
Usar_Init.USART_StopBits=USART_StopBits_1;
Usar_Init.USART_WordLength=USART_WordLength_8b;
USART_Init( USART1, &Usar_Init);
USART_ITConfig(USART1,USART_IT_RXNE, ENABLE);
USART_Cmd( USART1, ENABLE);
//配置中断
Nvic_Init.NVIC_IRQChannel =USART1_IRQn;
Nvic_Init.NVIC_IRQChannelCmd =ENABLE;
Nvic_Init.NVIC_IRQChannelPreemptionPriority =1;
Nvic_Init.NVIC_IRQChannelSubPriority =1;
NVIC_Init(&Nvic_Init);
}
//发送一个字符
void USARTSendDataByte(USART_TypeDef* USARTx, uint16_t Data)
{
USART_SendData( USART1, Data); //发送一个数据到USART
while(USART_GetFlagStatus( USARTx, USART_FLAG_TXE)==RESET);//等待发送数据寄存器为空
}
//发送一个字串
void USARTSendstr(USART_TypeDef* USARTx, char *str)
{
uint16_t i =0;
do{
USARTSendDataByte( USARTx, *(str+i));
i++;
}
while( *(str+i)!='\0');//*(str+i)!='\0'字符串标志位是否等于'\0'
while(USART_GetFlagStatus( USARTx, USART_FLAG_TC)==RESET);//TC发送完标志位
}
---------------------------------------------------------------------------------------------------------------------------------
引用资料:《STM32F1xx中文参考手册》 《普中STM32F1xx开发攻略_V3.0--标准库版》