您的位置:首页 > 其它

串口寄存器配置

2017-08-25 09:53 218 查看
串口操作相关库函数

void USART_Init();//串口初始化:波特率,数据字长,奇偶校验,硬件流控以及收发使能
void USART_Cmd();//使能串口
void USART_ITConfig();//使能相关中断
void USART_SendData();//发送数据到串口,DR
uint16_t USART_ReceiveData();//接受数据,从DR读取接受到的数据
FlagStatusUSART_GetFlagStatus();//获取状态标志位
void USART_ClearFlag();//清除状态标志位
ITStatusUSART_GetITStatus();//获取中断状态标志位
void USART_ClearITPendingBit();//清除中断状态标志位
typedef struct
{
uint32_t USART_BaudRate;            /*设置波特率,对应寄存器USART_BRR */

uint16_t USART_WordLength;          /*指定数据长度,对应寄存器USART_CR1的位12 */

uint16_t USART_StopBits;            /*指定停止位的位数,对应寄存器USART_CR2的位13:12 */

uint16_t USART_Parity;              /*指定校验方式,对应寄存器USART_CR1的位10:9 */

uint16_t USART_Mode;                /*指定了USART的位数,对应寄存器USART_CR2的位13:12*/

uint16_t USART_HardwareFlowControl; /*使能或失能CTS硬件流控制,对应寄存器USART_CR3的位9 */
} USART_InitTypeDef;

串口配置的一般步骤:

①串口时钟使能,GPIO时钟使能:RCC_APB2PeriphClockCmd();
②串口复位:USART_DeInit();
这一步不是必须的
③GPIO端口模式设置:GPIO_Init();
模式设置为GPIO_Mode_AF_PP,复用推挽。
④串口参数初始化:USART_Init();
⑤开启中断并且初始化NVIC(如果需要开启中断才需要这个步骤)
      NVIC_Init();

      USART_ITConfig();

⑥使能串口:USART_Cmd();

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

⑧串口数据收发:

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

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

⑨串口传输状态获取:

FlagStatusUSART_GetFlagStatus(USART_TypeDef*
USARTx,uint16_t USART_FLAG);

voidUSART_ClearITPendingBit(USART_TypeDef*USARTx,
uint16_t USART_IT);

/*
void My_USART1_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;			//定义一个GPIO_InitTypeDef类型的结构体

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);//开启USART1时钟

GPIO_InitStructure.GPIO_Pin   =  	GPIO_Pin_9;	//选择要控制的GPIOA引脚
GPIO_InitStructure.GPIO_Speed =   GPIO_Speed_10MHz;		//设置引脚速率为10MHz
GPIO_InitStructure.GPIO_Mode  =   GPIO_Mode_AF_PP;		//设置引脚模式为通用推挽输出
GPIO_Init(GPIOA, &GPIO_InitStructure); 				//调用库函数,初始化GPIOA

GPIO_InitStructure.GPIO_Pin   =  	GPIO_Pin_10;	//选择要控制的GPIOA引脚
GPIO_InitStructure.GPIO_Speed =   GPIO_Speed_10MHz;		//设置引脚速率为10MHz
GPIO_InitStructure.GPIO_Mode  =   GPIO_Mode_IN_FLOATING;		//设置引脚模式为浮空输入
GPIO_Init(GPIOA, &GPIO_InitStructure); 				//调用库函数,初始化GPIOA

USART_InitTypeDef USART_InitStructure;								//定义USART初始化类型结构体

USART_InitStructure.USART_BaudRate 	= 	115200;						//波特率设为115200
USART_InitStructure.USART_WordLength 	= 	USART_WordLength_8b;	//1个起始位,8个数据位
USART_InitStructure.USART_StopBits 	=	 USART_StopBits_1;		//1个停止位
USART_InitStructure.USART_Parity 	= 	USART_Parity_No ;			//无奇偶校验
USART_InitStructure.USART_HardwareFlowControl 	= 	USART_HardwareFlowControl_None;//失能CTS
USART_InitStructure.USART_Mode	 = 	USART_Mode_Rx | USART_Mode_Tx;//使能发送和接收
USART_Init(USART1, &USART_InitStructure);							//调用库函数,初始化USART1

USART_Cmd(USART1, ENABLE); 											//使能USART1
USART_ITConfig(USART1,USART_TI_RXNE,ENABLE);	//开启接收中断

NVIC_InitStructure.NVIC_IRQChannel	=	USART1_IRQn;	//配置中断通道
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority 	= 0;//配置抢占优先级为0
NVIC_InitStructure.NVIC_IRQChannelSubPriority  = 0;//配置响应优先级为0
NVIC_InitStructure.NVIC_IRQChannelCmd 	= ENABLE;		//NVIC使能
NVIC_Init(&NVIC_InitStructure);//向寄存器写入参数

}
void   USART1_IRQHandler(()
{
u8 res
if(USART_GetFlagStatus(USART1,USART_TI_RXNE))
{
USART_ReceiveData(USART1);
USART_SendData(USART1,res);
}

}
int main()
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置NVIC的优先级为4种抢占优先级和4种响应优先级
My_USART1_Init();
while(1);
}

*/



                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: