STM32串口的设置和库函数的介绍 |
您所在的位置:网站首页 › 串口设置的一般步骤 › STM32串口的设置和库函数的介绍 |
串口设置的一般步骤可以总结为如下几个: 1) 串口时钟使能, GPIO时钟使能 2) 串口复位 3)GPIO 端口模式设置 4) 串口参数初始化 5) 开启中断并且初始化 NVIC(如果需要开启中断才这个步骤) (如果需要开启中断才这个步骤) 6) 使能串口 使能串口 7) 编写中断处理函数
下面,我们就简单介绍这几个与串口基本配置直接相关的固件库函数。这些函数和 定义主要分布在 stm32f10x_usart.h ,stm32f10x_usart.c 文件中。 1.串口时钟使能。串口是挂载在APB2上的,所以使能函数为: RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1) 2.串口复位。当外设出现异常的时候可以通过复位置 ,实现该外设的复位,然后重新配置这个外设让其重新工作的目。一般在系统刚开始配置时候,都会先执行复位该这个外 设达到让其重新工作的目。复位是在函数 USART_DeInit()完成: void USART_DeInit(USART_TypeDef* USARTx) 3串口参数初始化 void USART_Init()函数:voidUSART_Init(USART_TypeDef*USARTx,USART_InitTypeDef*USART_InitStruct); 作用:根据指定参数初始化相应串口(波特率,字长,停止位,奇偶校验,硬件流控制等) 主要是用来初始化寄存器BRR以及CR1,CR2,CR3控制寄存器 使用范例:USART_InitTypeDefUSART_InitStructure; USART_InitStructure.USART_BaudRate= 9600;//波特率设置; 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);//初始化串口 4.void USART_Cmd()函数: 原型:voidUSART_Cmd(USART_TypeDef*USARTx,FunctionalStateNewState); 作用:使能相应的串口,用来设置寄存器CR1的串口使能位 使用范例:USART_Cmd(USART1,ENABLE); //使能串口1 5.void USART_ITConfig()函数: 原型: voidUSART_ITConfig(USART_TypeDef*USARTx,uint16_t USART_IT, FunctionalStateNewState); 作用:开启串口相应中断,设置串口控制寄存器 使用范例:USART_ITConfig(USART1,USART_IT_RXNE, ENABLE); //开启读数据寄存器非空中断 6.USART_SendData()函数: 原型:voidUSART_SendData(USART_TypeDef* USARTx, uint16_t Data); 作用: 发送数据到串口。 使用范例:USART_SendData(USART1,0x12); 7.uint16_tUSART_ReceiveData()函数: 原型: uint16_t USART_ReceiveData(USART_TypeDef*USARTx)获取串口最新接受的值。 使用范例: USART_ReceiveData(USART1); 8.四个状态标志相关的函数:FlagStatusUSART_GetFlagStatus(USART_TypeDef*USARTx,uint16_t USART_FLAG); void USART_ClearFlag(USART_TypeDef*USARTx,uint16_t USART_FLAG); ITStatusUSART_GetITStatus(USART_TypeDef*USARTx,uint16_t USART_IT); void USART_ClearITPendingBit(USART_TypeDef*USARTx,uint16_t USART_IT); 以下是一个完整的初始化串口函数和一个中断服务函数: //初始化IO 串口1 //bound:波特率 void uart_init(u32 bound){ //GPIO端口设置 GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE); //使能USART1,GPIOA时钟 USART_DeInit(USART1); //复位串口1 //USART1_TX PA.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); //初始化PA9 //USART1_RX PA.10 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入 GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化PA10 //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寄存器 //USART 初始化设置 USART_InitStructure.USART_BaudRate = bound;//一般设置为9600; 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); //初始化串口 USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启中断 USART_Cmd(USART1, ENABLE); //使能串口 } void USART1_IRQHandler(void) //串口1中断服务程序 { u8 Res; #ifdef OS_TICKS_PER_SEC //如果时钟节拍数定义了,说明要使用ucosII了. OSIntEnter(); #endif if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //接收中断(接收到的数据必须是0x0d 0x0a结尾) { Res =USART_ReceiveData(USART1);//(USART1->DR); //读取接收到的数据 if((USART_RX_STA&0x8000)==0)//接收未完成 { if(USART_RX_STA&0x4000)//接收到了0x0d { if(Res!=0x0a)USART_RX_STA=0;//接收错误,重新开始 else USART_RX_STA|=0x8000; //接收完成了 } else //还没收到0X0D { if(Res==0x0d)USART_RX_STA|=0x4000; else { USART_RX_BUF[USART_RX_STA&0X3FFF]=Res ; USART_RX_STA++; if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;//接收数据错误,重新开始接收 } } } } #ifdef OS_TICKS_PER_SEC //如果时钟节拍数定义了,说明要使用ucosII了. OSIntExit(); #endif } |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |