STM32单片机(3) 串口中断通信

发布者:大树下的大白菜y最新更新时间:2018-05-19 来源: eefocus关键字:STM32  单片机  串口中断通信 手机看文章 扫描二维码
随时随地手机看文章

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


  1. /******************************************************************************* 

  2. *    

  3. * 软件功能:  串口实验(软件延时方式) 

  4. *  

  5. *******************************************************************************/  

  6. #include "stm32f10x.h"  

  7. #include   

  8. #include "delay.h"  

  9.   

  10. u8 uart1_buf[20];  

  11. int count=0;  //字符串长度  

  12. int flag=0;     

  13.   

  14. void RCC_Configuration(void);  

  15. void GPIO_Configuration(void);  

  16. void NVIC_Configuration(void);  

  17. void USART1_Configuration(void);  

  18. void Uart1_PutChar(u8 ch);  

  19. void Uart1_PutString(u8* buf , u8 len);  

  20. int USART1_ReceivedStrCmp(const char *str);  

  21.                               

  22. /************************************************* 

  23. 函数: int main(void) 

  24. 功能: main主函数 

  25. 参数: 无 

  26. 返回: 无 

  27. **************************************************/  

  28. int main(void)  

  29. {  

  30.   RCC_Configuration();  

  31.   NVIC_Configuration();  

  32.   GPIO_Configuration();  

  33.   delay_init(72);  

  34.   USART1_Configuration();  

  35.   GPIO_ResetBits(GPIOA,GPIO_Pin_0);//灭  

  36.   while(1)  

  37.   {    

  38.     //GPIO_ResetBits(GPIOA,GPIO_Pin_0);//灭  

  39.     //delay_ms(500);//延时  

  40.     //Uart1_PutString("Hello",5);  

  41.     //GPIO_SetBits(GPIOA,GPIO_Pin_0);//亮  

  42.    // delay_ms(500);//延时  

  43.     /* if(flag==1&&count!=0) 

  44.      { 

  45.          Uart1_PutString(uart1_buf,count); 

  46.          count=0; 

  47.          flag=0; 

  48.      }       */  

  49.   }  

  50. }  

  51.   

  52. /************************************************* 

  53. 函数: void RCC_Configuration(void) 

  54. 功能: 复位和时钟控制 配置 

  55. 参数: 无 

  56. 返回: 无 

  57. **************************************************/  

  58. void RCC_Configuration(void)  

  59. {  

  60.   ErrorStatus HSEStartUpStatus;                    //定义外部高速晶体启动状态枚举变量  

  61.   RCC_DeInit();                                    //复位RCC外部设备寄存器到默认值  

  62.   RCC_HSEConfig(RCC_HSE_ON);                       //打开外部高速晶振  

  63.   HSEStartUpStatus = RCC_WaitForHSEStartUp();      //等待外部高速时钟准备好  

  64.   if(HSEStartUpStatus == SUCCESS)                  //外部高速时钟已经准别好  

  65.   {  

  66.     FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); //开启FLASH预读缓冲功能,加速FLASH的读取。所有程序中必须的用法.位置:RCC初始化子函数里面,时钟起振之后  

  67.     FLASH_SetLatency(FLASH_Latency_2);                    //flash操作的延时  

  68.           

  69.     RCC_HCLKConfig(RCC_SYSCLK_Div1);               //配置AHB(HCLK)时钟等于==SYSCLK  

  70.     RCC_PCLK2Config(RCC_HCLK_Div1);                //配置APB2(PCLK2)钟==AHB时钟  

  71.     RCC_PCLK1Config(RCC_HCLK_Div2);                //配置APB1(PCLK1)钟==AHB1/2时钟  

  72.            

  73.     RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);  //配置PLL时钟 == 外部高速晶体时钟 * 9 = 72MHz  

  74.     RCC_PLLCmd(ENABLE);                                   //使能PLL时钟  

  75.      

  76.     while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)    //等待PLL时钟就绪  

  77.     {  

  78.     }  

  79.     RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);            //配置系统时钟 = PLL时钟  

  80.     while(RCC_GetSYSCLKSource() != 0x08)                  //检查PLL时钟是否作为系统时钟  

  81.     {  

  82.     }  

  83.   }  

  84.     

  85.   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_USART1 | RCC_APB2Periph_AFIO, ENABLE);  //允许 GPIOA、USART1、AFIO时钟  

  86. }  

  87.   

  88. /************************************************* 

  89. 函数: void GPIO_Configuration(void) 

  90. 功能: GPIO配置 

  91. 参数: 无 

  92. 返回: 无 

  93. **************************************************/  

  94. void GPIO_Configuration(void)  

  95. {  

  96.   GPIO_InitTypeDef GPIO_InitStructure;        //定义GPIO初始化结构体  

  97.   

  98.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;   

  99.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;   

  100.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出      

  101.   GPIO_Init(GPIOA, &GPIO_InitStructure);       //PA0输出控制LED灯  

  102.   

  103.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;   

  104.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复合推挽输出     

  105.   GPIO_Init(GPIOA, &GPIO_InitStructure);       //PA9串口输出  

  106.   

  107.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;   

  108.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输入  

  109.   GPIO_Init(GPIOA, &GPIO_InitStructure);       //PA10用于串口读入  

  110. }  

  111.   

  112. void NVIC_Configuration(void)    //中断分组和优先级配置    详见《STM32的函数说明(中文).pdf》P165  

  113. {  

  114.     NVIC_InitTypeDef NVIC_InitStructure;  

  115.   

  116.     //NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);    

  117.     // Set the Vector Table base location at 0x08000000 配置中断向量偏移表的.默认是FLASH的,所以你不设置也无关系. RAM调试的时候,必须设置.  

  118.   

  119.     NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);  //0组,先占优先级1位,从优先级3位  

  120.     NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; //USART1 全局中断  

  121.     //NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;  

  122.     NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;    //中断响应优先级1  

  123.     NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//使能  

  124.     NVIC_Init(&NVIC_InitStructure); //初始化配置  

  125. }  

  126.   

  127. /******************************************************************************* 

  128.     函数名:USART1_Configuration 

  129.     输  入: 

  130.     输  出: 

  131.     功能说明: 

  132.     初始化串口硬件设备,启用中断 

  133.     配置步骤: 

  134.     (1)打开GPIO和USART1的时钟 

  135.     (2)设置USART1两个管脚GPIO模式 

  136.     (3)配置USART1数据格式、波特率等参数 

  137.     (4)使能USART1接收中断功能 

  138.     (5)最后使能USART1功能 

  139. */  

  140. void USART1_Configuration(void)   //串口配置   详见《STM32的函数说明(中文).pdf》P346  

  141. {  

  142.     USART_InitTypeDef USART_InitStructure;  

  143.     USART_InitStructure.USART_BaudRate=9600;   //波特率为9600  

  144.     USART_InitStructure.USART_WordLength=USART_WordLength_8b;  //数据位为8  

  145.     USART_InitStructure.USART_StopBits=USART_StopBits_1; //在帧结尾传输 1 个停止位  

  146.     USART_InitStructure.USART_Parity=USART_Parity_No; //校验模式:奇偶失能  

  147.     USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None; //硬件流控制失能  

  148.     USART_InitStructure.USART_Mode=USART_Mode_Tx | USART_Mode_Rx; //USART_Mode 指定了使能或者失能发送和接收模式:发送使能|接收失能  

  149.     USART_Init(USART1, &USART_InitStructure);     //初始化配置  

  150.   

  151.     USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);  //使能或者失能指定的 USART 中断    ,此处为接收中断  

  152.     USART_Cmd(USART1,ENABLE);   //使能或者失能 USART 外设  

  153.     USART_ClearFlag(USART1, USART_FLAG_TC);//清除传输完成标志位,否则可能会丢失第1个字节的数据.USART_FLAG_TC为发送完成标志位  

  154. }  

  155.   

  156.   

  157.   

  158. /********************************************************* 

  159.                 中断服务程序 

  160. *********************************************************/  

  161. void USART1_IRQHandler(void)  

  162. {     

  163.     u8 dat;  

  164.     //u8 uart1_buf[6];  

  165.       

  166.     if(USART_GetITStatus(USART1,USART_IT_RXNE)==SET)    //若接收完成  

  167.     {  

  168.           

  169.         //GPIO_SetBits(GPIOA,GPIO_Pin_0);//点亮LED                    

  170.         //delay_ms(500);//延时  

  171.         //GPIO_ResetBits(GPIOA,GPIO_Pin_0);//灭   

  172.        

  173.         dat=USART_ReceiveData(USART1);  

  174.         //Uart1_PutChar(dat);  

  175.         //uart1_buf[count++]=dat;  

  176.           

  177.           

  178.         dat = USART_ReceiveData(USART1);  

  179.         if(dat!=0x23)    //!='#'在发送的信息末尾应包含'#'号  

  180.         {  

  181.             uart1_buf[count++]=dat;  

  182.             if(count>19){  

  183.                Uart1_PutString("超出长度![最长20个字符/10个汉字]",32);  

  184.                count=0;  

  185.             }  

  186.         }else if(count!=0)  

  187.             {  

  188.                 //Uart1_PutString("Received Data:",14);  

  189.                 //Uart1_PutString(uart1_buf,count);  

  190.                 if(USART1_ReceivedStrCmp("我爱你")) Uart1_PutString("我也爱你",8);  

  191.                 if(USART1_ReceivedStrCmp("Hello")) Uart1_PutString("Hi",2);  

  192.                 count=0;  

  193.             }         

  194.   

  195.         USART_ClearFlag(USART1,USART_IT_RXNE);  

  196.     }   

  197.   

  198.       //溢出处理-如果发生溢出需要先清除ORE,再读DR寄存器 则可清除不断入中断的问题  

  199.         if(USART_GetFlagStatus(USART1,USART_FLAG_ORE)==SET)  

  200.         {  

  201.                 USART_ClearFlag(USART1,USART_FLAG_ORE);        //清除ORE  

  202.                 USART_ReceiveData(USART1);                                //读DR  

  203.         }  

  204.   

  205. }  

  206.   

  207.   

  208. //发送一个字符  

  209. void Uart1_PutChar(u8 ch)  

  210. {  

  211.     USART_SendData(USART1, (u8) ch);  

  212.     while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);//等待发送完成  

  213. }  

  214.   

  215. //发送一个字符串 Input : buf为发送数据的地址 , len为发送字符的个数  

  216. void Uart1_PutString(u8* buf , u8 len)  

  217. {     

  218.     u8 i;  

  219.     for(i=0;i

  220.     {  

  221.         Uart1_PutChar(*(buf++));  

  222.     }  

  223. }  

  224.   

  225. int USART1_ReceivedStrCmp(const char *str)     //比较  int memicmp(const void *buf1, const void *buf2, size_t count);不区分大小写  

  226. {    

  227.     if(memcmp(uart1_buf, str , strlen(str))==0)return 1;    

  228.     else return 0;   


关键字:STM32  单片机  串口中断通信 引用地址:STM32单片机(3) 串口中断通信

上一篇:STM32单片机(5) 定时器中断实验
下一篇:STM32单片机(2) 外部中断

推荐阅读最新更新时间:2024-03-16 16:03

单片机控制16x16点阵显示姓名
单片机源程序如下: #include reg51.h #define uchar unsigned char #define uint unsigned int #define Lie P1 sbit SHCP = P2^0; sbit DS = P2^1; sbit STCP = P2^2; uchar code led ={ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0xFE,0xFF,0x22,0x04,0x5A,0x08,0x86,0x07,0x08,0x20,
[单片机]
<font color='red'>单片机</font>控制16x16点阵显示姓名
内“芯”强大,飞思卡尔MCU三大核心竞争优势谁与争锋
近日,飞思卡尔半导体微控制器业务拓展经理孙东为我们全面展示了飞思卡尔在马达控制市场的超强阵容产品线。借用一位听众的原话“飞思卡尔果然很强!如此丰富的产品线,无论如何,我们总能找到那款适合自己的马达控制方案”。没错,只有内心的强大,才是真正的强大。有鉴于此,笔者对2013年才从德州仪器过来,加入到飞思卡尔团队的孙东经理进行专访,深入剖析飞思卡尔芯片内“芯”强大的过人之处。 携三大核心竞争优势,谁与争锋? “加入飞思卡尔,我对整个团队很有信心。因为从产品定义到市场团队、销售团队等都是拥有丰富经验的团队。我相信在胜利的团队中,是没有失败者的。”孙东经理如是说,“从最切身的感触来说,相比其他竞争对手而言,飞思卡尔拥有最具竞争力的三
[单片机]
STM32外部中断详解
一、基本概念 STM32可支持68个中断通道,已经固定分配给相应的外部设备,每个中断通道都具备自己的中断优先级控制字节PRI_n(8位,但是STM32中只使用4位,高4位有效),每4个通道的8位中断优先级控制字构成一个32位的优先级寄存器。68个通道的优先级控制字至少构成17个32位的优先级寄存器。 4bit的中断优先级可以分成2组,从高位看,前面定义的是抢占式优先级,后面是响应优先级。按照这种分组,4bit一共可以分成5组 第0组:所有4bit用于指定响应优先级; 第1组:最高1位用于指定抢占式优先级,后面3位用于指定响应优先级; 第2组:最高2位用于指定抢占式优先级,后面2位用于指定响应优先级; 第3组
[单片机]
STM32学习笔记-LCD中英文字符显示原理
LCD中英文字符显示原理 1. 区位码 在国标GD2312—80中规定,所有的国标汉字及符号分配在一个 94行 、 94列 的方阵中,方阵的每一行称为一个“区”,编号为 01区到94区 ,每一列称为一个“位”,编号为 01位到94位 ,方阵中的每一个汉字和符号所在的区号和位号组合在一起形成的四个阿拉伯数字就是它们的“区位码”。**区位码的前两位是它的区号,后两位是它的位号。**用区位码就可以唯一地确定一个汉字或符号,反过来说,任何一个汉字或符号也都对应着一个唯一的区位码。汉字“母”字的区位码是3624,表明它在方阵的36区24位,问号“?”的区位码为0331,则它在03区3l位。 2. 机内码 汉字的机内码是指在计算机中表
[单片机]
<font color='red'>STM32</font>学习笔记-LCD中英文字符显示原理
单片机中断函数的编写
interrupt m修饰符 C51中断函数必须通过该修饰符进行修饰。在C51程序设计中,当函数定义时用了interrupt m修饰符,系统编译时把对应函数转化为中断函数,自动加上程序头段和尾段,并按51系统中断的处理方式自动把它安排在程序存储器中的相应位置。 在该修饰符中,m的取值为0~31,对应的中断情况如下: 0——外部中断0 1——定时/计数器T0 2——外部中断1 3——定时/计数器T1 4——串行口中断 5——定时/计数器T2 其它值预留。 C51编译器从绝对地址8m+3处产生一个中断向量,其中m为中断号,也即interrupt后面的数字。该向量包含一个到中断函数入口地址的绝对跳转。 【例】编写一个用于统计外中断0的中
[单片机]
51单片机W77E58的存储器访问
增强型51系列 单片机 W77E58可与标准的8052兼容,它内含4个8位I/O口、3个16位计数器和全双工串行通信接口。由于W77E58对处理器内核进行了重新设计,因而其性能较之于标准的8052有了很大提高。 W77E58改进了传统处理器的时序。机器周期与时钟之比可以由软件来控制,最快时一个机器周期仅需4个时钟,最慢时一个机器周期需1024个时钟。在同样的时钟频率下,当时钟/机器周期等于4时,W77E58的指令速度比传统的51 单片机 提高了1.5~3倍(平均2.5倍)。如果以时钟/机器周期等于4 为正常工作方式,那么时钟/机器周期等于1024就可以认为是经济模式了。W77E58为全静态CMOS设计,其工作时钟最高为40M
[单片机]
51<font color='red'>单片机</font>W77E58的存储器访问
如何编写51单片机超声波测距SR04_lcd1602显示程序
main.c #include reg51.h #include intrins.h #include lcd.h unsigned char code ASCII = {'0','1','2','3','4','5','6','7','8','9','.','-','M'}; static unsigned char DisNum = 0; //显示用指针
[单片机]
如何编写51<font color='red'>单片机</font>超声波测距SR04_lcd1602显示程序
8位MCU TM56F1552在电陶炉的应用方案,集成低噪声OPA
随着人们生活水平的不断提高,消费者对厨房电器的要求越来越高,对电器的环保节能特性,安全性,灵活性等都有很高的需求,电陶炉由于其加热效率高且可以持续加热,无辐射,适用性高等特点很好的满足了目前消费者的需要。 为了满足市场上对于电陶炉产品的需求,本文介绍一种成熟的电陶炉产品整体解决方案,方案由AC-DC电源芯片与8位MCU主控两部分组成,MCU内置触摸模块,LED/LCD显示驱动模块,多路PWM输出,带基准电压源的ADC以及EEPROM存储器等模块。其中主控TM56F1552芯片内集成了低噪声OPA,CMP,LDO,CTK,可以减少产品零件数目及降低成本。 方案中TM56F1552是一款8位内置OPA,外围电路简单,可以节省B
[嵌入式]
8位<font color='red'>MCU</font> TM56F1552在电陶炉的应用方案,集成低噪声OPA
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved