STM32F103——串口

▪使用的硬件为:STM32F103ZET6。

在学习STM32的过程中,避免不了串口的数据传输,包括数据的发送与数据的接收,其中串口与上位机的对话也显得尤为重要(上位机:是指可以直接发出操控命令的计算机,一般是PC/host computer/master computer/upper computer,屏幕上显示各种信号变化。)。

 串口是MCU的重要外部接口(MCU:单片微型计算机),STM的串口资源很丰富,功能也很强劲,STM32F103ZET6最多可以提供5路串口。在对串口进行使用的过程中,由于引脚资源的有限性,在一些引脚上板载了功能复用,对于复用功能的IO,首先要使能GPIO时钟,然后使能复用功能时钟,同时设置GPIO模式为复用功能对应的模式。

串口设置的一般步骤:

①串口时钟使能(挂载在APB2下面):

RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1);

RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE);	//使能USART1,GPIOA时钟

  GPIO使能:

GPIO_InitTypeDef GPIO_InitStructure;

//USART1_TX   GPIOA.9
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA.9
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;	//复用推挽输出
GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.9
    
//USART1_RX	  GPIOA.10初始化
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;//PA10
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.10  

②串口复位:

void USART_DeInit(USART_TypeDef* USARTx);

③串口参数初始化:

    void USART_Init(USART_TypeDef* USARTx, USART_InitTypeDef* USART_InitStruct);

USART_InitTypeDef USART_InitStructure;

USART_InitStructure.USART_BaudRate = bound;//串口波特率
USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式
USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位
USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验位
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;	//收发模式

USART_Init(USART1, &USART_InitStructure); //初始化串口1

④数据发送:

void USART_SendData(USART_TypeDef* USARTx, uint16_t Data);

    数据接收:

uint16_t USART_ReceiveData(USART_TypeDef* USARTx);

⑤读取串口状态:

FlagStatus USART_GetFlagStatus(USART_TypeDef* USARTx, uint16_t USART_FLAG);

    参数USART_FLAG标示我们要查看串口的某种状态:

    我们要判断读寄存器是否非空(RXNE), 操作库函数的方法是:

    USART_GetFlagStatus(USART1, USART_FLAG_RXNE);


    我们要判断发送是否完成(TC),操作库函数的方法是:

    USART_GetFlagStatus(USART1, USART_FLAG_TC);

⑥串口使能:

USART_Cmd(USART1, ENABLE);

⑦开启串口响应中断:

void USART_ITConfig(USART_TypeDef* USARTx, uint16_t USART_IT,FunctionalState NewState)

    比如在接收到数据的时候(RXNE 读数据寄存器非空),我们要产生中断,那么我们开启中断的方法是:  

 USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);

    我们在发送数据结束的时候(TC, 发送完成) 要产生中断,那么方法是:


  USART_ITConfig(USART1, USART_IT_TC, ENABLE);

 

⑧获取相应中断状态:

ITStatus USART_GetITStatus(USART_TypeDef* USARTx, uint16_t USART_IT);

 在对串口进行初始化时会涉及到串口的中断优先级配置:

//Usart1 NVIC 配置
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//抢占优先级3
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;		//子优先级3
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;			//IRQ通道使能
NVIC_Init(&NVIC_InitStructure);	//根据指定的参数初始化VIC寄存器

串口从缓冲器BUF向外发送数据:

if(USART_RX_STA&0x8000)
{ 
  len=USART_RX_STA&0x3f; //得到此次接收到的数据长度
  printf("\r\n 您发送的消息为:\r\n\r\n");
  for(t=0;t

 USART_SendData(USART1, USART_RX_BUF[t]);   //发送一个字节到串口
 

 while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);  //检测这个数据是否已经被发送完成了。    USART_FLAG_TC 是宏定义的数据发送完成标识符。

❤软件❤

keil5、XCOM

XCOM输出为:

STM32F103——串口_第1张图片

 

注:其中借鉴到了正点原子学习资料。

你可能感兴趣的:(STM32F103——串口)