找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2178|回复: 0
收起左侧

STM32的USART

[复制链接]
ID:105323 发表于 2016-2-12 22:27 | 显示全部楼层 |阅读模式
本帖最后由 51黑黑黑 于 2016-2-12 22:29 编辑

通用同步异步收发器(USART)提供了一种灵活的方法来与使用工业标准NR 异步串行数据格式的外部设备之间进行全双工数据交换。 USART利用分数波特率发生器提供宽范围的波特率选择。
它支持同步单向通信和半双工单线通信。它也支持LIN(局部互连网),智能卡协议和IrDA(红外数据组织)SIR ENDEC规范,以及调制解调器(CTS/RTS)操作。它还允许多处理器通信。用于多缓冲器配置的DMA方式,可以实现高速数据通信。

主要特性:
全双工的,异步通信
NR 标准格式
分数波特率发生器系统
-发送和接收共用的可编程波特率,最高到4.5Mbits/s
可编程数据字长度(8位或9位)
可配置的停止位 -支持1或2个停止位
LIN主发送同步断开符的能力以及LIN从检测断开符的能力
- 当USART硬件配置成LIN时,生成13位断开符;检测10/11位断开符
发送方为同步传输提供时钟
IRDA SIR 编码器解码器
- 在正常模式下支持3/16位的持续时间
智能卡模拟功能
- 智能卡接口支持ISO7816 -3标准里定义的异步协议智能卡
- 智能卡用到的0.5和1.5个停止位
单线半双工通信
使用DMA的可配置的多缓冲器通信
- 在保留的SRAM里利用集中式DMA缓冲接收/发送字节
单独的发送器和接收器使能位
检测标志
- 接收缓冲器满
- 发送缓冲器空
- 传输结束标志
校验控制
- 发送校验位
- 对接收数据进行校验
四个错误检测标志
- 溢出错误
- 噪音错误
- 帧错误
- 校验错误
10个带标志的中断源
- CTS改变
- LIN断开符检测
- 发送数据寄存器
- 发送完成
- 接收数据寄存器
- 检测到总线为空
- 溢出错误
- 帧错误
- 噪音错误
- 校验错误
多处理器通信 - - 如果地址不匹配,则进入静默模式
从静默模式中唤醒(通过空闲总线检测或地址标志检测)
两种唤醒接收器的方式
- 地址位(MSB)
- 空闲总线


按以下步骤来配置USART

1.配置RXD TXD管脚参数

2.配置GPIOx时钟以及USART时钟

3.由于要使用串口接收中断,需要配置NVIC

4.串口相关参数配置,使能串口,使能中断



以下是我写的一个简单的串口收发程序

USART_InitTypeDef USART1_InitStruct={9600,USART_WordLength_8b,USART_StopBits_1,USART_Parity_No,\
         USART_Mode_Rx|USART_Mode_Tx,USART_HardwareFlowControl_None};



void USART1_GPIO_Init()
{//这样做的好处是不用初始化结构体内的每个值
GPIO_InitTypeDef GPIO_InitStructure;//定义GPIO_InitTypeDef类型的结构体成员GPIO_InitStructure
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;           //PA9-TX1 引脚
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;    //复用推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;          //PA10-RX1引脚
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输入
GPIO_Init(GPIOA, &GPIO_InitStructure);                                                                                                               
}

void USART1_Init()
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_USART1, ENABLE);//时钟配置
USART1_GPIO_Init();//配置串口1的管脚  //PA9-TX1 引脚(复用推挽输出),PA10-RX1引脚(浮空输入)
//GPIO_Init(GPIOA, &GPIOA_9_Init);
//GPIO_Init(GPIOA, &GPIOA_10_Init);
USART_DeInit(USART1);//复位串口1
USART_Init(USART1,&USART1_InitStruct);//初始化串口1的参数
USART_Cmd(USART1,ENABLE);//最后使能串口
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
}

void UART1_Send_byte(USART_TypeDef* USARTx,u8 Data)
{
USART_SendData(USARTx,(u8)Data);
while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
}

void NVIC_Configuration()
{  
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);   // 抢占式优先级别
NVIC_InitStructure.NVIC_IRQChannel =USART1_IRQChannel;//指定中断源
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;// 指定响应优先级别1
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}

int main(void)
{     
Stm32_Clock_Init(9); //系统时钟设置
delay_init(72);      //延时初始化
USART1_Init();
NVIC_Configuration();
while(1)
{
  if(flag_send)
  {
   UART1_Send_byte(USART1,0xce);
   UART1_Send_byte(USART1,0xd2);
   flag_send=0;
  }
}  
}

void USART1_IRQHandler(void)
{
    if(USART_GetFlagStatus(USART1,USART_IT_RXNE)==SET)
    {   
  USART_ClearITPendingBit(USART1,USART_IT_RXNE);//清除中断标志         
        R[0]=USART_ReceiveData(USART1);
  if(R[0]==0x32) flag_send=1;              
    }
}

评分

参与人数 1黑币 +1 收起 理由
cxw110 + 1

查看全部评分

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表