USART串口--浅谈

来源:互联网 发布:淘宝店铺租赁平台 编辑:程序博客网 时间:2024/06/05 17:00

tips:在使用printf重定义前,切记要在 Target里勾选 Use MicroLIB!!!

#include "main.h"void USART_Config( ){    GPIO_InitTypeDef GPIO_InitStruct;    USART_InitTypeDef USART_InitStruct;    NVIC_InitTypeDef   NVIC_InitStruct;    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_USART1,ENABLE); //时钟的初始化    GPIO_InitStruct.GPIO_Pin=GPIO_Pin_9;    GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF_PP;    GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;    GPIO_Init(GPIOA,&GPIO_InitStruct);    GPIO_InitStruct.GPIO_Pin=GPIO_Pin_10;    GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IN_FLOATING;    GPIO_Init(GPIOA,&GPIO_InitStruct);    GPIO_PinRemapConfig(GPIO_Remap_USART1,ENABLE);    USART_InitStruct.USART_BaudRate = 115200;    USART_InitStruct.USART_WordLength = USART_WordLength_8b;//配置rs232协议数据位的位宽    USART_InitStruct.USART_StopBits = USART_StopBits_1;     //配置rs232协议的停止位的位宽    USART_InitStruct.USART_Parity = USART_Parity_No;        //配置rs232协议奇偶校验位    USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//配置rs232协议的硬件流控制    USART_InitStruct.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;//使能接收和发送    USART_Init(USART1,&USART_InitStruct);    NVIC_InitStruct.NVIC_IRQChannel = USART1_IRQn;    NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0;    NVIC_InitStruct.NVIC_IRQChannelSubPriority = 1;    NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;    NVIC_Init(&NVIC_InitStruct);    //打开USART1接收中断    USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);    //使能USART1    USART_Cmd(USART1,ENABLE);   }//回显void USART_Echo(void){    u8 ch;    while(USART_GetFlagStatus(USART1,USART_FLAG_RXNE)==RESET);//等待接收数据    ch = USART_ReceiveData(USART1);//把接收到的数据保存到ch中    while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);//等待上次发送数据发送完成    USART_SendData(USART1,ch);//把ch中的数据发送到电脑}//重新定义printfint fputc(int ch,FILE *p){    USART_SendData(USART1,ch);    //等待发送完成    while(USART_GetFlagStatus(USART1,USART_FLAG_TC) == RESET);    return ch;}//输出字符串void USART_PutChar(USART_TypeDef* USARTx,uint8_t Data){    USART_SendData(USARTx,Data);    while(USART_GetFlagStatus(USART1,USART_FLAG_TC)==RESET);}void USART_PutStr(USART_TypeDef* USARTx,uint8_t *str){    while('\0' != *str)    {        USART_PutChar(USARTx,*str);        str++;    }}//中断服务函数void USART1_IRQHandler(void){    uint8_t ucTemp;    if(USART_GetFlagStatus(USART1,USART_IT_RXNE) !=RESET)    {        ucTemp = USART_ReceiveData(USART1);        USART_SendData(USART1,ucTemp);    }}
原创粉丝点击