STM32串口USART通信总结

一、GPIO设置USART的初始化

/**************************实现函数********************************************
*函数原型:        void USART_Config(void)
*功    能:        初始化串口1,PA9,PA10
*输入参数:        无
*输出参数:        无
*******************************************************************************/
void USART_Config()
{
    //设置USART引脚输入输出模式
    GPIO_InitTypeDef GPIO_InitStructure;
    USART_InitTypeDef USART_InitStructure;
    
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO | RCC_APB2Periph_USART1, ENABLE);

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;                            //推挽复用
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
    
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;                      //浮空输入
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);    
    
    //初始化USART
    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(USART1, &USART_InitStructure);
    
    /* 使能串口1接收中断 */
    USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);                                //开中断
    
    USART_Cmd(USART1, ENABLE);
    
}

从手册上可知,USART1是PA9(TX)PA10(RX)。所以设置pin9和pin10的GPIO输入输出状态。
同时需要开启复用功能的时钟,和USART1的时钟。

初始化主要包括,波特率,发送的长度,停止位,校验位,硬件流控。

三、main函数

 

 

简单的发送程序。

/****************************************************************************
* Function Name : fPutString
* Description : Send a string.
* Input : None
* Output : None
* Return : None
****************************************************************************/
void fPutString(u8 *buf, u8 len)
{
    u8 i;
    for(i=0;i<len;i++)
    {
        fPutChar(*buf++);
    }
}

/****************************************************************************
* Function Name : fPutChar
* Description : Send a byte
* Input : None
* Output : None
* Return : None
****************************************************************************/
u8 fPutChar(u8 ch)
{
    USART_SendData(USART1, (u8) ch);
    while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET)
    {
        
    }
    return ch;
}

 

 

四、补充NVIC

/**************************实现函数********************************************
*函数原型:        void U1NVIC_Configuration(void)
*功    能:        串口1中断配置
*输入参数:        无
*输出参数:        无
*******************************************************************************/
void UART1NVIC_Configuration(void)
{
    NVIC_InitTypeDef NVIC_InitStructure; 
    /* Enable the USART1 Interrupt */
    NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);
}

/**************************实现函数********************************************
*函数原型:        void USART1_IRQHandler(void)
*功    能:        串口1中断处理函数
*输入参数:        无
*输出参数:        无
*******************************************************************************/
void USART1_IRQHandler(void)
{
//    uint8_t ch;
//     if(USART_GetITStatus(USART1, USART_IT_TXE) != RESET)            //发送中断
//     {
//         
//     }
    
    if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)     //接收中断
    {
        USART_ClearITPendingBit(USART1, USART_IT_RXNE);       //这样写只能接收一个字节
        printf("It happens receive IRQ \n");
    }    
}

 

 

五、支持printf输出,不用选择use MicroLIB

//
//加入以下代码,支持printf函数,而不需要选择use MicroLIB      
#if 1
#pragma import(__use_no_semihosting)             
//标准库需要的支持函数             
struct __FILE 
{ 
    int handle; 
    /* Whatever you require here. If the only file you are using is */ 
    /* standard output using printf() for debugging, no file handling */ 
    /* is required. */ 
}; 
/* FILE is typedef' d in stdio.h. */ 
FILE __stdout;       
//定义_sys_exit()以避免使用半主机模式    
void _sys_exit(int x) 
{ 
    x = x; 
} 
//重定义fputc函数
int fputc(int ch, FILE *f)
{      
    while((USART1->SR&0X40)==0);//循环发送,直到发送完毕
    USART1->DR = (u8) ch;      
    return ch;
}
#endif 

 

 


转载于:https://www.cnblogs.com/ch122633/p/7363270.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值