精华内容
下载资源
问答
  • 51单片机默认使用定时器1作为串口通信的波特率发生器、定时器1中断通信,串口与定时器1冲突,在遇到定时器不够用的时候可以用定时器2

    【若有疑问错误或版权等问题请联系我】 

    【转载请注明出处:http://blog.csdn.net/leytton/article/details/48442129

    51单片机默认使用定时器1作为串口通信的波特率发生器、定时器1中断通信,串口与定时器1冲突,在遇到定时器不够用的时候可以用定时器2

    #include <reg52.h>
    
    
    void DelayMs(unsigned int i);
    void SerialInit();
    void SendByte(unsigned char sbyte);
    void SendString(unsigned char *pstr);
    
    
    void main(void)
    {
    		SerialInit();
    		while(1);	  //注:必需要无限循环
    }
    
    
    /*
    //单片机时钟周期:11.0592MHz   以时钟1作为波特率发生器
    void SerialInit(){
     TMOD=0x20;   //设置T1工作方式为方式2
     TH1=0xfd; //给定时器高位装初值
     TL1=0xfd; //给定时器低位装初值
     TR1=1;  //开定时器
                 //以上是设置波特率
     SM0=0;  //设置串口通讯方式为方式1
     SM1=1;  
     REN=1;  //串口是否接收数据的开关
    
     EA=1; //总中断打开,采用查询法时不用打开中断
     ES=1; //串口中断开关,采用查询法时不用打开中断
    }
    */
    //单片机时钟周期:11.0592MHz	   以时钟T2作为波特率发生器
    void SerialInit(){
     	 PCON &= 0x7F;      //波特率不倍速 SMOD=0
         SCON = 0x50;       //方式1,8位数据,可变波特率,接收允许
         T2CON  = 0x34;   
         RCAP2H = 0xFF;    
         RCAP2L = 0xDC;  
         TH2    = 0xFF;  
         TL2    = 0xDC;
    	   
    	 EA=1; //总中断打开,采用查询法时不用打开中断 
         ES = 1;          //串口中断开关,采用查询法时不用打开中断
    
    }
    
    
    //串口中断函数:
    void SerialPortInte(void) interrupt 4 //采用串口中断法收发数据
    {
    	 unsigned char rbyte;
    	 if(RI){     //RI=1,判定为串口接收到了数据,RI要清零,
             RI=0;
    		 rbyte=SBUF; 
    		 if(rbyte==0x0A){ 	  
    		    SendString("换行");
    		 }else if(rbyte==0x0D){
    		 	SendString("回车");
    		 }else{
    		 	SendByte(rbyte); 
    		 }
    		 	
         }
    
    }
    
    //串口发送一个字节:
    void SendByte(unsigned char sbyte)
    { 
         SBUF=sbyte; //发送数据
         while(!TI); //等待发送完成
         TI=0; //清零发送标志位
    }
     
    //串口发送一个字符串:
    void SendString(unsigned char *pstr) //定义指针
    {
         while(*pstr!='\0') //字符串是否发完
         {
             SendByte(*pstr);//发送字符串数据
             pstr++; //指向下一个字符
         }
    }
    
    void DelayMs(unsigned int i)  //延时i ms
    {
        unsigned int j;
        while(i--)
        {
            for(j = 0; j < 125; j++);
        }
    }
    


    展开全文
  • STM32单片机(3) 串口中断通信

    千次阅读 2014-08-06 00:56:03
    串口中断通信(软件延时方式)

    【转载请注明出处:http://blog.csdn.net/leytton/article/details/38393553

    注:使用普中科技开发板测试时,需要拔掉Boot1短接帽 两根下载线也要拿掉,重启

    /*******************************************************************************
    *	
    * 软件功能:	 串口实验(软件延时方式)
    * 
    *******************************************************************************/
    #include "stm32f10x.h"
    #include <string.h>
    #include "delay.h"
    
    u8 uart1_buf[20];
    int count=0;  //字符串长度
    int flag=0;	  
    
    void RCC_Configuration(void);
    void GPIO_Configuration(void);
    void NVIC_Configuration(void);
    void USART1_Configuration(void);
    void Uart1_PutChar(u8 ch);
    void Uart1_PutString(u8* buf , u8 len);
    int USART1_ReceivedStrCmp(const char *str);
    							
    /*************************************************
    函数: int main(void)
    功能: main主函数
    参数: 无
    返回: 无
    **************************************************/
    int main(void)
    {
      RCC_Configuration();
      NVIC_Configuration();
      GPIO_Configuration();
      delay_init(72);
      USART1_Configuration();
      GPIO_ResetBits(GPIOA,GPIO_Pin_0);//灭
      while(1)
      {  
    	//GPIO_ResetBits(GPIOA,GPIO_Pin_0);//灭
    	//delay_ms(500);//延时
    	//Uart1_PutString("Hello",5);
    	//GPIO_SetBits(GPIOA,GPIO_Pin_0);//亮
       // delay_ms(500);//延时
        /* if(flag==1&&count!=0)
    	 {
    	 	 Uart1_PutString(uart1_buf,count);
    		 count=0;
    		 flag=0;
    	 } 		 */
      }
    }
    
    /*************************************************
    函数: void RCC_Configuration(void)
    功能: 复位和时钟控制 配置
    参数: 无
    返回: 无
    **************************************************/
    void RCC_Configuration(void)
    {
      ErrorStatus HSEStartUpStatus;                    //定义外部高速晶体启动状态枚举变量
      RCC_DeInit();                                    //复位RCC外部设备寄存器到默认值
      RCC_HSEConfig(RCC_HSE_ON);                       //打开外部高速晶振
      HSEStartUpStatus = RCC_WaitForHSEStartUp();      //等待外部高速时钟准备好
      if(HSEStartUpStatus == SUCCESS)                  //外部高速时钟已经准别好
      {
        FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); //开启FLASH预读缓冲功能,加速FLASH的读取。所有程序中必须的用法.位置:RCC初始化子函数里面,时钟起振之后
        FLASH_SetLatency(FLASH_Latency_2);                    //flash操作的延时
          	
        RCC_HCLKConfig(RCC_SYSCLK_Div1);               //配置AHB(HCLK)时钟等于==SYSCLK
        RCC_PCLK2Config(RCC_HCLK_Div1);                //配置APB2(PCLK2)钟==AHB时钟
        RCC_PCLK1Config(RCC_HCLK_Div2);                //配置APB1(PCLK1)钟==AHB1/2时钟
             
        RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);  //配置PLL时钟 == 外部高速晶体时钟 * 9 = 72MHz
        RCC_PLLCmd(ENABLE);                                   //使能PLL时钟
       
        while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)    //等待PLL时钟就绪
        {
        }
        RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);            //配置系统时钟 = PLL时钟
        while(RCC_GetSYSCLKSource() != 0x08)                  //检查PLL时钟是否作为系统时钟
        {
        }
      }
      
      RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_USART1 | RCC_APB2Periph_AFIO, ENABLE);  //允许 GPIOA、USART1、AFIO时钟
    }
    
    /*************************************************
    函数: void GPIO_Configuration(void)
    功能: GPIO配置
    参数: 无
    返回: 无
    **************************************************/
    void GPIO_Configuration(void)
    {
      GPIO_InitTypeDef GPIO_InitStructure;        //定义GPIO初始化结构体
    
      GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; 
      GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 
      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出 	 
      GPIO_Init(GPIOA, &GPIO_InitStructure); 	   //PA0输出控制LED灯
    
      GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; 
      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复合推挽输出 	 
      GPIO_Init(GPIOA, &GPIO_InitStructure); 	   //PA9串口输出
    
      GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; 
      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输入
      GPIO_Init(GPIOA, &GPIO_InitStructure); 	   //PA10用于串口读入
    }
    
    void NVIC_Configuration(void)	 //中断分组和优先级配置	 详见《STM32的函数说明(中文).pdf》P165
    {
    	NVIC_InitTypeDef NVIC_InitStructure;
    
    	//NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);  
    	// Set the Vector Table base location at 0x08000000 配置中断向量偏移表的.默认是FLASH的,所以你不设置也无关系. RAM调试的时候,必须设置.
    
    	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);	 //0组,先占优先级1位,从优先级3位
    	NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; //USART1 全局中断
    	//NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;
    	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; 	  //中断响应优先级1
    	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//使能
    	NVIC_Init(&NVIC_InitStructure); //初始化配置
    }
    
    /*******************************************************************************
    	函数名:USART1_Configuration
    	输  入:
    	输  出:
    	功能说明:
    	初始化串口硬件设备,启用中断
    	配置步骤:
    	(1)打开GPIO和USART1的时钟
    	(2)设置USART1两个管脚GPIO模式
    	(3)配置USART1数据格式、波特率等参数
    	(4)使能USART1接收中断功能
    	(5)最后使能USART1功能
    */
    void USART1_Configuration(void)	  //串口配置   详见《STM32的函数说明(中文).pdf》P346
    {
    	USART_InitTypeDef USART_InitStructure;
    	USART_InitStructure.USART_BaudRate=9600;   //波特率为9600
    	USART_InitStructure.USART_WordLength=USART_WordLength_8b;  //数据位为8
    	USART_InitStructure.USART_StopBits=USART_StopBits_1; //在帧结尾传输 1 个停止位
    	USART_InitStructure.USART_Parity=USART_Parity_No; //校验模式:奇偶失能
    	USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None; //硬件流控制失能
    	USART_InitStructure.USART_Mode=USART_Mode_Tx | USART_Mode_Rx; //USART_Mode 指定了使能或者失能发送和接收模式:发送使能|接收失能
    	USART_Init(USART1, &USART_InitStructure);	  //初始化配置
    
    	USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);  //使能或者失能指定的 USART 中断	,此处为接收中断
    	USART_Cmd(USART1,ENABLE);	//使能或者失能 USART 外设
    	USART_ClearFlag(USART1, USART_FLAG_TC);//清除传输完成标志位,否则可能会丢失第1个字节的数据.USART_FLAG_TC为发送完成标志位
    }
    
    
    
    /*********************************************************
                    中断服务程序
    *********************************************************/
    void USART1_IRQHandler(void)
    {	
    	u8 dat;
    	//u8 uart1_buf[6];
    	
        if(USART_GetITStatus(USART1,USART_IT_RXNE)==SET)	//若接收完成
        {
        	
    		//GPIO_SetBits(GPIOA,GPIO_Pin_0);//点亮LED	              
        	//delay_ms(500);//延时
    		//GPIO_ResetBits(GPIOA,GPIO_Pin_0);//灭 
         
    		dat=USART_ReceiveData(USART1);
    		//Uart1_PutChar(dat);
    		//uart1_buf[count++]=dat;
    		
    		
    		dat = USART_ReceiveData(USART1);
    		if(dat!=0x23)	 //!='#'在发送的信息末尾应包含'#'号
    		{
    			uart1_buf[count++]=dat;
    			if(count>19){
    			   Uart1_PutString("超出长度![最长20个字符/10个汉字]",32);
    			   count=0;
    			}
    		}else if(count!=0)
    			{
    				//Uart1_PutString("Received Data:",14);
    				//Uart1_PutString(uart1_buf,count);
    				if(USART1_ReceivedStrCmp("我爱你")) Uart1_PutString("我也爱你",8);
    				if(USART1_ReceivedStrCmp("Hello")) Uart1_PutString("Hi",2);
    				count=0;
    			}		
    
    		USART_ClearFlag(USART1,USART_IT_RXNE);
        } 
    
    	  //溢出处理-如果发生溢出需要先清除ORE,再读DR寄存器 则可清除不断入中断的问题
            if(USART_GetFlagStatus(USART1,USART_FLAG_ORE)==SET)
            {
                    USART_ClearFlag(USART1,USART_FLAG_ORE);        //清除ORE
                    USART_ReceiveData(USART1);                                //读DR
            }
    
    }
    
    
    //发送一个字符
    void Uart1_PutChar(u8 ch)
    {
        USART_SendData(USART1, (u8) ch);
        while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);//等待发送完成
    }
    
    //发送一个字符串 Input : buf为发送数据的地址 , len为发送字符的个数
    void Uart1_PutString(u8* buf , u8 len)
    {   
    	u8 i;
        for(i=0;i<len;i++)
        {
            Uart1_PutChar(*(buf++));
        }
    }
    
    int USART1_ReceivedStrCmp(const char *str)	   //比较  int memicmp(const void *buf1, const void *buf2, size_t count);不区分大小写
    {  
    	if(memcmp(uart1_buf, str , strlen(str))==0)return 1;  
    	else return 0; 
    }  
    



    展开全文
  • 单片机串口中断

    2015-12-22 22:43:42
    单片机串口中断 如何进行串口初始化 1.首先选择工作方式即SCON方式的选择(SCON,PCON) 2.波特率设置。  ( TMOD TH1 TL1) 3.中断开启(EA) 4.开始(TR) 1)sm0, SM1方式寄存器 1.串行工作方式0 串行...
     单片机串口中断
    如何进行串口初始化
    1.首先选择工作方式即SCON方式的选择(SCON,PCON)
    2.波特率设置。
     ( TMOD TH1 TL1)
    3.中断开启(EA)
    4.开始(TR)

    1)sm0, SM1为方式寄存器
    1.串行工作方式0
    串行口工作方式0时,串行口作同步移位寄存器使用。以RXD(P3.0)端作为数据的输入和输出端,而TXD(P3.1)提供移位的时钟脉冲。外接移位寄存器,实现数据并行输入或输出。工作方式0时,波特率为fosc/12,即一个机器周期移位一次。

    2.方式1 波特率可变
    在实际使用中,波特率是已知的,因此需要根据波特率的计算公式求定时初值X。用户只需要把定时初值设置到定时器1,就能得到所要求的波特率。

    方式1为10位为一帧的异步串行通信方式。其帧格式为1个起始位、8个数据位和1个停止位。工作在方式1时,其波特率是可变的,波特率的计算方式为:

     波特率=2^(SMOD)/32*(定时器1的溢出率)

    其中,SMOD为PCON寄存器最高位的值,其值为1或0.

    当定时器1作为波特率发生器时,选用工作方式2(即自动加载定时初值方式)。选择方式2可以避免通过程序反复装入定时初值所引起的定时误差,使波特率更加稳定。假定计数初值为X,则计数溢出周期为:

    溢出周期=12/fosc*(256-x)

    溢出率为溢出周期的倒数。则波特率的计算公式为:

    波特率=2^(SMOD)/32*(fosc)/(12*(256-x))

    3. 串行工作方式2

    方式2为11位为一帧的异步串行通信方式。其帧格式为1个起始位、9个数据位和1个停止位。在方式2下,字符还是8个数据位,只不过增加了一个第9个数据位(D8),而且其功能由用户确定,是一个可编程位。方式2的接收过程也与方式1基本类似,所不同的只在第9数据位上,串行口把接收到的前8个数据位送入SBUF,而把第九数据位送入RB8。

    方式2的波特率是固定的,而且有两种,即fosc/32和fosc/64。当SMOD为0时,波特率为fosc/64,当SMOD为1的时候,波特率为fosc/32。

    2)REN若要接受数据,REN要置位。
    3)SM2——允许方式2、3的多机通信控制位

    在方式2和3中,
    若SM2=1 且接收到的第九位数据(RB8)为1,才将接收到的前八位数据送入接收SBUF中,并置位RI产生中断请求:否则丢弃前8位数据。
    若SM2=0,则不论第九位数据(RB8)为1 还是为0, 都将前八位 送入接收SBUF中,并产生中断请求。
    方式0时, SM2必须置为0。
    波特率
    方式0和方式2 的波特率是固定的,而方式1和方式3 的波特率是可变的,有TI溢出率决定。
    4)TB8 RB8 
     

    SBUF=数据。可以把数据看做是单片机寄存器的数据,所以是单片机里数据要发送。
    代码
    void serial(void) interrupt 4
    {
    char i;
    if(RI)
      {
        RI=0;    //继续收
        i=SBUF;
        P1=i;
        }
    }


    展开全文
  • 利用stm32串口中断进行数码管显示

    千次阅读 2017-05-04 23:09:13
    串口通信一般有三种形式,即查询方式、中断方式和DMA方式...不用等在那儿,该干嘛干嘛,大大提高了效率,因此本次实验采用中断方式,将利用串口中断,在中断服务程序中读取串口输入的数值,然后在数码管上显示出该数值。

    为了使得本次实验的效果更加明显,我将利用串口中断,在中断服务程序中读取串口输入的数值,然后在数码管上显示出该数值。

    一、数码管配置

             在进行本次的实验之前,由于需要使用数码管进行实验结果的显示,我们首先需要数码管的真值表,我这边使用的是普通的共阳极数码管,所以真值表如下:

            

    0

    1

    2

    3

    4

    5

    6

    7

    0xc0

    0xf9

    0xA4

    0xB0

    0x99

    0x92

    0x82

    0xF8

    8

    9

    a

    b

    c

    d

    e

    f

    0x80

    0x90

    0x88

    0x83

    0xC6

    0xA1

    0x86

    0x8E


    
    
    
    

       以上准备工作完成以后,可以正式进入本次实验了。很明显,我们用到了数码管和串口,因此我们至少需要数码管配置函数以及串口配置函数这两个配置函数。对于数码管的配置函数,由于我使用的普中PZ6806L型的开发板,通过查询原理图发现数码管的各个段对应于LED1~LED8,然后接到GPIOC的0~7管脚上,因此配置好GPIOC就可以了,这个简单,直接给出代码如下: void segmentDisplayInit() { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(GPIOC, &GPIO_InitStructure); } 二、串口配置 下面是本次实验的重点,也就是RS232串口中断配置函数usartInit(),在《STM32中文参考手册》中对USART的描述如下: 通用同步异步收发器(USART)提供了一种灵活的方法与使用工业标准NRZ异步串行数据格式的外部设备之间进行全双工数据交换。USART利用分数波特率发生器提供宽范围的波特率 选择。它支持同步单向通信和半双工单线通信,也支持LIN(局部互连网),智能卡协议和IrDA(红外数据组织)SIR ENDEC规范,以及调制解调器(CTS/RTS)操作。它还允许多处理器 通信。 串口通信一般有三种形式,即查询方式、中断方式和DMA方式。查询方式(也有人称为轮询法)效率不高,在需要查询时CPU的占用很高,在程序上的体现就是用循环不断 查询标志位状态,在查询时CPU不做其他事,因此效率是比较低的。中断方式的话,只有在发送中断、接收中断、传输完成中断等的中断时会进入串口中断服务程序,这样CPU就 不用等在那儿,该干嘛干嘛,大大提高了效率,因此本次实验采用中断方式。而DMA方式的话,由于在微机原理课程中没有进行相关知识的学习,故了解不多,不敢进行评论。 在串口中断初始化配置中,首先应打开串口时钟和PA口的时钟(AFIO的时钟可以不用打开),打开PA口时钟的原因是,在本实验中,我使用的板子在原理图上显示,RS232串口的 RX和TX分别与PA10和PA9相连。接着就该根据TX、RX配置PA9和PA10这两个GPIO了,这里要注意的是这里模式最好要设置成浮空输入和复用推挽输出,至少按下表设置: 接下来就要调用USART_Init()程序对串口进行参数配置,该函数的入口参数是一个结构体指针USART_InitTypeDef*,查询stm32f10x_usart.h可得,该结构体定义如下: typedef struct {   uint32_t USART_BaudRate;  //波特率,一般9600即可   uint16_t USART_WordLength;//字长八位或九位   uint16_t USART_StopBits;   //停止位选择   uint16_t USART_Parity;  //奇偶校验   uint16_t USART_Mode;  //模式,发送还是接收   uint16_t USART_HardwareFlowControl;//硬件控制流,一般设置为NONE }USART_InitTypeDef; 接着打开串口,使用USART_Cmd(USART1,ENABLE);即可。 然后打开串口中断,这里我打开接收中断,函数如下: USART_ITConfig(USART1,USART_IT_RXNE, ENABLE); 最后配置串口中断的优先级,这个配置在上一篇定时器中断的配置中已经介绍过了,这里不再赘述。 综合以上几点usart总的配置函数给出如下: void usartInit() { USART_InitTypeDef USART_InitStructure; GPIO_InitTypeDef GPIO_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; //时钟配置 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_USART1,ENABLE); //TX和RX对应GPIO的初始化 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOA, &GPIO_InitStructure); //串口基本参数初始化 USART_InitStructure.USART_BaudRate = 9600; 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_Tx | USART_Mode_Rx; USART_Init(USART1, &USART_InitStructure); USART_Cmd(USART1, ENABLE); USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); //串口中断优先级配置 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); } 三、串口中断函数 在此函数中只要检测输入的数据,然后将对应的数码管真值表的值写到GPIOC上即可。这里直接给出程序: void USART1_IRQHandler(void) { static u8 k; int seg[] = {0xc0 , 0xf9 , 0xA4 , 0xB0 , 0x99 , 0x92 , 0x82 , 0xF8 , 0x80  , 0x90 , 0x88 , 0x83 , 0xC6 , 0xA1 , 0x86 , 0x8E}; USART_ClearFlag(USART1 , USART_FLAG_TC); if(USART_GetITStatus(USART1 , USART_IT_RXNE) != Bit_RESET) { k = USART_ReceiveData(USART1); GPIO_Write(GPIOC , seg[k]); } } 主函数很简单,这里就不给出了。

    
    
    
    
    
    
    
    
    展开全文
  • N76E003双串口中断配置、问题及解决方法 最近在调试N76E003串口0,串口1中断时,发现当串口0开启中断后,串口1中断无法正常工作,下面详细说说自己的办法。(我的问题原因是中断优先级造成的,取消串口1中断...
  • 51单片机串口中断实验 串口向外部发送“齐鲁工业大学”六个字,一个汉字占用两个字节,六个字占用12个字节。 #include <reg51.h> unsigned char s[] = "齐鲁工业大学"; // 延时函数 void ...
  • 串口中断接收函数

    千次阅读 2018-12-04 23:18:09
    /* 用来实现读取接收FIFO中的数据 */ void ReceiveByteUart0(U8 ch) { U32 i; if(GetUartCmdFlag==1)return; // 完成读取 comRbuf[UartDataPointer]=ch;... // 串口有数据 if(UartDataPointer&gt...
  • 子函数:void serial() ...别的中断都是在某个I/O口低电平时产生中断,串口中断是在什么情况下产生呢? 首先,你要用软件允许中断,即 C语言中 EA = 1; //允许总中断 ES = 1; //允许串口中断 汇编中可用 SETB ...
  • 串口通信与中断

    2021-06-20 10:22:18
    首先TMOD确定定时器1的工作方式,双八位(因为串口是这样的,具体不清楚),然后在控制寄存器打开TR1(即启动定时器1),在中断允许位那里关闭定时器1中断,如果后面不用串口中断可以直接管总中断,最好还是关相应...
  • 也介绍过使用DMA的空闲中断触发以判断串口接收完成。以上两种方式,在一定情况下可以使用效果也还可以。延时判断的方式,对于不跑操作系统的工程里影响不大,但是到了一个跑实时系统的工程里,这种方式就显得不稳定...
  • 了解使用STM32串口中断相关官方库函数简介完整代码串口初始化、使能串口、开启接收中断初始化NVLC接收、发送函数 简介 下面两张图红框的内容,在上几篇有总结过,分别是GPIO的和中断的,直接去那里看就行,这一篇...
  • 串口中断和接收

    千次阅读 2016-12-22 19:40:20
    关于串口中断没有繁杂的初始化。只需添加几句话就能实现串口中断了。直接上代码吧。UARTinitial() { .....//接上篇博客的初始化代码 /*串口中断标志位置*/ UTX1IF=1; /*允许接收*/ U0CSR|=0x40; /*开总中断,接收...
  • 既然和外界需要“交互”,就必须使用“中断”功能,所以一般串口中断是配合使用的。 在总结串口使用方法之前需要对一些基本概念进行理解 第一. 关于波特率(baud rate)的解释,网上有很多文章,以我个人的肤浅...
  • 因为12Mhz的单片机9600波特通信设置T1初值FD时有8.51%的误差,而允许误差4.5%以下!! 解决方法:用4800波特率,置SMOD1通信,此时误差只有0.16%!! http://bbs.ednchina.com/BL
  • STM8S 带缓冲区 串口中断 使用心得

    千次阅读 2018-05-10 09:34:48
    /*-------------------------串口初始化函数------------------------*/ /*********************************************************** * 函数名称:void UART2_Init(void) * * 功能描述:UART2初始化函数 * * ...
  • DIV_VAL = UBRDIVn + (num of 1's in UDIVSLOTn)/16 DIV_VAL = (PCLK / (bps x 16)) −1 or DIV_VAL = (SCLK_UART / (bps x 16)) −1 主机平台:Linux CentOS 6.5 ...这次写一下串口的驱动,功能是在lin
  • STM32的串口中断发送

    2016-09-14 14:06:08
    SECTION 2 ...即Transmission Complete。发送一个字节后才进入中断,这里称为“发送后中断”。和原来8051的TI方式一样,都是发送后才进...即 判断 发送后中断 . 输入:字符串的首地址 输出:无 *******
  • STM32串口中断的一些资料 好久没更新了,最近忙着考试,而如今,大学再也没有考试了,就等着毕业设计拿了毕业证书奔着远大前程去了。 在研究STM32串口接收发送中断的时候找到不少不错的资料,现在备份在...
  • 文章目录MCS-51功能单元一、定时器&计数器二、并行口&串行口三、中断系统 ...使计数值或定时值满足自己的要求,需预先将数据寄存器赋值,称为初值设定,中断中也要重新设定初值。 定时器和计数器本质
  • STM32串口中断使用

    2013-05-29 22:43:01
    作者:陈贞_Rock ...使用串口可以提高CPU的利用率。在程序中处理流程如下:   一:串口初始化 1.配置串口时钟  在void Rcc_Configuration(void)函数中实现 点击(此处)折叠或打开 void Rcc_Co
  • S5P4418 64个中断源,按键的GPIO口是GPIOB28-30,中断号...R,相关位为1表示该IRQ中断发生且未被屏蔽 VICFIQSTATUS R,相关位为1表示该FIQ中断发生且未被屏蔽 VICRAWINTR R,表示屏蔽之前的中断状态 VICINTSELECT...
  • 版权声明:本文博主原创文章,未经博主允许不得转载。 在一项目中,使用STM32作为主控,程序运行一段时间后概率出现主循环卡死现象。 问题分析如下: 1、程序USART2不停接收并处理串口数据,波特率...
  • /* 串口使用时都需要设置波特率,而stc89c... TI和RI为中断标志,  接收数据时,XXX=SBUF,cpu会自动将串口接受寄存器中的数据取走送给XXX  发送数据时,SBUF=XXX;程序执行完一条语句便自动开始将串口发送寄...
  • 一、定时器/计数器 ...TF1/TF0 :定时器/计数器中断请求标志当定时器计数满溢出回零时,有硬件置位,并可申请中断。当CPU响应中断并进入中  断服务程序后,自动清零。 TR1/TR0 :定时器/计数器运行控制,靠
  • 中断需要用到定时器: 1.设置它的寄存器TMOD 2.THx和TLx的值(这个是设置定时器的初值) 3.打开定时器(TRx=1) ----------------------------- 注:串行口两个寄存器 SCON(串行端口控制器)和PCON ...
  • 一.串口通讯
  • Stm32L0串口中断接收使用

    千次阅读 2017-08-31 10:50:00
    最新在做LoRa的项目,使用的是STM32L072和SX1276,需要做一个串口透传模块,刚开始做demo的时候不考虑功耗,所以串口发送和接收直接使用下列函数执行: HAL_UART_Transmit(&Sensor_UartHandle,(unsigned ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 17,434
精华内容 6,973
关键字:

串口中断的中断允许位为