STM32F1x系列——串口通信

来源:互联网 发布:ls plc解密软件 编辑:程序博客网 时间:2024/06/05 03:40

      一  在STM32F1x系列串口通信实验中,常用的寄存器有:

(1)USART_SR  状态寄存器   

(2)USART_DR  数据寄存器  

(3)USART_BRR  波特率寄存器  

(4) USART_CR   使能位

      二  串口操作相关的库函数(省略入口参数):

(1)void USART_Init() ;  //串口初始化:波特率,数据字长,奇偶校验,硬件流控以及收发使能

(2)void USART_Cmd ;  //使能串口

(3)void USART_ITConfig() ;  //使能相关中断


(4)void USART_SendData() ;  //发送数据到串口,DR

(5)uint16_t USART_ReceiveData() ;  //接受数据,从DR读取接受到的数据


(6)FlagStatus USART_GetFlagStatus() ;  //获取状态标志位

(7)void USART_ClearFlag() ;  //清除状态标志位

(8)ITStatus USART_GetITStatus() ;  //获取中断状态标志位

(9)void USART_ClearITPendingBit() ;  //清除中断状态标志位

      三  串口配置的一般步骤:

(1)串口时钟使能,GPIO时钟使能:RCC_APB2PeriphClockCmd() ;

(2)串口复位:USART_DeInit() ; 这一步不是必须的

(3)GPIO端口模式设置:GPIO_Init() ; 模式设置为GPIO_Mode_AF_PP

(4)串口参数初始化:USART_Init() ;

(5)开启中断并且初始化NVIC(如果需要开启中断才需要这个步骤):

          NVIC_Init() ;

          USART_ITConfig() ;

(6)使能串口:USART_Cmd() ;

(7)编写中断处理函数:USARTx_IRQHandler() ;

(8)串口数据的收发:

         void USART_SendData() ;   //发送数据到串口,DR

         uint16_t USART_ReceiveData() ;  //接受数据,从DR读取接受到的数据

(9)串口传输状态获取:

         FlagStatus USART_GetFlagStatus(RT_FLAUSART_TypeDef * USARTx , uint16_t USART_FLAG) ; 

         void USART_ClearITPendingBit(RT_FLAUSART_TypeDef * USARTx , uint16_t USART_IT) ;

      程序中的main.c文件 代码如下:

#include "stm32f10x.h" void My_USART1_Init() {    GPIO_InitTypeDef GPIO_InitStruct ;    USART_InitTypeDef USART_InitStruct ;    NVIC_InitTypeDef NVIC_InitStruct ;     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE) ;   //GPIO时钟使能      RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE) ;//´串口时钟使能     GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP ;     //GPIO端口模式设置    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9 ;    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_10MHz ;    GPIO_Init(GPIOA,&GPIO_InitStruct) ;        GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING ;     //GPIO端口模式设置    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_10 ;    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_10MHz ;    GPIO_Init(GPIOA,&GPIO_InitStruct) ;        USART_InitStruct.USART_BaudRate = 115200 ;    USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None ;    USART_InitStruct.USART_Mode = USART_Mode_Rx | USART_Mode_Tx ;    USART_InitStruct.USART_Parity = USART_Parity_No ;    USART_InitStruct.USART_StopBits = USART_StopBits_1 ;USART_InitStruct.USART_WordLength = USART_WordLength_8b ;    USART_Init(USART1,&USART_InitStruct) ; USART_Cmd(USART1,ENABLE) ;  //串口使能USART_ITConfig(USART1,USART_IT_RXNE,ENABLE) ;  //打开接收中断NVIC_InitStruct.NVIC_IRQChannel = USART1_IRQn ;NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE ;NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 1 ;NVIC_InitStruct.NVIC_IRQChannelSubPriority = 1 ;NVIC_Init(&NVIC_InitStruct) ; }  void USART1_IRQHandler(void)   //中断服务函数 {    u8 res ;   if(USART_GetITStatus(USART1,USART_IT_RXNE)) {   res = USART_ReceiveData(USART1) ;   USART_SendData(USART1,res) ; } }  int main(void) {      NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);    //系统中断优先级分配为2      My_USART1_Init() ;      while(1) ; }

打开串口调试助手调试:


     成功运行