zoukankan      html  css  js  c++  java
  • stm32串口学习(二)

    今天继续学习stm32的串口编程(利用库函数)。上次我们说了串口的发送,这次我们说接收。

    接收可以用查询的方法,也可以用中断。显然,工程中多用中断的方式,那么就来看看中断接收。

    代码其实很简单,基本的配置不变,在上次的基础上加一点(优先级的配置和接收中断的使能)就可以了。

            //Usart1 NVIC 配置
    	NVIC_InitTypeDef NVIC_InitStructure;
            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);	
       
            USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启接收中断,这句话是关键

    既然开启了接收中断,就有对应的中断服务函数。

    void USART1_IRQHandler(void)  //串口1中断服务程序
    {
    	u8 rx_data = 0; //用来保存接收到的字节
    	
    	if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  //接收中断
    	{
    		rx_data = USART_ReceiveData(USART1);//读取接收寄存器,自动清除中断位RXNE
    		++rx_data;//方便调试,可以在这里打个断点
    	}
    } 
    这样就实现了最最基本的功能:用键盘发送一个字节,就会进入中断,从寄存器取出这个字节。

    需要说明的是:

    1.  STM32 的发送与接收是通过数据寄存器 USART_DR 来实现的,这是一个双寄存器,包含了TDR和 RDR。当向该寄存器写数据的时候,串口就会自动发送,当收到数据的时候,也是存在该寄存器内。

    2.  RXNE(接收数据寄存器非空),当该位被置 1 的时候,就是提示已经有数据被接收到了,并且可以读出来了。这时候我们要做的就是尽快去读取 USART_DR,通过读 USART_DR 可以将该位清零,也可以向该位写 0,直接清除。 

  • 相关阅读:
    Oracle Instant Client(即时客户端) 安装与配置
    Windows 下 Toad 如何使用 Oracle instantclient 32位客户端
    Oracle 内存(SGA,PGA)详细介绍
    深入解析Oracle 10g中SGA_MAX_SIZE和SGA_TARGET参数的区别和作用
    Android中的Touch事件
    Activity源码简要分析总结
    Android中的Interpolator
    Android 触摸手势基础 官方文档概览
    Android中View的绘制过程 onMeasure方法简述 附有自定义View例子
    Android TextView走马灯效果
  • 原文地址:https://www.cnblogs.com/longintchar/p/5224428.html
Copyright © 2011-2022 走看看