原创 stm32串口

2011-10-4 18:03 2650 8 8 分类: MCU/ 嵌入式

串口配置基本步骤(USART2为例):

1.配置时钟: RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2|RCC_APB1Periph_CAN, ENABLE);

2.IO口配置:TX配置为复用推挽型,RX配置为悬浮输入型

//USART2 输出
  GPIO_InitStructure.GPIO_Pin=GPIO_Pin_2;
  GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOA, &GPIO_InitStructure);
  
  //USART 输入
  GPIO_InitStructure.GPIO_Pin=GPIO_Pin_3;
  GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;
  GPIO_Init(GPIOA, &GPIO_InitStructure);

3.NVIC中断配置,开启USART2的全局中断

VIC_InitStructure.NVIC_IRQChannel=USART2_IRQChannel;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPrioriiority=0;
  NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
  NVIC_Init(&NVIC_InitStructure);

4.串口通信寄存器配置,设置波特率,数据长度,停止位,奇偶校验等等,同时使能串口的各种中断,最后使能串口模块

 

void USART_Configuration(void)
{
  USART_InitTypeDef USART_InitStructure;
  USART_InitStructure.USART_BaudRate = 115200;
  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_HardwareFlowControl_None;
  USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;

  USART_Init(USART2, &USART_InitStructure);
  USART_ITConfig(USART2,USART_IT_RXNE,ENABLE);
  USART_Cmd(USART2, ENABLE);
}

串口的接收和发送可以通过普通的查询模式实现,在程序结构简单,对实时性要求不高的情况下,可以采用这种方法。需要注意的是,在发送前要确认发送寄存器为空,同样,在判断接收寄存器有值后,才能读取接收寄存器,stm32强大函数库提供了很便捷的方法来实现这种查询。

查询方法实现:

接收:

 while(USART_GetFlagStatus(USART2,USART_FLAG_RXNE)==RESET){}

 data=USART_ReceiveData(USART2);

 

发送:

while(USART_GetFlagStatus(USART2,USART_FLAG_TXE)==RESET){}

      USART_SendData(USART2,data);

从命名上大概可以猜出:

 USART_FLAG_RXNE   接收寄存器not empty标志

USART_FLAG_TXE     发送寄存器 empty标志

中断方法实现:

使能全局中断,使能接收中断,发送中断

USART_ITConfig(USART2,USART_IT_RXNE,ENABLE);

USART_ITConfig(USART2,USART_IT_TXE,ENABLE);

判断中断源,再进行相应的处理

void USART2_IRQHandler(void)
{

    u8 data_receive,data_send;
    if (USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)    //判断发生接收中断
        {
           data_receive=USART_ReceiveData(USART2); 

           //其他操作。。。。。。。。。。。     
         }
    if(USART_GetITStatus(USART2,USART_IT_TXE)!=RESET)
    {
      USART_SendData(USART2,tx_buffer[l]);
      l++;
      if(tx_buffer[l]=='\0')
         USART_ITConfig(USART2,USART_IT_TXE,DISABLE);
    }
     
}

/************************************************************************/

几个问题:

1.在网上看到有的程序在接收中断中已经调用USART_ReceiveData(USARTx)函数,但还是用USART_ ClearITPendingBit函数对RXNE进行清零操作,其实这是多余的,因为对接收寄存器的读操作后RXNE中断标志会自动清零的。

2.TXE 软件对该位清零时是没用的,发送数据寄存器为空时即为1,在发送中断开时就会进入中断响应函数,只有要发送的数据写入发送寄存器时该位为0。

只有连续发送数据时发送中断寄存器才比较有用。

3.发送完成中断,及其他几个标志位必须软件清零,具体参考datasheet。


PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
8
关闭 站长推荐上一条 /3 下一条